diff --git a/.gitignore b/.gitignore
index c2527a5b..4082974f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -12,4 +12,5 @@ content/editor.js
content/turtlebits.js
content/welcome.css
content/worker.js
+content/.well-known
.DS_Store
diff --git a/.nvmrc b/.nvmrc
new file mode 100644
index 00000000..1e8b3149
--- /dev/null
+++ b/.nvmrc
@@ -0,0 +1 @@
+6
diff --git a/.travis.yml b/.travis.yml
index c540c9b3..6b4c5fca 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,8 +1,26 @@
+dist: trusty
+sudo: required
+addons:
+ apt:
+ sources:
+ - google-chrome
+ - ubuntu-toolchain-r-test
+ packages:
+ - google-chrome-stable
+ - g++-4.8
+env:
+ - CXX=g++-4.8
+
language: node_js
node_js:
- - '0.12'
+ - '6'
+ - '7'
before_script:
+ - export DISPLAY=:99.0
+ - sh -e /etc/init.d/xvfb start
+ - sleep 3
- npm install grunt-cli -g
+
notifications:
webhooks:
urls:
diff --git a/Gruntfile.js b/Gruntfile.js
index 93b2a6f5..d027e2b5 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -1,4 +1,14 @@
var os=require('os');
+var fs = require('fs');
+
+// Determine if this is being built on Windows Subsystem for Linux; if so, we avoid direct device access.
+var isWSL = false;
+
+if (os.platform() === 'linux') {
+ if (fs.readFileSync("/proc/version", 'utf8').indexOf("Microsoft") > -1) {
+ isWSL = true;
+ }
+}
module.exports = function(grunt) {
'use strict';
@@ -28,7 +38,7 @@ module.exports = function(grunt) {
'lib/droplet.js': 'droplet/dist/droplet-full.js',
'lib/droplet.css': 'droplet/css/droplet.css',
'lib/html2canvas.js': 'html2canvas/dist/html2canvas.js',
- 'lib/iced-coffee-script.js':
+ 'lib/iced-coffee-script-orig.js':
'iced-coffee-script/extras/iced-coffee-script-1.8.0-c.js',
'lib/jquery.js' : 'jquery/dist/jquery.js',
'lib/jquery.autocomplete.min.js':
@@ -56,8 +66,8 @@ module.exports = function(grunt) {
destPrefix: 'content/lib/tooltipster'
},
files: {
- 'js': 'tooltipster/js',
- 'css': 'tooltipster/css'
+ 'js': 'tooltipster/dist/js',
+ 'css': 'tooltipster/dist/css'
}
},
lib: {
@@ -204,12 +214,20 @@ module.exports = function(grunt) {
}
}
},
- sed: {
+ 'string-replace': {
iced: {
- pattern: '\n\\(function\\(root\\)',
- replacement: '\nthis.CoffeeScript||(function(root)',
- path: 'content/lib/iced-coffee-script.js',
- recursive: false
+ files: {
+ 'content/lib/iced-coffee-script.js':
+ 'content/lib/iced-coffee-script-orig.js'
+ },
+ options: {
+ replacements: [
+ {
+ pattern: '\n\\(function\\(root\\)',
+ replacement: '\nthis.CoffeeScript||(function(root)'
+ }
+ ]
+ }
}
},
watch: {
@@ -247,9 +265,6 @@ module.exports = function(grunt) {
}
}
},
- 'node-inspector': {
- dev: { }
- }
});
grunt.loadNpmTasks('grunt-bowercopy');
@@ -265,23 +280,28 @@ module.exports = function(grunt) {
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-express-server');
grunt.loadNpmTasks('grunt-mocha-test');
- grunt.loadNpmTasks('grunt-node-inspector');
- grunt.loadNpmTasks('grunt-sed');
+ grunt.loadNpmTasks('grunt-string-replace');
grunt.registerTask('proxymessage', 'Show proxy instructions', function() {
var port = grunt.option('port');
- var ifaces = os.networkInterfaces();
grunt.log.writeln(
'Point your browser proxy autoconfig to one of these (or download\n' +
'a local copy of one of these proxy.pacs). Then the dev server\n' +
'can be used at http://pencilcode.net.dev/');
- for (var dev in ifaces) {
- ifaces[dev].forEach(function(details) {
- if (details.family == 'IPv4') {
- grunt.log.writeln(
- 'http://' + details.address + ':' + port + '/proxy.pac');
- }
- });
+
+ if (isWSL) {
+ grunt.log.writeln('http://127.0.0.1:' + port + '/proxy.pac');
+ }
+
+ else {
+ var ifaces = os.networkInterfaces();
+ for (var dev in ifaces) {
+ ifaces[dev].forEach(function(details) {
+ if (details.family == 'IPv4') {
+ grunt.log.writeln('http://' + details.address + ':' + port + '/proxy.pac');
+ }
+ });
+ }
}
});
@@ -311,7 +331,7 @@ module.exports = function(grunt) {
});
// "update" does a bowercopy and a sed.
- grunt.registerTask('update', ['bowercopy', 'sed']);
+ grunt.registerTask('update', ['bowercopy', 'string-replace']);
// "devserver" serves editor code directly from the src directory.
grunt.registerTask('devserver',
['proxymessage', 'express:dev', 'browserify:server', 'watch']);
diff --git a/README.md b/README.md
index 2445e3b7..1c9dd350 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,16 @@ grunt
grunt devserver
+On Windows Subsystem for Linux (WSL) *only*:
+
+
+git clone https://github.com/cacticouncil/pencilcode.git
+cd pencilcode
+npm install --no-shrinkwrap
+grunt
+grunt devserver
+
+
Development can be done on Linux, Mac, or Windows.
The prerequisites are a standard node.js development environment
which is very widely used, plus grunt (you'll need to
@@ -43,6 +53,14 @@ npm install -g grunt-cli
Zsh users should change `bashrc` to `zshrc` in the above code.
+(For Windows Subsystem for Linux:)
+
+
+sudo apt-get install npm git
+sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10
+sudo npm install -g grunt-cli
+
+
(For Mac:)
diff --git a/content/.well-known/chrome.txt b/content/.well-known/chrome.txt
new file mode 100644
index 00000000..5a19d906
--- /dev/null
+++ b/content/.well-known/chrome.txt
@@ -0,0 +1 @@
+https://crbug.com/1224671
\ No newline at end of file
diff --git a/content/.well-known/pki-validation/BF5FB477BB7F7A3C9D40C235ADE3FBFD.txt b/content/.well-known/pki-validation/BF5FB477BB7F7A3C9D40C235ADE3FBFD.txt
new file mode 100644
index 00000000..13b5fb18
--- /dev/null
+++ b/content/.well-known/pki-validation/BF5FB477BB7F7A3C9D40C235ADE3FBFD.txt
@@ -0,0 +1 @@
+72877187E968F4C4C3FD1ED08B47CAD558D95477C6E5F337C378C93155CC4E51 comodoca.com 60f9583ca491b
\ No newline at end of file
diff --git a/content/lib/PyPencilCode.py b/content/lib/PyPencilCode.py
deleted file mode 100644
index 75ab3892..00000000
--- a/content/lib/PyPencilCode.py
+++ /dev/null
@@ -1,157 +0,0 @@
-import turtle
-import time
-
-myTurtle = turtle.Turtle()
-myTurtle.penup()
-myTurtle.speed(5)
-
-###################
-## Move Commands ##
-###################
-
-def fd(value):
- myTurtle.fd(value)
-
-def bk(value):
- myTurtle.back(value)
-
-def rt(value):
- myTurtle.right(value)
-
-def lt(value):
- myTurtle.left(value)
-
-def ra(angle, radius):
- myTurtle.circle(-radius, angle)
-
-def la(angle, radius):
- myTurtle.circle(radius, angle)
-
-def speed(value):
- myTurtle.speed(value)
-
-def home():
- myTurtle.home()
-
-def turnto(value):
- myTurtle.setheading(value)
-
-def moveto(x, y):
- myTurtle.goto(x, y)
-
-def movexy(x, y):
- moveto(myTurtle.xcor() + x, myTurtle.ycor() + y)
-
-def jumpto(x, y):
- penDown = myTurtle.isdown()
- mySpeed = myTurtle.speed()
- myTurtle.penup()
- myTurtle.speed(0)
- myTurtle.goto(x, y)
- myTurtle.speed(mySpeed)
- if (penDown): myTurtle.pendown()
-
-def jumpxy(x, y):
- jumpto(myTurtle.xcor() + x, myTurtle.ycor() + y)
-
-def pause(value):
- time.sleep(value)
-
-##################
-## Art Commands ##
-##################
-
-def hide():
- myTurtle.hideturtle()
-
-def show():
- myTurtle.showturtle()
-
-def cs():
- myTurtle.clear()
-
-def pu():
- myTurtle.penup()
-
-def pd():
- myTurtle.pendown()
-
-def pen(color, size):
- myTurtle.pencolor(color)
- myTurtle.pensize(size)
-# myTurtle.pen(pencolor=color, pensize=size)
- myTurtle.pendown()
-
-def dot(color, size):
- myTurtle.dot(size, color)
-
-def box(color, size):
- print "**box(color,size) not implemented**\n"
- # TODO
-
-def fill(color):
- print "**fill(color) not implemented**\n"
- # TODO
- pass
-
-def wear(name):
- print "**wear(name) not implemented**\n"
- # TODO
-
-def img(path):
- print "**img(path) not implemented**\n"
- # TODO
-
-def grow(value):
- print "**grow(value) not implemented**\n"
- # TODO
-
-def drawon(sprite):
- print "**drawon(sprite) not implemented**\n"
- # TODO - one option is document?
-
-##################
-## Art Commands ##
-##################
-
-def write(message):
- # TODO
- pass
-
-def debug(object):
- # TODO
- pass
-
-def type(message):
- # TODO - typewrites on document
- pass
-
-def typebox(color):
- # TODO
- pass
-
-def typeline():
- # TODO - type a newline
- pass
-
-def label(name):
- # TODO
- pass
-
-def await(lamda_exp):
- # TODO - this might be tricky
- pass
-
-def read(prompt):
- # TODO - this might be tricky
- pass
-
-def readnum(prompt):
- # TODO - this might be tricky
- pass
-
-####################
-## Sound Commands ##
-####################
-
-# TODO
diff --git a/content/lib/droplet.js b/content/lib/droplet.js
index 62acdb32..3263c200 100644
--- a/content/lib/droplet.js
+++ b/content/lib/droplet.js
@@ -1,8 +1,8 @@
/* Droplet.
- * Copyright (c) 2015 Anthony Bau.
+ * Copyright (c) 2016 Anthony Bau.
* MIT License.
*
- * Date: 2015-10-31
+ * Date: 2016-08-30
*/
(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.droplet = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o= this.tokens.length) {
+ if (tokenIndex < 0 || tokenIndex >= this.tokens.length) {
throw "" + tokenIndex + " not in 0.." + this.tokens.length - 1;
}
var nextOnChannel = this.nextTokenOnChannel(tokenIndex + 1,
@@ -35183,12 +35184,9 @@ exports.CommonTokenStream = CommonTokenStream;
// when you construct the object.
//
var InputStream = require('./InputStream').InputStream;
-try {
- var fs = require("fs");
-} catch(ex) {
- // probably running from browser, no "Node.js/fs" makes sense
-}
-
+var isNodeJs = typeof window === 'undefined' && typeof importScripts === 'undefined';
+var fs = isNodeJs ? require("fs") : null;
+
function FileStream(fileName) {
var data = fs.readFileSync(fileName, "utf8");
InputStream.call(this, data);
@@ -35780,7 +35778,7 @@ LL1Analyzer.prototype.LOOK = function(s, stopState, ctx) {
// is {@code null}.
///
LL1Analyzer.prototype._LOOK = function(s, stopState , ctx, look, lookBusy, calledRuleStack, seeThruPreds, addEOF) {
- var c = new ATNConfig({state:s, alt:0}, ctx);
+ var c = new ATNConfig({state:s, alt:0, context: ctx}, null);
if (lookBusy.contains(c)) {
return;
}
@@ -36575,7 +36573,7 @@ Parser.prototype.compileParseTreePattern = function(pattern, patternRuleIndex, l
lexer = lexer || null;
if (lexer === null) {
if (this.getTokenStream() !== null) {
- var tokenSource = this.getTokenStream().getTokenSource();
+ var tokenSource = this.getTokenStream().tokenSource;
if (tokenSource instanceof Lexer) {
lexer = tokenSource;
}
@@ -36661,6 +36659,7 @@ Parser.prototype.consume = function() {
} else {
node = this._ctx.addTokenNode(o);
}
+ node.invokingState = this.state;
if (hasListener) {
this._parseListeners.map(function(listener) {
listener.visitTerminal(node);
@@ -36703,6 +36702,7 @@ Parser.prototype.exitRule = function() {
};
Parser.prototype.enterOuterAlt = function(localctx, altNum) {
+ localctx.setAltNumber(altNum);
// if we have new localctx, make sure we replace existing ctx
// that is previous child of parse tree
if (this.buildParseTrees && this._ctx !== localctx) {
@@ -37158,7 +37158,7 @@ ParserRuleContext.prototype.getSourceInterval = function() {
if( this.start === null || this.stop === null) {
return INVALID_INTERVAL;
} else {
- return Interval(this.start.tokenIndex, this.stop.tokenIndex);
+ return new Interval(this.start.tokenIndex, this.stop.tokenIndex);
}
};
@@ -37289,7 +37289,7 @@ PredictionContextCache.prototype.add = function(ctx) {
if (ctx === PredictionContext.EMPTY) {
return PredictionContext.EMPTY;
}
- var existing = this.cache[ctx];
+ var existing = this.cache[ctx] || null;
if (existing !== null) {
return existing;
}
@@ -37974,7 +37974,7 @@ Recognizer.ruleIndexMapCache = {};
Recognizer.prototype.checkVersion = function(toolVersion) {
- var runtimeVersion = "4.5";
+ var runtimeVersion = "4.5.3";
if (runtimeVersion!==toolVersion) {
console.log("ANTLR runtime and generated code versions disagree: "+runtimeVersion+"!="+toolVersion);
}
@@ -38153,6 +38153,7 @@ exports.Recognizer = Recognizer;
var RuleNode = require('./tree/Tree').RuleNode;
var INVALID_INTERVAL = require('./tree/Tree').INVALID_INTERVAL;
+var INVALID_ALT_NUMBER = require('./atn/ATN').INVALID_ALT_NUMBER;
function RuleContext(parent, invokingState) {
RuleNode.call(this);
@@ -38215,6 +38216,21 @@ RuleContext.prototype.getText = function() {
}
};
+// For rule associated with this parse tree internal node, return
+// the outer alternative number used to match the input. Default
+// implementation does not compute nor store this alt num. Create
+// a subclass of ParserRuleContext with backing field and set
+// option contextSuperClass.
+// to set it.
+RuleContext.prototype.getAltNumber = function() { return INVALID_ALT_NUMBER; }
+
+// Set the outer alternative number for this context node. Default
+// implementation does nothing to avoid backing field overhead for
+// trees that don't need it. Create
+// a subclass of ParserRuleContext with backing field and set
+// option contextSuperClass.
+RuleContext.prototype.setAltNumber = function(altNumber) { }
+
RuleContext.prototype.getChild = function(i) {
return null;
};
@@ -38266,7 +38282,7 @@ RuleContext.prototype.toString = function(ruleNames, stop) {
};
-},{"./tree/Tree":51,"./tree/Trees":52}],23:[function(require,module,exports){
+},{"./atn/ATN":25,"./tree/Tree":51,"./tree/Trees":52}],23:[function(require,module,exports){
//[The "BSD license"]
// Copyright (c) 2012 Terence Parr
// Copyright (c) 2012 Sam Harwell
@@ -38637,6 +38653,13 @@ function escapeWhitespace(s, escapeSpaces) {
return s;
}
+exports.isArray = function (entity) {
+ return Object.prototype.toString.call( entity ) === '[object Array]'
+};
+
+exports.titleCase = function(str) {
+ return str.replace(/\w\S*/g, function(txt){return txt.charAt(0).toUpperCase() + txt.substr(1);});
+};
exports.Set = Set;
exports.BitSet = BitSet;
@@ -38726,7 +38749,7 @@ ATN.prototype.nextTokensNoContext = function(s) {
return s.nextTokenWithinRule;
}
s.nextTokenWithinRule = this.nextTokensInContext(s, null);
- s.nextTokenWithinRule.readonly = true;
+ s.nextTokenWithinRule.readOnly = true;
return s.nextTokenWithinRule;
};
@@ -38865,7 +38888,7 @@ function checkParams(params, isCfg) {
} else {
var props = {};
props.state = params.state || null;
- props.alt = params.alt || null;
+ props.alt = (params.alt === undefined) ? null : params.alt;
props.context = params.context || null;
props.semanticContext = params.semanticContext || null;
if(isCfg) {
@@ -38977,7 +39000,9 @@ LexerATNConfig.prototype.equals = function(other) {
return false;
} else if (this.passedThroughNonGreedyDecision !== other.passedThroughNonGreedyDecision) {
return false;
- } else if (this.lexerActionExecutor !== other.lexerActionExecutor) {
+ } else if (this.lexerActionExecutor ?
+ !this.lexerActionExecutor.equals(other.lexerActionExecutor)
+ : !other.lexerActionExecutor) {
return false;
} else {
return ATNConfig.prototype.equals.call(this, other);
@@ -39072,7 +39097,7 @@ function ATNConfigSet(fullCtx) {
// the sets and they must not change. This does not protect the other
// fields; in particular, conflictingAlts is set after
// we've made this readonly.
- this.readonly = false;
+ this.readOnly = false;
// Track the elements as they are added to the set; supports get(i)///
this.configs = [];
@@ -39106,7 +39131,7 @@ ATNConfigSet.prototype.add = function(config, mergeCache) {
if (mergeCache === undefined) {
mergeCache = null;
}
- if (this.readonly) {
+ if (this.readOnly) {
throw "This set is readonly";
}
if (config.semanticContext !== SemanticContext.NONE) {
@@ -39162,7 +39187,7 @@ Object.defineProperty(ATNConfigSet.prototype, "items", {
});
ATNConfigSet.prototype.optimizeConfigs = function(interpreter) {
- if (this.readonly) {
+ if (this.readOnly) {
throw "This set is readonly";
}
if (this.configLookup.length === 0) {
@@ -39196,7 +39221,7 @@ ATNConfigSet.prototype.equals = function(other) {
};
ATNConfigSet.prototype.hashString = function() {
- if (this.readonly) {
+ if (this.readOnly) {
if (this.cachedHashString === "-1") {
this.cachedHashString = this.hashConfigs();
}
@@ -39239,7 +39264,7 @@ ATNConfigSet.prototype.containsFast = function(item) {
};
ATNConfigSet.prototype.clear = function() {
- if (this.readonly) {
+ if (this.readOnly) {
throw "This set is readonly";
}
this.configs = [];
@@ -39247,9 +39272,9 @@ ATNConfigSet.prototype.clear = function() {
this.configLookup = new Set();
};
-ATNConfigSet.prototype.setReadonly = function(readonly) {
- this.readonly = readonly;
- if (readonly) {
+ATNConfigSet.prototype.setReadonly = function(readOnly) {
+ this.readOnly = readOnly;
+ if (readOnly) {
this.configLookup = null; // can't mod, no need for lookup cache
}
};
@@ -41581,7 +41606,7 @@ function LexerActionExecutor(lexerActions) {
this.lexerActions = lexerActions === null ? [] : lexerActions;
// Caches the result of {@link //hashCode} since the hash code is an element
// of the performance-critical {@link LexerATNConfig//hashCode} operation.
- this.hashString = lexerActions.toString(); // "".join([str(la) for la in
+ this._hashString = lexerActions.toString(); // "".join([str(la) for la in
// lexerActions]))
return this;
}
@@ -41697,7 +41722,7 @@ LexerActionExecutor.prototype.execute = function(lexer, input, startIndex) {
};
LexerActionExecutor.prototype.hashString = function() {
- return this.hashString;
+ return this._hashString;
};
LexerActionExecutor.prototype.equals = function(other) {
@@ -41705,9 +41730,18 @@ LexerActionExecutor.prototype.equals = function(other) {
return true;
} else if (!(other instanceof LexerActionExecutor)) {
return false;
+ } else if (this._hashString != other._hashString) {
+ return false;
+ } else if (this.lexerActions.length != other.lexerActions.length) {
+ return false;
} else {
- return this.hashString === other.hashString &&
- this.lexerActions === other.lexerActions;
+ var numActions = this.lexerActions.length
+ for (var idx = 0; idx < numActions; ++idx) {
+ if (!this.lexerActions[idx].equals(other.lexerActions[idx])) {
+ return false;
+ }
+ }
+ return true;
}
};
@@ -42974,10 +43008,10 @@ ParserATNSimulator.prototype.closureCheckingStopState = function(config, configs
}
continue;
}
- returnState = this.atn.states[config.context.getReturnState(i)];
- newContext = config.context.getParent(i); // "pop" return state
+ var returnState = this.atn.states[config.context.getReturnState(i)];
+ var newContext = config.context.getParent(i); // "pop" return state
var parms = {state:returnState, alt:config.alt, context:newContext, semanticContext:config.semanticContext};
- c = new ATNConfig(parms, null);
+ var c = new ATNConfig(parms, null);
// While we have context to pop back from, we may have
// gotten that context AFTER having falling off a rule.
// Make sure we track that we are now out of context.
@@ -43353,7 +43387,7 @@ ParserATNSimulator.prototype.addDFAState = function(dfa, D) {
return existing;
}
D.stateNumber = dfa.states.length;
- if (! D.configs.readonly) {
+ if (! D.configs.readOnly) {
D.configs.optimizeConfigs(this);
D.configs.setReadonly(true);
}
@@ -43441,6 +43475,9 @@ var BitSet = require('./../Utils').BitSet;
var AltDict = require('./../Utils').AltDict;
var ATN = require('./ATN').ATN;
var RuleStopState = require('./ATNState').RuleStopState;
+var ATNConfigSet = require('./ATNConfigSet').ATNConfigSet;
+var ATNConfig = require('./ATNConfig').ATNConfig;
+var SemanticContext = require('./SemanticContext').SemanticContext;
function PredictionMode() {
return this;
@@ -43984,7 +44021,8 @@ PredictionMode.getSingleViableAlt = function(altsets) {
};
exports.PredictionMode = PredictionMode;
-},{"./../Utils":24,"./ATN":25,"./ATNState":31}],38:[function(require,module,exports){
+
+},{"./../Utils":24,"./ATN":25,"./ATNConfig":26,"./ATNConfigSet":27,"./ATNState":31,"./SemanticContext":38}],38:[function(require,module,exports){
//
// [The "BSD license"]
// Copyright (c) 2012 Terence Parr
@@ -44288,7 +44326,7 @@ AND.prototype.evalPrecedence = function(parser, outerContext) {
}
var result = null;
operands.map(function(o) {
- result = result === null ? o : SemanticPredicate.andContext(result, o);
+ result = result === null ? o : SemanticContext.andContext(result, o);
});
return result;
};
@@ -44395,7 +44433,7 @@ OR.prototype.evalPrecedence = function(parser, outerContext) {
return result;
};
-AND.prototype.toString = function() {
+OR.prototype.toString = function() {
var s = "";
this.opnds.map(function(o) {
s += "|| " + o.toString();
@@ -45071,6 +45109,8 @@ exports.LexerDFASerializer = LexerDFASerializer;
///
var ATNConfigSet = require('./../atn/ATNConfigSet').ATNConfigSet;
+var Utils = require('./../Utils');
+var Set = Utils.Set;
// Map a predicate to a predicted alternative.///
@@ -45205,7 +45245,8 @@ DFAState.prototype.hashString = function() {
exports.DFAState = DFAState;
exports.PredPrediction = PredPrediction;
-},{"./../atn/ATNConfigSet":27}],44:[function(require,module,exports){
+
+},{"./../Utils":24,"./../atn/ATNConfigSet":27}],44:[function(require,module,exports){
exports.DFA = require('./DFA').DFA;
exports.DFASerializer = require('./DFASerializer').DFASerializer;
exports.LexerDFASerializer = require('./DFASerializer').LexerDFASerializer;
@@ -45732,7 +45773,8 @@ DefaultErrorStrategy.prototype.sync = function(recognizer) {
case ATNState.PLUS_LOOP_BACK:
case ATNState.STAR_LOOP_BACK:
this.reportUnwantedToken(recognizer);
- var expecting = recognizer.getExpectedTokens();
+ var expecting = new IntervalSet();
+ expecting.addSet(recognizer.getExpectedTokens());
var whatFollowsLoopIterationOrRule = expecting.addSet(this.getErrorRecoverySet(recognizer));
this.consumeUntil(recognizer, whatFollowsLoopIterationOrRule);
break;
@@ -46452,7 +46494,7 @@ exports.dfa = require('./dfa/index');
exports.tree = require('./tree/index');
exports.error = require('./error/index');
exports.Token = require('./Token').Token;
-exports.CommonToken = require('./Token').Token;
+exports.CommonToken = require('./Token').CommonToken;
exports.InputStream = require('./InputStream').InputStream;
exports.FileStream = require('./FileStream').FileStream;
exports.CommonTokenStream = require('./CommonTokenStream').CommonTokenStream;
@@ -46502,6 +46544,8 @@ exports.Utils = require('./Utils');
var Token = require('./../Token').Token;
var Interval = require('./../IntervalSet').Interval;
var INVALID_INTERVAL = new Interval(-1, -2);
+var Utils = require('../Utils.js');
+
function Tree() {
return this;
@@ -46551,6 +46595,33 @@ function ParseTreeVisitor() {
return this;
}
+ParseTreeVisitor.prototype.visit = function(ctx) {
+ if (Utils.isArray(ctx)) {
+ var self = this;
+ return ctx.map(function(child) { return visitAtom(self, child)});
+ } else {
+ return visitAtom(this, ctx);
+ }
+};
+
+ParseTreeVisitor.prototype.visitTerminal = function(node) {
+};
+
+ParseTreeVisitor.prototype.visitErrorNode = function(node) {
+};
+
+
+var visitAtom = function(visitor, ctx) {
+ if (ctx.parser === undefined) { //is terminal
+ return;
+ }
+
+ var name = ctx.parser.ruleNames[ctx.ruleIndex];
+ var funcName = "visit" + Utils.titleCase(name);
+
+ return visitor[funcName](ctx);
+};
+
function ParseTreeListener() {
return this;
}
@@ -46692,7 +46763,7 @@ exports.ParseTreeListener = ParseTreeListener;
exports.ParseTreeVisitor = ParseTreeVisitor;
exports.ParseTreeWalker = ParseTreeWalker;
exports.INVALID_INTERVAL = INVALID_INTERVAL;
-},{"./../IntervalSet":15,"./../Token":23}],52:[function(require,module,exports){
+},{"../Utils.js":24,"./../IntervalSet":15,"./../Token":23}],52:[function(require,module,exports){
/*
* [The "BSD license"]
* Copyright (c) 2012 Terence Parr
@@ -46729,6 +46800,8 @@ var RuleNode = require('./Tree').RuleNode;
var ErrorNode = require('./Tree').ErrorNode;
var TerminalNode = require('./Tree').TerminalNode;
var ParserRuleContext = require('./../ParserRuleContext').ParserRuleContext;
+var RuleContext = require('./../RuleContext').RuleContext;
+var INVALID_ALT_NUMBER = require('./../atn/ATN').INVALID_ALT_NUMBER;
/** A set of utility routines useful for all kinds of ANTLR trees. */
@@ -46770,8 +46843,12 @@ Trees.getNodeText = function(t, ruleNames, recog) {
ruleNames = recog.ruleNames;
}
if(ruleNames!==null) {
- if (t instanceof RuleNode) {
- return ruleNames[t.getRuleContext().ruleIndex];
+ if (t instanceof RuleContext) {
+ var altNumber = t.getAltNumber();
+ if ( altNumber!=INVALID_ALT_NUMBER ) {
+ return ruleNames[t.ruleIndex]+":"+altNumber;
+ }
+ return ruleNames[t.ruleIndex];
} else if ( t instanceof ErrorNode) {
return t.toString();
} else if(t instanceof TerminalNode) {
@@ -46810,7 +46887,7 @@ Trees.getAncestors = function(t) {
}
return ancestors;
};
-
+
Trees.findAllTokenNodes = function(t, ttype) {
return Trees.findAllNodes(t, ttype, true);
};
@@ -46852,14 +46929,15 @@ Trees.descendants = function(t) {
exports.Trees = Trees;
-},{"./../ParserRuleContext":19,"./../Token":23,"./../Utils":24,"./Tree":51}],53:[function(require,module,exports){
+},{"./../ParserRuleContext":19,"./../RuleContext":22,"./../Token":23,"./../Utils":24,"./../atn/ATN":25,"./Tree":51}],53:[function(require,module,exports){
var Tree = require('./Tree');
-exports.Trees = require('./Tree').Trees;
+exports.Trees = require('./Trees').Trees;
exports.RuleNode = Tree.RuleNode;
exports.ParseTreeListener = Tree.ParseTreeListener;
exports.ParseTreeVisitor = Tree.ParseTreeVisitor;
exports.ParseTreeWalker = Tree.ParseTreeWalker;
-},{"./Tree":51}],54:[function(require,module,exports){
+
+},{"./Tree":51,"./Trees":52}],54:[function(require,module,exports){
},{}],55:[function(require,module,exports){
arguments[4][54][0].apply(exports,arguments)
@@ -46873,9 +46951,11 @@ arguments[4][54][0].apply(exports,arguments)
*/
/* eslint-disable no-proto */
+'use strict'
+
var base64 = require('base64-js')
var ieee754 = require('ieee754')
-var isArray = require('is-array')
+var isArray = require('isarray')
exports.Buffer = Buffer
exports.SlowBuffer = SlowBuffer
@@ -46955,8 +47035,10 @@ function Buffer (arg) {
return new Buffer(arg)
}
- this.length = 0
- this.parent = undefined
+ if (!Buffer.TYPED_ARRAY_SUPPORT) {
+ this.length = 0
+ this.parent = undefined
+ }
// Common case.
if (typeof arg === 'number') {
@@ -47087,6 +47169,10 @@ function fromJsonObject (that, object) {
if (Buffer.TYPED_ARRAY_SUPPORT) {
Buffer.prototype.__proto__ = Uint8Array.prototype
Buffer.__proto__ = Uint8Array
+} else {
+ // pre-set for values that may exist in the future
+ Buffer.prototype.length = undefined
+ Buffer.prototype.parent = undefined
}
function allocate (that, length) {
@@ -47237,10 +47323,6 @@ function byteLength (string, encoding) {
}
Buffer.byteLength = byteLength
-// pre-set for values that may exist in the future
-Buffer.prototype.length = undefined
-Buffer.prototype.parent = undefined
-
function slowToString (encoding, start, end) {
var loweredCase = false
@@ -48332,7 +48414,7 @@ function utf8ToBytes (string, units) {
}
// valid surrogate pair
- codePoint = leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00 | 0x10000
+ codePoint = (leadSurrogate - 0xD800 << 10 | codePoint - 0xDC00) + 0x10000
} else if (leadSurrogate) {
// valid bmp char, but last char was a lead
if ((units -= 3) > -1) bytes.push(0xEF, 0xBF, 0xBD)
@@ -48411,7 +48493,7 @@ function blitBuffer (src, dst, offset, length) {
}
}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
-},{"base64-js":57,"ieee754":58,"is-array":59}],57:[function(require,module,exports){
+},{"base64-js":57,"ieee754":58,"isarray":59}],57:[function(require,module,exports){
var lookup = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
;(function (exports) {
@@ -48624,38 +48706,10 @@ exports.write = function (buffer, value, offset, isLE, mLen, nBytes) {
}
},{}],59:[function(require,module,exports){
+var toString = {}.toString;
-/**
- * isArray
- */
-
-var isArray = Array.isArray;
-
-/**
- * toString
- */
-
-var str = Object.prototype.toString;
-
-/**
- * Whether or not the given `val`
- * is an array.
- *
- * example:
- *
- * isArray([]);
- * // > true
- * isArray(arguments);
- * // > false
- * isArray('');
- * // > false
- *
- * @param {mixed} val
- * @return {bool}
- */
-
-module.exports = isArray || function (val) {
- return !! val && '[object Array]' == str.call(val);
+module.exports = Array.isArray || function (arr) {
+ return toString.call(arr) == '[object Array]';
};
},{}],60:[function(require,module,exports){
@@ -49014,12 +49068,40 @@ module.exports = Array.isArray || function (arr) {
// shim for using process in browser
var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+(function () {
+ try {
+ cachedSetTimeout = setTimeout;
+ } catch (e) {
+ cachedSetTimeout = function () {
+ throw new Error('setTimeout is not defined');
+ }
+ }
+ try {
+ cachedClearTimeout = clearTimeout;
+ } catch (e) {
+ cachedClearTimeout = function () {
+ throw new Error('clearTimeout is not defined');
+ }
+ }
+} ())
var queue = [];
var draining = false;
var currentQueue;
var queueIndex = -1;
function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
draining = false;
if (currentQueue.length) {
queue = currentQueue.concat(queue);
@@ -49035,7 +49117,7 @@ function drainQueue() {
if (draining) {
return;
}
- var timeout = setTimeout(cleanUpNextTick);
+ var timeout = cachedSetTimeout(cleanUpNextTick);
draining = true;
var len = queue.length;
@@ -49052,7 +49134,7 @@ function drainQueue() {
}
currentQueue = null;
draining = false;
- clearTimeout(timeout);
+ cachedClearTimeout(timeout);
}
process.nextTick = function (fun) {
@@ -49064,7 +49146,7 @@ process.nextTick = function (fun) {
}
queue.push(new Item(fun, args));
if (queue.length === 1 && !draining) {
- setTimeout(drainQueue, 0);
+ cachedSetTimeout(drainQueue, 0);
}
};
@@ -50919,8 +51001,12 @@ function endWritable(stream, state, cb) {
// NOTE: These type checking functions intentionally don't use `instanceof`
// because it is fragile and can be easily faked with `Object.create()`.
-function isArray(ar) {
- return Array.isArray(ar);
+
+function isArray(arg) {
+ if (Array.isArray) {
+ return Array.isArray(arg);
+ }
+ return objectToString(arg) === '[object Array]';
}
exports.isArray = isArray;
@@ -50960,7 +51046,7 @@ function isUndefined(arg) {
exports.isUndefined = isUndefined;
function isRegExp(re) {
- return isObject(re) && objectToString(re) === '[object RegExp]';
+ return objectToString(re) === '[object RegExp]';
}
exports.isRegExp = isRegExp;
@@ -50970,13 +51056,12 @@ function isObject(arg) {
exports.isObject = isObject;
function isDate(d) {
- return isObject(d) && objectToString(d) === '[object Date]';
+ return objectToString(d) === '[object Date]';
}
exports.isDate = isDate;
function isError(e) {
- return isObject(e) &&
- (objectToString(e) === '[object Error]' || e instanceof Error);
+ return (objectToString(e) === '[object Error]' || e instanceof Error);
}
exports.isError = isError;
@@ -50995,19 +51080,18 @@ function isPrimitive(arg) {
}
exports.isPrimitive = isPrimitive;
-function isBuffer(arg) {
- return Buffer.isBuffer(arg);
-}
-exports.isBuffer = isBuffer;
+exports.isBuffer = Buffer.isBuffer;
function objectToString(o) {
return Object.prototype.toString.call(o);
}
+
}).call(this,{"isBuffer":require("../../../../insert-module-globals/node_modules/is-buffer/index.js")})
},{"../../../../insert-module-globals/node_modules/is-buffer/index.js":62}],72:[function(require,module,exports){
module.exports = require("./lib/_stream_passthrough.js")
},{"./lib/_stream_passthrough.js":67}],73:[function(require,module,exports){
+(function (process){
exports = module.exports = require('./lib/_stream_readable.js');
exports.Stream = require('stream');
exports.Readable = exports;
@@ -51015,8 +51099,12 @@ exports.Writable = require('./lib/_stream_writable.js');
exports.Duplex = require('./lib/_stream_duplex.js');
exports.Transform = require('./lib/_stream_transform.js');
exports.PassThrough = require('./lib/_stream_passthrough.js');
+if (!process.browser && process.env.READABLE_STREAM === 'disable') {
+ module.exports = require('stream');
+}
-},{"./lib/_stream_duplex.js":66,"./lib/_stream_passthrough.js":67,"./lib/_stream_readable.js":68,"./lib/_stream_transform.js":69,"./lib/_stream_writable.js":70,"stream":76}],74:[function(require,module,exports){
+}).call(this,require('_process'))
+},{"./lib/_stream_duplex.js":66,"./lib/_stream_passthrough.js":67,"./lib/_stream_readable.js":68,"./lib/_stream_transform.js":69,"./lib/_stream_writable.js":70,"_process":64,"stream":76}],74:[function(require,module,exports){
module.exports = require("./lib/_stream_transform.js")
},{"./lib/_stream_transform.js":69}],75:[function(require,module,exports){
@@ -51375,159 +51463,745 @@ function base64DetectIncompleteChar(buffer) {
}
},{"buffer":56}],78:[function(require,module,exports){
-'use strict';
-
-exports.Parser = require('./lib/tree_construction/parser');
-exports.SimpleApiParser = require('./lib/simple_api/simple_api_parser');
-exports.TreeSerializer =
-exports.Serializer = require('./lib/serialization/serializer');
-exports.JsDomParser = require('./lib/jsdom/jsdom_parser');
-
-exports.TreeAdapters = {
- default: require('./lib/tree_adapters/default'),
- htmlparser2: require('./lib/tree_adapters/htmlparser2')
-};
+module.exports = function isBuffer(arg) {
+ return arg && typeof arg === 'object'
+ && typeof arg.copy === 'function'
+ && typeof arg.fill === 'function'
+ && typeof arg.readUInt8 === 'function';
+}
+},{}],79:[function(require,module,exports){
+(function (process,global){
+// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
-},{"./lib/jsdom/jsdom_parser":84,"./lib/serialization/serializer":86,"./lib/simple_api/simple_api_parser":87,"./lib/tree_adapters/default":93,"./lib/tree_adapters/htmlparser2":94,"./lib/tree_construction/parser":98}],79:[function(require,module,exports){
-'use strict';
-
-//Const
-var VALID_DOCTYPE_NAME = 'html',
- QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd',
- QUIRKS_MODE_PUBLIC_ID_PREFIXES = [
- "+//silmaril//dtd html pro v0r11 19970101//en",
- "-//advasoft ltd//dtd html 3.0 aswedit + extensions//en",
- "-//as//dtd html 3.0 aswedit + extensions//en",
- "-//ietf//dtd html 2.0 level 1//en",
- "-//ietf//dtd html 2.0 level 2//en",
- "-//ietf//dtd html 2.0 strict level 1//en",
- "-//ietf//dtd html 2.0 strict level 2//en",
- "-//ietf//dtd html 2.0 strict//en",
- "-//ietf//dtd html 2.0//en",
- "-//ietf//dtd html 2.1e//en",
- "-//ietf//dtd html 3.0//en",
- "-//ietf//dtd html 3.0//en//",
- "-//ietf//dtd html 3.2 final//en",
- "-//ietf//dtd html 3.2//en",
- "-//ietf//dtd html 3//en",
- "-//ietf//dtd html level 0//en",
- "-//ietf//dtd html level 0//en//2.0",
- "-//ietf//dtd html level 1//en",
- "-//ietf//dtd html level 1//en//2.0",
- "-//ietf//dtd html level 2//en",
- "-//ietf//dtd html level 2//en//2.0",
- "-//ietf//dtd html level 3//en",
- "-//ietf//dtd html level 3//en//3.0",
- "-//ietf//dtd html strict level 0//en",
- "-//ietf//dtd html strict level 0//en//2.0",
- "-//ietf//dtd html strict level 1//en",
- "-//ietf//dtd html strict level 1//en//2.0",
- "-//ietf//dtd html strict level 2//en",
- "-//ietf//dtd html strict level 2//en//2.0",
- "-//ietf//dtd html strict level 3//en",
- "-//ietf//dtd html strict level 3//en//3.0",
- "-//ietf//dtd html strict//en",
- "-//ietf//dtd html strict//en//2.0",
- "-//ietf//dtd html strict//en//3.0",
- "-//ietf//dtd html//en",
- "-//ietf//dtd html//en//2.0",
- "-//ietf//dtd html//en//3.0",
- "-//metrius//dtd metrius presentational//en",
- "-//microsoft//dtd internet explorer 2.0 html strict//en",
- "-//microsoft//dtd internet explorer 2.0 html//en",
- "-//microsoft//dtd internet explorer 2.0 tables//en",
- "-//microsoft//dtd internet explorer 3.0 html strict//en",
- "-//microsoft//dtd internet explorer 3.0 html//en",
- "-//microsoft//dtd internet explorer 3.0 tables//en",
- "-//netscape comm. corp.//dtd html//en",
- "-//netscape comm. corp.//dtd strict html//en",
- "-//o'reilly and associates//dtd html 2.0//en",
- "-//o'reilly and associates//dtd html extended 1.0//en",
- "-//spyglass//dtd html 2.0 extended//en",
- "-//sq//dtd html 2.0 hotmetal + extensions//en",
- "-//sun microsystems corp.//dtd hotjava html//en",
- "-//sun microsystems corp.//dtd hotjava strict html//en",
- "-//w3c//dtd html 3 1995-03-24//en",
- "-//w3c//dtd html 3.2 draft//en",
- "-//w3c//dtd html 3.2 final//en",
- "-//w3c//dtd html 3.2//en",
- "-//w3c//dtd html 3.2s draft//en",
- "-//w3c//dtd html 4.0 frameset//en",
- "-//w3c//dtd html 4.0 transitional//en",
- "-//w3c//dtd html experimental 19960712//en",
- "-//w3c//dtd html experimental 970421//en",
- "-//w3c//dtd w3 html//en",
- "-//w3o//dtd w3 html 3.0//en",
- "-//w3o//dtd w3 html 3.0//en//",
- "-//webtechs//dtd mozilla html 2.0//en",
- "-//webtechs//dtd mozilla html//en"
- ],
- QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = [
- '-//w3c//dtd html 4.01 frameset//',
- '-//w3c//dtd html 4.01 transitional//'
- ],
- QUIRKS_MODE_PUBLIC_IDS = [
- '-//w3o//dtd w3 html strict 3.0//en//',
- '-/w3c/dtd html 4.0 transitional/en',
- 'html'
- ];
-
-
-//Utils
-function enquoteDoctypeId(id) {
- var quote = id.indexOf('"') !== -1 ? '\'' : '"';
-
- return quote + id + quote;
-}
-
-
-//API
-exports.isQuirks = function (name, publicId, systemId) {
- if (name !== VALID_DOCTYPE_NAME)
- return true;
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+ if (!isString(f)) {
+ var objects = [];
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+ switch (x) {
+ case '%s': return String(args[i++]);
+ case '%d': return Number(args[i++]);
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+ default:
+ return x;
+ }
+ });
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+ return str;
+};
- if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID)
- return true;
- if (publicId !== null) {
- publicId = publicId.toLowerCase();
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global.process)) {
+ return function() {
+ return exports.deprecate(fn, msg).apply(this, arguments);
+ };
+ }
- if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1)
- return true;
+ if (process.noDeprecation === true) {
+ return fn;
+ }
- var prefixes = QUIRKS_MODE_PUBLIC_ID_PREFIXES;
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (process.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
- if (systemId === null)
- prefixes = prefixes.concat(QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES);
+ return deprecated;
+};
- for (var i = 0; i < prefixes.length; i++) {
- if (publicId.indexOf(prefixes[i]) === 0)
- return true;
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+ if (isUndefined(debugEnviron))
+ debugEnviron = process.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = process.pid;
+ debugs[set] = function() {
+ var msg = exports.format.apply(exports, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function() {};
+ }
+ }
+ return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ };
+ // legacy...
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ exports._extend(ctx, opts);
+ }
+ // set default options
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+ 'bold' : [1, 22],
+ 'italic' : [3, 23],
+ 'underline' : [4, 24],
+ 'inverse' : [7, 27],
+ 'white' : [37, 39],
+ 'grey' : [90, 39],
+ 'black' : [30, 39],
+ 'blue' : [34, 39],
+ 'cyan' : [36, 39],
+ 'green' : [32, 39],
+ 'magenta' : [35, 39],
+ 'red' : [31, 39],
+ 'yellow' : [33, 39]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+ '\u001b[' + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+}
+
+
+function stylizeNoColor(str, styleType) {
+ return str;
+}
+
+
+function arrayToHash(array) {
+ var hash = {};
+
+ array.forEach(function(val, idx) {
+ hash[val] = true;
+ });
+
+ return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect &&
+ value &&
+ isFunction(value.inspect) &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+ if (!isString(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // Look up the keys of the object.
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ }
+
+ // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+ if (isError(value)
+ && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ }
+
+ // Some type of object without properties can be shortcutted.
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ if (isUndefined(value))
+ return ctx.stylize('undefined', 'undefined');
+ if (isString(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+ if (isNumber(value))
+ return ctx.stylize('' + value, 'number');
+ if (isBoolean(value))
+ return ctx.stylize('' + value, 'boolean');
+ // For some reason typeof null is "object", so special case here.
+ if (isNull(value))
+ return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
}
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
}
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
- return false;
-};
+ return name + ': ' + str;
+}
-exports.serializeContent = function (name, publicId, systemId) {
- var str = '!DOCTYPE ' + name;
- if (publicId !== null)
- str += ' PUBLIC ' + enquoteDoctypeId(publicId);
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
- else if (systemId !== null)
- str += ' SYSTEM';
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
- if (systemId !== null)
- str += ' ' + enquoteDoctypeId(systemId);
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
- return str;
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+ return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return isObject(e) &&
+ (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = require('./support/isBuffer');
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+ console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = require('inherits');
+
+exports._extend = function(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin;
};
-},{}],80:[function(require,module,exports){
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+}).call(this,require('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+},{"./support/isBuffer":78,"_process":64,"inherits":61}],80:[function(require,module,exports){
+'use strict';
+
+//Const
+var VALID_DOCTYPE_NAME = 'html',
+ QUIRKS_MODE_SYSTEM_ID = 'http://www.ibm.com/data/dtd/v11/ibmxhtml1-transitional.dtd',
+ QUIRKS_MODE_PUBLIC_ID_PREFIXES = [
+ '+//silmaril//dtd html pro v0r11 19970101//en',
+ '-//advasoft ltd//dtd html 3.0 aswedit + extensions//en',
+ '-//as//dtd html 3.0 aswedit + extensions//en',
+ '-//ietf//dtd html 2.0 level 1//en',
+ '-//ietf//dtd html 2.0 level 2//en',
+ '-//ietf//dtd html 2.0 strict level 1//en',
+ '-//ietf//dtd html 2.0 strict level 2//en',
+ '-//ietf//dtd html 2.0 strict//en',
+ '-//ietf//dtd html 2.0//en',
+ '-//ietf//dtd html 2.1e//en',
+ '-//ietf//dtd html 3.0//en',
+ '-//ietf//dtd html 3.0//en//',
+ '-//ietf//dtd html 3.2 final//en',
+ '-//ietf//dtd html 3.2//en',
+ '-//ietf//dtd html 3//en',
+ '-//ietf//dtd html level 0//en',
+ '-//ietf//dtd html level 0//en//2.0',
+ '-//ietf//dtd html level 1//en',
+ '-//ietf//dtd html level 1//en//2.0',
+ '-//ietf//dtd html level 2//en',
+ '-//ietf//dtd html level 2//en//2.0',
+ '-//ietf//dtd html level 3//en',
+ '-//ietf//dtd html level 3//en//3.0',
+ '-//ietf//dtd html strict level 0//en',
+ '-//ietf//dtd html strict level 0//en//2.0',
+ '-//ietf//dtd html strict level 1//en',
+ '-//ietf//dtd html strict level 1//en//2.0',
+ '-//ietf//dtd html strict level 2//en',
+ '-//ietf//dtd html strict level 2//en//2.0',
+ '-//ietf//dtd html strict level 3//en',
+ '-//ietf//dtd html strict level 3//en//3.0',
+ '-//ietf//dtd html strict//en',
+ '-//ietf//dtd html strict//en//2.0',
+ '-//ietf//dtd html strict//en//3.0',
+ '-//ietf//dtd html//en',
+ '-//ietf//dtd html//en//2.0',
+ '-//ietf//dtd html//en//3.0',
+ '-//metrius//dtd metrius presentational//en',
+ '-//microsoft//dtd internet explorer 2.0 html strict//en',
+ '-//microsoft//dtd internet explorer 2.0 html//en',
+ '-//microsoft//dtd internet explorer 2.0 tables//en',
+ '-//microsoft//dtd internet explorer 3.0 html strict//en',
+ '-//microsoft//dtd internet explorer 3.0 html//en',
+ '-//microsoft//dtd internet explorer 3.0 tables//en',
+ '-//netscape comm. corp.//dtd html//en',
+ '-//netscape comm. corp.//dtd strict html//en',
+ '-//o\'reilly and associates//dtd html 2.0//en',
+ '-//o\'reilly and associates//dtd html extended 1.0//en',
+ '-//spyglass//dtd html 2.0 extended//en',
+ '-//sq//dtd html 2.0 hotmetal + extensions//en',
+ '-//sun microsystems corp.//dtd hotjava html//en',
+ '-//sun microsystems corp.//dtd hotjava strict html//en',
+ '-//w3c//dtd html 3 1995-03-24//en',
+ '-//w3c//dtd html 3.2 draft//en',
+ '-//w3c//dtd html 3.2 final//en',
+ '-//w3c//dtd html 3.2//en',
+ '-//w3c//dtd html 3.2s draft//en',
+ '-//w3c//dtd html 4.0 frameset//en',
+ '-//w3c//dtd html 4.0 transitional//en',
+ '-//w3c//dtd html experimental 19960712//en',
+ '-//w3c//dtd html experimental 970421//en',
+ '-//w3c//dtd w3 html//en',
+ '-//w3o//dtd w3 html 3.0//en',
+ '-//w3o//dtd w3 html 3.0//en//',
+ '-//webtechs//dtd mozilla html 2.0//en',
+ '-//webtechs//dtd mozilla html//en'
+ ],
+ QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES = [
+ '-//w3c//dtd html 4.01 frameset//',
+ '-//w3c//dtd html 4.01 transitional//'
+ ],
+ QUIRKS_MODE_PUBLIC_IDS = [
+ '-//w3o//dtd w3 html strict 3.0//en//',
+ '-/w3c/dtd html 4.0 transitional/en',
+ 'html'
+ ];
+
+
+//Utils
+function enquoteDoctypeId(id) {
+ var quote = id.indexOf('"') !== -1 ? '\'' : '"';
+
+ return quote + id + quote;
+}
+
+
+//API
+exports.isQuirks = function (name, publicId, systemId) {
+ if (name !== VALID_DOCTYPE_NAME)
+ return true;
+
+ if (systemId && systemId.toLowerCase() === QUIRKS_MODE_SYSTEM_ID)
+ return true;
+
+ if (publicId !== null) {
+ publicId = publicId.toLowerCase();
+
+ if (QUIRKS_MODE_PUBLIC_IDS.indexOf(publicId) > -1)
+ return true;
+
+ var prefixes = QUIRKS_MODE_PUBLIC_ID_PREFIXES;
+
+ if (systemId === null)
+ prefixes = prefixes.concat(QUIRKS_MODE_NO_SYSTEM_ID_PUBLIC_ID_PREFIXES);
+
+ for (var i = 0; i < prefixes.length; i++) {
+ if (publicId.indexOf(prefixes[i]) === 0)
+ return true;
+ }
+ }
+
+ return false;
+};
+
+exports.serializeContent = function (name, publicId, systemId) {
+ var str = '!DOCTYPE ';
+
+ if (name)
+ str += name;
+
+ if (publicId !== null)
+ str += ' PUBLIC ' + enquoteDoctypeId(publicId);
+
+ else if (systemId !== null)
+ str += ' SYSTEM';
+
+ if (systemId !== null)
+ str += ' ' + enquoteDoctypeId(systemId);
+
+ return str;
+};
+
+},{}],81:[function(require,module,exports){
'use strict';
-var Tokenizer = require('../tokenization/tokenizer'),
+var Tokenizer = require('../tokenizer'),
HTML = require('./html');
//Aliases
@@ -51552,12 +52226,8 @@ var DEFINITION_URL_ATTR = 'definitionurl',
'baseprofile': 'baseProfile',
'calcmode': 'calcMode',
'clippathunits': 'clipPathUnits',
- 'contentscripttype': 'contentScriptType',
- 'contentstyletype': 'contentStyleType',
'diffuseconstant': 'diffuseConstant',
'edgemode': 'edgeMode',
- 'externalresourcesrequired': 'externalResourcesRequired',
- 'filterres': 'filterRes',
'filterunits': 'filterUnits',
'glyphref': 'glyphRef',
'gradienttransform': 'gradientTransform',
@@ -51716,14 +52386,11 @@ EXITS_FOREIGN_CONTENT[$.VAR] = true;
//Check exit from foreign content
exports.causesExit = function (startTagToken) {
var tn = startTagToken.tagName;
+ var isFontWithAttrs = tn === $.FONT && (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null ||
+ Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null ||
+ Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null);
- if (tn === $.FONT && (Tokenizer.getTokenAttr(startTagToken, ATTRS.COLOR) !== null ||
- Tokenizer.getTokenAttr(startTagToken, ATTRS.SIZE) !== null ||
- Tokenizer.getTokenAttr(startTagToken, ATTRS.FACE) !== null)) {
- return true;
- }
-
- return EXITS_FOREIGN_CONTENT[tn];
+ return isFontWithAttrs ? true : EXITS_FOREIGN_CONTENT[tn];
};
//Token adjustments
@@ -51765,11 +52432,11 @@ exports.adjustTokenSVGTagName = function (token) {
};
//Integration points
-exports.isMathMLTextIntegrationPoint = function (tn, ns) {
+function isMathMLTextIntegrationPoint(tn, ns) {
return ns === NS.MATHML && (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS || tn === $.MTEXT);
-};
+}
-exports.isHtmlIntegrationPoint = function (tn, ns, attrs) {
+function isHtmlIntegrationPoint(tn, ns, attrs) {
if (ns === NS.MATHML && tn === $.ANNOTATION_XML) {
for (var i = 0; i < attrs.length; i++) {
if (attrs[i].name === ATTRS.ENCODING) {
@@ -51781,9 +52448,19 @@ exports.isHtmlIntegrationPoint = function (tn, ns, attrs) {
}
return ns === NS.SVG && (tn === $.FOREIGN_OBJECT || tn === $.DESC || tn === $.TITLE);
+}
+
+exports.isIntegrationPoint = function (tn, ns, attrs, foreignNS) {
+ if ((!foreignNS || foreignNS === NS.HTML) && isHtmlIntegrationPoint(tn, ns, attrs))
+ return true;
+
+ if ((!foreignNS || foreignNS === NS.MATHML) && isMathMLTextIntegrationPoint(tn, ns))
+ return true;
+
+ return false;
};
-},{"../tokenization/tokenizer":92,"./html":81}],81:[function(require,module,exports){
+},{"../tokenizer":97,"./html":82}],82:[function(require,module,exports){
'use strict';
var NS = exports.NAMESPACES = {
@@ -51830,7 +52507,6 @@ var $ = exports.TAG_NAMES = {
CODE: 'code',
COL: 'col',
COLGROUP: 'colgroup',
- COMMAND: 'command',
DD: 'dd',
DESC: 'desc',
@@ -51871,7 +52547,6 @@ var $ = exports.TAG_NAMES = {
IMAGE: 'image',
INPUT: 'input',
IFRAME: 'iframe',
- ISINDEX: 'isindex',
KEYGEN: 'keygen',
@@ -51910,8 +52585,10 @@ var $ = exports.TAG_NAMES = {
PLAINTEXT: 'plaintext',
PRE: 'pre',
+ RB: 'rb',
RP: 'rp',
RT: 'rt',
+ RTC: 'rtc',
RUBY: 'ruby',
S: 's',
@@ -52000,14 +52677,12 @@ SPECIAL_ELEMENTS[NS.HTML][$.HTML] = true;
SPECIAL_ELEMENTS[NS.HTML][$.IFRAME] = true;
SPECIAL_ELEMENTS[NS.HTML][$.IMG] = true;
SPECIAL_ELEMENTS[NS.HTML][$.INPUT] = true;
-SPECIAL_ELEMENTS[NS.HTML][$.ISINDEX] = true;
SPECIAL_ELEMENTS[NS.HTML][$.LI] = true;
SPECIAL_ELEMENTS[NS.HTML][$.LINK] = true;
SPECIAL_ELEMENTS[NS.HTML][$.LISTING] = true;
SPECIAL_ELEMENTS[NS.HTML][$.MAIN] = true;
SPECIAL_ELEMENTS[NS.HTML][$.MARQUEE] = true;
SPECIAL_ELEMENTS[NS.HTML][$.MENU] = true;
-SPECIAL_ELEMENTS[NS.HTML][$.MENUITEM] = true;
SPECIAL_ELEMENTS[NS.HTML][$.META] = true;
SPECIAL_ELEMENTS[NS.HTML][$.NAV] = true;
SPECIAL_ELEMENTS[NS.HTML][$.NOEMBED] = true;
@@ -52053,7 +52728,22 @@ SPECIAL_ELEMENTS[NS.SVG][$.TITLE] = true;
SPECIAL_ELEMENTS[NS.SVG][$.FOREIGN_OBJECT] = true;
SPECIAL_ELEMENTS[NS.SVG][$.DESC] = true;
-},{}],82:[function(require,module,exports){
+},{}],83:[function(require,module,exports){
+'use strict';
+
+module.exports = function mergeOptions(defaults, options) {
+ options = options || {};
+
+ return [defaults, options].reduce(function (merged, optObj) {
+ Object.keys(optObj).forEach(function (key) {
+ merged[key] = optObj[key];
+ });
+
+ return merged;
+ }, {});
+};
+
+},{}],84:[function(require,module,exports){
'use strict';
exports.REPLACEMENT_CHARACTER = '\uFFFD';
@@ -52089,7 +52779,6 @@ exports.CODE_POINTS = {
LATIN_SMALL_F: 0x66,
LATIN_SMALL_X: 0x78,
LATIN_SMALL_Z: 0x7A,
- BOM: 0xFEFF,
REPLACEMENT_CHARACTER: 0xFFFD
};
@@ -52103,573 +52792,460 @@ exports.CODE_POINT_SEQUENCES = {
SYSTEM_STRING: [0x53, 0x59, 0x53, 0x54, 0x45, 0x4D] //SYSTEM
};
-},{}],83:[function(require,module,exports){
+},{}],85:[function(require,module,exports){
'use strict';
-exports.mergeOptions = function (defaults, options) {
- options = options || {};
+var Parser = require('./parser'),
+ Serializer = require('./serializer');
+
+/** @namespace parse5 */
+
+/**
+ * Parses an HTML string.
+ * @function parse
+ * @memberof parse5
+ * @instance
+ * @param {string} html - Input HTML string.
+ * @param {ParserOptions} [options] - Parsing options.
+ * @returns {ASTNode} document
+ * @example
+ * var parse5 = require('parse5');
+ *
+ * var document = parse5.parse('Hi there!');
+ */
+exports.parse = function parse(html, options) {
+ var parser = new Parser(options);
+
+ return parser.parse(html);
+};
- return [defaults, options].reduce(function (merged, optObj) {
- Object.keys(optObj).forEach(function (key) {
- merged[key] = optObj[key];
- });
+/**
+ * Parses an HTML fragment.
+ * @function parseFragment
+ * @memberof parse5
+ * @instance
+ * @param {ASTNode} [fragmentContext] - Parsing context element. If specified, given fragment
+ * will be parsed as if it was set to the context element's `innerHTML` property.
+ * @param {string} html - Input HTML fragment string.
+ * @param {ParserOptions} [options] - Parsing options.
+ * @returns {ASTNode} documentFragment
+ * @example
+ * var parse5 = require('parse5');
+ *
+ * var documentFragment = parse5.parseFragment('');
+ *
+ * // Parses the html fragment in the context of the parsed element.
+ * var trFragment = parser.parseFragment(documentFragment.childNodes[0], 'Shake it, baby ');
+ */
+exports.parseFragment = function parseFragment(fragmentContext, html, options) {
+ if (typeof fragmentContext === 'string') {
+ options = html;
+ html = fragmentContext;
+ fragmentContext = null;
+ }
- return merged;
- }, {});
+ var parser = new Parser(options);
+
+ return parser.parseFragment(html, fragmentContext);
+};
+
+/**
+ * Serializes an AST node to an HTML string.
+ * @function serialize
+ * @memberof parse5
+ * @instance
+ * @param {ASTNode} node - Node to serialize.
+ * @param {SerializerOptions} [options] - Serialization options.
+ * @returns {String} html
+ * @example
+ * var parse5 = require('parse5');
+ *
+ * var document = parse5.parse('Hi there!');
+ *
+ * // Serializes a document.
+ * var html = parse5.serialize(document);
+ *
+ * // Serializes the element content.
+ * var bodyInnerHtml = parse5.serialize(document.childNodes[0].childNodes[1]);
+ */
+exports.serialize = function (node, options) {
+ var serializer = new Serializer(node, options);
+
+ return serializer.serialize();
};
+
+/**
+ * Provides built-in tree adapters that can be used for parsing and serialization.
+ * @var treeAdapters
+ * @memberof parse5
+ * @instance
+ * @property {TreeAdapter} default - Default tree format for parse5.
+ * @property {TreeAdapter} htmlparser2 - Quite popular [htmlparser2](https://github.com/fb55/htmlparser2) tree format
+ * (e.g. used by [cheerio](https://github.com/MatthewMueller/cheerio) and [jsdom](https://github.com/tmpvar/jsdom)).
+ * @example
+ * var parse5 = require('parse5');
+ *
+ * // Uses the default tree adapter for parsing.
+ * var document = parse5.parse('
', { treeAdapter: parse5.treeAdapters.default });
+ *
+ * // Uses the htmlparser2 tree adapter with the SerializerStream.
+ * var serializer = new parse5.SerializerStream(node, { treeAdapter: parse5.treeAdapters.htmlparser2 });
+ */
+exports.treeAdapters = {
+ default: require('./tree_adapters/default'),
+ htmlparser2: require('./tree_adapters/htmlparser2')
+};
+
+
+// Streaming
+exports.ParserStream = require('./parser/stream');
+exports.SerializerStream = require('./serializer/stream');
+exports.SAXParser = require('./sax');
-},{}],84:[function(require,module,exports){
-(function (process){
+},{"./parser":89,"./parser/stream":91,"./sax":93,"./serializer":95,"./serializer/stream":96,"./tree_adapters/default":100,"./tree_adapters/htmlparser2":101}],86:[function(require,module,exports){
'use strict';
-var Parser = require('../tree_construction/parser'),
- ParsingUnit = require('./parsing_unit');
+var OpenElementStack = require('../parser/open_element_stack'),
+ Tokenizer = require('../tokenizer'),
+ HTML = require('../common/html');
-//API
-exports.parseDocument = function (html, treeAdapter) {
- //NOTE: this should be reentrant, so we create new parser here
- var parser = new Parser(treeAdapter),
- parsingUnit = new ParsingUnit(parser);
- //NOTE: override parser loop method
- parser._runParsingLoop = function () {
- parsingUnit.parsingLoopLock = true;
+//Aliases
+var $ = HTML.TAG_NAMES;
+
+
+function setEndLocation(element, closingToken, treeAdapter) {
+ var loc = element.__location;
+
+ if (!loc)
+ return;
+
+ /**
+ * @typedef {Object} ElementLocationInfo
+ * @extends StartTagLocationInfo
+ *
+ * @property {StartTagLocationInfo} startTag - Element's start tag location info.
+ * @property {LocationInfo} endTag - Element's end tag location info.
+ */
+ if (!loc.startTag) {
+ loc.startTag = {
+ line: loc.line,
+ col: loc.col,
+ startOffset: loc.startOffset,
+ endOffset: loc.endOffset
+ };
+ if (loc.attrs)
+ loc.startTag.attrs = loc.attrs;
+ }
+
+ if (closingToken.location) {
+ var ctLocation = closingToken.location,
+ tn = treeAdapter.getTagName(element),
+ // NOTE: For cases like
- First 'p' closes without a closing tag and
+ // for cases like
- 'p' closes without a closing tag
+ isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN &&
+ tn === closingToken.tagName;
+
+ if (isClosingEndTag) {
+ loc.endTag = {
+ line: ctLocation.line,
+ col: ctLocation.col,
+ startOffset: ctLocation.startOffset,
+ endOffset: ctLocation.endOffset
+ };
+ }
+
+ loc.endOffset = ctLocation.endOffset;
+ }
+}
+
+
+exports.assign = function (parser) {
+ //NOTE: obtain Parser proto this way to avoid module circular references
+ var parserProto = Object.getPrototypeOf(parser),
+ treeAdapter = parser.treeAdapter,
+ attachableElementLocation = null,
+ lastFosterParentingLocation = null,
+ currentToken = null;
+
- while (!parsingUnit.suspended && !this.stopped)
- this._iterateParsingLoop();
+ //NOTE: patch _bootstrap method
+ parser._bootstrap = function (document, fragmentContext) {
+ parserProto._bootstrap.call(this, document, fragmentContext);
- parsingUnit.parsingLoopLock = false;
+ attachableElementLocation = null;
+ lastFosterParentingLocation = null;
+ currentToken = null;
- if (this.stopped)
- parsingUnit.callback(this.document);
+ //OpenElementStack
+ parser.openElements.pop = function () {
+ setEndLocation(this.current, currentToken, treeAdapter);
+ OpenElementStack.prototype.pop.call(this);
+ };
+
+ parser.openElements.popAllUpToHtmlElement = function () {
+ for (var i = this.stackTop; i > 0; i--)
+ setEndLocation(this.items[i], currentToken, treeAdapter);
+
+ OpenElementStack.prototype.popAllUpToHtmlElement.call(this);
+ };
+
+ parser.openElements.remove = function (element) {
+ setEndLocation(element, currentToken, treeAdapter);
+ OpenElementStack.prototype.remove.call(this, element);
+ };
};
- //NOTE: wait while parserController will be adopted by calling code, then
- //start parsing
- process.nextTick(function () {
- parser.parse(html);
- });
- return parsingUnit;
-};
+ //Token processing
+ parser._processTokenInForeignContent = function (token) {
+ currentToken = token;
+ parserProto._processTokenInForeignContent.call(this, token);
+ };
-exports.parseInnerHtml = function (innerHtml, contextElement, treeAdapter) {
- //NOTE: this should be reentrant, so we create new parser here
- var parser = new Parser(treeAdapter);
+ parser._processToken = function (token) {
+ currentToken = token;
+ parserProto._processToken.call(this, token);
+
+ //NOTE: and are never popped from the stack, so we need to updated
+ //their end location explicitly.
+ if (token.type === Tokenizer.END_TAG_TOKEN &&
+ (token.tagName === $.HTML ||
+ token.tagName === $.BODY && this.openElements.hasInScope($.BODY))) {
+ for (var i = this.openElements.stackTop; i >= 0; i--) {
+ var element = this.openElements.items[i];
+
+ if (this.treeAdapter.getTagName(element) === token.tagName) {
+ setEndLocation(element, token, treeAdapter);
+ break;
+ }
+ }
+ }
+ };
- return parser.parseFragment(innerHtml, contextElement);
-};
-}).call(this,require('_process'))
-},{"../tree_construction/parser":98,"./parsing_unit":85,"_process":64}],85:[function(require,module,exports){
-'use strict';
-var ParsingUnit = module.exports = function (parser) {
- this.parser = parser;
- this.suspended = false;
- this.parsingLoopLock = false;
- this.callback = null;
-};
+ //Doctype
+ parser._setDocumentType = function (token) {
+ parserProto._setDocumentType.call(this, token);
-ParsingUnit.prototype._stateGuard = function (suspend) {
- if (this.suspended && suspend)
- throw new Error('parse5: Parser was already suspended. Please, check your control flow logic.');
+ var documentChildren = this.treeAdapter.getChildNodes(this.document),
+ cnLength = documentChildren.length;
- else if (!this.suspended && !suspend)
- throw new Error('parse5: Parser was already resumed. Please, check your control flow logic.');
+ for (var i = 0; i < cnLength; i++) {
+ var node = documentChildren[i];
- return suspend;
-};
+ if (this.treeAdapter.isDocumentTypeNode(node)) {
+ node.__location = token.location;
+ break;
+ }
+ }
+ };
-ParsingUnit.prototype.suspend = function () {
- this.suspended = this._stateGuard(true);
- return this;
-};
+ //Elements
+ parser._attachElementToTree = function (element) {
+ //NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods.
+ //So we will use token location stored in this methods for the element.
+ element.__location = attachableElementLocation || null;
+ attachableElementLocation = null;
+ parserProto._attachElementToTree.call(this, element);
+ };
-ParsingUnit.prototype.resume = function () {
- this.suspended = this._stateGuard(false);
+ parser._appendElement = function (token, namespaceURI) {
+ attachableElementLocation = token.location;
+ parserProto._appendElement.call(this, token, namespaceURI);
+ };
- //NOTE: don't enter parsing loop if it is locked. Without this lock _runParsingLoop() may be called
- //while parsing loop is still running. E.g. when suspend() and resume() called synchronously.
- if (!this.parsingLoopLock)
- this.parser._runParsingLoop();
+ parser._insertElement = function (token, namespaceURI) {
+ attachableElementLocation = token.location;
+ parserProto._insertElement.call(this, token, namespaceURI);
+ };
- return this;
-};
+ parser._insertTemplate = function (token) {
+ attachableElementLocation = token.location;
+ parserProto._insertTemplate.call(this, token);
-ParsingUnit.prototype.documentWrite = function (html) {
- this.parser.tokenizer.preprocessor.write(html);
+ var tmplContent = this.treeAdapter.getTemplateContent(this.openElements.current);
- return this;
-};
+ tmplContent.__location = null;
+ };
+
+ parser._insertFakeRootElement = function () {
+ parserProto._insertFakeRootElement.call(this);
+ this.openElements.current.__location = null;
+ };
-ParsingUnit.prototype.handleScripts = function (scriptHandler) {
- this.parser.scriptHandler = scriptHandler;
- return this;
-};
+ //Comments
+ parser._appendCommentNode = function (token, parent) {
+ parserProto._appendCommentNode.call(this, token, parent);
-ParsingUnit.prototype.done = function (callback) {
- this.callback = callback;
+ var children = this.treeAdapter.getChildNodes(parent),
+ commentNode = children[children.length - 1];
- return this;
+ commentNode.__location = token.location;
+ };
+
+
+ //Text
+ parser._findFosterParentingLocation = function () {
+ //NOTE: store last foster parenting location, so we will be able to find inserted text
+ //in case of foster parenting
+ lastFosterParentingLocation = parserProto._findFosterParentingLocation.call(this);
+ return lastFosterParentingLocation;
+ };
+
+ parser._insertCharacters = function (token) {
+ parserProto._insertCharacters.call(this, token);
+
+ var hasFosterParent = this._shouldFosterParentOnInsertion(),
+ parent = hasFosterParent && lastFosterParentingLocation.parent ||
+ this.openElements.currentTmplContent ||
+ this.openElements.current,
+ siblings = this.treeAdapter.getChildNodes(parent),
+ textNodeIdx = hasFosterParent && lastFosterParentingLocation.beforeElement ?
+ siblings.indexOf(lastFosterParentingLocation.beforeElement) - 1 :
+ siblings.length - 1,
+ textNode = siblings[textNodeIdx];
+
+ //NOTE: if we have location assigned by another token, then just update end position
+ if (textNode.__location)
+ textNode.__location.endOffset = token.location.endOffset;
+
+ else
+ textNode.__location = token.location;
+ };
};
+
-},{}],86:[function(require,module,exports){
-'use strict';
-
-var DefaultTreeAdapter = require('../tree_adapters/default'),
- Doctype = require('../common/doctype'),
- Utils = require('../common/utils'),
- HTML = require('../common/html');
-
-//Aliases
-var $ = HTML.TAG_NAMES,
- NS = HTML.NAMESPACES;
-
-//Default serializer options
-var DEFAULT_OPTIONS = {
- encodeHtmlEntities: true
-};
-
-//Escaping regexes
-var AMP_REGEX = /&/g,
- NBSP_REGEX = /\u00a0/g,
- DOUBLE_QUOTE_REGEX = /"/g,
- LT_REGEX = //g;
-
-//Escape string
-function escapeString(str, attrMode) {
- str = str
- .replace(AMP_REGEX, '&')
- .replace(NBSP_REGEX, ' ');
-
- if (attrMode)
- str = str.replace(DOUBLE_QUOTE_REGEX, '"');
-
- else {
- str = str
- .replace(LT_REGEX, '<')
- .replace(GT_REGEX, '>');
- }
-
- return str;
-}
-
-
-//Enquote doctype ID
-
-
-
-//Serializer
-var Serializer = module.exports = function (treeAdapter, options) {
- this.treeAdapter = treeAdapter || DefaultTreeAdapter;
- this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options);
-};
-
-
-//API
-Serializer.prototype.serialize = function (node) {
- this.html = '';
- this._serializeChildNodes(node);
-
- return this.html;
-};
-
-
-//Internals
-Serializer.prototype._serializeChildNodes = function (parentNode) {
- var childNodes = this.treeAdapter.getChildNodes(parentNode);
-
- if (childNodes) {
- for (var i = 0, cnLength = childNodes.length; i < cnLength; i++) {
- var currentNode = childNodes[i];
-
- if (this.treeAdapter.isElementNode(currentNode))
- this._serializeElement(currentNode);
-
- else if (this.treeAdapter.isTextNode(currentNode))
- this._serializeTextNode(currentNode);
-
- else if (this.treeAdapter.isCommentNode(currentNode))
- this._serializeCommentNode(currentNode);
-
- else if (this.treeAdapter.isDocumentTypeNode(currentNode))
- this._serializeDocumentTypeNode(currentNode);
- }
- }
-};
-
-Serializer.prototype._serializeElement = function (node) {
- var tn = this.treeAdapter.getTagName(node),
- ns = this.treeAdapter.getNamespaceURI(node),
- qualifiedTn = (ns === NS.HTML || ns === NS.SVG || ns === NS.MATHML) ? tn : (ns + ':' + tn);
-
- this.html += '<' + qualifiedTn;
- this._serializeAttributes(node);
- this.html += '>';
-
- if (tn !== $.AREA && tn !== $.BASE && tn !== $.BASEFONT && tn !== $.BGSOUND && tn !== $.BR && tn !== $.BR &&
- tn !== $.COL && tn !== $.EMBED && tn !== $.FRAME && tn !== $.HR && tn !== $.IMG && tn !== $.INPUT &&
- tn !== $.KEYGEN && tn !== $.LINK && tn !== $.MENUITEM && tn !== $.META && tn !== $.PARAM && tn !== $.SOURCE &&
- tn !== $.TRACK && tn !== $.WBR) {
-
- if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING) {
- var firstChild = this.treeAdapter.getFirstChild(node);
-
- if (firstChild && this.treeAdapter.isTextNode(firstChild)) {
- var content = this.treeAdapter.getTextNodeContent(firstChild);
-
- if (content[0] === '\n')
- this.html += '\n';
- }
- }
-
- var childNodesHolder = tn === $.TEMPLATE && ns === NS.HTML ?
- this.treeAdapter.getChildNodes(node)[0] :
- node;
-
- this._serializeChildNodes(childNodesHolder);
- this.html += '' + qualifiedTn + '>';
- }
-};
-
-Serializer.prototype._serializeAttributes = function (node) {
- var attrs = this.treeAdapter.getAttrList(node);
-
- for (var i = 0, attrsLength = attrs.length; i < attrsLength; i++) {
- var attr = attrs[i],
- value = this.options.encodeHtmlEntities ? escapeString(attr.value, true) : attr.value;
-
- this.html += ' ';
-
- if (!attr.namespace)
- this.html += attr.name;
-
- else if (attr.namespace === NS.XML)
- this.html += 'xml:' + attr.name;
-
- else if (attr.namespace === NS.XMLNS) {
- if (attr.name !== 'xmlns')
- this.html += 'xmlns:';
-
- this.html += attr.name;
- }
-
- else if (attr.namespace === NS.XLINK)
- this.html += 'xlink:' + attr.name;
-
- else
- this.html += attr.namespace + ':' + attr.name;
-
- this.html += '="' + value + '"';
- }
-};
-
-Serializer.prototype._serializeTextNode = function (node) {
- var content = this.treeAdapter.getTextNodeContent(node),
- parent = this.treeAdapter.getParentNode(node),
- parentTn = void 0;
-
- if (parent && this.treeAdapter.isElementNode(parent))
- parentTn = this.treeAdapter.getTagName(parent);
-
- if (parentTn === $.STYLE || parentTn === $.SCRIPT || parentTn === $.XMP || parentTn === $.IFRAME ||
- parentTn === $.NOEMBED || parentTn === $.NOFRAMES || parentTn === $.PLAINTEXT || parentTn === $.NOSCRIPT) {
- this.html += content;
- }
-
- else
- this.html += this.options.encodeHtmlEntities ? escapeString(content, false) : content;
-};
-
-Serializer.prototype._serializeCommentNode = function (node) {
- this.html += '';
-};
-
-Serializer.prototype._serializeDocumentTypeNode = function (node) {
- var name = this.treeAdapter.getDocumentTypeNodeName(node),
- publicId = this.treeAdapter.getDocumentTypeNodePublicId(node),
- systemId = this.treeAdapter.getDocumentTypeNodeSystemId(node);
-
- this.html += '<' + Doctype.serializeContent(name, publicId, systemId) + '>';
-};
-
-},{"../common/doctype":79,"../common/html":81,"../common/utils":83,"../tree_adapters/default":93}],87:[function(require,module,exports){
-'use strict';
-
-var Tokenizer = require('../tokenization/tokenizer'),
- TokenizerProxy = require('./tokenizer_proxy'),
- Utils = require('../common/utils');
-
-//Default options
-var DEFAULT_OPTIONS = {
- decodeHtmlEntities: true,
- locationInfo: false
-};
-
-//Skipping handler
-function skip() {
- //NOTE: do nothing =)
-}
-
-//SimpleApiParser
-var SimpleApiParser = module.exports = function (handlers, options) {
- this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options);
- this.handlers = {
- doctype: this._wrapHandler(handlers.doctype),
- startTag: this._wrapHandler(handlers.startTag),
- endTag: this._wrapHandler(handlers.endTag),
- text: this._wrapHandler(handlers.text),
- comment: this._wrapHandler(handlers.comment)
- };
-};
-
-SimpleApiParser.prototype._wrapHandler = function (handler) {
- var parser = this;
-
- handler = handler || skip;
-
- if (this.options.locationInfo) {
- return function () {
- var args = Array.prototype.slice.call(arguments);
- args.push(parser.currentTokenLocation);
- handler.apply(handler, args);
- };
- }
-
- return handler;
-};
-
-//API
-SimpleApiParser.prototype.parse = function (html) {
- var token = null;
-
- this._reset(html);
-
- do {
- token = this.tokenizerProxy.getNextToken();
-
- if (token.type === Tokenizer.CHARACTER_TOKEN ||
- token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN ||
- token.type === Tokenizer.NULL_CHARACTER_TOKEN) {
-
- if (this.options.locationInfo) {
- if (this.pendingText === null)
- this.currentTokenLocation = token.location;
-
- else
- this.currentTokenLocation.end = token.location.end;
- }
-
- this.pendingText = (this.pendingText || '') + token.chars;
- }
-
- else {
- this._emitPendingText();
- this._handleToken(token);
- }
- } while (token.type !== Tokenizer.EOF_TOKEN);
-};
-
-//Internals
-SimpleApiParser.prototype._handleToken = function (token) {
- if (this.options.locationInfo)
- this.currentTokenLocation = token.location;
-
- if (token.type === Tokenizer.START_TAG_TOKEN)
- this.handlers.startTag(token.tagName, token.attrs, token.selfClosing);
-
- else if (token.type === Tokenizer.END_TAG_TOKEN)
- this.handlers.endTag(token.tagName);
-
- else if (token.type === Tokenizer.COMMENT_TOKEN)
- this.handlers.comment(token.data);
-
- else if (token.type === Tokenizer.DOCTYPE_TOKEN)
- this.handlers.doctype(token.name, token.publicId, token.systemId);
-
-};
-
-SimpleApiParser.prototype._reset = function (html) {
- this.tokenizerProxy = new TokenizerProxy(html, this.options);
- this.pendingText = null;
- this.currentTokenLocation = null;
-};
-
-SimpleApiParser.prototype._emitPendingText = function () {
- if (this.pendingText !== null) {
- this.handlers.text(this.pendingText);
- this.pendingText = null;
- }
-};
-
-},{"../common/utils":83,"../tokenization/tokenizer":92,"./tokenizer_proxy":88}],88:[function(require,module,exports){
-'use strict';
-
-var Tokenizer = require('../tokenization/tokenizer'),
- ForeignContent = require('../common/foreign_content'),
- UNICODE = require('../common/unicode'),
- HTML = require('../common/html');
-
-//Aliases
-var $ = HTML.TAG_NAMES,
- NS = HTML.NAMESPACES;
-
-
-//Tokenizer proxy
-//NOTE: this proxy simulates adjustment of the Tokenizer which performed by standard parser during tree construction.
-var TokenizerProxy = module.exports = function (html, options) {
- this.tokenizer = new Tokenizer(html, options);
-
- this.namespaceStack = [];
- this.namespaceStackTop = -1;
- this.currentNamespace = null;
- this.inForeignContent = false;
-};
-
-//API
-TokenizerProxy.prototype.getNextToken = function () {
- var token = this.tokenizer.getNextToken();
-
- if (token.type === Tokenizer.START_TAG_TOKEN)
- this._handleStartTagToken(token);
-
- else if (token.type === Tokenizer.END_TAG_TOKEN)
- this._handleEndTagToken(token);
-
- else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN && this.inForeignContent) {
- token.type = Tokenizer.CHARACTER_TOKEN;
- token.chars = UNICODE.REPLACEMENT_CHARACTER;
- }
-
- return token;
-};
-
-//Namespace stack mutations
-TokenizerProxy.prototype._enterNamespace = function (namespace) {
- this.namespaceStackTop++;
- this.namespaceStack.push(namespace);
-
- this.inForeignContent = namespace !== NS.HTML;
- this.currentNamespace = namespace;
- this.tokenizer.allowCDATA = this.inForeignContent;
-};
-
-TokenizerProxy.prototype._leaveCurrentNamespace = function () {
- this.namespaceStackTop--;
- this.namespaceStack.pop();
-
- this.currentNamespace = this.namespaceStack[this.namespaceStackTop];
- this.inForeignContent = this.currentNamespace !== NS.HTML;
- this.tokenizer.allowCDATA = this.inForeignContent;
-};
-
-//Token handlers
-TokenizerProxy.prototype._ensureTokenizerMode = function (tn) {
- if (tn === $.TEXTAREA || tn === $.TITLE)
- this.tokenizer.state = Tokenizer.MODE.RCDATA;
-
- else if (tn === $.PLAINTEXT)
- this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
-
- else if (tn === $.SCRIPT)
- this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
-
- else if (tn === $.STYLE || tn === $.IFRAME || tn === $.XMP ||
- tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) {
- this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
- }
-};
-
-TokenizerProxy.prototype._handleStartTagToken = function (token) {
- var tn = token.tagName;
-
- if (tn === $.SVG)
- this._enterNamespace(NS.SVG);
-
- else if (tn === $.MATH)
- this._enterNamespace(NS.MATHML);
-
- else {
- if (this.inForeignContent) {
- if (ForeignContent.causesExit(token))
- this._leaveCurrentNamespace();
-
- else if (ForeignContent.isMathMLTextIntegrationPoint(tn, this.currentNamespace) ||
- ForeignContent.isHtmlIntegrationPoint(tn, this.currentNamespace, token.attrs)) {
- this._enterNamespace(NS.HTML);
- }
- }
-
- else
- this._ensureTokenizerMode(tn);
- }
-};
-
-TokenizerProxy.prototype._handleEndTagToken = function (token) {
- var tn = token.tagName;
-
- if (!this.inForeignContent) {
- var previousNs = this.namespaceStack[this.namespaceStackTop - 1];
-
- //NOTE: check for exit from integration point
- if (ForeignContent.isMathMLTextIntegrationPoint(tn, previousNs) ||
- ForeignContent.isHtmlIntegrationPoint(tn, previousNs, token.attrs)) {
- this._leaveCurrentNamespace();
- }
-
- else if (tn === $.SCRIPT)
- this.tokenizer.state = Tokenizer.MODE.DATA;
- }
-
- else if ((tn === $.SVG && this.currentNamespace === NS.SVG) ||
- (tn === $.MATH && this.currentNamespace === NS.MATHML))
- this._leaveCurrentNamespace();
-};
-
-},{"../common/foreign_content":80,"../common/html":81,"../common/unicode":82,"../tokenization/tokenizer":92}],89:[function(require,module,exports){
+},{"../common/html":82,"../parser/open_element_stack":90,"../tokenizer":97}],87:[function(require,module,exports){
'use strict';
-exports.assign = function (tokenizer) {
- //NOTE: obtain Tokenizer proto this way to avoid module circular references
- var tokenizerProto = Object.getPrototypeOf(tokenizer);
+var UNICODE = require('../common/unicode');
+
+//Aliases
+var $ = UNICODE.CODE_POINTS;
- tokenizer.tokenStartLoc = -1;
- //NOTE: add location info builder method
- tokenizer._attachLocationInfo = function (token) {
+exports.assign = function (tokenizer) {
+ //NOTE: obtain Tokenizer proto this way to avoid module circular references
+ var tokenizerProto = Object.getPrototypeOf(tokenizer),
+ tokenStartOffset = -1,
+ tokenCol = -1,
+ tokenLine = 1,
+ isEol = false,
+ lineStartPosStack = [0],
+ lineStartPos = 0,
+ col = -1,
+ line = 1;
+
+ function attachLocationInfo(token) {
+ /**
+ * @typedef {Object} LocationInfo
+ *
+ * @property {Number} line - One-based line index
+ * @property {Number} col - One-based column index
+ * @property {Number} startOffset - Zero-based first character index
+ * @property {Number} endOffset - Zero-based last character index
+ */
token.location = {
- start: this.tokenStartLoc,
- end: -1
+ line: tokenLine,
+ col: tokenCol,
+ startOffset: tokenStartOffset,
+ endOffset: -1
};
+ }
+
+ //NOTE: patch consumption method to track line/col information
+ tokenizer._consume = function () {
+ var cp = tokenizerProto._consume.call(this);
+
+ //NOTE: LF should be in the last column of the line
+ if (isEol) {
+ isEol = false;
+ line++;
+ lineStartPosStack.push(this.preprocessor.pos);
+ lineStartPos = this.preprocessor.pos;
+ }
+
+ if (cp === $.LINE_FEED)
+ isEol = true;
+
+ col = this.preprocessor.pos - lineStartPos + 1;
+
+ return cp;
+ };
+
+ tokenizer._unconsume = function () {
+ tokenizerProto._unconsume.call(this);
+
+ while (lineStartPos > this.preprocessor.pos && lineStartPosStack.length > 1) {
+ lineStartPos = lineStartPosStack.pop();
+ line--;
+ }
+
+ col = this.preprocessor.pos - lineStartPos + 1;
};
//NOTE: patch token creation methods and attach location objects
- tokenizer._createStartTagToken = function (tagNameFirstCh) {
- tokenizerProto._createStartTagToken.call(this, tagNameFirstCh);
- this._attachLocationInfo(this.currentToken);
+ tokenizer._createStartTagToken = function () {
+ tokenizerProto._createStartTagToken.call(this);
+ attachLocationInfo(this.currentToken);
};
- tokenizer._createEndTagToken = function (tagNameFirstCh) {
- tokenizerProto._createEndTagToken.call(this, tagNameFirstCh);
- this._attachLocationInfo(this.currentToken);
+ tokenizer._createEndTagToken = function () {
+ tokenizerProto._createEndTagToken.call(this);
+ attachLocationInfo(this.currentToken);
};
tokenizer._createCommentToken = function () {
tokenizerProto._createCommentToken.call(this);
- this._attachLocationInfo(this.currentToken);
+ attachLocationInfo(this.currentToken);
};
- tokenizer._createDoctypeToken = function (doctypeNameFirstCh) {
- tokenizerProto._createDoctypeToken.call(this, doctypeNameFirstCh);
- this._attachLocationInfo(this.currentToken);
+ tokenizer._createDoctypeToken = function (initialName) {
+ tokenizerProto._createDoctypeToken.call(this, initialName);
+ attachLocationInfo(this.currentToken);
};
tokenizer._createCharacterToken = function (type, ch) {
tokenizerProto._createCharacterToken.call(this, type, ch);
- this._attachLocationInfo(this.currentCharacterToken);
+ attachLocationInfo(this.currentCharacterToken);
+ };
+
+ tokenizer._createAttr = function (attrNameFirstCh) {
+ tokenizerProto._createAttr.call(this, attrNameFirstCh);
+ this.currentAttrLocation = {
+ line: line,
+ col: col,
+ startOffset: this.preprocessor.pos,
+ endOffset: -1
+ };
+ };
+
+ tokenizer._leaveAttrName = function (toState) {
+ tokenizerProto._leaveAttrName.call(this, toState);
+ this._attachCurrentAttrLocationInfo();
+ };
+
+ tokenizer._leaveAttrValue = function (toState) {
+ tokenizerProto._leaveAttrValue.call(this, toState);
+ this._attachCurrentAttrLocationInfo();
+ };
+
+ tokenizer._attachCurrentAttrLocationInfo = function () {
+ this.currentAttrLocation.endOffset = this.preprocessor.pos;
+
+ if (!this.currentToken.location.attrs)
+ this.currentToken.location.attrs = {};
+
+ /**
+ * @typedef {Object} StartTagLocationInfo
+ * @extends LocationInfo
+ *
+ * @property {Dictionary} attrs - Start tag attributes' location info.
+ */
+ this.currentToken.location.attrs[this.currentAttr.name] = this.currentAttrLocation;
};
//NOTE: patch token emission methods to determine end location
@@ -52677,21 +53253,20 @@ exports.assign = function (tokenizer) {
//NOTE: if we have pending character token make it's end location equal to the
//current token's start location.
if (this.currentCharacterToken)
- this.currentCharacterToken.location.end = this.currentToken.location.start;
+ this.currentCharacterToken.location.endOffset = this.currentToken.location.startOffset;
- this.currentToken.location.end = this.preprocessor.pos + 1;
+ this.currentToken.location.endOffset = this.preprocessor.pos + 1;
tokenizerProto._emitCurrentToken.call(this);
};
tokenizer._emitCurrentCharacterToken = function () {
//NOTE: if we have character token and it's location wasn't set in the _emitCurrentToken(),
- //then set it's location at the current preprocessor position
- if (this.currentCharacterToken && this.currentCharacterToken.location.end === -1) {
- //NOTE: we don't need to increment preprocessor position, since character token
- //emission is always forced by the start of the next character token here.
- //So, we already have advanced position.
- this.currentCharacterToken.location.end = this.preprocessor.pos;
- }
+ //then set it's location at the current preprocessor position.
+ //We don't need to increment preprocessor position, since character token
+ //emission is always forced by the start of the next character token here.
+ //So, we already have advanced position.
+ if (this.currentCharacterToken && this.currentCharacterToken.location.endOffset === -1)
+ this.currentCharacterToken.location.endOffset = this.preprocessor.pos;
tokenizerProto._emitCurrentCharacterToken.call(this);
};
@@ -52705,3398 +53280,3003 @@ exports.assign = function (tokenizer) {
.forEach(function (state) {
tokenizer[state] = function (cp) {
- this.tokenStartLoc = this.preprocessor.pos;
+ tokenStartOffset = this.preprocessor.pos;
+ tokenLine = line;
+ tokenCol = col;
tokenizerProto[state].call(this, cp);
};
});
};
-},{}],90:[function(require,module,exports){
-'use strict';
-
-//NOTE: this file contains auto generated trie structure that is used for named entity references consumption
-//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references and
-//http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html#named-character-references)
-module.exports = {
- 0x41: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [193]}}, c: [193]}}}}}}}}}, 0x62: {l: {0x72: {l: {0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [258]}}}}}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [194]}}, c: [194]}}}}}, 0x79: {l: {0x3B: {c: [1040]}}}}}, 0x45: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [198]}}, c: [198]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120068]}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [192]}}, c: [192]}}}}}}}}}, 0x6C: {l: {0x70: {l: {0x68: {l: {0x61: {l: {0x3B: {c: [913]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [256]}}}}}}}}}, 0x4D: {l: {0x50: {l: {0x3B: {c: [38]}}, c: [38]}}}, 0x6E: {l: {0x64: {l: {0x3B: {c: [10835]}}}}}, 0x6F: {l: {0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [260]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120120]}}}}}}}, 0x70: {l: {0x70: {l: {0x6C: {l: {0x79: {l: {0x46: {l: {0x75: {l: {0x6E: {l: {0x63: {l: {0x74: {l: {0x69: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8289]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [197]}}, c: [197]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119964]}}}}}, 0x73: {l: {0x69: {l: {0x67: {l: {0x6E: {l: {0x3B: {c: [8788]}}}}}}}}}}}, 0x74: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [195]}}, c: [195]}}}}}}}}}, 0x75: {l: {0x6D: {l: {0x6C: {l: {0x3B: {c: [196]}}, c: [196]}}}}}}},
- 0x61: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [225]}}, c: [225]}}}}}}}}}, 0x62: {l: {0x72: {l: {0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [259]}}}}}}}}}}}, 0x63: {l: {0x3B: {c: [8766]}, 0x64: {l: {0x3B: {c: [8767]}}}, 0x45: {l: {0x3B: {c: [8766, 819]}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [226]}}, c: [226]}}}}}, 0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [180]}}, c: [180]}}}}}, 0x79: {l: {0x3B: {c: [1072]}}}}}, 0x65: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [230]}}, c: [230]}}}}}}}, 0x66: {l: {0x3B: {c: [8289]}, 0x72: {l: {0x3B: {c: [120094]}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [224]}}, c: [224]}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x66: {l: {0x73: {l: {0x79: {l: {0x6D: {l: {0x3B: {c: [8501]}}}}}}}}}, 0x70: {l: {0x68: {l: {0x3B: {c: [8501]}}}}}}}, 0x70: {l: {0x68: {l: {0x61: {l: {0x3B: {c: [945]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [257]}}}}}, 0x6C: {l: {0x67: {l: {0x3B: {c: [10815]}}}}}}}, 0x70: {l: {0x3B: {c: [38]}}, c: [38]}}}, 0x6E: {l: {0x64: {l: {0x61: {l: {0x6E: {l: {0x64: {l: {0x3B: {c: [10837]}}}}}}}, 0x3B: {c: [8743]}, 0x64: {l: {0x3B: {c: [10844]}}}, 0x73: {l: {0x6C: {l: {0x6F: {l: {0x70: {l: {0x65: {l: {0x3B: {c: [10840]}}}}}}}}}}}, 0x76: {l: {0x3B: {c: [10842]}}}}}, 0x67: {l: {0x3B: {c: [8736]}, 0x65: {l: {0x3B: {c: [10660]}}}, 0x6C: {l: {0x65: {l: {0x3B: {c: [8736]}}}}}, 0x6D: {l: {0x73: {l: {0x64: {l: {0x61: {l: {0x61: {l: {0x3B: {c: [10664]}}}, 0x62: {l: {0x3B: {c: [10665]}}}, 0x63: {l: {0x3B: {c: [10666]}}}, 0x64: {l: {0x3B: {c: [10667]}}}, 0x65: {l: {0x3B: {c: [10668]}}}, 0x66: {l: {0x3B: {c: [10669]}}}, 0x67: {l: {0x3B: {c: [10670]}}}, 0x68: {l: {0x3B: {c: [10671]}}}}}, 0x3B: {c: [8737]}}}}}}}, 0x72: {l: {0x74: {l: {0x3B: {c: [8735]}, 0x76: {l: {0x62: {l: {0x3B: {c: [8894]}, 0x64: {l: {0x3B: {c: [10653]}}}}}}}}}}}, 0x73: {l: {0x70: {l: {0x68: {l: {0x3B: {c: [8738]}}}}}, 0x74: {l: {0x3B: {c: [197]}}}}}, 0x7A: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [9084]}}}}}}}}}}}}}, 0x6F: {l: {0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [261]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120146]}}}}}}}, 0x70: {l: {0x61: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10863]}}}}}}}}}, 0x3B: {c: [8776]}, 0x45: {l: {0x3B: {c: [10864]}}}, 0x65: {l: {0x3B: {c: [8778]}}}, 0x69: {l: {0x64: {l: {0x3B: {c: [8779]}}}}}, 0x6F: {l: {0x73: {l: {0x3B: {c: [39]}}}}}, 0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [8776]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8778]}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [229]}}, c: [229]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119990]}}}}}, 0x74: {l: {0x3B: {c: [42]}}}, 0x79: {l: {0x6D: {l: {0x70: {l: {0x3B: {c: [8776]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8781]}}}}}}}}}}}}}, 0x74: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [227]}}, c: [227]}}}}}}}}}, 0x75: {l: {0x6D: {l: {0x6C: {l: {0x3B: {c: [228]}}, c: [228]}}}}}, 0x77: {l: {0x63: {l: {0x6F: {l: {0x6E: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8755]}}}}}}}}}}}}}, 0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10769]}}}}}}}}}}},
- 0x62: {l: {0x61: {l: {0x63: {l: {0x6B: {l: {0x63: {l: {0x6F: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [8780]}}}}}}}}}, 0x65: {l: {0x70: {l: {0x73: {l: {0x69: {l: {0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [1014]}}}}}}}}}}}}}}}, 0x70: {l: {0x72: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x3B: {c: [8245]}}}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8765]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8909]}}}}}}}}}}}}}}}, 0x72: {l: {0x76: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [8893]}}}}}}}, 0x77: {l: {0x65: {l: {0x64: {l: {0x3B: {c: [8965]}, 0x67: {l: {0x65: {l: {0x3B: {c: [8965]}}}}}}}}}}}}}}}, 0x62: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [9141]}, 0x74: {l: {0x62: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [9142]}}}}}}}}}}}}}}}, 0x63: {l: {0x6F: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [8780]}}}}}}}, 0x79: {l: {0x3B: {c: [1073]}}}}}, 0x64: {l: {0x71: {l: {0x75: {l: {0x6F: {l: {0x3B: {c: [8222]}}}}}}}}}, 0x65: {l: {0x63: {l: {0x61: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8757]}, 0x65: {l: {0x3B: {c: [8757]}}}}}}}}}}}, 0x6D: {l: {0x70: {l: {0x74: {l: {0x79: {l: {0x76: {l: {0x3B: {c: [10672]}}}}}}}}}}}, 0x70: {l: {0x73: {l: {0x69: {l: {0x3B: {c: [1014]}}}}}}}, 0x72: {l: {0x6E: {l: {0x6F: {l: {0x75: {l: {0x3B: {c: [8492]}}}}}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [946]}}}, 0x68: {l: {0x3B: {c: [8502]}}}, 0x77: {l: {0x65: {l: {0x65: {l: {0x6E: {l: {0x3B: {c: [8812]}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120095]}}}}}, 0x69: {l: {0x67: {l: {0x63: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8898]}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [9711]}}}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [8899]}}}}}}}, 0x6F: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10752]}}}}}}}, 0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10753]}}}}}}}}}, 0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [10754]}}}}}}}}}}}}}, 0x73: {l: {0x71: {l: {0x63: {l: {0x75: {l: {0x70: {l: {0x3B: {c: [10758]}}}}}}}}}, 0x74: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [9733]}}}}}}}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x3B: {c: [9661]}}}}}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [9651]}}}}}}}}}}}}}}}}}}}}}, 0x75: {l: {0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10756]}}}}}}}}}}}, 0x76: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [8897]}}}}}}}, 0x77: {l: {0x65: {l: {0x64: {l: {0x67: {l: {0x65: {l: {0x3B: {c: [8896]}}}}}}}}}}}}}}}, 0x6B: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10509]}}}}}}}}}}}, 0x6C: {l: {0x61: {l: {0x63: {l: {0x6B: {l: {0x6C: {l: {0x6F: {l: {0x7A: {l: {0x65: {l: {0x6E: {l: {0x67: {l: {0x65: {l: {0x3B: {c: [10731]}}}}}}}}}}}}}}}, 0x73: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [9642]}}}}}}}}}}}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [9652]}, 0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x3B: {c: [9662]}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [9666]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [9656]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6E: {l: {0x6B: {l: {0x3B: {c: [9251]}}}}}}}, 0x6B: {l: {0x31: {l: {0x32: {l: {0x3B: {c: [9618]}}}, 0x34: {l: {0x3B: {c: [9617]}}}}}, 0x33: {l: {0x34: {l: {0x3B: {c: [9619]}}}}}}}, 0x6F: {l: {0x63: {l: {0x6B: {l: {0x3B: {c: [9608]}}}}}}}}}, 0x6E: {l: {0x65: {l: {0x3B: {c: [61, 8421]}, 0x71: {l: {0x75: {l: {0x69: {l: {0x76: {l: {0x3B: {c: [8801, 8421]}}}}}}}}}}}, 0x6F: {l: {0x74: {l: {0x3B: {c: [8976]}}}}}}}, 0x4E: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10989]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120147]}}}}}, 0x74: {l: {0x3B: {c: [8869]}, 0x74: {l: {0x6F: {l: {0x6D: {l: {0x3B: {c: [8869]}}}}}}}}}, 0x77: {l: {0x74: {l: {0x69: {l: {0x65: {l: {0x3B: {c: [8904]}}}}}}}}}, 0x78: {l: {0x62: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10697]}}}}}}}, 0x64: {l: {0x6C: {l: {0x3B: {c: [9488]}}}, 0x4C: {l: {0x3B: {c: [9557]}}}, 0x72: {l: {0x3B: {c: [9484]}}}, 0x52: {l: {0x3B: {c: [9554]}}}}}, 0x44: {l: {0x6C: {l: {0x3B: {c: [9558]}}}, 0x4C: {l: {0x3B: {c: [9559]}}}, 0x72: {l: {0x3B: {c: [9555]}}}, 0x52: {l: {0x3B: {c: [9556]}}}}}, 0x68: {l: {0x3B: {c: [9472]}, 0x64: {l: {0x3B: {c: [9516]}}}, 0x44: {l: {0x3B: {c: [9573]}}}, 0x75: {l: {0x3B: {c: [9524]}}}, 0x55: {l: {0x3B: {c: [9576]}}}}}, 0x48: {l: {0x3B: {c: [9552]}, 0x64: {l: {0x3B: {c: [9572]}}}, 0x44: {l: {0x3B: {c: [9574]}}}, 0x75: {l: {0x3B: {c: [9575]}}}, 0x55: {l: {0x3B: {c: [9577]}}}}}, 0x6D: {l: {0x69: {l: {0x6E: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8863]}}}}}}}}}}}, 0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8862]}}}}}}}}}, 0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8864]}}}}}}}}}}}, 0x75: {l: {0x6C: {l: {0x3B: {c: [9496]}}}, 0x4C: {l: {0x3B: {c: [9563]}}}, 0x72: {l: {0x3B: {c: [9492]}}}, 0x52: {l: {0x3B: {c: [9560]}}}}}, 0x55: {l: {0x6C: {l: {0x3B: {c: [9564]}}}, 0x4C: {l: {0x3B: {c: [9565]}}}, 0x72: {l: {0x3B: {c: [9561]}}}, 0x52: {l: {0x3B: {c: [9562]}}}}}, 0x76: {l: {0x3B: {c: [9474]}, 0x68: {l: {0x3B: {c: [9532]}}}, 0x48: {l: {0x3B: {c: [9578]}}}, 0x6C: {l: {0x3B: {c: [9508]}}}, 0x4C: {l: {0x3B: {c: [9569]}}}, 0x72: {l: {0x3B: {c: [9500]}}}, 0x52: {l: {0x3B: {c: [9566]}}}}}, 0x56: {l: {0x3B: {c: [9553]}, 0x68: {l: {0x3B: {c: [9579]}}}, 0x48: {l: {0x3B: {c: [9580]}}}, 0x6C: {l: {0x3B: {c: [9570]}}}, 0x4C: {l: {0x3B: {c: [9571]}}}, 0x72: {l: {0x3B: {c: [9567]}}}, 0x52: {l: {0x3B: {c: [9568]}}}}}}}}}, 0x70: {l: {0x72: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x3B: {c: [8245]}}}}}}}}}}}, 0x72: {l: {0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [728]}}}}}}}, 0x76: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [166]}}, c: [166]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119991]}}}}}, 0x65: {l: {0x6D: {l: {0x69: {l: {0x3B: {c: [8271]}}}}}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [8765]}, 0x65: {l: {0x3B: {c: [8909]}}}}}}}, 0x6F: {l: {0x6C: {l: {0x62: {l: {0x3B: {c: [10693]}}}, 0x3B: {c: [92]}, 0x68: {l: {0x73: {l: {0x75: {l: {0x62: {l: {0x3B: {c: [10184]}}}}}}}}}}}}}}}, 0x75: {l: {0x6C: {l: {0x6C: {l: {0x3B: {c: [8226]}, 0x65: {l: {0x74: {l: {0x3B: {c: [8226]}}}}}}}}}, 0x6D: {l: {0x70: {l: {0x3B: {c: [8782]}, 0x45: {l: {0x3B: {c: [10926]}}}, 0x65: {l: {0x3B: {c: [8783]}, 0x71: {l: {0x3B: {c: [8783]}}}}}}}}}}}}},
- 0x42: {l: {0x61: {l: {0x63: {l: {0x6B: {l: {0x73: {l: {0x6C: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8726]}}}}}}}}}}}}}}}, 0x72: {l: {0x76: {l: {0x3B: {c: [10983]}}}, 0x77: {l: {0x65: {l: {0x64: {l: {0x3B: {c: [8966]}}}}}}}}}}}, 0x63: {l: {0x79: {l: {0x3B: {c: [1041]}}}}}, 0x65: {l: {0x63: {l: {0x61: {l: {0x75: {l: {0x73: {l: {0x65: {l: {0x3B: {c: [8757]}}}}}}}}}}}, 0x72: {l: {0x6E: {l: {0x6F: {l: {0x75: {l: {0x6C: {l: {0x6C: {l: {0x69: {l: {0x73: {l: {0x3B: {c: [8492]}}}}}}}}}}}}}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [914]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120069]}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120121]}}}}}}}, 0x72: {l: {0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [728]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8492]}}}}}}}, 0x75: {l: {0x6D: {l: {0x70: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8782]}}}}}}}}}}}}},
- 0x43: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [262]}}}}}}}}}, 0x70: {l: {0x3B: {c: [8914]}, 0x69: {l: {0x74: {l: {0x61: {l: {0x6C: {l: {0x44: {l: {0x69: {l: {0x66: {l: {0x66: {l: {0x65: {l: {0x72: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x69: {l: {0x61: {l: {0x6C: {l: {0x44: {l: {0x3B: {c: [8517]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x79: {l: {0x6C: {l: {0x65: {l: {0x79: {l: {0x73: {l: {0x3B: {c: [8493]}}}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [268]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [199]}}, c: [199]}}}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [264]}}}}}}}, 0x6F: {l: {0x6E: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8752]}}}}}}}}}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [266]}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x6C: {l: {0x61: {l: {0x3B: {c: [184]}}}}}}}}}}}, 0x6E: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [183]}}}}}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [8493]}}}}}, 0x48: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1063]}}}}}}}, 0x68: {l: {0x69: {l: {0x3B: {c: [935]}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x6C: {l: {0x65: {l: {0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8857]}}}}}}}, 0x4D: {l: {0x69: {l: {0x6E: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8854]}}}}}}}}}}}, 0x50: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8853]}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8855]}}}}}}}}}}}}}}}}}}}}}, 0x6C: {l: {0x6F: {l: {0x63: {l: {0x6B: {l: {0x77: {l: {0x69: {l: {0x73: {l: {0x65: {l: {0x43: {l: {0x6F: {l: {0x6E: {l: {0x74: {l: {0x6F: {l: {0x75: {l: {0x72: {l: {0x49: {l: {0x6E: {l: {0x74: {l: {0x65: {l: {0x67: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8754]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x65: {l: {0x43: {l: {0x75: {l: {0x72: {l: {0x6C: {l: {0x79: {l: {0x44: {l: {0x6F: {l: {0x75: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x51: {l: {0x75: {l: {0x6F: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [8221]}}}}}}}}}}}}}}}}}}}}}}}, 0x51: {l: {0x75: {l: {0x6F: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [8217]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8759]}, 0x65: {l: {0x3B: {c: [10868]}}}}}}}}}, 0x6E: {l: {0x67: {l: {0x72: {l: {0x75: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8801]}}}}}}}}}}}}}, 0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8751]}}}}}}}, 0x74: {l: {0x6F: {l: {0x75: {l: {0x72: {l: {0x49: {l: {0x6E: {l: {0x74: {l: {0x65: {l: {0x67: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8750]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [8450]}}}, 0x72: {l: {0x6F: {l: {0x64: {l: {0x75: {l: {0x63: {l: {0x74: {l: {0x3B: {c: [8720]}}}}}}}}}}}}}}}, 0x75: {l: {0x6E: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x43: {l: {0x6C: {l: {0x6F: {l: {0x63: {l: {0x6B: {l: {0x77: {l: {0x69: {l: {0x73: {l: {0x65: {l: {0x43: {l: {0x6F: {l: {0x6E: {l: {0x74: {l: {0x6F: {l: {0x75: {l: {0x72: {l: {0x49: {l: {0x6E: {l: {0x74: {l: {0x65: {l: {0x67: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8755]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x4F: {l: {0x50: {l: {0x59: {l: {0x3B: {c: [169]}}, c: [169]}}}}}, 0x72: {l: {0x6F: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [10799]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119966]}}}}}}}, 0x75: {l: {0x70: {l: {0x43: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8781]}}}}}}}, 0x3B: {c: [8915]}}}}}}},
- 0x63: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [263]}}}}}}}}}, 0x70: {l: {0x61: {l: {0x6E: {l: {0x64: {l: {0x3B: {c: [10820]}}}}}}}, 0x62: {l: {0x72: {l: {0x63: {l: {0x75: {l: {0x70: {l: {0x3B: {c: [10825]}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10827]}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [10823]}}}}}}}, 0x3B: {c: [8745]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10816]}}}}}}}, 0x73: {l: {0x3B: {c: [8745, 65024]}}}}}, 0x72: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8257]}}}}}, 0x6F: {l: {0x6E: {l: {0x3B: {c: [711]}}}}}}}}}, 0x63: {l: {0x61: {l: {0x70: {l: {0x73: {l: {0x3B: {c: [10829]}}}}}, 0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [269]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [231]}}, c: [231]}}}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [265]}}}}}}}, 0x75: {l: {0x70: {l: {0x73: {l: {0x3B: {c: [10828]}, 0x73: {l: {0x6D: {l: {0x3B: {c: [10832]}}}}}}}}}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [267]}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [184]}}, c: [184]}}}}}, 0x6D: {l: {0x70: {l: {0x74: {l: {0x79: {l: {0x76: {l: {0x3B: {c: [10674]}}}}}}}}}}}, 0x6E: {l: {0x74: {l: {0x3B: {c: [162]}, 0x65: {l: {0x72: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [183]}}}}}}}}}}}}, c: [162]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120096]}}}}}, 0x68: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1095]}}}}}, 0x65: {l: {0x63: {l: {0x6B: {l: {0x3B: {c: [10003]}, 0x6D: {l: {0x61: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [10003]}}}}}}}}}}}}}}}, 0x69: {l: {0x3B: {c: [967]}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [710]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8791]}}}}}, 0x6C: {l: {0x65: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [8634]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [8635]}}}}}}}}}}}}}}}}}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [8859]}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [8858]}}}}}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8861]}}}}}}}}}, 0x52: {l: {0x3B: {c: [174]}}}, 0x53: {l: {0x3B: {c: [9416]}}}}}}}}}}}, 0x3B: {c: [9675]}, 0x45: {l: {0x3B: {c: [10691]}}}, 0x65: {l: {0x3B: {c: [8791]}}}, 0x66: {l: {0x6E: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10768]}}}}}}}}}}}, 0x6D: {l: {0x69: {l: {0x64: {l: {0x3B: {c: [10991]}}}}}}}, 0x73: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10690]}}}}}}}}}}}}}, 0x6C: {l: {0x75: {l: {0x62: {l: {0x73: {l: {0x3B: {c: [9827]}, 0x75: {l: {0x69: {l: {0x74: {l: {0x3B: {c: [9827]}}}}}}}}}}}}}}}, 0x6F: {l: {0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [58]}, 0x65: {l: {0x3B: {c: [8788]}, 0x71: {l: {0x3B: {c: [8788]}}}}}}}}}}}, 0x6D: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [44]}, 0x74: {l: {0x3B: {c: [64]}}}}}}}, 0x70: {l: {0x3B: {c: [8705]}, 0x66: {l: {0x6E: {l: {0x3B: {c: [8728]}}}}}, 0x6C: {l: {0x65: {l: {0x6D: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8705]}}}}}}}}}, 0x78: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8450]}}}}}}}}}}}}}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [8773]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10861]}}}}}}}}}, 0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8750]}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120148]}}}, 0x72: {l: {0x6F: {l: {0x64: {l: {0x3B: {c: [8720]}}}}}}}, 0x79: {l: {0x3B: {c: [169]}, 0x73: {l: {0x72: {l: {0x3B: {c: [8471]}}}}}}, c: [169]}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8629]}}}}}}}, 0x6F: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [10007]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119992]}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [10959]}, 0x65: {l: {0x3B: {c: [10961]}}}}}, 0x70: {l: {0x3B: {c: [10960]}, 0x65: {l: {0x3B: {c: [10962]}}}}}}}}}, 0x74: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8943]}}}}}}}}}, 0x75: {l: {0x64: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6C: {l: {0x3B: {c: [10552]}}}, 0x72: {l: {0x3B: {c: [10549]}}}}}}}}}}}, 0x65: {l: {0x70: {l: {0x72: {l: {0x3B: {c: [8926]}}}}}, 0x73: {l: {0x63: {l: {0x3B: {c: [8927]}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8630]}, 0x70: {l: {0x3B: {c: [10557]}}}}}}}}}}}, 0x70: {l: {0x62: {l: {0x72: {l: {0x63: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10824]}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10822]}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [10826]}}}}}}}, 0x3B: {c: [8746]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8845]}}}}}}}, 0x6F: {l: {0x72: {l: {0x3B: {c: [10821]}}}}}, 0x73: {l: {0x3B: {c: [8746, 65024]}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8631]}, 0x6D: {l: {0x3B: {c: [10556]}}}}}}}}}, 0x6C: {l: {0x79: {l: {0x65: {l: {0x71: {l: {0x70: {l: {0x72: {l: {0x65: {l: {0x63: {l: {0x3B: {c: [8926]}}}}}}}}}, 0x73: {l: {0x75: {l: {0x63: {l: {0x63: {l: {0x3B: {c: [8927]}}}}}}}}}}}}}, 0x76: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [8910]}}}}}}}, 0x77: {l: {0x65: {l: {0x64: {l: {0x67: {l: {0x65: {l: {0x3B: {c: [8911]}}}}}}}}}}}}}}}, 0x72: {l: {0x65: {l: {0x6E: {l: {0x3B: {c: [164]}}, c: [164]}}}}}, 0x76: {l: {0x65: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [8630]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [8631]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x76: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [8910]}}}}}}}, 0x77: {l: {0x65: {l: {0x64: {l: {0x3B: {c: [8911]}}}}}}}}}, 0x77: {l: {0x63: {l: {0x6F: {l: {0x6E: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8754]}}}}}}}}}}}}}, 0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8753]}}}}}}}}}, 0x79: {l: {0x6C: {l: {0x63: {l: {0x74: {l: {0x79: {l: {0x3B: {c: [9005]}}}}}}}}}}}}},
- 0x64: {l: {0x61: {l: {0x67: {l: {0x67: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8224]}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x74: {l: {0x68: {l: {0x3B: {c: [8504]}}}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8595]}}}}}, 0x73: {l: {0x68: {l: {0x3B: {c: [8208]}, 0x76: {l: {0x3B: {c: [8867]}}}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8659]}}}}}}}, 0x62: {l: {0x6B: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10511]}}}}}}}}}}}, 0x6C: {l: {0x61: {l: {0x63: {l: {0x3B: {c: [733]}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [271]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1076]}}}}}, 0x64: {l: {0x61: {l: {0x67: {l: {0x67: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8225]}}}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8650]}}}}}}}, 0x3B: {c: [8518]}, 0x6F: {l: {0x74: {l: {0x73: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [10871]}}}}}}}}}}}}}, 0x65: {l: {0x67: {l: {0x3B: {c: [176]}}, c: [176]}, 0x6C: {l: {0x74: {l: {0x61: {l: {0x3B: {c: [948]}}}}}}}, 0x6D: {l: {0x70: {l: {0x74: {l: {0x79: {l: {0x76: {l: {0x3B: {c: [10673]}}}}}}}}}}}}}, 0x66: {l: {0x69: {l: {0x73: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [10623]}}}}}}}}}, 0x72: {l: {0x3B: {c: [120097]}}}}}, 0x48: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10597]}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x6C: {l: {0x3B: {c: [8643]}}}, 0x72: {l: {0x3B: {c: [8642]}}}}}}}}}, 0x69: {l: {0x61: {l: {0x6D: {l: {0x3B: {c: [8900]}, 0x6F: {l: {0x6E: {l: {0x64: {l: {0x3B: {c: [8900]}, 0x73: {l: {0x75: {l: {0x69: {l: {0x74: {l: {0x3B: {c: [9830]}}}}}}}}}}}}}}}, 0x73: {l: {0x3B: {c: [9830]}}}}}}}, 0x65: {l: {0x3B: {c: [168]}}}, 0x67: {l: {0x61: {l: {0x6D: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [989]}}}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6E: {l: {0x3B: {c: [8946]}}}}}}}, 0x76: {l: {0x3B: {c: [247]}, 0x69: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [247]}, 0x6F: {l: {0x6E: {l: {0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8903]}}}}}}}}}}}}}}}}, c: [247]}}}}}, 0x6F: {l: {0x6E: {l: {0x78: {l: {0x3B: {c: [8903]}}}}}}}}}}}, 0x6A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1106]}}}}}}}, 0x6C: {l: {0x63: {l: {0x6F: {l: {0x72: {l: {0x6E: {l: {0x3B: {c: [8990]}}}}}}}, 0x72: {l: {0x6F: {l: {0x70: {l: {0x3B: {c: [8973]}}}}}}}}}}}, 0x6F: {l: {0x6C: {l: {0x6C: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [36]}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120149]}}}}}, 0x74: {l: {0x3B: {c: [729]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8784]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8785]}}}}}}}}}}}, 0x6D: {l: {0x69: {l: {0x6E: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8760]}}}}}}}}}}}, 0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8724]}}}}}}}}}, 0x73: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [8865]}}}}}}}}}}}}}}}, 0x75: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x77: {l: {0x65: {l: {0x64: {l: {0x67: {l: {0x65: {l: {0x3B: {c: [8966]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x77: {l: {0x6E: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8595]}}}}}}}}}}}, 0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x73: {l: {0x3B: {c: [8650]}}}}}}}}}}}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x70: {l: {0x6F: {l: {0x6F: {l: {0x6E: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [8643]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [8642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x62: {l: {0x6B: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10512]}}}}}}}}}}}}}, 0x63: {l: {0x6F: {l: {0x72: {l: {0x6E: {l: {0x3B: {c: [8991]}}}}}}}, 0x72: {l: {0x6F: {l: {0x70: {l: {0x3B: {c: [8972]}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119993]}}}, 0x79: {l: {0x3B: {c: [1109]}}}}}, 0x6F: {l: {0x6C: {l: {0x3B: {c: [10742]}}}}}, 0x74: {l: {0x72: {l: {0x6F: {l: {0x6B: {l: {0x3B: {c: [273]}}}}}}}}}}}, 0x74: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8945]}}}}}}}, 0x72: {l: {0x69: {l: {0x3B: {c: [9663]}, 0x66: {l: {0x3B: {c: [9662]}}}}}}}}}, 0x75: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8693]}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10607]}}}}}}}}}, 0x77: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [10662]}}}}}}}}}}}}}, 0x7A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1119]}}}}}, 0x69: {l: {0x67: {l: {0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10239]}}}}}}}}}}}}}}}}},
- 0x44: {l: {0x61: {l: {0x67: {l: {0x67: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8225]}}}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8609]}}}}}, 0x73: {l: {0x68: {l: {0x76: {l: {0x3B: {c: [10980]}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [270]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1044]}}}}}, 0x44: {l: {0x3B: {c: [8517]}, 0x6F: {l: {0x74: {l: {0x72: {l: {0x61: {l: {0x68: {l: {0x64: {l: {0x3B: {c: [10513]}}}}}}}}}}}}}}}, 0x65: {l: {0x6C: {l: {0x3B: {c: [8711]}, 0x74: {l: {0x61: {l: {0x3B: {c: [916]}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120071]}}}}}, 0x69: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x69: {l: {0x74: {l: {0x69: {l: {0x63: {l: {0x61: {l: {0x6C: {l: {0x41: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [180]}}}}}}}}}}}, 0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [729]}}}, 0x75: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x41: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [733]}}}}}}}}}}}}}}}}}}}}}}}, 0x47: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [96]}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [732]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6D: {l: {0x6F: {l: {0x6E: {l: {0x64: {l: {0x3B: {c: [8900]}}}}}}}}}}}, 0x66: {l: {0x66: {l: {0x65: {l: {0x72: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x69: {l: {0x61: {l: {0x6C: {l: {0x44: {l: {0x3B: {c: [8518]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x4A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1026]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120123]}}}}}, 0x74: {l: {0x3B: {c: [168]}, 0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8412]}}}}}}}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8784]}}}}}}}}}}}}}, 0x75: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x43: {l: {0x6F: {l: {0x6E: {l: {0x74: {l: {0x6F: {l: {0x75: {l: {0x72: {l: {0x49: {l: {0x6E: {l: {0x74: {l: {0x65: {l: {0x67: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8751]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [168]}}}, 0x77: {l: {0x6E: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8659]}}}}}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8656]}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8660]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [10980]}}}}}}}}}}}}}, 0x6F: {l: {0x6E: {l: {0x67: {l: {0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10232]}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10233]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8658]}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [8872]}}}}}}}}}}}}}}}}}, 0x55: {l: {0x70: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8657]}}}}}}}}}}}, 0x44: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8661]}}}}}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x72: {l: {0x74: {l: {0x69: {l: {0x63: {l: {0x61: {l: {0x6C: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8741]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x77: {l: {0x6E: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10515]}}}}}}}, 0x3B: {c: [8595]}, 0x55: {l: {0x70: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8693]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8659]}}}}}}}}}}}, 0x42: {l: {0x72: {l: {0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [785]}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10576]}}}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10590]}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10582]}}}}}}}, 0x3B: {c: [8637]}}}}}}}}}}}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x54: {l: {0x65: {l: {0x65: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10591]}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10583]}}}}}}}, 0x3B: {c: [8641]}}}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8615]}}}}}}}}}}}, 0x3B: {c: [8868]}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119967]}}}}}, 0x74: {l: {0x72: {l: {0x6F: {l: {0x6B: {l: {0x3B: {c: [272]}}}}}}}}}}}, 0x53: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1029]}}}}}}}, 0x5A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1039]}}}}}}}}},
- 0x45: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [201]}}, c: [201]}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [282]}}}}}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [202]}}, c: [202]}}}}}, 0x79: {l: {0x3B: {c: [1069]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [278]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120072]}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [200]}}, c: [200]}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x6D: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8712]}}}}}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [274]}}}}}}}, 0x70: {l: {0x74: {l: {0x79: {l: {0x53: {l: {0x6D: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x53: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [9723]}}}}}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x72: {l: {0x79: {l: {0x53: {l: {0x6D: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x53: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [9643]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x4E: {l: {0x47: {l: {0x3B: {c: [330]}}}}}, 0x6F: {l: {0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [280]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120124]}}}}}}}, 0x70: {l: {0x73: {l: {0x69: {l: {0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [917]}}}}}}}}}}}}}, 0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10869]}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8770]}}}}}}}}}}}}}}}, 0x69: {l: {0x6C: {l: {0x69: {l: {0x62: {l: {0x72: {l: {0x69: {l: {0x75: {l: {0x6D: {l: {0x3B: {c: [8652]}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8496]}}}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [10867]}}}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [919]}}}}}, 0x54: {l: {0x48: {l: {0x3B: {c: [208]}}, c: [208]}}}, 0x75: {l: {0x6D: {l: {0x6C: {l: {0x3B: {c: [203]}}, c: [203]}}}}}, 0x78: {l: {0x69: {l: {0x73: {l: {0x74: {l: {0x73: {l: {0x3B: {c: [8707]}}}}}}}}}, 0x70: {l: {0x6F: {l: {0x6E: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x69: {l: {0x61: {l: {0x6C: {l: {0x45: {l: {0x3B: {c: [8519]}}}}}}}}}}}}}}}}}}}}}}}}},
- 0x65: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [233]}}, c: [233]}}}}}}}, 0x73: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [10862]}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [283]}}}}}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [234]}}, c: [234]}, 0x3B: {c: [8790]}}}}}, 0x6F: {l: {0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8789]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1101]}}}}}, 0x44: {l: {0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10871]}}}}}}}, 0x6F: {l: {0x74: {l: {0x3B: {c: [8785]}}}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [279]}}}}}}}, 0x65: {l: {0x3B: {c: [8519]}}}, 0x66: {l: {0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8786]}}}}}}}, 0x72: {l: {0x3B: {c: [120098]}}}}}, 0x67: {l: {0x3B: {c: [10906]}, 0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [232]}}, c: [232]}}}}}}}, 0x73: {l: {0x3B: {c: [10902]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10904]}}}}}}}}}}}, 0x6C: {l: {0x3B: {c: [10905]}, 0x69: {l: {0x6E: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x73: {l: {0x3B: {c: [9191]}}}}}}}}}}}}}, 0x6C: {l: {0x3B: {c: [8467]}}}, 0x73: {l: {0x3B: {c: [10901]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10903]}}}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [275]}}}}}}}, 0x70: {l: {0x74: {l: {0x79: {l: {0x3B: {c: [8709]}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8709]}}}}}}}, 0x76: {l: {0x3B: {c: [8709]}}}}}}}}}, 0x73: {l: {0x70: {l: {0x31: {l: {0x33: {l: {0x3B: {c: [8196]}}}, 0x34: {l: {0x3B: {c: [8197]}}}}}, 0x3B: {c: [8195]}}}}}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [331]}}}, 0x73: {l: {0x70: {l: {0x3B: {c: [8194]}}}}}}}, 0x6F: {l: {0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [281]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120150]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8917]}, 0x73: {l: {0x6C: {l: {0x3B: {c: [10723]}}}}}}}}}, 0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10865]}}}}}}}, 0x73: {l: {0x69: {l: {0x3B: {c: [949]}, 0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [949]}}}}}}}, 0x76: {l: {0x3B: {c: [1013]}}}}}}}}}, 0x71: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [8790]}}}}}}}, 0x6F: {l: {0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8789]}}}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8770]}}}}}, 0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x67: {l: {0x74: {l: {0x72: {l: {0x3B: {c: [10902]}}}}}}}, 0x6C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [10901]}}}}}}}}}}}}}}}}}}}, 0x75: {l: {0x61: {l: {0x6C: {l: {0x73: {l: {0x3B: {c: [61]}}}}}}}, 0x65: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [8799]}}}}}}}, 0x69: {l: {0x76: {l: {0x3B: {c: [8801]}, 0x44: {l: {0x44: {l: {0x3B: {c: [10872]}}}}}}}}}}}, 0x76: {l: {0x70: {l: {0x61: {l: {0x72: {l: {0x73: {l: {0x6C: {l: {0x3B: {c: [10725]}}}}}}}}}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10609]}}}}}}}, 0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8787]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8495]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8784]}}}}}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [8770]}}}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [951]}}}, 0x68: {l: {0x3B: {c: [240]}}, c: [240]}}}, 0x75: {l: {0x6D: {l: {0x6C: {l: {0x3B: {c: [235]}}, c: [235]}}}, 0x72: {l: {0x6F: {l: {0x3B: {c: [8364]}}}}}}}, 0x78: {l: {0x63: {l: {0x6C: {l: {0x3B: {c: [33]}}}}}, 0x69: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [8707]}}}}}}}, 0x70: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x61: {l: {0x74: {l: {0x69: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8496]}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x6E: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x69: {l: {0x61: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [8519]}}}}}}}}}}}}}}}}}}}}}}}}},
- 0x66: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x73: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8786]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x63: {l: {0x79: {l: {0x3B: {c: [1092]}}}}}, 0x65: {l: {0x6D: {l: {0x61: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [9792]}}}}}}}}}}}, 0x66: {l: {0x69: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [64259]}}}}}}}}}, 0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [64256]}}}}}, 0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [64260]}}}}}}}}}, 0x72: {l: {0x3B: {c: [120099]}}}}}, 0x69: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [64257]}}}}}}}}}, 0x6A: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [102, 106]}}}}}}}}}, 0x6C: {l: {0x61: {l: {0x74: {l: {0x3B: {c: [9837]}}}}}, 0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [64258]}}}}}}}, 0x74: {l: {0x6E: {l: {0x73: {l: {0x3B: {c: [9649]}}}}}}}}}, 0x6E: {l: {0x6F: {l: {0x66: {l: {0x3B: {c: [402]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120151]}}}}}, 0x72: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x3B: {c: [8704]}}}}}}}, 0x6B: {l: {0x3B: {c: [8916]}, 0x76: {l: {0x3B: {c: [10969]}}}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x74: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10765]}}}}}}}}}}}}}}}, 0x72: {l: {0x61: {l: {0x63: {l: {0x31: {l: {0x32: {l: {0x3B: {c: [189]}}, c: [189]}, 0x33: {l: {0x3B: {c: [8531]}}}, 0x34: {l: {0x3B: {c: [188]}}, c: [188]}, 0x35: {l: {0x3B: {c: [8533]}}}, 0x36: {l: {0x3B: {c: [8537]}}}, 0x38: {l: {0x3B: {c: [8539]}}}}}, 0x32: {l: {0x33: {l: {0x3B: {c: [8532]}}}, 0x35: {l: {0x3B: {c: [8534]}}}}}, 0x33: {l: {0x34: {l: {0x3B: {c: [190]}}, c: [190]}, 0x35: {l: {0x3B: {c: [8535]}}}, 0x38: {l: {0x3B: {c: [8540]}}}}}, 0x34: {l: {0x35: {l: {0x3B: {c: [8536]}}}}}, 0x35: {l: {0x36: {l: {0x3B: {c: [8538]}}}, 0x38: {l: {0x3B: {c: [8541]}}}}}, 0x37: {l: {0x38: {l: {0x3B: {c: [8542]}}}}}}}, 0x73: {l: {0x6C: {l: {0x3B: {c: [8260]}}}}}}}, 0x6F: {l: {0x77: {l: {0x6E: {l: {0x3B: {c: [8994]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119995]}}}}}}}}},
- 0x46: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1060]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120073]}}}}}, 0x69: {l: {0x6C: {l: {0x6C: {l: {0x65: {l: {0x64: {l: {0x53: {l: {0x6D: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x53: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [9724]}}}}}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x72: {l: {0x79: {l: {0x53: {l: {0x6D: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x53: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [9642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120125]}}}}}, 0x72: {l: {0x41: {l: {0x6C: {l: {0x6C: {l: {0x3B: {c: [8704]}}}}}}}}}, 0x75: {l: {0x72: {l: {0x69: {l: {0x65: {l: {0x72: {l: {0x74: {l: {0x72: {l: {0x66: {l: {0x3B: {c: [8497]}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8497]}}}}}}}}},
- 0x67: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [501]}}}}}}}}}, 0x6D: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [947]}, 0x64: {l: {0x3B: {c: [989]}}}}}}}}}, 0x70: {l: {0x3B: {c: [10886]}}}}}, 0x62: {l: {0x72: {l: {0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [287]}}}}}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [285]}}}}}}}, 0x79: {l: {0x3B: {c: [1075]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [289]}}}}}}}, 0x65: {l: {0x3B: {c: [8805]}, 0x6C: {l: {0x3B: {c: [8923]}}}, 0x71: {l: {0x3B: {c: [8805]}, 0x71: {l: {0x3B: {c: [8807]}}}, 0x73: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10878]}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x63: {l: {0x3B: {c: [10921]}}}}}, 0x3B: {c: [10878]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10880]}, 0x6F: {l: {0x3B: {c: [10882]}, 0x6C: {l: {0x3B: {c: [10884]}}}}}}}}}}}, 0x6C: {l: {0x3B: {c: [8923, 65024]}, 0x65: {l: {0x73: {l: {0x3B: {c: [10900]}}}}}}}}}}}, 0x45: {l: {0x3B: {c: [8807]}, 0x6C: {l: {0x3B: {c: [10892]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120100]}}}}}, 0x67: {l: {0x3B: {c: [8811]}, 0x67: {l: {0x3B: {c: [8921]}}}}}, 0x69: {l: {0x6D: {l: {0x65: {l: {0x6C: {l: {0x3B: {c: [8503]}}}}}}}}}, 0x6A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1107]}}}}}}}, 0x6C: {l: {0x61: {l: {0x3B: {c: [10917]}}}, 0x3B: {c: [8823]}, 0x45: {l: {0x3B: {c: [10898]}}}, 0x6A: {l: {0x3B: {c: [10916]}}}}}, 0x6E: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10890]}, 0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10890]}}}}}}}}}}}}}, 0x65: {l: {0x3B: {c: [10888]}, 0x71: {l: {0x3B: {c: [10888]}, 0x71: {l: {0x3B: {c: [8809]}}}}}}}, 0x45: {l: {0x3B: {c: [8809]}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8935]}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120152]}}}}}}}, 0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [96]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8458]}}}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [8819]}, 0x65: {l: {0x3B: {c: [10894]}}}, 0x6C: {l: {0x3B: {c: [10896]}}}}}}}}}, 0x74: {l: {0x63: {l: {0x63: {l: {0x3B: {c: [10919]}}}, 0x69: {l: {0x72: {l: {0x3B: {c: [10874]}}}}}}}, 0x3B: {c: [62]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8919]}}}}}}}, 0x6C: {l: {0x50: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10645]}}}}}}}}}, 0x71: {l: {0x75: {l: {0x65: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [10876]}}}}}}}}}}}, 0x72: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10886]}}}}}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [10616]}}}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8919]}}}}}}}, 0x65: {l: {0x71: {l: {0x6C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [8923]}}}}}}}}}, 0x71: {l: {0x6C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [10892]}}}}}}}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [8823]}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8819]}}}}}}}}}}, c: [62]}, 0x76: {l: {0x65: {l: {0x72: {l: {0x74: {l: {0x6E: {l: {0x65: {l: {0x71: {l: {0x71: {l: {0x3B: {c: [8809, 65024]}}}}}}}}}}}}}}}, 0x6E: {l: {0x45: {l: {0x3B: {c: [8809, 65024]}}}}}}}}},
- 0x47: {l: {0x61: {l: {0x6D: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [915]}, 0x64: {l: {0x3B: {c: [988]}}}}}}}}}}}, 0x62: {l: {0x72: {l: {0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [286]}}}}}}}}}}}, 0x63: {l: {0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [290]}}}}}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [284]}}}}}}}, 0x79: {l: {0x3B: {c: [1043]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [288]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120074]}}}}}, 0x67: {l: {0x3B: {c: [8921]}}}, 0x4A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1027]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120126]}}}}}}}, 0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8805]}, 0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [8923]}}}}}}}}}}}}}}}}}}}, 0x46: {l: {0x75: {l: {0x6C: {l: {0x6C: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8807]}}}}}}}}}}}}}}}}}}}, 0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [10914]}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [8823]}}}}}}}}}, 0x53: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10878]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8819]}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119970]}}}}}}}, 0x54: {l: {0x3B: {c: [62]}}, c: [62]}, 0x74: {l: {0x3B: {c: [8811]}}}}},
- 0x48: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x6B: {l: {0x3B: {c: [711]}}}}}}}, 0x74: {l: {0x3B: {c: [94]}}}}}, 0x41: {l: {0x52: {l: {0x44: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1066]}}}}}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [292]}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [8460]}}}}}, 0x69: {l: {0x6C: {l: {0x62: {l: {0x65: {l: {0x72: {l: {0x74: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8459]}}}}}}}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [8461]}}}}}, 0x72: {l: {0x69: {l: {0x7A: {l: {0x6F: {l: {0x6E: {l: {0x74: {l: {0x61: {l: {0x6C: {l: {0x4C: {l: {0x69: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [9472]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8459]}}}}}, 0x74: {l: {0x72: {l: {0x6F: {l: {0x6B: {l: {0x3B: {c: [294]}}}}}}}}}}}, 0x75: {l: {0x6D: {l: {0x70: {l: {0x44: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x48: {l: {0x75: {l: {0x6D: {l: {0x70: {l: {0x3B: {c: [8782]}}}}}}}}}}}}}}}}}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8783]}}}}}}}}}}}}}}}}}}},
- 0x68: {l: {0x61: {l: {0x69: {l: {0x72: {l: {0x73: {l: {0x70: {l: {0x3B: {c: [8202]}}}}}}}}}, 0x6C: {l: {0x66: {l: {0x3B: {c: [189]}}}}}, 0x6D: {l: {0x69: {l: {0x6C: {l: {0x74: {l: {0x3B: {c: [8459]}}}}}}}}}, 0x72: {l: {0x64: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1098]}}}}}}}, 0x72: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10568]}}}}}}}, 0x3B: {c: [8596]}, 0x77: {l: {0x3B: {c: [8621]}}}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8660]}}}}}}}, 0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8463]}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [293]}}}}}}}}}, 0x65: {l: {0x61: {l: {0x72: {l: {0x74: {l: {0x73: {l: {0x3B: {c: [9829]}, 0x75: {l: {0x69: {l: {0x74: {l: {0x3B: {c: [9829]}}}}}}}}}}}}}}}, 0x6C: {l: {0x6C: {l: {0x69: {l: {0x70: {l: {0x3B: {c: [8230]}}}}}}}}}, 0x72: {l: {0x63: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8889]}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120101]}}}}}, 0x6B: {l: {0x73: {l: {0x65: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10533]}}}}}}}}}}}, 0x77: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10534]}}}}}}}}}}}}}}}, 0x6F: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8703]}}}}}}}, 0x6D: {l: {0x74: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [8763]}}}}}}}}}, 0x6F: {l: {0x6B: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8617]}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8618]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120153]}}}}}, 0x72: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8213]}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119997]}}}}}, 0x6C: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8463]}}}}}}}}}, 0x74: {l: {0x72: {l: {0x6F: {l: {0x6B: {l: {0x3B: {c: [295]}}}}}}}}}}}, 0x79: {l: {0x62: {l: {0x75: {l: {0x6C: {l: {0x6C: {l: {0x3B: {c: [8259]}}}}}}}}}, 0x70: {l: {0x68: {l: {0x65: {l: {0x6E: {l: {0x3B: {c: [8208]}}}}}}}}}}}}},
- 0x49: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [205]}}, c: [205]}}}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [206]}}, c: [206]}}}}}, 0x79: {l: {0x3B: {c: [1048]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [304]}}}}}}}, 0x45: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1045]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [8465]}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [204]}}, c: [204]}}}}}}}}}, 0x4A: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [306]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [298]}}}}}, 0x67: {l: {0x69: {l: {0x6E: {l: {0x61: {l: {0x72: {l: {0x79: {l: {0x49: {l: {0x3B: {c: [8520]}}}}}}}}}}}}}}}}}, 0x3B: {c: [8465]}, 0x70: {l: {0x6C: {l: {0x69: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8658]}}}}}}}}}}}}}, 0x6E: {l: {0x74: {l: {0x3B: {c: [8748]}, 0x65: {l: {0x67: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8747]}}}}}}}}}, 0x72: {l: {0x73: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x69: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8898]}}}}}}}}}}}}}}}}}}}}}, 0x76: {l: {0x69: {l: {0x73: {l: {0x69: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x43: {l: {0x6F: {l: {0x6D: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [8291]}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8290]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x4F: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1025]}}}}}}}, 0x6F: {l: {0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [302]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120128]}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [921]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8464]}}}}}}}, 0x74: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [296]}}}}}}}}}}}, 0x75: {l: {0x6B: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1030]}}}}}}}, 0x6D: {l: {0x6C: {l: {0x3B: {c: [207]}}, c: [207]}}}}}}},
- 0x69: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [237]}}, c: [237]}}}}}}}}}, 0x63: {l: {0x3B: {c: [8291]}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [238]}}, c: [238]}}}}}, 0x79: {l: {0x3B: {c: [1080]}}}}}, 0x65: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1077]}}}}}, 0x78: {l: {0x63: {l: {0x6C: {l: {0x3B: {c: [161]}}, c: [161]}}}}}}}, 0x66: {l: {0x66: {l: {0x3B: {c: [8660]}}}, 0x72: {l: {0x3B: {c: [120102]}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [236]}}, c: [236]}}}}}}}}}, 0x69: {l: {0x3B: {c: [8520]}, 0x69: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10764]}}}}}}}, 0x6E: {l: {0x74: {l: {0x3B: {c: [8749]}}}}}}}, 0x6E: {l: {0x66: {l: {0x69: {l: {0x6E: {l: {0x3B: {c: [10716]}}}}}}}}}, 0x6F: {l: {0x74: {l: {0x61: {l: {0x3B: {c: [8489]}}}}}}}}}, 0x6A: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [307]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [299]}}}}}, 0x67: {l: {0x65: {l: {0x3B: {c: [8465]}}}, 0x6C: {l: {0x69: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [8464]}}}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x74: {l: {0x3B: {c: [8465]}}}}}}}}}}}, 0x74: {l: {0x68: {l: {0x3B: {c: [305]}}}}}}}, 0x6F: {l: {0x66: {l: {0x3B: {c: [8887]}}}}}, 0x70: {l: {0x65: {l: {0x64: {l: {0x3B: {c: [437]}}}}}}}}}, 0x6E: {l: {0x63: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [8453]}}}}}}}}}, 0x3B: {c: [8712]}, 0x66: {l: {0x69: {l: {0x6E: {l: {0x3B: {c: [8734]}, 0x74: {l: {0x69: {l: {0x65: {l: {0x3B: {c: [10717]}}}}}}}}}}}}}, 0x6F: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [305]}}}}}}}}}, 0x74: {l: {0x63: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8890]}}}}}}}, 0x3B: {c: [8747]}, 0x65: {l: {0x67: {l: {0x65: {l: {0x72: {l: {0x73: {l: {0x3B: {c: [8484]}}}}}}}}}, 0x72: {l: {0x63: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8890]}}}}}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x68: {l: {0x6B: {l: {0x3B: {c: [10775]}}}}}}}}}}}, 0x70: {l: {0x72: {l: {0x6F: {l: {0x64: {l: {0x3B: {c: [10812]}}}}}}}}}}}}}, 0x6F: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1105]}}}}}, 0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [303]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120154]}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [953]}}}}}}}, 0x70: {l: {0x72: {l: {0x6F: {l: {0x64: {l: {0x3B: {c: [10812]}}}}}}}}}, 0x71: {l: {0x75: {l: {0x65: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [191]}}, c: [191]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119998]}}}}}, 0x69: {l: {0x6E: {l: {0x3B: {c: [8712]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8949]}}}}}}}, 0x45: {l: {0x3B: {c: [8953]}}}, 0x73: {l: {0x3B: {c: [8948]}, 0x76: {l: {0x3B: {c: [8947]}}}}}, 0x76: {l: {0x3B: {c: [8712]}}}}}}}}}, 0x74: {l: {0x3B: {c: [8290]}, 0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [297]}}}}}}}}}}}, 0x75: {l: {0x6B: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1110]}}}}}}}, 0x6D: {l: {0x6C: {l: {0x3B: {c: [239]}}, c: [239]}}}}}}},
- 0x4A: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [308]}}}}}}}, 0x79: {l: {0x3B: {c: [1049]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120077]}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120129]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119973]}}}}}, 0x65: {l: {0x72: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1032]}}}}}}}}}}}, 0x75: {l: {0x6B: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1028]}}}}}}}}}}},
- 0x6A: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [309]}}}}}}}, 0x79: {l: {0x3B: {c: [1081]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120103]}}}}}, 0x6D: {l: {0x61: {l: {0x74: {l: {0x68: {l: {0x3B: {c: [567]}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120155]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119999]}}}}}, 0x65: {l: {0x72: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1112]}}}}}}}}}}}, 0x75: {l: {0x6B: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1108]}}}}}}}}}}},
- 0x4B: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x61: {l: {0x3B: {c: [922]}}}}}}}}}, 0x63: {l: {0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [310]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1050]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120078]}}}}}, 0x48: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1061]}}}}}}}, 0x4A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1036]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120130]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119974]}}}}}}}}},
- 0x6B: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x61: {l: {0x3B: {c: [954]}, 0x76: {l: {0x3B: {c: [1008]}}}}}}}}}}}, 0x63: {l: {0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [311]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1082]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120104]}}}}}, 0x67: {l: {0x72: {l: {0x65: {l: {0x65: {l: {0x6E: {l: {0x3B: {c: [312]}}}}}}}}}}}, 0x68: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1093]}}}}}}}, 0x6A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1116]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120156]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120000]}}}}}}}}},
- 0x6C: {l: {0x41: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8666]}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8656]}}}}}, 0x74: {l: {0x61: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [10523]}}}}}}}}}}}, 0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [314]}}}}}}}}}, 0x65: {l: {0x6D: {l: {0x70: {l: {0x74: {l: {0x79: {l: {0x76: {l: {0x3B: {c: [10676]}}}}}}}}}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x6E: {l: {0x3B: {c: [8466]}}}}}}}}}, 0x6D: {l: {0x62: {l: {0x64: {l: {0x61: {l: {0x3B: {c: [955]}}}}}}}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [10216]}, 0x64: {l: {0x3B: {c: [10641]}}}, 0x6C: {l: {0x65: {l: {0x3B: {c: [10216]}}}}}}}}}, 0x70: {l: {0x3B: {c: [10885]}}}, 0x71: {l: {0x75: {l: {0x6F: {l: {0x3B: {c: [171]}}, c: [171]}}}}}, 0x72: {l: {0x72: {l: {0x62: {l: {0x3B: {c: [8676]}, 0x66: {l: {0x73: {l: {0x3B: {c: [10527]}}}}}}}, 0x3B: {c: [8592]}, 0x66: {l: {0x73: {l: {0x3B: {c: [10525]}}}}}, 0x68: {l: {0x6B: {l: {0x3B: {c: [8617]}}}}}, 0x6C: {l: {0x70: {l: {0x3B: {c: [8619]}}}}}, 0x70: {l: {0x6C: {l: {0x3B: {c: [10553]}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [10611]}}}}}}}, 0x74: {l: {0x6C: {l: {0x3B: {c: [8610]}}}}}}}}}, 0x74: {l: {0x61: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [10521]}}}}}}}, 0x3B: {c: [10923]}, 0x65: {l: {0x3B: {c: [10925]}, 0x73: {l: {0x3B: {c: [10925, 65024]}}}}}}}}}, 0x62: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10508]}}}}}}}, 0x62: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [10098]}}}}}}}, 0x72: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [123]}}}, 0x6B: {l: {0x3B: {c: [91]}}}}}}}, 0x6B: {l: {0x65: {l: {0x3B: {c: [10635]}}}, 0x73: {l: {0x6C: {l: {0x64: {l: {0x3B: {c: [10639]}}}, 0x75: {l: {0x3B: {c: [10637]}}}}}}}}}}}}}, 0x42: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10510]}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [318]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [316]}}}}}}}, 0x69: {l: {0x6C: {l: {0x3B: {c: [8968]}}}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [123]}}}}}, 0x79: {l: {0x3B: {c: [1083]}}}}}, 0x64: {l: {0x63: {l: {0x61: {l: {0x3B: {c: [10550]}}}}}, 0x71: {l: {0x75: {l: {0x6F: {l: {0x3B: {c: [8220]}, 0x72: {l: {0x3B: {c: [8222]}}}}}}}}}, 0x72: {l: {0x64: {l: {0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10599]}}}}}}}}}, 0x75: {l: {0x73: {l: {0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10571]}}}}}}}}}}}}}, 0x73: {l: {0x68: {l: {0x3B: {c: [8626]}}}}}}}, 0x65: {l: {0x3B: {c: [8804]}, 0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8592]}, 0x74: {l: {0x61: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [8610]}}}}}}}}}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x70: {l: {0x6F: {l: {0x6F: {l: {0x6E: {l: {0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x3B: {c: [8637]}}}}}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [8636]}}}}}}}}}}}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x73: {l: {0x3B: {c: [8647]}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8596]}, 0x73: {l: {0x3B: {c: [8646]}}}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x70: {l: {0x6F: {l: {0x6F: {l: {0x6E: {l: {0x73: {l: {0x3B: {c: [8651]}}}}}}}}}}}}}}}}}, 0x73: {l: {0x71: {l: {0x75: {l: {0x69: {l: {0x67: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8621]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x74: {l: {0x68: {l: {0x72: {l: {0x65: {l: {0x65: {l: {0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8907]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x67: {l: {0x3B: {c: [8922]}}}, 0x71: {l: {0x3B: {c: [8804]}, 0x71: {l: {0x3B: {c: [8806]}}}, 0x73: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10877]}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x63: {l: {0x3B: {c: [10920]}}}}}, 0x3B: {c: [10877]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10879]}, 0x6F: {l: {0x3B: {c: [10881]}, 0x72: {l: {0x3B: {c: [10883]}}}}}}}}}}}, 0x67: {l: {0x3B: {c: [8922, 65024]}, 0x65: {l: {0x73: {l: {0x3B: {c: [10899]}}}}}}}, 0x73: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10885]}}}}}}}}}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8918]}}}}}}}, 0x65: {l: {0x71: {l: {0x67: {l: {0x74: {l: {0x72: {l: {0x3B: {c: [8922]}}}}}}}, 0x71: {l: {0x67: {l: {0x74: {l: {0x72: {l: {0x3B: {c: [10891]}}}}}}}}}}}}}, 0x67: {l: {0x74: {l: {0x72: {l: {0x3B: {c: [8822]}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8818]}}}}}}}}}}}}}, 0x45: {l: {0x3B: {c: [8806]}, 0x67: {l: {0x3B: {c: [10891]}}}}}, 0x66: {l: {0x69: {l: {0x73: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [10620]}}}}}}}}}, 0x6C: {l: {0x6F: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [8970]}}}}}}}}}, 0x72: {l: {0x3B: {c: [120105]}}}}}, 0x67: {l: {0x3B: {c: [8822]}, 0x45: {l: {0x3B: {c: [10897]}}}}}, 0x48: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10594]}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x64: {l: {0x3B: {c: [8637]}}}, 0x75: {l: {0x3B: {c: [8636]}, 0x6C: {l: {0x3B: {c: [10602]}}}}}}}}}, 0x62: {l: {0x6C: {l: {0x6B: {l: {0x3B: {c: [9604]}}}}}}}}}, 0x6A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1113]}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8647]}}}}}}}, 0x3B: {c: [8810]}, 0x63: {l: {0x6F: {l: {0x72: {l: {0x6E: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8990]}}}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x64: {l: {0x3B: {c: [10603]}}}}}}}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [9722]}}}}}}}}}, 0x6D: {l: {0x69: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [320]}}}}}}}}}, 0x6F: {l: {0x75: {l: {0x73: {l: {0x74: {l: {0x61: {l: {0x63: {l: {0x68: {l: {0x65: {l: {0x3B: {c: [9136]}}}}}}}}}, 0x3B: {c: [9136]}}}}}}}}}}}, 0x6E: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10889]}, 0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10889]}}}}}}}}}}}}}, 0x65: {l: {0x3B: {c: [10887]}, 0x71: {l: {0x3B: {c: [10887]}, 0x71: {l: {0x3B: {c: [8808]}}}}}}}, 0x45: {l: {0x3B: {c: [8808]}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8934]}}}}}}}}}, 0x6F: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [10220]}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8701]}}}}}}}, 0x62: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [10214]}}}}}}}, 0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10229]}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x70: {l: {0x73: {l: {0x74: {l: {0x6F: {l: {0x3B: {c: [10236]}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10230]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [8619]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [8620]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10629]}}}}}, 0x66: {l: {0x3B: {c: [120157]}}}, 0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10797]}}}}}}}}}, 0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [10804]}}}}}}}}}}}, 0x77: {l: {0x61: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [8727]}}}}}}}, 0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [95]}}}}}}}}}, 0x7A: {l: {0x3B: {c: [9674]}, 0x65: {l: {0x6E: {l: {0x67: {l: {0x65: {l: {0x3B: {c: [9674]}}}}}}}}}, 0x66: {l: {0x3B: {c: [10731]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [40]}, 0x6C: {l: {0x74: {l: {0x3B: {c: [10643]}}}}}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8646]}}}}}}}, 0x63: {l: {0x6F: {l: {0x72: {l: {0x6E: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8991]}}}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8651]}, 0x64: {l: {0x3B: {c: [10605]}}}}}}}}}, 0x6D: {l: {0x3B: {c: [8206]}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [8895]}}}}}}}}}, 0x73: {l: {0x61: {l: {0x71: {l: {0x75: {l: {0x6F: {l: {0x3B: {c: [8249]}}}}}}}}}, 0x63: {l: {0x72: {l: {0x3B: {c: [120001]}}}}}, 0x68: {l: {0x3B: {c: [8624]}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [8818]}, 0x65: {l: {0x3B: {c: [10893]}}}, 0x67: {l: {0x3B: {c: [10895]}}}}}}}, 0x71: {l: {0x62: {l: {0x3B: {c: [91]}}}, 0x75: {l: {0x6F: {l: {0x3B: {c: [8216]}, 0x72: {l: {0x3B: {c: [8218]}}}}}}}}}, 0x74: {l: {0x72: {l: {0x6F: {l: {0x6B: {l: {0x3B: {c: [322]}}}}}}}}}}}, 0x74: {l: {0x63: {l: {0x63: {l: {0x3B: {c: [10918]}}}, 0x69: {l: {0x72: {l: {0x3B: {c: [10873]}}}}}}}, 0x3B: {c: [60]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8918]}}}}}}}, 0x68: {l: {0x72: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [8907]}}}}}}}}}, 0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8905]}}}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10614]}}}}}}}}}, 0x71: {l: {0x75: {l: {0x65: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [10875]}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x3B: {c: [9667]}, 0x65: {l: {0x3B: {c: [8884]}}}, 0x66: {l: {0x3B: {c: [9666]}}}}}, 0x50: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10646]}}}}}}}}}}, c: [60]}, 0x75: {l: {0x72: {l: {0x64: {l: {0x73: {l: {0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10570]}}}}}}}}}}}, 0x75: {l: {0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10598]}}}}}}}}}}}}}, 0x76: {l: {0x65: {l: {0x72: {l: {0x74: {l: {0x6E: {l: {0x65: {l: {0x71: {l: {0x71: {l: {0x3B: {c: [8808, 65024]}}}}}}}}}}}}}}}, 0x6E: {l: {0x45: {l: {0x3B: {c: [8808, 65024]}}}}}}}}},
- 0x4C: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [313]}}}}}}}}}, 0x6D: {l: {0x62: {l: {0x64: {l: {0x61: {l: {0x3B: {c: [923]}}}}}}}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [10218]}}}}}, 0x70: {l: {0x6C: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x74: {l: {0x72: {l: {0x66: {l: {0x3B: {c: [8466]}}}}}}}}}}}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8606]}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [317]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [315]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1051]}}}}}, 0x65: {l: {0x66: {l: {0x74: {l: {0x41: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x42: {l: {0x72: {l: {0x61: {l: {0x63: {l: {0x6B: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [10216]}}}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8676]}}}}}}}, 0x3B: {c: [8592]}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8646]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8656]}}}}}}}}}}}, 0x43: {l: {0x65: {l: {0x69: {l: {0x6C: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [8968]}}}}}}}}}}}}}}}, 0x44: {l: {0x6F: {l: {0x75: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x42: {l: {0x72: {l: {0x61: {l: {0x63: {l: {0x6B: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [10214]}}}}}}}}}}}}}}}}}}}}}}}, 0x77: {l: {0x6E: {l: {0x54: {l: {0x65: {l: {0x65: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10593]}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10585]}}}}}}}, 0x3B: {c: [8643]}}}}}}}}}}}}}}}}}}}}}, 0x46: {l: {0x6C: {l: {0x6F: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [8970]}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8596]}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10574]}}}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8660]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8612]}}}}}}}}}}}, 0x3B: {c: [8867]}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10586]}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10703]}}}}}}}, 0x3B: {c: [8882]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8884]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x55: {l: {0x70: {l: {0x44: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10577]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10592]}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10584]}}}}}}}, 0x3B: {c: [8639]}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10578]}}}}}}}, 0x3B: {c: [8636]}}}}}}}}}}}}}}}}}, 0x73: {l: {0x73: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8922]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x46: {l: {0x75: {l: {0x6C: {l: {0x6C: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8806]}}}}}}}}}}}}}}}}}}}, 0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8822]}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [10913]}}}}}}}}}, 0x53: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10877]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8818]}}}}}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120079]}}}}}, 0x4A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1033]}}}}}}}, 0x6C: {l: {0x3B: {c: [8920]}, 0x65: {l: {0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8666]}}}}}}}}}}}}}}}}}}}, 0x6D: {l: {0x69: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [319]}}}}}}}}}}}, 0x6F: {l: {0x6E: {l: {0x67: {l: {0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10229]}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10232]}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10230]}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [10233]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120131]}}}}}, 0x77: {l: {0x65: {l: {0x72: {l: {0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8601]}}}}}}}}}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8600]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8466]}}}}}, 0x68: {l: {0x3B: {c: [8624]}}}, 0x74: {l: {0x72: {l: {0x6F: {l: {0x6B: {l: {0x3B: {c: [321]}}}}}}}}}}}, 0x54: {l: {0x3B: {c: [60]}}, c: [60]}, 0x74: {l: {0x3B: {c: [8810]}}}}},
- 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [175]}}, c: [175]}}}, 0x6C: {l: {0x65: {l: {0x3B: {c: [9794]}}}, 0x74: {l: {0x3B: {c: [10016]}, 0x65: {l: {0x73: {l: {0x65: {l: {0x3B: {c: [10016]}}}}}}}}}}}, 0x70: {l: {0x3B: {c: [8614]}, 0x73: {l: {0x74: {l: {0x6F: {l: {0x3B: {c: [8614]}, 0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x3B: {c: [8615]}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [8612]}}}}}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [8613]}}}}}}}}}}}}}, 0x72: {l: {0x6B: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [9646]}}}}}}}}}}}, 0x63: {l: {0x6F: {l: {0x6D: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [10793]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1084]}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8212]}}}}}}}}}, 0x44: {l: {0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8762]}}}}}}}}}, 0x65: {l: {0x61: {l: {0x73: {l: {0x75: {l: {0x72: {l: {0x65: {l: {0x64: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [8737]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120106]}}}}}, 0x68: {l: {0x6F: {l: {0x3B: {c: [8487]}}}}}, 0x69: {l: {0x63: {l: {0x72: {l: {0x6F: {l: {0x3B: {c: [181]}}, c: [181]}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [42]}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10992]}}}}}}}, 0x3B: {c: [8739]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [183]}}, c: [183]}}}}}}}, 0x6E: {l: {0x75: {l: {0x73: {l: {0x62: {l: {0x3B: {c: [8863]}}}, 0x3B: {c: [8722]}, 0x64: {l: {0x3B: {c: [8760]}, 0x75: {l: {0x3B: {c: [10794]}}}}}}}}}}}}}, 0x6C: {l: {0x63: {l: {0x70: {l: {0x3B: {c: [10971]}}}}}, 0x64: {l: {0x72: {l: {0x3B: {c: [8230]}}}}}}}, 0x6E: {l: {0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8723]}}}}}}}}}}}, 0x6F: {l: {0x64: {l: {0x65: {l: {0x6C: {l: {0x73: {l: {0x3B: {c: [8871]}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120158]}}}}}}}, 0x70: {l: {0x3B: {c: [8723]}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120002]}}}}}, 0x74: {l: {0x70: {l: {0x6F: {l: {0x73: {l: {0x3B: {c: [8766]}}}}}}}}}}}, 0x75: {l: {0x3B: {c: [956]}, 0x6C: {l: {0x74: {l: {0x69: {l: {0x6D: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8888]}}}}}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8888]}}}}}}}}}}},
- 0x4D: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10501]}}}}}, 0x63: {l: {0x79: {l: {0x3B: {c: [1052]}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x75: {l: {0x6D: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8287]}}}}}}}}}}}}}}}}}}}, 0x6C: {l: {0x6C: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x72: {l: {0x66: {l: {0x3B: {c: [8499]}}}}}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120080]}}}}}, 0x69: {l: {0x6E: {l: {0x75: {l: {0x73: {l: {0x50: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8723]}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120132]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8499]}}}}}}}, 0x75: {l: {0x3B: {c: [924]}}}}},
- 0x6E: {l: {0x61: {l: {0x62: {l: {0x6C: {l: {0x61: {l: {0x3B: {c: [8711]}}}}}}}, 0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [324]}}}}}}}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [8736, 8402]}}}}}, 0x70: {l: {0x3B: {c: [8777]}, 0x45: {l: {0x3B: {c: [10864, 824]}}}, 0x69: {l: {0x64: {l: {0x3B: {c: [8779, 824]}}}}}, 0x6F: {l: {0x73: {l: {0x3B: {c: [329]}}}}}, 0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [8777]}}}}}}}}}}}, 0x74: {l: {0x75: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [9838]}, 0x73: {l: {0x3B: {c: [8469]}}}}}}}, 0x3B: {c: [9838]}}}}}}}}}, 0x62: {l: {0x73: {l: {0x70: {l: {0x3B: {c: [160]}}, c: [160]}}}, 0x75: {l: {0x6D: {l: {0x70: {l: {0x3B: {c: [8782, 824]}, 0x65: {l: {0x3B: {c: [8783, 824]}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10819]}}}, 0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [328]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [326]}}}}}}}}}, 0x6F: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [8775]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10861, 824]}}}}}}}}}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [10818]}}}}}, 0x79: {l: {0x3B: {c: [1085]}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8211]}}}}}}}}}, 0x65: {l: {0x61: {l: {0x72: {l: {0x68: {l: {0x6B: {l: {0x3B: {c: [10532]}}}}}, 0x72: {l: {0x3B: {c: [8599]}, 0x6F: {l: {0x77: {l: {0x3B: {c: [8599]}}}}}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8663]}}}}}}}, 0x3B: {c: [8800]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8784, 824]}}}}}}}, 0x71: {l: {0x75: {l: {0x69: {l: {0x76: {l: {0x3B: {c: [8802]}}}}}}}}}, 0x73: {l: {0x65: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10536]}}}}}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [8770, 824]}}}}}}}, 0x78: {l: {0x69: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [8708]}, 0x73: {l: {0x3B: {c: [8708]}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120107]}}}}}, 0x67: {l: {0x45: {l: {0x3B: {c: [8807, 824]}}}, 0x65: {l: {0x3B: {c: [8817]}, 0x71: {l: {0x3B: {c: [8817]}, 0x71: {l: {0x3B: {c: [8807, 824]}}}, 0x73: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10878, 824]}}}}}}}}}}}}}, 0x73: {l: {0x3B: {c: [10878, 824]}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8821]}}}}}}}, 0x74: {l: {0x3B: {c: [8815]}, 0x72: {l: {0x3B: {c: [8815]}}}}}}}, 0x47: {l: {0x67: {l: {0x3B: {c: [8921, 824]}}}, 0x74: {l: {0x3B: {c: [8811, 8402]}, 0x76: {l: {0x3B: {c: [8811, 824]}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8622]}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8654]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10994]}}}}}}}}}, 0x69: {l: {0x3B: {c: [8715]}, 0x73: {l: {0x3B: {c: [8956]}, 0x64: {l: {0x3B: {c: [8954]}}}}}, 0x76: {l: {0x3B: {c: [8715]}}}}}, 0x6A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1114]}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8602]}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8653]}}}}}}}, 0x64: {l: {0x72: {l: {0x3B: {c: [8229]}}}}}, 0x45: {l: {0x3B: {c: [8806, 824]}}}, 0x65: {l: {0x3B: {c: [8816]}, 0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8602]}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8622]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x71: {l: {0x3B: {c: [8816]}, 0x71: {l: {0x3B: {c: [8806, 824]}}}, 0x73: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10877, 824]}}}}}}}}}}}}}, 0x73: {l: {0x3B: {c: [10877, 824]}, 0x73: {l: {0x3B: {c: [8814]}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8820]}}}}}}}, 0x74: {l: {0x3B: {c: [8814]}, 0x72: {l: {0x69: {l: {0x3B: {c: [8938]}, 0x65: {l: {0x3B: {c: [8940]}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8653]}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8654]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6C: {l: {0x3B: {c: [8920, 824]}}}, 0x74: {l: {0x3B: {c: [8810, 8402]}, 0x76: {l: {0x3B: {c: [8810, 824]}}}}}}}, 0x6D: {l: {0x69: {l: {0x64: {l: {0x3B: {c: [8740]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120159]}}}}}, 0x74: {l: {0x3B: {c: [172]}, 0x69: {l: {0x6E: {l: {0x3B: {c: [8713]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8949, 824]}}}}}}}, 0x45: {l: {0x3B: {c: [8953, 824]}}}, 0x76: {l: {0x61: {l: {0x3B: {c: [8713]}}}, 0x62: {l: {0x3B: {c: [8951]}}}, 0x63: {l: {0x3B: {c: [8950]}}}}}}}}}, 0x6E: {l: {0x69: {l: {0x3B: {c: [8716]}, 0x76: {l: {0x61: {l: {0x3B: {c: [8716]}}}, 0x62: {l: {0x3B: {c: [8958]}}}, 0x63: {l: {0x3B: {c: [8957]}}}}}}}}}}, c: [172]}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x65: {l: {0x6C: {l: {0x3B: {c: [8742]}}}}}}}}}}}, 0x3B: {c: [8742]}, 0x73: {l: {0x6C: {l: {0x3B: {c: [11005, 8421]}}}}}, 0x74: {l: {0x3B: {c: [8706, 824]}}}}}}}, 0x6F: {l: {0x6C: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10772]}}}}}}}}}}}, 0x72: {l: {0x3B: {c: [8832]}, 0x63: {l: {0x75: {l: {0x65: {l: {0x3B: {c: [8928]}}}}}}}, 0x65: {l: {0x63: {l: {0x3B: {c: [8832]}, 0x65: {l: {0x71: {l: {0x3B: {c: [10927, 824]}}}}}}}, 0x3B: {c: [10927, 824]}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [10547, 824]}}}, 0x3B: {c: [8603]}, 0x77: {l: {0x3B: {c: [8605, 824]}}}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8655]}}}}}}}, 0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8603]}}}}}}}}}}}}}}}}}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [8939]}, 0x65: {l: {0x3B: {c: [8941]}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8655]}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x3B: {c: [8833]}, 0x63: {l: {0x75: {l: {0x65: {l: {0x3B: {c: [8929]}}}}}}}, 0x65: {l: {0x3B: {c: [10928, 824]}}}, 0x72: {l: {0x3B: {c: [120003]}}}}}, 0x68: {l: {0x6F: {l: {0x72: {l: {0x74: {l: {0x6D: {l: {0x69: {l: {0x64: {l: {0x3B: {c: [8740]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x65: {l: {0x6C: {l: {0x3B: {c: [8742]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [8769]}, 0x65: {l: {0x3B: {c: [8772]}, 0x71: {l: {0x3B: {c: [8772]}}}}}}}}}, 0x6D: {l: {0x69: {l: {0x64: {l: {0x3B: {c: [8740]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8742]}}}}}}}, 0x71: {l: {0x73: {l: {0x75: {l: {0x62: {l: {0x65: {l: {0x3B: {c: [8930]}}}}}, 0x70: {l: {0x65: {l: {0x3B: {c: [8931]}}}}}}}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [8836]}, 0x45: {l: {0x3B: {c: [10949, 824]}}}, 0x65: {l: {0x3B: {c: [8840]}}}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8834, 8402]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8840]}, 0x71: {l: {0x3B: {c: [10949, 824]}}}}}}}}}}}}}}}, 0x63: {l: {0x63: {l: {0x3B: {c: [8833]}, 0x65: {l: {0x71: {l: {0x3B: {c: [10928, 824]}}}}}}}}}, 0x70: {l: {0x3B: {c: [8837]}, 0x45: {l: {0x3B: {c: [10950, 824]}}}, 0x65: {l: {0x3B: {c: [8841]}}}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8835, 8402]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8841]}, 0x71: {l: {0x3B: {c: [10950, 824]}}}}}}}}}}}}}}}}}}}, 0x74: {l: {0x67: {l: {0x6C: {l: {0x3B: {c: [8825]}}}}}, 0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [241]}}, c: [241]}}}}}}}, 0x6C: {l: {0x67: {l: {0x3B: {c: [8824]}}}}}, 0x72: {l: {0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [8938]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8940]}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [8939]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x75: {l: {0x3B: {c: [957]}, 0x6D: {l: {0x3B: {c: [35]}, 0x65: {l: {0x72: {l: {0x6F: {l: {0x3B: {c: [8470]}}}}}}}, 0x73: {l: {0x70: {l: {0x3B: {c: [8199]}}}}}}}}}, 0x76: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8781, 8402]}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8876]}}}}}}}}}, 0x44: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8877]}}}}}}}}}, 0x67: {l: {0x65: {l: {0x3B: {c: [8805, 8402]}}}, 0x74: {l: {0x3B: {c: [62, 8402]}}}}}, 0x48: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10500]}}}}}}}}}, 0x69: {l: {0x6E: {l: {0x66: {l: {0x69: {l: {0x6E: {l: {0x3B: {c: [10718]}}}}}}}}}}}, 0x6C: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10498]}}}}}}}, 0x65: {l: {0x3B: {c: [8804, 8402]}}}, 0x74: {l: {0x3B: {c: [60, 8402]}, 0x72: {l: {0x69: {l: {0x65: {l: {0x3B: {c: [8884, 8402]}}}}}}}}}}}, 0x72: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10499]}}}}}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x65: {l: {0x3B: {c: [8885, 8402]}}}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8764, 8402]}}}}}}}}}, 0x56: {l: {0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8878]}}}}}}}}}, 0x44: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8879]}}}}}}}}}}}, 0x77: {l: {0x61: {l: {0x72: {l: {0x68: {l: {0x6B: {l: {0x3B: {c: [10531]}}}}}, 0x72: {l: {0x3B: {c: [8598]}, 0x6F: {l: {0x77: {l: {0x3B: {c: [8598]}}}}}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8662]}}}}}}}, 0x6E: {l: {0x65: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10535]}}}}}}}}}}}}},
- 0x4E: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [323]}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [327]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [325]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1053]}}}}}, 0x65: {l: {0x67: {l: {0x61: {l: {0x74: {l: {0x69: {l: {0x76: {l: {0x65: {l: {0x4D: {l: {0x65: {l: {0x64: {l: {0x69: {l: {0x75: {l: {0x6D: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8203]}}}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x68: {l: {0x69: {l: {0x63: {l: {0x6B: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8203]}}}}}}}}}}}}}}}, 0x6E: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8203]}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x72: {l: {0x79: {l: {0x54: {l: {0x68: {l: {0x69: {l: {0x6E: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8203]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x74: {l: {0x65: {l: {0x64: {l: {0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8811]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [8810]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x77: {l: {0x4C: {l: {0x69: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [10]}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120081]}}}}}, 0x4A: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1034]}}}}}}}, 0x6F: {l: {0x42: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x6B: {l: {0x3B: {c: [8288]}}}}}}}}}}}, 0x6E: {l: {0x42: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x6B: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [160]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [8469]}}}}}, 0x74: {l: {0x3B: {c: [10988]}, 0x43: {l: {0x6F: {l: {0x6E: {l: {0x67: {l: {0x72: {l: {0x75: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8802]}}}}}}}}}}}}}}}}}, 0x75: {l: {0x70: {l: {0x43: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8813]}}}}}}}}}}}}}, 0x44: {l: {0x6F: {l: {0x75: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x56: {l: {0x65: {l: {0x72: {l: {0x74: {l: {0x69: {l: {0x63: {l: {0x61: {l: {0x6C: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8742]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x45: {l: {0x6C: {l: {0x65: {l: {0x6D: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8713]}}}}}}}}}}}}}, 0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8800]}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8770, 824]}}}}}}}}}}}}}}}}}}}, 0x78: {l: {0x69: {l: {0x73: {l: {0x74: {l: {0x73: {l: {0x3B: {c: [8708]}}}}}}}}}}}}}, 0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8815]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8817]}}}}}}}}}}}, 0x46: {l: {0x75: {l: {0x6C: {l: {0x6C: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8807, 824]}}}}}}}}}}}}}}}}}}}, 0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8811, 824]}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [8825]}}}}}}}}}, 0x53: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10878, 824]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8821]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x48: {l: {0x75: {l: {0x6D: {l: {0x70: {l: {0x44: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x48: {l: {0x75: {l: {0x6D: {l: {0x70: {l: {0x3B: {c: [8782, 824]}}}}}}}}}}}}}}}}}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8783, 824]}}}}}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x54: {l: {0x72: {l: {0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10703, 824]}}}}}}}, 0x3B: {c: [8938]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8940]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x73: {l: {0x3B: {c: [8814]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8816]}}}}}}}}}}}, 0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [8824]}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [8810, 824]}}}}}}}}}, 0x53: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10877, 824]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8820]}}}}}}}}}}}}}}}}}}}, 0x4E: {l: {0x65: {l: {0x73: {l: {0x74: {l: {0x65: {l: {0x64: {l: {0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x47: {l: {0x72: {l: {0x65: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x3B: {c: [10914, 824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x4C: {l: {0x65: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [10913, 824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x50: {l: {0x72: {l: {0x65: {l: {0x63: {l: {0x65: {l: {0x64: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8832]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10927, 824]}}}}}}}}}}}, 0x53: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8928]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x52: {l: {0x65: {l: {0x76: {l: {0x65: {l: {0x72: {l: {0x73: {l: {0x65: {l: {0x45: {l: {0x6C: {l: {0x65: {l: {0x6D: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8716]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x54: {l: {0x72: {l: {0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10704, 824]}}}}}}}, 0x3B: {c: [8939]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x53: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x53: {l: {0x75: {l: {0x62: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8847, 824]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8930]}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x65: {l: {0x72: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8848, 824]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8931]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x75: {l: {0x62: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8834, 8402]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8840]}}}}}}}}}}}}}}}}}}}, 0x63: {l: {0x63: {l: {0x65: {l: {0x65: {l: {0x64: {l: {0x73: {l: {0x3B: {c: [8833]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10928, 824]}}}}}}}}}}}, 0x53: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8929]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8831, 824]}}}}}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x65: {l: {0x72: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8835, 8402]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8841]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8769]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8772]}}}}}}}}}}}, 0x46: {l: {0x75: {l: {0x6C: {l: {0x6C: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8775]}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8777]}}}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x72: {l: {0x74: {l: {0x69: {l: {0x63: {l: {0x61: {l: {0x6C: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8740]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119977]}}}}}}}, 0x74: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [209]}}, c: [209]}}}}}}}}}, 0x75: {l: {0x3B: {c: [925]}}}}},
- 0x4F: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [211]}}, c: [211]}}}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [212]}}, c: [212]}}}}}, 0x79: {l: {0x3B: {c: [1054]}}}}}, 0x64: {l: {0x62: {l: {0x6C: {l: {0x61: {l: {0x63: {l: {0x3B: {c: [336]}}}}}}}}}}}, 0x45: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [338]}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120082]}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [210]}}, c: [210]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [332]}}}}}}}, 0x65: {l: {0x67: {l: {0x61: {l: {0x3B: {c: [937]}}}}}}}, 0x69: {l: {0x63: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [927]}}}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120134]}}}}}}}, 0x70: {l: {0x65: {l: {0x6E: {l: {0x43: {l: {0x75: {l: {0x72: {l: {0x6C: {l: {0x79: {l: {0x44: {l: {0x6F: {l: {0x75: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x51: {l: {0x75: {l: {0x6F: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [8220]}}}}}}}}}}}}}}}}}}}}}}}, 0x51: {l: {0x75: {l: {0x6F: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [8216]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x3B: {c: [10836]}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119978]}}}}}, 0x6C: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [216]}}, c: [216]}}}}}}}}}, 0x74: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [213]}}, c: [213]}}}}}, 0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [10807]}}}}}}}}}}}, 0x75: {l: {0x6D: {l: {0x6C: {l: {0x3B: {c: [214]}}, c: [214]}}}}}, 0x76: {l: {0x65: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8254]}}}}}, 0x72: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [9182]}}}, 0x6B: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [9140]}}}}}}}}}}}}}}}, 0x50: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x68: {l: {0x65: {l: {0x73: {l: {0x69: {l: {0x73: {l: {0x3B: {c: [9180]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},
- 0x6F: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [243]}}, c: [243]}}}}}}}, 0x73: {l: {0x74: {l: {0x3B: {c: [8859]}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [244]}}, c: [244]}, 0x3B: {c: [8858]}}}}}, 0x79: {l: {0x3B: {c: [1086]}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8861]}}}}}}}, 0x62: {l: {0x6C: {l: {0x61: {l: {0x63: {l: {0x3B: {c: [337]}}}}}}}}}, 0x69: {l: {0x76: {l: {0x3B: {c: [10808]}}}}}, 0x6F: {l: {0x74: {l: {0x3B: {c: [8857]}}}}}, 0x73: {l: {0x6F: {l: {0x6C: {l: {0x64: {l: {0x3B: {c: [10684]}}}}}}}}}}}, 0x65: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [339]}}}}}}}}}, 0x66: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10687]}}}}}}}, 0x72: {l: {0x3B: {c: [120108]}}}}}, 0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [731]}}}}}, 0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [242]}}, c: [242]}}}}}}}, 0x74: {l: {0x3B: {c: [10689]}}}}}, 0x68: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10677]}}}}}}}, 0x6D: {l: {0x3B: {c: [937]}}}}}, 0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8750]}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8634]}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10686]}}}}}, 0x72: {l: {0x6F: {l: {0x73: {l: {0x73: {l: {0x3B: {c: [10683]}}}}}}}}}}}, 0x69: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [8254]}}}}}}}, 0x74: {l: {0x3B: {c: [10688]}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [333]}}}}}}}, 0x65: {l: {0x67: {l: {0x61: {l: {0x3B: {c: [969]}}}}}}}, 0x69: {l: {0x63: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [959]}}}}}}}}}, 0x64: {l: {0x3B: {c: [10678]}}}, 0x6E: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8854]}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120160]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10679]}}}}}, 0x65: {l: {0x72: {l: {0x70: {l: {0x3B: {c: [10681]}}}}}}}, 0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8853]}}}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8635]}}}}}}}, 0x3B: {c: [8744]}, 0x64: {l: {0x3B: {c: [10845]}, 0x65: {l: {0x72: {l: {0x3B: {c: [8500]}, 0x6F: {l: {0x66: {l: {0x3B: {c: [8500]}}}}}}}}}, 0x66: {l: {0x3B: {c: [170]}}, c: [170]}, 0x6D: {l: {0x3B: {c: [186]}}, c: [186]}}}, 0x69: {l: {0x67: {l: {0x6F: {l: {0x66: {l: {0x3B: {c: [8886]}}}}}}}}}, 0x6F: {l: {0x72: {l: {0x3B: {c: [10838]}}}}}, 0x73: {l: {0x6C: {l: {0x6F: {l: {0x70: {l: {0x65: {l: {0x3B: {c: [10839]}}}}}}}}}}}, 0x76: {l: {0x3B: {c: [10843]}}}}}, 0x53: {l: {0x3B: {c: [9416]}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8500]}}}}}, 0x6C: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [248]}}, c: [248]}}}}}}}, 0x6F: {l: {0x6C: {l: {0x3B: {c: [8856]}}}}}}}, 0x74: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [245]}}, c: [245]}}}}}, 0x6D: {l: {0x65: {l: {0x73: {l: {0x61: {l: {0x73: {l: {0x3B: {c: [10806]}}}}}, 0x3B: {c: [8855]}}}}}}}}}}}, 0x75: {l: {0x6D: {l: {0x6C: {l: {0x3B: {c: [246]}}, c: [246]}}}}}, 0x76: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [9021]}}}}}}}}}}},
- 0x70: {l: {0x61: {l: {0x72: {l: {0x61: {l: {0x3B: {c: [182]}, 0x6C: {l: {0x6C: {l: {0x65: {l: {0x6C: {l: {0x3B: {c: [8741]}}}}}}}}}}, c: [182]}, 0x3B: {c: [8741]}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [10995]}}}}}, 0x6C: {l: {0x3B: {c: [11005]}}}}}, 0x74: {l: {0x3B: {c: [8706]}}}}}}}, 0x63: {l: {0x79: {l: {0x3B: {c: [1087]}}}}}, 0x65: {l: {0x72: {l: {0x63: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [37]}}}}}}}, 0x69: {l: {0x6F: {l: {0x64: {l: {0x3B: {c: [46]}}}}}}}, 0x6D: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [8240]}}}}}}}, 0x70: {l: {0x3B: {c: [8869]}}}, 0x74: {l: {0x65: {l: {0x6E: {l: {0x6B: {l: {0x3B: {c: [8241]}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120109]}}}}}, 0x68: {l: {0x69: {l: {0x3B: {c: [966]}, 0x76: {l: {0x3B: {c: [981]}}}}}, 0x6D: {l: {0x6D: {l: {0x61: {l: {0x74: {l: {0x3B: {c: [8499]}}}}}}}}}, 0x6F: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [9742]}}}}}}}}}, 0x69: {l: {0x3B: {c: [960]}, 0x74: {l: {0x63: {l: {0x68: {l: {0x66: {l: {0x6F: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [8916]}}}}}}}}}}}}}}}, 0x76: {l: {0x3B: {c: [982]}}}}}, 0x6C: {l: {0x61: {l: {0x6E: {l: {0x63: {l: {0x6B: {l: {0x3B: {c: [8463]}, 0x68: {l: {0x3B: {c: [8462]}}}}}}}, 0x6B: {l: {0x76: {l: {0x3B: {c: [8463]}}}}}}}}}, 0x75: {l: {0x73: {l: {0x61: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10787]}}}}}}}}}, 0x62: {l: {0x3B: {c: [8862]}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10786]}}}}}}}, 0x3B: {c: [43]}, 0x64: {l: {0x6F: {l: {0x3B: {c: [8724]}}}, 0x75: {l: {0x3B: {c: [10789]}}}}}, 0x65: {l: {0x3B: {c: [10866]}}}, 0x6D: {l: {0x6E: {l: {0x3B: {c: [177]}}, c: [177]}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [10790]}}}}}}}, 0x74: {l: {0x77: {l: {0x6F: {l: {0x3B: {c: [10791]}}}}}}}}}}}}}, 0x6D: {l: {0x3B: {c: [177]}}}, 0x6F: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10773]}}}}}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120161]}}}}}, 0x75: {l: {0x6E: {l: {0x64: {l: {0x3B: {c: [163]}}, c: [163]}}}}}}}, 0x72: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10935]}}}}}, 0x3B: {c: [8826]}, 0x63: {l: {0x75: {l: {0x65: {l: {0x3B: {c: [8828]}}}}}}}, 0x65: {l: {0x63: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10935]}}}}}}}}}}}}}, 0x3B: {c: [8826]}, 0x63: {l: {0x75: {l: {0x72: {l: {0x6C: {l: {0x79: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8828]}}}}}}}}}}}}}}}, 0x65: {l: {0x71: {l: {0x3B: {c: [10927]}}}}}, 0x6E: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10937]}}}}}}}}}}}}}, 0x65: {l: {0x71: {l: {0x71: {l: {0x3B: {c: [10933]}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8936]}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8830]}}}}}}}}}, 0x3B: {c: [10927]}}}, 0x45: {l: {0x3B: {c: [10931]}}}, 0x69: {l: {0x6D: {l: {0x65: {l: {0x3B: {c: [8242]}, 0x73: {l: {0x3B: {c: [8473]}}}}}}}}}, 0x6E: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10937]}}}}}, 0x45: {l: {0x3B: {c: [10933]}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8936]}}}}}}}}}, 0x6F: {l: {0x64: {l: {0x3B: {c: [8719]}}}, 0x66: {l: {0x61: {l: {0x6C: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [9006]}}}}}}}}}, 0x6C: {l: {0x69: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [8978]}}}}}}}}}, 0x73: {l: {0x75: {l: {0x72: {l: {0x66: {l: {0x3B: {c: [8979]}}}}}}}}}}}, 0x70: {l: {0x3B: {c: [8733]}, 0x74: {l: {0x6F: {l: {0x3B: {c: [8733]}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8830]}}}}}}}, 0x75: {l: {0x72: {l: {0x65: {l: {0x6C: {l: {0x3B: {c: [8880]}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120005]}}}}}, 0x69: {l: {0x3B: {c: [968]}}}}}, 0x75: {l: {0x6E: {l: {0x63: {l: {0x73: {l: {0x70: {l: {0x3B: {c: [8200]}}}}}}}}}}}}},
- 0x50: {l: {0x61: {l: {0x72: {l: {0x74: {l: {0x69: {l: {0x61: {l: {0x6C: {l: {0x44: {l: {0x3B: {c: [8706]}}}}}}}}}}}}}}}, 0x63: {l: {0x79: {l: {0x3B: {c: [1055]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120083]}}}}}, 0x68: {l: {0x69: {l: {0x3B: {c: [934]}}}}}, 0x69: {l: {0x3B: {c: [928]}}}, 0x6C: {l: {0x75: {l: {0x73: {l: {0x4D: {l: {0x69: {l: {0x6E: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [177]}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x69: {l: {0x6E: {l: {0x63: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x70: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [8460]}}}}}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [8473]}}}}}}}, 0x72: {l: {0x3B: {c: [10939]}, 0x65: {l: {0x63: {l: {0x65: {l: {0x64: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8826]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10927]}}}}}}}}}}}, 0x53: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8828]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8830]}}}}}}}}}}}}}}}}}}}}}}}, 0x69: {l: {0x6D: {l: {0x65: {l: {0x3B: {c: [8243]}}}}}}}, 0x6F: {l: {0x64: {l: {0x75: {l: {0x63: {l: {0x74: {l: {0x3B: {c: [8719]}}}}}}}}}, 0x70: {l: {0x6F: {l: {0x72: {l: {0x74: {l: {0x69: {l: {0x6F: {l: {0x6E: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8733]}}}}}, 0x3B: {c: [8759]}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119979]}}}}}, 0x69: {l: {0x3B: {c: [936]}}}}}}},
- 0x51: {l: {0x66: {l: {0x72: {l: {0x3B: {c: [120084]}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [8474]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119980]}}}}}}}, 0x55: {l: {0x4F: {l: {0x54: {l: {0x3B: {c: [34]}}, c: [34]}}}}}}},
- 0x71: {l: {0x66: {l: {0x72: {l: {0x3B: {c: [120110]}}}}}, 0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10764]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120162]}}}}}}}, 0x70: {l: {0x72: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x3B: {c: [8279]}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120006]}}}}}}}, 0x75: {l: {0x61: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x6E: {l: {0x69: {l: {0x6F: {l: {0x6E: {l: {0x73: {l: {0x3B: {c: [8461]}}}}}}}}}}}}}}}, 0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10774]}}}}}}}}}}}, 0x65: {l: {0x73: {l: {0x74: {l: {0x3B: {c: [63]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8799]}}}}}}}}}}}, 0x6F: {l: {0x74: {l: {0x3B: {c: [34]}}, c: [34]}}}}}}},
- 0x72: {l: {0x41: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8667]}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8658]}}}}}, 0x74: {l: {0x61: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [10524]}}}}}}}}}}}, 0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8765, 817]}}}, 0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [341]}}}}}}}}}, 0x64: {l: {0x69: {l: {0x63: {l: {0x3B: {c: [8730]}}}}}}}, 0x65: {l: {0x6D: {l: {0x70: {l: {0x74: {l: {0x79: {l: {0x76: {l: {0x3B: {c: [10675]}}}}}}}}}}}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [10217]}, 0x64: {l: {0x3B: {c: [10642]}}}, 0x65: {l: {0x3B: {c: [10661]}}}, 0x6C: {l: {0x65: {l: {0x3B: {c: [10217]}}}}}}}}}, 0x71: {l: {0x75: {l: {0x6F: {l: {0x3B: {c: [187]}}, c: [187]}}}}}, 0x72: {l: {0x72: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10613]}}}}}, 0x62: {l: {0x3B: {c: [8677]}, 0x66: {l: {0x73: {l: {0x3B: {c: [10528]}}}}}}}, 0x63: {l: {0x3B: {c: [10547]}}}, 0x3B: {c: [8594]}, 0x66: {l: {0x73: {l: {0x3B: {c: [10526]}}}}}, 0x68: {l: {0x6B: {l: {0x3B: {c: [8618]}}}}}, 0x6C: {l: {0x70: {l: {0x3B: {c: [8620]}}}}}, 0x70: {l: {0x6C: {l: {0x3B: {c: [10565]}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [10612]}}}}}}}, 0x74: {l: {0x6C: {l: {0x3B: {c: [8611]}}}}}, 0x77: {l: {0x3B: {c: [8605]}}}}}}}, 0x74: {l: {0x61: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [10522]}}}}}}}, 0x69: {l: {0x6F: {l: {0x3B: {c: [8758]}, 0x6E: {l: {0x61: {l: {0x6C: {l: {0x73: {l: {0x3B: {c: [8474]}}}}}}}}}}}}}}}}}, 0x62: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10509]}}}}}}}, 0x62: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [10099]}}}}}}}, 0x72: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [125]}}}, 0x6B: {l: {0x3B: {c: [93]}}}}}}}, 0x6B: {l: {0x65: {l: {0x3B: {c: [10636]}}}, 0x73: {l: {0x6C: {l: {0x64: {l: {0x3B: {c: [10638]}}}, 0x75: {l: {0x3B: {c: [10640]}}}}}}}}}}}}}, 0x42: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10511]}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [345]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [343]}}}}}}}, 0x69: {l: {0x6C: {l: {0x3B: {c: [8969]}}}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [125]}}}}}, 0x79: {l: {0x3B: {c: [1088]}}}}}, 0x64: {l: {0x63: {l: {0x61: {l: {0x3B: {c: [10551]}}}}}, 0x6C: {l: {0x64: {l: {0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10601]}}}}}}}}}}}, 0x71: {l: {0x75: {l: {0x6F: {l: {0x3B: {c: [8221]}, 0x72: {l: {0x3B: {c: [8221]}}}}}}}}}, 0x73: {l: {0x68: {l: {0x3B: {c: [8627]}}}}}}}, 0x65: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8476]}, 0x69: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [8475]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x74: {l: {0x3B: {c: [8476]}}}}}}}}}, 0x73: {l: {0x3B: {c: [8477]}}}}}}}, 0x63: {l: {0x74: {l: {0x3B: {c: [9645]}}}}}, 0x67: {l: {0x3B: {c: [174]}}, c: [174]}}}, 0x66: {l: {0x69: {l: {0x73: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [10621]}}}}}}}}}, 0x6C: {l: {0x6F: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [8971]}}}}}}}}}, 0x72: {l: {0x3B: {c: [120111]}}}}}, 0x48: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10596]}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x64: {l: {0x3B: {c: [8641]}}}, 0x75: {l: {0x3B: {c: [8640]}, 0x6C: {l: {0x3B: {c: [10604]}}}}}}}}}, 0x6F: {l: {0x3B: {c: [961]}, 0x76: {l: {0x3B: {c: [1009]}}}}}}}, 0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8594]}, 0x74: {l: {0x61: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [8611]}}}}}}}}}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x70: {l: {0x6F: {l: {0x6F: {l: {0x6E: {l: {0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x3B: {c: [8641]}}}}}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [8640]}}}}}}}}}}}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x73: {l: {0x3B: {c: [8644]}}}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x70: {l: {0x6F: {l: {0x6F: {l: {0x6E: {l: {0x73: {l: {0x3B: {c: [8652]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x73: {l: {0x3B: {c: [8649]}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x71: {l: {0x75: {l: {0x69: {l: {0x67: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8605]}}}}}}}}}}}}}}}}}}}}}, 0x74: {l: {0x68: {l: {0x72: {l: {0x65: {l: {0x65: {l: {0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8908]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [730]}}}}}, 0x73: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x73: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8787]}}}}}}}}}}}}}}}}}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8644]}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8652]}}}}}}}, 0x6D: {l: {0x3B: {c: [8207]}}}}}, 0x6D: {l: {0x6F: {l: {0x75: {l: {0x73: {l: {0x74: {l: {0x61: {l: {0x63: {l: {0x68: {l: {0x65: {l: {0x3B: {c: [9137]}}}}}}}}}, 0x3B: {c: [9137]}}}}}}}}}}}, 0x6E: {l: {0x6D: {l: {0x69: {l: {0x64: {l: {0x3B: {c: [10990]}}}}}}}}}, 0x6F: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [10221]}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8702]}}}}}}}, 0x62: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [10215]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10630]}}}}}, 0x66: {l: {0x3B: {c: [120163]}}}, 0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10798]}}}}}}}}}, 0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [10805]}}}}}}}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [41]}, 0x67: {l: {0x74: {l: {0x3B: {c: [10644]}}}}}}}}}, 0x70: {l: {0x6F: {l: {0x6C: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10770]}}}}}}}}}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8649]}}}}}}}}}, 0x73: {l: {0x61: {l: {0x71: {l: {0x75: {l: {0x6F: {l: {0x3B: {c: [8250]}}}}}}}}}, 0x63: {l: {0x72: {l: {0x3B: {c: [120007]}}}}}, 0x68: {l: {0x3B: {c: [8625]}}}, 0x71: {l: {0x62: {l: {0x3B: {c: [93]}}}, 0x75: {l: {0x6F: {l: {0x3B: {c: [8217]}, 0x72: {l: {0x3B: {c: [8217]}}}}}}}}}}}, 0x74: {l: {0x68: {l: {0x72: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [8908]}}}}}}}}}, 0x69: {l: {0x6D: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [8906]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x3B: {c: [9657]}, 0x65: {l: {0x3B: {c: [8885]}}}, 0x66: {l: {0x3B: {c: [9656]}}}, 0x6C: {l: {0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [10702]}}}}}}}}}}}}}}}, 0x75: {l: {0x6C: {l: {0x75: {l: {0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10600]}}}}}}}}}}}}}, 0x78: {l: {0x3B: {c: [8478]}}}}},
- 0x52: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [340]}}}}}}}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [10219]}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8608]}, 0x74: {l: {0x6C: {l: {0x3B: {c: [10518]}}}}}}}}}}}, 0x42: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10512]}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [344]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [342]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1056]}}}}}, 0x65: {l: {0x3B: {c: [8476]}, 0x76: {l: {0x65: {l: {0x72: {l: {0x73: {l: {0x65: {l: {0x45: {l: {0x6C: {l: {0x65: {l: {0x6D: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [8715]}}}}}}}}}}}}}, 0x71: {l: {0x75: {l: {0x69: {l: {0x6C: {l: {0x69: {l: {0x62: {l: {0x72: {l: {0x69: {l: {0x75: {l: {0x6D: {l: {0x3B: {c: [8651]}}}}}}}}}}}}}}}}}}}}}}}, 0x55: {l: {0x70: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x69: {l: {0x6C: {l: {0x69: {l: {0x62: {l: {0x72: {l: {0x69: {l: {0x75: {l: {0x6D: {l: {0x3B: {c: [10607]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x45: {l: {0x47: {l: {0x3B: {c: [174]}}, c: [174]}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [8476]}}}}}, 0x68: {l: {0x6F: {l: {0x3B: {c: [929]}}}}}, 0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x42: {l: {0x72: {l: {0x61: {l: {0x63: {l: {0x6B: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [10217]}}}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8677]}}}}}}}, 0x3B: {c: [8594]}, 0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8644]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8658]}}}}}}}}}}}, 0x43: {l: {0x65: {l: {0x69: {l: {0x6C: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [8969]}}}}}}}}}}}}}}}, 0x44: {l: {0x6F: {l: {0x75: {l: {0x62: {l: {0x6C: {l: {0x65: {l: {0x42: {l: {0x72: {l: {0x61: {l: {0x63: {l: {0x6B: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [10215]}}}}}}}}}}}}}}}}}}}}}}}, 0x77: {l: {0x6E: {l: {0x54: {l: {0x65: {l: {0x65: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10589]}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10581]}}}}}}}, 0x3B: {c: [8642]}}}}}}}}}}}}}}}}}}}}}, 0x46: {l: {0x6C: {l: {0x6F: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [8971]}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8614]}}}}}}}}}}}, 0x3B: {c: [8866]}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10587]}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10704]}}}}}}}, 0x3B: {c: [8883]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8885]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x55: {l: {0x70: {l: {0x44: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10575]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10588]}}}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10580]}}}}}}}, 0x3B: {c: [8638]}}}}}}}}}}}}}}}}}, 0x56: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10579]}}}}}}}, 0x3B: {c: [8640]}}}}}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [8477]}}}}}, 0x75: {l: {0x6E: {l: {0x64: {l: {0x49: {l: {0x6D: {l: {0x70: {l: {0x6C: {l: {0x69: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [10608]}}}}}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8667]}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [8475]}}}}}, 0x68: {l: {0x3B: {c: [8625]}}}}}, 0x75: {l: {0x6C: {l: {0x65: {l: {0x44: {l: {0x65: {l: {0x6C: {l: {0x61: {l: {0x79: {l: {0x65: {l: {0x64: {l: {0x3B: {c: [10740]}}}}}}}}}}}}}}}}}}}}}}},
- 0x53: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [346]}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [352]}}}}}}}}}, 0x3B: {c: [10940]}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [350]}}}}}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [348]}}}}}}}, 0x79: {l: {0x3B: {c: [1057]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120086]}}}}}, 0x48: {l: {0x43: {l: {0x48: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1065]}}}}}}}}}, 0x63: {l: {0x79: {l: {0x3B: {c: [1064]}}}}}}}, 0x68: {l: {0x6F: {l: {0x72: {l: {0x74: {l: {0x44: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8595]}}}}}}}}}}}}}}}}}}}, 0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8592]}}}}}}}}}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8594]}}}}}}}}}}}}}}}}}}}}}, 0x55: {l: {0x70: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8593]}}}}}}}}}}}}}}}}}}}}}}}, 0x69: {l: {0x67: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [931]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x43: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [8728]}}}}}}}}}}}}}}}}}}}}}, 0x4F: {l: {0x46: {l: {0x54: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1068]}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120138]}}}}}}}, 0x71: {l: {0x72: {l: {0x74: {l: {0x3B: {c: [8730]}}}}}, 0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [9633]}, 0x49: {l: {0x6E: {l: {0x74: {l: {0x65: {l: {0x72: {l: {0x73: {l: {0x65: {l: {0x63: {l: {0x74: {l: {0x69: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8851]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x53: {l: {0x75: {l: {0x62: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8847]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8849]}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x65: {l: {0x72: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8848]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8850]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x55: {l: {0x6E: {l: {0x69: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8852]}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119982]}}}}}}}, 0x74: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8902]}}}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [8912]}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8912]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8838]}}}}}}}}}}}}}}}}}}}, 0x63: {l: {0x63: {l: {0x65: {l: {0x65: {l: {0x64: {l: {0x73: {l: {0x3B: {c: [8827]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [10928]}}}}}}}}}}}, 0x53: {l: {0x6C: {l: {0x61: {l: {0x6E: {l: {0x74: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8829]}}}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8831]}}}}}}}}}}}}}}}}}}}}}, 0x68: {l: {0x54: {l: {0x68: {l: {0x61: {l: {0x74: {l: {0x3B: {c: [8715]}}}}}}}}}}}}}, 0x6D: {l: {0x3B: {c: [8721]}}}, 0x70: {l: {0x3B: {c: [8913]}, 0x65: {l: {0x72: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8835]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8839]}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8913]}}}}}}}}}}}}},
- 0x73: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [347]}}}}}}}}}}}, 0x62: {l: {0x71: {l: {0x75: {l: {0x6F: {l: {0x3B: {c: [8218]}}}}}}}}}, 0x63: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10936]}}}, 0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [353]}}}}}}}}}, 0x3B: {c: [8827]}, 0x63: {l: {0x75: {l: {0x65: {l: {0x3B: {c: [8829]}}}}}}}, 0x65: {l: {0x3B: {c: [10928]}, 0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [351]}}}}}}}}}, 0x45: {l: {0x3B: {c: [10932]}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [349]}}}}}}}, 0x6E: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10938]}}}}}, 0x45: {l: {0x3B: {c: [10934]}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8937]}}}}}}}}}, 0x70: {l: {0x6F: {l: {0x6C: {l: {0x69: {l: {0x6E: {l: {0x74: {l: {0x3B: {c: [10771]}}}}}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8831]}}}}}}}, 0x79: {l: {0x3B: {c: [1089]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x62: {l: {0x3B: {c: [8865]}}}, 0x3B: {c: [8901]}, 0x65: {l: {0x3B: {c: [10854]}}}}}}}}}, 0x65: {l: {0x61: {l: {0x72: {l: {0x68: {l: {0x6B: {l: {0x3B: {c: [10533]}}}}}, 0x72: {l: {0x3B: {c: [8600]}, 0x6F: {l: {0x77: {l: {0x3B: {c: [8600]}}}}}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8664]}}}}}}}, 0x63: {l: {0x74: {l: {0x3B: {c: [167]}}, c: [167]}}}, 0x6D: {l: {0x69: {l: {0x3B: {c: [59]}}}}}, 0x73: {l: {0x77: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10537]}}}}}}}}}, 0x74: {l: {0x6D: {l: {0x69: {l: {0x6E: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8726]}}}}}}}}}, 0x6E: {l: {0x3B: {c: [8726]}}}}}}}, 0x78: {l: {0x74: {l: {0x3B: {c: [10038]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120112]}, 0x6F: {l: {0x77: {l: {0x6E: {l: {0x3B: {c: [8994]}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x70: {l: {0x3B: {c: [9839]}}}}}}}, 0x63: {l: {0x68: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1097]}}}}}}}, 0x79: {l: {0x3B: {c: [1096]}}}}}, 0x6F: {l: {0x72: {l: {0x74: {l: {0x6D: {l: {0x69: {l: {0x64: {l: {0x3B: {c: [8739]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x65: {l: {0x6C: {l: {0x3B: {c: [8741]}}}}}}}}}}}}}}}}}}}}}}}, 0x79: {l: {0x3B: {c: [173]}}, c: [173]}}}, 0x69: {l: {0x67: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [963]}, 0x66: {l: {0x3B: {c: [962]}}}, 0x76: {l: {0x3B: {c: [962]}}}}}}}}}, 0x6D: {l: {0x3B: {c: [8764]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10858]}}}}}}}, 0x65: {l: {0x3B: {c: [8771]}, 0x71: {l: {0x3B: {c: [8771]}}}}}, 0x67: {l: {0x3B: {c: [10910]}, 0x45: {l: {0x3B: {c: [10912]}}}}}, 0x6C: {l: {0x3B: {c: [10909]}, 0x45: {l: {0x3B: {c: [10911]}}}}}, 0x6E: {l: {0x65: {l: {0x3B: {c: [8774]}}}}}, 0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10788]}}}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10610]}}}}}}}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8592]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x6C: {l: {0x6C: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x6D: {l: {0x69: {l: {0x6E: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8726]}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x68: {l: {0x70: {l: {0x3B: {c: [10803]}}}}}}}}}, 0x65: {l: {0x70: {l: {0x61: {l: {0x72: {l: {0x73: {l: {0x6C: {l: {0x3B: {c: [10724]}}}}}}}}}}}}}, 0x69: {l: {0x64: {l: {0x3B: {c: [8739]}}}, 0x6C: {l: {0x65: {l: {0x3B: {c: [8995]}}}}}}}, 0x74: {l: {0x3B: {c: [10922]}, 0x65: {l: {0x3B: {c: [10924]}, 0x73: {l: {0x3B: {c: [10924, 65024]}}}}}}}}}, 0x6F: {l: {0x66: {l: {0x74: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1100]}}}}}}}}}, 0x6C: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [9023]}}}}}, 0x3B: {c: [10692]}}}, 0x3B: {c: [47]}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120164]}}}}}}}, 0x70: {l: {0x61: {l: {0x64: {l: {0x65: {l: {0x73: {l: {0x3B: {c: [9824]}, 0x75: {l: {0x69: {l: {0x74: {l: {0x3B: {c: [9824]}}}}}}}}}}}}}, 0x72: {l: {0x3B: {c: [8741]}}}}}}}, 0x71: {l: {0x63: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8851]}, 0x73: {l: {0x3B: {c: [8851, 65024]}}}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [8852]}, 0x73: {l: {0x3B: {c: [8852, 65024]}}}}}}}}}, 0x73: {l: {0x75: {l: {0x62: {l: {0x3B: {c: [8847]}, 0x65: {l: {0x3B: {c: [8849]}}}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8847]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8849]}}}}}}}}}}}}}, 0x70: {l: {0x3B: {c: [8848]}, 0x65: {l: {0x3B: {c: [8850]}}}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8848]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8850]}}}}}}}}}}}}}}}}}, 0x75: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [9633]}}}, 0x66: {l: {0x3B: {c: [9642]}}}}}}}, 0x3B: {c: [9633]}, 0x66: {l: {0x3B: {c: [9642]}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8594]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120008]}}}}}, 0x65: {l: {0x74: {l: {0x6D: {l: {0x6E: {l: {0x3B: {c: [8726]}}}}}}}}}, 0x6D: {l: {0x69: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [8995]}}}}}}}}}, 0x74: {l: {0x61: {l: {0x72: {l: {0x66: {l: {0x3B: {c: [8902]}}}}}}}}}}}, 0x74: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [9734]}, 0x66: {l: {0x3B: {c: [9733]}}}}}}}, 0x72: {l: {0x61: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x65: {l: {0x70: {l: {0x73: {l: {0x69: {l: {0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [1013]}}}}}}}}}}}}}}}, 0x70: {l: {0x68: {l: {0x69: {l: {0x3B: {c: [981]}}}}}}}}}}}}}}}}}, 0x6E: {l: {0x73: {l: {0x3B: {c: [175]}}}}}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [8834]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10941]}}}}}}}, 0x45: {l: {0x3B: {c: [10949]}}}, 0x65: {l: {0x3B: {c: [8838]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10947]}}}}}}}}}, 0x6D: {l: {0x75: {l: {0x6C: {l: {0x74: {l: {0x3B: {c: [10945]}}}}}}}}}, 0x6E: {l: {0x45: {l: {0x3B: {c: [10955]}}}, 0x65: {l: {0x3B: {c: [8842]}}}}}, 0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10943]}}}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10617]}}}}}}}}}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8834]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8838]}, 0x71: {l: {0x3B: {c: [10949]}}}}}}}, 0x6E: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8842]}, 0x71: {l: {0x3B: {c: [10955]}}}}}}}}}}}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [10951]}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [10965]}}}, 0x70: {l: {0x3B: {c: [10963]}}}}}}}}}, 0x63: {l: {0x63: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10936]}}}}}}}}}}}}}, 0x3B: {c: [8827]}, 0x63: {l: {0x75: {l: {0x72: {l: {0x6C: {l: {0x79: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8829]}}}}}}}}}}}}}}}, 0x65: {l: {0x71: {l: {0x3B: {c: [10928]}}}}}, 0x6E: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [10938]}}}}}}}}}}}}}, 0x65: {l: {0x71: {l: {0x71: {l: {0x3B: {c: [10934]}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8937]}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8831]}}}}}}}}}}}, 0x6D: {l: {0x3B: {c: [8721]}}}, 0x6E: {l: {0x67: {l: {0x3B: {c: [9834]}}}}}, 0x70: {l: {0x31: {l: {0x3B: {c: [185]}}, c: [185]}, 0x32: {l: {0x3B: {c: [178]}}, c: [178]}, 0x33: {l: {0x3B: {c: [179]}}, c: [179]}, 0x3B: {c: [8835]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10942]}}}}}, 0x73: {l: {0x75: {l: {0x62: {l: {0x3B: {c: [10968]}}}}}}}}}, 0x45: {l: {0x3B: {c: [10950]}}}, 0x65: {l: {0x3B: {c: [8839]}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10948]}}}}}}}}}, 0x68: {l: {0x73: {l: {0x6F: {l: {0x6C: {l: {0x3B: {c: [10185]}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [10967]}}}}}}}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10619]}}}}}}}}}, 0x6D: {l: {0x75: {l: {0x6C: {l: {0x74: {l: {0x3B: {c: [10946]}}}}}}}}}, 0x6E: {l: {0x45: {l: {0x3B: {c: [10956]}}}, 0x65: {l: {0x3B: {c: [8843]}}}}}, 0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10944]}}}}}}}}}, 0x73: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8835]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8839]}, 0x71: {l: {0x3B: {c: [10950]}}}}}}}, 0x6E: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8843]}, 0x71: {l: {0x3B: {c: [10956]}}}}}}}}}}}}}, 0x69: {l: {0x6D: {l: {0x3B: {c: [10952]}}}}}, 0x75: {l: {0x62: {l: {0x3B: {c: [10964]}}}, 0x70: {l: {0x3B: {c: [10966]}}}}}}}}}}}, 0x77: {l: {0x61: {l: {0x72: {l: {0x68: {l: {0x6B: {l: {0x3B: {c: [10534]}}}}}, 0x72: {l: {0x3B: {c: [8601]}, 0x6F: {l: {0x77: {l: {0x3B: {c: [8601]}}}}}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8665]}}}}}}}, 0x6E: {l: {0x77: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10538]}}}}}}}}}}}, 0x7A: {l: {0x6C: {l: {0x69: {l: {0x67: {l: {0x3B: {c: [223]}}, c: [223]}}}}}}}}},
- 0x54: {l: {0x61: {l: {0x62: {l: {0x3B: {c: [9]}}}, 0x75: {l: {0x3B: {c: [932]}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [356]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [354]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1058]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120087]}}}}}, 0x68: {l: {0x65: {l: {0x72: {l: {0x65: {l: {0x66: {l: {0x6F: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [8756]}}}}}}}}}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [920]}}}}}}}, 0x69: {l: {0x63: {l: {0x6B: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8287, 8202]}}}}}}}}}}}}}}}, 0x6E: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8201]}}}}}}}}}}}}}}}}}, 0x48: {l: {0x4F: {l: {0x52: {l: {0x4E: {l: {0x3B: {c: [222]}}, c: [222]}}}}}}}, 0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8764]}, 0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8771]}}}}}}}}}}}, 0x46: {l: {0x75: {l: {0x6C: {l: {0x6C: {l: {0x45: {l: {0x71: {l: {0x75: {l: {0x61: {l: {0x6C: {l: {0x3B: {c: [8773]}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8776]}}}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120139]}}}}}}}, 0x52: {l: {0x41: {l: {0x44: {l: {0x45: {l: {0x3B: {c: [8482]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x70: {l: {0x6C: {l: {0x65: {l: {0x44: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8411]}}}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119983]}}}}}, 0x74: {l: {0x72: {l: {0x6F: {l: {0x6B: {l: {0x3B: {c: [358]}}}}}}}}}}}, 0x53: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1062]}}}}}, 0x48: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1035]}}}}}}}}}}},
- 0x74: {l: {0x61: {l: {0x72: {l: {0x67: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [8982]}}}}}}}}}, 0x75: {l: {0x3B: {c: [964]}}}}}, 0x62: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [9140]}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [357]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x69: {l: {0x6C: {l: {0x3B: {c: [355]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1090]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8411]}}}}}}}, 0x65: {l: {0x6C: {l: {0x72: {l: {0x65: {l: {0x63: {l: {0x3B: {c: [8981]}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120113]}}}}}, 0x68: {l: {0x65: {l: {0x72: {l: {0x65: {l: {0x34: {l: {0x3B: {c: [8756]}}}, 0x66: {l: {0x6F: {l: {0x72: {l: {0x65: {l: {0x3B: {c: [8756]}}}}}}}}}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [952]}, 0x73: {l: {0x79: {l: {0x6D: {l: {0x3B: {c: [977]}}}}}}}, 0x76: {l: {0x3B: {c: [977]}}}}}}}}}, 0x69: {l: {0x63: {l: {0x6B: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x72: {l: {0x6F: {l: {0x78: {l: {0x3B: {c: [8776]}}}}}}}}}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8764]}}}}}}}}}}}, 0x6E: {l: {0x73: {l: {0x70: {l: {0x3B: {c: [8201]}}}}}}}}}, 0x6B: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8776]}}}}}, 0x73: {l: {0x69: {l: {0x6D: {l: {0x3B: {c: [8764]}}}}}}}}}, 0x6F: {l: {0x72: {l: {0x6E: {l: {0x3B: {c: [254]}}, c: [254]}}}}}}}, 0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [732]}}}}}}}, 0x6D: {l: {0x65: {l: {0x73: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10801]}}}}}, 0x3B: {c: [8864]}}}, 0x3B: {c: [215]}, 0x64: {l: {0x3B: {c: [10800]}}}}, c: [215]}}}}}, 0x6E: {l: {0x74: {l: {0x3B: {c: [8749]}}}}}}}, 0x6F: {l: {0x65: {l: {0x61: {l: {0x3B: {c: [10536]}}}}}, 0x70: {l: {0x62: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [9014]}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10993]}}}}}}}, 0x3B: {c: [8868]}, 0x66: {l: {0x3B: {c: [120165]}, 0x6F: {l: {0x72: {l: {0x6B: {l: {0x3B: {c: [10970]}}}}}}}}}}}, 0x73: {l: {0x61: {l: {0x3B: {c: [10537]}}}}}}}, 0x70: {l: {0x72: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x3B: {c: [8244]}}}}}}}}}}}, 0x72: {l: {0x61: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8482]}}}}}}}, 0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [9653]}, 0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x3B: {c: [9663]}}}}}}}}}, 0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [9667]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8884]}}}}}}}}}}}}}, 0x71: {l: {0x3B: {c: [8796]}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [9657]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8885]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [9708]}}}}}}}, 0x65: {l: {0x3B: {c: [8796]}}}, 0x6D: {l: {0x69: {l: {0x6E: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10810]}}}}}}}}}}}, 0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10809]}}}}}}}}}, 0x73: {l: {0x62: {l: {0x3B: {c: [10701]}}}}}, 0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x3B: {c: [10811]}}}}}}}}}}}, 0x70: {l: {0x65: {l: {0x7A: {l: {0x69: {l: {0x75: {l: {0x6D: {l: {0x3B: {c: [9186]}}}}}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120009]}}}, 0x79: {l: {0x3B: {c: [1094]}}}}}, 0x68: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1115]}}}}}}}, 0x74: {l: {0x72: {l: {0x6F: {l: {0x6B: {l: {0x3B: {c: [359]}}}}}}}}}}}, 0x77: {l: {0x69: {l: {0x78: {l: {0x74: {l: {0x3B: {c: [8812]}}}}}}}, 0x6F: {l: {0x68: {l: {0x65: {l: {0x61: {l: {0x64: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8606]}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8608]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},
- 0x55: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [218]}}, c: [218]}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8607]}, 0x6F: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x3B: {c: [10569]}}}}}}}}}}}}}}}, 0x62: {l: {0x72: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1038]}}}}}, 0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [364]}}}}}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [219]}}, c: [219]}}}}}, 0x79: {l: {0x3B: {c: [1059]}}}}}, 0x64: {l: {0x62: {l: {0x6C: {l: {0x61: {l: {0x63: {l: {0x3B: {c: [368]}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120088]}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [217]}}, c: [217]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [362]}}}}}}}}}, 0x6E: {l: {0x64: {l: {0x65: {l: {0x72: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [95]}}}}}, 0x72: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [9183]}}}, 0x6B: {l: {0x65: {l: {0x74: {l: {0x3B: {c: [9141]}}}}}}}}}}}}}}}, 0x50: {l: {0x61: {l: {0x72: {l: {0x65: {l: {0x6E: {l: {0x74: {l: {0x68: {l: {0x65: {l: {0x73: {l: {0x69: {l: {0x73: {l: {0x3B: {c: [9181]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x69: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [8899]}, 0x50: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8846]}}}}}}}}}}}}}}}}}, 0x6F: {l: {0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [370]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120140]}}}}}}}, 0x70: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10514]}}}}}}}, 0x3B: {c: [8593]}, 0x44: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8645]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8657]}}}}}}}}}}}, 0x44: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8597]}}}}}}}}}}}}}}}}}}}, 0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8661]}}}}}}}}}}}}}}}}}}}, 0x45: {l: {0x71: {l: {0x75: {l: {0x69: {l: {0x6C: {l: {0x69: {l: {0x62: {l: {0x72: {l: {0x69: {l: {0x75: {l: {0x6D: {l: {0x3B: {c: [10606]}}}}}}}}}}}}}}}}}}}}}}}, 0x70: {l: {0x65: {l: {0x72: {l: {0x4C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8598]}}}}}}}}}}}}}}}}}}}, 0x52: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8599]}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x73: {l: {0x69: {l: {0x3B: {c: [978]}, 0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [933]}}}}}}}}}}}, 0x54: {l: {0x65: {l: {0x65: {l: {0x41: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8613]}}}}}}}}}}}, 0x3B: {c: [8869]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [366]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119984]}}}}}}}, 0x74: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [360]}}}}}}}}}}}, 0x75: {l: {0x6D: {l: {0x6C: {l: {0x3B: {c: [220]}}, c: [220]}}}}}}},
- 0x75: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [250]}}, c: [250]}}}}}}}, 0x72: {l: {0x72: {l: {0x3B: {c: [8593]}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8657]}}}}}}}, 0x62: {l: {0x72: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1118]}}}}}, 0x65: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [365]}}}}}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [251]}}, c: [251]}}}}}, 0x79: {l: {0x3B: {c: [1091]}}}}}, 0x64: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8645]}}}}}}}, 0x62: {l: {0x6C: {l: {0x61: {l: {0x63: {l: {0x3B: {c: [369]}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10606]}}}}}}}}}, 0x66: {l: {0x69: {l: {0x73: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [10622]}}}}}}}}}, 0x72: {l: {0x3B: {c: [120114]}}}}}, 0x67: {l: {0x72: {l: {0x61: {l: {0x76: {l: {0x65: {l: {0x3B: {c: [249]}}, c: [249]}}}}}}}}}, 0x48: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10595]}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x6C: {l: {0x3B: {c: [8639]}}}, 0x72: {l: {0x3B: {c: [8638]}}}}}}}, 0x62: {l: {0x6C: {l: {0x6B: {l: {0x3B: {c: [9600]}}}}}}}}}, 0x6C: {l: {0x63: {l: {0x6F: {l: {0x72: {l: {0x6E: {l: {0x3B: {c: [8988]}, 0x65: {l: {0x72: {l: {0x3B: {c: [8988]}}}}}}}}}}}, 0x72: {l: {0x6F: {l: {0x70: {l: {0x3B: {c: [8975]}}}}}}}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [9720]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [363]}}}}}}}, 0x6C: {l: {0x3B: {c: [168]}}, c: [168]}}}, 0x6F: {l: {0x67: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [371]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120166]}}}}}}}, 0x70: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8593]}}}}}}}}}}}, 0x64: {l: {0x6F: {l: {0x77: {l: {0x6E: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x3B: {c: [8597]}}}}}}}}}}}}}}}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x70: {l: {0x6F: {l: {0x6F: {l: {0x6E: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [8639]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [8638]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [8846]}}}}}}}, 0x73: {l: {0x69: {l: {0x3B: {c: [965]}, 0x68: {l: {0x3B: {c: [978]}}}, 0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [965]}}}}}}}}}}}, 0x75: {l: {0x70: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x6F: {l: {0x77: {l: {0x73: {l: {0x3B: {c: [8648]}}}}}}}}}}}}}}}}}}}, 0x72: {l: {0x63: {l: {0x6F: {l: {0x72: {l: {0x6E: {l: {0x3B: {c: [8989]}, 0x65: {l: {0x72: {l: {0x3B: {c: [8989]}}}}}}}}}}}, 0x72: {l: {0x6F: {l: {0x70: {l: {0x3B: {c: [8974]}}}}}}}}}, 0x69: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [367]}}}}}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [9721]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120010]}}}}}}}, 0x74: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [8944]}}}}}}}, 0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [361]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x3B: {c: [9653]}, 0x66: {l: {0x3B: {c: [9652]}}}}}}}}}, 0x75: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8648]}}}}}}}, 0x6D: {l: {0x6C: {l: {0x3B: {c: [252]}}, c: [252]}}}}}, 0x77: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x3B: {c: [10663]}}}}}}}}}}}}}}},
- 0x76: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x72: {l: {0x74: {l: {0x3B: {c: [10652]}}}}}}}}}, 0x72: {l: {0x65: {l: {0x70: {l: {0x73: {l: {0x69: {l: {0x6C: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [1013]}}}}}}}}}}}}}}}, 0x6B: {l: {0x61: {l: {0x70: {l: {0x70: {l: {0x61: {l: {0x3B: {c: [1008]}}}}}}}}}}}, 0x6E: {l: {0x6F: {l: {0x74: {l: {0x68: {l: {0x69: {l: {0x6E: {l: {0x67: {l: {0x3B: {c: [8709]}}}}}}}}}}}}}}}, 0x70: {l: {0x68: {l: {0x69: {l: {0x3B: {c: [981]}}}}}, 0x69: {l: {0x3B: {c: [982]}}}, 0x72: {l: {0x6F: {l: {0x70: {l: {0x74: {l: {0x6F: {l: {0x3B: {c: [8733]}}}}}}}}}}}}}, 0x72: {l: {0x3B: {c: [8597]}, 0x68: {l: {0x6F: {l: {0x3B: {c: [1009]}}}}}}}, 0x73: {l: {0x69: {l: {0x67: {l: {0x6D: {l: {0x61: {l: {0x3B: {c: [962]}}}}}}}}}, 0x75: {l: {0x62: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x6E: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8842, 65024]}, 0x71: {l: {0x3B: {c: [10955, 65024]}}}}}}}}}}}}}}}}}, 0x70: {l: {0x73: {l: {0x65: {l: {0x74: {l: {0x6E: {l: {0x65: {l: {0x71: {l: {0x3B: {c: [8843, 65024]}, 0x71: {l: {0x3B: {c: [10956, 65024]}}}}}}}}}}}}}}}}}}}}}, 0x74: {l: {0x68: {l: {0x65: {l: {0x74: {l: {0x61: {l: {0x3B: {c: [977]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x61: {l: {0x6E: {l: {0x67: {l: {0x6C: {l: {0x65: {l: {0x6C: {l: {0x65: {l: {0x66: {l: {0x74: {l: {0x3B: {c: [8882]}}}}}}}}}, 0x72: {l: {0x69: {l: {0x67: {l: {0x68: {l: {0x74: {l: {0x3B: {c: [8883]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8661]}}}}}}}, 0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10984]}, 0x76: {l: {0x3B: {c: [10985]}}}}}}}}}, 0x63: {l: {0x79: {l: {0x3B: {c: [1074]}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8866]}}}}}}}}}, 0x44: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8872]}}}}}}}}}, 0x65: {l: {0x65: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8891]}}}}}}}, 0x3B: {c: [8744]}, 0x65: {l: {0x71: {l: {0x3B: {c: [8794]}}}}}}}, 0x6C: {l: {0x6C: {l: {0x69: {l: {0x70: {l: {0x3B: {c: [8942]}}}}}}}}}, 0x72: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [124]}}}}}}}, 0x74: {l: {0x3B: {c: [124]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120115]}}}}}, 0x6C: {l: {0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [8882]}}}}}}}}}, 0x6E: {l: {0x73: {l: {0x75: {l: {0x62: {l: {0x3B: {c: [8834, 8402]}}}, 0x70: {l: {0x3B: {c: [8835, 8402]}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120167]}}}}}}}, 0x70: {l: {0x72: {l: {0x6F: {l: {0x70: {l: {0x3B: {c: [8733]}}}}}}}}}, 0x72: {l: {0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [8883]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120011]}}}}}, 0x75: {l: {0x62: {l: {0x6E: {l: {0x45: {l: {0x3B: {c: [10955, 65024]}}}, 0x65: {l: {0x3B: {c: [8842, 65024]}}}}}}}, 0x70: {l: {0x6E: {l: {0x45: {l: {0x3B: {c: [10956, 65024]}}}, 0x65: {l: {0x3B: {c: [8843, 65024]}}}}}}}}}}}, 0x7A: {l: {0x69: {l: {0x67: {l: {0x7A: {l: {0x61: {l: {0x67: {l: {0x3B: {c: [10650]}}}}}}}}}}}}}}},
- 0x56: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10987]}}}}}}}, 0x63: {l: {0x79: {l: {0x3B: {c: [1042]}}}}}, 0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8873]}, 0x6C: {l: {0x3B: {c: [10982]}}}}}}}}}}}, 0x44: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8875]}}}}}}}}}, 0x65: {l: {0x65: {l: {0x3B: {c: [8897]}}}, 0x72: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8214]}}}}}}}, 0x74: {l: {0x3B: {c: [8214]}, 0x69: {l: {0x63: {l: {0x61: {l: {0x6C: {l: {0x42: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [8739]}}}}}}}, 0x4C: {l: {0x69: {l: {0x6E: {l: {0x65: {l: {0x3B: {c: [124]}}}}}}}}}, 0x53: {l: {0x65: {l: {0x70: {l: {0x61: {l: {0x72: {l: {0x61: {l: {0x74: {l: {0x6F: {l: {0x72: {l: {0x3B: {c: [10072]}}}}}}}}}}}}}}}}}}}, 0x54: {l: {0x69: {l: {0x6C: {l: {0x64: {l: {0x65: {l: {0x3B: {c: [8768]}}}}}}}}}}}}}}}}}}}}}, 0x79: {l: {0x54: {l: {0x68: {l: {0x69: {l: {0x6E: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8202]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120089]}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120141]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119985]}}}}}}}, 0x76: {l: {0x64: {l: {0x61: {l: {0x73: {l: {0x68: {l: {0x3B: {c: [8874]}}}}}}}}}}}}},
- 0x57: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [372]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x67: {l: {0x65: {l: {0x3B: {c: [8896]}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120090]}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120142]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119986]}}}}}}}}},
- 0x77: {l: {0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [373]}}}}}}}}}, 0x65: {l: {0x64: {l: {0x62: {l: {0x61: {l: {0x72: {l: {0x3B: {c: [10847]}}}}}}}, 0x67: {l: {0x65: {l: {0x3B: {c: [8743]}, 0x71: {l: {0x3B: {c: [8793]}}}}}}}}}, 0x69: {l: {0x65: {l: {0x72: {l: {0x70: {l: {0x3B: {c: [8472]}}}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120116]}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120168]}}}}}}}, 0x70: {l: {0x3B: {c: [8472]}}}, 0x72: {l: {0x3B: {c: [8768]}, 0x65: {l: {0x61: {l: {0x74: {l: {0x68: {l: {0x3B: {c: [8768]}}}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120012]}}}}}}}}},
- 0x78: {l: {0x63: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [8898]}}}}}, 0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [9711]}}}}}}}, 0x75: {l: {0x70: {l: {0x3B: {c: [8899]}}}}}}}, 0x64: {l: {0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [9661]}}}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120117]}}}}}, 0x68: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10231]}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10234]}}}}}}}}}, 0x69: {l: {0x3B: {c: [958]}}}, 0x6C: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10229]}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10232]}}}}}}}}}, 0x6D: {l: {0x61: {l: {0x70: {l: {0x3B: {c: [10236]}}}}}}}, 0x6E: {l: {0x69: {l: {0x73: {l: {0x3B: {c: [8955]}}}}}}}, 0x6F: {l: {0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [10752]}}}}}}}, 0x70: {l: {0x66: {l: {0x3B: {c: [120169]}}}, 0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10753]}}}}}}}}}, 0x74: {l: {0x69: {l: {0x6D: {l: {0x65: {l: {0x3B: {c: [10754]}}}}}}}}}}}, 0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10230]}}}}}}}, 0x41: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [10233]}}}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120013]}}}}}, 0x71: {l: {0x63: {l: {0x75: {l: {0x70: {l: {0x3B: {c: [10758]}}}}}}}}}}}, 0x75: {l: {0x70: {l: {0x6C: {l: {0x75: {l: {0x73: {l: {0x3B: {c: [10756]}}}}}}}}}, 0x74: {l: {0x72: {l: {0x69: {l: {0x3B: {c: [9651]}}}}}}}}}, 0x76: {l: {0x65: {l: {0x65: {l: {0x3B: {c: [8897]}}}}}}}, 0x77: {l: {0x65: {l: {0x64: {l: {0x67: {l: {0x65: {l: {0x3B: {c: [8896]}}}}}}}}}}}}},
- 0x58: {l: {0x66: {l: {0x72: {l: {0x3B: {c: [120091]}}}}}, 0x69: {l: {0x3B: {c: [926]}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120143]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119987]}}}}}}}}},
- 0x59: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [221]}}, c: [221]}}}}}}}}}, 0x41: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1071]}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [374]}}}}}}}, 0x79: {l: {0x3B: {c: [1067]}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120092]}}}}}, 0x49: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1031]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120144]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119988]}}}}}}}, 0x55: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1070]}}}}}}}, 0x75: {l: {0x6D: {l: {0x6C: {l: {0x3B: {c: [376]}}}}}}}}},
- 0x79: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [253]}}, c: [253]}}}}}, 0x79: {l: {0x3B: {c: [1103]}}}}}}}, 0x63: {l: {0x69: {l: {0x72: {l: {0x63: {l: {0x3B: {c: [375]}}}}}}}, 0x79: {l: {0x3B: {c: [1099]}}}}}, 0x65: {l: {0x6E: {l: {0x3B: {c: [165]}}, c: [165]}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120118]}}}}}, 0x69: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1111]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120170]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120014]}}}}}}}, 0x75: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1102]}}}}}, 0x6D: {l: {0x6C: {l: {0x3B: {c: [255]}}, c: [255]}}}}}}},
- 0x5A: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [377]}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [381]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1047]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [379]}}}}}}}, 0x65: {l: {0x72: {l: {0x6F: {l: {0x57: {l: {0x69: {l: {0x64: {l: {0x74: {l: {0x68: {l: {0x53: {l: {0x70: {l: {0x61: {l: {0x63: {l: {0x65: {l: {0x3B: {c: [8203]}}}}}}}}}}}}}}}}}}}}}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [918]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [8488]}}}}}, 0x48: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1046]}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [8484]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [119989]}}}}}}}}},
- 0x7A: {l: {0x61: {l: {0x63: {l: {0x75: {l: {0x74: {l: {0x65: {l: {0x3B: {c: [378]}}}}}}}}}}}, 0x63: {l: {0x61: {l: {0x72: {l: {0x6F: {l: {0x6E: {l: {0x3B: {c: [382]}}}}}}}}}, 0x79: {l: {0x3B: {c: [1079]}}}}}, 0x64: {l: {0x6F: {l: {0x74: {l: {0x3B: {c: [380]}}}}}}}, 0x65: {l: {0x65: {l: {0x74: {l: {0x72: {l: {0x66: {l: {0x3B: {c: [8488]}}}}}}}}}, 0x74: {l: {0x61: {l: {0x3B: {c: [950]}}}}}}}, 0x66: {l: {0x72: {l: {0x3B: {c: [120119]}}}}}, 0x68: {l: {0x63: {l: {0x79: {l: {0x3B: {c: [1078]}}}}}}}, 0x69: {l: {0x67: {l: {0x72: {l: {0x61: {l: {0x72: {l: {0x72: {l: {0x3B: {c: [8669]}}}}}}}}}}}}}, 0x6F: {l: {0x70: {l: {0x66: {l: {0x3B: {c: [120171]}}}}}}}, 0x73: {l: {0x63: {l: {0x72: {l: {0x3B: {c: [120015]}}}}}}}, 0x77: {l: {0x6A: {l: {0x3B: {c: [8205]}}}, 0x6E: {l: {0x6A: {l: {0x3B: {c: [8204]}}}}}}}}}
-};
-},{}],91:[function(require,module,exports){
-'use strict';
-
-var UNICODE = require('../common/unicode');
-
-//Aliases
-var $ = UNICODE.CODE_POINTS;
-
-//Utils
-
-//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline
-//this functions if they will be situated in another module due to context switch.
-//Always perform inlining check before modifying this functions ('node --trace-inlining').
-function isReservedCodePoint(cp) {
- return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF;
-}
-
-function isSurrogatePair(cp1, cp2) {
- return cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF;
-}
-
-function getSurrogatePairCodePoint(cp1, cp2) {
- return (cp1 - 0xD800) * 0x400 + 0x2400 + cp2;
-}
-
-//Preprocessor
-//NOTE: HTML input preprocessing
-//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#preprocessing-the-input-stream)
-var Preprocessor = module.exports = function (html) {
- this.write(html);
-
- //NOTE: one leading U+FEFF BYTE ORDER MARK character must be ignored if any are present in the input stream.
- this.pos = this.html.charCodeAt(0) === $.BOM ? 0 : -1;
-
- this.gapStack = [];
- this.lastGapPos = -1;
- this.skipNextNewLine = false;
-};
-
-Preprocessor.prototype.write = function (html) {
- if (this.html) {
- this.html = this.html.substring(0, this.pos + 1) +
- html +
- this.html.substring(this.pos + 1, this.html.length);
-
- }
- else
- this.html = html;
-
-
- this.lastCharPos = this.html.length - 1;
-};
-
-Preprocessor.prototype.advanceAndPeekCodePoint = function () {
- this.pos++;
-
- if (this.pos > this.lastCharPos)
- return $.EOF;
-
- var cp = this.html.charCodeAt(this.pos);
-
- //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character
- //must be ignored.
- if (this.skipNextNewLine && cp === $.LINE_FEED) {
- this.skipNextNewLine = false;
- this._addGap();
- return this.advanceAndPeekCodePoint();
- }
-
- //NOTE: all U+000D CARRIAGE RETURN (CR) characters must be converted to U+000A LINE FEED (LF) characters
- if (cp === $.CARRIAGE_RETURN) {
- this.skipNextNewLine = true;
- return $.LINE_FEED;
- }
-
- this.skipNextNewLine = false;
-
- //OPTIMIZATION: first perform check if the code point in the allowed range that covers most common
- //HTML input (e.g. ASCII codes) to avoid performance-cost operations for high-range code points.
- return cp >= 0xD800 ? this._processHighRangeCodePoint(cp) : cp;
-};
-
-Preprocessor.prototype._processHighRangeCodePoint = function (cp) {
- //NOTE: try to peek a surrogate pair
- if (this.pos !== this.lastCharPos) {
- var nextCp = this.html.charCodeAt(this.pos + 1);
-
- if (isSurrogatePair(cp, nextCp)) {
- //NOTE: we have a surrogate pair. Peek pair character and recalculate code point.
- this.pos++;
- cp = getSurrogatePairCodePoint(cp, nextCp);
-
- //NOTE: add gap that should be avoided during retreat
- this._addGap();
- }
- }
-
- if (isReservedCodePoint(cp))
- cp = $.REPLACEMENT_CHARACTER;
-
- return cp;
-};
-
-Preprocessor.prototype._addGap = function () {
- this.gapStack.push(this.lastGapPos);
- this.lastGapPos = this.pos;
-};
-
-Preprocessor.prototype.retreat = function () {
- if (this.pos === this.lastGapPos) {
- this.lastGapPos = this.gapStack.pop();
- this.pos--;
- }
-
- this.pos--;
-};
-
-},{"../common/unicode":82}],92:[function(require,module,exports){
+},{"../common/unicode":84}],88:[function(require,module,exports){
'use strict';
-var Preprocessor = require('./preprocessor'),
- LocationInfoMixin = require('./location_info_mixin'),
- UNICODE = require('../common/unicode'),
- NAMED_ENTITY_TRIE = require('./named_entity_trie');
-
-//Aliases
-var $ = UNICODE.CODE_POINTS,
- $$ = UNICODE.CODE_POINT_SEQUENCES;
+//Const
+var NOAH_ARK_CAPACITY = 3;
-//Replacement code points for numeric entities
-var NUMERIC_ENTITY_REPLACEMENTS = {
- 0x00: 0xFFFD, 0x0D: 0x000D, 0x80: 0x20AC, 0x81: 0x0081, 0x82: 0x201A, 0x83: 0x0192, 0x84: 0x201E,
- 0x85: 0x2026, 0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02C6, 0x89: 0x2030, 0x8A: 0x0160, 0x8B: 0x2039,
- 0x8C: 0x0152, 0x8D: 0x008D, 0x8E: 0x017D, 0x8F: 0x008F, 0x90: 0x0090, 0x91: 0x2018, 0x92: 0x2019,
- 0x93: 0x201C, 0x94: 0x201D, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014, 0x98: 0x02DC, 0x99: 0x2122,
- 0x9A: 0x0161, 0x9B: 0x203A, 0x9C: 0x0153, 0x9D: 0x009D, 0x9E: 0x017E, 0x9F: 0x0178
+//List of formatting elements
+var FormattingElementList = module.exports = function (treeAdapter) {
+ this.length = 0;
+ this.entries = [];
+ this.treeAdapter = treeAdapter;
+ this.bookmark = null;
};
-//States
-var DATA_STATE = 'DATA_STATE',
- CHARACTER_REFERENCE_IN_DATA_STATE = 'CHARACTER_REFERENCE_IN_DATA_STATE',
- RCDATA_STATE = 'RCDATA_STATE',
- CHARACTER_REFERENCE_IN_RCDATA_STATE = 'CHARACTER_REFERENCE_IN_RCDATA_STATE',
- RAWTEXT_STATE = 'RAWTEXT_STATE',
- SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE',
- PLAINTEXT_STATE = 'PLAINTEXT_STATE',
- TAG_OPEN_STATE = 'TAG_OPEN_STATE',
- END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE',
- TAG_NAME_STATE = 'TAG_NAME_STATE',
- RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE',
- RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE',
- RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE',
- RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE',
- RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE',
- RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE',
- SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE',
- SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE',
- SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE',
- SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE',
- SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE',
- SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE',
- SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE',
- SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE',
- SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE',
- SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE',
- SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE',
- SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE',
- SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE',
- SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE',
- SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE',
- SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE',
- SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE',
- BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE',
- ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE',
- AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE',
- BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE',
- ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE',
- ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE',
- ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE',
- CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE = 'CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE',
- AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE',
- SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE',
- BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE',
- MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE',
- COMMENT_START_STATE = 'COMMENT_START_STATE',
- COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE',
- COMMENT_STATE = 'COMMENT_STATE',
- COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE',
- COMMENT_END_STATE = 'COMMENT_END_STATE',
- COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE',
- DOCTYPE_STATE = 'DOCTYPE_STATE',
- BEFORE_DOCTYPE_NAME_STATE = 'BEFORE_DOCTYPE_NAME_STATE',
- DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE',
- AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE',
- AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE = 'AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE',
- BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
- DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE',
- DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE',
- AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
- BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE',
- AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE = 'AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE',
- BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
- DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE',
- DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE',
- AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
- BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE',
- CDATA_SECTION_STATE = 'CDATA_SECTION_STATE';
+//Entry types
+FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY';
+FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY';
-//Utils
+//Noah Ark's condition
+//OPTIMIZATION: at first we try to find possible candidates for exclusion using
+//lightweight heuristics without thorough attributes check.
+FormattingElementList.prototype._getNoahArkConditionCandidates = function (newElement) {
+ var candidates = [];
-//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline
-//this functions if they will be situated in another module due to context switch.
-//Always perform inlining check before modifying this functions ('node --trace-inlining').
-function isWhitespace(cp) {
- return cp === $.SPACE || cp === $.LINE_FEED || cp === $.TABULATION || cp === $.FORM_FEED;
-}
+ if (this.length >= NOAH_ARK_CAPACITY) {
+ var neAttrsLength = this.treeAdapter.getAttrList(newElement).length,
+ neTagName = this.treeAdapter.getTagName(newElement),
+ neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
-function isAsciiDigit(cp) {
- return cp >= $.DIGIT_0 && cp <= $.DIGIT_9;
-}
+ for (var i = this.length - 1; i >= 0; i--) {
+ var entry = this.entries[i];
-function isAsciiUpper(cp) {
- return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z;
-}
+ if (entry.type === FormattingElementList.MARKER_ENTRY)
+ break;
-function isAsciiLower(cp) {
- return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z;
-}
+ var element = entry.element,
+ elementAttrs = this.treeAdapter.getAttrList(element),
+ isCandidate = this.treeAdapter.getTagName(element) === neTagName &&
+ this.treeAdapter.getNamespaceURI(element) === neNamespaceURI &&
+ elementAttrs.length === neAttrsLength;
-function isAsciiAlphaNumeric(cp) {
- return isAsciiDigit(cp) || isAsciiUpper(cp) || isAsciiLower(cp);
-}
+ if (isCandidate)
+ candidates.push({idx: i, attrs: elementAttrs});
+ }
+ }
-function isDigit(cp, isHex) {
- return isAsciiDigit(cp) || (isHex && ((cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F) ||
- (cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F)));
-}
+ return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates;
+};
-function isReservedCodePoint(cp) {
- return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF;
-}
+FormattingElementList.prototype._ensureNoahArkCondition = function (newElement) {
+ var candidates = this._getNoahArkConditionCandidates(newElement),
+ cLength = candidates.length;
-function toAsciiLowerCodePoint(cp) {
- return cp + 0x0020;
-}
+ if (cLength) {
+ var neAttrs = this.treeAdapter.getAttrList(newElement),
+ neAttrsLength = neAttrs.length,
+ neAttrsMap = {};
-//NOTE: String.fromCharCode() function can handle only characters from BMP subset.
-//So, we need to workaround this manually.
-//(see: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode#Getting_it_to_work_with_higher_values)
-function toChar(cp) {
- if (cp <= 0xFFFF)
- return String.fromCharCode(cp);
+ //NOTE: build attrs map for the new element so we can perform fast lookups
+ for (var i = 0; i < neAttrsLength; i++) {
+ var neAttr = neAttrs[i];
- cp -= 0x10000;
- return String.fromCharCode(cp >>> 10 & 0x3FF | 0xD800) + String.fromCharCode(0xDC00 | cp & 0x3FF);
-}
+ neAttrsMap[neAttr.name] = neAttr.value;
+ }
-function toAsciiLowerChar(cp) {
- return String.fromCharCode(toAsciiLowerCodePoint(cp));
-}
+ for (i = 0; i < neAttrsLength; i++) {
+ for (var j = 0; j < cLength; j++) {
+ var cAttr = candidates[j].attrs[i];
-//Tokenizer
-var Tokenizer = module.exports = function (html, options) {
- this.disableEntitiesDecoding = false;
+ if (neAttrsMap[cAttr.name] !== cAttr.value) {
+ candidates.splice(j, 1);
+ cLength--;
+ }
- this.preprocessor = new Preprocessor(html);
+ if (candidates.length < NOAH_ARK_CAPACITY)
+ return;
+ }
+ }
- this.tokenQueue = [];
+ //NOTE: remove bottommost candidates until Noah's Ark condition will not be met
+ for (i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) {
+ this.entries.splice(candidates[i].idx, 1);
+ this.length--;
+ }
+ }
+};
- this.allowCDATA = false;
+//Mutations
+FormattingElementList.prototype.insertMarker = function () {
+ this.entries.push({type: FormattingElementList.MARKER_ENTRY});
+ this.length++;
+};
- this.state = DATA_STATE;
- this.returnState = '';
+FormattingElementList.prototype.pushElement = function (element, token) {
+ this._ensureNoahArkCondition(element);
- this.consumptionPos = 0;
+ this.entries.push({
+ type: FormattingElementList.ELEMENT_ENTRY,
+ element: element,
+ token: token
+ });
- this.tempBuff = [];
- this.additionalAllowedCp = void 0;
- this.lastStartTagName = '';
+ this.length++;
+};
- this.currentCharacterToken = null;
- this.currentToken = null;
- this.currentAttr = null;
+FormattingElementList.prototype.insertElementAfterBookmark = function (element, token) {
+ var bookmarkIdx = this.length - 1;
+
+ for (; bookmarkIdx >= 0; bookmarkIdx--) {
+ if (this.entries[bookmarkIdx] === this.bookmark)
+ break;
+ }
- if (options) {
- this.disableEntitiesDecoding = !options.decodeHtmlEntities;
+ this.entries.splice(bookmarkIdx + 1, 0, {
+ type: FormattingElementList.ELEMENT_ENTRY,
+ element: element,
+ token: token
+ });
+
+ this.length++;
+};
- if (options.locationInfo)
- LocationInfoMixin.assign(this);
+FormattingElementList.prototype.removeEntry = function (entry) {
+ for (var i = this.length - 1; i >= 0; i--) {
+ if (this.entries[i] === entry) {
+ this.entries.splice(i, 1);
+ this.length--;
+ break;
+ }
}
};
-//Token types
-Tokenizer.CHARACTER_TOKEN = 'CHARACTER_TOKEN';
-Tokenizer.NULL_CHARACTER_TOKEN = 'NULL_CHARACTER_TOKEN';
-Tokenizer.WHITESPACE_CHARACTER_TOKEN = 'WHITESPACE_CHARACTER_TOKEN';
-Tokenizer.START_TAG_TOKEN = 'START_TAG_TOKEN';
-Tokenizer.END_TAG_TOKEN = 'END_TAG_TOKEN';
-Tokenizer.COMMENT_TOKEN = 'COMMENT_TOKEN';
-Tokenizer.DOCTYPE_TOKEN = 'DOCTYPE_TOKEN';
-Tokenizer.EOF_TOKEN = 'EOF_TOKEN';
+FormattingElementList.prototype.clearToLastMarker = function () {
+ while (this.length) {
+ var entry = this.entries.pop();
-//Tokenizer initial states for different modes
-Tokenizer.MODE = Tokenizer.prototype.MODE = {
- DATA: DATA_STATE,
- RCDATA: RCDATA_STATE,
- RAWTEXT: RAWTEXT_STATE,
- SCRIPT_DATA: SCRIPT_DATA_STATE,
- PLAINTEXT: PLAINTEXT_STATE
+ this.length--;
+
+ if (entry.type === FormattingElementList.MARKER_ENTRY)
+ break;
+ }
};
-//Static
-Tokenizer.getTokenAttr = function (token, attrName) {
- for (var i = token.attrs.length - 1; i >= 0; i--) {
- if (token.attrs[i].name === attrName)
- return token.attrs[i].value;
+//Search
+FormattingElementList.prototype.getElementEntryInScopeWithTagName = function (tagName) {
+ for (var i = this.length - 1; i >= 0; i--) {
+ var entry = this.entries[i];
+
+ if (entry.type === FormattingElementList.MARKER_ENTRY)
+ return null;
+
+ if (this.treeAdapter.getTagName(entry.element) === tagName)
+ return entry;
}
return null;
};
-//Get token
-Tokenizer.prototype.getNextToken = function () {
- while (!this.tokenQueue.length)
- this[this.state](this._consume());
+FormattingElementList.prototype.getElementEntry = function (element) {
+ for (var i = this.length - 1; i >= 0; i--) {
+ var entry = this.entries[i];
- return this.tokenQueue.shift();
+ if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element === element)
+ return entry;
+ }
+
+ return null;
};
+
+},{}],89:[function(require,module,exports){
+'use strict';
-//Consumption
-Tokenizer.prototype._consume = function () {
- this.consumptionPos++;
- return this.preprocessor.advanceAndPeekCodePoint();
+var Tokenizer = require('../tokenizer'),
+ OpenElementStack = require('./open_element_stack'),
+ FormattingElementList = require('./formatting_element_list'),
+ locationInfoMixin = require('../location_info/parser_mixin'),
+ defaultTreeAdapter = require('../tree_adapters/default'),
+ doctype = require('../common/doctype'),
+ foreignContent = require('../common/foreign_content'),
+ mergeOptions = require('../common/merge_options'),
+ UNICODE = require('../common/unicode'),
+ HTML = require('../common/html');
+
+//Aliases
+var $ = HTML.TAG_NAMES,
+ NS = HTML.NAMESPACES,
+ ATTRS = HTML.ATTRS;
+
+/**
+ * @typedef {Object} ParserOptions
+ *
+ * @property {Boolean} [locationInfo=false] - Enables source code location information for the nodes.
+ * When enabled, each node (except root node) has the `__location` property. In case the node is not an empty element,
+ * `__location` will be {@link ElementLocationInfo} object, otherwise it's {@link LocationInfo}.
+ * If the element was implicitly created by the parser it's `__location` property will be `null`.
+ *
+ * @property {TreeAdapter} [treeAdapter=parse5.treeAdapters.default] - Specifies the resulting tree format.
+ */
+var DEFAULT_OPTIONS = {
+ locationInfo: false,
+ treeAdapter: defaultTreeAdapter
};
-Tokenizer.prototype._unconsume = function () {
- this.consumptionPos--;
- this.preprocessor.retreat();
+//Misc constants
+var HIDDEN_INPUT_TYPE = 'hidden';
+
+//Adoption agency loops iteration count
+var AA_OUTER_LOOP_ITER = 8,
+ AA_INNER_LOOP_ITER = 3;
+
+//Insertion modes
+var INITIAL_MODE = 'INITIAL_MODE',
+ BEFORE_HTML_MODE = 'BEFORE_HTML_MODE',
+ BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE',
+ IN_HEAD_MODE = 'IN_HEAD_MODE',
+ AFTER_HEAD_MODE = 'AFTER_HEAD_MODE',
+ IN_BODY_MODE = 'IN_BODY_MODE',
+ TEXT_MODE = 'TEXT_MODE',
+ IN_TABLE_MODE = 'IN_TABLE_MODE',
+ IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE',
+ IN_CAPTION_MODE = 'IN_CAPTION_MODE',
+ IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE',
+ IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE',
+ IN_ROW_MODE = 'IN_ROW_MODE',
+ IN_CELL_MODE = 'IN_CELL_MODE',
+ IN_SELECT_MODE = 'IN_SELECT_MODE',
+ IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE',
+ IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE',
+ AFTER_BODY_MODE = 'AFTER_BODY_MODE',
+ IN_FRAMESET_MODE = 'IN_FRAMESET_MODE',
+ AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE',
+ AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE',
+ AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE';
+
+//Insertion mode reset map
+var INSERTION_MODE_RESET_MAP = {};
+
+INSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE;
+INSERTION_MODE_RESET_MAP[$.TBODY] =
+INSERTION_MODE_RESET_MAP[$.THEAD] =
+INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE;
+INSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE;
+INSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE;
+INSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE;
+INSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE;
+INSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE;
+
+//Template insertion mode switch map
+var TEMPLATE_INSERTION_MODE_SWITCH_MAP = {};
+
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] =
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] =
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] =
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] =
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE;
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE;
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE;
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] =
+TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE;
+
+//Token handlers map for insertion modes
+var _ = {};
+
+_[INITIAL_MODE] = {};
+_[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode;
+_[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
+_[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode;
+_[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] =
+_[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] =
+_[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode;
+
+_[BEFORE_HTML_MODE] = {};
+_[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml;
+_[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
+_[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml;
+_[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml;
+_[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml;
+
+_[BEFORE_HEAD_MODE] = {};
+_[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead;
+_[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
+_[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead;
+_[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead;
+_[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead;
+
+_[IN_HEAD_MODE] = {};
+_[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead;
+_[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
+_[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead;
+_[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead;
+_[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead;
+
+_[AFTER_HEAD_MODE] = {};
+_[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead;
+_[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
+_[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead;
+_[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead;
+_[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead;
+
+_[IN_BODY_MODE] = {};
+_[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
+_[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
+_[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody;
+_[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody;
+_[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[TEXT_MODE] = {};
+_[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
+_[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
+_[TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
+_[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
+_[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken;
+_[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText;
+_[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText;
+
+_[IN_TABLE_MODE] = {};
+_[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
+_[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
+_[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable;
+_[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable;
+_[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[IN_TABLE_TEXT_MODE] = {};
+_[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText;
+_[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText;
+_[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
+_[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
+_[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] =
+_[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] =
+_[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText;
+
+_[IN_CAPTION_MODE] = {};
+_[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
+_[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
+_[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption;
+_[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption;
+_[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[IN_COLUMN_GROUP_MODE] = {};
+_[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup;
+_[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
+_[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup;
+_[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup;
+_[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[IN_TABLE_BODY_MODE] = {};
+_[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
+_[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
+_[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody;
+_[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody;
+_[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[IN_ROW_MODE] = {};
+_[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
+_[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
+_[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow;
+_[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow;
+_[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[IN_CELL_MODE] = {};
+_[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
+_[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
+_[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell;
+_[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell;
+_[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[IN_SELECT_MODE] = {};
+_[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
+_[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
+_[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect;
+_[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect;
+_[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[IN_SELECT_IN_TABLE_MODE] = {};
+_[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
+_[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
+_[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable;
+_[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable;
+_[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
+
+_[IN_TEMPLATE_MODE] = {};
+_[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
+_[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
+_[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate;
+_[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate;
+_[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate;
+
+_[AFTER_BODY_MODE] = {};
+_[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody;
+_[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
+_[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement;
+_[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody;
+_[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody;
+_[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
+
+_[IN_FRAMESET_MODE] = {};
+_[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
+_[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset;
+_[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset;
+_[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
+
+_[AFTER_FRAMESET_MODE] = {};
+_[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
+_[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
+_[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset;
+_[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset;
+_[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
+
+_[AFTER_AFTER_BODY_MODE] = {};
+_[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody;
+_[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody;
+_[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
+_[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
+_[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody;
+_[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody;
+_[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
+
+_[AFTER_AFTER_FRAMESET_MODE] = {};
+_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
+_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
+_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
+_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
+_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
+_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset;
+_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken;
+_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
+
+
+//Parser
+var Parser = module.exports = function (options) {
+ this.options = mergeOptions(DEFAULT_OPTIONS, options);
+
+ this.treeAdapter = this.options.treeAdapter;
+ this.pendingScript = null;
+
+ if (this.options.locationInfo)
+ locationInfoMixin.assign(this);
};
-Tokenizer.prototype._unconsumeSeveral = function (count) {
- while (count--)
- this._unconsume();
+// API
+Parser.prototype.parse = function (html) {
+ var document = this.treeAdapter.createDocument();
+
+ this._bootstrap(document, null);
+ this.tokenizer.write(html, true);
+ this._runParsingLoop(null, null);
+
+ return document;
};
-Tokenizer.prototype._reconsumeInState = function (state) {
- this.state = state;
- this._unconsume();
+Parser.prototype.parseFragment = function (html, fragmentContext) {
+ //NOTE: use element as a fragment context if context element was not provided,
+ //so we will parse in "forgiving" manner
+ if (!fragmentContext)
+ fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []);
+
+ //NOTE: create fake element which will be used as 'document' for fragment parsing.
+ //This is important for jsdom there 'document' can't be recreated, therefore
+ //fragment parsing causes messing of the main `document`.
+ var documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []);
+
+ this._bootstrap(documentMock, fragmentContext);
+
+ if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE)
+ this._pushTmplInsertionMode(IN_TEMPLATE_MODE);
+
+ this._initTokenizerForFragmentParsing();
+ this._insertFakeRootElement();
+ this._resetInsertionMode();
+ this._findFormInFragmentContext();
+ this.tokenizer.write(html, true);
+ this._runParsingLoop(null, null);
+
+ var rootElement = this.treeAdapter.getFirstChild(documentMock),
+ fragment = this.treeAdapter.createDocumentFragment();
+
+ this._adoptNodes(rootElement, fragment);
+
+ return fragment;
};
-Tokenizer.prototype._consumeSubsequentIfMatch = function (pattern, startCp, caseSensitive) {
- var rollbackPos = this.consumptionPos,
- isMatch = true,
- patternLength = pattern.length,
- patternPos = 0,
- cp = startCp,
- patternCp = void 0;
+//Bootstrap parser
+Parser.prototype._bootstrap = function (document, fragmentContext) {
+ this.tokenizer = new Tokenizer(this.options);
- for (; patternPos < patternLength; patternPos++) {
- if (patternPos > 0)
- cp = this._consume();
+ this.stopped = false;
- if (cp === $.EOF) {
- isMatch = false;
+ this.insertionMode = INITIAL_MODE;
+ this.originalInsertionMode = '';
+
+ this.document = document;
+ this.fragmentContext = fragmentContext;
+
+ this.headElement = null;
+ this.formElement = null;
+
+ this.openElements = new OpenElementStack(this.document, this.treeAdapter);
+ this.activeFormattingElements = new FormattingElementList(this.treeAdapter);
+
+ this.tmplInsertionModeStack = [];
+ this.tmplInsertionModeStackTop = -1;
+ this.currentTmplInsertionMode = null;
+
+ this.pendingCharacterTokens = [];
+ this.hasNonWhitespacePendingCharacterToken = false;
+
+ this.framesetOk = true;
+ this.skipNextNewLine = false;
+ this.fosterParentingEnabled = false;
+};
+
+//Parsing loop
+Parser.prototype._runParsingLoop = function (writeCallback, scriptHandler) {
+ while (!this.stopped) {
+ this._setupTokenizerCDATAMode();
+
+ var token = this.tokenizer.getNextToken();
+
+ if (token.type === Tokenizer.HIBERNATION_TOKEN)
break;
+
+ if (this.skipNextNewLine) {
+ this.skipNextNewLine = false;
+
+ if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
+ if (token.chars.length === 1)
+ continue;
+
+ token.chars = token.chars.substr(1);
+ }
}
- patternCp = pattern[patternPos];
+ this._processInputToken(token);
- if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) {
- isMatch = false;
+ if (scriptHandler && this.pendingScript)
break;
- }
}
- if (!isMatch)
- this._unconsumeSeveral(this.consumptionPos - rollbackPos);
+ if (scriptHandler && this.pendingScript) {
+ var script = this.pendingScript;
- return isMatch;
-};
+ this.pendingScript = null;
-//Lookahead
-Tokenizer.prototype._lookahead = function () {
- var cp = this.preprocessor.advanceAndPeekCodePoint();
- this.preprocessor.retreat();
+ scriptHandler(script);
- return cp;
+ return;
+ }
+
+ if (writeCallback)
+ writeCallback();
};
-//Temp buffer
-Tokenizer.prototype.isTempBufferEqualToScriptString = function () {
- if (this.tempBuff.length !== $$.SCRIPT_STRING.length)
- return false;
+//Text parsing
+Parser.prototype._setupTokenizerCDATAMode = function () {
+ var current = this._getAdjustedCurrentElement();
- for (var i = 0; i < this.tempBuff.length; i++) {
- if (this.tempBuff[i] !== $$.SCRIPT_STRING[i])
- return false;
- }
+ this.tokenizer.allowCDATA = current && current !== this.document &&
+ this.treeAdapter.getNamespaceURI(current) !== NS.HTML &&
+ !this._isIntegrationPoint(current);
+};
- return true;
+Parser.prototype._switchToTextParsing = function (currentToken, nextTokenizerState) {
+ this._insertElement(currentToken, NS.HTML);
+ this.tokenizer.state = nextTokenizerState;
+ this.originalInsertionMode = this.insertionMode;
+ this.insertionMode = TEXT_MODE;
};
-//Token creation
-Tokenizer.prototype.buildStartTagToken = function (tagName) {
- return {
- type: Tokenizer.START_TAG_TOKEN,
- tagName: tagName,
- selfClosing: false,
- attrs: []
- };
+//Fragment parsing
+Parser.prototype._getAdjustedCurrentElement = function () {
+ return this.openElements.stackTop === 0 && this.fragmentContext ?
+ this.fragmentContext :
+ this.openElements.current;
};
-Tokenizer.prototype.buildEndTagToken = function (tagName) {
- return {
- type: Tokenizer.END_TAG_TOKEN,
- tagName: tagName,
- ignored: false,
- attrs: []
- };
+Parser.prototype._findFormInFragmentContext = function () {
+ var node = this.fragmentContext;
+
+ do {
+ if (this.treeAdapter.getTagName(node) === $.FORM) {
+ this.formElement = node;
+ break;
+ }
+
+ node = this.treeAdapter.getParentNode(node);
+ } while (node);
};
-Tokenizer.prototype._createStartTagToken = function (tagNameFirstCh) {
- this.currentToken = this.buildStartTagToken(tagNameFirstCh);
+Parser.prototype._initTokenizerForFragmentParsing = function () {
+ if (this.treeAdapter.getNamespaceURI(this.fragmentContext) === NS.HTML) {
+ var tn = this.treeAdapter.getTagName(this.fragmentContext);
+
+ if (tn === $.TITLE || tn === $.TEXTAREA)
+ this.tokenizer.state = Tokenizer.MODE.RCDATA;
+
+ else if (tn === $.STYLE || tn === $.XMP || tn === $.IFRAME ||
+ tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT)
+ this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
+
+ else if (tn === $.SCRIPT)
+ this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
+
+ else if (tn === $.PLAINTEXT)
+ this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
+ }
};
-Tokenizer.prototype._createEndTagToken = function (tagNameFirstCh) {
- this.currentToken = this.buildEndTagToken(tagNameFirstCh);
+//Tree mutation
+Parser.prototype._setDocumentType = function (token) {
+ this.treeAdapter.setDocumentType(this.document, token.name, token.publicId, token.systemId);
};
-Tokenizer.prototype._createCommentToken = function () {
- this.currentToken = {
- type: Tokenizer.COMMENT_TOKEN,
- data: ''
- };
+Parser.prototype._attachElementToTree = function (element) {
+ if (this._shouldFosterParentOnInsertion())
+ this._fosterParentElement(element);
+
+ else {
+ var parent = this.openElements.currentTmplContent || this.openElements.current;
+
+ this.treeAdapter.appendChild(parent, element);
+ }
};
-Tokenizer.prototype._createDoctypeToken = function (doctypeNameFirstCh) {
- this.currentToken = {
- type: Tokenizer.DOCTYPE_TOKEN,
- name: doctypeNameFirstCh || '',
- forceQuirks: false,
- publicId: null,
- systemId: null
- };
+Parser.prototype._appendElement = function (token, namespaceURI) {
+ var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
+
+ this._attachElementToTree(element);
};
-Tokenizer.prototype._createCharacterToken = function (type, ch) {
- this.currentCharacterToken = {
- type: type,
- chars: ch
- };
+Parser.prototype._insertElement = function (token, namespaceURI) {
+ var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
+
+ this._attachElementToTree(element);
+ this.openElements.push(element);
};
-//Tag attributes
-Tokenizer.prototype._createAttr = function (attrNameFirstCh) {
- this.currentAttr = {
- name: attrNameFirstCh,
- value: ''
- };
+Parser.prototype._insertFakeElement = function (tagName) {
+ var element = this.treeAdapter.createElement(tagName, NS.HTML, []);
+
+ this._attachElementToTree(element);
+ this.openElements.push(element);
};
-Tokenizer.prototype._isDuplicateAttr = function () {
- return Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) !== null;
+Parser.prototype._insertTemplate = function (token) {
+ var tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs),
+ content = this.treeAdapter.createDocumentFragment();
+
+ this.treeAdapter.setTemplateContent(tmpl, content);
+ this._attachElementToTree(tmpl);
+ this.openElements.push(tmpl);
};
-Tokenizer.prototype._leaveAttrName = function (toState) {
- this.state = toState;
+Parser.prototype._insertFakeRootElement = function () {
+ var element = this.treeAdapter.createElement($.HTML, NS.HTML, []);
- if (!this._isDuplicateAttr())
- this.currentToken.attrs.push(this.currentAttr);
+ this.treeAdapter.appendChild(this.openElements.current, element);
+ this.openElements.push(element);
};
-//Appropriate end tag token
-//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#appropriate-end-tag-token)
-Tokenizer.prototype._isAppropriateEndTagToken = function () {
- return this.lastStartTagName === this.currentToken.tagName;
+Parser.prototype._appendCommentNode = function (token, parent) {
+ var commentNode = this.treeAdapter.createCommentNode(token.data);
+
+ this.treeAdapter.appendChild(parent, commentNode);
};
-//Token emission
-Tokenizer.prototype._emitCurrentToken = function () {
- this._emitCurrentCharacterToken();
+Parser.prototype._insertCharacters = function (token) {
+ if (this._shouldFosterParentOnInsertion())
+ this._fosterParentText(token.chars);
- //NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate.
- if (this.currentToken.type === Tokenizer.START_TAG_TOKEN)
- this.lastStartTagName = this.currentToken.tagName;
+ else {
+ var parent = this.openElements.currentTmplContent || this.openElements.current;
- this.tokenQueue.push(this.currentToken);
- this.currentToken = null;
+ this.treeAdapter.insertText(parent, token.chars);
+ }
};
-Tokenizer.prototype._emitCurrentCharacterToken = function () {
- if (this.currentCharacterToken) {
- this.tokenQueue.push(this.currentCharacterToken);
- this.currentCharacterToken = null;
+Parser.prototype._adoptNodes = function (donor, recipient) {
+ while (true) {
+ var child = this.treeAdapter.getFirstChild(donor);
+
+ if (!child)
+ break;
+
+ this.treeAdapter.detachNode(child);
+ this.treeAdapter.appendChild(recipient, child);
}
};
-Tokenizer.prototype._emitEOFToken = function () {
- this._emitCurrentCharacterToken();
- this.tokenQueue.push({type: Tokenizer.EOF_TOKEN});
-};
+//Token processing
+Parser.prototype._shouldProcessTokenInForeignContent = function (token) {
+ var current = this._getAdjustedCurrentElement();
-//Characters emission
+ if (!current || current === this.document)
+ return false;
-//OPTIMIZATION: specification uses only one type of character tokens (one token per character).
-//This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters.
-//If we have a sequence of characters that belong to the same group, parser can process it
-//as a single solid character token.
-//So, there are 3 types of character tokens in parse5:
-//1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000')
-//2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n \r\t \f')
-//3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^')
-Tokenizer.prototype._appendCharToCurrentCharacterToken = function (type, ch) {
- if (this.currentCharacterToken && this.currentCharacterToken.type !== type)
- this._emitCurrentCharacterToken();
+ var ns = this.treeAdapter.getNamespaceURI(current);
- if (this.currentCharacterToken)
- this.currentCharacterToken.chars += ch;
+ if (ns === NS.HTML)
+ return false;
- else
- this._createCharacterToken(type, ch);
-};
+ if (this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && ns === NS.MATHML &&
+ token.type === Tokenizer.START_TAG_TOKEN && token.tagName === $.SVG)
+ return false;
-Tokenizer.prototype._emitCodePoint = function (cp) {
- var type = Tokenizer.CHARACTER_TOKEN;
+ var isCharacterToken = token.type === Tokenizer.CHARACTER_TOKEN ||
+ token.type === Tokenizer.NULL_CHARACTER_TOKEN ||
+ token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN,
+ isMathMLTextStartTag = token.type === Tokenizer.START_TAG_TOKEN &&
+ token.tagName !== $.MGLYPH &&
+ token.tagName !== $.MALIGNMARK;
- if (isWhitespace(cp))
- type = Tokenizer.WHITESPACE_CHARACTER_TOKEN;
+ if ((isMathMLTextStartTag || isCharacterToken) && this._isIntegrationPoint(current, NS.MATHML))
+ return false;
- else if (cp === $.NULL)
- type = Tokenizer.NULL_CHARACTER_TOKEN;
+ if ((token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && this._isIntegrationPoint(current, NS.HTML))
+ return false;
- this._appendCharToCurrentCharacterToken(type, toChar(cp));
+ return token.type !== Tokenizer.EOF_TOKEN;
};
-Tokenizer.prototype._emitSeveralCodePoints = function (codePoints) {
- for (var i = 0; i < codePoints.length; i++)
- this._emitCodePoint(codePoints[i]);
+Parser.prototype._processToken = function (token) {
+ _[this.insertionMode][token.type](this, token);
};
-//NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character.
-//So we can avoid additional checks here.
-Tokenizer.prototype._emitChar = function (ch) {
- this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch);
+Parser.prototype._processTokenInBodyMode = function (token) {
+ _[IN_BODY_MODE][token.type](this, token);
};
-//Character reference tokenization
-Tokenizer.prototype._consumeNumericEntity = function (isHex) {
- var digits = '',
- nextCp = void 0;
+Parser.prototype._processTokenInForeignContent = function (token) {
+ if (token.type === Tokenizer.CHARACTER_TOKEN)
+ characterInForeignContent(this, token);
- do {
- digits += toChar(this._consume());
- nextCp = this._lookahead();
- } while (nextCp !== $.EOF && isDigit(nextCp, isHex));
+ else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN)
+ nullCharacterInForeignContent(this, token);
- if (this._lookahead() === $.SEMICOLON)
- this._consume();
+ else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN)
+ insertCharacters(this, token);
- var referencedCp = parseInt(digits, isHex ? 16 : 10),
- replacement = NUMERIC_ENTITY_REPLACEMENTS[referencedCp];
+ else if (token.type === Tokenizer.COMMENT_TOKEN)
+ appendComment(this, token);
- if (replacement)
- return replacement;
+ else if (token.type === Tokenizer.START_TAG_TOKEN)
+ startTagInForeignContent(this, token);
- if (isReservedCodePoint(referencedCp))
- return $.REPLACEMENT_CHARACTER;
+ else if (token.type === Tokenizer.END_TAG_TOKEN)
+ endTagInForeignContent(this, token);
+};
- return referencedCp;
+Parser.prototype._processInputToken = function (token) {
+ if (this._shouldProcessTokenInForeignContent(token))
+ this._processTokenInForeignContent(token);
+
+ else
+ this._processToken(token);
};
-Tokenizer.prototype._consumeNamedEntity = function (startCp, inAttr) {
- var referencedCodePoints = null,
- entityCodePointsCount = 0,
- cp = startCp,
- leaf = NAMED_ENTITY_TRIE[cp],
- consumedCount = 1,
- semicolonTerminated = false;
+//Integration points
+Parser.prototype._isIntegrationPoint = function (element, foreignNS) {
+ var tn = this.treeAdapter.getTagName(element),
+ ns = this.treeAdapter.getNamespaceURI(element),
+ attrs = this.treeAdapter.getAttrList(element);
- for (; leaf && cp !== $.EOF; cp = this._consume(), consumedCount++, leaf = leaf.l && leaf.l[cp]) {
- if (leaf.c) {
- //NOTE: we have at least one named reference match. But we don't stop lookup at this point,
- //because longer matches still can be found (e.g. '¬' and '∉') except the case
- //then found match is terminated by semicolon.
- referencedCodePoints = leaf.c;
- entityCodePointsCount = consumedCount;
+ return foreignContent.isIntegrationPoint(tn, ns, attrs, foreignNS);
+};
- if (cp === $.SEMICOLON) {
- semicolonTerminated = true;
+//Active formatting elements reconstruction
+Parser.prototype._reconstructActiveFormattingElements = function () {
+ var listLength = this.activeFormattingElements.length;
+
+ if (listLength) {
+ var unopenIdx = listLength,
+ entry = null;
+
+ do {
+ unopenIdx--;
+ entry = this.activeFormattingElements.entries[unopenIdx];
+
+ if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) {
+ unopenIdx++;
break;
}
+ } while (unopenIdx > 0);
+
+ for (var i = unopenIdx; i < listLength; i++) {
+ entry = this.activeFormattingElements.entries[i];
+ this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element));
+ entry.element = this.openElements.current;
}
}
+};
- if (referencedCodePoints) {
- if (!semicolonTerminated) {
- //NOTE: unconsume excess (e.g. 'it' in '¬it')
- this._unconsumeSeveral(consumedCount - entityCodePointsCount);
+//Close elements
+Parser.prototype._closeTableCell = function () {
+ this.openElements.generateImpliedEndTags();
+ this.openElements.popUntilTableCellPopped();
+ this.activeFormattingElements.clearToLastMarker();
+ this.insertionMode = IN_ROW_MODE;
+};
- //NOTE: If the character reference is being consumed as part of an attribute and the next character
- //is either a U+003D EQUALS SIGN character (=) or an alphanumeric ASCII character, then, for historical
- //reasons, all the characters that were matched after the U+0026 AMPERSAND character (&) must be
- //unconsumed, and nothing is returned.
- //However, if this next character is in fact a U+003D EQUALS SIGN character (=), then this is a
- //parse error, because some legacy user agents will misinterpret the markup in those cases.
- //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references)
- if (inAttr) {
- var nextCp = this._lookahead();
+Parser.prototype._closePElement = function () {
+ this.openElements.generateImpliedEndTagsWithExclusion($.P);
+ this.openElements.popUntilTagNamePopped($.P);
+};
- if (nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp)) {
- this._unconsumeSeveral(entityCodePointsCount);
- return null;
- }
- }
- }
+//Insertion modes
+Parser.prototype._resetInsertionMode = function () {
+ for (var i = this.openElements.stackTop, last = false; i >= 0; i--) {
+ var element = this.openElements.items[i];
- return referencedCodePoints;
- }
+ if (i === 0) {
+ last = true;
- this._unconsumeSeveral(consumedCount);
+ if (this.fragmentContext)
+ element = this.fragmentContext;
+ }
- return null;
-};
+ var tn = this.treeAdapter.getTagName(element),
+ newInsertionMode = INSERTION_MODE_RESET_MAP[tn];
-Tokenizer.prototype._consumeCharacterReference = function (startCp, inAttr) {
- if (this.disableEntitiesDecoding || isWhitespace(startCp) || startCp === $.GREATER_THAN_SIGN ||
- startCp === $.AMPERSAND || startCp === this.additionalAllowedCp || startCp === $.EOF) {
- //NOTE: not a character reference. No characters are consumed, and nothing is returned.
- this._unconsume();
- return null;
- }
+ if (newInsertionMode) {
+ this.insertionMode = newInsertionMode;
+ break;
+ }
- else if (startCp === $.NUMBER_SIGN) {
- //NOTE: we have a numeric entity candidate, now we should determine if it's hex or decimal
- var isHex = false,
- nextCp = this._lookahead();
+ else if (!last && (tn === $.TD || tn === $.TH)) {
+ this.insertionMode = IN_CELL_MODE;
+ break;
+ }
- if (nextCp === $.LATIN_SMALL_X || nextCp === $.LATIN_CAPITAL_X) {
- this._consume();
- isHex = true;
+ else if (!last && tn === $.HEAD) {
+ this.insertionMode = IN_HEAD_MODE;
+ break;
}
- nextCp = this._lookahead();
+ else if (tn === $.SELECT) {
+ this._resetInsertionModeForSelect(i);
+ break;
+ }
- //NOTE: if we have at least one digit this is a numeric entity for sure, so we consume it
- if (nextCp !== $.EOF && isDigit(nextCp, isHex))
- return [this._consumeNumericEntity(isHex)];
+ else if (tn === $.TEMPLATE) {
+ this.insertionMode = this.currentTmplInsertionMode;
+ break;
+ }
- else {
- //NOTE: otherwise this is a bogus number entity and a parse error. Unconsume the number sign
- //and the 'x'-character if appropriate.
- this._unconsumeSeveral(isHex ? 2 : 1);
- return null;
+ else if (tn === $.HTML) {
+ this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE;
+ break;
}
- }
- else
- return this._consumeNamedEntity(startCp, inAttr);
+ else if (last) {
+ this.insertionMode = IN_BODY_MODE;
+ break;
+ }
+ }
};
-//State machine
-var _ = Tokenizer.prototype;
-
-//12.2.4.1 Data state
-//------------------------------------------------------------------
-_[DATA_STATE] = function dataState(cp) {
- if (cp === $.AMPERSAND)
- this.state = CHARACTER_REFERENCE_IN_DATA_STATE;
+Parser.prototype._resetInsertionModeForSelect = function (selectIdx) {
+ if (selectIdx > 0) {
+ for (var i = selectIdx - 1; i > 0; i--) {
+ var ancestor = this.openElements.items[i],
+ tn = this.treeAdapter.getTagName(ancestor);
- else if (cp === $.LESS_THAN_SIGN)
- this.state = TAG_OPEN_STATE;
+ if (tn === $.TEMPLATE)
+ break;
- else if (cp === $.NULL)
- this._emitCodePoint(cp);
+ else if (tn === $.TABLE) {
+ this.insertionMode = IN_SELECT_IN_TABLE_MODE;
+ return;
+ }
+ }
+ }
- else if (cp === $.EOF)
- this._emitEOFToken();
+ this.insertionMode = IN_SELECT_MODE;
+};
- else
- this._emitCodePoint(cp);
+Parser.prototype._pushTmplInsertionMode = function (mode) {
+ this.tmplInsertionModeStack.push(mode);
+ this.tmplInsertionModeStackTop++;
+ this.currentTmplInsertionMode = mode;
};
+Parser.prototype._popTmplInsertionMode = function () {
+ this.tmplInsertionModeStack.pop();
+ this.tmplInsertionModeStackTop--;
+ this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop];
+};
-//12.2.4.2 Character reference in data state
-//------------------------------------------------------------------
-_[CHARACTER_REFERENCE_IN_DATA_STATE] = function characterReferenceInDataState(cp) {
- this.state = DATA_STATE;
- this.additionalAllowedCp = void 0;
+//Foster parenting
+Parser.prototype._isElementCausesFosterParenting = function (element) {
+ var tn = this.treeAdapter.getTagName(element);
- var referencedCodePoints = this._consumeCharacterReference(cp, false);
+ return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR;
+};
- if (referencedCodePoints)
- this._emitSeveralCodePoints(referencedCodePoints);
- else
- this._emitChar('&');
+Parser.prototype._shouldFosterParentOnInsertion = function () {
+ return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current);
};
+Parser.prototype._findFosterParentingLocation = function () {
+ var location = {
+ parent: null,
+ beforeElement: null
+ };
-//12.2.4.3 RCDATA state
-//------------------------------------------------------------------
-_[RCDATA_STATE] = function rcdataState(cp) {
- if (cp === $.AMPERSAND)
- this.state = CHARACTER_REFERENCE_IN_RCDATA_STATE;
+ for (var i = this.openElements.stackTop; i >= 0; i--) {
+ var openElement = this.openElements.items[i],
+ tn = this.treeAdapter.getTagName(openElement),
+ ns = this.treeAdapter.getNamespaceURI(openElement);
- else if (cp === $.LESS_THAN_SIGN)
- this.state = RCDATA_LESS_THAN_SIGN_STATE;
+ if (tn === $.TEMPLATE && ns === NS.HTML) {
+ location.parent = this.treeAdapter.getTemplateContent(openElement);
+ break;
+ }
- else if (cp === $.NULL)
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ else if (tn === $.TABLE) {
+ location.parent = this.treeAdapter.getParentNode(openElement);
- else if (cp === $.EOF)
- this._emitEOFToken();
+ if (location.parent)
+ location.beforeElement = openElement;
+ else
+ location.parent = this.openElements.items[i - 1];
- else
- this._emitCodePoint(cp);
+ break;
+ }
+ }
+
+ if (!location.parent)
+ location.parent = this.openElements.items[0];
+
+ return location;
};
+Parser.prototype._fosterParentElement = function (element) {
+ var location = this._findFosterParentingLocation();
-//12.2.4.4 Character reference in RCDATA state
-//------------------------------------------------------------------
-_[CHARACTER_REFERENCE_IN_RCDATA_STATE] = function characterReferenceInRcdataState(cp) {
- this.state = RCDATA_STATE;
- this.additionalAllowedCp = void 0;
+ if (location.beforeElement)
+ this.treeAdapter.insertBefore(location.parent, element, location.beforeElement);
+ else
+ this.treeAdapter.appendChild(location.parent, element);
+};
- var referencedCodePoints = this._consumeCharacterReference(cp, false);
+Parser.prototype._fosterParentText = function (chars) {
+ var location = this._findFosterParentingLocation();
- if (referencedCodePoints)
- this._emitSeveralCodePoints(referencedCodePoints);
+ if (location.beforeElement)
+ this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement);
else
- this._emitChar('&');
+ this.treeAdapter.insertText(location.parent, chars);
};
+//Special elements
+Parser.prototype._isSpecialElement = function (element) {
+ var tn = this.treeAdapter.getTagName(element),
+ ns = this.treeAdapter.getNamespaceURI(element);
-//12.2.4.5 RAWTEXT state
+ return HTML.SPECIAL_ELEMENTS[ns][tn];
+};
+
+//Adoption agency algorithm
+//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency)
//------------------------------------------------------------------
-_[RAWTEXT_STATE] = function rawtextState(cp) {
- if (cp === $.LESS_THAN_SIGN)
- this.state = RAWTEXT_LESS_THAN_SIGN_STATE;
- else if (cp === $.NULL)
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+//Steps 5-8 of the algorithm
+function aaObtainFormattingElementEntry(p, token) {
+ var formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName);
- else if (cp === $.EOF)
- this._emitEOFToken();
+ if (formattingElementEntry) {
+ if (!p.openElements.contains(formattingElementEntry.element)) {
+ p.activeFormattingElements.removeEntry(formattingElementEntry);
+ formattingElementEntry = null;
+ }
+
+ else if (!p.openElements.hasInScope(token.tagName))
+ formattingElementEntry = null;
+ }
else
- this._emitCodePoint(cp);
-};
+ genericEndTagInBody(p, token);
+ return formattingElementEntry;
+}
-//12.2.4.6 Script data state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_STATE] = function scriptDataState(cp) {
- if (cp === $.LESS_THAN_SIGN)
- this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE;
+//Steps 9 and 10 of the algorithm
+function aaObtainFurthestBlock(p, formattingElementEntry) {
+ var furthestBlock = null;
- else if (cp === $.NULL)
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ for (var i = p.openElements.stackTop; i >= 0; i--) {
+ var element = p.openElements.items[i];
- else if (cp === $.EOF)
- this._emitEOFToken();
+ if (element === formattingElementEntry.element)
+ break;
- else
- this._emitCodePoint(cp);
-};
+ if (p._isSpecialElement(element))
+ furthestBlock = element;
+ }
+ if (!furthestBlock) {
+ p.openElements.popUntilElementPopped(formattingElementEntry.element);
+ p.activeFormattingElements.removeEntry(formattingElementEntry);
+ }
-//12.2.4.7 PLAINTEXT state
-//------------------------------------------------------------------
-_[PLAINTEXT_STATE] = function plaintextState(cp) {
- if (cp === $.NULL)
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ return furthestBlock;
+}
- else if (cp === $.EOF)
- this._emitEOFToken();
+//Step 13 of the algorithm
+function aaInnerLoop(p, furthestBlock, formattingElement) {
+ var lastElement = furthestBlock,
+ nextElement = p.openElements.getCommonAncestor(furthestBlock);
- else
- this._emitCodePoint(cp);
-};
+ for (var i = 0, element = nextElement; element !== formattingElement; i++, element = nextElement) {
+ //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5)
+ nextElement = p.openElements.getCommonAncestor(element);
+ var elementEntry = p.activeFormattingElements.getElementEntry(element),
+ counterOverflow = elementEntry && i >= AA_INNER_LOOP_ITER,
+ shouldRemoveFromOpenElements = !elementEntry || counterOverflow;
-//12.2.4.8 Tag open state
-//------------------------------------------------------------------
-_[TAG_OPEN_STATE] = function tagOpenState(cp) {
- if (cp === $.EXCLAMATION_MARK)
- this.state = MARKUP_DECLARATION_OPEN_STATE;
+ if (shouldRemoveFromOpenElements) {
+ if (counterOverflow)
+ p.activeFormattingElements.removeEntry(elementEntry);
- else if (cp === $.SOLIDUS)
- this.state = END_TAG_OPEN_STATE;
+ p.openElements.remove(element);
+ }
- else if (isAsciiUpper(cp)) {
- this._createStartTagToken(toAsciiLowerChar(cp));
- this.state = TAG_NAME_STATE;
- }
+ else {
+ element = aaRecreateElementFromEntry(p, elementEntry);
- else if (isAsciiLower(cp)) {
- this._createStartTagToken(toChar(cp));
- this.state = TAG_NAME_STATE;
- }
+ if (lastElement === furthestBlock)
+ p.activeFormattingElements.bookmark = elementEntry;
- else if (cp === $.QUESTION_MARK) {
- //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
- this[BOGUS_COMMENT_STATE](cp);
+ p.treeAdapter.detachNode(lastElement);
+ p.treeAdapter.appendChild(element, lastElement);
+ lastElement = element;
+ }
}
- else {
- this._emitChar('<');
- this._reconsumeInState(DATA_STATE);
- }
-};
+ return lastElement;
+}
+//Step 13.7 of the algorithm
+function aaRecreateElementFromEntry(p, elementEntry) {
+ var ns = p.treeAdapter.getNamespaceURI(elementEntry.element),
+ newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs);
-//12.2.4.9 End tag open state
-//------------------------------------------------------------------
-_[END_TAG_OPEN_STATE] = function endTagOpenState(cp) {
- if (isAsciiUpper(cp)) {
- this._createEndTagToken(toAsciiLowerChar(cp));
- this.state = TAG_NAME_STATE;
- }
-
- else if (isAsciiLower(cp)) {
- this._createEndTagToken(toChar(cp));
- this.state = TAG_NAME_STATE;
- }
+ p.openElements.replace(elementEntry.element, newElement);
+ elementEntry.element = newElement;
- else if (cp === $.GREATER_THAN_SIGN)
- this.state = DATA_STATE;
+ return newElement;
+}
- else if (cp === $.EOF) {
- this._reconsumeInState(DATA_STATE);
- this._emitChar('<');
- this._emitChar('/');
- }
+//Step 14 of the algorithm
+function aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) {
+ if (p._isElementCausesFosterParenting(commonAncestor))
+ p._fosterParentElement(lastElement);
else {
- //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
- this[BOGUS_COMMENT_STATE](cp);
+ var tn = p.treeAdapter.getTagName(commonAncestor),
+ ns = p.treeAdapter.getNamespaceURI(commonAncestor);
+
+ if (tn === $.TEMPLATE && ns === NS.HTML)
+ commonAncestor = p.treeAdapter.getTemplateContent(commonAncestor);
+
+ p.treeAdapter.appendChild(commonAncestor, lastElement);
}
-};
+}
+//Steps 15-19 of the algorithm
+function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) {
+ var ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element),
+ token = formattingElementEntry.token,
+ newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs);
-//12.2.4.10 Tag name state
-//------------------------------------------------------------------
-_[TAG_NAME_STATE] = function tagNameState(cp) {
- if (isWhitespace(cp))
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
+ p._adoptNodes(furthestBlock, newElement);
+ p.treeAdapter.appendChild(furthestBlock, newElement);
- else if (cp === $.SOLIDUS)
- this.state = SELF_CLOSING_START_TAG_STATE;
+ p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token);
+ p.activeFormattingElements.removeEntry(formattingElementEntry);
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ p.openElements.remove(formattingElementEntry.element);
+ p.openElements.insertAfter(furthestBlock, newElement);
+}
- else if (isAsciiUpper(cp))
- this.currentToken.tagName += toAsciiLowerChar(cp);
+//Algorithm entry point
+function callAdoptionAgency(p, token) {
+ var formattingElementEntry;
- else if (cp === $.NULL)
- this.currentToken.tagName += UNICODE.REPLACEMENT_CHARACTER;
+ for (var i = 0; i < AA_OUTER_LOOP_ITER; i++) {
+ formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ if (!formattingElementEntry)
+ break;
- else
- this.currentToken.tagName += toChar(cp);
-};
+ var furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry);
+ if (!furthestBlock)
+ break;
-//12.2.4.11 RCDATA less-than sign state
-//------------------------------------------------------------------
-_[RCDATA_LESS_THAN_SIGN_STATE] = function rcdataLessThanSignState(cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = RCDATA_END_TAG_OPEN_STATE;
- }
+ p.activeFormattingElements.bookmark = formattingElementEntry;
- else {
- this._emitChar('<');
- this._reconsumeInState(RCDATA_STATE);
+ var lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element),
+ commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element);
+
+ p.treeAdapter.detachNode(lastElement);
+ aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement);
+ aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry);
}
-};
+}
-//12.2.4.12 RCDATA end tag open state
+//Generic token handlers
//------------------------------------------------------------------
-_[RCDATA_END_TAG_OPEN_STATE] = function rcdataEndTagOpenState(cp) {
- if (isAsciiUpper(cp)) {
- this._createEndTagToken(toAsciiLowerChar(cp));
- this.tempBuff.push(cp);
- this.state = RCDATA_END_TAG_NAME_STATE;
- }
+function ignoreToken() {
+ //NOTE: do nothing =)
+}
- else if (isAsciiLower(cp)) {
- this._createEndTagToken(toChar(cp));
- this.tempBuff.push(cp);
- this.state = RCDATA_END_TAG_NAME_STATE;
- }
+function appendComment(p, token) {
+ p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current);
+}
- else {
- this._emitChar('<');
- this._emitChar('/');
- this._reconsumeInState(RCDATA_STATE);
- }
-};
+function appendCommentToRootHtmlElement(p, token) {
+ p._appendCommentNode(token, p.openElements.items[0]);
+}
+function appendCommentToDocument(p, token) {
+ p._appendCommentNode(token, p.document);
+}
-//12.2.4.13 RCDATA end tag name state
-//------------------------------------------------------------------
-_[RCDATA_END_TAG_NAME_STATE] = function rcdataEndTagNameState(cp) {
- if (isAsciiUpper(cp)) {
- this.currentToken.tagName += toAsciiLowerChar(cp);
- this.tempBuff.push(cp);
- }
+function insertCharacters(p, token) {
+ p._insertCharacters(token);
+}
- else if (isAsciiLower(cp)) {
- this.currentToken.tagName += toChar(cp);
- this.tempBuff.push(cp);
- }
+function stopParsing(p) {
+ p.stopped = true;
+}
- else {
- if (this._isAppropriateEndTagToken()) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
- return;
- }
+//12.2.5.4.1 The "initial" insertion mode
+//------------------------------------------------------------------
+function doctypeInInitialMode(p, token) {
+ p._setDocumentType(token);
- if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- return;
- }
+ if (token.forceQuirks || doctype.isQuirks(token.name, token.publicId, token.systemId))
+ p.treeAdapter.setQuirksMode(p.document);
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- return;
- }
- }
+ p.insertionMode = BEFORE_HTML_MODE;
+}
- this._emitChar('<');
- this._emitChar('/');
- this._emitSeveralCodePoints(this.tempBuff);
- this._reconsumeInState(RCDATA_STATE);
- }
-};
+function tokenInInitialMode(p, token) {
+ p.treeAdapter.setQuirksMode(p.document);
+ p.insertionMode = BEFORE_HTML_MODE;
+ p._processToken(token);
+}
-//12.2.4.14 RAWTEXT less-than sign state
+//12.2.5.4.2 The "before html" insertion mode
//------------------------------------------------------------------
-_[RAWTEXT_LESS_THAN_SIGN_STATE] = function rawtextLessThanSignState(cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = RAWTEXT_END_TAG_OPEN_STATE;
+function startTagBeforeHtml(p, token) {
+ if (token.tagName === $.HTML) {
+ p._insertElement(token, NS.HTML);
+ p.insertionMode = BEFORE_HEAD_MODE;
}
- else {
- this._emitChar('<');
- this._reconsumeInState(RAWTEXT_STATE);
- }
-};
+ else
+ tokenBeforeHtml(p, token);
+}
+function endTagBeforeHtml(p, token) {
+ var tn = token.tagName;
-//12.2.4.15 RAWTEXT end tag open state
+ if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR)
+ tokenBeforeHtml(p, token);
+}
+
+function tokenBeforeHtml(p, token) {
+ p._insertFakeRootElement();
+ p.insertionMode = BEFORE_HEAD_MODE;
+ p._processToken(token);
+}
+
+
+//12.2.5.4.3 The "before head" insertion mode
//------------------------------------------------------------------
-_[RAWTEXT_END_TAG_OPEN_STATE] = function rawtextEndTagOpenState(cp) {
- if (isAsciiUpper(cp)) {
- this._createEndTagToken(toAsciiLowerChar(cp));
- this.tempBuff.push(cp);
- this.state = RAWTEXT_END_TAG_NAME_STATE;
- }
+function startTagBeforeHead(p, token) {
+ var tn = token.tagName;
- else if (isAsciiLower(cp)) {
- this._createEndTagToken(toChar(cp));
- this.tempBuff.push(cp);
- this.state = RAWTEXT_END_TAG_NAME_STATE;
- }
+ if (tn === $.HTML)
+ startTagInBody(p, token);
- else {
- this._emitChar('<');
- this._emitChar('/');
- this._reconsumeInState(RAWTEXT_STATE);
+ else if (tn === $.HEAD) {
+ p._insertElement(token, NS.HTML);
+ p.headElement = p.openElements.current;
+ p.insertionMode = IN_HEAD_MODE;
}
-};
+ else
+ tokenBeforeHead(p, token);
+}
-//12.2.4.16 RAWTEXT end tag name state
+function endTagBeforeHead(p, token) {
+ var tn = token.tagName;
+
+ if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR)
+ tokenBeforeHead(p, token);
+}
+
+function tokenBeforeHead(p, token) {
+ p._insertFakeElement($.HEAD);
+ p.headElement = p.openElements.current;
+ p.insertionMode = IN_HEAD_MODE;
+ p._processToken(token);
+}
+
+
+//12.2.5.4.4 The "in head" insertion mode
//------------------------------------------------------------------
-_[RAWTEXT_END_TAG_NAME_STATE] = function rawtextEndTagNameState(cp) {
- if (isAsciiUpper(cp)) {
- this.currentToken.tagName += toAsciiLowerChar(cp);
- this.tempBuff.push(cp);
- }
+function startTagInHead(p, token) {
+ var tn = token.tagName;
- else if (isAsciiLower(cp)) {
- this.currentToken.tagName += toChar(cp);
- this.tempBuff.push(cp);
- }
+ if (tn === $.HTML)
+ startTagInBody(p, token);
- else {
- if (this._isAppropriateEndTagToken()) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
- return;
- }
+ else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META)
+ p._appendElement(token, NS.HTML);
- if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- return;
- }
+ else if (tn === $.TITLE)
+ p._switchToTextParsing(token, Tokenizer.MODE.RCDATA);
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- return;
- }
- }
+ //NOTE: here we assume that we always act as an interactive user agent with enabled scripting, so we parse
+ // as a rawtext.
+ else if (tn === $.NOSCRIPT || tn === $.NOFRAMES || tn === $.STYLE)
+ p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
- this._emitChar('<');
- this._emitChar('/');
- this._emitSeveralCodePoints(this.tempBuff);
- this._reconsumeInState(RAWTEXT_STATE);
+ else if (tn === $.SCRIPT)
+ p._switchToTextParsing(token, Tokenizer.MODE.SCRIPT_DATA);
+
+ else if (tn === $.TEMPLATE) {
+ p._insertTemplate(token, NS.HTML);
+ p.activeFormattingElements.insertMarker();
+ p.framesetOk = false;
+ p.insertionMode = IN_TEMPLATE_MODE;
+ p._pushTmplInsertionMode(IN_TEMPLATE_MODE);
}
-};
+ else if (tn !== $.HEAD)
+ tokenInHead(p, token);
+}
-//12.2.4.17 Script data less-than sign state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_LESS_THAN_SIGN_STATE] = function scriptDataLessThanSignState(cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = SCRIPT_DATA_END_TAG_OPEN_STATE;
- }
+function endTagInHead(p, token) {
+ var tn = token.tagName;
- else if (cp === $.EXCLAMATION_MARK) {
- this.state = SCRIPT_DATA_ESCAPE_START_STATE;
- this._emitChar('<');
- this._emitChar('!');
+ if (tn === $.HEAD) {
+ p.openElements.pop();
+ p.insertionMode = AFTER_HEAD_MODE;
}
- else {
- this._emitChar('<');
- this._reconsumeInState(SCRIPT_DATA_STATE);
+ else if (tn === $.BODY || tn === $.BR || tn === $.HTML)
+ tokenInHead(p, token);
+
+ else if (tn === $.TEMPLATE && p.openElements.tmplCount > 0) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped($.TEMPLATE);
+ p.activeFormattingElements.clearToLastMarker();
+ p._popTmplInsertionMode();
+ p._resetInsertionMode();
}
-};
+}
+function tokenInHead(p, token) {
+ p.openElements.pop();
+ p.insertionMode = AFTER_HEAD_MODE;
+ p._processToken(token);
+}
-//12.2.4.18 Script data end tag open state
+
+//12.2.5.4.6 The "after head" insertion mode
//------------------------------------------------------------------
-_[SCRIPT_DATA_END_TAG_OPEN_STATE] = function scriptDataEndTagOpenState(cp) {
- if (isAsciiUpper(cp)) {
- this._createEndTagToken(toAsciiLowerChar(cp));
- this.tempBuff.push(cp);
- this.state = SCRIPT_DATA_END_TAG_NAME_STATE;
- }
+function startTagAfterHead(p, token) {
+ var tn = token.tagName;
- else if (isAsciiLower(cp)) {
- this._createEndTagToken(toChar(cp));
- this.tempBuff.push(cp);
- this.state = SCRIPT_DATA_END_TAG_NAME_STATE;
- }
+ if (tn === $.HTML)
+ startTagInBody(p, token);
- else {
- this._emitChar('<');
- this._emitChar('/');
- this._reconsumeInState(SCRIPT_DATA_STATE);
+ else if (tn === $.BODY) {
+ p._insertElement(token, NS.HTML);
+ p.framesetOk = false;
+ p.insertionMode = IN_BODY_MODE;
}
-};
-
-//12.2.4.19 Script data end tag name state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_END_TAG_NAME_STATE] = function scriptDataEndTagNameState(cp) {
- if (isAsciiUpper(cp)) {
- this.currentToken.tagName += toAsciiLowerChar(cp);
- this.tempBuff.push(cp);
+ else if (tn === $.FRAMESET) {
+ p._insertElement(token, NS.HTML);
+ p.insertionMode = IN_FRAMESET_MODE;
}
- else if (isAsciiLower(cp)) {
- this.currentToken.tagName += toChar(cp);
- this.tempBuff.push(cp);
+ else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META ||
+ tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) {
+ p.openElements.push(p.headElement);
+ startTagInHead(p, token);
+ p.openElements.remove(p.headElement);
}
- else {
- if (this._isAppropriateEndTagToken()) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
- return;
- }
+ else if (tn !== $.HEAD)
+ tokenAfterHead(p, token);
+}
- else if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- return;
- }
+function endTagAfterHead(p, token) {
+ var tn = token.tagName;
- else if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- return;
- }
- }
+ if (tn === $.BODY || tn === $.HTML || tn === $.BR)
+ tokenAfterHead(p, token);
- this._emitChar('<');
- this._emitChar('/');
- this._emitSeveralCodePoints(this.tempBuff);
- this._reconsumeInState(SCRIPT_DATA_STATE);
- }
-};
+ else if (tn === $.TEMPLATE)
+ endTagInHead(p, token);
+}
+
+function tokenAfterHead(p, token) {
+ p._insertFakeElement($.BODY);
+ p.insertionMode = IN_BODY_MODE;
+ p._processToken(token);
+}
-//12.2.4.20 Script data escape start state
+//12.2.5.4.7 The "in body" insertion mode
//------------------------------------------------------------------
-_[SCRIPT_DATA_ESCAPE_START_STATE] = function scriptDataEscapeStartState(cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE;
- this._emitChar('-');
- }
+function whitespaceCharacterInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+ p._insertCharacters(token);
+}
- else
- this._reconsumeInState(SCRIPT_DATA_STATE);
-};
+function characterInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+ p._insertCharacters(token);
+ p.framesetOk = false;
+}
+function htmlStartTagInBody(p, token) {
+ if (p.openElements.tmplCount === 0)
+ p.treeAdapter.adoptAttributes(p.openElements.items[0], token.attrs);
+}
-//12.2.4.21 Script data escape start dash state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_ESCAPE_START_DASH_STATE] = function scriptDataEscapeStartDashState(cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
- this._emitChar('-');
- }
+function bodyStartTagInBody(p, token) {
+ var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
- else
- this._reconsumeInState(SCRIPT_DATA_STATE);
-};
+ if (bodyElement && p.openElements.tmplCount === 0) {
+ p.framesetOk = false;
+ p.treeAdapter.adoptAttributes(bodyElement, token.attrs);
+ }
+}
+function framesetStartTagInBody(p, token) {
+ var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
-//12.2.4.22 Script data escaped state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_ESCAPED_STATE] = function scriptDataEscapedState(cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = SCRIPT_DATA_ESCAPED_DASH_STATE;
- this._emitChar('-');
+ if (p.framesetOk && bodyElement) {
+ p.treeAdapter.detachNode(bodyElement);
+ p.openElements.popAllUpToHtmlElement();
+ p._insertElement(token, NS.HTML);
+ p.insertionMode = IN_FRAMESET_MODE;
}
+}
- else if (cp === $.LESS_THAN_SIGN)
- this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
+function addressStartTagInBody(p, token) {
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
- else if (cp === $.NULL)
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ p._insertElement(token, NS.HTML);
+}
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+function numberedHeaderStartTagInBody(p, token) {
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
- else
- this._emitCodePoint(cp);
-};
+ var tn = p.openElements.currentTagName;
+ if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
+ p.openElements.pop();
-//12.2.4.23 Script data escaped dash state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_ESCAPED_DASH_STATE] = function scriptDataEscapedDashState(cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
- this._emitChar('-');
- }
+ p._insertElement(token, NS.HTML);
+}
- else if (cp === $.LESS_THAN_SIGN)
- this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
+function preStartTagInBody(p, token) {
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
- else if (cp === $.NULL) {
- this.state = SCRIPT_DATA_ESCAPED_STATE;
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
- }
+ p._insertElement(token, NS.HTML);
+ //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
+ //on to the next one. (Newlines at the start of pre blocks are ignored as an authoring convenience.)
+ p.skipNextNewLine = true;
+ p.framesetOk = false;
+}
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+function formStartTagInBody(p, token) {
+ var inTemplate = p.openElements.tmplCount > 0;
- else {
- this.state = SCRIPT_DATA_ESCAPED_STATE;
- this._emitCodePoint(cp);
+ if (!p.formElement || inTemplate) {
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
+
+ p._insertElement(token, NS.HTML);
+
+ if (!inTemplate)
+ p.formElement = p.openElements.current;
}
-};
+}
+function listItemStartTagInBody(p, token) {
+ p.framesetOk = false;
-//12.2.4.24 Script data escaped dash dash state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_ESCAPED_DASH_DASH_STATE] = function scriptDataEscapedDashDashState(cp) {
- if (cp === $.HYPHEN_MINUS)
- this._emitChar('-');
+ var tn = token.tagName;
- else if (cp === $.LESS_THAN_SIGN)
- this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
+ for (var i = p.openElements.stackTop; i >= 0; i--) {
+ var element = p.openElements.items[i],
+ elementTn = p.treeAdapter.getTagName(element),
+ closeTn = null;
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = SCRIPT_DATA_STATE;
- this._emitChar('>');
- }
+ if (tn === $.LI && elementTn === $.LI)
+ closeTn = $.LI;
- else if (cp === $.NULL) {
- this.state = SCRIPT_DATA_ESCAPED_STATE;
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
- }
+ else if ((tn === $.DD || tn === $.DT) && (elementTn === $.DD || elementTn === $.DT))
+ closeTn = elementTn;
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ if (closeTn) {
+ p.openElements.generateImpliedEndTagsWithExclusion(closeTn);
+ p.openElements.popUntilTagNamePopped(closeTn);
+ break;
+ }
- else {
- this.state = SCRIPT_DATA_ESCAPED_STATE;
- this._emitCodePoint(cp);
+ if (elementTn !== $.ADDRESS && elementTn !== $.DIV && elementTn !== $.P && p._isSpecialElement(element))
+ break;
}
-};
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
-//12.2.4.25 Script data escaped less-than sign state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThanSignState(cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE;
- }
+ p._insertElement(token, NS.HTML);
+}
- else if (isAsciiUpper(cp)) {
- this.tempBuff = [];
- this.tempBuff.push(toAsciiLowerCodePoint(cp));
- this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE;
- this._emitChar('<');
- this._emitCodePoint(cp);
- }
+function plaintextStartTagInBody(p, token) {
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
- else if (isAsciiLower(cp)) {
- this.tempBuff = [];
- this.tempBuff.push(cp);
- this.state = SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE;
- this._emitChar('<');
- this._emitCodePoint(cp);
- }
+ p._insertElement(token, NS.HTML);
+ p.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
+}
- else {
- this._emitChar('<');
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+function buttonStartTagInBody(p, token) {
+ if (p.openElements.hasInScope($.BUTTON)) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped($.BUTTON);
}
-};
+ p._reconstructActiveFormattingElements();
+ p._insertElement(token, NS.HTML);
+ p.framesetOk = false;
+}
-//12.2.4.26 Script data escaped end tag open state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE] = function scriptDataEscapedEndTagOpenState(cp) {
- if (isAsciiUpper(cp)) {
- this._createEndTagToken(toAsciiLowerChar(cp));
- this.tempBuff.push(cp);
- this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE;
- }
+function aStartTagInBody(p, token) {
+ var activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A);
- else if (isAsciiLower(cp)) {
- this._createEndTagToken(toChar(cp));
- this.tempBuff.push(cp);
- this.state = SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE;
+ if (activeElementEntry) {
+ callAdoptionAgency(p, token);
+ p.openElements.remove(activeElementEntry.element);
+ p.activeFormattingElements.removeEntry(activeElementEntry);
}
- else {
- this._emitChar('<');
- this._emitChar('/');
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
- }
-};
+ p._reconstructActiveFormattingElements();
+ p._insertElement(token, NS.HTML);
+ p.activeFormattingElements.pushElement(p.openElements.current, token);
+}
+function bStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+ p._insertElement(token, NS.HTML);
+ p.activeFormattingElements.pushElement(p.openElements.current, token);
+}
-//12.2.4.27 Script data escaped end tag name state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE] = function scriptDataEscapedEndTagNameState(cp) {
- if (isAsciiUpper(cp)) {
- this.currentToken.tagName += toAsciiLowerChar(cp);
- this.tempBuff.push(cp);
- }
+function nobrStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
- else if (isAsciiLower(cp)) {
- this.currentToken.tagName += toChar(cp);
- this.tempBuff.push(cp);
+ if (p.openElements.hasInScope($.NOBR)) {
+ callAdoptionAgency(p, token);
+ p._reconstructActiveFormattingElements();
}
- else {
- if (this._isAppropriateEndTagToken()) {
- if (isWhitespace(cp)) {
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
- return;
- }
+ p._insertElement(token, NS.HTML);
+ p.activeFormattingElements.pushElement(p.openElements.current, token);
+}
- if (cp === $.SOLIDUS) {
- this.state = SELF_CLOSING_START_TAG_STATE;
- return;
- }
+function appletStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+ p._insertElement(token, NS.HTML);
+ p.activeFormattingElements.insertMarker();
+ p.framesetOk = false;
+}
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- return;
- }
- }
+function tableStartTagInBody(p, token) {
+ if (!p.treeAdapter.isQuirksMode(p.document) && p.openElements.hasInButtonScope($.P))
+ p._closePElement();
- this._emitChar('<');
- this._emitChar('/');
- this._emitSeveralCodePoints(this.tempBuff);
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
- }
-};
+ p._insertElement(token, NS.HTML);
+ p.framesetOk = false;
+ p.insertionMode = IN_TABLE_MODE;
+}
+function areaStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+ p._appendElement(token, NS.HTML);
+ p.framesetOk = false;
+}
-//12.2.4.28 Script data double escape start state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE] = function scriptDataDoubleEscapeStartState(cp) {
- if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {
- this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_DOUBLE_ESCAPED_STATE : SCRIPT_DATA_ESCAPED_STATE;
- this._emitCodePoint(cp);
- }
+function inputStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+ p._appendElement(token, NS.HTML);
- else if (isAsciiUpper(cp)) {
- this.tempBuff.push(toAsciiLowerCodePoint(cp));
- this._emitCodePoint(cp);
- }
+ var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
- else if (isAsciiLower(cp)) {
- this.tempBuff.push(cp);
- this._emitCodePoint(cp);
- }
+ if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE)
+ p.framesetOk = false;
- else
- this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
-};
+}
+function paramStartTagInBody(p, token) {
+ p._appendElement(token, NS.HTML);
+}
-//12.2.4.29 Script data double escaped state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_DOUBLE_ESCAPED_STATE] = function scriptDataDoubleEscapedState(cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE;
- this._emitChar('-');
- }
+function hrStartTagInBody(p, token) {
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
- else if (cp === $.LESS_THAN_SIGN) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
- this._emitChar('<');
- }
+ if (p.openElements.currentTagName === $.MENUITEM)
+ p.openElements.pop();
- else if (cp === $.NULL)
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ p._appendElement(token, NS.HTML);
+ p.framesetOk = false;
+}
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+function imageStartTagInBody(p, token) {
+ token.tagName = $.IMG;
+ areaStartTagInBody(p, token);
+}
- else
- this._emitCodePoint(cp);
-};
+function textareaStartTagInBody(p, token) {
+ p._insertElement(token, NS.HTML);
+ //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
+ //on to the next one. (Newlines at the start of textarea elements are ignored as an authoring convenience.)
+ p.skipNextNewLine = true;
+ p.tokenizer.state = Tokenizer.MODE.RCDATA;
+ p.originalInsertionMode = p.insertionMode;
+ p.framesetOk = false;
+ p.insertionMode = TEXT_MODE;
+}
+function xmpStartTagInBody(p, token) {
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
-//12.2.4.30 Script data double escaped dash state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE] = function scriptDataDoubleEscapedDashState(cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE;
- this._emitChar('-');
- }
+ p._reconstructActiveFormattingElements();
+ p.framesetOk = false;
+ p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
+}
- else if (cp === $.LESS_THAN_SIGN) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
- this._emitChar('<');
- }
+function iframeStartTagInBody(p, token) {
+ p.framesetOk = false;
+ p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
+}
- else if (cp === $.NULL) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
- }
+//NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse
+// as a rawtext.
+function noembedStartTagInBody(p, token) {
+ p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
+}
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+function selectStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+ p._insertElement(token, NS.HTML);
+ p.framesetOk = false;
- else {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
- this._emitCodePoint(cp);
- }
-};
+ if (p.insertionMode === IN_TABLE_MODE ||
+ p.insertionMode === IN_CAPTION_MODE ||
+ p.insertionMode === IN_TABLE_BODY_MODE ||
+ p.insertionMode === IN_ROW_MODE ||
+ p.insertionMode === IN_CELL_MODE)
+ p.insertionMode = IN_SELECT_IN_TABLE_MODE;
-//12.2.4.31 Script data double escaped dash dash state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE] = function scriptDataDoubleEscapedDashDashState(cp) {
- if (cp === $.HYPHEN_MINUS)
- this._emitChar('-');
+ else
+ p.insertionMode = IN_SELECT_MODE;
+}
- else if (cp === $.LESS_THAN_SIGN) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
- this._emitChar('<');
- }
+function optgroupStartTagInBody(p, token) {
+ if (p.openElements.currentTagName === $.OPTION)
+ p.openElements.pop();
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = SCRIPT_DATA_STATE;
- this._emitChar('>');
- }
+ p._reconstructActiveFormattingElements();
+ p._insertElement(token, NS.HTML);
+}
- else if (cp === $.NULL) {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
- this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
- }
+function rbStartTagInBody(p, token) {
+ if (p.openElements.hasInScope($.RUBY))
+ p.openElements.generateImpliedEndTags();
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ p._insertElement(token, NS.HTML);
+}
- else {
- this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
- this._emitCodePoint(cp);
- }
-};
+function rtStartTagInBody(p, token) {
+ if (p.openElements.hasInScope($.RUBY))
+ p.openElements.generateImpliedEndTagsWithExclusion($.RTC);
+ p._insertElement(token, NS.HTML);
+}
-//12.2.4.32 Script data double escaped less-than sign state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataDoubleEscapedLessThanSignState(cp) {
- if (cp === $.SOLIDUS) {
- this.tempBuff = [];
- this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE;
- this._emitChar('/');
- }
+function menuitemStartTagInBody(p, token) {
+ if (p.openElements.currentTagName === $.MENUITEM)
+ p.openElements.pop();
- else
- this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
-};
+ // TODO needs clarification, see https://github.com/whatwg/html/pull/907/files#r73505877
+ p._reconstructActiveFormattingElements();
+ p._insertElement(token, NS.HTML);
+}
-//12.2.4.33 Script data double escape end state
-//------------------------------------------------------------------
-_[SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE] = function scriptDataDoubleEscapeEndState(cp) {
- if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {
- this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_ESCAPED_STATE : SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
+function menuStartTagInBody(p, token) {
+ if (p.openElements.hasInButtonScope($.P))
+ p._closePElement();
- this._emitCodePoint(cp);
- }
+ if (p.openElements.currentTagName === $.MENUITEM)
+ p.openElements.pop();
- else if (isAsciiUpper(cp)) {
- this.tempBuff.push(toAsciiLowerCodePoint(cp));
- this._emitCodePoint(cp);
- }
+ p._insertElement(token, NS.HTML);
+}
- else if (isAsciiLower(cp)) {
- this.tempBuff.push(cp);
- this._emitCodePoint(cp);
- }
+function mathStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+
+ foreignContent.adjustTokenMathMLAttrs(token);
+ foreignContent.adjustTokenXMLAttrs(token);
+ if (token.selfClosing)
+ p._appendElement(token, NS.MATHML);
else
- this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
-};
+ p._insertElement(token, NS.MATHML);
+}
+function svgStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
-//12.2.4.34 Before attribute name state
-//------------------------------------------------------------------
-_[BEFORE_ATTRIBUTE_NAME_STATE] = function beforeAttributeNameState(cp) {
- if (isWhitespace(cp))
- return;
+ foreignContent.adjustTokenSVGAttrs(token);
+ foreignContent.adjustTokenXMLAttrs(token);
- if (cp === $.SOLIDUS)
- this.state = SELF_CLOSING_START_TAG_STATE;
+ if (token.selfClosing)
+ p._appendElement(token, NS.SVG);
+ else
+ p._insertElement(token, NS.SVG);
+}
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+function genericStartTagInBody(p, token) {
+ p._reconstructActiveFormattingElements();
+ p._insertElement(token, NS.HTML);
+}
- else if (isAsciiUpper(cp)) {
- this._createAttr(toAsciiLowerChar(cp));
- this.state = ATTRIBUTE_NAME_STATE;
- }
+//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
+//It's faster than using dictionary.
+function startTagInBody(p, token) {
+ var tn = token.tagName;
- else if (cp === $.NULL) {
- this._createAttr(UNICODE.REPLACEMENT_CHARACTER);
- this.state = ATTRIBUTE_NAME_STATE;
- }
+ switch (tn.length) {
+ case 1:
+ if (tn === $.I || tn === $.S || tn === $.B || tn === $.U)
+ bStartTagInBody(p, token);
- else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN) {
- this._createAttr(toChar(cp));
- this.state = ATTRIBUTE_NAME_STATE;
- }
+ else if (tn === $.P)
+ addressStartTagInBody(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.A)
+ aStartTagInBody(p, token);
- else {
- this._createAttr(toChar(cp));
- this.state = ATTRIBUTE_NAME_STATE;
- }
-};
+ else
+ genericStartTagInBody(p, token);
+ break;
-//12.2.4.35 Attribute name state
-//------------------------------------------------------------------
-_[ATTRIBUTE_NAME_STATE] = function attributeNameState(cp) {
- if (isWhitespace(cp))
- this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE);
+ case 2:
+ if (tn === $.DL || tn === $.OL || tn === $.UL)
+ addressStartTagInBody(p, token);
- else if (cp === $.SOLIDUS)
- this._leaveAttrName(SELF_CLOSING_START_TAG_STATE);
+ else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
+ numberedHeaderStartTagInBody(p, token);
- else if (cp === $.EQUALS_SIGN)
- this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE);
+ else if (tn === $.LI || tn === $.DD || tn === $.DT)
+ listItemStartTagInBody(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this._leaveAttrName(DATA_STATE);
- this._emitCurrentToken();
- }
+ else if (tn === $.EM || tn === $.TT)
+ bStartTagInBody(p, token);
- else if (isAsciiUpper(cp))
- this.currentAttr.name += toAsciiLowerChar(cp);
+ else if (tn === $.BR)
+ areaStartTagInBody(p, token);
- else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN)
- this.currentAttr.name += toChar(cp);
+ else if (tn === $.HR)
+ hrStartTagInBody(p, token);
- else if (cp === $.NULL)
- this.currentAttr.name += UNICODE.REPLACEMENT_CHARACTER;
+ else if (tn === $.RB)
+ rbStartTagInBody(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.RT || tn === $.RP)
+ rtStartTagInBody(p, token);
- else
- this.currentAttr.name += toChar(cp);
-};
+ else if (tn !== $.TH && tn !== $.TD && tn !== $.TR)
+ genericStartTagInBody(p, token);
+ break;
-//12.2.4.36 After attribute name state
-//------------------------------------------------------------------
-_[AFTER_ATTRIBUTE_NAME_STATE] = function afterAttributeNameState(cp) {
- if (isWhitespace(cp))
- return;
+ case 3:
+ if (tn === $.DIV || tn === $.DIR || tn === $.NAV)
+ addressStartTagInBody(p, token);
- if (cp === $.SOLIDUS)
- this.state = SELF_CLOSING_START_TAG_STATE;
+ else if (tn === $.PRE)
+ preStartTagInBody(p, token);
- else if (cp === $.EQUALS_SIGN)
- this.state = BEFORE_ATTRIBUTE_VALUE_STATE;
+ else if (tn === $.BIG)
+ bStartTagInBody(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ else if (tn === $.IMG || tn === $.WBR)
+ areaStartTagInBody(p, token);
- else if (isAsciiUpper(cp)) {
- this._createAttr(toAsciiLowerChar(cp));
- this.state = ATTRIBUTE_NAME_STATE;
- }
+ else if (tn === $.XMP)
+ xmpStartTagInBody(p, token);
- else if (cp === $.NULL) {
- this._createAttr(UNICODE.REPLACEMENT_CHARACTER);
- this.state = ATTRIBUTE_NAME_STATE;
- }
+ else if (tn === $.SVG)
+ svgStartTagInBody(p, token);
- else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN) {
- this._createAttr(toChar(cp));
- this.state = ATTRIBUTE_NAME_STATE;
- }
+ else if (tn === $.RTC)
+ rbStartTagInBody(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn !== $.COL)
+ genericStartTagInBody(p, token);
- else {
- this._createAttr(toChar(cp));
- this.state = ATTRIBUTE_NAME_STATE;
- }
-};
+ break;
+ case 4:
+ if (tn === $.HTML)
+ htmlStartTagInBody(p, token);
-//12.2.4.37 Before attribute value state
-//------------------------------------------------------------------
-_[BEFORE_ATTRIBUTE_VALUE_STATE] = function beforeAttributeValueState(cp) {
- if (isWhitespace(cp))
- return;
+ else if (tn === $.BASE || tn === $.LINK || tn === $.META)
+ startTagInHead(p, token);
- if (cp === $.QUOTATION_MARK)
- this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;
+ else if (tn === $.BODY)
+ bodyStartTagInBody(p, token);
- else if (cp === $.AMPERSAND)
- this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE);
+ else if (tn === $.MAIN)
+ addressStartTagInBody(p, token);
- else if (cp === $.APOSTROPHE)
- this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;
+ else if (tn === $.FORM)
+ formStartTagInBody(p, token);
- else if (cp === $.NULL) {
- this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
- this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
- }
+ else if (tn === $.CODE || tn === $.FONT)
+ bStartTagInBody(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ else if (tn === $.NOBR)
+ nobrStartTagInBody(p, token);
- else if (cp === $.LESS_THAN_SIGN || cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) {
- this.currentAttr.value += toChar(cp);
- this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
- }
+ else if (tn === $.AREA)
+ areaStartTagInBody(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.MATH)
+ mathStartTagInBody(p, token);
- else {
- this.currentAttr.value += toChar(cp);
- this.state = ATTRIBUTE_VALUE_UNQUOTED_STATE;
- }
-};
+ else if (tn === $.MENU)
+ menuStartTagInBody(p, token);
+ else if (tn !== $.HEAD)
+ genericStartTagInBody(p, token);
-//12.2.4.38 Attribute value (double-quoted) state
-//------------------------------------------------------------------
-_[ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE] = function attributeValueDoubleQuotedState(cp) {
- if (cp === $.QUOTATION_MARK)
- this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
+ break;
- else if (cp === $.AMPERSAND) {
- this.additionalAllowedCp = $.QUOTATION_MARK;
- this.returnState = this.state;
- this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
- }
+ case 5:
+ if (tn === $.STYLE || tn === $.TITLE)
+ startTagInHead(p, token);
- else if (cp === $.NULL)
- this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
+ else if (tn === $.ASIDE)
+ addressStartTagInBody(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.SMALL)
+ bStartTagInBody(p, token);
- else
- this.currentAttr.value += toChar(cp);
-};
+ else if (tn === $.TABLE)
+ tableStartTagInBody(p, token);
+ else if (tn === $.EMBED)
+ areaStartTagInBody(p, token);
-//12.2.4.39 Attribute value (single-quoted) state
-//------------------------------------------------------------------
-_[ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE] = function attributeValueSingleQuotedState(cp) {
- if (cp === $.APOSTROPHE)
- this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
+ else if (tn === $.INPUT)
+ inputStartTagInBody(p, token);
- else if (cp === $.AMPERSAND) {
- this.additionalAllowedCp = $.APOSTROPHE;
- this.returnState = this.state;
- this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
- }
+ else if (tn === $.PARAM || tn === $.TRACK)
+ paramStartTagInBody(p, token);
- else if (cp === $.NULL)
- this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
+ else if (tn === $.IMAGE)
+ imageStartTagInBody(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn !== $.FRAME && tn !== $.TBODY && tn !== $.TFOOT && tn !== $.THEAD)
+ genericStartTagInBody(p, token);
- else
- this.currentAttr.value += toChar(cp);
-};
+ break;
+ case 6:
+ if (tn === $.SCRIPT)
+ startTagInHead(p, token);
-//12.2.4.40 Attribute value (unquoted) state
-//------------------------------------------------------------------
-_[ATTRIBUTE_VALUE_UNQUOTED_STATE] = function attributeValueUnquotedState(cp) {
- if (isWhitespace(cp))
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
+ else if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
+ addressStartTagInBody(p, token);
- else if (cp === $.AMPERSAND) {
- this.additionalAllowedCp = $.GREATER_THAN_SIGN;
- this.returnState = this.state;
- this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
- }
+ else if (tn === $.BUTTON)
+ buttonStartTagInBody(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ else if (tn === $.STRIKE || tn === $.STRONG)
+ bStartTagInBody(p, token);
- else if (cp === $.NULL)
- this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
+ else if (tn === $.APPLET || tn === $.OBJECT)
+ appletStartTagInBody(p, token);
- else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN ||
- cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT) {
- this.currentAttr.value += toChar(cp);
- }
+ else if (tn === $.KEYGEN)
+ areaStartTagInBody(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.SOURCE)
+ paramStartTagInBody(p, token);
- else
- this.currentAttr.value += toChar(cp);
-};
+ else if (tn === $.IFRAME)
+ iframeStartTagInBody(p, token);
+ else if (tn === $.SELECT)
+ selectStartTagInBody(p, token);
-//12.2.4.41 Character reference in attribute value state
-//------------------------------------------------------------------
-_[CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE] = function characterReferenceInAttributeValueState(cp) {
- var referencedCodePoints = this._consumeCharacterReference(cp, true);
+ else if (tn === $.OPTION)
+ optgroupStartTagInBody(p, token);
- if (referencedCodePoints) {
- for (var i = 0; i < referencedCodePoints.length; i++)
- this.currentAttr.value += toChar(referencedCodePoints[i]);
- } else
- this.currentAttr.value += '&';
+ else
+ genericStartTagInBody(p, token);
- this.state = this.returnState;
-};
+ break;
+ case 7:
+ if (tn === $.BGSOUND)
+ startTagInHead(p, token);
-//12.2.4.42 After attribute value (quoted) state
-//------------------------------------------------------------------
-_[AFTER_ATTRIBUTE_VALUE_QUOTED_STATE] = function afterAttributeValueQuotedState(cp) {
- if (isWhitespace(cp))
- this.state = BEFORE_ATTRIBUTE_NAME_STATE;
+ else if (tn === $.DETAILS || tn === $.ADDRESS || tn === $.ARTICLE || tn === $.SECTION || tn === $.SUMMARY)
+ addressStartTagInBody(p, token);
- else if (cp === $.SOLIDUS)
- this.state = SELF_CLOSING_START_TAG_STATE;
+ else if (tn === $.LISTING)
+ preStartTagInBody(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ else if (tn === $.MARQUEE)
+ appletStartTagInBody(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.NOEMBED)
+ noembedStartTagInBody(p, token);
- else
- this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
-};
+ else if (tn !== $.CAPTION)
+ genericStartTagInBody(p, token);
+ break;
-//12.2.4.43 Self-closing start tag state
-//------------------------------------------------------------------
-_[SELF_CLOSING_START_TAG_STATE] = function selfClosingStartTagState(cp) {
- if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.selfClosing = true;
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ case 8:
+ if (tn === $.BASEFONT)
+ startTagInHead(p, token);
- else if (cp === $.EOF)
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.MENUITEM)
+ menuitemStartTagInBody(p, token);
- else
- this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
-};
+ else if (tn === $.FRAMESET)
+ framesetStartTagInBody(p, token);
+ else if (tn === $.FIELDSET)
+ addressStartTagInBody(p, token);
-//12.2.4.44 Bogus comment state
-//------------------------------------------------------------------
-_[BOGUS_COMMENT_STATE] = function bogusCommentState(cp) {
- this._createCommentToken();
+ else if (tn === $.TEXTAREA)
+ textareaStartTagInBody(p, token);
- while (true) {
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- break;
- }
+ else if (tn === $.TEMPLATE)
+ startTagInHead(p, token);
- else if (cp === $.EOF) {
- this._reconsumeInState(DATA_STATE);
- break;
- }
+ else if (tn === $.NOSCRIPT)
+ noembedStartTagInBody(p, token);
- else {
- this.currentToken.data += cp === $.NULL ? UNICODE.REPLACEMENT_CHARACTER : toChar(cp);
- cp = this._consume();
- }
- }
+ else if (tn === $.OPTGROUP)
+ optgroupStartTagInBody(p, token);
- this._emitCurrentToken();
-};
+ else if (tn !== $.COLGROUP)
+ genericStartTagInBody(p, token);
+ break;
-//12.2.4.45 Markup declaration open state
-//------------------------------------------------------------------
-_[MARKUP_DECLARATION_OPEN_STATE] = function markupDeclarationOpenState(cp) {
- if (this._consumeSubsequentIfMatch($$.DASH_DASH_STRING, cp, true)) {
- this._createCommentToken();
- this.state = COMMENT_START_STATE;
- }
+ case 9:
+ if (tn === $.PLAINTEXT)
+ plaintextStartTagInBody(p, token);
- else if (this._consumeSubsequentIfMatch($$.DOCTYPE_STRING, cp, false))
- this.state = DOCTYPE_STATE;
+ else
+ genericStartTagInBody(p, token);
- else if (this.allowCDATA && this._consumeSubsequentIfMatch($$.CDATA_START_STRING, cp, true))
- this.state = CDATA_SECTION_STATE;
+ break;
- else {
- //NOTE: call bogus comment state directly with current consumed character to avoid unnecessary reconsumption.
- this[BOGUS_COMMENT_STATE](cp);
- }
-};
+ case 10:
+ if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
+ addressStartTagInBody(p, token);
+ else
+ genericStartTagInBody(p, token);
-//12.2.4.46 Comment start state
-//------------------------------------------------------------------
-_[COMMENT_START_STATE] = function commentStartState(cp) {
- if (cp === $.HYPHEN_MINUS)
- this.state = COMMENT_START_DASH_STATE;
+ break;
- else if (cp === $.NULL) {
- this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
- this.state = COMMENT_STATE;
+ default:
+ genericStartTagInBody(p, token);
}
+}
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
+function bodyEndTagInBody(p) {
+ if (p.openElements.hasInScope($.BODY))
+ p.insertionMode = AFTER_BODY_MODE;
+}
+
+function htmlEndTagInBody(p, token) {
+ if (p.openElements.hasInScope($.BODY)) {
+ p.insertionMode = AFTER_BODY_MODE;
+ p._processToken(token);
}
+}
- else if (cp === $.EOF) {
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
+function addressEndTagInBody(p, token) {
+ var tn = token.tagName;
+
+ if (p.openElements.hasInScope(tn)) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped(tn);
}
+}
- else {
- this.currentToken.data += toChar(cp);
- this.state = COMMENT_STATE;
+function formEndTagInBody(p) {
+ var inTemplate = p.openElements.tmplCount > 0,
+ formElement = p.formElement;
+
+ if (!inTemplate)
+ p.formElement = null;
+
+ if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) {
+ p.openElements.generateImpliedEndTags();
+
+ if (inTemplate)
+ p.openElements.popUntilTagNamePopped($.FORM);
+
+ else
+ p.openElements.remove(formElement);
}
-};
+}
+function pEndTagInBody(p) {
+ if (!p.openElements.hasInButtonScope($.P))
+ p._insertFakeElement($.P);
-//12.2.4.47 Comment start dash state
-//------------------------------------------------------------------
-_[COMMENT_START_DASH_STATE] = function commentStartDashState(cp) {
- if (cp === $.HYPHEN_MINUS)
- this.state = COMMENT_END_STATE;
+ p._closePElement();
+}
- else if (cp === $.NULL) {
- this.currentToken.data += '-';
- this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
- this.state = COMMENT_STATE;
+function liEndTagInBody(p) {
+ if (p.openElements.hasInListItemScope($.LI)) {
+ p.openElements.generateImpliedEndTagsWithExclusion($.LI);
+ p.openElements.popUntilTagNamePopped($.LI);
}
+}
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
+function ddEndTagInBody(p, token) {
+ var tn = token.tagName;
+
+ if (p.openElements.hasInScope(tn)) {
+ p.openElements.generateImpliedEndTagsWithExclusion(tn);
+ p.openElements.popUntilTagNamePopped(tn);
}
+}
- else if (cp === $.EOF) {
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
+function numberedHeaderEndTagInBody(p) {
+ if (p.openElements.hasNumberedHeaderInScope()) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilNumberedHeaderPopped();
}
+}
- else {
- this.currentToken.data += '-';
- this.currentToken.data += toChar(cp);
- this.state = COMMENT_STATE;
+function appletEndTagInBody(p, token) {
+ var tn = token.tagName;
+
+ if (p.openElements.hasInScope(tn)) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped(tn);
+ p.activeFormattingElements.clearToLastMarker();
}
-};
+}
+function brEndTagInBody(p) {
+ p._reconstructActiveFormattingElements();
+ p._insertFakeElement($.BR);
+ p.openElements.pop();
+ p.framesetOk = false;
+}
-//12.2.4.48 Comment state
-//------------------------------------------------------------------
-_[COMMENT_STATE] = function commentState(cp) {
- if (cp === $.HYPHEN_MINUS)
- this.state = COMMENT_END_DASH_STATE;
+function genericEndTagInBody(p, token) {
+ var tn = token.tagName;
- else if (cp === $.NULL)
- this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
+ for (var i = p.openElements.stackTop; i > 0; i--) {
+ var element = p.openElements.items[i];
- else if (cp === $.EOF) {
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
+ if (p.treeAdapter.getTagName(element) === tn) {
+ p.openElements.generateImpliedEndTagsWithExclusion(tn);
+ p.openElements.popUntilElementPopped(element);
+ break;
+ }
+
+ if (p._isSpecialElement(element))
+ break;
}
+}
- else
- this.currentToken.data += toChar(cp);
-};
+//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
+//It's faster than using dictionary.
+function endTagInBody(p, token) {
+ var tn = token.tagName;
+ switch (tn.length) {
+ case 1:
+ if (tn === $.A || tn === $.B || tn === $.I || tn === $.S || tn === $.U)
+ callAdoptionAgency(p, token);
-//12.2.4.49 Comment end dash state
-//------------------------------------------------------------------
-_[COMMENT_END_DASH_STATE] = function commentEndDashState(cp) {
- if (cp === $.HYPHEN_MINUS)
- this.state = COMMENT_END_STATE;
+ else if (tn === $.P)
+ pEndTagInBody(p, token);
- else if (cp === $.NULL) {
- this.currentToken.data += '-';
- this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
- this.state = COMMENT_STATE;
- }
+ else
+ genericEndTagInBody(p, token);
- else if (cp === $.EOF) {
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ break;
- else {
- this.currentToken.data += '-';
- this.currentToken.data += toChar(cp);
- this.state = COMMENT_STATE;
- }
-};
+ case 2:
+ if (tn === $.DL || tn === $.UL || tn === $.OL)
+ addressEndTagInBody(p, token);
+ else if (tn === $.LI)
+ liEndTagInBody(p, token);
-//12.2.4.50 Comment end state
-//------------------------------------------------------------------
-_[COMMENT_END_STATE] = function commentEndState(cp) {
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ else if (tn === $.DD || tn === $.DT)
+ ddEndTagInBody(p, token);
- else if (cp === $.EXCLAMATION_MARK)
- this.state = COMMENT_END_BANG_STATE;
+ else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
+ numberedHeaderEndTagInBody(p, token);
- else if (cp === $.HYPHEN_MINUS)
- this.currentToken.data += '-';
+ else if (tn === $.BR)
+ brEndTagInBody(p, token);
- else if (cp === $.NULL) {
- this.currentToken.data += '--';
- this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
- this.state = COMMENT_STATE;
- }
+ else if (tn === $.EM || tn === $.TT)
+ callAdoptionAgency(p, token);
- else if (cp === $.EOF) {
- this._reconsumeInState(DATA_STATE);
- this._emitCurrentToken();
- }
+ else
+ genericEndTagInBody(p, token);
- else {
- this.currentToken.data += '--';
- this.currentToken.data += toChar(cp);
- this.state = COMMENT_STATE;
- }
-};
+ break;
+ case 3:
+ if (tn === $.BIG)
+ callAdoptionAgency(p, token);
-//12.2.4.51 Comment end bang state
-//------------------------------------------------------------------
-_[COMMENT_END_BANG_STATE] = function commentEndBangState(cp) {
- if (cp === $.HYPHEN_MINUS) {
- this.currentToken.data += '--!';
- this.state = COMMENT_END_DASH_STATE;
- }
+ else if (tn === $.DIR || tn === $.DIV || tn === $.NAV)
+ addressEndTagInBody(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ else
+ genericEndTagInBody(p, token);
- else if (cp === $.NULL) {
- this.currentToken.data += '--!';
- this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
- this.state = COMMENT_STATE;
- }
+ break;
- else if (cp === $.EOF) {
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ case 4:
+ if (tn === $.BODY)
+ bodyEndTagInBody(p, token);
- else {
- this.currentToken.data += '--!';
- this.currentToken.data += toChar(cp);
- this.state = COMMENT_STATE;
- }
-};
+ else if (tn === $.HTML)
+ htmlEndTagInBody(p, token);
+ else if (tn === $.FORM)
+ formEndTagInBody(p, token);
-//12.2.4.52 DOCTYPE state
-//------------------------------------------------------------------
-_[DOCTYPE_STATE] = function doctypeState(cp) {
- if (isWhitespace(cp))
- this.state = BEFORE_DOCTYPE_NAME_STATE;
+ else if (tn === $.CODE || tn === $.FONT || tn === $.NOBR)
+ callAdoptionAgency(p, token);
- else if (cp === $.EOF) {
- this._createDoctypeToken();
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ else if (tn === $.MAIN || tn === $.MENU)
+ addressEndTagInBody(p, token);
- else
- this._reconsumeInState(BEFORE_DOCTYPE_NAME_STATE);
-};
+ else
+ genericEndTagInBody(p, token);
+ break;
-//12.2.4.53 Before DOCTYPE name state
-//------------------------------------------------------------------
-_[BEFORE_DOCTYPE_NAME_STATE] = function beforeDoctypeNameState(cp) {
- if (isWhitespace(cp))
- return;
+ case 5:
+ if (tn === $.ASIDE)
+ addressEndTagInBody(p, token);
- if (isAsciiUpper(cp)) {
- this._createDoctypeToken(toAsciiLowerChar(cp));
- this.state = DOCTYPE_NAME_STATE;
- }
+ else if (tn === $.SMALL)
+ callAdoptionAgency(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this._createDoctypeToken();
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
+ else
+ genericEndTagInBody(p, token);
- else if (cp === $.EOF) {
- this._createDoctypeToken();
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ break;
- else if (cp === $.NULL) {
- this._createDoctypeToken(UNICODE.REPLACEMENT_CHARACTER);
- this.state = DOCTYPE_NAME_STATE;
- }
+ case 6:
+ if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
+ addressEndTagInBody(p, token);
- else {
- this._createDoctypeToken(toChar(cp));
- this.state = DOCTYPE_NAME_STATE;
- }
-};
+ else if (tn === $.APPLET || tn === $.OBJECT)
+ appletEndTagInBody(p, token);
+ else if (tn === $.STRIKE || tn === $.STRONG)
+ callAdoptionAgency(p, token);
-//12.2.4.54 DOCTYPE name state
-//------------------------------------------------------------------
-_[DOCTYPE_NAME_STATE] = function doctypeNameState(cp) {
- if (isWhitespace(cp))
- this.state = AFTER_DOCTYPE_NAME_STATE;
+ else
+ genericEndTagInBody(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
+ break;
- else if (isAsciiUpper(cp))
- this.currentToken.name += toAsciiLowerChar(cp);
+ case 7:
+ if (tn === $.ADDRESS || tn === $.ARTICLE || tn === $.DETAILS || tn === $.SECTION || tn === $.SUMMARY)
+ addressEndTagInBody(p, token);
- else if (cp === $.NULL)
- this.currentToken.name += UNICODE.REPLACEMENT_CHARACTER;
+ else if (tn === $.MARQUEE)
+ appletEndTagInBody(p, token);
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ else
+ genericEndTagInBody(p, token);
- else
- this.currentToken.name += toChar(cp);
-};
+ break;
+ case 8:
+ if (tn === $.FIELDSET)
+ addressEndTagInBody(p, token);
-//12.2.4.55 After DOCTYPE name state
-//------------------------------------------------------------------
-_[AFTER_DOCTYPE_NAME_STATE] = function afterDoctypeNameState(cp) {
- if (isWhitespace(cp))
- return;
+ else if (tn === $.TEMPLATE)
+ endTagInHead(p, token);
- if (cp === $.GREATER_THAN_SIGN) {
- this.state = DATA_STATE;
- this._emitCurrentToken();
- }
+ else
+ genericEndTagInBody(p, token);
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ break;
- else if (this._consumeSubsequentIfMatch($$.PUBLIC_STRING, cp, false))
- this.state = AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE;
+ case 10:
+ if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
+ addressEndTagInBody(p, token);
- else if (this._consumeSubsequentIfMatch($$.SYSTEM_STRING, cp, false))
- this.state = AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE;
+ else
+ genericEndTagInBody(p, token);
- else {
- this.currentToken.forceQuirks = true;
- this.state = BOGUS_DOCTYPE_STATE;
+ break;
+
+ default :
+ genericEndTagInBody(p, token);
}
-};
+}
+function eofInBody(p, token) {
+ if (p.tmplInsertionModeStackTop > -1)
+ eofInTemplate(p, token);
-//12.2.4.56 After DOCTYPE public keyword state
-//------------------------------------------------------------------
-_[AFTER_DOCTYPE_PUBLIC_KEYWORD_STATE] = function afterDoctypePublicKeywordState(cp) {
- if (isWhitespace(cp))
- this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
+ else
+ p.stopped = true;
+}
- else if (cp === $.QUOTATION_MARK) {
- this.currentToken.publicId = '';
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;
- }
+//12.2.5.4.8 The "text" insertion mode
+//------------------------------------------------------------------
+function endTagInText(p, token) {
+ if (token.tagName === $.SCRIPT)
+ p.pendingScript = p.openElements.current;
- else if (cp === $.APOSTROPHE) {
- this.currentToken.publicId = '';
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
- }
+ p.openElements.pop();
+ p.insertionMode = p.originalInsertionMode;
+}
- else if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+function eofInText(p, token) {
+ p.openElements.pop();
+ p.insertionMode = p.originalInsertionMode;
+ p._processToken(token);
+}
- else {
- this.currentToken.forceQuirks = true;
- this.state = BOGUS_DOCTYPE_STATE;
+
+//12.2.5.4.9 The "in table" insertion mode
+//------------------------------------------------------------------
+function characterInTable(p, token) {
+ var curTn = p.openElements.currentTagName;
+
+ if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) {
+ p.pendingCharacterTokens = [];
+ p.hasNonWhitespacePendingCharacterToken = false;
+ p.originalInsertionMode = p.insertionMode;
+ p.insertionMode = IN_TABLE_TEXT_MODE;
+ p._processToken(token);
}
-};
+ else
+ tokenInTable(p, token);
+}
-//12.2.4.57 Before DOCTYPE public identifier state
-//------------------------------------------------------------------
-_[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifierState(cp) {
- if (isWhitespace(cp))
- return;
+function captionStartTagInTable(p, token) {
+ p.openElements.clearBackToTableContext();
+ p.activeFormattingElements.insertMarker();
+ p._insertElement(token, NS.HTML);
+ p.insertionMode = IN_CAPTION_MODE;
+}
- if (cp === $.QUOTATION_MARK) {
- this.currentToken.publicId = '';
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;
- }
+function colgroupStartTagInTable(p, token) {
+ p.openElements.clearBackToTableContext();
+ p._insertElement(token, NS.HTML);
+ p.insertionMode = IN_COLUMN_GROUP_MODE;
+}
- else if (cp === $.APOSTROPHE) {
- this.currentToken.publicId = '';
- this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
- }
+function colStartTagInTable(p, token) {
+ p.openElements.clearBackToTableContext();
+ p._insertFakeElement($.COLGROUP);
+ p.insertionMode = IN_COLUMN_GROUP_MODE;
+ p._processToken(token);
+}
- else if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
+function tbodyStartTagInTable(p, token) {
+ p.openElements.clearBackToTableContext();
+ p._insertElement(token, NS.HTML);
+ p.insertionMode = IN_TABLE_BODY_MODE;
+}
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+function tdStartTagInTable(p, token) {
+ p.openElements.clearBackToTableContext();
+ p._insertFakeElement($.TBODY);
+ p.insertionMode = IN_TABLE_BODY_MODE;
+ p._processToken(token);
+}
- else {
- this.currentToken.forceQuirks = true;
- this.state = BOGUS_DOCTYPE_STATE;
+function tableStartTagInTable(p, token) {
+ if (p.openElements.hasInTableScope($.TABLE)) {
+ p.openElements.popUntilTagNamePopped($.TABLE);
+ p._resetInsertionMode();
+ p._processToken(token);
}
-};
+}
+function inputStartTagInTable(p, token) {
+ var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
-//12.2.4.58 DOCTYPE public identifier (double-quoted) state
-//------------------------------------------------------------------
-_[DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypePublicIdentifierDoubleQuotedState(cp) {
- if (cp === $.QUOTATION_MARK)
- this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
+ if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE)
+ p._appendElement(token, NS.HTML);
- else if (cp === $.NULL)
- this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
+ else
+ tokenInTable(p, token);
+}
- else if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
+function formStartTagInTable(p, token) {
+ if (!p.formElement && p.openElements.tmplCount === 0) {
+ p._insertElement(token, NS.HTML);
+ p.formElement = p.openElements.current;
+ p.openElements.pop();
}
+}
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+function startTagInTable(p, token) {
+ var tn = token.tagName;
- else
- this.currentToken.publicId += toChar(cp);
-};
+ switch (tn.length) {
+ case 2:
+ if (tn === $.TD || tn === $.TH || tn === $.TR)
+ tdStartTagInTable(p, token);
+ else
+ tokenInTable(p, token);
-//12.2.4.59 DOCTYPE public identifier (single-quoted) state
-//------------------------------------------------------------------
-_[DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypePublicIdentifierSingleQuotedState(cp) {
- if (cp === $.APOSTROPHE)
- this.state = AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
+ break;
- else if (cp === $.NULL)
- this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
+ case 3:
+ if (tn === $.COL)
+ colStartTagInTable(p, token);
- else if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
+ else
+ tokenInTable(p, token);
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ break;
- else
- this.currentToken.publicId += toChar(cp);
-};
+ case 4:
+ if (tn === $.FORM)
+ formStartTagInTable(p, token);
+ else
+ tokenInTable(p, token);
-//12.2.4.60 After DOCTYPE public identifier state
-//------------------------------------------------------------------
-_[AFTER_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function afterDoctypePublicIdentifierState(cp) {
- if (isWhitespace(cp))
- this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
+ break;
- else if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
+ case 5:
+ if (tn === $.TABLE)
+ tableStartTagInTable(p, token);
- else if (cp === $.QUOTATION_MARK) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
- }
+ else if (tn === $.STYLE)
+ startTagInHead(p, token);
- else if (cp === $.APOSTROPHE) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
- }
+ else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD)
+ tbodyStartTagInTable(p, token);
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ else if (tn === $.INPUT)
+ inputStartTagInTable(p, token);
- else {
- this.currentToken.forceQuirks = true;
- this.state = BOGUS_DOCTYPE_STATE;
- }
-};
+ else
+ tokenInTable(p, token);
+ break;
-//12.2.4.61 Between DOCTYPE public and system identifiers state
-//------------------------------------------------------------------
-_[BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE] = function betweenDoctypePublicAndSystemIdentifiersState(cp) {
- if (isWhitespace(cp))
- return;
+ case 6:
+ if (tn === $.SCRIPT)
+ startTagInHead(p, token);
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
+ else
+ tokenInTable(p, token);
- else if (cp === $.QUOTATION_MARK) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
- }
+ break;
+ case 7:
+ if (tn === $.CAPTION)
+ captionStartTagInTable(p, token);
- else if (cp === $.APOSTROPHE) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
- }
+ else
+ tokenInTable(p, token);
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ break;
- else {
- this.currentToken.forceQuirks = true;
- this.state = BOGUS_DOCTYPE_STATE;
- }
-};
+ case 8:
+ if (tn === $.COLGROUP)
+ colgroupStartTagInTable(p, token);
+ else if (tn === $.TEMPLATE)
+ startTagInHead(p, token);
-//12.2.4.62 After DOCTYPE system keyword state
-//------------------------------------------------------------------
-_[AFTER_DOCTYPE_SYSTEM_KEYWORD_STATE] = function afterDoctypeSystemKeywordState(cp) {
- if (isWhitespace(cp))
- this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
+ else
+ tokenInTable(p, token);
- else if (cp === $.QUOTATION_MARK) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
- }
+ break;
- else if (cp === $.APOSTROPHE) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
+ default:
+ tokenInTable(p, token);
}
- else if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
+}
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+function endTagInTable(p, token) {
+ var tn = token.tagName;
- else {
- this.currentToken.forceQuirks = true;
- this.state = BOGUS_DOCTYPE_STATE;
+ if (tn === $.TABLE) {
+ if (p.openElements.hasInTableScope($.TABLE)) {
+ p.openElements.popUntilTagNamePopped($.TABLE);
+ p._resetInsertionMode();
+ }
}
-};
+ else if (tn === $.TEMPLATE)
+ endTagInHead(p, token);
-//12.2.4.63 Before DOCTYPE system identifier state
-//------------------------------------------------------------------
-_[BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function beforeDoctypeSystemIdentifierState(cp) {
- if (isWhitespace(cp))
- return;
+ else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML &&
+ tn !== $.TBODY && tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR)
+ tokenInTable(p, token);
+}
- if (cp === $.QUOTATION_MARK) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
- }
+function tokenInTable(p, token) {
+ var savedFosterParentingState = p.fosterParentingEnabled;
- else if (cp === $.APOSTROPHE) {
- this.currentToken.systemId = '';
- this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
- }
+ p.fosterParentingEnabled = true;
+ p._processTokenInBodyMode(token);
+ p.fosterParentingEnabled = savedFosterParentingState;
+}
- else if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
+//12.2.5.4.10 The "in table text" insertion mode
+//------------------------------------------------------------------
+function whitespaceCharacterInTableText(p, token) {
+ p.pendingCharacterTokens.push(token);
+}
+
+function characterInTableText(p, token) {
+ p.pendingCharacterTokens.push(token);
+ p.hasNonWhitespacePendingCharacterToken = true;
+}
+
+function tokenInTableText(p, token) {
+ var i = 0;
+
+ if (p.hasNonWhitespacePendingCharacterToken) {
+ for (; i < p.pendingCharacterTokens.length; i++)
+ tokenInTable(p, p.pendingCharacterTokens[i]);
}
else {
- this.currentToken.forceQuirks = true;
- this.state = BOGUS_DOCTYPE_STATE;
+ for (; i < p.pendingCharacterTokens.length; i++)
+ p._insertCharacters(p.pendingCharacterTokens[i]);
}
-};
+ p.insertionMode = p.originalInsertionMode;
+ p._processToken(token);
+}
-//12.2.4.64 DOCTYPE system identifier (double-quoted) state
-//------------------------------------------------------------------
-_[DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypeSystemIdentifierDoubleQuotedState(cp) {
- if (cp === $.QUOTATION_MARK)
- this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
- else if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
+//12.2.5.4.11 The "in caption" insertion mode
+//------------------------------------------------------------------
+function startTagInCaption(p, token) {
+ var tn = token.tagName;
+
+ if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
+ tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
+ if (p.openElements.hasInTableScope($.CAPTION)) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped($.CAPTION);
+ p.activeFormattingElements.clearToLastMarker();
+ p.insertionMode = IN_TABLE_MODE;
+ p._processToken(token);
+ }
}
- else if (cp === $.NULL)
- this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER;
+ else
+ startTagInBody(p, token);
+}
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
+function endTagInCaption(p, token) {
+ var tn = token.tagName;
+
+ if (tn === $.CAPTION || tn === $.TABLE) {
+ if (p.openElements.hasInTableScope($.CAPTION)) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped($.CAPTION);
+ p.activeFormattingElements.clearToLastMarker();
+ p.insertionMode = IN_TABLE_MODE;
+
+ if (tn === $.TABLE)
+ p._processToken(token);
+ }
}
- else
- this.currentToken.systemId += toChar(cp);
-};
+ else if (tn !== $.BODY && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML && tn !== $.TBODY &&
+ tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR)
+ endTagInBody(p, token);
+}
-//12.2.4.65 DOCTYPE system identifier (single-quoted) state
+//12.2.5.4.12 The "in column group" insertion mode
//------------------------------------------------------------------
-_[DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypeSystemIdentifierSingleQuotedState(cp) {
- if (cp === $.APOSTROPHE)
- this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
+function startTagInColumnGroup(p, token) {
+ var tn = token.tagName;
- else if (cp === $.GREATER_THAN_SIGN) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this.state = DATA_STATE;
- }
+ if (tn === $.HTML)
+ startTagInBody(p, token);
- else if (cp === $.NULL)
- this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER;
+ else if (tn === $.COL)
+ p._appendElement(token, NS.HTML);
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
- }
+ else if (tn === $.TEMPLATE)
+ startTagInHead(p, token);
else
- this.currentToken.systemId += toChar(cp);
-};
+ tokenInColumnGroup(p, token);
+}
+function endTagInColumnGroup(p, token) {
+ var tn = token.tagName;
-//12.2.4.66 After DOCTYPE system identifier state
+ if (tn === $.COLGROUP) {
+ if (p.openElements.currentTagName === $.COLGROUP) {
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_MODE;
+ }
+ }
+
+ else if (tn === $.TEMPLATE)
+ endTagInHead(p, token);
+
+ else if (tn !== $.COL)
+ tokenInColumnGroup(p, token);
+}
+
+function tokenInColumnGroup(p, token) {
+ if (p.openElements.currentTagName === $.COLGROUP) {
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_MODE;
+ p._processToken(token);
+ }
+}
+
+//12.2.5.4.13 The "in table body" insertion mode
//------------------------------------------------------------------
-_[AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function afterDoctypeSystemIdentifierState(cp) {
- if (isWhitespace(cp))
- return;
+function startTagInTableBody(p, token) {
+ var tn = token.tagName;
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
+ if (tn === $.TR) {
+ p.openElements.clearBackToTableBodyContext();
+ p._insertElement(token, NS.HTML);
+ p.insertionMode = IN_ROW_MODE;
}
- else if (cp === $.EOF) {
- this.currentToken.forceQuirks = true;
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.TH || tn === $.TD) {
+ p.openElements.clearBackToTableBodyContext();
+ p._insertFakeElement($.TR);
+ p.insertionMode = IN_ROW_MODE;
+ p._processToken(token);
+ }
+
+ else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP ||
+ tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
+
+ if (p.openElements.hasTableBodyContextInTableScope()) {
+ p.openElements.clearBackToTableBodyContext();
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_MODE;
+ p._processToken(token);
+ }
}
else
- this.state = BOGUS_DOCTYPE_STATE;
-};
+ startTagInTable(p, token);
+}
+function endTagInTableBody(p, token) {
+ var tn = token.tagName;
-//12.2.4.67 Bogus DOCTYPE state
-//------------------------------------------------------------------
-_[BOGUS_DOCTYPE_STATE] = function bogusDoctypeState(cp) {
- if (cp === $.GREATER_THAN_SIGN) {
- this._emitCurrentToken();
- this.state = DATA_STATE;
+ if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
+ if (p.openElements.hasInTableScope(tn)) {
+ p.openElements.clearBackToTableBodyContext();
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_MODE;
+ }
}
- else if (cp === $.EOF) {
- this._emitCurrentToken();
- this._reconsumeInState(DATA_STATE);
+ else if (tn === $.TABLE) {
+ if (p.openElements.hasTableBodyContextInTableScope()) {
+ p.openElements.clearBackToTableBodyContext();
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_MODE;
+ p._processToken(token);
+ }
}
-};
+ else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
+ tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR)
+ endTagInTable(p, token);
+}
-//12.2.4.68 CDATA section state
+//12.2.5.4.14 The "in row" insertion mode
//------------------------------------------------------------------
-_[CDATA_SECTION_STATE] = function cdataSectionState(cp) {
- while (true) {
- if (cp === $.EOF) {
- this._reconsumeInState(DATA_STATE);
- break;
+function startTagInRow(p, token) {
+ var tn = token.tagName;
+
+ if (tn === $.TH || tn === $.TD) {
+ p.openElements.clearBackToTableRowContext();
+ p._insertElement(token, NS.HTML);
+ p.insertionMode = IN_CELL_MODE;
+ p.activeFormattingElements.insertMarker();
+ }
+
+ else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
+ tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
+ if (p.openElements.hasInTableScope($.TR)) {
+ p.openElements.clearBackToTableRowContext();
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_BODY_MODE;
+ p._processToken(token);
}
+ }
- else if (this._consumeSubsequentIfMatch($$.CDATA_END_STRING, cp, true)) {
- this.state = DATA_STATE;
- break;
+ else
+ startTagInTable(p, token);
+}
+
+function endTagInRow(p, token) {
+ var tn = token.tagName;
+
+ if (tn === $.TR) {
+ if (p.openElements.hasInTableScope($.TR)) {
+ p.openElements.clearBackToTableRowContext();
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_BODY_MODE;
}
+ }
- else {
- this._emitCodePoint(cp);
- cp = this._consume();
+ else if (tn === $.TABLE) {
+ if (p.openElements.hasInTableScope($.TR)) {
+ p.openElements.clearBackToTableRowContext();
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_BODY_MODE;
+ p._processToken(token);
}
}
-};
-
-},{"../common/unicode":82,"./location_info_mixin":89,"./named_entity_trie":90,"./preprocessor":91}],93:[function(require,module,exports){
-'use strict';
-//Node construction
-exports.createDocument = function () {
- return {
- nodeName: '#document',
- quirksMode: false,
- childNodes: []
- };
-};
+ else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
+ if (p.openElements.hasInTableScope(tn) || p.openElements.hasInTableScope($.TR)) {
+ p.openElements.clearBackToTableRowContext();
+ p.openElements.pop();
+ p.insertionMode = IN_TABLE_BODY_MODE;
+ p._processToken(token);
+ }
+ }
-exports.createDocumentFragment = function () {
- return {
- nodeName: '#document-fragment',
- quirksMode: false,
- childNodes: []
- };
-};
+ else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
+ tn !== $.HTML && tn !== $.TD && tn !== $.TH)
+ endTagInTable(p, token);
+}
-exports.createElement = function (tagName, namespaceURI, attrs) {
- return {
- nodeName: tagName,
- tagName: tagName,
- attrs: attrs,
- namespaceURI: namespaceURI,
- childNodes: [],
- parentNode: null
- };
-};
-exports.createCommentNode = function (data) {
- return {
- nodeName: '#comment',
- data: data,
- parentNode: null
- };
-};
+//12.2.5.4.15 The "in cell" insertion mode
+//------------------------------------------------------------------
+function startTagInCell(p, token) {
+ var tn = token.tagName;
-var createTextNode = function (value) {
- return {
- nodeName: '#text',
- value: value,
- parentNode: null
+ if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
+ tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
+
+ if (p.openElements.hasInTableScope($.TD) || p.openElements.hasInTableScope($.TH)) {
+ p._closeTableCell();
+ p._processToken(token);
+ }
}
-};
+ else
+ startTagInBody(p, token);
+}
-//Tree mutation
-exports.setDocumentType = function (document, name, publicId, systemId) {
- var doctypeNode = null;
+function endTagInCell(p, token) {
+ var tn = token.tagName;
- for (var i = 0; i < document.childNodes.length; i++) {
- if (document.childNodes[i].nodeName === '#documentType') {
- doctypeNode = document.childNodes[i];
- break;
+ if (tn === $.TD || tn === $.TH) {
+ if (p.openElements.hasInTableScope(tn)) {
+ p.openElements.generateImpliedEndTags();
+ p.openElements.popUntilTagNamePopped(tn);
+ p.activeFormattingElements.clearToLastMarker();
+ p.insertionMode = IN_ROW_MODE;
}
}
- if (doctypeNode) {
- doctypeNode.name = name;
- doctypeNode.publicId = publicId;
- doctypeNode.systemId = systemId;
+ else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
+ if (p.openElements.hasInTableScope(tn)) {
+ p._closeTableCell();
+ p._processToken(token);
+ }
}
- else {
- appendChild(document, {
- nodeName: '#documentType',
- name: name,
- publicId: publicId,
- systemId: systemId
- });
- }
-};
+ else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML)
+ endTagInBody(p, token);
+}
-exports.setQuirksMode = function (document) {
- document.quirksMode = true;
-};
+//12.2.5.4.16 The "in select" insertion mode
+//------------------------------------------------------------------
+function startTagInSelect(p, token) {
+ var tn = token.tagName;
-exports.isQuirksMode = function (document) {
- return document.quirksMode;
-};
+ if (tn === $.HTML)
+ startTagInBody(p, token);
-var appendChild = exports.appendChild = function (parentNode, newNode) {
- parentNode.childNodes.push(newNode);
- newNode.parentNode = parentNode;
-};
+ else if (tn === $.OPTION) {
+ if (p.openElements.currentTagName === $.OPTION)
+ p.openElements.pop();
-var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
- var insertionIdx = parentNode.childNodes.indexOf(referenceNode);
+ p._insertElement(token, NS.HTML);
+ }
- parentNode.childNodes.splice(insertionIdx, 0, newNode);
- newNode.parentNode = parentNode;
-};
+ else if (tn === $.OPTGROUP) {
+ if (p.openElements.currentTagName === $.OPTION)
+ p.openElements.pop();
-exports.detachNode = function (node) {
- if (node.parentNode) {
- var idx = node.parentNode.childNodes.indexOf(node);
+ if (p.openElements.currentTagName === $.OPTGROUP)
+ p.openElements.pop();
- node.parentNode.childNodes.splice(idx, 1);
- node.parentNode = null;
+ p._insertElement(token, NS.HTML);
}
-};
-exports.insertText = function (parentNode, text) {
- if (parentNode.childNodes.length) {
- var prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
+ else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA || tn === $.SELECT) {
+ if (p.openElements.hasInSelectScope($.SELECT)) {
+ p.openElements.popUntilTagNamePopped($.SELECT);
+ p._resetInsertionMode();
- if (prevNode.nodeName === '#text') {
- prevNode.value += text;
- return;
+ if (tn !== $.SELECT)
+ p._processToken(token);
}
}
- appendChild(parentNode, createTextNode(text));
-};
+ else if (tn === $.SCRIPT || tn === $.TEMPLATE)
+ startTagInHead(p, token);
+}
-exports.insertTextBefore = function (parentNode, text, referenceNode) {
- var prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
+function endTagInSelect(p, token) {
+ var tn = token.tagName;
- if (prevNode && prevNode.nodeName === '#text')
- prevNode.value += text;
- else
- insertBefore(parentNode, createTextNode(text), referenceNode);
-};
+ if (tn === $.OPTGROUP) {
+ var prevOpenElement = p.openElements.items[p.openElements.stackTop - 1],
+ prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement);
-exports.adoptAttributes = function (recipientNode, attrs) {
- var recipientAttrsMap = [];
+ if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP)
+ p.openElements.pop();
- for (var i = 0; i < recipientNode.attrs.length; i++)
- recipientAttrsMap.push(recipientNode.attrs[i].name);
+ if (p.openElements.currentTagName === $.OPTGROUP)
+ p.openElements.pop();
+ }
- for (var j = 0; j < attrs.length; j++) {
- if (recipientAttrsMap.indexOf(attrs[j].name) === -1)
- recipientNode.attrs.push(attrs[j]);
+ else if (tn === $.OPTION) {
+ if (p.openElements.currentTagName === $.OPTION)
+ p.openElements.pop();
}
-};
+ else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) {
+ p.openElements.popUntilTagNamePopped($.SELECT);
+ p._resetInsertionMode();
+ }
-//Tree traversing
-exports.getFirstChild = function (node) {
- return node.childNodes[0];
-};
+ else if (tn === $.TEMPLATE)
+ endTagInHead(p, token);
+}
-exports.getChildNodes = function (node) {
- return node.childNodes;
-};
+//12.2.5.4.17 The "in select in table" insertion mode
+//------------------------------------------------------------------
+function startTagInSelectInTable(p, token) {
+ var tn = token.tagName;
+
+ if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
+ tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
+ p.openElements.popUntilTagNamePopped($.SELECT);
+ p._resetInsertionMode();
+ p._processToken(token);
+ }
-exports.getParentNode = function (node) {
- return node.parentNode;
-};
+ else
+ startTagInSelect(p, token);
+}
-exports.getAttrList = function (node) {
- return node.attrs;
-};
+function endTagInSelectInTable(p, token) {
+ var tn = token.tagName;
-//Node data
-exports.getTagName = function (element) {
- return element.tagName;
-};
+ if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
+ tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
+ if (p.openElements.hasInTableScope(tn)) {
+ p.openElements.popUntilTagNamePopped($.SELECT);
+ p._resetInsertionMode();
+ p._processToken(token);
+ }
+ }
-exports.getNamespaceURI = function (element) {
- return element.namespaceURI;
-};
+ else
+ endTagInSelect(p, token);
+}
-exports.getTextNodeContent = function (textNode) {
- return textNode.value;
-};
+//12.2.5.4.18 The "in template" insertion mode
+//------------------------------------------------------------------
+function startTagInTemplate(p, token) {
+ var tn = token.tagName;
-exports.getCommentNodeContent = function (commentNode) {
- return commentNode.data;
-};
+ if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META ||
+ tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE)
+ startTagInHead(p, token);
-exports.getDocumentTypeNodeName = function (doctypeNode) {
- return doctypeNode.name;
-};
+ else {
+ var newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE;
-exports.getDocumentTypeNodePublicId = function (doctypeNode) {
- return doctypeNode.publicId;
-};
+ p._popTmplInsertionMode();
+ p._pushTmplInsertionMode(newInsertionMode);
+ p.insertionMode = newInsertionMode;
+ p._processToken(token);
+ }
+}
-exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
- return doctypeNode.systemId;
-};
+function endTagInTemplate(p, token) {
+ if (token.tagName === $.TEMPLATE)
+ endTagInHead(p, token);
+}
-//Node types
-exports.isTextNode = function (node) {
- return node.nodeName === '#text';
-};
+function eofInTemplate(p, token) {
+ if (p.openElements.tmplCount > 0) {
+ p.openElements.popUntilTagNamePopped($.TEMPLATE);
+ p.activeFormattingElements.clearToLastMarker();
+ p._popTmplInsertionMode();
+ p._resetInsertionMode();
+ p._processToken(token);
+ }
-exports.isCommentNode = function (node) {
- return node.nodeName === '#comment';
-};
-
-exports.isDocumentTypeNode = function (node) {
- return node.nodeName === '#documentType';
-};
+ else
+ p.stopped = true;
+}
-exports.isElementNode = function (node) {
- return !!node.tagName;
-};
-
-},{}],94:[function(require,module,exports){
-'use strict';
-
-var Doctype = require('../common/doctype');
-
-//Conversion tables for DOM Level1 structure emulation
-var nodeTypes = {
- element: 1,
- text: 3,
- cdata: 4,
- comment: 8
-};
-
-var nodePropertyShorthands = {
- tagName: 'name',
- childNodes: 'children',
- parentNode: 'parent',
- previousSibling: 'prev',
- nextSibling: 'next',
- nodeValue: 'data'
-};
-
-//Node
-var Node = function (props) {
- for (var key in props) {
- if (props.hasOwnProperty(key))
- this[key] = props[key];
- }
-};
-
-Node.prototype = {
- get firstChild() {
- var children = this.children;
- return children && children[0] || null;
- },
-
- get lastChild() {
- var children = this.children;
- return children && children[children.length - 1] || null;
- },
-
- get nodeType() {
- return nodeTypes[this.type] || nodeTypes.element;
- }
-};
-
-Object.keys(nodePropertyShorthands).forEach(function (key) {
- var shorthand = nodePropertyShorthands[key];
-
- Object.defineProperty(Node.prototype, key, {
- get: function () {
- return this[shorthand] || null;
- },
- set: function (val) {
- this[shorthand] = val;
- return val;
- }
- });
-});
-
-
-//Node construction
-exports.createDocument =
-exports.createDocumentFragment = function () {
- return new Node({
- type: 'root',
- name: 'root',
- parent: null,
- prev: null,
- next: null,
- children: []
- });
-};
-
-exports.createElement = function (tagName, namespaceURI, attrs) {
- var attribs = {},
- attribsNamespace = {},
- attribsPrefix = {};
-
- for (var i = 0; i < attrs.length; i++) {
- var attrName = attrs[i].name;
-
- attribs[attrName] = attrs[i].value;
- attribsNamespace[attrName] = attrs[i].namespace;
- attribsPrefix[attrName] = attrs[i].prefix;
- }
-
- return new Node({
- type: tagName === 'script' || tagName === 'style' ? tagName : 'tag',
- name: tagName,
- namespace: namespaceURI,
- attribs: attribs,
- 'x-attribsNamespace': attribsNamespace,
- 'x-attribsPrefix': attribsPrefix,
- children: [],
- parent: null,
- prev: null,
- next: null
- });
-};
-
-exports.createCommentNode = function (data) {
- return new Node({
- type: 'comment',
- data: data,
- parent: null,
- prev: null,
- next: null
- });
-};
-
-var createTextNode = function (value) {
- return new Node({
- type: 'text',
- data: value,
- parent: null,
- prev: null,
- next: null
- });
-};
-
-
-//Tree mutation
-exports.setDocumentType = function (document, name, publicId, systemId) {
- var data = Doctype.serializeContent(name, publicId, systemId),
- doctypeNode = null;
-
- for (var i = 0; i < document.children.length; i++) {
- if (document.children[i].type === 'directive' && document.children[i].name === '!doctype') {
- doctypeNode = document.children[i];
- break;
- }
- }
-
- if (doctypeNode) {
- doctypeNode.data = data;
- doctypeNode['x-name'] = name;
- doctypeNode['x-publicId'] = publicId;
- doctypeNode['x-systemId'] = systemId;
- }
-
- else {
- appendChild(document, new Node({
- type: 'directive',
- name: '!doctype',
- data: data,
- 'x-name': name,
- 'x-publicId': publicId,
- 'x-systemId': systemId
- }));
- }
-
-};
-
-exports.setQuirksMode = function (document) {
- document.quirksMode = true;
-};
-
-exports.isQuirksMode = function (document) {
- return document.quirksMode;
-};
-
-var appendChild = exports.appendChild = function (parentNode, newNode) {
- var prev = parentNode.children[parentNode.children.length - 1];
-
- if (prev) {
- prev.next = newNode;
- newNode.prev = prev;
- }
-
- parentNode.children.push(newNode);
- newNode.parent = parentNode;
-};
-
-var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
- var insertionIdx = parentNode.children.indexOf(referenceNode),
- prev = referenceNode.prev;
-
- if (prev) {
- prev.next = newNode;
- newNode.prev = prev;
- }
-
- referenceNode.prev = newNode;
- newNode.next = referenceNode;
-
- parentNode.children.splice(insertionIdx, 0, newNode);
- newNode.parent = parentNode;
-};
-
-exports.detachNode = function (node) {
- if (node.parent) {
- var idx = node.parent.children.indexOf(node),
- prev = node.prev,
- next = node.next;
-
- node.prev = null;
- node.next = null;
-
- if (prev)
- prev.next = next;
-
- if (next)
- next.prev = prev;
-
- node.parent.children.splice(idx, 1);
- node.parent = null;
- }
-};
-
-exports.insertText = function (parentNode, text) {
- var lastChild = parentNode.children[parentNode.children.length - 1];
-
- if (lastChild && lastChild.type === 'text')
- lastChild.data += text;
- else
- appendChild(parentNode, createTextNode(text));
-};
-
-exports.insertTextBefore = function (parentNode, text, referenceNode) {
- var prevNode = parentNode.children[parentNode.children.indexOf(referenceNode) - 1];
-
- if (prevNode && prevNode.type === 'text')
- prevNode.data += text;
- else
- insertBefore(parentNode, createTextNode(text), referenceNode);
-};
-
-exports.adoptAttributes = function (recipientNode, attrs) {
- for (var i = 0; i < attrs.length; i++) {
- var attrName = attrs[i].name;
-
- if (typeof recipientNode.attribs[attrName] === 'undefined') {
- recipientNode.attribs[attrName] = attrs[i].value;
- recipientNode['x-attribsNamespace'][attrName] = attrs[i].namespace;
- recipientNode['x-attribsPrefix'][attrName] = attrs[i].prefix;
- }
- }
-};
-
-
-//Tree traversing
-exports.getFirstChild = function (node) {
- return node.children[0];
-};
-
-exports.getChildNodes = function (node) {
- return node.children;
-};
-
-exports.getParentNode = function (node) {
- return node.parent;
-};
-
-exports.getAttrList = function (node) {
- var attrList = [];
-
- for (var name in node.attribs) {
- if (node.attribs.hasOwnProperty(name)) {
- attrList.push({
- name: name,
- value: node.attribs[name],
- namespace: node['x-attribsNamespace'][name],
- prefix: node['x-attribsPrefix'][name]
- });
- }
- }
-
- return attrList;
-};
-
-
-//Node data
-exports.getTagName = function (element) {
- return element.name;
-};
-
-exports.getNamespaceURI = function (element) {
- return element.namespace;
-};
-
-exports.getTextNodeContent = function (textNode) {
- return textNode.data;
-};
-
-exports.getCommentNodeContent = function (commentNode) {
- return commentNode.data;
-};
-
-exports.getDocumentTypeNodeName = function (doctypeNode) {
- return doctypeNode['x-name'];
-};
-
-exports.getDocumentTypeNodePublicId = function (doctypeNode) {
- return doctypeNode['x-publicId'];
-};
-
-exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
- return doctypeNode['x-systemId'];
-};
-
-
-//Node types
-exports.isTextNode = function (node) {
- return node.type === 'text';
-};
-
-exports.isCommentNode = function (node) {
- return node.type === 'comment';
-};
-
-exports.isDocumentTypeNode = function (node) {
- return node.type === 'directive' && node.name === '!doctype';
-};
-
-exports.isElementNode = function (node) {
- return !!node.attribs;
-};
-
-},{"../common/doctype":79}],95:[function(require,module,exports){
-'use strict';
-//Const
-var NOAH_ARK_CAPACITY = 3;
+//12.2.5.4.19 The "after body" insertion mode
+//------------------------------------------------------------------
+function startTagAfterBody(p, token) {
+ if (token.tagName === $.HTML)
+ startTagInBody(p, token);
-//List of formatting elements
-var FormattingElementList = module.exports = function (treeAdapter) {
- this.length = 0;
- this.entries = [];
- this.treeAdapter = treeAdapter;
- this.bookmark = null;
-};
+ else
+ tokenAfterBody(p, token);
+}
-//Entry types
-FormattingElementList.MARKER_ENTRY = 'MARKER_ENTRY';
-FormattingElementList.ELEMENT_ENTRY = 'ELEMENT_ENTRY';
+function endTagAfterBody(p, token) {
+ if (token.tagName === $.HTML) {
+ if (!p.fragmentContext)
+ p.insertionMode = AFTER_AFTER_BODY_MODE;
+ }
-//Noah Ark's condition
-//OPTIMIZATION: at first we try to find possible candidates for exclusion using
-//lightweight heuristics without thorough attributes check.
-FormattingElementList.prototype._getNoahArkConditionCandidates = function (newElement) {
- var candidates = [];
+ else
+ tokenAfterBody(p, token);
+}
- if (this.length >= NOAH_ARK_CAPACITY) {
- var neAttrsLength = this.treeAdapter.getAttrList(newElement).length,
- neTagName = this.treeAdapter.getTagName(newElement),
- neNamespaceURI = this.treeAdapter.getNamespaceURI(newElement);
+function tokenAfterBody(p, token) {
+ p.insertionMode = IN_BODY_MODE;
+ p._processToken(token);
+}
- for (var i = this.length - 1; i >= 0; i--) {
- var entry = this.entries[i];
+//12.2.5.4.20 The "in frameset" insertion mode
+//------------------------------------------------------------------
+function startTagInFrameset(p, token) {
+ var tn = token.tagName;
- if (entry.type === FormattingElementList.MARKER_ENTRY)
- break;
+ if (tn === $.HTML)
+ startTagInBody(p, token);
- var element = entry.element,
- elementAttrs = this.treeAdapter.getAttrList(element);
+ else if (tn === $.FRAMESET)
+ p._insertElement(token, NS.HTML);
- if (this.treeAdapter.getTagName(element) === neTagName &&
- this.treeAdapter.getNamespaceURI(element) === neNamespaceURI &&
- elementAttrs.length === neAttrsLength) {
- candidates.push({idx: i, attrs: elementAttrs});
- }
- }
- }
+ else if (tn === $.FRAME)
+ p._appendElement(token, NS.HTML);
- return candidates.length < NOAH_ARK_CAPACITY ? [] : candidates;
-};
+ else if (tn === $.NOFRAMES)
+ startTagInHead(p, token);
+}
-FormattingElementList.prototype._ensureNoahArkCondition = function (newElement) {
- var candidates = this._getNoahArkConditionCandidates(newElement),
- cLength = candidates.length;
+function endTagInFrameset(p, token) {
+ if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) {
+ p.openElements.pop();
- if (cLength) {
- var neAttrs = this.treeAdapter.getAttrList(newElement),
- neAttrsLength = neAttrs.length,
- neAttrsMap = {};
+ if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET)
+ p.insertionMode = AFTER_FRAMESET_MODE;
+ }
+}
- //NOTE: build attrs map for the new element so we can perform fast lookups
- for (var i = 0; i < neAttrsLength; i++) {
- var neAttr = neAttrs[i];
+//12.2.5.4.21 The "after frameset" insertion mode
+//------------------------------------------------------------------
+function startTagAfterFrameset(p, token) {
+ var tn = token.tagName;
- neAttrsMap[neAttr.name] = neAttr.value;
- }
+ if (tn === $.HTML)
+ startTagInBody(p, token);
- for (var i = 0; i < neAttrsLength; i++) {
- for (var j = 0; j < cLength; j++) {
- var cAttr = candidates[j].attrs[i];
+ else if (tn === $.NOFRAMES)
+ startTagInHead(p, token);
+}
- if (neAttrsMap[cAttr.name] !== cAttr.value) {
- candidates.splice(j, 1);
- cLength--;
- }
+function endTagAfterFrameset(p, token) {
+ if (token.tagName === $.HTML)
+ p.insertionMode = AFTER_AFTER_FRAMESET_MODE;
+}
- if (candidates.length < NOAH_ARK_CAPACITY)
- return;
- }
- }
+//12.2.5.4.22 The "after after body" insertion mode
+//------------------------------------------------------------------
+function startTagAfterAfterBody(p, token) {
+ if (token.tagName === $.HTML)
+ startTagInBody(p, token);
- //NOTE: remove bottommost candidates until Noah's Ark condition will not be met
- for (var i = cLength - 1; i >= NOAH_ARK_CAPACITY - 1; i--) {
- this.entries.splice(candidates[i].idx, 1);
- this.length--;
- }
- }
-};
+ else
+ tokenAfterAfterBody(p, token);
+}
-//Mutations
-FormattingElementList.prototype.insertMarker = function () {
- this.entries.push({type: FormattingElementList.MARKER_ENTRY});
- this.length++;
-};
+function tokenAfterAfterBody(p, token) {
+ p.insertionMode = IN_BODY_MODE;
+ p._processToken(token);
+}
-FormattingElementList.prototype.pushElement = function (element, token) {
- this._ensureNoahArkCondition(element);
+//12.2.5.4.23 The "after after frameset" insertion mode
+//------------------------------------------------------------------
+function startTagAfterAfterFrameset(p, token) {
+ var tn = token.tagName;
- this.entries.push({
- type: FormattingElementList.ELEMENT_ENTRY,
- element: element,
- token: token
- });
+ if (tn === $.HTML)
+ startTagInBody(p, token);
- this.length++;
-};
+ else if (tn === $.NOFRAMES)
+ startTagInHead(p, token);
+}
-FormattingElementList.prototype.insertElementAfterBookmark = function (element, token) {
- var bookmarkIdx = this.length - 1;
- for (; bookmarkIdx >= 0; bookmarkIdx--) {
- if (this.entries[bookmarkIdx] === this.bookmark)
- break;
- }
+//12.2.5.5 The rules for parsing tokens in foreign content
+//------------------------------------------------------------------
+function nullCharacterInForeignContent(p, token) {
+ token.chars = UNICODE.REPLACEMENT_CHARACTER;
+ p._insertCharacters(token);
+}
- this.entries.splice(bookmarkIdx + 1, 0, {
- type: FormattingElementList.ELEMENT_ENTRY,
- element: element,
- token: token
- });
+function characterInForeignContent(p, token) {
+ p._insertCharacters(token);
+ p.framesetOk = false;
+}
- this.length++;
-};
+function startTagInForeignContent(p, token) {
+ if (foreignContent.causesExit(token) && !p.fragmentContext) {
+ while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML && !p._isIntegrationPoint(p.openElements.current))
+ p.openElements.pop();
-FormattingElementList.prototype.removeEntry = function (entry) {
- for (var i = this.length - 1; i >= 0; i--) {
- if (this.entries[i] === entry) {
- this.entries.splice(i, 1);
- this.length--;
- break;
- }
+ p._processToken(token);
}
-};
-
-FormattingElementList.prototype.clearToLastMarker = function () {
- while (this.length) {
- var entry = this.entries.pop();
- this.length--;
+ else {
+ var current = p._getAdjustedCurrentElement(),
+ currentNs = p.treeAdapter.getNamespaceURI(current);
- if (entry.type === FormattingElementList.MARKER_ENTRY)
- break;
- }
-};
+ if (currentNs === NS.MATHML)
+ foreignContent.adjustTokenMathMLAttrs(token);
-//Search
-FormattingElementList.prototype.getElementEntryInScopeWithTagName = function (tagName) {
- for (var i = this.length - 1; i >= 0; i--) {
- var entry = this.entries[i];
+ else if (currentNs === NS.SVG) {
+ foreignContent.adjustTokenSVGTagName(token);
+ foreignContent.adjustTokenSVGAttrs(token);
+ }
- if (entry.type === FormattingElementList.MARKER_ENTRY)
- return null;
+ foreignContent.adjustTokenXMLAttrs(token);
- if (this.treeAdapter.getTagName(entry.element) === tagName)
- return entry;
+ if (token.selfClosing)
+ p._appendElement(token, currentNs);
+ else
+ p._insertElement(token, currentNs);
}
+}
- return null;
-};
+function endTagInForeignContent(p, token) {
+ for (var i = p.openElements.stackTop; i > 0; i--) {
+ var element = p.openElements.items[i];
-FormattingElementList.prototype.getElementEntry = function (element) {
- for (var i = this.length - 1; i >= 0; i--) {
- var entry = this.entries[i];
+ if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) {
+ p._processToken(token);
+ break;
+ }
- if (entry.type === FormattingElementList.ELEMENT_ENTRY && entry.element == element)
- return entry;
+ if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) {
+ p.openElements.popUntilElementPopped(element);
+ break;
+ }
}
-
- return null;
-};
-
-},{}],96:[function(require,module,exports){
-'use strict';
-
-var OpenElementStack = require('./open_element_stack'),
- Tokenizer = require('../tokenization/tokenizer'),
- HTML = require('../common/html');
-
-
-//Aliases
-var $ = HTML.TAG_NAMES;
-
-
-function setEndLocation(element, closingToken, treeAdapter) {
- var loc = element.__location;
-
- if (!loc)
- return;
-
- if (!loc.startTag) {
- loc.startTag = {
- start: loc.start,
- end: loc.end
- };
- }
-
- if (closingToken.location) {
- var tn = treeAdapter.getTagName(element),
- // NOTE: For cases like
- First 'p' closes without a closing tag and
- // for cases like
- 'p' closes without a closing tag
- isClosingEndTag = closingToken.type === Tokenizer.END_TAG_TOKEN &&
- tn === closingToken.tagName;
-
- if (isClosingEndTag) {
- loc.endTag = {
- start: closingToken.location.start,
- end: closingToken.location.end
- };
- }
-
- loc.end = closingToken.location.end;
- }
-}
-
-//NOTE: patch open elements stack, so we can assign end location for the elements
-function patchOpenElementsStack(stack, parser) {
- var treeAdapter = parser.treeAdapter;
-
- stack.pop = function () {
- setEndLocation(this.current, parser.currentToken, treeAdapter);
- OpenElementStack.prototype.pop.call(this);
- };
-
- stack.popAllUpToHtmlElement = function () {
- for (var i = this.stackTop; i > 0; i--)
- setEndLocation(this.items[i], parser.currentToken, treeAdapter);
-
- OpenElementStack.prototype.popAllUpToHtmlElement.call(this);
- };
-
- stack.remove = function (element) {
- setEndLocation(element, parser.currentToken, treeAdapter);
- OpenElementStack.prototype.remove.call(this, element);
- };
-}
-
-exports.assign = function (parser) {
- //NOTE: obtain Parser proto this way to avoid module circular references
- var parserProto = Object.getPrototypeOf(parser),
- treeAdapter = parser.treeAdapter;
-
-
- //NOTE: patch _reset method
- parser._reset = function (html, document, fragmentContext) {
- parserProto._reset.call(this, html, document, fragmentContext);
-
- this.attachableElementLocation = null;
- this.lastFosterParentingLocation = null;
- this.currentToken = null;
-
- patchOpenElementsStack(this.openElements, parser);
- };
-
- parser._processTokenInForeignContent = function (token) {
- this.currentToken = token;
- parserProto._processTokenInForeignContent.call(this, token);
- };
-
- parser._processToken = function (token) {
- this.currentToken = token;
- parserProto._processToken.call(this, token);
-
- //NOTE: and are never popped from the stack, so we need to updated
- //their end location explicitly.
- if (token.type === Tokenizer.END_TAG_TOKEN &&
- (token.tagName === $.HTML ||
- (token.tagName === $.BODY && this.openElements.hasInScope($.BODY)))) {
- for (var i = this.openElements.stackTop; i >= 0; i--) {
- var element = this.openElements.items[i];
-
- if (this.treeAdapter.getTagName(element) === token.tagName) {
- setEndLocation(element, token, treeAdapter);
- break;
- }
- }
- }
- };
-
- //Doctype
- parser._setDocumentType = function (token) {
- parserProto._setDocumentType.call(this, token);
-
- var documentChildren = this.treeAdapter.getChildNodes(this.document),
- cnLength = documentChildren.length;
-
- for (var i = 0; i < cnLength; i++) {
- var node = documentChildren[i];
-
- if (this.treeAdapter.isDocumentTypeNode(node)) {
- node.__location = token.location;
- break;
- }
- }
- };
-
- //Elements
- parser._attachElementToTree = function (element) {
- //NOTE: _attachElementToTree is called from _appendElement, _insertElement and _insertTemplate methods.
- //So we will use token location stored in this methods for the element.
- element.__location = this.attachableElementLocation || null;
- this.attachableElementLocation = null;
- parserProto._attachElementToTree.call(this, element);
- };
-
- parser._appendElement = function (token, namespaceURI) {
- this.attachableElementLocation = token.location;
- parserProto._appendElement.call(this, token, namespaceURI);
- };
-
- parser._insertElement = function (token, namespaceURI) {
- this.attachableElementLocation = token.location;
- parserProto._insertElement.call(this, token, namespaceURI);
- };
-
- parser._insertTemplate = function (token) {
- this.attachableElementLocation = token.location;
- parserProto._insertTemplate.call(this, token);
-
- var tmplContent = this.treeAdapter.getChildNodes(this.openElements.current)[0];
-
- tmplContent.__location = null;
- };
-
- parser._insertFakeRootElement = function () {
- parserProto._insertFakeRootElement.call(this);
- this.openElements.current.__location = null;
- };
-
- //Comments
- parser._appendCommentNode = function (token, parent) {
- parserProto._appendCommentNode.call(this, token, parent);
-
- var children = this.treeAdapter.getChildNodes(parent),
- commentNode = children[children.length - 1];
-
- commentNode.__location = token.location;
- };
-
- //Text
- parser._findFosterParentingLocation = function () {
- //NOTE: store last foster parenting location, so we will be able to find inserted text
- //in case of foster parenting
- this.lastFosterParentingLocation = parserProto._findFosterParentingLocation.call(this);
- return this.lastFosterParentingLocation;
- };
-
- parser._insertCharacters = function (token) {
- parserProto._insertCharacters.call(this, token);
-
- var hasFosterParent = this._shouldFosterParentOnInsertion(),
- parentingLocation = this.lastFosterParentingLocation,
- parent = (hasFosterParent && parentingLocation.parent) ||
- this.openElements.currentTmplContent ||
- this.openElements.current,
- siblings = this.treeAdapter.getChildNodes(parent),
- textNodeIdx = hasFosterParent && parentingLocation.beforeElement ?
- siblings.indexOf(parentingLocation.beforeElement) - 1 :
- siblings.length - 1,
- textNode = siblings[textNodeIdx];
-
- //NOTE: if we have location assigned by another token, then just update end position
- if (textNode.__location)
- textNode.__location.end = token.location.end;
-
- else
- textNode.__location = token.location;
- };
-};
-
+}
-},{"../common/html":81,"../tokenization/tokenizer":92,"./open_element_stack":97}],97:[function(require,module,exports){
+},{"../common/doctype":80,"../common/foreign_content":81,"../common/html":82,"../common/merge_options":83,"../common/unicode":84,"../location_info/parser_mixin":86,"../tokenizer":97,"../tree_adapters/default":100,"./formatting_element_list":88,"./open_element_stack":90}],90:[function(require,module,exports){
'use strict';
var HTML = require('../common/html');
@@ -56115,13 +56295,16 @@ function isImpliedEndTagRequired(tn) {
return tn === $.P;
case 2:
- return tn === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI;
+ return tn === $.RB || tn === $.RP || tn === $.RT || tn === $.DD || tn === $.DT || tn === $.LI;
+
+ case 3:
+ return tn === $.RTC;
case 6:
return tn === $.OPTION;
case 8:
- return tn === $.OPTGROUP;
+ return tn === $.OPTGROUP || tn === $.MENUITEM;
}
return false;
@@ -56133,7 +56316,7 @@ function isScopingElement(tn, ns) {
if (tn === $.TD || tn === $.TH)
return ns === NS.HTML;
- else if (tn === $.MI || tn === $.MO || tn == $.MN || tn === $.MS)
+ else if (tn === $.MI || tn === $.MO || tn === $.MN || tn === $.MS)
return ns === NS.MATHML;
break;
@@ -56204,17 +56387,14 @@ OpenElementStack.prototype._indexOf = function (element) {
//Update current element
OpenElementStack.prototype._isInTemplate = function () {
- if (this.currentTagName !== $.TEMPLATE)
- return false;
-
- return this.treeAdapter.getNamespaceURI(this.current) === NS.HTML;
+ return this.currentTagName === $.TEMPLATE && this.treeAdapter.getNamespaceURI(this.current) === NS.HTML;
};
OpenElementStack.prototype._updateCurrentElement = function () {
this.current = this.items[this.stackTop];
this.currentTagName = this.current && this.treeAdapter.getTagName(this.current);
- this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getChildNodes(this.current)[0] : null;
+ this.currentTmplContent = this._isInTemplate() ? this.treeAdapter.getTemplateContent(this.current) : null;
};
//Mutations
@@ -56238,6 +56418,7 @@ OpenElementStack.prototype.pop = function () {
OpenElementStack.prototype.replace = function (oldElement, newElement) {
var idx = this._indexOf(oldElement);
+
this.items[idx] = newElement;
if (idx === this.stackTop)
@@ -56249,51 +56430,53 @@ OpenElementStack.prototype.insertAfter = function (referenceElement, newElement)
this.items.splice(insertionIdx, 0, newElement);
- if (insertionIdx == ++this.stackTop)
+ if (insertionIdx === ++this.stackTop)
this._updateCurrentElement();
};
OpenElementStack.prototype.popUntilTagNamePopped = function (tagName) {
while (this.stackTop > -1) {
- var tn = this.currentTagName;
+ var tn = this.currentTagName,
+ ns = this.treeAdapter.getNamespaceURI(this.current);
this.pop();
- if (tn === tagName)
+ if (tn === tagName && ns === NS.HTML)
break;
}
};
-OpenElementStack.prototype.popUntilTemplatePopped = function () {
+OpenElementStack.prototype.popUntilElementPopped = function (element) {
while (this.stackTop > -1) {
- var tn = this.currentTagName,
- ns = this.treeAdapter.getNamespaceURI(this.current);
+ var poppedElement = this.current;
this.pop();
- if (tn === $.TEMPLATE && ns === NS.HTML)
+ if (poppedElement === element)
break;
}
};
-OpenElementStack.prototype.popUntilElementPopped = function (element) {
+OpenElementStack.prototype.popUntilNumberedHeaderPopped = function () {
while (this.stackTop > -1) {
- var poppedElement = this.current;
+ var tn = this.currentTagName,
+ ns = this.treeAdapter.getNamespaceURI(this.current);
this.pop();
- if (poppedElement === element)
+ if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6 && ns === NS.HTML)
break;
}
};
-OpenElementStack.prototype.popUntilNumberedHeaderPopped = function () {
+OpenElementStack.prototype.popUntilTableCellPopped = function () {
while (this.stackTop > -1) {
- var tn = this.currentTagName;
+ var tn = this.currentTagName,
+ ns = this.treeAdapter.getNamespaceURI(this.current);
this.pop();
- if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
+ if (tn === $.TD || tn === $.TH && ns === NS.HTML)
break;
}
};
@@ -56306,20 +56489,28 @@ OpenElementStack.prototype.popAllUpToHtmlElement = function () {
};
OpenElementStack.prototype.clearBackToTableContext = function () {
- while (this.currentTagName !== $.TABLE && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML)
+ while (this.currentTagName !== $.TABLE &&
+ this.currentTagName !== $.TEMPLATE &&
+ this.currentTagName !== $.HTML ||
+ this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML)
this.pop();
};
OpenElementStack.prototype.clearBackToTableBodyContext = function () {
- while (this.currentTagName !== $.TBODY && this.currentTagName !== $.TFOOT &&
- this.currentTagName !== $.THEAD && this.currentTagName !== $.TEMPLATE &&
- this.currentTagName !== $.HTML) {
+ while (this.currentTagName !== $.TBODY &&
+ this.currentTagName !== $.TFOOT &&
+ this.currentTagName !== $.THEAD &&
+ this.currentTagName !== $.TEMPLATE &&
+ this.currentTagName !== $.HTML ||
+ this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML)
this.pop();
- }
};
OpenElementStack.prototype.clearBackToTableRowContext = function () {
- while (this.currentTagName !== $.TR && this.currentTagName !== $.TEMPLATE && this.currentTagName !== $.HTML)
+ while (this.currentTagName !== $.TR &&
+ this.currentTagName !== $.TEMPLATE &&
+ this.currentTagName !== $.HTML ||
+ this.treeAdapter.getNamespaceURI(this.current) !== NS.HTML)
this.pop();
};
@@ -56338,6 +56529,7 @@ OpenElementStack.prototype.remove = function (element) {
OpenElementStack.prototype.tryPeekProperlyNestedBodyElement = function () {
//Properly nested element (should be second element in stack).
var element = this.items[1];
+
return element && this.treeAdapter.getTagName(element) === $.BODY ? element : null;
};
@@ -56358,13 +56550,12 @@ OpenElementStack.prototype.isRootHtmlElementCurrent = function () {
//Element in scope
OpenElementStack.prototype.hasInScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
- var tn = this.treeAdapter.getTagName(this.items[i]);
+ var tn = this.treeAdapter.getTagName(this.items[i]),
+ ns = this.treeAdapter.getNamespaceURI(this.items[i]);
- if (tn === tagName)
+ if (tn === tagName && ns === NS.HTML)
return true;
- var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
if (isScopingElement(tn, ns))
return false;
}
@@ -56374,12 +56565,13 @@ OpenElementStack.prototype.hasInScope = function (tagName) {
OpenElementStack.prototype.hasNumberedHeaderInScope = function () {
for (var i = this.stackTop; i >= 0; i--) {
- var tn = this.treeAdapter.getTagName(this.items[i]);
+ var tn = this.treeAdapter.getTagName(this.items[i]),
+ ns = this.treeAdapter.getNamespaceURI(this.items[i]);
- if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
+ if ((tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6) && ns === NS.HTML)
return true;
- if (isScopingElement(tn, this.treeAdapter.getNamespaceURI(this.items[i])))
+ if (isScopingElement(tn, ns))
return false;
}
@@ -56388,14 +56580,13 @@ OpenElementStack.prototype.hasNumberedHeaderInScope = function () {
OpenElementStack.prototype.hasInListItemScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
- var tn = this.treeAdapter.getTagName(this.items[i]);
+ var tn = this.treeAdapter.getTagName(this.items[i]),
+ ns = this.treeAdapter.getNamespaceURI(this.items[i]);
- if (tn === tagName)
+ if (tn === tagName && ns === NS.HTML)
return true;
- var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (((tn === $.UL || tn === $.OL) && ns === NS.HTML) || isScopingElement(tn, ns))
+ if ((tn === $.UL || tn === $.OL) && ns === NS.HTML || isScopingElement(tn, ns))
return false;
}
@@ -56404,14 +56595,13 @@ OpenElementStack.prototype.hasInListItemScope = function (tagName) {
OpenElementStack.prototype.hasInButtonScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
- var tn = this.treeAdapter.getTagName(this.items[i]);
+ var tn = this.treeAdapter.getTagName(this.items[i]),
+ ns = this.treeAdapter.getNamespaceURI(this.items[i]);
- if (tn === tagName)
+ if (tn === tagName && ns === NS.HTML)
return true;
- var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if ((tn === $.BUTTON && ns === NS.HTML) || isScopingElement(tn, ns))
+ if (tn === $.BUTTON && ns === NS.HTML || isScopingElement(tn, ns))
return false;
}
@@ -56420,14 +56610,16 @@ OpenElementStack.prototype.hasInButtonScope = function (tagName) {
OpenElementStack.prototype.hasInTableScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
- var tn = this.treeAdapter.getTagName(this.items[i]);
+ var tn = this.treeAdapter.getTagName(this.items[i]),
+ ns = this.treeAdapter.getNamespaceURI(this.items[i]);
+
+ if (ns !== NS.HTML)
+ continue;
if (tn === tagName)
return true;
- var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if ((tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML) && ns === NS.HTML)
+ if (tn === $.TABLE || tn === $.TEMPLATE || tn === $.HTML)
return false;
}
@@ -56436,14 +56628,16 @@ OpenElementStack.prototype.hasInTableScope = function (tagName) {
OpenElementStack.prototype.hasTableBodyContextInTableScope = function () {
for (var i = this.stackTop; i >= 0; i--) {
- var tn = this.treeAdapter.getTagName(this.items[i]);
+ var tn = this.treeAdapter.getTagName(this.items[i]),
+ ns = this.treeAdapter.getNamespaceURI(this.items[i]);
+
+ if (ns !== NS.HTML)
+ continue;
if (tn === $.TBODY || tn === $.THEAD || tn === $.TFOOT)
return true;
- var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if ((tn === $.TABLE || tn === $.HTML) && ns === NS.HTML)
+ if (tn === $.TABLE || tn === $.HTML)
return false;
}
@@ -56452,14 +56646,16 @@ OpenElementStack.prototype.hasTableBodyContextInTableScope = function () {
OpenElementStack.prototype.hasInSelectScope = function (tagName) {
for (var i = this.stackTop; i >= 0; i--) {
- var tn = this.treeAdapter.getTagName(this.items[i]);
+ var tn = this.treeAdapter.getTagName(this.items[i]),
+ ns = this.treeAdapter.getNamespaceURI(this.items[i]);
+
+ if (ns !== NS.HTML)
+ continue;
if (tn === tagName)
return true;
- var ns = this.treeAdapter.getNamespaceURI(this.items[i]);
-
- if (tn !== $.OPTION && tn !== $.OPTGROUP && ns === NS.HTML)
+ if (tn !== $.OPTION && tn !== $.OPTGROUP)
return false;
}
@@ -56477,4270 +56673,5501 @@ OpenElementStack.prototype.generateImpliedEndTagsWithExclusion = function (exclu
this.pop();
};
-},{"../common/html":81}],98:[function(require,module,exports){
-'use strict';
-
-var Tokenizer = require('../tokenization/tokenizer'),
- OpenElementStack = require('./open_element_stack'),
- FormattingElementList = require('./formatting_element_list'),
- LocationInfoMixin = require('./location_info_mixin'),
- DefaultTreeAdapter = require('../tree_adapters/default'),
- Doctype = require('../common/doctype'),
- ForeignContent = require('../common/foreign_content'),
- Utils = require('../common/utils'),
- UNICODE = require('../common/unicode'),
- HTML = require('../common/html');
-
-//Aliases
-var $ = HTML.TAG_NAMES,
- NS = HTML.NAMESPACES,
- ATTRS = HTML.ATTRS;
-
-//Default options
-var DEFAULT_OPTIONS = {
- decodeHtmlEntities: true,
- locationInfo: false
-};
-
-//Misc constants
-var SEARCHABLE_INDEX_DEFAULT_PROMPT = 'This is a searchable index. Enter search keywords: ',
- SEARCHABLE_INDEX_INPUT_NAME = 'isindex',
- HIDDEN_INPUT_TYPE = 'hidden';
-
-//Adoption agency loops iteration count
-var AA_OUTER_LOOP_ITER = 8,
- AA_INNER_LOOP_ITER = 3;
-
-//Insertion modes
-var INITIAL_MODE = 'INITIAL_MODE',
- BEFORE_HTML_MODE = 'BEFORE_HTML_MODE',
- BEFORE_HEAD_MODE = 'BEFORE_HEAD_MODE',
- IN_HEAD_MODE = 'IN_HEAD_MODE',
- AFTER_HEAD_MODE = 'AFTER_HEAD_MODE',
- IN_BODY_MODE = 'IN_BODY_MODE',
- TEXT_MODE = 'TEXT_MODE',
- IN_TABLE_MODE = 'IN_TABLE_MODE',
- IN_TABLE_TEXT_MODE = 'IN_TABLE_TEXT_MODE',
- IN_CAPTION_MODE = 'IN_CAPTION_MODE',
- IN_COLUMN_GROUP_MODE = 'IN_COLUMN_GROUP_MODE',
- IN_TABLE_BODY_MODE = 'IN_TABLE_BODY_MODE',
- IN_ROW_MODE = 'IN_ROW_MODE',
- IN_CELL_MODE = 'IN_CELL_MODE',
- IN_SELECT_MODE = 'IN_SELECT_MODE',
- IN_SELECT_IN_TABLE_MODE = 'IN_SELECT_IN_TABLE_MODE',
- IN_TEMPLATE_MODE = 'IN_TEMPLATE_MODE',
- AFTER_BODY_MODE = 'AFTER_BODY_MODE',
- IN_FRAMESET_MODE = 'IN_FRAMESET_MODE',
- AFTER_FRAMESET_MODE = 'AFTER_FRAMESET_MODE',
- AFTER_AFTER_BODY_MODE = 'AFTER_AFTER_BODY_MODE',
- AFTER_AFTER_FRAMESET_MODE = 'AFTER_AFTER_FRAMESET_MODE';
-
-//Insertion mode reset map
-var INSERTION_MODE_RESET_MAP = {};
-
-INSERTION_MODE_RESET_MAP[$.TR] = IN_ROW_MODE;
-INSERTION_MODE_RESET_MAP[$.TBODY] =
-INSERTION_MODE_RESET_MAP[$.THEAD] =
-INSERTION_MODE_RESET_MAP[$.TFOOT] = IN_TABLE_BODY_MODE;
-INSERTION_MODE_RESET_MAP[$.CAPTION] = IN_CAPTION_MODE;
-INSERTION_MODE_RESET_MAP[$.COLGROUP] = IN_COLUMN_GROUP_MODE;
-INSERTION_MODE_RESET_MAP[$.TABLE] = IN_TABLE_MODE;
-INSERTION_MODE_RESET_MAP[$.BODY] = IN_BODY_MODE;
-INSERTION_MODE_RESET_MAP[$.FRAMESET] = IN_FRAMESET_MODE;
-
-//Template insertion mode switch map
-var TEMPLATE_INSERTION_MODE_SWITCH_MAP = {};
-
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.CAPTION] =
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COLGROUP] =
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TBODY] =
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TFOOT] =
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.THEAD] = IN_TABLE_MODE;
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.COL] = IN_COLUMN_GROUP_MODE;
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TR] = IN_TABLE_BODY_MODE;
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TD] =
-TEMPLATE_INSERTION_MODE_SWITCH_MAP[$.TH] = IN_ROW_MODE;
-
-//Token handlers map for insertion modes
-var _ = {};
-
-_[INITIAL_MODE] = {};
-_[INITIAL_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[INITIAL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInInitialMode;
-_[INITIAL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
-_[INITIAL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[INITIAL_MODE][Tokenizer.DOCTYPE_TOKEN] = doctypeInInitialMode;
-_[INITIAL_MODE][Tokenizer.START_TAG_TOKEN] =
-_[INITIAL_MODE][Tokenizer.END_TAG_TOKEN] =
-_[INITIAL_MODE][Tokenizer.EOF_TOKEN] = tokenInInitialMode;
-
-_[BEFORE_HTML_MODE] = {};
-_[BEFORE_HTML_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[BEFORE_HTML_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHtml;
-_[BEFORE_HTML_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
-_[BEFORE_HTML_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[BEFORE_HTML_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[BEFORE_HTML_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHtml;
-_[BEFORE_HTML_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHtml;
-_[BEFORE_HTML_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHtml;
-
-_[BEFORE_HEAD_MODE] = {};
-_[BEFORE_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[BEFORE_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenBeforeHead;
-_[BEFORE_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = ignoreToken;
-_[BEFORE_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[BEFORE_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[BEFORE_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagBeforeHead;
-_[BEFORE_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagBeforeHead;
-_[BEFORE_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenBeforeHead;
-
-_[IN_HEAD_MODE] = {};
-_[IN_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[IN_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInHead;
-_[IN_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
-_[IN_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagInHead;
-_[IN_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagInHead;
-_[IN_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenInHead;
-
-_[AFTER_HEAD_MODE] = {};
-_[AFTER_HEAD_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[AFTER_HEAD_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterHead;
-_[AFTER_HEAD_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
-_[AFTER_HEAD_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[AFTER_HEAD_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[AFTER_HEAD_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterHead;
-_[AFTER_HEAD_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterHead;
-_[AFTER_HEAD_MODE][Tokenizer.EOF_TOKEN] = tokenAfterHead;
-
-_[IN_BODY_MODE] = {};
-_[IN_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
-_[IN_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[IN_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
-_[IN_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInBody;
-_[IN_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInBody;
-_[IN_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[TEXT_MODE] = {};
-_[TEXT_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
-_[TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
-_[TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
-_[TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
-_[TEXT_MODE][Tokenizer.START_TAG_TOKEN] = ignoreToken;
-_[TEXT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInText;
-_[TEXT_MODE][Tokenizer.EOF_TOKEN] = eofInText;
-
-_[IN_TABLE_MODE] = {};
-_[IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
-_[IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
-_[IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTable;
-_[IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTable;
-_[IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[IN_TABLE_TEXT_MODE] = {};
-_[IN_TABLE_TEXT_MODE][Tokenizer.CHARACTER_TOKEN] = characterInTableText;
-_[IN_TABLE_TEXT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[IN_TABLE_TEXT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInTableText;
-_[IN_TABLE_TEXT_MODE][Tokenizer.COMMENT_TOKEN] =
-_[IN_TABLE_TEXT_MODE][Tokenizer.DOCTYPE_TOKEN] =
-_[IN_TABLE_TEXT_MODE][Tokenizer.START_TAG_TOKEN] =
-_[IN_TABLE_TEXT_MODE][Tokenizer.END_TAG_TOKEN] =
-_[IN_TABLE_TEXT_MODE][Tokenizer.EOF_TOKEN] = tokenInTableText;
-
-_[IN_CAPTION_MODE] = {};
-_[IN_CAPTION_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
-_[IN_CAPTION_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[IN_CAPTION_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
-_[IN_CAPTION_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_CAPTION_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_CAPTION_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCaption;
-_[IN_CAPTION_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCaption;
-_[IN_CAPTION_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[IN_COLUMN_GROUP_MODE] = {};
-_[IN_COLUMN_GROUP_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[IN_COLUMN_GROUP_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenInColumnGroup;
-_[IN_COLUMN_GROUP_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
-_[IN_COLUMN_GROUP_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_COLUMN_GROUP_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_COLUMN_GROUP_MODE][Tokenizer.START_TAG_TOKEN] = startTagInColumnGroup;
-_[IN_COLUMN_GROUP_MODE][Tokenizer.END_TAG_TOKEN] = endTagInColumnGroup;
-_[IN_COLUMN_GROUP_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[IN_TABLE_BODY_MODE] = {};
-_[IN_TABLE_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[IN_TABLE_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
-_[IN_TABLE_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
-_[IN_TABLE_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_TABLE_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_TABLE_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTableBody;
-_[IN_TABLE_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTableBody;
-_[IN_TABLE_BODY_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[IN_ROW_MODE] = {};
-_[IN_ROW_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[IN_ROW_MODE][Tokenizer.NULL_CHARACTER_TOKEN] =
-_[IN_ROW_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = characterInTable;
-_[IN_ROW_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_ROW_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_ROW_MODE][Tokenizer.START_TAG_TOKEN] = startTagInRow;
-_[IN_ROW_MODE][Tokenizer.END_TAG_TOKEN] = endTagInRow;
-_[IN_ROW_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[IN_CELL_MODE] = {};
-_[IN_CELL_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
-_[IN_CELL_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[IN_CELL_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
-_[IN_CELL_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_CELL_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_CELL_MODE][Tokenizer.START_TAG_TOKEN] = startTagInCell;
-_[IN_CELL_MODE][Tokenizer.END_TAG_TOKEN] = endTagInCell;
-_[IN_CELL_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[IN_SELECT_MODE] = {};
-_[IN_SELECT_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
-_[IN_SELECT_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[IN_SELECT_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
-_[IN_SELECT_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_SELECT_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_SELECT_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelect;
-_[IN_SELECT_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelect;
-_[IN_SELECT_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[IN_SELECT_IN_TABLE_MODE] = {};
-_[IN_SELECT_IN_TABLE_MODE][Tokenizer.CHARACTER_TOKEN] = insertCharacters;
-_[IN_SELECT_IN_TABLE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[IN_SELECT_IN_TABLE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
-_[IN_SELECT_IN_TABLE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_SELECT_IN_TABLE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_SELECT_IN_TABLE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInSelectInTable;
-_[IN_SELECT_IN_TABLE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInSelectInTable;
-_[IN_SELECT_IN_TABLE_MODE][Tokenizer.EOF_TOKEN] = eofInBody;
-
-_[IN_TEMPLATE_MODE] = {};
-_[IN_TEMPLATE_MODE][Tokenizer.CHARACTER_TOKEN] = characterInBody;
-_[IN_TEMPLATE_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[IN_TEMPLATE_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
-_[IN_TEMPLATE_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_TEMPLATE_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_TEMPLATE_MODE][Tokenizer.START_TAG_TOKEN] = startTagInTemplate;
-_[IN_TEMPLATE_MODE][Tokenizer.END_TAG_TOKEN] = endTagInTemplate;
-_[IN_TEMPLATE_MODE][Tokenizer.EOF_TOKEN] = eofInTemplate;
-
-_[AFTER_BODY_MODE] = {};
-_[AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterBody;
-_[AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
-_[AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToRootHtmlElement;
-_[AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterBody;
-_[AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterBody;
-_[AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
-
-_[IN_FRAMESET_MODE] = {};
-_[IN_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[IN_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[IN_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
-_[IN_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[IN_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[IN_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagInFrameset;
-_[IN_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagInFrameset;
-_[IN_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
-
-_[AFTER_FRAMESET_MODE] = {};
-_[AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = insertCharacters;
-_[AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendComment;
-_[AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterFrameset;
-_[AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = endTagAfterFrameset;
-_[AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
-
-_[AFTER_AFTER_BODY_MODE] = {};
-_[AFTER_AFTER_BODY_MODE][Tokenizer.CHARACTER_TOKEN] = tokenAfterAfterBody;
-_[AFTER_AFTER_BODY_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = tokenAfterAfterBody;
-_[AFTER_AFTER_BODY_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
-_[AFTER_AFTER_BODY_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
-_[AFTER_AFTER_BODY_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[AFTER_AFTER_BODY_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterBody;
-_[AFTER_AFTER_BODY_MODE][Tokenizer.END_TAG_TOKEN] = tokenAfterAfterBody;
-_[AFTER_AFTER_BODY_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
-
-_[AFTER_AFTER_FRAMESET_MODE] = {};
-_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.CHARACTER_TOKEN] =
-_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.NULL_CHARACTER_TOKEN] = ignoreToken;
-_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.WHITESPACE_CHARACTER_TOKEN] = whitespaceCharacterInBody;
-_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.COMMENT_TOKEN] = appendCommentToDocument;
-_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.DOCTYPE_TOKEN] = ignoreToken;
-_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.START_TAG_TOKEN] = startTagAfterAfterFrameset;
-_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.END_TAG_TOKEN] = ignoreToken;
-_[AFTER_AFTER_FRAMESET_MODE][Tokenizer.EOF_TOKEN] = stopParsing;
-
-//Searchable index building utils ( tag)
-function getSearchableIndexFormAttrs(isindexStartTagToken) {
- var indexAction = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.ACTION),
- attrs = [];
-
- if (indexAction !== null) {
- attrs.push({
- name: ATTRS.ACTION,
- value: indexAction
- });
- }
-
- return attrs;
-}
-
-function getSearchableIndexLabelText(isindexStartTagToken) {
- var indexPrompt = Tokenizer.getTokenAttr(isindexStartTagToken, ATTRS.PROMPT);
-
- return indexPrompt === null ? SEARCHABLE_INDEX_DEFAULT_PROMPT : indexPrompt;
-}
-
-function getSearchableIndexInputAttrs(isindexStartTagToken) {
- var isindexAttrs = isindexStartTagToken.attrs,
- inputAttrs = [];
-
- for (var i = 0; i < isindexAttrs.length; i++) {
- var name = isindexAttrs[i].name;
-
- if (name !== ATTRS.NAME && name !== ATTRS.ACTION && name !== ATTRS.PROMPT)
- inputAttrs.push(isindexAttrs[i]);
- }
-
- inputAttrs.push({
- name: ATTRS.NAME,
- value: SEARCHABLE_INDEX_INPUT_NAME
- });
-
- return inputAttrs;
-}
-
-//Parser
-var Parser = module.exports = function (treeAdapter, options) {
- this.treeAdapter = treeAdapter || DefaultTreeAdapter;
- this.options = Utils.mergeOptions(DEFAULT_OPTIONS, options);
- this.scriptHandler = null;
-
- if (this.options.locationInfo)
- LocationInfoMixin.assign(this);
-};
-
-//API
-Parser.prototype.parse = function (html) {
- var document = this.treeAdapter.createDocument();
-
- this._reset(html, document, null);
- this._runParsingLoop();
-
- return document;
-};
-
-Parser.prototype.parseFragment = function (html, fragmentContext) {
- //NOTE: use element as a fragment context if context element was not provided,
- //so we will parse in "forgiving" manner
- if (!fragmentContext)
- fragmentContext = this.treeAdapter.createElement($.TEMPLATE, NS.HTML, []);
-
- //NOTE: create fake element which will be used as 'document' for fragment parsing.
- //This is important for jsdom there 'document' can't be recreated, therefore
- //fragment parsing causes messing of the main `document`.
- var documentMock = this.treeAdapter.createElement('documentmock', NS.HTML, []);
-
- this._reset(html, documentMock, fragmentContext);
-
- if (this.treeAdapter.getTagName(fragmentContext) === $.TEMPLATE)
- this._pushTmplInsertionMode(IN_TEMPLATE_MODE);
-
- this._initTokenizerForFragmentParsing();
- this._insertFakeRootElement();
- this._resetInsertionMode();
- this._findFormInFragmentContext();
- this._runParsingLoop();
-
- var rootElement = this.treeAdapter.getFirstChild(documentMock),
- fragment = this.treeAdapter.createDocumentFragment();
-
- this._adoptNodes(rootElement, fragment);
-
- return fragment;
-};
-
-//Reset state
-Parser.prototype._reset = function (html, document, fragmentContext) {
- this.tokenizer = new Tokenizer(html, this.options);
-
- this.stopped = false;
-
- this.insertionMode = INITIAL_MODE;
- this.originalInsertionMode = '';
-
- this.document = document;
- this.fragmentContext = fragmentContext;
-
- this.headElement = null;
- this.formElement = null;
-
- this.openElements = new OpenElementStack(this.document, this.treeAdapter);
- this.activeFormattingElements = new FormattingElementList(this.treeAdapter);
-
- this.tmplInsertionModeStack = [];
- this.tmplInsertionModeStackTop = -1;
- this.currentTmplInsertionMode = null;
-
- this.pendingCharacterTokens = [];
- this.hasNonWhitespacePendingCharacterToken = false;
-
- this.framesetOk = true;
- this.skipNextNewLine = false;
- this.fosterParentingEnabled = false;
-};
+},{"../common/html":82}],91:[function(require,module,exports){
+'use strict';
+
+var WritableStream = require('stream').Writable,
+ inherits = require('util').inherits,
+ Parser = require('./index');
+
+/**
+ * Streaming HTML parser with scripting support.
+ * A [writable stream]{@link https://nodejs.org/api/stream.html#stream_class_stream_writable}.
+ * @class ParserStream
+ * @memberof parse5
+ * @instance
+ * @extends stream.Writable
+ * @param {ParserOptions} options - Parsing options.
+ * @example
+ * var parse5 = require('parse5');
+ * var http = require('http');
+ *
+ * // Fetch the google.com content and obtain it's node
+ * http.get('http://google.com', function(res) {
+ * var parser = new parse5.ParserStream();
+ *
+ * parser.on('finish', function() {
+ * var body = parser.document.childNodes[0].childNodes[1];
+ * });
+ *
+ * res.pipe(parser);
+ * });
+ */
+var ParserStream = module.exports = function (options) {
+ WritableStream.call(this);
+
+ this.parser = new Parser(options);
+
+ this.lastChunkWritten = false;
+ this.writeCallback = null;
+ this.pausedByScript = false;
+
+ /**
+ * The resulting document node.
+ * @member {ASTNode} document
+ * @memberof parse5#ParserStream
+ * @instance
+ */
+ this.document = this.parser.treeAdapter.createDocument();
+
+ this.pendingHtmlInsertions = [];
+
+ this._resume = this._resume.bind(this);
+ this._documentWrite = this._documentWrite.bind(this);
+ this._scriptHandler = this._scriptHandler.bind(this);
+
+ this.parser._bootstrap(this.document, null);
+};
+
+inherits(ParserStream, WritableStream);
+
+//WritableStream implementation
+ParserStream.prototype._write = function (chunk, encoding, callback) {
+ this.writeCallback = callback;
+ this.parser.tokenizer.write(chunk.toString('utf8'), this.lastChunkWritten);
+ this._runParsingLoop();
+};
+
+ParserStream.prototype.end = function (chunk, encoding, callback) {
+ this.lastChunkWritten = true;
+ WritableStream.prototype.end.call(this, chunk, encoding, callback);
+};
+
+//Scriptable parser implementation
+ParserStream.prototype._runParsingLoop = function () {
+ this.parser._runParsingLoop(this.writeCallback, this._scriptHandler);
+};
+
+ParserStream.prototype._resume = function () {
+ if (!this.pausedByScript)
+ throw new Error('Parser was already resumed');
+
+ while (this.pendingHtmlInsertions.length) {
+ var html = this.pendingHtmlInsertions.pop();
+
+ this.parser.tokenizer.insertHtmlAtCurrentPos(html);
+ }
+
+ this.pausedByScript = false;
+
+ //NOTE: keep parsing if we don't wait for the next input chunk
+ if (this.parser.tokenizer.active)
+ this._runParsingLoop();
+};
+
+ParserStream.prototype._documentWrite = function (html) {
+ if (!this.parser.stopped)
+ this.pendingHtmlInsertions.push(html);
+};
+
+ParserStream.prototype._scriptHandler = function (scriptElement) {
+ if (this.listeners('script').length) {
+ this.pausedByScript = true;
+
+ /**
+ * Raised then parser encounters a `');
+ */
+
+
+ this.emit('script', scriptElement, this._documentWrite, this._resume);
+ }
+ else
+ this._runParsingLoop();
+};
+
-//Parsing loop
-Parser.prototype._iterateParsingLoop = function () {
- this._setupTokenizerCDATAMode();
+},{"./index":89,"stream":76,"util":79}],92:[function(require,module,exports){
+'use strict';
+
+var WritableStream = require('stream').Writable,
+ util = require('util');
+
+var DevNullStream = module.exports = function () {
+ WritableStream.call(this);
+};
+
+util.inherits(DevNullStream, WritableStream);
+
+DevNullStream.prototype._write = function (chunk, encoding, cb) {
+ cb();
+};
- var token = this.tokenizer.getNextToken();
+},{"stream":76,"util":79}],93:[function(require,module,exports){
+'use strict';
+
+var TransformStream = require('stream').Transform,
+ DevNullStream = require('./dev_null_stream'),
+ inherits = require('util').inherits,
+ Tokenizer = require('../tokenizer'),
+ ParserFeedbackSimulator = require('./parser_feedback_simulator'),
+ mergeOptions = require('../common/merge_options');
+
+/**
+ * @typedef {Object} SAXParserOptions
+ *
+ * @property {Boolean} [locationInfo=false] - Enables source code location information for the tokens.
+ * When enabled, each token event handler will receive {@link LocationInfo} (or {@link StartTagLocationInfo})
+ * object as its last argument.
+ */
+var DEFAULT_OPTIONS = {
+ locationInfo: false
+};
+
+/**
+ * Streaming [SAX]{@link https://en.wikipedia.org/wiki/Simple_API_for_XML}-style HTML parser.
+ * A [transform stream](https://nodejs.org/api/stream.html#stream_class_stream_transform)
+ * (which means you can pipe *through* it, see example).
+ * @class SAXParser
+ * @memberof parse5
+ * @instance
+ * @extends stream.Transform
+ * @param {SAXParserOptions} options - Parsing options.
+ * @example
+ * var parse5 = require('parse5');
+ * var http = require('http');
+ * var fs = require('fs');
+ *
+ * var file = fs.createWriteStream('/home/google.com.html');
+ * var parser = new parse5.SAXParser();
+ *
+ * parser.on('text', function(text) {
+ * // Handle page text content
+ * ...
+ * });
+ *
+ * http.get('http://google.com', function(res) {
+ * // SAXParser is the Transform stream, which means you can pipe
+ * // through it. So, you can analyze page content and, e.g., save it
+ * // to the file at the same time:
+ * res.pipe(parser).pipe(file);
+ * });
+ */
+var SAXParser = module.exports = function (options) {
+ TransformStream.call(this);
+
+ this.options = mergeOptions(DEFAULT_OPTIONS, options);
+
+ this.tokenizer = new Tokenizer(options);
+ this.parserFeedbackSimulator = new ParserFeedbackSimulator(this.tokenizer);
+
+ this.pendingText = null;
+ this.currentTokenLocation = void 0;
+
+ this.lastChunkWritten = false;
+ this.stopped = false;
+
+ // NOTE: always pipe stream to the /dev/null stream to avoid
+ // `highWaterMark` hit even if we don't have consumers.
+ // (see: https://github.com/inikulin/parse5/issues/97#issuecomment-171940774)
+ this.pipe(new DevNullStream());
+};
+
+inherits(SAXParser, TransformStream);
+
+//TransformStream implementation
+SAXParser.prototype._transform = function (chunk, encoding, callback) {
+ if (!this.stopped) {
+ this.tokenizer.write(chunk.toString('utf8'), this.lastChunkWritten);
+ this._runParsingLoop();
+ }
+
+ this.push(chunk);
+
+ callback();
+};
+
+SAXParser.prototype._flush = function (callback) {
+ callback();
+};
+
+SAXParser.prototype.end = function (chunk, encoding, callback) {
+ this.lastChunkWritten = true;
+ TransformStream.prototype.end.call(this, chunk, encoding, callback);
+};
+
+/**
+ * Stops parsing. Useful if you want the parser to stop consuming CPU time once you've obtained the desired info
+ * from the input stream. Doesn't prevent piping, so that data will flow through the parser as usual.
+ *
+ * @function stop
+ * @memberof parse5#SAXParser
+ * @instance
+ * @example
+ * var parse5 = require('parse5');
+ * var http = require('http');
+ * var fs = require('fs');
+ *
+ * var file = fs.createWriteStream('/home/google.com.html');
+ * var parser = new parse5.SAXParser();
+ *
+ * parser.on('doctype', function(name, publicId, systemId) {
+ * // Process doctype info ans stop parsing
+ * ...
+ * parser.stop();
+ * });
+ *
+ * http.get('http://google.com', function(res) {
+ * // Despite the fact that parser.stop() was called whole
+ * // content of the page will be written to the file
+ * res.pipe(parser).pipe(file);
+ * });
+ */
+SAXParser.prototype.stop = function () {
+ this.stopped = true;
+};
+
+//Internals
+SAXParser.prototype._runParsingLoop = function () {
+ do {
+ var token = this.parserFeedbackSimulator.getNextToken();
+
+ if (token.type === Tokenizer.HIBERNATION_TOKEN)
+ break;
+
+ if (token.type === Tokenizer.CHARACTER_TOKEN ||
+ token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN ||
+ token.type === Tokenizer.NULL_CHARACTER_TOKEN) {
+
+ if (this.options.locationInfo) {
+ if (this.pendingText === null)
+ this.currentTokenLocation = token.location;
+
+ else
+ this.currentTokenLocation.end = token.location.end;
+ }
+
+ this.pendingText = (this.pendingText || '') + token.chars;
+ }
+
+ else {
+ this._emitPendingText();
+ this._handleToken(token);
+ }
+ } while (!this.stopped && token.type !== Tokenizer.EOF_TOKEN);
+};
+
+SAXParser.prototype._handleToken = function (token) {
+ if (this.options.locationInfo)
+ this.currentTokenLocation = token.location;
+
+ if (token.type === Tokenizer.START_TAG_TOKEN)
+ /**
+ * Raised when the parser encounters a start tag.
+ * @event startTag
+ * @memberof parse5#SAXParser
+ * @instance
+ * @type {Function}
+ * @param {String} name - Tag name.
+ * @param {Array} attrs - List of attributes in the `{ key: String, value: String }` form.
+ * @param {Boolean} selfClosing - Indicates if the tag is self-closing.
+ * @param {StartTagLocationInfo} [location] - Start tag source code location info.
+ * Available if location info is enabled in {@link SAXParserOptions}.
+ */
+ this.emit('startTag', token.tagName, token.attrs, token.selfClosing, this.currentTokenLocation);
+
+ else if (token.type === Tokenizer.END_TAG_TOKEN)
+ /**
+ * Raised then parser encounters an end tag.
+ * @event endTag
+ * @memberof parse5#SAXParser
+ * @instance
+ * @type {Function}
+ * @param {String} name - Tag name.
+ * @param {LocationInfo} [location] - End tag source code location info.
+ * Available if location info is enabled in {@link SAXParserOptions}.
+ */
+ this.emit('endTag', token.tagName, this.currentTokenLocation);
+
+ else if (token.type === Tokenizer.COMMENT_TOKEN)
+ /**
+ * Raised then parser encounters a comment.
+ * @event comment
+ * @memberof parse5#SAXParser
+ * @instance
+ * @type {Function}
+ * @param {String} text - Comment text.
+ * @param {LocationInfo} [location] - Comment source code location info.
+ * Available if location info is enabled in {@link SAXParserOptions}.
+ */
+ this.emit('comment', token.data, this.currentTokenLocation);
+
+ else if (token.type === Tokenizer.DOCTYPE_TOKEN)
+ /**
+ * Raised then parser encounters a [document type declaration]{@link https://en.wikipedia.org/wiki/Document_type_declaration}.
+ * @event doctype
+ * @memberof parse5#SAXParser
+ * @instance
+ * @type {Function}
+ * @param {String} name - Document type name.
+ * @param {String} publicId - Document type public identifier.
+ * @param {String} systemId - Document type system identifier.
+ * @param {LocationInfo} [location] - Document type declaration source code location info.
+ * Available if location info is enabled in {@link SAXParserOptions}.
+ */
+ this.emit('doctype', token.name, token.publicId, token.systemId, this.currentTokenLocation);
+};
+
+SAXParser.prototype._emitPendingText = function () {
+ if (this.pendingText !== null) {
+ /**
+ * Raised then parser encounters text content.
+ * @event text
+ * @memberof parse5#SAXParser
+ * @instance
+ * @type {Function}
+ * @param {String} text - Text content.
+ * @param {LocationInfo} [location] - Text content code location info.
+ * Available if location info is enabled in {@link SAXParserOptions}.
+ */
+ this.emit('text', this.pendingText, this.currentTokenLocation);
+ this.pendingText = null;
+ }
+};
- if (this.skipNextNewLine) {
- this.skipNextNewLine = false;
-
- if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
- if (token.chars.length === 1)
- return;
-
- token.chars = token.chars.substr(1);
- }
- }
-
- if (this._shouldProcessTokenInForeignContent(token))
- this._processTokenInForeignContent(token);
-
- else
- this._processToken(token);
-};
-
-Parser.prototype._runParsingLoop = function () {
- while (!this.stopped)
- this._iterateParsingLoop();
-};
-
-//Text parsing
-Parser.prototype._setupTokenizerCDATAMode = function () {
- var current = this._getAdjustedCurrentElement();
-
- this.tokenizer.allowCDATA = current && current !== this.document &&
- this.treeAdapter.getNamespaceURI(current) !== NS.HTML &&
- (!this._isHtmlIntegrationPoint(current)) &&
- (!this._isMathMLTextIntegrationPoint(current));
-};
-
-Parser.prototype._switchToTextParsing = function (currentToken, nextTokenizerState) {
- this._insertElement(currentToken, NS.HTML);
- this.tokenizer.state = nextTokenizerState;
- this.originalInsertionMode = this.insertionMode;
- this.insertionMode = TEXT_MODE;
-};
-
-//Fragment parsing
-Parser.prototype._getAdjustedCurrentElement = function () {
- return this.openElements.stackTop === 0 && this.fragmentContext ?
- this.fragmentContext :
- this.openElements.current;
-};
-
-Parser.prototype._findFormInFragmentContext = function () {
- var node = this.fragmentContext;
-
- do {
- if (this.treeAdapter.getTagName(node) === $.FORM) {
- this.formElement = node;
- break;
- }
-
- node = this.treeAdapter.getParentNode(node);
- } while (node);
-};
-
-Parser.prototype._initTokenizerForFragmentParsing = function () {
- var tn = this.treeAdapter.getTagName(this.fragmentContext);
-
- if (tn === $.TITLE || tn === $.TEXTAREA)
- this.tokenizer.state = Tokenizer.MODE.RCDATA;
-
- else if (tn === $.STYLE || tn === $.XMP || tn === $.IFRAME ||
- tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT) {
- this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
- }
-
- else if (tn === $.SCRIPT)
- this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
-
- else if (tn === $.PLAINTEXT)
- this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
-};
-
-//Tree mutation
-Parser.prototype._setDocumentType = function (token) {
- this.treeAdapter.setDocumentType(this.document, token.name, token.publicId, token.systemId);
-};
-
-Parser.prototype._attachElementToTree = function (element) {
- if (this._shouldFosterParentOnInsertion())
- this._fosterParentElement(element);
-
- else {
- var parent = this.openElements.currentTmplContent || this.openElements.current;
-
- this.treeAdapter.appendChild(parent, element);
- }
-};
-
-Parser.prototype._appendElement = function (token, namespaceURI) {
- var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
-
- this._attachElementToTree(element);
-};
-
-Parser.prototype._insertElement = function (token, namespaceURI) {
- var element = this.treeAdapter.createElement(token.tagName, namespaceURI, token.attrs);
-
- this._attachElementToTree(element);
- this.openElements.push(element);
-};
-
-Parser.prototype._insertTemplate = function (token) {
- var tmpl = this.treeAdapter.createElement(token.tagName, NS.HTML, token.attrs),
- content = this.treeAdapter.createDocumentFragment();
-
- this.treeAdapter.appendChild(tmpl, content);
- this._attachElementToTree(tmpl);
- this.openElements.push(tmpl);
-};
-
-Parser.prototype._insertFakeRootElement = function () {
- var element = this.treeAdapter.createElement($.HTML, NS.HTML, []);
-
- this.treeAdapter.appendChild(this.openElements.current, element);
- this.openElements.push(element);
-};
-
-Parser.prototype._appendCommentNode = function (token, parent) {
- var commentNode = this.treeAdapter.createCommentNode(token.data);
-
- this.treeAdapter.appendChild(parent, commentNode);
-};
-
-Parser.prototype._insertCharacters = function (token) {
- if (this._shouldFosterParentOnInsertion())
- this._fosterParentText(token.chars);
-
- else {
- var parent = this.openElements.currentTmplContent || this.openElements.current;
-
- this.treeAdapter.insertText(parent, token.chars);
- }
-};
-
-Parser.prototype._adoptNodes = function (donor, recipient) {
- while (true) {
- var child = this.treeAdapter.getFirstChild(donor);
-
- if (!child)
- break;
-
- this.treeAdapter.detachNode(child);
- this.treeAdapter.appendChild(recipient, child);
- }
-};
-
-//Token processing
-Parser.prototype._shouldProcessTokenInForeignContent = function (token) {
- var current = this._getAdjustedCurrentElement();
-
- if (!current || current === this.document)
- return false;
-
- var ns = this.treeAdapter.getNamespaceURI(current);
-
- if (ns === NS.HTML)
- return false;
-
- if (this.treeAdapter.getTagName(current) === $.ANNOTATION_XML && ns === NS.MATHML &&
- token.type === Tokenizer.START_TAG_TOKEN && token.tagName === $.SVG) {
- return false;
- }
-
- var isCharacterToken = token.type === Tokenizer.CHARACTER_TOKEN ||
- token.type === Tokenizer.NULL_CHARACTER_TOKEN ||
- token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN,
- isMathMLTextStartTag = token.type === Tokenizer.START_TAG_TOKEN &&
- token.tagName !== $.MGLYPH &&
- token.tagName !== $.MALIGNMARK;
-
- if ((isMathMLTextStartTag || isCharacterToken) && this._isMathMLTextIntegrationPoint(current))
- return false;
-
- if ((token.type === Tokenizer.START_TAG_TOKEN || isCharacterToken) && this._isHtmlIntegrationPoint(current))
- return false;
-
- return token.type !== Tokenizer.EOF_TOKEN;
-};
-
-Parser.prototype._processToken = function (token) {
- _[this.insertionMode][token.type](this, token);
-};
-
-Parser.prototype._processTokenInBodyMode = function (token) {
- _[IN_BODY_MODE][token.type](this, token);
-};
-
-Parser.prototype._processTokenInForeignContent = function (token) {
- if (token.type === Tokenizer.CHARACTER_TOKEN)
- characterInForeignContent(this, token);
-
- else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN)
- nullCharacterInForeignContent(this, token);
-
- else if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN)
- insertCharacters(this, token);
-
- else if (token.type === Tokenizer.COMMENT_TOKEN)
- appendComment(this, token);
-
- else if (token.type === Tokenizer.START_TAG_TOKEN)
- startTagInForeignContent(this, token);
-
- else if (token.type === Tokenizer.END_TAG_TOKEN)
- endTagInForeignContent(this, token);
-};
-
-Parser.prototype._processFakeStartTagWithAttrs = function (tagName, attrs) {
- var fakeToken = this.tokenizer.buildStartTagToken(tagName);
-
- fakeToken.attrs = attrs;
- this._processToken(fakeToken);
-};
-
-Parser.prototype._processFakeStartTag = function (tagName) {
- var fakeToken = this.tokenizer.buildStartTagToken(tagName);
-
- this._processToken(fakeToken);
- return fakeToken;
-};
-
-Parser.prototype._processFakeEndTag = function (tagName) {
- var fakeToken = this.tokenizer.buildEndTagToken(tagName);
-
- this._processToken(fakeToken);
- return fakeToken;
-};
-
-//Integration points
-Parser.prototype._isMathMLTextIntegrationPoint = function (element) {
- var tn = this.treeAdapter.getTagName(element),
- ns = this.treeAdapter.getNamespaceURI(element);
-
- return ForeignContent.isMathMLTextIntegrationPoint(tn, ns);
-};
-
-Parser.prototype._isHtmlIntegrationPoint = function (element) {
- var tn = this.treeAdapter.getTagName(element),
- ns = this.treeAdapter.getNamespaceURI(element),
- attrs = this.treeAdapter.getAttrList(element);
-
- return ForeignContent.isHtmlIntegrationPoint(tn, ns, attrs);
-};
-
-//Active formatting elements reconstruction
-Parser.prototype._reconstructActiveFormattingElements = function () {
- var listLength = this.activeFormattingElements.length;
-
- if (listLength) {
- var unopenIdx = listLength,
- entry = null;
-
- do {
- unopenIdx--;
- entry = this.activeFormattingElements.entries[unopenIdx];
-
- if (entry.type === FormattingElementList.MARKER_ENTRY || this.openElements.contains(entry.element)) {
- unopenIdx++;
- break;
- }
- } while (unopenIdx > 0);
-
- for (var i = unopenIdx; i < listLength; i++) {
- entry = this.activeFormattingElements.entries[i];
- this._insertElement(entry.token, this.treeAdapter.getNamespaceURI(entry.element));
- entry.element = this.openElements.current;
- }
- }
-};
-
-//Close elements
-Parser.prototype._closeTableCell = function () {
- if (this.openElements.hasInTableScope($.TD))
- this._processFakeEndTag($.TD);
-
- else
- this._processFakeEndTag($.TH);
-};
-
-Parser.prototype._closePElement = function () {
- this.openElements.generateImpliedEndTagsWithExclusion($.P);
- this.openElements.popUntilTagNamePopped($.P);
-};
-
-//Insertion modes
-Parser.prototype._resetInsertionMode = function () {
- for (var i = this.openElements.stackTop, last = false; i >= 0; i--) {
- var element = this.openElements.items[i];
-
- if (i === 0) {
- last = true;
-
- if (this.fragmentContext)
- element = this.fragmentContext;
- }
-
- var tn = this.treeAdapter.getTagName(element),
- newInsertionMode = INSERTION_MODE_RESET_MAP[tn];
-
- if (newInsertionMode) {
- this.insertionMode = newInsertionMode;
- break;
- }
-
- else if (!last && (tn === $.TD || tn === $.TH)) {
- this.insertionMode = IN_CELL_MODE;
- break;
- }
-
- else if (!last && tn === $.HEAD) {
- this.insertionMode = IN_HEAD_MODE;
- break;
- }
-
- else if (tn === $.SELECT) {
- this._resetInsertionModeForSelect(i);
- break;
- }
-
- else if (tn === $.TEMPLATE) {
- this.insertionMode = this.currentTmplInsertionMode;
- break;
- }
-
- else if (tn === $.HTML) {
- this.insertionMode = this.headElement ? AFTER_HEAD_MODE : BEFORE_HEAD_MODE;
- break;
- }
-
- else if (last) {
- this.insertionMode = IN_BODY_MODE;
- break;
- }
- }
-};
-
-Parser.prototype._resetInsertionModeForSelect = function (selectIdx) {
- if (selectIdx > 0) {
- for (var i = selectIdx - 1; i > 0; i--) {
- var ancestor = this.openElements.items[i],
- tn = this.treeAdapter.getTagName(ancestor);
-
- if (tn === $.TEMPLATE)
- break;
-
- else if (tn === $.TABLE) {
- this.insertionMode = IN_SELECT_IN_TABLE_MODE;
- return;
- }
- }
- }
-
- this.insertionMode = IN_SELECT_MODE;
-};
-
-Parser.prototype._pushTmplInsertionMode = function (mode) {
- this.tmplInsertionModeStack.push(mode);
- this.tmplInsertionModeStackTop++;
- this.currentTmplInsertionMode = mode;
-};
-
-Parser.prototype._popTmplInsertionMode = function () {
- this.tmplInsertionModeStack.pop();
- this.tmplInsertionModeStackTop--;
- this.currentTmplInsertionMode = this.tmplInsertionModeStack[this.tmplInsertionModeStackTop];
-};
-
-//Foster parenting
-Parser.prototype._isElementCausesFosterParenting = function (element) {
- var tn = this.treeAdapter.getTagName(element);
-
- return tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn == $.THEAD || tn === $.TR;
-};
-
-Parser.prototype._shouldFosterParentOnInsertion = function () {
- return this.fosterParentingEnabled && this._isElementCausesFosterParenting(this.openElements.current);
-};
-
-Parser.prototype._findFosterParentingLocation = function () {
- var location = {
- parent: null,
- beforeElement: null
- };
-
- for (var i = this.openElements.stackTop; i >= 0; i--) {
- var openElement = this.openElements.items[i],
- tn = this.treeAdapter.getTagName(openElement),
- ns = this.treeAdapter.getNamespaceURI(openElement);
-
- if (tn === $.TEMPLATE && ns === NS.HTML) {
- location.parent = this.treeAdapter.getChildNodes(openElement)[0];
- break;
- }
-
- else if (tn === $.TABLE) {
- location.parent = this.treeAdapter.getParentNode(openElement);
-
- if (location.parent)
- location.beforeElement = openElement;
- else
- location.parent = this.openElements.items[i - 1];
-
- break;
- }
- }
-
- if (!location.parent)
- location.parent = this.openElements.items[0];
-
- return location;
-};
-
-Parser.prototype._fosterParentElement = function (element) {
- var location = this._findFosterParentingLocation();
-
- if (location.beforeElement)
- this.treeAdapter.insertBefore(location.parent, element, location.beforeElement);
- else
- this.treeAdapter.appendChild(location.parent, element);
-};
-
-Parser.prototype._fosterParentText = function (chars) {
- var location = this._findFosterParentingLocation();
-
- if (location.beforeElement)
- this.treeAdapter.insertTextBefore(location.parent, chars, location.beforeElement);
- else
- this.treeAdapter.insertText(location.parent, chars);
-};
-
-//Special elements
-Parser.prototype._isSpecialElement = function (element) {
- var tn = this.treeAdapter.getTagName(element),
- ns = this.treeAdapter.getNamespaceURI(element);
-
- return HTML.SPECIAL_ELEMENTS[ns][tn];
-};
-
-//Adoption agency algorithm
-//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tree-construction.html#adoptionAgency)
-//------------------------------------------------------------------
-
-//Steps 5-8 of the algorithm
-function aaObtainFormattingElementEntry(p, token) {
- var formattingElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName(token.tagName);
-
- if (formattingElementEntry) {
- if (!p.openElements.contains(formattingElementEntry.element)) {
- p.activeFormattingElements.removeEntry(formattingElementEntry);
- formattingElementEntry = null;
- }
-
- else if (!p.openElements.hasInScope(token.tagName))
- formattingElementEntry = null;
- }
-
- else
- genericEndTagInBody(p, token);
-
- return formattingElementEntry;
-}
-
-//Steps 9 and 10 of the algorithm
-function aaObtainFurthestBlock(p, formattingElementEntry) {
- var furthestBlock = null;
-
- for (var i = p.openElements.stackTop; i >= 0; i--) {
- var element = p.openElements.items[i];
-
- if (element === formattingElementEntry.element)
- break;
-
- if (p._isSpecialElement(element))
- furthestBlock = element;
- }
-
- if (!furthestBlock) {
- p.openElements.popUntilElementPopped(formattingElementEntry.element);
- p.activeFormattingElements.removeEntry(formattingElementEntry);
- }
-
- return furthestBlock;
-}
-
-//Step 13 of the algorithm
-function aaInnerLoop(p, furthestBlock, formattingElement) {
- var element = null,
- lastElement = furthestBlock,
- nextElement = p.openElements.getCommonAncestor(furthestBlock);
-
- for (var i = 0; i < AA_INNER_LOOP_ITER; i++) {
- element = nextElement;
-
- //NOTE: store next element for the next loop iteration (it may be deleted from the stack by step 9.5)
- nextElement = p.openElements.getCommonAncestor(element);
-
- var elementEntry = p.activeFormattingElements.getElementEntry(element);
-
- if (!elementEntry) {
- p.openElements.remove(element);
- continue;
- }
-
- if (element === formattingElement)
- break;
-
- element = aaRecreateElementFromEntry(p, elementEntry);
-
- if (lastElement === furthestBlock)
- p.activeFormattingElements.bookmark = elementEntry;
-
- p.treeAdapter.detachNode(lastElement);
- p.treeAdapter.appendChild(element, lastElement);
- lastElement = element;
- }
-
- return lastElement;
-}
-
-//Step 13.7 of the algorithm
-function aaRecreateElementFromEntry(p, elementEntry) {
- var ns = p.treeAdapter.getNamespaceURI(elementEntry.element),
- newElement = p.treeAdapter.createElement(elementEntry.token.tagName, ns, elementEntry.token.attrs);
-
- p.openElements.replace(elementEntry.element, newElement);
- elementEntry.element = newElement;
-
- return newElement;
-}
-
-//Step 14 of the algorithm
-function aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement) {
- if (p._isElementCausesFosterParenting(commonAncestor))
- p._fosterParentElement(lastElement);
-
- else {
- var tn = p.treeAdapter.getTagName(commonAncestor),
- ns = p.treeAdapter.getNamespaceURI(commonAncestor);
-
- if (tn === $.TEMPLATE && ns === NS.HTML)
- commonAncestor = p.treeAdapter.getChildNodes(commonAncestor)[0];
-
- p.treeAdapter.appendChild(commonAncestor, lastElement);
- }
-}
-
-//Steps 15-19 of the algorithm
-function aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry) {
- var ns = p.treeAdapter.getNamespaceURI(formattingElementEntry.element),
- token = formattingElementEntry.token,
- newElement = p.treeAdapter.createElement(token.tagName, ns, token.attrs);
-
- p._adoptNodes(furthestBlock, newElement);
- p.treeAdapter.appendChild(furthestBlock, newElement);
-
- p.activeFormattingElements.insertElementAfterBookmark(newElement, formattingElementEntry.token);
- p.activeFormattingElements.removeEntry(formattingElementEntry);
-
- p.openElements.remove(formattingElementEntry.element);
- p.openElements.insertAfter(furthestBlock, newElement);
-}
-
-//Algorithm entry point
-function callAdoptionAgency(p, token) {
- for (var i = 0; i < AA_OUTER_LOOP_ITER; i++) {
- var formattingElementEntry = aaObtainFormattingElementEntry(p, token, formattingElementEntry);
-
- if (!formattingElementEntry)
- break;
-
- var furthestBlock = aaObtainFurthestBlock(p, formattingElementEntry);
-
- if (!furthestBlock)
- break;
-
- p.activeFormattingElements.bookmark = formattingElementEntry;
-
- var lastElement = aaInnerLoop(p, furthestBlock, formattingElementEntry.element),
- commonAncestor = p.openElements.getCommonAncestor(formattingElementEntry.element);
-
- p.treeAdapter.detachNode(lastElement);
- aaInsertLastNodeInCommonAncestor(p, commonAncestor, lastElement);
- aaReplaceFormattingElement(p, furthestBlock, formattingElementEntry);
- }
-}
-
-
-//Generic token handlers
-//------------------------------------------------------------------
-function ignoreToken(p, token) {
- //NOTE: do nothing =)
-}
-
-function appendComment(p, token) {
- p._appendCommentNode(token, p.openElements.currentTmplContent || p.openElements.current)
-}
-
-function appendCommentToRootHtmlElement(p, token) {
- p._appendCommentNode(token, p.openElements.items[0]);
-}
-
-function appendCommentToDocument(p, token) {
- p._appendCommentNode(token, p.document);
-}
-
-function insertCharacters(p, token) {
- p._insertCharacters(token);
-}
-
-function stopParsing(p, token) {
- p.stopped = true;
-}
-
-//12.2.5.4.1 The "initial" insertion mode
-//------------------------------------------------------------------
-function doctypeInInitialMode(p, token) {
- p._setDocumentType(token);
-
- if (token.forceQuirks || Doctype.isQuirks(token.name, token.publicId, token.systemId))
- p.treeAdapter.setQuirksMode(p.document);
-
- p.insertionMode = BEFORE_HTML_MODE;
-}
-
-function tokenInInitialMode(p, token) {
- p.treeAdapter.setQuirksMode(p.document);
- p.insertionMode = BEFORE_HTML_MODE;
- p._processToken(token);
-}
-
-
-//12.2.5.4.2 The "before html" insertion mode
-//------------------------------------------------------------------
-function startTagBeforeHtml(p, token) {
- if (token.tagName === $.HTML) {
- p._insertElement(token, NS.HTML);
- p.insertionMode = BEFORE_HEAD_MODE;
- }
-
- else
- tokenBeforeHtml(p, token);
-}
-
-function endTagBeforeHtml(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML || tn === $.HEAD || tn === $.BODY || tn === $.BR)
- tokenBeforeHtml(p, token);
-}
-
-function tokenBeforeHtml(p, token) {
- p._insertFakeRootElement();
- p.insertionMode = BEFORE_HEAD_MODE;
- p._processToken(token);
-}
-
-
-//12.2.5.4.3 The "before head" insertion mode
-//------------------------------------------------------------------
-function startTagBeforeHead(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML)
- startTagInBody(p, token);
-
- else if (tn === $.HEAD) {
- p._insertElement(token, NS.HTML);
- p.headElement = p.openElements.current;
- p.insertionMode = IN_HEAD_MODE;
- }
-
- else
- tokenBeforeHead(p, token);
-}
-
-function endTagBeforeHead(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HEAD || tn === $.BODY || tn === $.HTML || tn === $.BR)
- tokenBeforeHead(p, token);
-}
-
-function tokenBeforeHead(p, token) {
- p._processFakeStartTag($.HEAD);
- p._processToken(token);
-}
-
-
-//12.2.5.4.4 The "in head" insertion mode
-//------------------------------------------------------------------
-function startTagInHead(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML)
- startTagInBody(p, token);
-
- else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND ||
- tn === $.COMMAND || tn === $.LINK || tn === $.META) {
- p._appendElement(token, NS.HTML);
- }
-
- else if (tn === $.TITLE)
- p._switchToTextParsing(token, Tokenizer.MODE.RCDATA);
-
- //NOTE: here we assume that we always act as an interactive user agent with enabled scripting, so we parse
- // as a rawtext.
- else if (tn === $.NOSCRIPT || tn === $.NOFRAMES || tn === $.STYLE)
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
-
- else if (tn === $.SCRIPT)
- p._switchToTextParsing(token, Tokenizer.MODE.SCRIPT_DATA);
-
- else if (tn === $.TEMPLATE) {
- p._insertTemplate(token, NS.HTML);
- p.activeFormattingElements.insertMarker();
- p.framesetOk = false;
- p.insertionMode = IN_TEMPLATE_MODE;
- p._pushTmplInsertionMode(IN_TEMPLATE_MODE);
- }
-
- else if (tn !== $.HEAD)
- tokenInHead(p, token);
-}
-
-function endTagInHead(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HEAD) {
- p.openElements.pop();
- p.insertionMode = AFTER_HEAD_MODE;
- }
-
- else if (tn === $.BODY || tn === $.BR || tn === $.HTML)
- tokenInHead(p, token);
-
- else if (tn === $.TEMPLATE && p.openElements.tmplCount > 0) {
- p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTemplatePopped();
- p.activeFormattingElements.clearToLastMarker();
- p._popTmplInsertionMode();
- p._resetInsertionMode();
- }
-}
-
-function tokenInHead(p, token) {
- p._processFakeEndTag($.HEAD);
- p._processToken(token);
-}
-
-
-//12.2.5.4.6 The "after head" insertion mode
-//------------------------------------------------------------------
-function startTagAfterHead(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML)
- startTagInBody(p, token);
-
- else if (tn === $.BODY) {
- p._insertElement(token, NS.HTML);
- p.framesetOk = false;
- p.insertionMode = IN_BODY_MODE;
- }
-
- else if (tn === $.FRAMESET) {
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_FRAMESET_MODE;
- }
-
- else if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META ||
- tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) {
- p.openElements.push(p.headElement);
- startTagInHead(p, token);
- p.openElements.remove(p.headElement);
- }
-
- else if (tn !== $.HEAD)
- tokenAfterHead(p, token);
-}
-
-function endTagAfterHead(p, token) {
- var tn = token.tagName;
-
- if (tn === $.BODY || tn === $.HTML || tn === $.BR)
- tokenAfterHead(p, token);
-
- else if (tn === $.TEMPLATE)
- endTagInHead(p, token);
-}
-
-function tokenAfterHead(p, token) {
- p._processFakeStartTag($.BODY);
- p.framesetOk = true;
- p._processToken(token);
-}
-
-
-//12.2.5.4.7 The "in body" insertion mode
-//------------------------------------------------------------------
-function whitespaceCharacterInBody(p, token) {
- p._reconstructActiveFormattingElements();
- p._insertCharacters(token);
-}
-
-function characterInBody(p, token) {
- p._reconstructActiveFormattingElements();
- p._insertCharacters(token);
- p.framesetOk = false;
-}
-
-function htmlStartTagInBody(p, token) {
- if (p.openElements.tmplCount === 0)
- p.treeAdapter.adoptAttributes(p.openElements.items[0], token.attrs);
-}
-
-function bodyStartTagInBody(p, token) {
- var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
-
- if (bodyElement && p.openElements.tmplCount === 0) {
- p.framesetOk = false;
- p.treeAdapter.adoptAttributes(bodyElement, token.attrs);
- }
-}
-
-function framesetStartTagInBody(p, token) {
- var bodyElement = p.openElements.tryPeekProperlyNestedBodyElement();
-
- if (p.framesetOk && bodyElement) {
- p.treeAdapter.detachNode(bodyElement);
- p.openElements.popAllUpToHtmlElement();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_FRAMESET_MODE;
- }
-}
-
-function addressStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P))
- p._closePElement();
-
- p._insertElement(token, NS.HTML);
-}
-
-function numberedHeaderStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P))
- p._closePElement();
-
- var tn = p.openElements.currentTagName;
-
- if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
- p.openElements.pop();
-
- p._insertElement(token, NS.HTML);
-}
-
-function preStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P))
- p._closePElement();
-
- p._insertElement(token, NS.HTML);
- //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
- //on to the next one. (Newlines at the start of pre blocks are ignored as an authoring convenience.)
- p.skipNextNewLine = true;
- p.framesetOk = false;
-}
-
-function formStartTagInBody(p, token) {
- var inTemplate = p.openElements.tmplCount > 0;
+},{"../common/merge_options":83,"../tokenizer":97,"./dev_null_stream":92,"./parser_feedback_simulator":94,"stream":76,"util":79}],94:[function(require,module,exports){
+'use strict';
+
+var Tokenizer = require('../tokenizer'),
+ foreignContent = require('../common/foreign_content'),
+ UNICODE = require('../common/unicode'),
+ HTML = require('../common/html');
+
+
+//Aliases
+var $ = HTML.TAG_NAMES,
+ NS = HTML.NAMESPACES;
+
+
+//ParserFeedbackSimulator
+//Simulates adjustment of the Tokenizer which performed by standard parser during tree construction.
+var ParserFeedbackSimulator = module.exports = function (tokenizer) {
+ this.tokenizer = tokenizer;
+
+ this.namespaceStack = [];
+ this.namespaceStackTop = -1;
+ this._enterNamespace(NS.HTML);
+};
+
+ParserFeedbackSimulator.prototype.getNextToken = function () {
+ var token = this.tokenizer.getNextToken();
+
+ if (token.type === Tokenizer.START_TAG_TOKEN)
+ this._handleStartTagToken(token);
+
+ else if (token.type === Tokenizer.END_TAG_TOKEN)
+ this._handleEndTagToken(token);
+
+ else if (token.type === Tokenizer.NULL_CHARACTER_TOKEN && this.inForeignContent) {
+ token.type = Tokenizer.CHARACTER_TOKEN;
+ token.chars = UNICODE.REPLACEMENT_CHARACTER;
+ }
+
+ else if (this.skipNextNewLine) {
+ if (token.type !== Tokenizer.HIBERNATION_TOKEN)
+ this.skipNextNewLine = false;
+
+ if (token.type === Tokenizer.WHITESPACE_CHARACTER_TOKEN && token.chars[0] === '\n') {
+ if (token.chars.length === 1)
+ return this.getNextToken();
+
+ token.chars = token.chars.substr(1);
+ }
+ }
+
+ return token;
+};
+
+//Namespace stack mutations
+ParserFeedbackSimulator.prototype._enterNamespace = function (namespace) {
+ this.namespaceStackTop++;
+ this.namespaceStack.push(namespace);
+
+ this.inForeignContent = namespace !== NS.HTML;
+ this.currentNamespace = namespace;
+ this.tokenizer.allowCDATA = this.inForeignContent;
+};
+
+ParserFeedbackSimulator.prototype._leaveCurrentNamespace = function () {
+ this.namespaceStackTop--;
+ this.namespaceStack.pop();
+
+ this.currentNamespace = this.namespaceStack[this.namespaceStackTop];
+ this.inForeignContent = this.currentNamespace !== NS.HTML;
+ this.tokenizer.allowCDATA = this.inForeignContent;
+};
+
+//Token handlers
+ParserFeedbackSimulator.prototype._ensureTokenizerMode = function (tn) {
+ if (tn === $.TEXTAREA || tn === $.TITLE)
+ this.tokenizer.state = Tokenizer.MODE.RCDATA;
+
+ else if (tn === $.PLAINTEXT)
+ this.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
+
+ else if (tn === $.SCRIPT)
+ this.tokenizer.state = Tokenizer.MODE.SCRIPT_DATA;
+
+ else if (tn === $.STYLE || tn === $.IFRAME || tn === $.XMP ||
+ tn === $.NOEMBED || tn === $.NOFRAMES || tn === $.NOSCRIPT)
+ this.tokenizer.state = Tokenizer.MODE.RAWTEXT;
+};
+
+ParserFeedbackSimulator.prototype._handleStartTagToken = function (token) {
+ var tn = token.tagName;
+
+ if (tn === $.SVG)
+ this._enterNamespace(NS.SVG);
+
+ else if (tn === $.MATH)
+ this._enterNamespace(NS.MATHML);
+
+ if (this.inForeignContent) {
+ if (foreignContent.causesExit(token)) {
+ this._leaveCurrentNamespace();
+ return;
+ }
+
+ var currentNs = this.currentNamespace;
+
+ if (currentNs === NS.MATHML)
+ foreignContent.adjustTokenMathMLAttrs(token);
+
+ else if (currentNs === NS.SVG) {
+ foreignContent.adjustTokenSVGTagName(token);
+ foreignContent.adjustTokenSVGAttrs(token);
+ }
+
+ foreignContent.adjustTokenXMLAttrs(token);
+
+ tn = token.tagName;
+
+ if (!token.selfClosing && foreignContent.isIntegrationPoint(tn, currentNs, token.attrs))
+ this._enterNamespace(NS.HTML);
+ }
+
+ else {
+ if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING)
+ this.skipNextNewLine = true;
+
+ else if (tn === $.IMAGE)
+ token.tagName = $.IMG;
+
+ this._ensureTokenizerMode(tn);
+ }
+};
+
+ParserFeedbackSimulator.prototype._handleEndTagToken = function (token) {
+ var tn = token.tagName;
+
+ if (!this.inForeignContent) {
+ var previousNs = this.namespaceStack[this.namespaceStackTop - 1];
+
+ //NOTE: check for exit from integration point
+ if (foreignContent.isIntegrationPoint(tn, previousNs, token.attrs))
+ this._leaveCurrentNamespace();
+ }
+
+ else if (tn === $.SVG && this.currentNamespace === NS.SVG ||
+ tn === $.MATH && this.currentNamespace === NS.MATHML)
+ this._leaveCurrentNamespace();
+};
- if (!p.formElement || inTemplate) {
- if (p.openElements.hasInButtonScope($.P))
- p._closePElement();
+},{"../common/foreign_content":81,"../common/html":82,"../common/unicode":84,"../tokenizer":97}],95:[function(require,module,exports){
+'use strict';
+
+var defaultTreeAdapter = require('../tree_adapters/default'),
+ doctype = require('../common/doctype'),
+ mergeOptions = require('../common/merge_options'),
+ HTML = require('../common/html');
+
+//Aliases
+var $ = HTML.TAG_NAMES,
+ NS = HTML.NAMESPACES;
+
+//Default serializer options
+/**
+ * @typedef {Object} SerializerOptions
+ *
+ * @property {TreeAdapter} [treeAdapter=parse5.treeAdapters.default] - Specifies input tree format.
+ */
+var DEFAULT_OPTIONS = {
+ treeAdapter: defaultTreeAdapter
+};
+
+//Escaping regexes
+var AMP_REGEX = /&/g,
+ NBSP_REGEX = /\u00a0/g,
+ DOUBLE_QUOTE_REGEX = /"/g,
+ LT_REGEX = //g;
+
+//Serializer
+var Serializer = module.exports = function (node, options) {
+ this.options = mergeOptions(DEFAULT_OPTIONS, options);
+ this.treeAdapter = this.options.treeAdapter;
+
+ this.html = '';
+ this.startNode = node;
+};
+
+// NOTE: exported as static method for the testing purposes
+Serializer.escapeString = function (str, attrMode) {
+ str = str
+ .replace(AMP_REGEX, '&')
+ .replace(NBSP_REGEX, ' ');
+
+ if (attrMode)
+ str = str.replace(DOUBLE_QUOTE_REGEX, '"');
+
+ else {
+ str = str
+ .replace(LT_REGEX, '<')
+ .replace(GT_REGEX, '>');
+ }
+
+ return str;
+};
+
+
+//API
+Serializer.prototype.serialize = function () {
+ this._serializeChildNodes(this.startNode);
+
+ return this.html;
+};
+
+
+//Internals
+Serializer.prototype._serializeChildNodes = function (parentNode) {
+ var childNodes = this.treeAdapter.getChildNodes(parentNode);
+
+ if (childNodes) {
+ for (var i = 0, cnLength = childNodes.length; i < cnLength; i++) {
+ var currentNode = childNodes[i];
+
+ if (this.treeAdapter.isElementNode(currentNode))
+ this._serializeElement(currentNode);
+
+ else if (this.treeAdapter.isTextNode(currentNode))
+ this._serializeTextNode(currentNode);
+
+ else if (this.treeAdapter.isCommentNode(currentNode))
+ this._serializeCommentNode(currentNode);
+
+ else if (this.treeAdapter.isDocumentTypeNode(currentNode))
+ this._serializeDocumentTypeNode(currentNode);
+ }
+ }
+};
+
+Serializer.prototype._serializeElement = function (node) {
+ var tn = this.treeAdapter.getTagName(node),
+ ns = this.treeAdapter.getNamespaceURI(node);
+
+ this.html += '<' + tn;
+ this._serializeAttributes(node);
+ this.html += '>';
+
+ if (tn !== $.AREA && tn !== $.BASE && tn !== $.BASEFONT && tn !== $.BGSOUND && tn !== $.BR && tn !== $.BR &&
+ tn !== $.COL && tn !== $.EMBED && tn !== $.FRAME && tn !== $.HR && tn !== $.IMG && tn !== $.INPUT &&
+ tn !== $.KEYGEN && tn !== $.LINK && tn !== $.MENUITEM && tn !== $.META && tn !== $.PARAM && tn !== $.SOURCE &&
+ tn !== $.TRACK && tn !== $.WBR) {
+
+ if (tn === $.PRE || tn === $.TEXTAREA || tn === $.LISTING) {
+ var firstChild = this.treeAdapter.getFirstChild(node);
+
+ if (firstChild && this.treeAdapter.isTextNode(firstChild)) {
+ var content = this.treeAdapter.getTextNodeContent(firstChild);
+
+ if (content[0] === '\n')
+ this.html += '\n';
+ }
+ }
+
+ var childNodesHolder = tn === $.TEMPLATE && ns === NS.HTML ?
+ this.treeAdapter.getTemplateContent(node) :
+ node;
+
+ this._serializeChildNodes(childNodesHolder);
+ this.html += '' + tn + '>';
+ }
+};
+
+Serializer.prototype._serializeAttributes = function (node) {
+ var attrs = this.treeAdapter.getAttrList(node);
+
+ for (var i = 0, attrsLength = attrs.length; i < attrsLength; i++) {
+ var attr = attrs[i],
+ value = Serializer.escapeString(attr.value, true);
+
+ this.html += ' ';
+
+ if (!attr.namespace)
+ this.html += attr.name;
+
+ else if (attr.namespace === NS.XML)
+ this.html += 'xml:' + attr.name;
+
+ else if (attr.namespace === NS.XMLNS) {
+ if (attr.name !== 'xmlns')
+ this.html += 'xmlns:';
+
+ this.html += attr.name;
+ }
+
+ else if (attr.namespace === NS.XLINK)
+ this.html += 'xlink:' + attr.name;
+
+ else
+ this.html += attr.namespace + ':' + attr.name;
+
+ this.html += '="' + value + '"';
+ }
+};
+
+Serializer.prototype._serializeTextNode = function (node) {
+ var content = this.treeAdapter.getTextNodeContent(node),
+ parent = this.treeAdapter.getParentNode(node),
+ parentTn = void 0;
+
+ if (parent && this.treeAdapter.isElementNode(parent))
+ parentTn = this.treeAdapter.getTagName(parent);
+
+ if (parentTn === $.STYLE || parentTn === $.SCRIPT || parentTn === $.XMP || parentTn === $.IFRAME ||
+ parentTn === $.NOEMBED || parentTn === $.NOFRAMES || parentTn === $.PLAINTEXT || parentTn === $.NOSCRIPT)
+
+ this.html += content;
+
+ else
+ this.html += Serializer.escapeString(content, false);
+};
+
+Serializer.prototype._serializeCommentNode = function (node) {
+ this.html += '';
+};
+
+Serializer.prototype._serializeDocumentTypeNode = function (node) {
+ var name = this.treeAdapter.getDocumentTypeNodeName(node),
+ publicId = this.treeAdapter.getDocumentTypeNodePublicId(node),
+ systemId = this.treeAdapter.getDocumentTypeNodeSystemId(node);
+
+ this.html += '<' + doctype.serializeContent(name, publicId, systemId) + '>';
+};
- p._insertElement(token, NS.HTML);
+},{"../common/doctype":80,"../common/html":82,"../common/merge_options":83,"../tree_adapters/default":100}],96:[function(require,module,exports){
+'use strict';
+
+var ReadableStream = require('stream').Readable,
+ inherits = require('util').inherits,
+ Serializer = require('./index');
+
+/**
+ * Streaming AST node to an HTML serializer.
+ * A [readable stream]{@link https://nodejs.org/api/stream.html#stream_class_stream_readable}.
+ * @class SerializerStream
+ * @memberof parse5
+ * @instance
+ * @extends stream.Readable
+ * @param {ASTNode} node - Node to serialize.
+ * @param {SerializerOptions} [options] - Serialization options.
+ * @example
+ * var parse5 = require('parse5');
+ * var fs = require('fs');
+ *
+ * var file = fs.createWriteStream('/home/index.html');
+ *
+ * // Serializes the parsed document to HTML and writes it to the file.
+ * var document = parse5.parse('Who is John Galt?');
+ * var serializer = new parse5.SerializerStream(document);
+ *
+ * serializer.pipe(file);
+ */
+var SerializerStream = module.exports = function (node, options) {
+ ReadableStream.call(this);
+
+ this.serializer = new Serializer(node, options);
+
+ Object.defineProperty(this.serializer, 'html', {
+ //NOTE: To make `+=` concat operator work properly we define
+ //getter which always returns empty string
+ get: function () {
+ return '';
+ },
+ set: this.push.bind(this)
+ });
+};
+
+inherits(SerializerStream, ReadableStream);
+
+//Readable stream implementation
+SerializerStream.prototype._read = function () {
+ this.serializer.serialize();
+ this.push(null);
+};
- if (!inTemplate)
- p.formElement = p.openElements.current;
- }
-}
-
-function listItemStartTagInBody(p, token) {
- p.framesetOk = false;
-
- for (var i = p.openElements.stackTop; i >= 0; i--) {
- var element = p.openElements.items[i],
- tn = p.treeAdapter.getTagName(element);
-
- if ((token.tagName === $.LI && tn === $.LI) ||
- ((token.tagName === $.DD || token.tagName === $.DT) && (tn === $.DD || tn == $.DT))) {
- p._processFakeEndTag(tn);
- break;
- }
-
- if (tn !== $.ADDRESS && tn !== $.DIV && tn !== $.P && p._isSpecialElement(element))
- break;
- }
-
- if (p.openElements.hasInButtonScope($.P))
- p._closePElement();
-
- p._insertElement(token, NS.HTML);
-}
-
-function plaintextStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P))
- p._closePElement();
-
- p._insertElement(token, NS.HTML);
- p.tokenizer.state = Tokenizer.MODE.PLAINTEXT;
-}
-
-function buttonStartTagInBody(p, token) {
- if (p.openElements.hasInScope($.BUTTON)) {
- p._processFakeEndTag($.BUTTON);
- buttonStartTagInBody(p, token);
- }
-
- else {
- p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
- p.framesetOk = false;
- }
-}
-
-function aStartTagInBody(p, token) {
- var activeElementEntry = p.activeFormattingElements.getElementEntryInScopeWithTagName($.A);
-
- if (activeElementEntry) {
- p._processFakeEndTag($.A);
- p.openElements.remove(activeElementEntry.element);
- p.activeFormattingElements.removeEntry(activeElementEntry);
- }
-
- p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
- p.activeFormattingElements.pushElement(p.openElements.current, token);
-}
-
-function bStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
- p.activeFormattingElements.pushElement(p.openElements.current, token);
-}
-
-function nobrStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
-
- if (p.openElements.hasInScope($.NOBR)) {
- p._processFakeEndTag($.NOBR);
- p._reconstructActiveFormattingElements();
- }
-
- p._insertElement(token, NS.HTML);
- p.activeFormattingElements.pushElement(p.openElements.current, token);
-}
-
-function appletStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
- p.activeFormattingElements.insertMarker();
- p.framesetOk = false;
-}
-
-function tableStartTagInBody(p, token) {
- if (!p.treeAdapter.isQuirksMode(p.document) && p.openElements.hasInButtonScope($.P))
- p._closePElement();
-
- p._insertElement(token, NS.HTML);
- p.framesetOk = false;
- p.insertionMode = IN_TABLE_MODE;
-}
-
-function areaStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
- p._appendElement(token, NS.HTML);
- p.framesetOk = false;
-}
-
-function inputStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
- p._appendElement(token, NS.HTML);
-
- var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
-
- if (!inputType || inputType.toLowerCase() !== HIDDEN_INPUT_TYPE)
- p.framesetOk = false;
-
-}
-
-function paramStartTagInBody(p, token) {
- p._appendElement(token, NS.HTML);
-}
-
-function hrStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P))
- p._closePElement();
-
- p._appendElement(token, NS.HTML);
- p.framesetOk = false;
-}
-
-function imageStartTagInBody(p, token) {
- token.tagName = $.IMG;
- areaStartTagInBody(p, token);
-}
-
-function isindexStartTagInBody(p, token) {
- if (!p.formElement || p.openElements.tmplCount > 0) {
- p._processFakeStartTagWithAttrs($.FORM, getSearchableIndexFormAttrs(token));
- p._processFakeStartTag($.HR);
- p._processFakeStartTag($.LABEL);
- p.treeAdapter.insertText(p.openElements.current, getSearchableIndexLabelText(token));
- p._processFakeStartTagWithAttrs($.INPUT, getSearchableIndexInputAttrs(token));
- p._processFakeEndTag($.LABEL);
- p._processFakeStartTag($.HR);
- p._processFakeEndTag($.FORM);
- }
-}
-
-function textareaStartTagInBody(p, token) {
- p._insertElement(token, NS.HTML);
- //NOTE: If the next token is a U+000A LINE FEED (LF) character token, then ignore that token and move
- //on to the next one. (Newlines at the start of textarea elements are ignored as an authoring convenience.)
- p.skipNextNewLine = true;
- p.tokenizer.state = Tokenizer.MODE.RCDATA;
- p.originalInsertionMode = p.insertionMode;
- p.framesetOk = false;
- p.insertionMode = TEXT_MODE;
-}
-
-function xmpStartTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P))
- p._closePElement();
-
- p._reconstructActiveFormattingElements();
- p.framesetOk = false;
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
-}
-
-function iframeStartTagInBody(p, token) {
- p.framesetOk = false;
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
-}
-
-//NOTE: here we assume that we always act as an user agent with enabled plugins, so we parse
-// as a rawtext.
-function noembedStartTagInBody(p, token) {
- p._switchToTextParsing(token, Tokenizer.MODE.RAWTEXT);
-}
-
-function selectStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
- p.framesetOk = false;
-
- if (p.insertionMode === IN_TABLE_MODE || p.insertionMode === IN_CAPTION_MODE ||
- p.insertionMode === IN_TABLE_BODY_MODE || p.insertionMode === IN_ROW_MODE ||
- p.insertionMode === IN_CELL_MODE) {
- p.insertionMode = IN_SELECT_IN_TABLE_MODE;
- }
-
- else
- p.insertionMode = IN_SELECT_MODE;
-}
-
-function optgroupStartTagInBody(p, token) {
- if (p.openElements.currentTagName === $.OPTION)
- p._processFakeEndTag($.OPTION);
-
- p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
-}
-
-function rpStartTagInBody(p, token) {
- if (p.openElements.hasInScope($.RUBY))
- p.openElements.generateImpliedEndTags();
-
- p._insertElement(token, NS.HTML);
-}
-
-function menuitemStartTagInBody(p, token) {
- p._appendElement(token, NS.HTML);
-}
-
-function mathStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
-
- ForeignContent.adjustTokenMathMLAttrs(token);
- ForeignContent.adjustTokenXMLAttrs(token);
-
- if (token.selfClosing)
- p._appendElement(token, NS.MATHML);
- else
- p._insertElement(token, NS.MATHML);
-}
-
-function svgStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
-
- ForeignContent.adjustTokenSVGAttrs(token);
- ForeignContent.adjustTokenXMLAttrs(token);
-
- if (token.selfClosing)
- p._appendElement(token, NS.SVG);
- else
- p._insertElement(token, NS.SVG);
-}
-
-function genericStartTagInBody(p, token) {
- p._reconstructActiveFormattingElements();
- p._insertElement(token, NS.HTML);
-}
-
-//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
-//It's faster than using dictionary.
-function startTagInBody(p, token) {
- var tn = token.tagName;
-
- switch (tn.length) {
- case 1:
- if (tn === $.I || tn === $.S || tn === $.B || tn === $.U)
- bStartTagInBody(p, token);
-
- else if (tn === $.P)
- addressStartTagInBody(p, token);
-
- else if (tn === $.A)
- aStartTagInBody(p, token);
-
- else
- genericStartTagInBody(p, token);
-
- break;
-
- case 2:
- if (tn === $.DL || tn === $.OL || tn === $.UL)
- addressStartTagInBody(p, token);
-
- else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
- numberedHeaderStartTagInBody(p, token);
-
- else if (tn === $.LI || tn === $.DD || tn === $.DT)
- listItemStartTagInBody(p, token);
-
- else if (tn === $.EM || tn === $.TT)
- bStartTagInBody(p, token);
-
- else if (tn === $.BR)
- areaStartTagInBody(p, token);
-
- else if (tn === $.HR)
- hrStartTagInBody(p, token);
-
- else if (tn === $.RP || tn === $.RT)
- rpStartTagInBody(p, token);
-
- else if (tn !== $.TH && tn !== $.TD && tn !== $.TR)
- genericStartTagInBody(p, token);
-
- break;
-
- case 3:
- if (tn === $.DIV || tn === $.DIR || tn === $.NAV)
- addressStartTagInBody(p, token);
-
- else if (tn === $.PRE)
- preStartTagInBody(p, token);
-
- else if (tn === $.BIG)
- bStartTagInBody(p, token);
-
- else if (tn === $.IMG || tn === $.WBR)
- areaStartTagInBody(p, token);
-
- else if (tn === $.XMP)
- xmpStartTagInBody(p, token);
-
- else if (tn === $.SVG)
- svgStartTagInBody(p, token);
-
- else if (tn !== $.COL)
- genericStartTagInBody(p, token);
-
- break;
-
- case 4:
- if (tn === $.HTML)
- htmlStartTagInBody(p, token);
-
- else if (tn === $.BASE || tn === $.LINK || tn === $.META)
- startTagInHead(p, token);
-
- else if (tn === $.BODY)
- bodyStartTagInBody(p, token);
-
- else if (tn === $.MAIN || tn === $.MENU)
- addressStartTagInBody(p, token);
-
- else if (tn === $.FORM)
- formStartTagInBody(p, token);
-
- else if (tn === $.CODE || tn === $.FONT)
- bStartTagInBody(p, token);
-
- else if (tn === $.NOBR)
- nobrStartTagInBody(p, token);
-
- else if (tn === $.AREA)
- areaStartTagInBody(p, token);
-
- else if (tn === $.MATH)
- mathStartTagInBody(p, token);
-
- else if (tn !== $.HEAD)
- genericStartTagInBody(p, token);
-
- break;
-
- case 5:
- if (tn === $.STYLE || tn === $.TITLE)
- startTagInHead(p, token);
-
- else if (tn === $.ASIDE)
- addressStartTagInBody(p, token);
-
- else if (tn === $.SMALL)
- bStartTagInBody(p, token);
-
- else if (tn === $.TABLE)
- tableStartTagInBody(p, token);
-
- else if (tn === $.EMBED)
- areaStartTagInBody(p, token);
-
- else if (tn === $.INPUT)
- inputStartTagInBody(p, token);
-
- else if (tn === $.PARAM || tn === $.TRACK)
- paramStartTagInBody(p, token);
-
- else if (tn === $.IMAGE)
- imageStartTagInBody(p, token);
-
- else if (tn !== $.FRAME && tn !== $.TBODY && tn !== $.TFOOT && tn !== $.THEAD)
- genericStartTagInBody(p, token);
-
- break;
-
- case 6:
- if (tn === $.SCRIPT)
- startTagInHead(p, token);
-
- else if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
- addressStartTagInBody(p, token);
-
- else if (tn === $.BUTTON)
- buttonStartTagInBody(p, token);
-
- else if (tn === $.STRIKE || tn === $.STRONG)
- bStartTagInBody(p, token);
-
- else if (tn === $.APPLET || tn === $.OBJECT)
- appletStartTagInBody(p, token);
-
- else if (tn === $.KEYGEN)
- areaStartTagInBody(p, token);
-
- else if (tn === $.SOURCE)
- paramStartTagInBody(p, token);
-
- else if (tn === $.IFRAME)
- iframeStartTagInBody(p, token);
-
- else if (tn === $.SELECT)
- selectStartTagInBody(p, token);
-
- else if (tn === $.OPTION)
- optgroupStartTagInBody(p, token);
-
- else
- genericStartTagInBody(p, token);
-
- break;
-
- case 7:
- if (tn === $.BGSOUND || tn === $.COMMAND)
- startTagInHead(p, token);
-
- else if (tn === $.DETAILS || tn === $.ADDRESS || tn === $.ARTICLE || tn === $.SECTION || tn === $.SUMMARY)
- addressStartTagInBody(p, token);
-
- else if (tn === $.LISTING)
- preStartTagInBody(p, token);
-
- else if (tn === $.MARQUEE)
- appletStartTagInBody(p, token);
-
- else if (tn === $.ISINDEX)
- isindexStartTagInBody(p, token);
-
- else if (tn === $.NOEMBED)
- noembedStartTagInBody(p, token);
-
- else if (tn !== $.CAPTION)
- genericStartTagInBody(p, token);
-
- break;
-
- case 8:
- if (tn === $.BASEFONT || tn === $.MENUITEM)
- menuitemStartTagInBody(p, token);
-
- else if (tn === $.FRAMESET)
- framesetStartTagInBody(p, token);
-
- else if (tn === $.FIELDSET)
- addressStartTagInBody(p, token);
-
- else if (tn === $.TEXTAREA)
- textareaStartTagInBody(p, token);
-
- else if (tn === $.TEMPLATE)
- startTagInHead(p, token);
-
- else if (tn === $.NOSCRIPT)
- noembedStartTagInBody(p, token);
-
- else if (tn === $.OPTGROUP)
- optgroupStartTagInBody(p, token);
-
- else if (tn !== $.COLGROUP)
- genericStartTagInBody(p, token);
-
- break;
-
- case 9:
- if (tn === $.PLAINTEXT)
- plaintextStartTagInBody(p, token);
-
- else
- genericStartTagInBody(p, token);
-
- break;
-
- case 10:
- if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
- addressStartTagInBody(p, token);
-
- else
- genericStartTagInBody(p, token);
-
- break;
-
- default:
- genericStartTagInBody(p, token);
- }
-}
-
-function bodyEndTagInBody(p, token) {
- if (p.openElements.hasInScope($.BODY))
- p.insertionMode = AFTER_BODY_MODE;
-
- else
- token.ignored = true;
-}
-
-function htmlEndTagInBody(p, token) {
- var fakeToken = p._processFakeEndTag($.BODY);
-
- if (!fakeToken.ignored)
- p._processToken(token);
-}
-
-function addressEndTagInBody(p, token) {
- var tn = token.tagName;
-
- if (p.openElements.hasInScope(tn)) {
- p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTagNamePopped(tn);
- }
-}
-
-function formEndTagInBody(p, token) {
- var inTemplate = p.openElements.tmplCount > 0,
- formElement = p.formElement;
-
- if (!inTemplate)
- p.formElement = null;
-
- if ((formElement || inTemplate) && p.openElements.hasInScope($.FORM)) {
- p.openElements.generateImpliedEndTags();
-
- if (inTemplate)
- p.openElements.popUntilTagNamePopped($.FORM);
-
- else
- p.openElements.remove(formElement);
- }
-}
-
-function pEndTagInBody(p, token) {
- if (p.openElements.hasInButtonScope($.P)) {
- p.openElements.generateImpliedEndTagsWithExclusion($.P);
- p.openElements.popUntilTagNamePopped($.P);
- }
-
- else {
- p._processFakeStartTag($.P);
- p._processToken(token);
- }
-}
-
-function liEndTagInBody(p, token) {
- if (p.openElements.hasInListItemScope($.LI)) {
- p.openElements.generateImpliedEndTagsWithExclusion($.LI);
- p.openElements.popUntilTagNamePopped($.LI);
- }
-}
-
-function ddEndTagInBody(p, token) {
- var tn = token.tagName;
-
- if (p.openElements.hasInScope(tn)) {
- p.openElements.generateImpliedEndTagsWithExclusion(tn);
- p.openElements.popUntilTagNamePopped(tn);
- }
-}
-
-function numberedHeaderEndTagInBody(p, token) {
- if (p.openElements.hasNumberedHeaderInScope()) {
- p.openElements.generateImpliedEndTags();
- p.openElements.popUntilNumberedHeaderPopped();
- }
-}
-
-function appletEndTagInBody(p, token) {
- var tn = token.tagName;
-
- if (p.openElements.hasInScope(tn)) {
- p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTagNamePopped(tn);
- p.activeFormattingElements.clearToLastMarker();
- }
-}
-
-function brEndTagInBody(p, token) {
- p._processFakeStartTag($.BR);
-}
-
-function genericEndTagInBody(p, token) {
- var tn = token.tagName;
-
- for (var i = p.openElements.stackTop; i > 0; i--) {
- var element = p.openElements.items[i];
-
- if (p.treeAdapter.getTagName(element) === tn) {
- p.openElements.generateImpliedEndTagsWithExclusion(tn);
- p.openElements.popUntilElementPopped(element);
- break;
- }
-
- if (p._isSpecialElement(element))
- break;
- }
-}
-
-//OPTIMIZATION: Integer comparisons are low-cost, so we can use very fast tag name length filters here.
-//It's faster than using dictionary.
-function endTagInBody(p, token) {
- var tn = token.tagName;
-
- switch (tn.length) {
- case 1:
- if (tn === $.A || tn === $.B || tn === $.I || tn === $.S || tn == $.U)
- callAdoptionAgency(p, token);
-
- else if (tn === $.P)
- pEndTagInBody(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- case 2:
- if (tn == $.DL || tn === $.UL || tn === $.OL)
- addressEndTagInBody(p, token);
-
- else if (tn === $.LI)
- liEndTagInBody(p, token);
-
- else if (tn === $.DD || tn === $.DT)
- ddEndTagInBody(p, token);
-
- else if (tn === $.H1 || tn === $.H2 || tn === $.H3 || tn === $.H4 || tn === $.H5 || tn === $.H6)
- numberedHeaderEndTagInBody(p, token);
-
- else if (tn === $.BR)
- brEndTagInBody(p, token);
-
- else if (tn === $.EM || tn === $.TT)
- callAdoptionAgency(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- case 3:
- if (tn === $.BIG)
- callAdoptionAgency(p, token);
-
- else if (tn === $.DIR || tn === $.DIV || tn === $.NAV)
- addressEndTagInBody(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- case 4:
- if (tn === $.BODY)
- bodyEndTagInBody(p, token);
-
- else if (tn === $.HTML)
- htmlEndTagInBody(p, token);
-
- else if (tn === $.FORM)
- formEndTagInBody(p, token);
-
- else if (tn === $.CODE || tn === $.FONT || tn === $.NOBR)
- callAdoptionAgency(p, token);
-
- else if (tn === $.MAIN || tn === $.MENU)
- addressEndTagInBody(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- case 5:
- if (tn === $.ASIDE)
- addressEndTagInBody(p, token);
-
- else if (tn === $.SMALL)
- callAdoptionAgency(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- case 6:
- if (tn === $.CENTER || tn === $.FIGURE || tn === $.FOOTER || tn === $.HEADER || tn === $.HGROUP)
- addressEndTagInBody(p, token);
-
- else if (tn === $.APPLET || tn === $.OBJECT)
- appletEndTagInBody(p, token);
-
- else if (tn == $.STRIKE || tn === $.STRONG)
- callAdoptionAgency(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- case 7:
- if (tn === $.ADDRESS || tn === $.ARTICLE || tn === $.DETAILS || tn === $.SECTION || tn === $.SUMMARY)
- addressEndTagInBody(p, token);
-
- else if (tn === $.MARQUEE)
- appletEndTagInBody(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- case 8:
- if (tn === $.FIELDSET)
- addressEndTagInBody(p, token);
-
- else if (tn === $.TEMPLATE)
- endTagInHead(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- case 10:
- if (tn === $.BLOCKQUOTE || tn === $.FIGCAPTION)
- addressEndTagInBody(p, token);
-
- else
- genericEndTagInBody(p, token);
-
- break;
-
- default :
- genericEndTagInBody(p, token);
- }
-}
-
-function eofInBody(p, token) {
- if (p.tmplInsertionModeStackTop > -1)
- eofInTemplate(p, token);
-
- else
- p.stopped = true;
-}
-
-//12.2.5.4.8 The "text" insertion mode
-//------------------------------------------------------------------
-function endTagInText(p, token) {
- if (!p.fragmentContext && p.scriptHandler && token.tagName === $.SCRIPT)
- p.scriptHandler(p.document, p.openElements.current);
-
- p.openElements.pop();
- p.insertionMode = p.originalInsertionMode;
-}
-
-
-function eofInText(p, token) {
- p.openElements.pop();
- p.insertionMode = p.originalInsertionMode;
- p._processToken(token);
-}
-
-
-//12.2.5.4.9 The "in table" insertion mode
-//------------------------------------------------------------------
-function characterInTable(p, token) {
- var curTn = p.openElements.currentTagName;
-
- if (curTn === $.TABLE || curTn === $.TBODY || curTn === $.TFOOT || curTn === $.THEAD || curTn === $.TR) {
- p.pendingCharacterTokens = [];
- p.hasNonWhitespacePendingCharacterToken = false;
- p.originalInsertionMode = p.insertionMode;
- p.insertionMode = IN_TABLE_TEXT_MODE;
- p._processToken(token);
- }
-
- else
- tokenInTable(p, token);
-}
-
-function captionStartTagInTable(p, token) {
- p.openElements.clearBackToTableContext();
- p.activeFormattingElements.insertMarker();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_CAPTION_MODE;
-}
-
-function colgroupStartTagInTable(p, token) {
- p.openElements.clearBackToTableContext();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_COLUMN_GROUP_MODE;
-}
-
-function colStartTagInTable(p, token) {
- p._processFakeStartTag($.COLGROUP);
- p._processToken(token);
-}
-
-function tbodyStartTagInTable(p, token) {
- p.openElements.clearBackToTableContext();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_TABLE_BODY_MODE;
-}
-
-function tdStartTagInTable(p, token) {
- p._processFakeStartTag($.TBODY);
- p._processToken(token);
-}
-
-function tableStartTagInTable(p, token) {
- var fakeToken = p._processFakeEndTag($.TABLE);
-
- //NOTE: The fake end tag token here can only be ignored in the fragment case.
- if (!fakeToken.ignored)
- p._processToken(token);
-}
-
-function inputStartTagInTable(p, token) {
- var inputType = Tokenizer.getTokenAttr(token, ATTRS.TYPE);
-
- if (inputType && inputType.toLowerCase() === HIDDEN_INPUT_TYPE)
- p._appendElement(token, NS.HTML);
-
- else
- tokenInTable(p, token);
-}
-
-function formStartTagInTable(p, token) {
- if (!p.formElement && p.openElements.tmplCount === 0) {
- p._insertElement(token, NS.HTML);
- p.formElement = p.openElements.current;
- p.openElements.pop();
- }
-}
-
-function startTagInTable(p, token) {
- var tn = token.tagName;
-
- switch (tn.length) {
- case 2:
- if (tn === $.TD || tn === $.TH || tn === $.TR)
- tdStartTagInTable(p, token);
-
- else
- tokenInTable(p, token);
-
- break;
-
- case 3:
- if (tn === $.COL)
- colStartTagInTable(p, token);
-
- else
- tokenInTable(p, token);
-
- break;
-
- case 4:
- if (tn === $.FORM)
- formStartTagInTable(p, token);
-
- else
- tokenInTable(p, token);
-
- break;
-
- case 5:
- if (tn === $.TABLE)
- tableStartTagInTable(p, token);
-
- else if (tn === $.STYLE)
- startTagInHead(p, token);
-
- else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD)
- tbodyStartTagInTable(p, token);
-
- else if (tn === $.INPUT)
- inputStartTagInTable(p, token);
-
- else
- tokenInTable(p, token);
-
- break;
-
- case 6:
- if (tn === $.SCRIPT)
- startTagInHead(p, token);
-
- else
- tokenInTable(p, token);
-
- break;
-
- case 7:
- if (tn === $.CAPTION)
- captionStartTagInTable(p, token);
-
- else
- tokenInTable(p, token);
-
- break;
-
- case 8:
- if (tn === $.COLGROUP)
- colgroupStartTagInTable(p, token);
-
- else if (tn === $.TEMPLATE)
- startTagInHead(p, token);
-
- else
- tokenInTable(p, token);
-
- break;
-
- default:
- tokenInTable(p, token);
- }
-
-}
-
-function endTagInTable(p, token) {
- var tn = token.tagName;
-
- if (tn === $.TABLE) {
- if (p.openElements.hasInTableScope($.TABLE)) {
- p.openElements.popUntilTagNamePopped($.TABLE);
- p._resetInsertionMode();
- }
-
- else
- token.ignored = true;
- }
-
- else if (tn === $.TEMPLATE)
- endTagInHead(p, token);
-
- else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML &&
- tn !== $.TBODY && tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR) {
- tokenInTable(p, token);
- }
-}
-
-function tokenInTable(p, token) {
- var savedFosterParentingState = p.fosterParentingEnabled;
-
- p.fosterParentingEnabled = true;
- p._processTokenInBodyMode(token);
- p.fosterParentingEnabled = savedFosterParentingState;
-}
-
-
-//12.2.5.4.10 The "in table text" insertion mode
-//------------------------------------------------------------------
-function whitespaceCharacterInTableText(p, token) {
- p.pendingCharacterTokens.push(token);
-}
-
-function characterInTableText(p, token) {
- p.pendingCharacterTokens.push(token);
- p.hasNonWhitespacePendingCharacterToken = true;
-}
-
-function tokenInTableText(p, token) {
- if (p.hasNonWhitespacePendingCharacterToken) {
- for (var i = 0; i < p.pendingCharacterTokens.length; i++)
- tokenInTable(p, p.pendingCharacterTokens[i]);
- }
-
- else {
- for (var i = 0; i < p.pendingCharacterTokens.length; i++)
- p._insertCharacters(p.pendingCharacterTokens[i]);
- }
-
- p.insertionMode = p.originalInsertionMode;
- p._processToken(token);
-}
-
-
-//12.2.5.4.11 The "in caption" insertion mode
-//------------------------------------------------------------------
-function startTagInCaption(p, token) {
- var tn = token.tagName;
-
- if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
- tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
- var fakeToken = p._processFakeEndTag($.CAPTION);
-
- //NOTE: The fake end tag token here can only be ignored in the fragment case.
- if (!fakeToken.ignored)
- p._processToken(token);
- }
-
- else
- startTagInBody(p, token);
-}
-
-function endTagInCaption(p, token) {
- var tn = token.tagName;
-
- if (tn === $.CAPTION) {
- if (p.openElements.hasInTableScope($.CAPTION)) {
- p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTagNamePopped($.CAPTION);
- p.activeFormattingElements.clearToLastMarker();
- p.insertionMode = IN_TABLE_MODE;
- }
-
- else
- token.ignored = true;
- }
-
- else if (tn === $.TABLE) {
- var fakeToken = p._processFakeEndTag($.CAPTION);
-
- //NOTE: The fake end tag token here can only be ignored in the fragment case.
- if (!fakeToken.ignored)
- p._processToken(token);
- }
-
- else if (tn !== $.BODY && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML && tn !== $.TBODY &&
- tn !== $.TD && tn !== $.TFOOT && tn !== $.TH && tn !== $.THEAD && tn !== $.TR) {
- endTagInBody(p, token);
- }
-}
-
-
-//12.2.5.4.12 The "in column group" insertion mode
-//------------------------------------------------------------------
-function startTagInColumnGroup(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML)
- startTagInBody(p, token);
-
- else if (tn === $.COL)
- p._appendElement(token, NS.HTML);
-
- else if (tn === $.TEMPLATE)
- startTagInHead(p, token);
-
- else
- tokenInColumnGroup(p, token);
-}
-
-function endTagInColumnGroup(p, token) {
- var tn = token.tagName;
-
- if (tn === $.COLGROUP) {
- if (p.openElements.currentTagName !== $.COLGROUP)
- token.ignored = true;
-
- else {
- p.openElements.pop();
- p.insertionMode = IN_TABLE_MODE;
- }
- }
-
- else if (tn === $.TEMPLATE)
- endTagInHead(p, token);
-
- else if (tn !== $.COL)
- tokenInColumnGroup(p, token);
-}
-
-function tokenInColumnGroup(p, token) {
- var fakeToken = p._processFakeEndTag($.COLGROUP);
-
- //NOTE: The fake end tag token here can only be ignored in the fragment case.
- if (!fakeToken.ignored)
- p._processToken(token);
-}
-
-//12.2.5.4.13 The "in table body" insertion mode
-//------------------------------------------------------------------
-function startTagInTableBody(p, token) {
- var tn = token.tagName;
-
- if (tn === $.TR) {
- p.openElements.clearBackToTableBodyContext();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_ROW_MODE;
- }
-
- else if (tn === $.TH || tn === $.TD) {
- p._processFakeStartTag($.TR);
- p._processToken(token);
- }
-
- else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP ||
- tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
-
- if (p.openElements.hasTableBodyContextInTableScope()) {
- p.openElements.clearBackToTableBodyContext();
- p._processFakeEndTag(p.openElements.currentTagName);
- p._processToken(token);
- }
- }
-
- else
- startTagInTable(p, token);
-}
-
-function endTagInTableBody(p, token) {
- var tn = token.tagName;
-
- if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
- if (p.openElements.hasInTableScope(tn)) {
- p.openElements.clearBackToTableBodyContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_MODE;
- }
- }
-
- else if (tn === $.TABLE) {
- if (p.openElements.hasTableBodyContextInTableScope()) {
- p.openElements.clearBackToTableBodyContext();
- p._processFakeEndTag(p.openElements.currentTagName);
- p._processToken(token);
- }
- }
-
- else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
- tn !== $.HTML && tn !== $.TD && tn !== $.TH && tn !== $.TR) {
- endTagInTable(p, token);
- }
-}
-
-//12.2.5.4.14 The "in row" insertion mode
-//------------------------------------------------------------------
-function startTagInRow(p, token) {
- var tn = token.tagName;
-
- if (tn === $.TH || tn === $.TD) {
- p.openElements.clearBackToTableRowContext();
- p._insertElement(token, NS.HTML);
- p.insertionMode = IN_CELL_MODE;
- p.activeFormattingElements.insertMarker();
- }
-
- else if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
- tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
- var fakeToken = p._processFakeEndTag($.TR);
-
- //NOTE: The fake end tag token here can only be ignored in the fragment case.
- if (!fakeToken.ignored)
- p._processToken(token);
- }
-
- else
- startTagInTable(p, token);
-}
-
-function endTagInRow(p, token) {
- var tn = token.tagName;
-
- if (tn === $.TR) {
- if (p.openElements.hasInTableScope($.TR)) {
- p.openElements.clearBackToTableRowContext();
- p.openElements.pop();
- p.insertionMode = IN_TABLE_BODY_MODE;
- }
-
- else
- token.ignored = true;
- }
-
- else if (tn === $.TABLE) {
- var fakeToken = p._processFakeEndTag($.TR);
-
- //NOTE: The fake end tag token here can only be ignored in the fragment case.
- if (!fakeToken.ignored)
- p._processToken(token);
- }
-
- else if (tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD) {
- if (p.openElements.hasInTableScope(tn)) {
- p._processFakeEndTag($.TR);
- p._processToken(token);
- }
- }
-
- else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP ||
- tn !== $.HTML && tn !== $.TD && tn !== $.TH) {
- endTagInTable(p, token);
- }
-}
-
-
-//12.2.5.4.15 The "in cell" insertion mode
-//------------------------------------------------------------------
-function startTagInCell(p, token) {
- var tn = token.tagName;
-
- if (tn === $.CAPTION || tn === $.COL || tn === $.COLGROUP || tn === $.TBODY ||
- tn === $.TD || tn === $.TFOOT || tn === $.TH || tn === $.THEAD || tn === $.TR) {
-
- if (p.openElements.hasInTableScope($.TD) || p.openElements.hasInTableScope($.TH)) {
- p._closeTableCell();
- p._processToken(token);
- }
- }
-
- else
- startTagInBody(p, token);
-}
-
-function endTagInCell(p, token) {
- var tn = token.tagName;
-
- if (tn === $.TD || tn === $.TH) {
- if (p.openElements.hasInTableScope(tn)) {
- p.openElements.generateImpliedEndTags();
- p.openElements.popUntilTagNamePopped(tn);
- p.activeFormattingElements.clearToLastMarker();
- p.insertionMode = IN_ROW_MODE;
- }
- }
-
- else if (tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT || tn === $.THEAD || tn === $.TR) {
- if (p.openElements.hasInTableScope(tn)) {
- p._closeTableCell();
- p._processToken(token);
- }
- }
-
- else if (tn !== $.BODY && tn !== $.CAPTION && tn !== $.COL && tn !== $.COLGROUP && tn !== $.HTML)
- endTagInBody(p, token);
-}
-
-//12.2.5.4.16 The "in select" insertion mode
-//------------------------------------------------------------------
-function startTagInSelect(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML)
- startTagInBody(p, token);
-
- else if (tn === $.OPTION) {
- if (p.openElements.currentTagName === $.OPTION)
- p._processFakeEndTag($.OPTION);
-
- p._insertElement(token, NS.HTML);
- }
-
- else if (tn === $.OPTGROUP) {
- if (p.openElements.currentTagName === $.OPTION)
- p._processFakeEndTag($.OPTION);
-
- if (p.openElements.currentTagName === $.OPTGROUP)
- p._processFakeEndTag($.OPTGROUP);
-
- p._insertElement(token, NS.HTML);
- }
-
- else if (tn === $.SELECT)
- p._processFakeEndTag($.SELECT);
-
- else if (tn === $.INPUT || tn === $.KEYGEN || tn === $.TEXTAREA) {
- if (p.openElements.hasInSelectScope($.SELECT)) {
- p._processFakeEndTag($.SELECT);
- p._processToken(token);
- }
- }
-
- else if (tn === $.SCRIPT || tn === $.TEMPLATE)
- startTagInHead(p, token);
-}
-
-function endTagInSelect(p, token) {
- var tn = token.tagName;
-
- if (tn === $.OPTGROUP) {
- var prevOpenElement = p.openElements.items[p.openElements.stackTop - 1],
- prevOpenElementTn = prevOpenElement && p.treeAdapter.getTagName(prevOpenElement);
-
- if (p.openElements.currentTagName === $.OPTION && prevOpenElementTn === $.OPTGROUP)
- p._processFakeEndTag($.OPTION);
-
- if (p.openElements.currentTagName === $.OPTGROUP)
- p.openElements.pop();
- }
-
- else if (tn === $.OPTION) {
- if (p.openElements.currentTagName === $.OPTION)
- p.openElements.pop();
- }
-
- else if (tn === $.SELECT && p.openElements.hasInSelectScope($.SELECT)) {
- p.openElements.popUntilTagNamePopped($.SELECT);
- p._resetInsertionMode();
- }
-
- else if (tn === $.TEMPLATE)
- endTagInHead(p, token);
-}
-
-//12.2.5.4.17 The "in select in table" insertion mode
-//------------------------------------------------------------------
-function startTagInSelectInTable(p, token) {
- var tn = token.tagName;
-
- if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
- tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
- p._processFakeEndTag($.SELECT);
- p._processToken(token);
- }
-
- else
- startTagInSelect(p, token);
-}
-
-function endTagInSelectInTable(p, token) {
- var tn = token.tagName;
-
- if (tn === $.CAPTION || tn === $.TABLE || tn === $.TBODY || tn === $.TFOOT ||
- tn === $.THEAD || tn === $.TR || tn === $.TD || tn === $.TH) {
- if (p.openElements.hasInTableScope(tn)) {
- p._processFakeEndTag($.SELECT);
- p._processToken(token);
- }
- }
+},{"./index":95,"stream":76,"util":79}],97:[function(require,module,exports){
+'use strict';
+
+var Preprocessor = require('./preprocessor'),
+ locationInfoMixin = require('../location_info/tokenizer_mixin'),
+ UNICODE = require('../common/unicode'),
+ NAMED_ENTITY_TRIE = require('./named_entity_trie');
+
+//Aliases
+var $ = UNICODE.CODE_POINTS,
+ $$ = UNICODE.CODE_POINT_SEQUENCES;
+
+//Replacement code points for numeric entities
+var NUMERIC_ENTITY_REPLACEMENTS = {
+ 0x00: 0xFFFD, 0x0D: 0x000D, 0x80: 0x20AC, 0x81: 0x0081, 0x82: 0x201A, 0x83: 0x0192, 0x84: 0x201E,
+ 0x85: 0x2026, 0x86: 0x2020, 0x87: 0x2021, 0x88: 0x02C6, 0x89: 0x2030, 0x8A: 0x0160, 0x8B: 0x2039,
+ 0x8C: 0x0152, 0x8D: 0x008D, 0x8E: 0x017D, 0x8F: 0x008F, 0x90: 0x0090, 0x91: 0x2018, 0x92: 0x2019,
+ 0x93: 0x201C, 0x94: 0x201D, 0x95: 0x2022, 0x96: 0x2013, 0x97: 0x2014, 0x98: 0x02DC, 0x99: 0x2122,
+ 0x9A: 0x0161, 0x9B: 0x203A, 0x9C: 0x0153, 0x9D: 0x009D, 0x9E: 0x017E, 0x9F: 0x0178
+};
+
+//States
+var DATA_STATE = 'DATA_STATE',
+ CHARACTER_REFERENCE_IN_DATA_STATE = 'CHARACTER_REFERENCE_IN_DATA_STATE',
+ RCDATA_STATE = 'RCDATA_STATE',
+ CHARACTER_REFERENCE_IN_RCDATA_STATE = 'CHARACTER_REFERENCE_IN_RCDATA_STATE',
+ RAWTEXT_STATE = 'RAWTEXT_STATE',
+ SCRIPT_DATA_STATE = 'SCRIPT_DATA_STATE',
+ PLAINTEXT_STATE = 'PLAINTEXT_STATE',
+ TAG_OPEN_STATE = 'TAG_OPEN_STATE',
+ END_TAG_OPEN_STATE = 'END_TAG_OPEN_STATE',
+ TAG_NAME_STATE = 'TAG_NAME_STATE',
+ RCDATA_LESS_THAN_SIGN_STATE = 'RCDATA_LESS_THAN_SIGN_STATE',
+ RCDATA_END_TAG_OPEN_STATE = 'RCDATA_END_TAG_OPEN_STATE',
+ RCDATA_END_TAG_NAME_STATE = 'RCDATA_END_TAG_NAME_STATE',
+ RAWTEXT_LESS_THAN_SIGN_STATE = 'RAWTEXT_LESS_THAN_SIGN_STATE',
+ RAWTEXT_END_TAG_OPEN_STATE = 'RAWTEXT_END_TAG_OPEN_STATE',
+ RAWTEXT_END_TAG_NAME_STATE = 'RAWTEXT_END_TAG_NAME_STATE',
+ SCRIPT_DATA_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_LESS_THAN_SIGN_STATE',
+ SCRIPT_DATA_END_TAG_OPEN_STATE = 'SCRIPT_DATA_END_TAG_OPEN_STATE',
+ SCRIPT_DATA_END_TAG_NAME_STATE = 'SCRIPT_DATA_END_TAG_NAME_STATE',
+ SCRIPT_DATA_ESCAPE_START_STATE = 'SCRIPT_DATA_ESCAPE_START_STATE',
+ SCRIPT_DATA_ESCAPE_START_DASH_STATE = 'SCRIPT_DATA_ESCAPE_START_DASH_STATE',
+ SCRIPT_DATA_ESCAPED_STATE = 'SCRIPT_DATA_ESCAPED_STATE',
+ SCRIPT_DATA_ESCAPED_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_STATE',
+ SCRIPT_DATA_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_ESCAPED_DASH_DASH_STATE',
+ SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE',
+ SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE',
+ SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE = 'SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE',
+ SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE',
+ SCRIPT_DATA_DOUBLE_ESCAPED_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_STATE',
+ SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE',
+ SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE',
+ SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE',
+ SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE = 'SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE',
+ BEFORE_ATTRIBUTE_NAME_STATE = 'BEFORE_ATTRIBUTE_NAME_STATE',
+ ATTRIBUTE_NAME_STATE = 'ATTRIBUTE_NAME_STATE',
+ AFTER_ATTRIBUTE_NAME_STATE = 'AFTER_ATTRIBUTE_NAME_STATE',
+ BEFORE_ATTRIBUTE_VALUE_STATE = 'BEFORE_ATTRIBUTE_VALUE_STATE',
+ ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE',
+ ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE = 'ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE',
+ ATTRIBUTE_VALUE_UNQUOTED_STATE = 'ATTRIBUTE_VALUE_UNQUOTED_STATE',
+ CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE = 'CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE',
+ AFTER_ATTRIBUTE_VALUE_QUOTED_STATE = 'AFTER_ATTRIBUTE_VALUE_QUOTED_STATE',
+ SELF_CLOSING_START_TAG_STATE = 'SELF_CLOSING_START_TAG_STATE',
+ BOGUS_COMMENT_STATE = 'BOGUS_COMMENT_STATE',
+ BOGUS_COMMENT_STATE_CONTINUATION = 'BOGUS_COMMENT_STATE_CONTINUATION',
+ MARKUP_DECLARATION_OPEN_STATE = 'MARKUP_DECLARATION_OPEN_STATE',
+ COMMENT_START_STATE = 'COMMENT_START_STATE',
+ COMMENT_START_DASH_STATE = 'COMMENT_START_DASH_STATE',
+ COMMENT_STATE = 'COMMENT_STATE',
+ COMMENT_END_DASH_STATE = 'COMMENT_END_DASH_STATE',
+ COMMENT_END_STATE = 'COMMENT_END_STATE',
+ COMMENT_END_BANG_STATE = 'COMMENT_END_BANG_STATE',
+ DOCTYPE_STATE = 'DOCTYPE_STATE',
+ DOCTYPE_NAME_STATE = 'DOCTYPE_NAME_STATE',
+ AFTER_DOCTYPE_NAME_STATE = 'AFTER_DOCTYPE_NAME_STATE',
+ BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE',
+ DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE',
+ DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE',
+ BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE = 'BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE',
+ BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
+ DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE',
+ DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE = 'DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE',
+ AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE = 'AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE',
+ BOGUS_DOCTYPE_STATE = 'BOGUS_DOCTYPE_STATE',
+ CDATA_SECTION_STATE = 'CDATA_SECTION_STATE';
+
+//Utils
+
+//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline
+//this functions if they will be situated in another module due to context switch.
+//Always perform inlining check before modifying this functions ('node --trace-inlining').
+function isWhitespace(cp) {
+ return cp === $.SPACE || cp === $.LINE_FEED || cp === $.TABULATION || cp === $.FORM_FEED;
+}
+
+function isAsciiDigit(cp) {
+ return cp >= $.DIGIT_0 && cp <= $.DIGIT_9;
+}
+
+function isAsciiUpper(cp) {
+ return cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_Z;
+}
+
+function isAsciiLower(cp) {
+ return cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_Z;
+}
+
+function isAsciiLetter(cp) {
+ return isAsciiLower(cp) || isAsciiUpper(cp);
+}
+
+function isAsciiAlphaNumeric(cp) {
+ return isAsciiLetter(cp) || isAsciiDigit(cp);
+}
+
+function isDigit(cp, isHex) {
+ return isAsciiDigit(cp) || isHex && (cp >= $.LATIN_CAPITAL_A && cp <= $.LATIN_CAPITAL_F ||
+ cp >= $.LATIN_SMALL_A && cp <= $.LATIN_SMALL_F);
+}
+
+function isReservedCodePoint(cp) {
+ return cp >= 0xD800 && cp <= 0xDFFF || cp > 0x10FFFF;
+}
+
+function toAsciiLowerCodePoint(cp) {
+ return cp + 0x0020;
+}
+
+//NOTE: String.fromCharCode() function can handle only characters from BMP subset.
+//So, we need to workaround this manually.
+//(see: https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/String/fromCharCode#Getting_it_to_work_with_higher_values)
+function toChar(cp) {
+ if (cp <= 0xFFFF)
+ return String.fromCharCode(cp);
+
+ cp -= 0x10000;
+ return String.fromCharCode(cp >>> 10 & 0x3FF | 0xD800) + String.fromCharCode(0xDC00 | cp & 0x3FF);
+}
+
+function toAsciiLowerChar(cp) {
+ return String.fromCharCode(toAsciiLowerCodePoint(cp));
+}
+
+//Tokenizer
+var Tokenizer = module.exports = function (options) {
+ this.preprocessor = new Preprocessor();
+
+ this.tokenQueue = [];
+
+ this.allowCDATA = false;
+
+ this.state = DATA_STATE;
+ this.returnState = '';
+
+ this.tempBuff = [];
+ this.additionalAllowedCp = void 0;
+ this.lastStartTagName = '';
+
+ this.consumedAfterSnapshot = -1;
+ this.active = false;
+
+ this.currentCharacterToken = null;
+ this.currentToken = null;
+ this.currentAttr = null;
+
+ if (options && options.locationInfo)
+ locationInfoMixin.assign(this);
+};
+
+//Token types
+Tokenizer.CHARACTER_TOKEN = 'CHARACTER_TOKEN';
+Tokenizer.NULL_CHARACTER_TOKEN = 'NULL_CHARACTER_TOKEN';
+Tokenizer.WHITESPACE_CHARACTER_TOKEN = 'WHITESPACE_CHARACTER_TOKEN';
+Tokenizer.START_TAG_TOKEN = 'START_TAG_TOKEN';
+Tokenizer.END_TAG_TOKEN = 'END_TAG_TOKEN';
+Tokenizer.COMMENT_TOKEN = 'COMMENT_TOKEN';
+Tokenizer.DOCTYPE_TOKEN = 'DOCTYPE_TOKEN';
+Tokenizer.EOF_TOKEN = 'EOF_TOKEN';
+Tokenizer.HIBERNATION_TOKEN = 'HIBERNATION_TOKEN';
+
+//Tokenizer initial states for different modes
+Tokenizer.MODE = Tokenizer.prototype.MODE = {
+ DATA: DATA_STATE,
+ RCDATA: RCDATA_STATE,
+ RAWTEXT: RAWTEXT_STATE,
+ SCRIPT_DATA: SCRIPT_DATA_STATE,
+ PLAINTEXT: PLAINTEXT_STATE
+};
+
+//Static
+Tokenizer.getTokenAttr = function (token, attrName) {
+ for (var i = token.attrs.length - 1; i >= 0; i--) {
+ if (token.attrs[i].name === attrName)
+ return token.attrs[i].value;
+ }
+
+ return null;
+};
+
+//API
+Tokenizer.prototype.getNextToken = function () {
+ while (!this.tokenQueue.length && this.active) {
+ this._hibernationSnapshot();
+
+ var cp = this._consume();
+
+ if (!this._ensureHibernation())
+ this[this.state](cp);
+ }
+
+ return this.tokenQueue.shift();
+};
+
+Tokenizer.prototype.write = function (chunk, isLastChunk) {
+ this.active = true;
+ this.preprocessor.write(chunk, isLastChunk);
+};
+
+Tokenizer.prototype.insertHtmlAtCurrentPos = function (chunk) {
+ this.active = true;
+ this.preprocessor.insertHtmlAtCurrentPos(chunk);
+};
+
+//Hibernation
+Tokenizer.prototype._hibernationSnapshot = function () {
+ this.consumedAfterSnapshot = 0;
+};
+
+Tokenizer.prototype._ensureHibernation = function () {
+ if (this.preprocessor.endOfChunkHit) {
+ for (; this.consumedAfterSnapshot > 0; this.consumedAfterSnapshot--)
+ this.preprocessor.retreat();
+
+ this.active = false;
+ this.tokenQueue.push({type: Tokenizer.HIBERNATION_TOKEN});
+
+ return true;
+ }
+
+ return false;
+};
+
+
+//Consumption
+Tokenizer.prototype._consume = function () {
+ this.consumedAfterSnapshot++;
+ return this.preprocessor.advance();
+};
+
+Tokenizer.prototype._unconsume = function () {
+ this.consumedAfterSnapshot--;
+ this.preprocessor.retreat();
+};
+
+Tokenizer.prototype._unconsumeSeveral = function (count) {
+ while (count--)
+ this._unconsume();
+};
+
+Tokenizer.prototype._reconsumeInState = function (state) {
+ this.state = state;
+ this._unconsume();
+};
+
+Tokenizer.prototype._consumeSubsequentIfMatch = function (pattern, startCp, caseSensitive) {
+ var consumedCount = 0,
+ isMatch = true,
+ patternLength = pattern.length,
+ patternPos = 0,
+ cp = startCp,
+ patternCp = void 0;
+
+ for (; patternPos < patternLength; patternPos++) {
+ if (patternPos > 0) {
+ cp = this._consume();
+ consumedCount++;
+ }
+
+ if (cp === $.EOF) {
+ isMatch = false;
+ break;
+ }
+
+ patternCp = pattern[patternPos];
+
+ if (cp !== patternCp && (caseSensitive || cp !== toAsciiLowerCodePoint(patternCp))) {
+ isMatch = false;
+ break;
+ }
+ }
+
+ if (!isMatch)
+ this._unconsumeSeveral(consumedCount);
+
+ return isMatch;
+};
+
+//Lookahead
+Tokenizer.prototype._lookahead = function () {
+ var cp = this._consume();
+
+ this._unconsume();
+
+ return cp;
+};
+
+//Temp buffer
+Tokenizer.prototype.isTempBufferEqualToScriptString = function () {
+ if (this.tempBuff.length !== $$.SCRIPT_STRING.length)
+ return false;
+
+ for (var i = 0; i < this.tempBuff.length; i++) {
+ if (this.tempBuff[i] !== $$.SCRIPT_STRING[i])
+ return false;
+ }
+
+ return true;
+};
+
+//Token creation
+Tokenizer.prototype._createStartTagToken = function () {
+ this.currentToken = {
+ type: Tokenizer.START_TAG_TOKEN,
+ tagName: '',
+ selfClosing: false,
+ attrs: []
+ };
+};
+
+Tokenizer.prototype._createEndTagToken = function () {
+ this.currentToken = {
+ type: Tokenizer.END_TAG_TOKEN,
+ tagName: '',
+ attrs: []
+ };
+};
+
+Tokenizer.prototype._createCommentToken = function () {
+ this.currentToken = {
+ type: Tokenizer.COMMENT_TOKEN,
+ data: ''
+ };
+};
+
+Tokenizer.prototype._createDoctypeToken = function (initialName) {
+ this.currentToken = {
+ type: Tokenizer.DOCTYPE_TOKEN,
+ name: initialName,
+ forceQuirks: false,
+ publicId: null,
+ systemId: null
+ };
+};
+
+Tokenizer.prototype._createCharacterToken = function (type, ch) {
+ this.currentCharacterToken = {
+ type: type,
+ chars: ch
+ };
+};
+
+//Tag attributes
+Tokenizer.prototype._createAttr = function (attrNameFirstCh) {
+ this.currentAttr = {
+ name: attrNameFirstCh,
+ value: ''
+ };
+};
+
+Tokenizer.prototype._isDuplicateAttr = function () {
+ return Tokenizer.getTokenAttr(this.currentToken, this.currentAttr.name) !== null;
+};
+
+Tokenizer.prototype._leaveAttrName = function (toState) {
+ this.state = toState;
+
+ if (!this._isDuplicateAttr())
+ this.currentToken.attrs.push(this.currentAttr);
+};
+
+Tokenizer.prototype._leaveAttrValue = function (toState) {
+ this.state = toState;
+};
+
+//Appropriate end tag token
+//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#appropriate-end-tag-token)
+Tokenizer.prototype._isAppropriateEndTagToken = function () {
+ return this.lastStartTagName === this.currentToken.tagName;
+};
+
+//Token emission
+Tokenizer.prototype._emitCurrentToken = function () {
+ this._emitCurrentCharacterToken();
+
+ //NOTE: store emited start tag's tagName to determine is the following end tag token is appropriate.
+ if (this.currentToken.type === Tokenizer.START_TAG_TOKEN)
+ this.lastStartTagName = this.currentToken.tagName;
+
+ this.tokenQueue.push(this.currentToken);
+ this.currentToken = null;
+};
+
+Tokenizer.prototype._emitCurrentCharacterToken = function () {
+ if (this.currentCharacterToken) {
+ this.tokenQueue.push(this.currentCharacterToken);
+ this.currentCharacterToken = null;
+ }
+};
+
+Tokenizer.prototype._emitEOFToken = function () {
+ this._emitCurrentCharacterToken();
+ this.tokenQueue.push({type: Tokenizer.EOF_TOKEN});
+};
+
+//Characters emission
+
+//OPTIMIZATION: specification uses only one type of character tokens (one token per character).
+//This causes a huge memory overhead and a lot of unnecessary parser loops. parse5 uses 3 groups of characters.
+//If we have a sequence of characters that belong to the same group, parser can process it
+//as a single solid character token.
+//So, there are 3 types of character tokens in parse5:
+//1)NULL_CHARACTER_TOKEN - \u0000-character sequences (e.g. '\u0000\u0000\u0000')
+//2)WHITESPACE_CHARACTER_TOKEN - any whitespace/new-line character sequences (e.g. '\n \r\t \f')
+//3)CHARACTER_TOKEN - any character sequence which don't belong to groups 1 and 2 (e.g. 'abcdef1234@@#$%^')
+Tokenizer.prototype._appendCharToCurrentCharacterToken = function (type, ch) {
+ if (this.currentCharacterToken && this.currentCharacterToken.type !== type)
+ this._emitCurrentCharacterToken();
+
+ if (this.currentCharacterToken)
+ this.currentCharacterToken.chars += ch;
+
+ else
+ this._createCharacterToken(type, ch);
+};
+
+Tokenizer.prototype._emitCodePoint = function (cp) {
+ var type = Tokenizer.CHARACTER_TOKEN;
+
+ if (isWhitespace(cp))
+ type = Tokenizer.WHITESPACE_CHARACTER_TOKEN;
+
+ else if (cp === $.NULL)
+ type = Tokenizer.NULL_CHARACTER_TOKEN;
+
+ this._appendCharToCurrentCharacterToken(type, toChar(cp));
+};
+
+Tokenizer.prototype._emitSeveralCodePoints = function (codePoints) {
+ for (var i = 0; i < codePoints.length; i++)
+ this._emitCodePoint(codePoints[i]);
+};
+
+//NOTE: used then we emit character explicitly. This is always a non-whitespace and a non-null character.
+//So we can avoid additional checks here.
+Tokenizer.prototype._emitChar = function (ch) {
+ this._appendCharToCurrentCharacterToken(Tokenizer.CHARACTER_TOKEN, ch);
+};
+
+//Character reference tokenization
+Tokenizer.prototype._consumeNumericEntity = function (isHex) {
+ var digits = '',
+ nextCp = void 0;
+
+ do {
+ digits += toChar(this._consume());
+ nextCp = this._lookahead();
+ } while (nextCp !== $.EOF && isDigit(nextCp, isHex));
+
+ if (this._lookahead() === $.SEMICOLON)
+ this._consume();
+
+ var referencedCp = parseInt(digits, isHex ? 16 : 10),
+ replacement = NUMERIC_ENTITY_REPLACEMENTS[referencedCp];
+
+ if (replacement)
+ return replacement;
+
+ if (isReservedCodePoint(referencedCp))
+ return $.REPLACEMENT_CHARACTER;
+
+ return referencedCp;
+};
+
+Tokenizer.prototype._consumeNamedEntity = function (startCp, inAttr) {
+ var referencedCodePoints = null,
+ entityCodePointsCount = 0,
+ cp = startCp,
+ leaf = NAMED_ENTITY_TRIE[cp],
+ consumedCount = 1,
+ semicolonTerminated = false;
+
+ for (; leaf && cp !== $.EOF; cp = this._consume(), consumedCount++, leaf = leaf.l && leaf.l[cp]) {
+ if (leaf.c) {
+ //NOTE: we have at least one named reference match. But we don't stop lookup at this point,
+ //because longer matches still can be found (e.g. '¬' and '∉') except the case
+ //then found match is terminated by semicolon.
+ referencedCodePoints = leaf.c;
+ entityCodePointsCount = consumedCount;
+
+ if (cp === $.SEMICOLON) {
+ semicolonTerminated = true;
+ break;
+ }
+ }
+ }
+
+ if (referencedCodePoints) {
+ if (!semicolonTerminated) {
+ //NOTE: unconsume excess (e.g. 'it' in '¬it')
+ this._unconsumeSeveral(consumedCount - entityCodePointsCount);
+
+ //NOTE: If the character reference is being consumed as part of an attribute and the next character
+ //is either a U+003D EQUALS SIGN character (=) or an alphanumeric ASCII character, then, for historical
+ //reasons, all the characters that were matched after the U+0026 AMPERSAND character (&) must be
+ //unconsumed, and nothing is returned.
+ //However, if this next character is in fact a U+003D EQUALS SIGN character (=), then this is a
+ //parse error, because some legacy user agents will misinterpret the markup in those cases.
+ //(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references)
+ if (inAttr) {
+ var nextCp = this._lookahead();
+
+ if (nextCp === $.EQUALS_SIGN || isAsciiAlphaNumeric(nextCp)) {
+ this._unconsumeSeveral(entityCodePointsCount);
+ return null;
+ }
+ }
+ }
+
+ return referencedCodePoints;
+ }
+
+ this._unconsumeSeveral(consumedCount);
+
+ return null;
+};
+
+Tokenizer.prototype._consumeCharacterReference = function (startCp, inAttr) {
+ if (isWhitespace(startCp) || startCp === $.GREATER_THAN_SIGN ||
+ startCp === $.AMPERSAND || startCp === this.additionalAllowedCp || startCp === $.EOF) {
+ //NOTE: not a character reference. No characters are consumed, and nothing is returned.
+ this._unconsume();
+ return null;
+ }
+
+ if (startCp === $.NUMBER_SIGN) {
+ //NOTE: we have a numeric entity candidate, now we should determine if it's hex or decimal
+ var isHex = false,
+ nextCp = this._lookahead();
+
+ if (nextCp === $.LATIN_SMALL_X || nextCp === $.LATIN_CAPITAL_X) {
+ this._consume();
+ isHex = true;
+ }
+
+ nextCp = this._lookahead();
+
+ //NOTE: if we have at least one digit this is a numeric entity for sure, so we consume it
+ if (nextCp !== $.EOF && isDigit(nextCp, isHex))
+ return [this._consumeNumericEntity(isHex)];
+
+ //NOTE: otherwise this is a bogus number entity and a parse error. Unconsume the number sign
+ //and the 'x'-character if appropriate.
+ this._unconsumeSeveral(isHex ? 2 : 1);
+ return null;
+ }
+
+ return this._consumeNamedEntity(startCp, inAttr);
+};
+
+//State machine
+var _ = Tokenizer.prototype;
+
+//12.2.4.1 Data state
+//------------------------------------------------------------------
+_[DATA_STATE] = function dataState(cp) {
+ if (cp === $.AMPERSAND)
+ this.state = CHARACTER_REFERENCE_IN_DATA_STATE;
+
+ else if (cp === $.LESS_THAN_SIGN)
+ this.state = TAG_OPEN_STATE;
+
+ else if (cp === $.NULL)
+ this._emitCodePoint(cp);
+
+ else if (cp === $.EOF)
+ this._emitEOFToken();
+
+ else
+ this._emitCodePoint(cp);
+};
+
+
+//12.2.4.2 Character reference in data state
+//------------------------------------------------------------------
+_[CHARACTER_REFERENCE_IN_DATA_STATE] = function characterReferenceInDataState(cp) {
+ this.additionalAllowedCp = void 0;
+
+ var referencedCodePoints = this._consumeCharacterReference(cp, false);
+
+ if (!this._ensureHibernation()) {
+ if (referencedCodePoints)
+ this._emitSeveralCodePoints(referencedCodePoints);
+
+ else
+ this._emitChar('&');
+
+ this.state = DATA_STATE;
+ }
+};
+
+
+//12.2.4.3 RCDATA state
+//------------------------------------------------------------------
+_[RCDATA_STATE] = function rcdataState(cp) {
+ if (cp === $.AMPERSAND)
+ this.state = CHARACTER_REFERENCE_IN_RCDATA_STATE;
+
+ else if (cp === $.LESS_THAN_SIGN)
+ this.state = RCDATA_LESS_THAN_SIGN_STATE;
+
+ else if (cp === $.NULL)
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+
+ else if (cp === $.EOF)
+ this._emitEOFToken();
+
+ else
+ this._emitCodePoint(cp);
+};
+
+
+//12.2.4.4 Character reference in RCDATA state
+//------------------------------------------------------------------
+_[CHARACTER_REFERENCE_IN_RCDATA_STATE] = function characterReferenceInRcdataState(cp) {
+ this.additionalAllowedCp = void 0;
+
+ var referencedCodePoints = this._consumeCharacterReference(cp, false);
+
+ if (!this._ensureHibernation()) {
+ if (referencedCodePoints)
+ this._emitSeveralCodePoints(referencedCodePoints);
+
+ else
+ this._emitChar('&');
+
+ this.state = RCDATA_STATE;
+ }
+};
+
+
+//12.2.4.5 RAWTEXT state
+//------------------------------------------------------------------
+_[RAWTEXT_STATE] = function rawtextState(cp) {
+ if (cp === $.LESS_THAN_SIGN)
+ this.state = RAWTEXT_LESS_THAN_SIGN_STATE;
+
+ else if (cp === $.NULL)
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+
+ else if (cp === $.EOF)
+ this._emitEOFToken();
+
+ else
+ this._emitCodePoint(cp);
+};
+
+
+//12.2.4.6 Script data state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_STATE] = function scriptDataState(cp) {
+ if (cp === $.LESS_THAN_SIGN)
+ this.state = SCRIPT_DATA_LESS_THAN_SIGN_STATE;
+
+ else if (cp === $.NULL)
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+
+ else if (cp === $.EOF)
+ this._emitEOFToken();
+
+ else
+ this._emitCodePoint(cp);
+};
+
+
+//12.2.4.7 PLAINTEXT state
+//------------------------------------------------------------------
+_[PLAINTEXT_STATE] = function plaintextState(cp) {
+ if (cp === $.NULL)
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+
+ else if (cp === $.EOF)
+ this._emitEOFToken();
+
+ else
+ this._emitCodePoint(cp);
+};
+
+
+//12.2.4.8 Tag open state
+//------------------------------------------------------------------
+_[TAG_OPEN_STATE] = function tagOpenState(cp) {
+ if (cp === $.EXCLAMATION_MARK)
+ this.state = MARKUP_DECLARATION_OPEN_STATE;
+
+ else if (cp === $.SOLIDUS)
+ this.state = END_TAG_OPEN_STATE;
+
+ else if (isAsciiLetter(cp)) {
+ this._createStartTagToken();
+ this._reconsumeInState(TAG_NAME_STATE);
+ }
+
+ else if (cp === $.QUESTION_MARK)
+ this._reconsumeInState(BOGUS_COMMENT_STATE);
+
+ else {
+ this._emitChar('<');
+ this._reconsumeInState(DATA_STATE);
+ }
+};
+
+
+//12.2.4.9 End tag open state
+//------------------------------------------------------------------
+_[END_TAG_OPEN_STATE] = function endTagOpenState(cp) {
+ if (isAsciiLetter(cp)) {
+ this._createEndTagToken();
+ this._reconsumeInState(TAG_NAME_STATE);
+ }
+
+ else if (cp === $.GREATER_THAN_SIGN)
+ this.state = DATA_STATE;
+
+ else if (cp === $.EOF) {
+ this._reconsumeInState(DATA_STATE);
+ this._emitChar('<');
+ this._emitChar('/');
+ }
+
+ else
+ this._reconsumeInState(BOGUS_COMMENT_STATE);
+};
+
+
+//12.2.4.10 Tag name state
+//------------------------------------------------------------------
+_[TAG_NAME_STATE] = function tagNameState(cp) {
+ if (isWhitespace(cp))
+ this.state = BEFORE_ATTRIBUTE_NAME_STATE;
+
+ else if (cp === $.SOLIDUS)
+ this.state = SELF_CLOSING_START_TAG_STATE;
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ }
+
+ else if (isAsciiUpper(cp))
+ this.currentToken.tagName += toAsciiLowerChar(cp);
+
+ else if (cp === $.NULL)
+ this.currentToken.tagName += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else
+ this.currentToken.tagName += toChar(cp);
+};
+
+
+//12.2.4.11 RCDATA less-than sign state
+//------------------------------------------------------------------
+_[RCDATA_LESS_THAN_SIGN_STATE] = function rcdataLessThanSignState(cp) {
+ if (cp === $.SOLIDUS) {
+ this.tempBuff = [];
+ this.state = RCDATA_END_TAG_OPEN_STATE;
+ }
+
+ else {
+ this._emitChar('<');
+ this._reconsumeInState(RCDATA_STATE);
+ }
+};
+
+
+//12.2.4.12 RCDATA end tag open state
+//------------------------------------------------------------------
+_[RCDATA_END_TAG_OPEN_STATE] = function rcdataEndTagOpenState(cp) {
+ if (isAsciiLetter(cp)) {
+ this._createEndTagToken();
+ this._reconsumeInState(RCDATA_END_TAG_NAME_STATE);
+ }
+
+ else {
+ this._emitChar('<');
+ this._emitChar('/');
+ this._reconsumeInState(RCDATA_STATE);
+ }
+};
+
+
+//12.2.4.13 RCDATA end tag name state
+//------------------------------------------------------------------
+_[RCDATA_END_TAG_NAME_STATE] = function rcdataEndTagNameState(cp) {
+ if (isAsciiUpper(cp)) {
+ this.currentToken.tagName += toAsciiLowerChar(cp);
+ this.tempBuff.push(cp);
+ }
+
+ else if (isAsciiLower(cp)) {
+ this.currentToken.tagName += toChar(cp);
+ this.tempBuff.push(cp);
+ }
+
+ else {
+ if (this._isAppropriateEndTagToken()) {
+ if (isWhitespace(cp)) {
+ this.state = BEFORE_ATTRIBUTE_NAME_STATE;
+ return;
+ }
+
+ if (cp === $.SOLIDUS) {
+ this.state = SELF_CLOSING_START_TAG_STATE;
+ return;
+ }
+
+ if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ return;
+ }
+ }
+
+ this._emitChar('<');
+ this._emitChar('/');
+ this._emitSeveralCodePoints(this.tempBuff);
+ this._reconsumeInState(RCDATA_STATE);
+ }
+};
+
+
+//12.2.4.14 RAWTEXT less-than sign state
+//------------------------------------------------------------------
+_[RAWTEXT_LESS_THAN_SIGN_STATE] = function rawtextLessThanSignState(cp) {
+ if (cp === $.SOLIDUS) {
+ this.tempBuff = [];
+ this.state = RAWTEXT_END_TAG_OPEN_STATE;
+ }
+
+ else {
+ this._emitChar('<');
+ this._reconsumeInState(RAWTEXT_STATE);
+ }
+};
+
+
+//12.2.4.15 RAWTEXT end tag open state
+//------------------------------------------------------------------
+_[RAWTEXT_END_TAG_OPEN_STATE] = function rawtextEndTagOpenState(cp) {
+ if (isAsciiLetter(cp)) {
+ this._createEndTagToken();
+ this._reconsumeInState(RAWTEXT_END_TAG_NAME_STATE);
+ }
+
+ else {
+ this._emitChar('<');
+ this._emitChar('/');
+ this._reconsumeInState(RAWTEXT_STATE);
+ }
+};
+
+
+//12.2.4.16 RAWTEXT end tag name state
+//------------------------------------------------------------------
+_[RAWTEXT_END_TAG_NAME_STATE] = function rawtextEndTagNameState(cp) {
+ if (isAsciiUpper(cp)) {
+ this.currentToken.tagName += toAsciiLowerChar(cp);
+ this.tempBuff.push(cp);
+ }
+
+ else if (isAsciiLower(cp)) {
+ this.currentToken.tagName += toChar(cp);
+ this.tempBuff.push(cp);
+ }
+
+ else {
+ if (this._isAppropriateEndTagToken()) {
+ if (isWhitespace(cp)) {
+ this.state = BEFORE_ATTRIBUTE_NAME_STATE;
+ return;
+ }
+
+ if (cp === $.SOLIDUS) {
+ this.state = SELF_CLOSING_START_TAG_STATE;
+ return;
+ }
+
+ if (cp === $.GREATER_THAN_SIGN) {
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ return;
+ }
+ }
+
+ this._emitChar('<');
+ this._emitChar('/');
+ this._emitSeveralCodePoints(this.tempBuff);
+ this._reconsumeInState(RAWTEXT_STATE);
+ }
+};
+
+
+//12.2.4.17 Script data less-than sign state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_LESS_THAN_SIGN_STATE] = function scriptDataLessThanSignState(cp) {
+ if (cp === $.SOLIDUS) {
+ this.tempBuff = [];
+ this.state = SCRIPT_DATA_END_TAG_OPEN_STATE;
+ }
+
+ else if (cp === $.EXCLAMATION_MARK) {
+ this.state = SCRIPT_DATA_ESCAPE_START_STATE;
+ this._emitChar('<');
+ this._emitChar('!');
+ }
+
+ else {
+ this._emitChar('<');
+ this._reconsumeInState(SCRIPT_DATA_STATE);
+ }
+};
+
+
+//12.2.4.18 Script data end tag open state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_END_TAG_OPEN_STATE] = function scriptDataEndTagOpenState(cp) {
+ if (isAsciiLetter(cp)) {
+ this._createEndTagToken();
+ this._reconsumeInState(SCRIPT_DATA_END_TAG_NAME_STATE);
+ }
+
+ else {
+ this._emitChar('<');
+ this._emitChar('/');
+ this._reconsumeInState(SCRIPT_DATA_STATE);
+ }
+};
+
+
+//12.2.4.19 Script data end tag name state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_END_TAG_NAME_STATE] = function scriptDataEndTagNameState(cp) {
+ if (isAsciiUpper(cp)) {
+ this.currentToken.tagName += toAsciiLowerChar(cp);
+ this.tempBuff.push(cp);
+ }
+
+ else if (isAsciiLower(cp)) {
+ this.currentToken.tagName += toChar(cp);
+ this.tempBuff.push(cp);
+ }
+
+ else {
+ if (this._isAppropriateEndTagToken()) {
+ if (isWhitespace(cp)) {
+ this.state = BEFORE_ATTRIBUTE_NAME_STATE;
+ return;
+ }
+
+ else if (cp === $.SOLIDUS) {
+ this.state = SELF_CLOSING_START_TAG_STATE;
+ return;
+ }
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ return;
+ }
+ }
+
+ this._emitChar('<');
+ this._emitChar('/');
+ this._emitSeveralCodePoints(this.tempBuff);
+ this._reconsumeInState(SCRIPT_DATA_STATE);
+ }
+};
+
+
+//12.2.4.20 Script data escape start state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_ESCAPE_START_STATE] = function scriptDataEscapeStartState(cp) {
+ if (cp === $.HYPHEN_MINUS) {
+ this.state = SCRIPT_DATA_ESCAPE_START_DASH_STATE;
+ this._emitChar('-');
+ }
+
+ else
+ this._reconsumeInState(SCRIPT_DATA_STATE);
+};
+
+
+//12.2.4.21 Script data escape start dash state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_ESCAPE_START_DASH_STATE] = function scriptDataEscapeStartDashState(cp) {
+ if (cp === $.HYPHEN_MINUS) {
+ this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
+ this._emitChar('-');
+ }
+
+ else
+ this._reconsumeInState(SCRIPT_DATA_STATE);
+};
+
+
+//12.2.4.22 Script data escaped state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_ESCAPED_STATE] = function scriptDataEscapedState(cp) {
+ if (cp === $.HYPHEN_MINUS) {
+ this.state = SCRIPT_DATA_ESCAPED_DASH_STATE;
+ this._emitChar('-');
+ }
+
+ else if (cp === $.LESS_THAN_SIGN)
+ this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
+
+ else if (cp === $.NULL)
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else
+ this._emitCodePoint(cp);
+};
+
+
+//12.2.4.23 Script data escaped dash state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_ESCAPED_DASH_STATE] = function scriptDataEscapedDashState(cp) {
+ if (cp === $.HYPHEN_MINUS) {
+ this.state = SCRIPT_DATA_ESCAPED_DASH_DASH_STATE;
+ this._emitChar('-');
+ }
+
+ else if (cp === $.LESS_THAN_SIGN)
+ this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
+
+ else if (cp === $.NULL) {
+ this.state = SCRIPT_DATA_ESCAPED_STATE;
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ }
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else {
+ this.state = SCRIPT_DATA_ESCAPED_STATE;
+ this._emitCodePoint(cp);
+ }
+};
+
+
+//12.2.4.24 Script data escaped dash dash state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_ESCAPED_DASH_DASH_STATE] = function scriptDataEscapedDashDashState(cp) {
+ if (cp === $.HYPHEN_MINUS)
+ this._emitChar('-');
+
+ else if (cp === $.LESS_THAN_SIGN)
+ this.state = SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE;
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.state = SCRIPT_DATA_STATE;
+ this._emitChar('>');
+ }
+
+ else if (cp === $.NULL) {
+ this.state = SCRIPT_DATA_ESCAPED_STATE;
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ }
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else {
+ this.state = SCRIPT_DATA_ESCAPED_STATE;
+ this._emitCodePoint(cp);
+ }
+};
+
+
+//12.2.4.25 Script data escaped less-than sign state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataEscapedLessThanSignState(cp) {
+ if (cp === $.SOLIDUS) {
+ this.tempBuff = [];
+ this.state = SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE;
+ }
+
+ else if (isAsciiLetter(cp)) {
+ this.tempBuff = [];
+ this._emitChar('<');
+ this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE);
+ }
+
+ else {
+ this._emitChar('<');
+ this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+ }
+};
+
+
+//12.2.4.26 Script data escaped end tag open state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_ESCAPED_END_TAG_OPEN_STATE] = function scriptDataEscapedEndTagOpenState(cp) {
+ if (isAsciiLetter(cp)) {
+ this._createEndTagToken();
+ this._reconsumeInState(SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE);
+ }
+
+ else {
+ this._emitChar('<');
+ this._emitChar('/');
+ this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+ }
+};
+
+
+//12.2.4.27 Script data escaped end tag name state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_ESCAPED_END_TAG_NAME_STATE] = function scriptDataEscapedEndTagNameState(cp) {
+ if (isAsciiUpper(cp)) {
+ this.currentToken.tagName += toAsciiLowerChar(cp);
+ this.tempBuff.push(cp);
+ }
+
+ else if (isAsciiLower(cp)) {
+ this.currentToken.tagName += toChar(cp);
+ this.tempBuff.push(cp);
+ }
+
+ else {
+ if (this._isAppropriateEndTagToken()) {
+ if (isWhitespace(cp)) {
+ this.state = BEFORE_ATTRIBUTE_NAME_STATE;
+ return;
+ }
+
+ if (cp === $.SOLIDUS) {
+ this.state = SELF_CLOSING_START_TAG_STATE;
+ return;
+ }
+
+ if (cp === $.GREATER_THAN_SIGN) {
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ return;
+ }
+ }
+
+ this._emitChar('<');
+ this._emitChar('/');
+ this._emitSeveralCodePoints(this.tempBuff);
+ this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+ }
+};
+
+
+//12.2.4.28 Script data double escape start state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_DOUBLE_ESCAPE_START_STATE] = function scriptDataDoubleEscapeStartState(cp) {
+ if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {
+ this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_DOUBLE_ESCAPED_STATE : SCRIPT_DATA_ESCAPED_STATE;
+ this._emitCodePoint(cp);
+ }
+
+ else if (isAsciiUpper(cp)) {
+ this.tempBuff.push(toAsciiLowerCodePoint(cp));
+ this._emitCodePoint(cp);
+ }
+
+ else if (isAsciiLower(cp)) {
+ this.tempBuff.push(cp);
+ this._emitCodePoint(cp);
+ }
+
+ else
+ this._reconsumeInState(SCRIPT_DATA_ESCAPED_STATE);
+};
+
+
+//12.2.4.29 Script data double escaped state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_DOUBLE_ESCAPED_STATE] = function scriptDataDoubleEscapedState(cp) {
+ if (cp === $.HYPHEN_MINUS) {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE;
+ this._emitChar('-');
+ }
+
+ else if (cp === $.LESS_THAN_SIGN) {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
+ this._emitChar('<');
+ }
+
+ else if (cp === $.NULL)
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else
+ this._emitCodePoint(cp);
+};
+
+
+//12.2.4.30 Script data double escaped dash state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_STATE] = function scriptDataDoubleEscapedDashState(cp) {
+ if (cp === $.HYPHEN_MINUS) {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE;
+ this._emitChar('-');
+ }
+
+ else if (cp === $.LESS_THAN_SIGN) {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
+ this._emitChar('<');
+ }
+
+ else if (cp === $.NULL) {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ }
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
+ this._emitCodePoint(cp);
+ }
+};
+
+
+//12.2.4.31 Script data double escaped dash dash state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_DOUBLE_ESCAPED_DASH_DASH_STATE] = function scriptDataDoubleEscapedDashDashState(cp) {
+ if (cp === $.HYPHEN_MINUS)
+ this._emitChar('-');
+
+ else if (cp === $.LESS_THAN_SIGN) {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE;
+ this._emitChar('<');
+ }
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.state = SCRIPT_DATA_STATE;
+ this._emitChar('>');
+ }
+
+ else if (cp === $.NULL) {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
+ this._emitChar(UNICODE.REPLACEMENT_CHARACTER);
+ }
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else {
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
+ this._emitCodePoint(cp);
+ }
+};
+
+
+//12.2.4.32 Script data double escaped less-than sign state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_DOUBLE_ESCAPED_LESS_THAN_SIGN_STATE] = function scriptDataDoubleEscapedLessThanSignState(cp) {
+ if (cp === $.SOLIDUS) {
+ this.tempBuff = [];
+ this.state = SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE;
+ this._emitChar('/');
+ }
+
+ else
+ this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
+};
+
+
+//12.2.4.33 Script data double escape end state
+//------------------------------------------------------------------
+_[SCRIPT_DATA_DOUBLE_ESCAPE_END_STATE] = function scriptDataDoubleEscapeEndState(cp) {
+ if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN) {
+ this.state = this.isTempBufferEqualToScriptString() ? SCRIPT_DATA_ESCAPED_STATE : SCRIPT_DATA_DOUBLE_ESCAPED_STATE;
+
+ this._emitCodePoint(cp);
+ }
+
+ else if (isAsciiUpper(cp)) {
+ this.tempBuff.push(toAsciiLowerCodePoint(cp));
+ this._emitCodePoint(cp);
+ }
+
+ else if (isAsciiLower(cp)) {
+ this.tempBuff.push(cp);
+ this._emitCodePoint(cp);
+ }
+
+ else
+ this._reconsumeInState(SCRIPT_DATA_DOUBLE_ESCAPED_STATE);
+};
+
+
+//12.2.4.34 Before attribute name state
+//------------------------------------------------------------------
+_[BEFORE_ATTRIBUTE_NAME_STATE] = function beforeAttributeNameState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ if (cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF)
+ this._reconsumeInState(AFTER_ATTRIBUTE_NAME_STATE);
+
+ else if (cp === $.EQUALS_SIGN) {
+ this._createAttr('=');
+ this.state = ATTRIBUTE_NAME_STATE;
+ }
+
+ else {
+ this._createAttr('');
+ this._reconsumeInState(ATTRIBUTE_NAME_STATE);
+ }
+};
+
+
+//12.2.4.35 Attribute name state
+//------------------------------------------------------------------
+_[ATTRIBUTE_NAME_STATE] = function attributeNameState(cp) {
+ if (isWhitespace(cp) || cp === $.SOLIDUS || cp === $.GREATER_THAN_SIGN || cp === $.EOF) {
+ this._leaveAttrName(AFTER_ATTRIBUTE_NAME_STATE);
+ this._unconsume();
+ }
+
+ else if (cp === $.EQUALS_SIGN)
+ this._leaveAttrName(BEFORE_ATTRIBUTE_VALUE_STATE);
+
+ else if (isAsciiUpper(cp))
+ this.currentAttr.name += toAsciiLowerChar(cp);
+
+ else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN)
+ this.currentAttr.name += toChar(cp);
+
+ else if (cp === $.NULL)
+ this.currentAttr.name += UNICODE.REPLACEMENT_CHARACTER;
+
+ else
+ this.currentAttr.name += toChar(cp);
+};
+
+
+//12.2.4.36 After attribute name state
+//------------------------------------------------------------------
+_[AFTER_ATTRIBUTE_NAME_STATE] = function afterAttributeNameState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ if (cp === $.SOLIDUS)
+ this.state = SELF_CLOSING_START_TAG_STATE;
+
+ else if (cp === $.EQUALS_SIGN)
+ this.state = BEFORE_ATTRIBUTE_VALUE_STATE;
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ }
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else {
+ this._createAttr('');
+ this._reconsumeInState(ATTRIBUTE_NAME_STATE);
+ }
+};
+
+
+//12.2.4.37 Before attribute value state
+//------------------------------------------------------------------
+_[BEFORE_ATTRIBUTE_VALUE_STATE] = function beforeAttributeValueState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ if (cp === $.QUOTATION_MARK)
+ this.state = ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE;
+
+ else if (cp === $.APOSTROPHE)
+ this.state = ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE;
+
+ else
+ this._reconsumeInState(ATTRIBUTE_VALUE_UNQUOTED_STATE);
+};
+
+
+//12.2.4.38 Attribute value (double-quoted) state
+//------------------------------------------------------------------
+_[ATTRIBUTE_VALUE_DOUBLE_QUOTED_STATE] = function attributeValueDoubleQuotedState(cp) {
+ if (cp === $.QUOTATION_MARK)
+ this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
+
+ else if (cp === $.AMPERSAND) {
+ this.additionalAllowedCp = $.QUOTATION_MARK;
+ this.returnState = this.state;
+ this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
+ }
+
+ else if (cp === $.NULL)
+ this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else
+ this.currentAttr.value += toChar(cp);
+};
+
+
+//12.2.4.39 Attribute value (single-quoted) state
+//------------------------------------------------------------------
+_[ATTRIBUTE_VALUE_SINGLE_QUOTED_STATE] = function attributeValueSingleQuotedState(cp) {
+ if (cp === $.APOSTROPHE)
+ this.state = AFTER_ATTRIBUTE_VALUE_QUOTED_STATE;
+
+ else if (cp === $.AMPERSAND) {
+ this.additionalAllowedCp = $.APOSTROPHE;
+ this.returnState = this.state;
+ this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
+ }
+
+ else if (cp === $.NULL)
+ this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else
+ this.currentAttr.value += toChar(cp);
+};
+
+
+//12.2.4.40 Attribute value (unquoted) state
+//------------------------------------------------------------------
+_[ATTRIBUTE_VALUE_UNQUOTED_STATE] = function attributeValueUnquotedState(cp) {
+ if (isWhitespace(cp))
+ this._leaveAttrValue(BEFORE_ATTRIBUTE_NAME_STATE);
+
+ else if (cp === $.AMPERSAND) {
+ this.additionalAllowedCp = $.GREATER_THAN_SIGN;
+ this.returnState = this.state;
+ this.state = CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE;
+ }
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this._leaveAttrValue(DATA_STATE);
+ this._emitCurrentToken();
+ }
+
+ else if (cp === $.NULL)
+ this.currentAttr.value += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.QUOTATION_MARK || cp === $.APOSTROPHE || cp === $.LESS_THAN_SIGN ||
+ cp === $.EQUALS_SIGN || cp === $.GRAVE_ACCENT)
+ this.currentAttr.value += toChar(cp);
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else
+ this.currentAttr.value += toChar(cp);
+};
+
+
+//12.2.4.41 Character reference in attribute value state
+//------------------------------------------------------------------
+_[CHARACTER_REFERENCE_IN_ATTRIBUTE_VALUE_STATE] = function characterReferenceInAttributeValueState(cp) {
+ var referencedCodePoints = this._consumeCharacterReference(cp, true);
+
+ if (!this._ensureHibernation()) {
+ if (referencedCodePoints) {
+ for (var i = 0; i < referencedCodePoints.length; i++)
+ this.currentAttr.value += toChar(referencedCodePoints[i]);
+ }
+ else
+ this.currentAttr.value += '&';
+
+ this.state = this.returnState;
+ }
+};
+
+
+//12.2.4.42 After attribute value (quoted) state
+//------------------------------------------------------------------
+_[AFTER_ATTRIBUTE_VALUE_QUOTED_STATE] = function afterAttributeValueQuotedState(cp) {
+ if (isWhitespace(cp))
+ this._leaveAttrValue(BEFORE_ATTRIBUTE_NAME_STATE);
+
+ else if (cp === $.SOLIDUS)
+ this._leaveAttrValue(SELF_CLOSING_START_TAG_STATE);
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this._leaveAttrValue(DATA_STATE);
+ this._emitCurrentToken();
+ }
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else
+ this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
+};
+
+
+//12.2.4.43 Self-closing start tag state
+//------------------------------------------------------------------
+_[SELF_CLOSING_START_TAG_STATE] = function selfClosingStartTagState(cp) {
+ if (cp === $.GREATER_THAN_SIGN) {
+ this.currentToken.selfClosing = true;
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ }
+
+ else if (cp === $.EOF)
+ this._reconsumeInState(DATA_STATE);
+
+ else
+ this._reconsumeInState(BEFORE_ATTRIBUTE_NAME_STATE);
+};
+
+
+//12.2.4.44 Bogus comment state
+//------------------------------------------------------------------
+_[BOGUS_COMMENT_STATE] = function bogusCommentState() {
+ this._createCommentToken();
+ this._reconsumeInState(BOGUS_COMMENT_STATE_CONTINUATION);
+};
+
+//HACK: to support streaming and make BOGUS_COMMENT_STATE reentrant we've
+//introduced BOGUS_COMMENT_STATE_CONTINUATION state which will not produce
+//comment token on each call.
+_[BOGUS_COMMENT_STATE_CONTINUATION] = function bogusCommentStateContinuation(cp) {
+ while (true) {
+ if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ break;
+ }
+
+ else if (cp === $.EOF) {
+ this._reconsumeInState(DATA_STATE);
+ break;
+ }
+
+ else {
+ this.currentToken.data += cp === $.NULL ? UNICODE.REPLACEMENT_CHARACTER : toChar(cp);
+
+ this._hibernationSnapshot();
+ cp = this._consume();
+
+ if (this._ensureHibernation())
+ return;
+ }
+ }
+
+ this._emitCurrentToken();
+};
+
+//12.2.4.45 Markup declaration open state
+//------------------------------------------------------------------
+_[MARKUP_DECLARATION_OPEN_STATE] = function markupDeclarationOpenState(cp) {
+ var dashDashMatch = this._consumeSubsequentIfMatch($$.DASH_DASH_STRING, cp, true),
+ doctypeMatch = !dashDashMatch && this._consumeSubsequentIfMatch($$.DOCTYPE_STRING, cp, false),
+ cdataMatch = !dashDashMatch && !doctypeMatch &&
+ this.allowCDATA &&
+ this._consumeSubsequentIfMatch($$.CDATA_START_STRING, cp, true);
+
+ if (!this._ensureHibernation()) {
+ if (dashDashMatch) {
+ this._createCommentToken();
+ this.state = COMMENT_START_STATE;
+ }
+
+ else if (doctypeMatch)
+ this.state = DOCTYPE_STATE;
+
+ else if (cdataMatch)
+ this.state = CDATA_SECTION_STATE;
+
+ else
+ this._reconsumeInState(BOGUS_COMMENT_STATE);
+ }
+};
+
+
+//12.2.4.46 Comment start state
+//------------------------------------------------------------------
+_[COMMENT_START_STATE] = function commentStartState(cp) {
+ if (cp === $.HYPHEN_MINUS)
+ this.state = COMMENT_START_DASH_STATE;
+
+ else if (cp === $.NULL) {
+ this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
+ this.state = COMMENT_STATE;
+ }
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ }
+
+ else if (cp === $.EOF) {
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else {
+ this.currentToken.data += toChar(cp);
+ this.state = COMMENT_STATE;
+ }
+};
+
+
+//12.2.4.47 Comment start dash state
+//------------------------------------------------------------------
+_[COMMENT_START_DASH_STATE] = function commentStartDashState(cp) {
+ if (cp === $.HYPHEN_MINUS)
+ this.state = COMMENT_END_STATE;
+
+ else if (cp === $.NULL) {
+ this.currentToken.data += '-';
+ this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
+ this.state = COMMENT_STATE;
+ }
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ }
+
+ else if (cp === $.EOF) {
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else {
+ this.currentToken.data += '-';
+ this.currentToken.data += toChar(cp);
+ this.state = COMMENT_STATE;
+ }
+};
+
+
+//12.2.4.48 Comment state
+//------------------------------------------------------------------
+_[COMMENT_STATE] = function commentState(cp) {
+ if (cp === $.HYPHEN_MINUS)
+ this.state = COMMENT_END_DASH_STATE;
+
+ else if (cp === $.NULL)
+ this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.EOF) {
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else
+ this.currentToken.data += toChar(cp);
+};
+
+
+//12.2.4.49 Comment end dash state
+//------------------------------------------------------------------
+_[COMMENT_END_DASH_STATE] = function commentEndDashState(cp) {
+ if (cp === $.HYPHEN_MINUS)
+ this.state = COMMENT_END_STATE;
+
+ else if (cp === $.NULL) {
+ this.currentToken.data += '-';
+ this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
+ this.state = COMMENT_STATE;
+ }
+
+ else if (cp === $.EOF) {
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else {
+ this.currentToken.data += '-';
+ this.currentToken.data += toChar(cp);
+ this.state = COMMENT_STATE;
+ }
+};
+
+
+//12.2.4.50 Comment end state
+//------------------------------------------------------------------
+_[COMMENT_END_STATE] = function commentEndState(cp) {
+ if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ }
+
+ else if (cp === $.EXCLAMATION_MARK)
+ this.state = COMMENT_END_BANG_STATE;
+
+ else if (cp === $.HYPHEN_MINUS)
+ this.currentToken.data += '-';
+
+ else if (cp === $.NULL) {
+ this.currentToken.data += '--';
+ this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
+ this.state = COMMENT_STATE;
+ }
+
+ else if (cp === $.EOF) {
+ this._reconsumeInState(DATA_STATE);
+ this._emitCurrentToken();
+ }
+
+ else {
+ this.currentToken.data += '--';
+ this.currentToken.data += toChar(cp);
+ this.state = COMMENT_STATE;
+ }
+};
+
+
+//12.2.4.51 Comment end bang state
+//------------------------------------------------------------------
+_[COMMENT_END_BANG_STATE] = function commentEndBangState(cp) {
+ if (cp === $.HYPHEN_MINUS) {
+ this.currentToken.data += '--!';
+ this.state = COMMENT_END_DASH_STATE;
+ }
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ }
+
+ else if (cp === $.NULL) {
+ this.currentToken.data += '--!';
+ this.currentToken.data += UNICODE.REPLACEMENT_CHARACTER;
+ this.state = COMMENT_STATE;
+ }
+
+ else if (cp === $.EOF) {
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else {
+ this.currentToken.data += '--!';
+ this.currentToken.data += toChar(cp);
+ this.state = COMMENT_STATE;
+ }
+};
+
+
+//12.2.4.52 DOCTYPE state
+//------------------------------------------------------------------
+_[DOCTYPE_STATE] = function doctypeState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this._createDoctypeToken(null);
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ }
+
+ else if (cp === $.EOF) {
+ this._createDoctypeToken(null);
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+ else {
+ this._createDoctypeToken('');
+ this._reconsumeInState(DOCTYPE_NAME_STATE);
+ }
+};
+
+
+//12.2.4.54 DOCTYPE name state
+//------------------------------------------------------------------
+_[DOCTYPE_NAME_STATE] = function doctypeNameState(cp) {
+ if (isWhitespace(cp) || cp === $.GREATER_THAN_SIGN || cp === $.EOF)
+ this._reconsumeInState(AFTER_DOCTYPE_NAME_STATE);
+
+ else if (isAsciiUpper(cp))
+ this.currentToken.name += toAsciiLowerChar(cp);
+
+ else if (cp === $.NULL)
+ this.currentToken.name += UNICODE.REPLACEMENT_CHARACTER;
+
+ else
+ this.currentToken.name += toChar(cp);
+};
+
+
+//12.2.4.55 After DOCTYPE name state
+//------------------------------------------------------------------
+_[AFTER_DOCTYPE_NAME_STATE] = function afterDoctypeNameState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ if (cp === $.GREATER_THAN_SIGN) {
+ this.state = DATA_STATE;
+ this._emitCurrentToken();
+ }
+
+ else {
+ var publicMatch = this._consumeSubsequentIfMatch($$.PUBLIC_STRING, cp, false),
+ systemMatch = !publicMatch && this._consumeSubsequentIfMatch($$.SYSTEM_STRING, cp, false);
+
+ if (!this._ensureHibernation()) {
+ if (publicMatch)
+ this.state = BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE;
+
+ else if (systemMatch)
+ this.state = BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
+
+ else {
+ this.currentToken.forceQuirks = true;
+ this.state = BOGUS_DOCTYPE_STATE;
+ }
+ }
+ }
+};
+
+
+//12.2.4.57 Before DOCTYPE public identifier state
+//------------------------------------------------------------------
+_[BEFORE_DOCTYPE_PUBLIC_IDENTIFIER_STATE] = function beforeDoctypePublicIdentifierState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ if (cp === $.QUOTATION_MARK) {
+ this.currentToken.publicId = '';
+ this.state = DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE;
+ }
+
+ else if (cp === $.APOSTROPHE) {
+ this.currentToken.publicId = '';
+ this.state = DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE;
+ }
+
+ else {
+ this.currentToken.forceQuirks = true;
+ this._reconsumeInState(BOGUS_DOCTYPE_STATE);
+ }
+};
+
+
+//12.2.4.58 DOCTYPE public identifier (double-quoted) state
+//------------------------------------------------------------------
+_[DOCTYPE_PUBLIC_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypePublicIdentifierDoubleQuotedState(cp) {
+ if (cp === $.QUOTATION_MARK)
+ this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
+
+ else if (cp === $.NULL)
+ this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ }
+
+ else if (cp === $.EOF) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else
+ this.currentToken.publicId += toChar(cp);
+};
+
+
+//12.2.4.59 DOCTYPE public identifier (single-quoted) state
+//------------------------------------------------------------------
+_[DOCTYPE_PUBLIC_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypePublicIdentifierSingleQuotedState(cp) {
+ if (cp === $.APOSTROPHE)
+ this.state = BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE;
+
+ else if (cp === $.NULL)
+ this.currentToken.publicId += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ }
+
+ else if (cp === $.EOF) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else
+ this.currentToken.publicId += toChar(cp);
+};
+
+
+//12.2.4.61 Between DOCTYPE public and system identifiers state
+//------------------------------------------------------------------
+_[BETWEEN_DOCTYPE_PUBLIC_AND_SYSTEM_IDENTIFIERS_STATE] = function betweenDoctypePublicAndSystemIdentifiersState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ if (cp === $.GREATER_THAN_SIGN) {
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ }
+
+ else if (cp === $.QUOTATION_MARK) {
+ this.currentToken.systemId = '';
+ this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
+ }
+
+
+ else if (cp === $.APOSTROPHE) {
+ this.currentToken.systemId = '';
+ this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
+ }
+
+ else {
+ this.currentToken.forceQuirks = true;
+ this._reconsumeInState(BOGUS_DOCTYPE_STATE);
+ }
+};
+
+
+//12.2.4.63 Before DOCTYPE system identifier state
+//------------------------------------------------------------------
+_[BEFORE_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function beforeDoctypeSystemIdentifierState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ if (cp === $.QUOTATION_MARK) {
+ this.currentToken.systemId = '';
+ this.state = DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE;
+ }
+
+ else if (cp === $.APOSTROPHE) {
+ this.currentToken.systemId = '';
+ this.state = DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE;
+ }
+
+ else {
+ this.currentToken.forceQuirks = true;
+ this._reconsumeInState(BOGUS_DOCTYPE_STATE);
+ }
+};
+
+
+//12.2.4.64 DOCTYPE system identifier (double-quoted) state
+//------------------------------------------------------------------
+_[DOCTYPE_SYSTEM_IDENTIFIER_DOUBLE_QUOTED_STATE] = function doctypeSystemIdentifierDoubleQuotedState(cp) {
+ if (cp === $.QUOTATION_MARK)
+ this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ }
+
+ else if (cp === $.NULL)
+ this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.EOF) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else
+ this.currentToken.systemId += toChar(cp);
+};
+
+
+//12.2.4.65 DOCTYPE system identifier (single-quoted) state
+//------------------------------------------------------------------
+_[DOCTYPE_SYSTEM_IDENTIFIER_SINGLE_QUOTED_STATE] = function doctypeSystemIdentifierSingleQuotedState(cp) {
+ if (cp === $.APOSTROPHE)
+ this.state = AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE;
+
+ else if (cp === $.GREATER_THAN_SIGN) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ }
+
+ else if (cp === $.NULL)
+ this.currentToken.systemId += UNICODE.REPLACEMENT_CHARACTER;
+
+ else if (cp === $.EOF) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else
+ this.currentToken.systemId += toChar(cp);
+};
+
+
+//12.2.4.66 After DOCTYPE system identifier state
+//------------------------------------------------------------------
+_[AFTER_DOCTYPE_SYSTEM_IDENTIFIER_STATE] = function afterDoctypeSystemIdentifierState(cp) {
+ if (isWhitespace(cp))
+ return;
+
+ if (cp === $.GREATER_THAN_SIGN) {
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ }
+
+ else if (cp === $.EOF) {
+ this.currentToken.forceQuirks = true;
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+
+ else
+ this.state = BOGUS_DOCTYPE_STATE;
+};
+
+
+//12.2.4.67 Bogus DOCTYPE state
+//------------------------------------------------------------------
+_[BOGUS_DOCTYPE_STATE] = function bogusDoctypeState(cp) {
+ if (cp === $.GREATER_THAN_SIGN) {
+ this._emitCurrentToken();
+ this.state = DATA_STATE;
+ }
+
+ else if (cp === $.EOF) {
+ this._emitCurrentToken();
+ this._reconsumeInState(DATA_STATE);
+ }
+};
+
+
+//12.2.4.68 CDATA section state
+//------------------------------------------------------------------
+_[CDATA_SECTION_STATE] = function cdataSectionState(cp) {
+ while (true) {
+ if (cp === $.EOF) {
+ this._reconsumeInState(DATA_STATE);
+ break;
+ }
+
+ else {
+ var cdataEndMatch = this._consumeSubsequentIfMatch($$.CDATA_END_STRING, cp, true);
+
+ if (this._ensureHibernation())
+ break;
+
+ if (cdataEndMatch) {
+ this.state = DATA_STATE;
+ break;
+ }
+
+ this._emitCodePoint(cp);
+
+ this._hibernationSnapshot();
+ cp = this._consume();
+
+ if (this._ensureHibernation())
+ break;
+ }
+ }
+};
- else
- endTagInSelect(p, token);
-}
+},{"../common/unicode":84,"../location_info/tokenizer_mixin":87,"./named_entity_trie":98,"./preprocessor":99}],98:[function(require,module,exports){
+'use strict';
+
+//NOTE: this file contains auto-generated trie structure that is used for named entity references consumption
+//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/tokenization.html#tokenizing-character-references and
+//http://www.whatwg.org/specs/web-apps/current-work/multipage/named-character-references.html#named-character-references)
+module.exports = {65:{l:{69:{l:{108:{l:{105:{l:{103:{l:{59:{c:[198]}},c:[198]}}}}}}},77:{l:{80:{l:{59:{c:[38]}},c:[38]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[193]}},c:[193]}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[258]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[194]}},c:[194]}}}}},121:{l:{59:{c:[1040]}}}}},102:{l:{114:{l:{59:{c:[120068]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[192]}},c:[192]}}}}}}}}},108:{l:{112:{l:{104:{l:{97:{l:{59:{c:[913]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[256]}}}}}}}}},110:{l:{100:{l:{59:{c:[10835]}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[260]}}}}}}},112:{l:{102:{l:{59:{c:[120120]}}}}}}},112:{l:{112:{l:{108:{l:{121:{l:{70:{l:{117:{l:{110:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8289]}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[197]}},c:[197]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119964]}}}}},115:{l:{105:{l:{103:{l:{110:{l:{59:{c:[8788]}}}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[195]}},c:[195]}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[196]}},c:[196]}}}}}}},66:{l:{97:{l:{99:{l:{107:{l:{115:{l:{108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8726]}}}}}}}}}}}}}}},114:{l:{118:{l:{59:{c:[10983]}}},119:{l:{101:{l:{100:{l:{59:{c:[8966]}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1041]}}}}},101:{l:{99:{l:{97:{l:{117:{l:{115:{l:{101:{l:{59:{c:[8757]}}}}}}}}}}},114:{l:{110:{l:{111:{l:{117:{l:{108:{l:{108:{l:{105:{l:{115:{l:{59:{c:[8492]}}}}}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[914]}}}}}}},102:{l:{114:{l:{59:{c:[120069]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120121]}}}}}}},114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[728]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8492]}}}}}}},117:{l:{109:{l:{112:{l:{101:{l:{113:{l:{59:{c:[8782]}}}}}}}}}}}}},67:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1063]}}}}}}},79:{l:{80:{l:{89:{l:{59:{c:[169]}},c:[169]}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[262]}}}}}}}}},112:{l:{59:{c:[8914]},105:{l:{116:{l:{97:{l:{108:{l:{68:{l:{105:{l:{102:{l:{102:{l:{101:{l:{114:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8517]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},121:{l:{108:{l:{101:{l:{121:{l:{115:{l:{59:{c:[8493]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[268]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[199]}},c:[199]}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[264]}}}}}}},111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8752]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[266]}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{108:{l:{97:{l:{59:{c:[184]}}}}}}}}}}},110:{l:{116:{l:{101:{l:{114:{l:{68:{l:{111:{l:{116:{l:{59:{c:[183]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[8493]}}}}},104:{l:{105:{l:{59:{c:[935]}}}}},105:{l:{114:{l:{99:{l:{108:{l:{101:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8857]}}}}}}},77:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8854]}}}}}}}}}}},80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8853]}}}}}}}}},84:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8855]}}}}}}}}}}}}}}}}}}}}},108:{l:{111:{l:{99:{l:{107:{l:{119:{l:{105:{l:{115:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8754]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{101:{l:{67:{l:{117:{l:{114:{l:{108:{l:{121:{l:{68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8221]}}}}}}}}}}}}}}}}}}}}}}},81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8217]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8759]},101:{l:{59:{c:[10868]}}}}}}}}},110:{l:{103:{l:{114:{l:{117:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8801]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8751]}}}}}}},116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8750]}}}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8450]}}},114:{l:{111:{l:{100:{l:{117:{l:{99:{l:{116:{l:{59:{c:[8720]}}}}}}}}}}}}}}},117:{l:{110:{l:{116:{l:{101:{l:{114:{l:{67:{l:{108:{l:{111:{l:{99:{l:{107:{l:{119:{l:{105:{l:{115:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8755]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{111:{l:{115:{l:{115:{l:{59:{c:[10799]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119966]}}}}}}},117:{l:{112:{l:{59:{c:[8915]},67:{l:{97:{l:{112:{l:{59:{c:[8781]}}}}}}}}}}}}},68:{l:{68:{l:{59:{c:[8517]},111:{l:{116:{l:{114:{l:{97:{l:{104:{l:{100:{l:{59:{c:[10513]}}}}}}}}}}}}}}},74:{l:{99:{l:{121:{l:{59:{c:[1026]}}}}}}},83:{l:{99:{l:{121:{l:{59:{c:[1029]}}}}}}},90:{l:{99:{l:{121:{l:{59:{c:[1039]}}}}}}},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8225]}}}}}}}}},114:{l:{114:{l:{59:{c:[8609]}}}}},115:{l:{104:{l:{118:{l:{59:{c:[10980]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[270]}}}}}}}}},121:{l:{59:{c:[1044]}}}}},101:{l:{108:{l:{59:{c:[8711]},116:{l:{97:{l:{59:{c:[916]}}}}}}}}},102:{l:{114:{l:{59:{c:[120071]}}}}},105:{l:{97:{l:{99:{l:{114:{l:{105:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{65:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[180]}}}}}}}}}}},68:{l:{111:{l:{116:{l:{59:{c:[729]}}},117:{l:{98:{l:{108:{l:{101:{l:{65:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[733]}}}}}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[96]}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[732]}}}}}}}}}}}}}}}}}}}}}}}}}}},109:{l:{111:{l:{110:{l:{100:{l:{59:{c:[8900]}}}}}}}}}}},102:{l:{102:{l:{101:{l:{114:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8518]}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120123]}}}}},116:{l:{59:{c:[168]},68:{l:{111:{l:{116:{l:{59:{c:[8412]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8784]}}}}}}}}}}}}},117:{l:{98:{l:{108:{l:{101:{l:{67:{l:{111:{l:{110:{l:{116:{l:{111:{l:{117:{l:{114:{l:{73:{l:{110:{l:{116:{l:{101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8751]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},68:{l:{111:{l:{116:{l:{59:{c:[168]}}},119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8659]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8656]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8660]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[10980]}}}}}}}}}}}}},111:{l:{110:{l:{103:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10232]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10233]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8658]}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8872]}}}}}}}}}}}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8657]}}}}}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8661]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8741]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]},66:{l:{97:{l:{114:{l:{59:{c:[10515]}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8693]}}}}}}}}}}}}}}}}}}}}}}}}},66:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[785]}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10576]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10590]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8637]},66:{l:{97:{l:{114:{l:{59:{c:[10582]}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10591]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8641]},66:{l:{97:{l:{114:{l:{59:{c:[10583]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8868]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8615]}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8659]}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119967]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[272]}}}}}}}}}}}}},69:{l:{78:{l:{71:{l:{59:{c:[330]}}}}},84:{l:{72:{l:{59:{c:[208]}},c:[208]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[201]}},c:[201]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[282]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[202]}},c:[202]}}}}},121:{l:{59:{c:[1069]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[278]}}}}}}},102:{l:{114:{l:{59:{c:[120072]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[200]}},c:[200]}}}}}}}}},108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8712]}}}}}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[274]}}}}}}},112:{l:{116:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9723]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9643]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[280]}}}}}}},112:{l:{102:{l:{59:{c:[120124]}}}}}}},112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[917]}}}}}}}}}}}}},113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10869]},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8770]}}}}}}}}}}}}}}},105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[8652]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8496]}}}}},105:{l:{109:{l:{59:{c:[10867]}}}}}}},116:{l:{97:{l:{59:{c:[919]}}}}},117:{l:{109:{l:{108:{l:{59:{c:[203]}},c:[203]}}}}},120:{l:{105:{l:{115:{l:{116:{l:{115:{l:{59:{c:[8707]}}}}}}}}},112:{l:{111:{l:{110:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{69:{l:{59:{c:[8519]}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{99:{l:{121:{l:{59:{c:[1060]}}}}},102:{l:{114:{l:{59:{c:[120073]}}}}},105:{l:{108:{l:{108:{l:{101:{l:{100:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9724]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{83:{l:{109:{l:{97:{l:{108:{l:{108:{l:{83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120125]}}}}},114:{l:{65:{l:{108:{l:{108:{l:{59:{c:[8704]}}}}}}}}},117:{l:{114:{l:{105:{l:{101:{l:{114:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8497]}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8497]}}}}}}}}},71:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1027]}}}}}}},84:{l:{59:{c:[62]}},c:[62]},97:{l:{109:{l:{109:{l:{97:{l:{59:{c:[915]},100:{l:{59:{c:[988]}}}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[286]}}}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[290]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[284]}}}}}}},121:{l:{59:{c:[1043]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[288]}}}}}}},102:{l:{114:{l:{59:{c:[120074]}}}}},103:{l:{59:{c:[8921]}}},111:{l:{112:{l:{102:{l:{59:{c:[120126]}}}}}}},114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8805]},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8923]}}}}}}}}}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8807]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10914]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8823]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10878]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8819]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119970]}}}}}}},116:{l:{59:{c:[8811]}}}}},72:{l:{65:{l:{82:{l:{68:{l:{99:{l:{121:{l:{59:{c:[1066]}}}}}}}}}}},97:{l:{99:{l:{101:{l:{107:{l:{59:{c:[711]}}}}}}},116:{l:{59:{c:[94]}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[292]}}}}}}}}},102:{l:{114:{l:{59:{c:[8460]}}}}},105:{l:{108:{l:{98:{l:{101:{l:{114:{l:{116:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8459]}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8461]}}}}},114:{l:{105:{l:{122:{l:{111:{l:{110:{l:{116:{l:{97:{l:{108:{l:{76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[9472]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8459]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[294]}}}}}}}}}}},117:{l:{109:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{72:{l:{117:{l:{109:{l:{112:{l:{59:{c:[8782]}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8783]}}}}}}}}}}}}}}}}}}},73:{l:{69:{l:{99:{l:{121:{l:{59:{c:[1045]}}}}}}},74:{l:{108:{l:{105:{l:{103:{l:{59:{c:[306]}}}}}}}}},79:{l:{99:{l:{121:{l:{59:{c:[1025]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[205]}},c:[205]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[206]}},c:[206]}}}}},121:{l:{59:{c:[1048]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[304]}}}}}}},102:{l:{114:{l:{59:{c:[8465]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[204]}},c:[204]}}}}}}}}},109:{l:{59:{c:[8465]},97:{l:{99:{l:{114:{l:{59:{c:[298]}}}}},103:{l:{105:{l:{110:{l:{97:{l:{114:{l:{121:{l:{73:{l:{59:{c:[8520]}}}}}}}}}}}}}}}}},112:{l:{108:{l:{105:{l:{101:{l:{115:{l:{59:{c:[8658]}}}}}}}}}}}}},110:{l:{116:{l:{59:{c:[8748]},101:{l:{103:{l:{114:{l:{97:{l:{108:{l:{59:{c:[8747]}}}}}}}}},114:{l:{115:{l:{101:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8898]}}}}}}}}}}}}}}}}}}}}},118:{l:{105:{l:{115:{l:{105:{l:{98:{l:{108:{l:{101:{l:{67:{l:{111:{l:{109:{l:{109:{l:{97:{l:{59:{c:[8291]}}}}}}}}}}},84:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8290]}}}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[302]}}}}}}},112:{l:{102:{l:{59:{c:[120128]}}}}},116:{l:{97:{l:{59:{c:[921]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8464]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[296]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1030]}}}}}}},109:{l:{108:{l:{59:{c:[207]}},c:[207]}}}}}}},74:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[308]}}}}}}},121:{l:{59:{c:[1049]}}}}},102:{l:{114:{l:{59:{c:[120077]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120129]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119973]}}}}},101:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1032]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1028]}}}}}}}}}}},75:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1061]}}}}}}},74:{l:{99:{l:{121:{l:{59:{c:[1036]}}}}}}},97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[922]}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[310]}}}}}}}}},121:{l:{59:{c:[1050]}}}}},102:{l:{114:{l:{59:{c:[120078]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120130]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119974]}}}}}}}}},76:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1033]}}}}}}},84:{l:{59:{c:[60]}},c:[60]},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[313]}}}}}}}}},109:{l:{98:{l:{100:{l:{97:{l:{59:{c:[923]}}}}}}}}},110:{l:{103:{l:{59:{c:[10218]}}}}},112:{l:{108:{l:{97:{l:{99:{l:{101:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8466]}}}}}}}}}}}}}}}}},114:{l:{114:{l:{59:{c:[8606]}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[317]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[315]}}}}}}}}},121:{l:{59:{c:[1051]}}}}},101:{l:{102:{l:{116:{l:{65:{l:{110:{l:{103:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10216]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]},66:{l:{97:{l:{114:{l:{59:{c:[8676]}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8646]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},67:{l:{101:{l:{105:{l:{108:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8968]}}}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10214]}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10593]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8643]},66:{l:{97:{l:{114:{l:{59:{c:[10585]}}}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8970]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8596]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10574]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8867]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8612]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10586]}}}}}}}}}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8882]},66:{l:{97:{l:{114:{l:{59:{c:[10703]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8884]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10577]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10592]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8639]},66:{l:{97:{l:{114:{l:{59:{c:[10584]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8636]},66:{l:{97:{l:{114:{l:{59:{c:[10578]}}}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8656]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8660]}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{115:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8922]}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8806]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8822]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10913]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10877]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8818]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120079]}}}}},108:{l:{59:{c:[8920]},101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8666]}}}}}}}}}}}}}}}}}}},109:{l:{105:{l:{100:{l:{111:{l:{116:{l:{59:{c:[319]}}}}}}}}}}},111:{l:{110:{l:{103:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10229]}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10230]}}}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10232]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10234]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10233]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120131]}}}}},119:{l:{101:{l:{114:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8601]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8600]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8466]}}}}},104:{l:{59:{c:[8624]}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[321]}}}}}}}}}}},116:{l:{59:{c:[8810]}}}}},77:{l:{97:{l:{112:{l:{59:{c:[10501]}}}}},99:{l:{121:{l:{59:{c:[1052]}}}}},101:{l:{100:{l:{105:{l:{117:{l:{109:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8287]}}}}}}}}}}}}}}}}}}},108:{l:{108:{l:{105:{l:{110:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8499]}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120080]}}}}},105:{l:{110:{l:{117:{l:{115:{l:{80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8723]}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120132]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8499]}}}}}}},117:{l:{59:{c:[924]}}}}},78:{l:{74:{l:{99:{l:{121:{l:{59:{c:[1034]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[323]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[327]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[325]}}}}}}}}},121:{l:{59:{c:[1053]}}}}},101:{l:{103:{l:{97:{l:{116:{l:{105:{l:{118:{l:{101:{l:{77:{l:{101:{l:{100:{l:{105:{l:{117:{l:{109:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{104:{l:{105:{l:{99:{l:{107:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}},110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{121:{l:{84:{l:{104:{l:{105:{l:{110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{116:{l:{101:{l:{100:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8811]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8810]}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[10]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120081]}}}}},111:{l:{66:{l:{114:{l:{101:{l:{97:{l:{107:{l:{59:{c:[8288]}}}}}}}}}}},110:{l:{66:{l:{114:{l:{101:{l:{97:{l:{107:{l:{105:{l:{110:{l:{103:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[160]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8469]}}}}},116:{l:{59:{c:[10988]},67:{l:{111:{l:{110:{l:{103:{l:{114:{l:{117:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8802]}}}}}}}}}}}}}}}}},117:{l:{112:{l:{67:{l:{97:{l:{112:{l:{59:{c:[8813]}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8742]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8713]}}}}}}}}}}}}},113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8800]},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8770,824]}}}}}}}}}}}}}}}}}}},120:{l:{105:{l:{115:{l:{116:{l:{115:{l:{59:{c:[8708]}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8815]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8817]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8807,824]}}}}}}}}}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8811,824]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8825]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10878,824]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8821]}}}}}}}}}}}}}}}}}}}}}}}}},72:{l:{117:{l:{109:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{72:{l:{117:{l:{109:{l:{112:{l:{59:{c:[8782,824]}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8783,824]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{84:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8938]},66:{l:{97:{l:{114:{l:{59:{c:[10703,824]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8940]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{115:{l:{59:{c:[8814]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8816]}}}}}}}}}}},71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[8824]}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8810,824]}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10877,824]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8820]}}}}}}}}}}}}}}}}}}},78:{l:{101:{l:{115:{l:{116:{l:{101:{l:{100:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{71:{l:{114:{l:{101:{l:{97:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10914,824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{115:{l:{115:{l:{76:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10913,824]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},80:{l:{114:{l:{101:{l:{99:{l:{101:{l:{100:{l:{101:{l:{115:{l:{59:{c:[8832]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10927,824]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8928]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},82:{l:{101:{l:{118:{l:{101:{l:{114:{l:{115:{l:{101:{l:{69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8716]}}}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{84:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8939]},66:{l:{97:{l:{114:{l:{59:{c:[10704,824]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},83:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{83:{l:{117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8847,824]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8930]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8848,824]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8931]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8834,8402]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8840]}}}}}}}}}}}}}}}}}}},99:{l:{99:{l:{101:{l:{101:{l:{100:{l:{115:{l:{59:{c:[8833]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10928,824]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8929]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8831,824]}}}}}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8835,8402]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8841]}}}}}}}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8769]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8772]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8775]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8777]}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{114:{l:{116:{l:{105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8740]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119977]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[209]}},c:[209]}}}}}}}}},117:{l:{59:{c:[925]}}}}},79:{l:{69:{l:{108:{l:{105:{l:{103:{l:{59:{c:[338]}}}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[211]}},c:[211]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[212]}},c:[212]}}}}},121:{l:{59:{c:[1054]}}}}},100:{l:{98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[336]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120082]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[210]}},c:[210]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[332]}}}}}}},101:{l:{103:{l:{97:{l:{59:{c:[937]}}}}}}},105:{l:{99:{l:{114:{l:{111:{l:{110:{l:{59:{c:[927]}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120134]}}}}}}},112:{l:{101:{l:{110:{l:{67:{l:{117:{l:{114:{l:{108:{l:{121:{l:{68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8220]}}}}}}}}}}}}}}}}}}}}}}},81:{l:{117:{l:{111:{l:{116:{l:{101:{l:{59:{c:[8216]}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{59:{c:[10836]}}},115:{l:{99:{l:{114:{l:{59:{c:[119978]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[216]}},c:[216]}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[213]}},c:[213]}}}}},109:{l:{101:{l:{115:{l:{59:{c:[10807]}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[214]}},c:[214]}}}}},118:{l:{101:{l:{114:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8254]}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[9182]}}},107:{l:{101:{l:{116:{l:{59:{c:[9140]}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{101:{l:{110:{l:{116:{l:{104:{l:{101:{l:{115:{l:{105:{l:{115:{l:{59:{c:[9180]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{116:{l:{105:{l:{97:{l:{108:{l:{68:{l:{59:{c:[8706]}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1055]}}}}},102:{l:{114:{l:{59:{c:[120083]}}}}},104:{l:{105:{l:{59:{c:[934]}}}}},105:{l:{59:{c:[928]}}},108:{l:{117:{l:{115:{l:{77:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[177]}}}}}}}}}}}}}}}}},111:{l:{105:{l:{110:{l:{99:{l:{97:{l:{114:{l:{101:{l:{112:{l:{108:{l:{97:{l:{110:{l:{101:{l:{59:{c:[8460]}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[8473]}}}}}}},114:{l:{59:{c:[10939]},101:{l:{99:{l:{101:{l:{100:{l:{101:{l:{115:{l:{59:{c:[8826]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10927]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8828]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8830]}}}}}}}}}}}}}}}}}}}}}}},105:{l:{109:{l:{101:{l:{59:{c:[8243]}}}}}}},111:{l:{100:{l:{117:{l:{99:{l:{116:{l:{59:{c:[8719]}}}}}}}}},112:{l:{111:{l:{114:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8759]},97:{l:{108:{l:{59:{c:[8733]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119979]}}}}},105:{l:{59:{c:[936]}}}}}}},81:{l:{85:{l:{79:{l:{84:{l:{59:{c:[34]}},c:[34]}}}}},102:{l:{114:{l:{59:{c:[120084]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8474]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119980]}}}}}}}}},82:{l:{66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10512]}}}}}}}}},69:{l:{71:{l:{59:{c:[174]}},c:[174]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[340]}}}}}}}}},110:{l:{103:{l:{59:{c:[10219]}}}}},114:{l:{114:{l:{59:{c:[8608]},116:{l:{108:{l:{59:{c:[10518]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[344]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[342]}}}}}}}}},121:{l:{59:{c:[1056]}}}}},101:{l:{59:{c:[8476]},118:{l:{101:{l:{114:{l:{115:{l:{101:{l:{69:{l:{108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8715]}}}}}}}}}}}}},113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[8651]}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{69:{l:{113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[10607]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[8476]}}}}},104:{l:{111:{l:{59:{c:[929]}}}}},105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{110:{l:{103:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10217]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]},66:{l:{97:{l:{114:{l:{59:{c:[8677]}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8644]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},67:{l:{101:{l:{105:{l:{108:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8969]}}}}}}}}}}}}}}},68:{l:{111:{l:{117:{l:{98:{l:{108:{l:{101:{l:{66:{l:{114:{l:{97:{l:{99:{l:{107:{l:{101:{l:{116:{l:{59:{c:[10215]}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10589]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8642]},66:{l:{97:{l:{114:{l:{59:{c:[10581]}}}}}}}}}}}}}}}}}}}}}}}}}}},70:{l:{108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8971]}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8866]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8614]}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10587]}}}}}}}}}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8883]},66:{l:{97:{l:{114:{l:{59:{c:[10704]}}}}}}},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8885]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{68:{l:{111:{l:{119:{l:{110:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10575]}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10588]}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8638]},66:{l:{97:{l:{114:{l:{59:{c:[10580]}}}}}}}}}}}}}}}}}}}}}}},86:{l:{101:{l:{99:{l:{116:{l:{111:{l:{114:{l:{59:{c:[8640]},66:{l:{97:{l:{114:{l:{59:{c:[10579]}}}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8658]}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8477]}}}}},117:{l:{110:{l:{100:{l:{73:{l:{109:{l:{112:{l:{108:{l:{105:{l:{101:{l:{115:{l:{59:{c:[10608]}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8667]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8475]}}}}},104:{l:{59:{c:[8625]}}}}},117:{l:{108:{l:{101:{l:{68:{l:{101:{l:{108:{l:{97:{l:{121:{l:{101:{l:{100:{l:{59:{c:[10740]}}}}}}}}}}}}}}}}}}}}}}},83:{l:{72:{l:{67:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1065]}}}}}}}}},99:{l:{121:{l:{59:{c:[1064]}}}}}}},79:{l:{70:{l:{84:{l:{99:{l:{121:{l:{59:{c:[1068]}}}}}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[346]}}}}}}}}}}},99:{l:{59:{c:[10940]},97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[352]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[350]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[348]}}}}}}},121:{l:{59:{c:[1057]}}}}},102:{l:{114:{l:{59:{c:[120086]}}}}},104:{l:{111:{l:{114:{l:{116:{l:{68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]}}}}}}}}}}}}}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]}}}}}}}}}}}}}}}}}}}}},85:{l:{112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]}}}}}}}}}}}}}}}}}}}}}}},105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[931]}}}}}}}}},109:{l:{97:{l:{108:{l:{108:{l:{67:{l:{105:{l:{114:{l:{99:{l:{108:{l:{101:{l:{59:{c:[8728]}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120138]}}}}}}},113:{l:{114:{l:{116:{l:{59:{c:[8730]}}}}},117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9633]},73:{l:{110:{l:{116:{l:{101:{l:{114:{l:{115:{l:{101:{l:{99:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8851]}}}}}}}}}}}}}}}}}}}}}}}}},83:{l:{117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8847]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8849]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8848]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8850]}}}}}}}}}}}}}}}}}}}}}}}}}}},85:{l:{110:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8852]}}}}}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119982]}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[8902]}}}}}}},117:{l:{98:{l:{59:{c:[8912]},115:{l:{101:{l:{116:{l:{59:{c:[8912]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8838]}}}}}}}}}}}}}}}}}}},99:{l:{99:{l:{101:{l:{101:{l:{100:{l:{115:{l:{59:{c:[8827]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[10928]}}}}}}}}}}},83:{l:{108:{l:{97:{l:{110:{l:{116:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8829]}}}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8831]}}}}}}}}}}}}}}}}}}}}},104:{l:{84:{l:{104:{l:{97:{l:{116:{l:{59:{c:[8715]}}}}}}}}}}}}},109:{l:{59:{c:[8721]}}},112:{l:{59:{c:[8913]},101:{l:{114:{l:{115:{l:{101:{l:{116:{l:{59:{c:[8835]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8839]}}}}}}}}}}}}}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8913]}}}}}}}}}}}}},84:{l:{72:{l:{79:{l:{82:{l:{78:{l:{59:{c:[222]}},c:[222]}}}}}}},82:{l:{65:{l:{68:{l:{69:{l:{59:{c:[8482]}}}}}}}}},83:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1035]}}}}}}},99:{l:{121:{l:{59:{c:[1062]}}}}}}},97:{l:{98:{l:{59:{c:[9]}}},117:{l:{59:{c:[932]}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[356]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[354]}}}}}}}}},121:{l:{59:{c:[1058]}}}}},102:{l:{114:{l:{59:{c:[120087]}}}}},104:{l:{101:{l:{114:{l:{101:{l:{102:{l:{111:{l:{114:{l:{101:{l:{59:{c:[8756]}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[920]}}}}}}},105:{l:{99:{l:{107:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8287,8202]}}}}}}}}}}}}}}},110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8201]}}}}}}}}}}}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8764]},69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8771]}}}}}}}}}}},70:{l:{117:{l:{108:{l:{108:{l:{69:{l:{113:{l:{117:{l:{97:{l:{108:{l:{59:{c:[8773]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8776]}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120139]}}}}}}},114:{l:{105:{l:{112:{l:{108:{l:{101:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8411]}}}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119983]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[358]}}}}}}}}}}}}},85:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[218]}},c:[218]}}}}}}},114:{l:{114:{l:{59:{c:[8607]},111:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10569]}}}}}}}}}}}}}}},98:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1038]}}}}},101:{l:{118:{l:{101:{l:{59:{c:[364]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[219]}},c:[219]}}}}},121:{l:{59:{c:[1059]}}}}},100:{l:{98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[368]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120088]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[217]}},c:[217]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[362]}}}}}}}}},110:{l:{100:{l:{101:{l:{114:{l:{66:{l:{97:{l:{114:{l:{59:{c:[95]}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[9183]}}},107:{l:{101:{l:{116:{l:{59:{c:[9141]}}}}}}}}}}}}}}},80:{l:{97:{l:{114:{l:{101:{l:{110:{l:{116:{l:{104:{l:{101:{l:{115:{l:{105:{l:{115:{l:{59:{c:[9181]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{111:{l:{110:{l:{59:{c:[8899]},80:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8846]}}}}}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[370]}}}}}}},112:{l:{102:{l:{59:{c:[120140]}}}}}}},112:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]},66:{l:{97:{l:{114:{l:{59:{c:[10514]}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8645]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},68:{l:{111:{l:{119:{l:{110:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8597]}}}}}}}}}}}}}}}}}}},69:{l:{113:{l:{117:{l:{105:{l:{108:{l:{105:{l:{98:{l:{114:{l:{105:{l:{117:{l:{109:{l:{59:{c:[10606]}}}}}}}}}}}}}}}}}}}}}}},84:{l:{101:{l:{101:{l:{59:{c:[8869]},65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8613]}}}}}}}}}}}}}}}}},97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8657]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8661]}}}}}}}}}}}}}}}}}}},112:{l:{101:{l:{114:{l:{76:{l:{101:{l:{102:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8598]}}}}}}}}}}}}}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{65:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8599]}}}}}}}}}}}}}}}}}}}}}}}}}}},115:{l:{105:{l:{59:{c:[978]},108:{l:{111:{l:{110:{l:{59:{c:[933]}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[366]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119984]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[360]}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[220]}},c:[220]}}}}}}},86:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8875]}}}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[10987]}}}}}}},99:{l:{121:{l:{59:{c:[1042]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8873]},108:{l:{59:{c:[10982]}}}}}}}}}}},101:{l:{101:{l:{59:{c:[8897]}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[8214]}}}}}}},116:{l:{59:{c:[8214]},105:{l:{99:{l:{97:{l:{108:{l:{66:{l:{97:{l:{114:{l:{59:{c:[8739]}}}}}}},76:{l:{105:{l:{110:{l:{101:{l:{59:{c:[124]}}}}}}}}},83:{l:{101:{l:{112:{l:{97:{l:{114:{l:{97:{l:{116:{l:{111:{l:{114:{l:{59:{c:[10072]}}}}}}}}}}}}}}}}}}},84:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[8768]}}}}}}}}}}}}}}}}}}}}},121:{l:{84:{l:{104:{l:{105:{l:{110:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8202]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120089]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120141]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119985]}}}}}}},118:{l:{100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8874]}}}}}}}}}}}}},87:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[372]}}}}}}}}},101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}},102:{l:{114:{l:{59:{c:[120090]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120142]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119986]}}}}}}}}},88:{l:{102:{l:{114:{l:{59:{c:[120091]}}}}},105:{l:{59:{c:[926]}}},111:{l:{112:{l:{102:{l:{59:{c:[120143]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119987]}}}}}}}}},89:{l:{65:{l:{99:{l:{121:{l:{59:{c:[1071]}}}}}}},73:{l:{99:{l:{121:{l:{59:{c:[1031]}}}}}}},85:{l:{99:{l:{121:{l:{59:{c:[1070]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[221]}},c:[221]}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[374]}}}}}}},121:{l:{59:{c:[1067]}}}}},102:{l:{114:{l:{59:{c:[120092]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120144]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119988]}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[376]}}}}}}}}},90:{l:{72:{l:{99:{l:{121:{l:{59:{c:[1046]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[377]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[381]}}}}}}}}},121:{l:{59:{c:[1047]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[379]}}}}}}},101:{l:{114:{l:{111:{l:{87:{l:{105:{l:{100:{l:{116:{l:{104:{l:{83:{l:{112:{l:{97:{l:{99:{l:{101:{l:{59:{c:[8203]}}}}}}}}}}}}}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[918]}}}}}}},102:{l:{114:{l:{59:{c:[8488]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[8484]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119989]}}}}}}}}},97:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[225]}},c:[225]}}}}}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[259]}}}}}}}}}}},99:{l:{59:{c:[8766]},69:{l:{59:{c:[8766,819]}}},100:{l:{59:{c:[8767]}}},105:{l:{114:{l:{99:{l:{59:{c:[226]}},c:[226]}}}}},117:{l:{116:{l:{101:{l:{59:{c:[180]}},c:[180]}}}}},121:{l:{59:{c:[1072]}}}}},101:{l:{108:{l:{105:{l:{103:{l:{59:{c:[230]}},c:[230]}}}}}}},102:{l:{59:{c:[8289]},114:{l:{59:{c:[120094]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[224]}},c:[224]}}}}}}}}},108:{l:{101:{l:{102:{l:{115:{l:{121:{l:{109:{l:{59:{c:[8501]}}}}}}}}},112:{l:{104:{l:{59:{c:[8501]}}}}}}},112:{l:{104:{l:{97:{l:{59:{c:[945]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[257]}}}}},108:{l:{103:{l:{59:{c:[10815]}}}}}}},112:{l:{59:{c:[38]}},c:[38]}}},110:{l:{100:{l:{59:{c:[8743]},97:{l:{110:{l:{100:{l:{59:{c:[10837]}}}}}}},100:{l:{59:{c:[10844]}}},115:{l:{108:{l:{111:{l:{112:{l:{101:{l:{59:{c:[10840]}}}}}}}}}}},118:{l:{59:{c:[10842]}}}}},103:{l:{59:{c:[8736]},101:{l:{59:{c:[10660]}}},108:{l:{101:{l:{59:{c:[8736]}}}}},109:{l:{115:{l:{100:{l:{59:{c:[8737]},97:{l:{97:{l:{59:{c:[10664]}}},98:{l:{59:{c:[10665]}}},99:{l:{59:{c:[10666]}}},100:{l:{59:{c:[10667]}}},101:{l:{59:{c:[10668]}}},102:{l:{59:{c:[10669]}}},103:{l:{59:{c:[10670]}}},104:{l:{59:{c:[10671]}}}}}}}}}}},114:{l:{116:{l:{59:{c:[8735]},118:{l:{98:{l:{59:{c:[8894]},100:{l:{59:{c:[10653]}}}}}}}}}}},115:{l:{112:{l:{104:{l:{59:{c:[8738]}}}}},116:{l:{59:{c:[197]}}}}},122:{l:{97:{l:{114:{l:{114:{l:{59:{c:[9084]}}}}}}}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[261]}}}}}}},112:{l:{102:{l:{59:{c:[120146]}}}}}}},112:{l:{59:{c:[8776]},69:{l:{59:{c:[10864]}}},97:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10863]}}}}}}}}},101:{l:{59:{c:[8778]}}},105:{l:{100:{l:{59:{c:[8779]}}}}},111:{l:{115:{l:{59:{c:[39]}}}}},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8776]},101:{l:{113:{l:{59:{c:[8778]}}}}}}}}}}}}}}},114:{l:{105:{l:{110:{l:{103:{l:{59:{c:[229]}},c:[229]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119990]}}}}},116:{l:{59:{c:[42]}}},121:{l:{109:{l:{112:{l:{59:{c:[8776]},101:{l:{113:{l:{59:{c:[8781]}}}}}}}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[227]}},c:[227]}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[228]}},c:[228]}}}}},119:{l:{99:{l:{111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8755]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10769]}}}}}}}}}}},98:{l:{78:{l:{111:{l:{116:{l:{59:{c:[10989]}}}}}}},97:{l:{99:{l:{107:{l:{99:{l:{111:{l:{110:{l:{103:{l:{59:{c:[8780]}}}}}}}}},101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1014]}}}}}}}}}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8245]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8765]},101:{l:{113:{l:{59:{c:[8909]}}}}}}}}}}}}}}},114:{l:{118:{l:{101:{l:{101:{l:{59:{c:[8893]}}}}}}},119:{l:{101:{l:{100:{l:{59:{c:[8965]},103:{l:{101:{l:{59:{c:[8965]}}}}}}}}}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[9141]},116:{l:{98:{l:{114:{l:{107:{l:{59:{c:[9142]}}}}}}}}}}}}}}},99:{l:{111:{l:{110:{l:{103:{l:{59:{c:[8780]}}}}}}},121:{l:{59:{c:[1073]}}}}},100:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8222]}}}}}}}}},101:{l:{99:{l:{97:{l:{117:{l:{115:{l:{59:{c:[8757]},101:{l:{59:{c:[8757]}}}}}}}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10672]}}}}}}}}}}},112:{l:{115:{l:{105:{l:{59:{c:[1014]}}}}}}},114:{l:{110:{l:{111:{l:{117:{l:{59:{c:[8492]}}}}}}}}},116:{l:{97:{l:{59:{c:[946]}}},104:{l:{59:{c:[8502]}}},119:{l:{101:{l:{101:{l:{110:{l:{59:{c:[8812]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120095]}}}}},105:{l:{103:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8898]}}}}},105:{l:{114:{l:{99:{l:{59:{c:[9711]}}}}}}},117:{l:{112:{l:{59:{c:[8899]}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[10752]}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10753]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10754]}}}}}}}}}}}}},115:{l:{113:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10758]}}}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[9733]}}}}}}}}},116:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9661]}}}}}}}}},117:{l:{112:{l:{59:{c:[9651]}}}}}}}}}}}}}}}}}}}}},117:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10756]}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8897]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}}}}}}}},107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10509]}}}}}}}}}}},108:{l:{97:{l:{99:{l:{107:{l:{108:{l:{111:{l:{122:{l:{101:{l:{110:{l:{103:{l:{101:{l:{59:{c:[10731]}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[9642]}}}}}}}}}}}}},116:{l:{114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[9652]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9662]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[9666]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[9656]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},110:{l:{107:{l:{59:{c:[9251]}}}}}}},107:{l:{49:{l:{50:{l:{59:{c:[9618]}}},52:{l:{59:{c:[9617]}}}}},51:{l:{52:{l:{59:{c:[9619]}}}}}}},111:{l:{99:{l:{107:{l:{59:{c:[9608]}}}}}}}}},110:{l:{101:{l:{59:{c:[61,8421]},113:{l:{117:{l:{105:{l:{118:{l:{59:{c:[8801,8421]}}}}}}}}}}},111:{l:{116:{l:{59:{c:[8976]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120147]}}}}},116:{l:{59:{c:[8869]},116:{l:{111:{l:{109:{l:{59:{c:[8869]}}}}}}}}},119:{l:{116:{l:{105:{l:{101:{l:{59:{c:[8904]}}}}}}}}},120:{l:{68:{l:{76:{l:{59:{c:[9559]}}},82:{l:{59:{c:[9556]}}},108:{l:{59:{c:[9558]}}},114:{l:{59:{c:[9555]}}}}},72:{l:{59:{c:[9552]},68:{l:{59:{c:[9574]}}},85:{l:{59:{c:[9577]}}},100:{l:{59:{c:[9572]}}},117:{l:{59:{c:[9575]}}}}},85:{l:{76:{l:{59:{c:[9565]}}},82:{l:{59:{c:[9562]}}},108:{l:{59:{c:[9564]}}},114:{l:{59:{c:[9561]}}}}},86:{l:{59:{c:[9553]},72:{l:{59:{c:[9580]}}},76:{l:{59:{c:[9571]}}},82:{l:{59:{c:[9568]}}},104:{l:{59:{c:[9579]}}},108:{l:{59:{c:[9570]}}},114:{l:{59:{c:[9567]}}}}},98:{l:{111:{l:{120:{l:{59:{c:[10697]}}}}}}},100:{l:{76:{l:{59:{c:[9557]}}},82:{l:{59:{c:[9554]}}},108:{l:{59:{c:[9488]}}},114:{l:{59:{c:[9484]}}}}},104:{l:{59:{c:[9472]},68:{l:{59:{c:[9573]}}},85:{l:{59:{c:[9576]}}},100:{l:{59:{c:[9516]}}},117:{l:{59:{c:[9524]}}}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8863]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8862]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8864]}}}}}}}}}}},117:{l:{76:{l:{59:{c:[9563]}}},82:{l:{59:{c:[9560]}}},108:{l:{59:{c:[9496]}}},114:{l:{59:{c:[9492]}}}}},118:{l:{59:{c:[9474]},72:{l:{59:{c:[9578]}}},76:{l:{59:{c:[9569]}}},82:{l:{59:{c:[9566]}}},104:{l:{59:{c:[9532]}}},108:{l:{59:{c:[9508]}}},114:{l:{59:{c:[9500]}}}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8245]}}}}}}}}}}},114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[728]}}}}}}},118:{l:{98:{l:{97:{l:{114:{l:{59:{c:[166]}},c:[166]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119991]}}}}},101:{l:{109:{l:{105:{l:{59:{c:[8271]}}}}}}},105:{l:{109:{l:{59:{c:[8765]},101:{l:{59:{c:[8909]}}}}}}},111:{l:{108:{l:{59:{c:[92]},98:{l:{59:{c:[10693]}}},104:{l:{115:{l:{117:{l:{98:{l:{59:{c:[10184]}}}}}}}}}}}}}}},117:{l:{108:{l:{108:{l:{59:{c:[8226]},101:{l:{116:{l:{59:{c:[8226]}}}}}}}}},109:{l:{112:{l:{59:{c:[8782]},69:{l:{59:{c:[10926]}}},101:{l:{59:{c:[8783]},113:{l:{59:{c:[8783]}}}}}}}}}}}}},99:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[263]}}}}}}}}},112:{l:{59:{c:[8745]},97:{l:{110:{l:{100:{l:{59:{c:[10820]}}}}}}},98:{l:{114:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10825]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10827]}}}}},117:{l:{112:{l:{59:{c:[10823]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10816]}}}}}}},115:{l:{59:{c:[8745,65024]}}}}},114:{l:{101:{l:{116:{l:{59:{c:[8257]}}}}},111:{l:{110:{l:{59:{c:[711]}}}}}}}}},99:{l:{97:{l:{112:{l:{115:{l:{59:{c:[10829]}}}}},114:{l:{111:{l:{110:{l:{59:{c:[269]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[231]}},c:[231]}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[265]}}}}}}},117:{l:{112:{l:{115:{l:{59:{c:[10828]},115:{l:{109:{l:{59:{c:[10832]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[267]}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[184]}},c:[184]}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10674]}}}}}}}}}}},110:{l:{116:{l:{59:{c:[162]},101:{l:{114:{l:{100:{l:{111:{l:{116:{l:{59:{c:[183]}}}}}}}}}}}},c:[162]}}}}},102:{l:{114:{l:{59:{c:[120096]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1095]}}}}},101:{l:{99:{l:{107:{l:{59:{c:[10003]},109:{l:{97:{l:{114:{l:{107:{l:{59:{c:[10003]}}}}}}}}}}}}}}},105:{l:{59:{c:[967]}}}}},105:{l:{114:{l:{59:{c:[9675]},69:{l:{59:{c:[10691]}}},99:{l:{59:{c:[710]},101:{l:{113:{l:{59:{c:[8791]}}}}},108:{l:{101:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8634]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8635]}}}}}}}}}}}}}}}}}}}}},100:{l:{82:{l:{59:{c:[174]}}},83:{l:{59:{c:[9416]}}},97:{l:{115:{l:{116:{l:{59:{c:[8859]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[8858]}}}}}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8861]}}}}}}}}}}}}}}}}},101:{l:{59:{c:[8791]}}},102:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10768]}}}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[10991]}}}}}}},115:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10690]}}}}}}}}}}}}},108:{l:{117:{l:{98:{l:{115:{l:{59:{c:[9827]},117:{l:{105:{l:{116:{l:{59:{c:[9827]}}}}}}}}}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[58]},101:{l:{59:{c:[8788]},113:{l:{59:{c:[8788]}}}}}}}}}}},109:{l:{109:{l:{97:{l:{59:{c:[44]},116:{l:{59:{c:[64]}}}}}}},112:{l:{59:{c:[8705]},102:{l:{110:{l:{59:{c:[8728]}}}}},108:{l:{101:{l:{109:{l:{101:{l:{110:{l:{116:{l:{59:{c:[8705]}}}}}}}}},120:{l:{101:{l:{115:{l:{59:{c:[8450]}}}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[8773]},100:{l:{111:{l:{116:{l:{59:{c:[10861]}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8750]}}}}}}}}},112:{l:{102:{l:{59:{c:[120148]}}},114:{l:{111:{l:{100:{l:{59:{c:[8720]}}}}}}},121:{l:{59:{c:[169]},115:{l:{114:{l:{59:{c:[8471]}}}}}},c:[169]}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8629]}}}}}}},111:{l:{115:{l:{115:{l:{59:{c:[10007]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119992]}}}}},117:{l:{98:{l:{59:{c:[10959]},101:{l:{59:{c:[10961]}}}}},112:{l:{59:{c:[10960]},101:{l:{59:{c:[10962]}}}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8943]}}}}}}}}},117:{l:{100:{l:{97:{l:{114:{l:{114:{l:{108:{l:{59:{c:[10552]}}},114:{l:{59:{c:[10549]}}}}}}}}}}},101:{l:{112:{l:{114:{l:{59:{c:[8926]}}}}},115:{l:{99:{l:{59:{c:[8927]}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8630]},112:{l:{59:{c:[10557]}}}}}}}}}}},112:{l:{59:{c:[8746]},98:{l:{114:{l:{99:{l:{97:{l:{112:{l:{59:{c:[10824]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10822]}}}}},117:{l:{112:{l:{59:{c:[10826]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8845]}}}}}}},111:{l:{114:{l:{59:{c:[10821]}}}}},115:{l:{59:{c:[8746,65024]}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8631]},109:{l:{59:{c:[10556]}}}}}}}}},108:{l:{121:{l:{101:{l:{113:{l:{112:{l:{114:{l:{101:{l:{99:{l:{59:{c:[8926]}}}}}}}}},115:{l:{117:{l:{99:{l:{99:{l:{59:{c:[8927]}}}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8910]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8911]}}}}}}}}}}}}}}},114:{l:{101:{l:{110:{l:{59:{c:[164]}},c:[164]}}}}},118:{l:{101:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8630]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8631]}}}}}}}}}}}}}}}}}}}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8910]}}}}}}},119:{l:{101:{l:{100:{l:{59:{c:[8911]}}}}}}}}},119:{l:{99:{l:{111:{l:{110:{l:{105:{l:{110:{l:{116:{l:{59:{c:[8754]}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8753]}}}}}}}}},121:{l:{108:{l:{99:{l:{116:{l:{121:{l:{59:{c:[9005]}}}}}}}}}}}}},100:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8659]}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10597]}}}}}}},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8224]}}}}}}}}},108:{l:{101:{l:{116:{l:{104:{l:{59:{c:[8504]}}}}}}}}},114:{l:{114:{l:{59:{c:[8595]}}}}},115:{l:{104:{l:{59:{c:[8208]},118:{l:{59:{c:[8867]}}}}}}}}},98:{l:{107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10511]}}}}}}}}}}},108:{l:{97:{l:{99:{l:{59:{c:[733]}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[271]}}}}}}}}},121:{l:{59:{c:[1076]}}}}},100:{l:{59:{c:[8518]},97:{l:{103:{l:{103:{l:{101:{l:{114:{l:{59:{c:[8225]}}}}}}}}},114:{l:{114:{l:{59:{c:[8650]}}}}}}},111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[10871]}}}}}}}}}}}}},101:{l:{103:{l:{59:{c:[176]}},c:[176]},108:{l:{116:{l:{97:{l:{59:{c:[948]}}}}}}},109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10673]}}}}}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10623]}}}}}}}}},114:{l:{59:{c:[120097]}}}}},104:{l:{97:{l:{114:{l:{108:{l:{59:{c:[8643]}}},114:{l:{59:{c:[8642]}}}}}}}}},105:{l:{97:{l:{109:{l:{59:{c:[8900]},111:{l:{110:{l:{100:{l:{59:{c:[8900]},115:{l:{117:{l:{105:{l:{116:{l:{59:{c:[9830]}}}}}}}}}}}}}}},115:{l:{59:{c:[9830]}}}}}}},101:{l:{59:{c:[168]}}},103:{l:{97:{l:{109:{l:{109:{l:{97:{l:{59:{c:[989]}}}}}}}}}}},115:{l:{105:{l:{110:{l:{59:{c:[8946]}}}}}}},118:{l:{59:{c:[247]},105:{l:{100:{l:{101:{l:{59:{c:[247]},111:{l:{110:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8903]}}}}}}}}}}}}}}}},c:[247]}}}}},111:{l:{110:{l:{120:{l:{59:{c:[8903]}}}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1106]}}}}}}},108:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8990]}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8973]}}}}}}}}}}},111:{l:{108:{l:{108:{l:{97:{l:{114:{l:{59:{c:[36]}}}}}}}}},112:{l:{102:{l:{59:{c:[120149]}}}}},116:{l:{59:{c:[729]},101:{l:{113:{l:{59:{c:[8784]},100:{l:{111:{l:{116:{l:{59:{c:[8785]}}}}}}}}}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8760]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8724]}}}}}}}}},115:{l:{113:{l:{117:{l:{97:{l:{114:{l:{101:{l:{59:{c:[8865]}}}}}}}}}}}}}}},117:{l:{98:{l:{108:{l:{101:{l:{98:{l:{97:{l:{114:{l:{119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8966]}}}}}}}}}}}}}}}}}}}}}}}}},119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8595]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8650]}}}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8643]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8642]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{98:{l:{107:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10512]}}}}}}}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8991]}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8972]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119993]}}},121:{l:{59:{c:[1109]}}}}},111:{l:{108:{l:{59:{c:[10742]}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[273]}}}}}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8945]}}}}}}},114:{l:{105:{l:{59:{c:[9663]},102:{l:{59:{c:[9662]}}}}}}}}},117:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8693]}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[10607]}}}}}}}}},119:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[10662]}}}}}}}}}}}}},122:{l:{99:{l:{121:{l:{59:{c:[1119]}}}}},105:{l:{103:{l:{114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10239]}}}}}}}}}}}}}}}}},101:{l:{68:{l:{68:{l:{111:{l:{116:{l:{59:{c:[10871]}}}}}}},111:{l:{116:{l:{59:{c:[8785]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[233]}},c:[233]}}}}}}},115:{l:{116:{l:{101:{l:{114:{l:{59:{c:[10862]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[283]}}}}}}}}},105:{l:{114:{l:{59:{c:[8790]},99:{l:{59:{c:[234]}},c:[234]}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8789]}}}}}}}}},121:{l:{59:{c:[1101]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[279]}}}}}}},101:{l:{59:{c:[8519]}}},102:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8786]}}}}}}},114:{l:{59:{c:[120098]}}}}},103:{l:{59:{c:[10906]},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[232]}},c:[232]}}}}}}},115:{l:{59:{c:[10902]},100:{l:{111:{l:{116:{l:{59:{c:[10904]}}}}}}}}}}},108:{l:{59:{c:[10905]},105:{l:{110:{l:{116:{l:{101:{l:{114:{l:{115:{l:{59:{c:[9191]}}}}}}}}}}}}},108:{l:{59:{c:[8467]}}},115:{l:{59:{c:[10901]},100:{l:{111:{l:{116:{l:{59:{c:[10903]}}}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[275]}}}}}}},112:{l:{116:{l:{121:{l:{59:{c:[8709]},115:{l:{101:{l:{116:{l:{59:{c:[8709]}}}}}}},118:{l:{59:{c:[8709]}}}}}}}}},115:{l:{112:{l:{49:{l:{51:{l:{59:{c:[8196]}}},52:{l:{59:{c:[8197]}}}}},59:{c:[8195]}}}}}}},110:{l:{103:{l:{59:{c:[331]}}},115:{l:{112:{l:{59:{c:[8194]}}}}}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[281]}}}}}}},112:{l:{102:{l:{59:{c:[120150]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8917]},115:{l:{108:{l:{59:{c:[10723]}}}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[10865]}}}}}}},115:{l:{105:{l:{59:{c:[949]},108:{l:{111:{l:{110:{l:{59:{c:[949]}}}}}}},118:{l:{59:{c:[1013]}}}}}}}}},113:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[8790]}}}}}}},111:{l:{108:{l:{111:{l:{110:{l:{59:{c:[8789]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8770]}}}}},108:{l:{97:{l:{110:{l:{116:{l:{103:{l:{116:{l:{114:{l:{59:{c:[10902]}}}}}}},108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10901]}}}}}}}}}}}}}}}}}}},117:{l:{97:{l:{108:{l:{115:{l:{59:{c:[61]}}}}}}},101:{l:{115:{l:{116:{l:{59:{c:[8799]}}}}}}},105:{l:{118:{l:{59:{c:[8801]},68:{l:{68:{l:{59:{c:[10872]}}}}}}}}}}},118:{l:{112:{l:{97:{l:{114:{l:{115:{l:{108:{l:{59:{c:[10725]}}}}}}}}}}}}}}},114:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8787]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10609]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8495]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8784]}}}}}}},105:{l:{109:{l:{59:{c:[8770]}}}}}}},116:{l:{97:{l:{59:{c:[951]}}},104:{l:{59:{c:[240]}},c:[240]}}},117:{l:{109:{l:{108:{l:{59:{c:[235]}},c:[235]}}},114:{l:{111:{l:{59:{c:[8364]}}}}}}},120:{l:{99:{l:{108:{l:{59:{c:[33]}}}}},105:{l:{115:{l:{116:{l:{59:{c:[8707]}}}}}}},112:{l:{101:{l:{99:{l:{116:{l:{97:{l:{116:{l:{105:{l:{111:{l:{110:{l:{59:{c:[8496]}}}}}}}}}}}}}}}}},111:{l:{110:{l:{101:{l:{110:{l:{116:{l:{105:{l:{97:{l:{108:{l:{101:{l:{59:{c:[8519]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{97:{l:{108:{l:{108:{l:{105:{l:{110:{l:{103:{l:{100:{l:{111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[8786]}}}}}}}}}}}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1092]}}}}},101:{l:{109:{l:{97:{l:{108:{l:{101:{l:{59:{c:[9792]}}}}}}}}}}},102:{l:{105:{l:{108:{l:{105:{l:{103:{l:{59:{c:[64259]}}}}}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64256]}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64260]}}}}}}}}},114:{l:{59:{c:[120099]}}}}},105:{l:{108:{l:{105:{l:{103:{l:{59:{c:[64257]}}}}}}}}},106:{l:{108:{l:{105:{l:{103:{l:{59:{c:[102,106]}}}}}}}}},108:{l:{97:{l:{116:{l:{59:{c:[9837]}}}}},108:{l:{105:{l:{103:{l:{59:{c:[64258]}}}}}}},116:{l:{110:{l:{115:{l:{59:{c:[9649]}}}}}}}}},110:{l:{111:{l:{102:{l:{59:{c:[402]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120151]}}}}},114:{l:{97:{l:{108:{l:{108:{l:{59:{c:[8704]}}}}}}},107:{l:{59:{c:[8916]},118:{l:{59:{c:[10969]}}}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10765]}}}}}}}}}}}}}}},114:{l:{97:{l:{99:{l:{49:{l:{50:{l:{59:{c:[189]}},c:[189]},51:{l:{59:{c:[8531]}}},52:{l:{59:{c:[188]}},c:[188]},53:{l:{59:{c:[8533]}}},54:{l:{59:{c:[8537]}}},56:{l:{59:{c:[8539]}}}}},50:{l:{51:{l:{59:{c:[8532]}}},53:{l:{59:{c:[8534]}}}}},51:{l:{52:{l:{59:{c:[190]}},c:[190]},53:{l:{59:{c:[8535]}}},56:{l:{59:{c:[8540]}}}}},52:{l:{53:{l:{59:{c:[8536]}}}}},53:{l:{54:{l:{59:{c:[8538]}}},56:{l:{59:{c:[8541]}}}}},55:{l:{56:{l:{59:{c:[8542]}}}}}}},115:{l:{108:{l:{59:{c:[8260]}}}}}}},111:{l:{119:{l:{110:{l:{59:{c:[8994]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119995]}}}}}}}}},103:{l:{69:{l:{59:{c:[8807]},108:{l:{59:{c:[10892]}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[501]}}}}}}}}},109:{l:{109:{l:{97:{l:{59:{c:[947]},100:{l:{59:{c:[989]}}}}}}}}},112:{l:{59:{c:[10886]}}}}},98:{l:{114:{l:{101:{l:{118:{l:{101:{l:{59:{c:[287]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[285]}}}}}}},121:{l:{59:{c:[1075]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[289]}}}}}}},101:{l:{59:{c:[8805]},108:{l:{59:{c:[8923]}}},113:{l:{59:{c:[8805]},113:{l:{59:{c:[8807]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10878]}}}}}}}}}}}}},115:{l:{59:{c:[10878]},99:{l:{99:{l:{59:{c:[10921]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10880]},111:{l:{59:{c:[10882]},108:{l:{59:{c:[10884]}}}}}}}}}}},108:{l:{59:{c:[8923,65024]},101:{l:{115:{l:{59:{c:[10900]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120100]}}}}},103:{l:{59:{c:[8811]},103:{l:{59:{c:[8921]}}}}},105:{l:{109:{l:{101:{l:{108:{l:{59:{c:[8503]}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1107]}}}}}}},108:{l:{59:{c:[8823]},69:{l:{59:{c:[10898]}}},97:{l:{59:{c:[10917]}}},106:{l:{59:{c:[10916]}}}}},110:{l:{69:{l:{59:{c:[8809]}}},97:{l:{112:{l:{59:{c:[10890]},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10890]}}}}}}}}}}}}},101:{l:{59:{c:[10888]},113:{l:{59:{c:[10888]},113:{l:{59:{c:[8809]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8935]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120152]}}}}}}},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[96]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8458]}}}}},105:{l:{109:{l:{59:{c:[8819]},101:{l:{59:{c:[10894]}}},108:{l:{59:{c:[10896]}}}}}}}}},116:{l:{59:{c:[62]},99:{l:{99:{l:{59:{c:[10919]}}},105:{l:{114:{l:{59:{c:[10874]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8919]}}}}}}},108:{l:{80:{l:{97:{l:{114:{l:{59:{c:[10645]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[10876]}}}}}}}}}}},114:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10886]}}}}}}}}}}},114:{l:{114:{l:{59:{c:[10616]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8919]}}}}}}},101:{l:{113:{l:{108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8923]}}}}}}}}},113:{l:{108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[10892]}}}}}}}}}}}}}}},108:{l:{101:{l:{115:{l:{115:{l:{59:{c:[8823]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8819]}}}}}}}}}},c:[62]},118:{l:{101:{l:{114:{l:{116:{l:{110:{l:{101:{l:{113:{l:{113:{l:{59:{c:[8809,65024]}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8809,65024]}}}}}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8660]}}}}}}},97:{l:{105:{l:{114:{l:{115:{l:{112:{l:{59:{c:[8202]}}}}}}}}},108:{l:{102:{l:{59:{c:[189]}}}}},109:{l:{105:{l:{108:{l:{116:{l:{59:{c:[8459]}}}}}}}}},114:{l:{100:{l:{99:{l:{121:{l:{59:{c:[1098]}}}}}}},114:{l:{59:{c:[8596]},99:{l:{105:{l:{114:{l:{59:{c:[10568]}}}}}}},119:{l:{59:{c:[8621]}}}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[8463]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[293]}}}}}}}}},101:{l:{97:{l:{114:{l:{116:{l:{115:{l:{59:{c:[9829]},117:{l:{105:{l:{116:{l:{59:{c:[9829]}}}}}}}}}}}}}}},108:{l:{108:{l:{105:{l:{112:{l:{59:{c:[8230]}}}}}}}}},114:{l:{99:{l:{111:{l:{110:{l:{59:{c:[8889]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120101]}}}}},107:{l:{115:{l:{101:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10533]}}}}}}}}}}},119:{l:{97:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10534]}}}}}}}}}}}}}}},111:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8703]}}}}}}},109:{l:{116:{l:{104:{l:{116:{l:{59:{c:[8763]}}}}}}}}},111:{l:{107:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8617]}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8618]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120153]}}}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[8213]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119997]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8463]}}}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[295]}}}}}}}}}}},121:{l:{98:{l:{117:{l:{108:{l:{108:{l:{59:{c:[8259]}}}}}}}}},112:{l:{104:{l:{101:{l:{110:{l:{59:{c:[8208]}}}}}}}}}}}}},105:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[237]}},c:[237]}}}}}}}}},99:{l:{59:{c:[8291]},105:{l:{114:{l:{99:{l:{59:{c:[238]}},c:[238]}}}}},121:{l:{59:{c:[1080]}}}}},101:{l:{99:{l:{121:{l:{59:{c:[1077]}}}}},120:{l:{99:{l:{108:{l:{59:{c:[161]}},c:[161]}}}}}}},102:{l:{102:{l:{59:{c:[8660]}}},114:{l:{59:{c:[120102]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[236]}},c:[236]}}}}}}}}},105:{l:{59:{c:[8520]},105:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10764]}}}}}}},110:{l:{116:{l:{59:{c:[8749]}}}}}}},110:{l:{102:{l:{105:{l:{110:{l:{59:{c:[10716]}}}}}}}}},111:{l:{116:{l:{97:{l:{59:{c:[8489]}}}}}}}}},106:{l:{108:{l:{105:{l:{103:{l:{59:{c:[307]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[299]}}}}},103:{l:{101:{l:{59:{c:[8465]}}},108:{l:{105:{l:{110:{l:{101:{l:{59:{c:[8464]}}}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{59:{c:[8465]}}}}}}}}}}},116:{l:{104:{l:{59:{c:[305]}}}}}}},111:{l:{102:{l:{59:{c:[8887]}}}}},112:{l:{101:{l:{100:{l:{59:{c:[437]}}}}}}}}},110:{l:{59:{c:[8712]},99:{l:{97:{l:{114:{l:{101:{l:{59:{c:[8453]}}}}}}}}},102:{l:{105:{l:{110:{l:{59:{c:[8734]},116:{l:{105:{l:{101:{l:{59:{c:[10717]}}}}}}}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[305]}}}}}}}}},116:{l:{59:{c:[8747]},99:{l:{97:{l:{108:{l:{59:{c:[8890]}}}}}}},101:{l:{103:{l:{101:{l:{114:{l:{115:{l:{59:{c:[8484]}}}}}}}}},114:{l:{99:{l:{97:{l:{108:{l:{59:{c:[8890]}}}}}}}}}}},108:{l:{97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10775]}}}}}}}}}}},112:{l:{114:{l:{111:{l:{100:{l:{59:{c:[10812]}}}}}}}}}}}}},111:{l:{99:{l:{121:{l:{59:{c:[1105]}}}}},103:{l:{111:{l:{110:{l:{59:{c:[303]}}}}}}},112:{l:{102:{l:{59:{c:[120154]}}}}},116:{l:{97:{l:{59:{c:[953]}}}}}}},112:{l:{114:{l:{111:{l:{100:{l:{59:{c:[10812]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[191]}},c:[191]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119998]}}}}},105:{l:{110:{l:{59:{c:[8712]},69:{l:{59:{c:[8953]}}},100:{l:{111:{l:{116:{l:{59:{c:[8949]}}}}}}},115:{l:{59:{c:[8948]},118:{l:{59:{c:[8947]}}}}},118:{l:{59:{c:[8712]}}}}}}}}},116:{l:{59:{c:[8290]},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[297]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1110]}}}}}}},109:{l:{108:{l:{59:{c:[239]}},c:[239]}}}}}}},106:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[309]}}}}}}},121:{l:{59:{c:[1081]}}}}},102:{l:{114:{l:{59:{c:[120103]}}}}},109:{l:{97:{l:{116:{l:{104:{l:{59:{c:[567]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120155]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[119999]}}}}},101:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1112]}}}}}}}}}}},117:{l:{107:{l:{99:{l:{121:{l:{59:{c:[1108]}}}}}}}}}}},107:{l:{97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[954]},118:{l:{59:{c:[1008]}}}}}}}}}}},99:{l:{101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[311]}}}}}}}}},121:{l:{59:{c:[1082]}}}}},102:{l:{114:{l:{59:{c:[120104]}}}}},103:{l:{114:{l:{101:{l:{101:{l:{110:{l:{59:{c:[312]}}}}}}}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1093]}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1116]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120156]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120000]}}}}}}}}},108:{l:{65:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8666]}}}}}}},114:{l:{114:{l:{59:{c:[8656]}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10523]}}}}}}}}}}},66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10510]}}}}}}}}},69:{l:{59:{c:[8806]},103:{l:{59:{c:[10891]}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10594]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[314]}}}}}}}}},101:{l:{109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10676]}}}}}}}}}}}}},103:{l:{114:{l:{97:{l:{110:{l:{59:{c:[8466]}}}}}}}}},109:{l:{98:{l:{100:{l:{97:{l:{59:{c:[955]}}}}}}}}},110:{l:{103:{l:{59:{c:[10216]},100:{l:{59:{c:[10641]}}},108:{l:{101:{l:{59:{c:[10216]}}}}}}}}},112:{l:{59:{c:[10885]}}},113:{l:{117:{l:{111:{l:{59:{c:[171]}},c:[171]}}}}},114:{l:{114:{l:{59:{c:[8592]},98:{l:{59:{c:[8676]},102:{l:{115:{l:{59:{c:[10527]}}}}}}},102:{l:{115:{l:{59:{c:[10525]}}}}},104:{l:{107:{l:{59:{c:[8617]}}}}},108:{l:{112:{l:{59:{c:[8619]}}}}},112:{l:{108:{l:{59:{c:[10553]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[10611]}}}}}}},116:{l:{108:{l:{59:{c:[8610]}}}}}}}}},116:{l:{59:{c:[10923]},97:{l:{105:{l:{108:{l:{59:{c:[10521]}}}}}}},101:{l:{59:{c:[10925]},115:{l:{59:{c:[10925,65024]}}}}}}}}},98:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10508]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10098]}}}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[123]}}},107:{l:{59:{c:[91]}}}}}}},107:{l:{101:{l:{59:{c:[10635]}}},115:{l:{108:{l:{100:{l:{59:{c:[10639]}}},117:{l:{59:{c:[10637]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[318]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[316]}}}}}}},105:{l:{108:{l:{59:{c:[8968]}}}}}}},117:{l:{98:{l:{59:{c:[123]}}}}},121:{l:{59:{c:[1083]}}}}},100:{l:{99:{l:{97:{l:{59:{c:[10550]}}}}},113:{l:{117:{l:{111:{l:{59:{c:[8220]},114:{l:{59:{c:[8222]}}}}}}}}},114:{l:{100:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10599]}}}}}}}}},117:{l:{115:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10571]}}}}}}}}}}}}},115:{l:{104:{l:{59:{c:[8626]}}}}}}},101:{l:{59:{c:[8804]},102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8592]},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[8610]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8637]}}}}}}}}},117:{l:{112:{l:{59:{c:[8636]}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8647]}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8596]},115:{l:{59:{c:[8646]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8651]}}}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{105:{l:{103:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8621]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8907]}}}}}}}}}}}}}}}}}}}}}}}}},103:{l:{59:{c:[8922]}}},113:{l:{59:{c:[8804]},113:{l:{59:{c:[8806]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10877]}}}}}}}}}}}}},115:{l:{59:{c:[10877]},99:{l:{99:{l:{59:{c:[10920]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[10879]},111:{l:{59:{c:[10881]},114:{l:{59:{c:[10883]}}}}}}}}}}},103:{l:{59:{c:[8922,65024]},101:{l:{115:{l:{59:{c:[10899]}}}}}}},115:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10885]}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8918]}}}}}}},101:{l:{113:{l:{103:{l:{116:{l:{114:{l:{59:{c:[8922]}}}}}}},113:{l:{103:{l:{116:{l:{114:{l:{59:{c:[10891]}}}}}}}}}}}}},103:{l:{116:{l:{114:{l:{59:{c:[8822]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8818]}}}}}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10620]}}}}}}}}},108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8970]}}}}}}}}},114:{l:{59:{c:[120105]}}}}},103:{l:{59:{c:[8822]},69:{l:{59:{c:[10897]}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[8637]}}},117:{l:{59:{c:[8636]},108:{l:{59:{c:[10602]}}}}}}}}},98:{l:{108:{l:{107:{l:{59:{c:[9604]}}}}}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1113]}}}}}}},108:{l:{59:{c:[8810]},97:{l:{114:{l:{114:{l:{59:{c:[8647]}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{101:{l:{114:{l:{59:{c:[8990]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[10603]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9722]}}}}}}}}},109:{l:{105:{l:{100:{l:{111:{l:{116:{l:{59:{c:[320]}}}}}}}}},111:{l:{117:{l:{115:{l:{116:{l:{59:{c:[9136]},97:{l:{99:{l:{104:{l:{101:{l:{59:{c:[9136]}}}}}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8808]}}},97:{l:{112:{l:{59:{c:[10889]},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10889]}}}}}}}}}}}}},101:{l:{59:{c:[10887]},113:{l:{59:{c:[10887]},113:{l:{59:{c:[8808]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8934]}}}}}}}}},111:{l:{97:{l:{110:{l:{103:{l:{59:{c:[10220]}}}}},114:{l:{114:{l:{59:{c:[8701]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10214]}}}}}}},110:{l:{103:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10229]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10231]}}}}}}}}}}}}}}}}}}}}}}}}}}}}},109:{l:{97:{l:{112:{l:{115:{l:{116:{l:{111:{l:{59:{c:[10236]}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[10230]}}}}}}}}}}}}}}}}}}}}}}}}},111:{l:{112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8619]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8620]}}}}}}}}}}}}}}}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10629]}}}}},102:{l:{59:{c:[120157]}}},108:{l:{117:{l:{115:{l:{59:{c:[10797]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10804]}}}}}}}}}}},119:{l:{97:{l:{115:{l:{116:{l:{59:{c:[8727]}}}}}}},98:{l:{97:{l:{114:{l:{59:{c:[95]}}}}}}}}},122:{l:{59:{c:[9674]},101:{l:{110:{l:{103:{l:{101:{l:{59:{c:[9674]}}}}}}}}},102:{l:{59:{c:[10731]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[40]},108:{l:{116:{l:{59:{c:[10643]}}}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8646]}}}}}}},99:{l:{111:{l:{114:{l:{110:{l:{101:{l:{114:{l:{59:{c:[8991]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[8651]},100:{l:{59:{c:[10605]}}}}}}}}},109:{l:{59:{c:[8206]}}},116:{l:{114:{l:{105:{l:{59:{c:[8895]}}}}}}}}},115:{l:{97:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8249]}}}}}}}}},99:{l:{114:{l:{59:{c:[120001]}}}}},104:{l:{59:{c:[8624]}}},105:{l:{109:{l:{59:{c:[8818]},101:{l:{59:{c:[10893]}}},103:{l:{59:{c:[10895]}}}}}}},113:{l:{98:{l:{59:{c:[91]}}},117:{l:{111:{l:{59:{c:[8216]},114:{l:{59:{c:[8218]}}}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[322]}}}}}}}}}}},116:{l:{59:{c:[60]},99:{l:{99:{l:{59:{c:[10918]}}},105:{l:{114:{l:{59:{c:[10873]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8918]}}}}}}},104:{l:{114:{l:{101:{l:{101:{l:{59:{c:[8907]}}}}}}}}},105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8905]}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10614]}}}}}}}}},113:{l:{117:{l:{101:{l:{115:{l:{116:{l:{59:{c:[10875]}}}}}}}}}}},114:{l:{80:{l:{97:{l:{114:{l:{59:{c:[10646]}}}}}}},105:{l:{59:{c:[9667]},101:{l:{59:{c:[8884]}}},102:{l:{59:{c:[9666]}}}}}}}},c:[60]},117:{l:{114:{l:{100:{l:{115:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10570]}}}}}}}}}}},117:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10598]}}}}}}}}}}}}},118:{l:{101:{l:{114:{l:{116:{l:{110:{l:{101:{l:{113:{l:{113:{l:{59:{c:[8808,65024]}}}}}}}}}}}}}}},110:{l:{69:{l:{59:{c:[8808,65024]}}}}}}}}},109:{l:{68:{l:{68:{l:{111:{l:{116:{l:{59:{c:[8762]}}}}}}}}},97:{l:{99:{l:{114:{l:{59:{c:[175]}},c:[175]}}},108:{l:{101:{l:{59:{c:[9794]}}},116:{l:{59:{c:[10016]},101:{l:{115:{l:{101:{l:{59:{c:[10016]}}}}}}}}}}},112:{l:{59:{c:[8614]},115:{l:{116:{l:{111:{l:{59:{c:[8614]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8615]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8612]}}}}}}}}},117:{l:{112:{l:{59:{c:[8613]}}}}}}}}}}}}},114:{l:{107:{l:{101:{l:{114:{l:{59:{c:[9646]}}}}}}}}}}},99:{l:{111:{l:{109:{l:{109:{l:{97:{l:{59:{c:[10793]}}}}}}}}},121:{l:{59:{c:[1084]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8212]}}}}}}}}},101:{l:{97:{l:{115:{l:{117:{l:{114:{l:{101:{l:{100:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[8737]}}}}}}}}}}}}}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120106]}}}}},104:{l:{111:{l:{59:{c:[8487]}}}}},105:{l:{99:{l:{114:{l:{111:{l:{59:{c:[181]}},c:[181]}}}}},100:{l:{59:{c:[8739]},97:{l:{115:{l:{116:{l:{59:{c:[42]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10992]}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[183]}},c:[183]}}}}}}},110:{l:{117:{l:{115:{l:{59:{c:[8722]},98:{l:{59:{c:[8863]}}},100:{l:{59:{c:[8760]},117:{l:{59:{c:[10794]}}}}}}}}}}}}},108:{l:{99:{l:{112:{l:{59:{c:[10971]}}}}},100:{l:{114:{l:{59:{c:[8230]}}}}}}},110:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[8723]}}}}}}}}}}},111:{l:{100:{l:{101:{l:{108:{l:{115:{l:{59:{c:[8871]}}}}}}}}},112:{l:{102:{l:{59:{c:[120158]}}}}}}},112:{l:{59:{c:[8723]}}},115:{l:{99:{l:{114:{l:{59:{c:[120002]}}}}},116:{l:{112:{l:{111:{l:{115:{l:{59:{c:[8766]}}}}}}}}}}},117:{l:{59:{c:[956]},108:{l:{116:{l:{105:{l:{109:{l:{97:{l:{112:{l:{59:{c:[8888]}}}}}}}}}}}}},109:{l:{97:{l:{112:{l:{59:{c:[8888]}}}}}}}}}}},110:{l:{71:{l:{103:{l:{59:{c:[8921,824]}}},116:{l:{59:{c:[8811,8402]},118:{l:{59:{c:[8811,824]}}}}}}},76:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8653]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8654]}}}}}}}}}}}}}}}}}}}}}}}}}}},108:{l:{59:{c:[8920,824]}}},116:{l:{59:{c:[8810,8402]},118:{l:{59:{c:[8810,824]}}}}}}},82:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8655]}}}}}}}}}}}}}}}}}}}}},86:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8879]}}}}}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8878]}}}}}}}}}}},97:{l:{98:{l:{108:{l:{97:{l:{59:{c:[8711]}}}}}}},99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[324]}}}}}}}}},110:{l:{103:{l:{59:{c:[8736,8402]}}}}},112:{l:{59:{c:[8777]},69:{l:{59:{c:[10864,824]}}},105:{l:{100:{l:{59:{c:[8779,824]}}}}},111:{l:{115:{l:{59:{c:[329]}}}}},112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8777]}}}}}}}}}}},116:{l:{117:{l:{114:{l:{59:{c:[9838]},97:{l:{108:{l:{59:{c:[9838]},115:{l:{59:{c:[8469]}}}}}}}}}}}}}}},98:{l:{115:{l:{112:{l:{59:{c:[160]}},c:[160]}}},117:{l:{109:{l:{112:{l:{59:{c:[8782,824]},101:{l:{59:{c:[8783,824]}}}}}}}}}}},99:{l:{97:{l:{112:{l:{59:{c:[10819]}}},114:{l:{111:{l:{110:{l:{59:{c:[328]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[326]}}}}}}}}},111:{l:{110:{l:{103:{l:{59:{c:[8775]},100:{l:{111:{l:{116:{l:{59:{c:[10861,824]}}}}}}}}}}}}},117:{l:{112:{l:{59:{c:[10818]}}}}},121:{l:{59:{c:[1085]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8211]}}}}}}}}},101:{l:{59:{c:[8800]},65:{l:{114:{l:{114:{l:{59:{c:[8663]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10532]}}}}},114:{l:{59:{c:[8599]},111:{l:{119:{l:{59:{c:[8599]}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8784,824]}}}}}}},113:{l:{117:{l:{105:{l:{118:{l:{59:{c:[8802]}}}}}}}}},115:{l:{101:{l:{97:{l:{114:{l:{59:{c:[10536]}}}}}}},105:{l:{109:{l:{59:{c:[8770,824]}}}}}}},120:{l:{105:{l:{115:{l:{116:{l:{59:{c:[8708]},115:{l:{59:{c:[8708]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120107]}}}}},103:{l:{69:{l:{59:{c:[8807,824]}}},101:{l:{59:{c:[8817]},113:{l:{59:{c:[8817]},113:{l:{59:{c:[8807,824]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10878,824]}}}}}}}}}}}}},115:{l:{59:{c:[10878,824]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8821]}}}}}}},116:{l:{59:{c:[8815]},114:{l:{59:{c:[8815]}}}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8654]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[8622]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10994]}}}}}}}}},105:{l:{59:{c:[8715]},115:{l:{59:{c:[8956]},100:{l:{59:{c:[8954]}}}}},118:{l:{59:{c:[8715]}}}}},106:{l:{99:{l:{121:{l:{59:{c:[1114]}}}}}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8653]}}}}}}},69:{l:{59:{c:[8806,824]}}},97:{l:{114:{l:{114:{l:{59:{c:[8602]}}}}}}},100:{l:{114:{l:{59:{c:[8229]}}}}},101:{l:{59:{c:[8816]},102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8602]}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8622]}}}}}}}}}}}}}}}}}}}}}}}}},113:{l:{59:{c:[8816]},113:{l:{59:{c:[8806,824]}}},115:{l:{108:{l:{97:{l:{110:{l:{116:{l:{59:{c:[10877,824]}}}}}}}}}}}}},115:{l:{59:{c:[10877,824]},115:{l:{59:{c:[8814]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8820]}}}}}}},116:{l:{59:{c:[8814]},114:{l:{105:{l:{59:{c:[8938]},101:{l:{59:{c:[8940]}}}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120159]}}}}},116:{l:{59:{c:[172]},105:{l:{110:{l:{59:{c:[8713]},69:{l:{59:{c:[8953,824]}}},100:{l:{111:{l:{116:{l:{59:{c:[8949,824]}}}}}}},118:{l:{97:{l:{59:{c:[8713]}}},98:{l:{59:{c:[8951]}}},99:{l:{59:{c:[8950]}}}}}}}}},110:{l:{105:{l:{59:{c:[8716]},118:{l:{97:{l:{59:{c:[8716]}}},98:{l:{59:{c:[8958]}}},99:{l:{59:{c:[8957]}}}}}}}}}},c:[172]}}},112:{l:{97:{l:{114:{l:{59:{c:[8742]},97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8742]}}}}}}}}}}},115:{l:{108:{l:{59:{c:[11005,8421]}}}}},116:{l:{59:{c:[8706,824]}}}}}}},111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10772]}}}}}}}}}}},114:{l:{59:{c:[8832]},99:{l:{117:{l:{101:{l:{59:{c:[8928]}}}}}}},101:{l:{59:{c:[10927,824]},99:{l:{59:{c:[8832]},101:{l:{113:{l:{59:{c:[10927,824]}}}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8655]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[8603]},99:{l:{59:{c:[10547,824]}}},119:{l:{59:{c:[8605,824]}}}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8603]}}}}}}}}}}}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[8939]},101:{l:{59:{c:[8941]}}}}}}}}}}},115:{l:{99:{l:{59:{c:[8833]},99:{l:{117:{l:{101:{l:{59:{c:[8929]}}}}}}},101:{l:{59:{c:[10928,824]}}},114:{l:{59:{c:[120003]}}}}},104:{l:{111:{l:{114:{l:{116:{l:{109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},112:{l:{97:{l:{114:{l:{97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8742]}}}}}}}}}}}}}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[8769]},101:{l:{59:{c:[8772]},113:{l:{59:{c:[8772]}}}}}}}}},109:{l:{105:{l:{100:{l:{59:{c:[8740]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8742]}}}}}}},113:{l:{115:{l:{117:{l:{98:{l:{101:{l:{59:{c:[8930]}}}}},112:{l:{101:{l:{59:{c:[8931]}}}}}}}}}}},117:{l:{98:{l:{59:{c:[8836]},69:{l:{59:{c:[10949,824]}}},101:{l:{59:{c:[8840]}}},115:{l:{101:{l:{116:{l:{59:{c:[8834,8402]},101:{l:{113:{l:{59:{c:[8840]},113:{l:{59:{c:[10949,824]}}}}}}}}}}}}}}},99:{l:{99:{l:{59:{c:[8833]},101:{l:{113:{l:{59:{c:[10928,824]}}}}}}}}},112:{l:{59:{c:[8837]},69:{l:{59:{c:[10950,824]}}},101:{l:{59:{c:[8841]}}},115:{l:{101:{l:{116:{l:{59:{c:[8835,8402]},101:{l:{113:{l:{59:{c:[8841]},113:{l:{59:{c:[10950,824]}}}}}}}}}}}}}}}}}}},116:{l:{103:{l:{108:{l:{59:{c:[8825]}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[241]}},c:[241]}}}}}}},108:{l:{103:{l:{59:{c:[8824]}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8938]},101:{l:{113:{l:{59:{c:[8940]}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8939]},101:{l:{113:{l:{59:{c:[8941]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{59:{c:[957]},109:{l:{59:{c:[35]},101:{l:{114:{l:{111:{l:{59:{c:[8470]}}}}}}},115:{l:{112:{l:{59:{c:[8199]}}}}}}}}},118:{l:{68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8877]}}}}}}}}},72:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10500]}}}}}}}}},97:{l:{112:{l:{59:{c:[8781,8402]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8876]}}}}}}}}},103:{l:{101:{l:{59:{c:[8805,8402]}}},116:{l:{59:{c:[62,8402]}}}}},105:{l:{110:{l:{102:{l:{105:{l:{110:{l:{59:{c:[10718]}}}}}}}}}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10498]}}}}}}},101:{l:{59:{c:[8804,8402]}}},116:{l:{59:{c:[60,8402]},114:{l:{105:{l:{101:{l:{59:{c:[8884,8402]}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10499]}}}}}}},116:{l:{114:{l:{105:{l:{101:{l:{59:{c:[8885,8402]}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764,8402]}}}}}}}}},119:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8662]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10531]}}}}},114:{l:{59:{c:[8598]},111:{l:{119:{l:{59:{c:[8598]}}}}}}}}}}},110:{l:{101:{l:{97:{l:{114:{l:{59:{c:[10535]}}}}}}}}}}}}},111:{l:{83:{l:{59:{c:[9416]}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[243]}},c:[243]}}}}}}},115:{l:{116:{l:{59:{c:[8859]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[8858]},99:{l:{59:{c:[244]}},c:[244]}}}}},121:{l:{59:{c:[1086]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8861]}}}}}}},98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[337]}}}}}}}}},105:{l:{118:{l:{59:{c:[10808]}}}}},111:{l:{116:{l:{59:{c:[8857]}}}}},115:{l:{111:{l:{108:{l:{100:{l:{59:{c:[10684]}}}}}}}}}}},101:{l:{108:{l:{105:{l:{103:{l:{59:{c:[339]}}}}}}}}},102:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10687]}}}}}}},114:{l:{59:{c:[120108]}}}}},103:{l:{111:{l:{110:{l:{59:{c:[731]}}}}},114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[242]}},c:[242]}}}}}}},116:{l:{59:{c:[10689]}}}}},104:{l:{98:{l:{97:{l:{114:{l:{59:{c:[10677]}}}}}}},109:{l:{59:{c:[937]}}}}},105:{l:{110:{l:{116:{l:{59:{c:[8750]}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8634]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10686]}}}}},114:{l:{111:{l:{115:{l:{115:{l:{59:{c:[10683]}}}}}}}}}}},105:{l:{110:{l:{101:{l:{59:{c:[8254]}}}}}}},116:{l:{59:{c:[10688]}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[333]}}}}}}},101:{l:{103:{l:{97:{l:{59:{c:[969]}}}}}}},105:{l:{99:{l:{114:{l:{111:{l:{110:{l:{59:{c:[959]}}}}}}}}},100:{l:{59:{c:[10678]}}},110:{l:{117:{l:{115:{l:{59:{c:[8854]}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120160]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10679]}}}}},101:{l:{114:{l:{112:{l:{59:{c:[10681]}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[8853]}}}}}}}}},114:{l:{59:{c:[8744]},97:{l:{114:{l:{114:{l:{59:{c:[8635]}}}}}}},100:{l:{59:{c:[10845]},101:{l:{114:{l:{59:{c:[8500]},111:{l:{102:{l:{59:{c:[8500]}}}}}}}}},102:{l:{59:{c:[170]}},c:[170]},109:{l:{59:{c:[186]}},c:[186]}}},105:{l:{103:{l:{111:{l:{102:{l:{59:{c:[8886]}}}}}}}}},111:{l:{114:{l:{59:{c:[10838]}}}}},115:{l:{108:{l:{111:{l:{112:{l:{101:{l:{59:{c:[10839]}}}}}}}}}}},118:{l:{59:{c:[10843]}}}}},115:{l:{99:{l:{114:{l:{59:{c:[8500]}}}}},108:{l:{97:{l:{115:{l:{104:{l:{59:{c:[248]}},c:[248]}}}}}}},111:{l:{108:{l:{59:{c:[8856]}}}}}}},116:{l:{105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[245]}},c:[245]}}}}},109:{l:{101:{l:{115:{l:{59:{c:[8855]},97:{l:{115:{l:{59:{c:[10806]}}}}}}}}}}}}}}},117:{l:{109:{l:{108:{l:{59:{c:[246]}},c:[246]}}}}},118:{l:{98:{l:{97:{l:{114:{l:{59:{c:[9021]}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[8741]},97:{l:{59:{c:[182]},108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8741]}}}}}}}}}},c:[182]},115:{l:{105:{l:{109:{l:{59:{c:[10995]}}}}},108:{l:{59:{c:[11005]}}}}},116:{l:{59:{c:[8706]}}}}}}},99:{l:{121:{l:{59:{c:[1087]}}}}},101:{l:{114:{l:{99:{l:{110:{l:{116:{l:{59:{c:[37]}}}}}}},105:{l:{111:{l:{100:{l:{59:{c:[46]}}}}}}},109:{l:{105:{l:{108:{l:{59:{c:[8240]}}}}}}},112:{l:{59:{c:[8869]}}},116:{l:{101:{l:{110:{l:{107:{l:{59:{c:[8241]}}}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120109]}}}}},104:{l:{105:{l:{59:{c:[966]},118:{l:{59:{c:[981]}}}}},109:{l:{109:{l:{97:{l:{116:{l:{59:{c:[8499]}}}}}}}}},111:{l:{110:{l:{101:{l:{59:{c:[9742]}}}}}}}}},105:{l:{59:{c:[960]},116:{l:{99:{l:{104:{l:{102:{l:{111:{l:{114:{l:{107:{l:{59:{c:[8916]}}}}}}}}}}}}}}},118:{l:{59:{c:[982]}}}}},108:{l:{97:{l:{110:{l:{99:{l:{107:{l:{59:{c:[8463]},104:{l:{59:{c:[8462]}}}}}}},107:{l:{118:{l:{59:{c:[8463]}}}}}}}}},117:{l:{115:{l:{59:{c:[43]},97:{l:{99:{l:{105:{l:{114:{l:{59:{c:[10787]}}}}}}}}},98:{l:{59:{c:[8862]}}},99:{l:{105:{l:{114:{l:{59:{c:[10786]}}}}}}},100:{l:{111:{l:{59:{c:[8724]}}},117:{l:{59:{c:[10789]}}}}},101:{l:{59:{c:[10866]}}},109:{l:{110:{l:{59:{c:[177]}},c:[177]}}},115:{l:{105:{l:{109:{l:{59:{c:[10790]}}}}}}},116:{l:{119:{l:{111:{l:{59:{c:[10791]}}}}}}}}}}}}},109:{l:{59:{c:[177]}}},111:{l:{105:{l:{110:{l:{116:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10773]}}}}}}}}}}}}},112:{l:{102:{l:{59:{c:[120161]}}}}},117:{l:{110:{l:{100:{l:{59:{c:[163]}},c:[163]}}}}}}},114:{l:{59:{c:[8826]},69:{l:{59:{c:[10931]}}},97:{l:{112:{l:{59:{c:[10935]}}}}},99:{l:{117:{l:{101:{l:{59:{c:[8828]}}}}}}},101:{l:{59:{c:[10927]},99:{l:{59:{c:[8826]},97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10935]}}}}}}}}}}}}},99:{l:{117:{l:{114:{l:{108:{l:{121:{l:{101:{l:{113:{l:{59:{c:[8828]}}}}}}}}}}}}}}},101:{l:{113:{l:{59:{c:[10927]}}}}},110:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10937]}}}}}}}}}}}}},101:{l:{113:{l:{113:{l:{59:{c:[10933]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8936]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8830]}}}}}}}}}}},105:{l:{109:{l:{101:{l:{59:{c:[8242]},115:{l:{59:{c:[8473]}}}}}}}}},110:{l:{69:{l:{59:{c:[10933]}}},97:{l:{112:{l:{59:{c:[10937]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8936]}}}}}}}}},111:{l:{100:{l:{59:{c:[8719]}}},102:{l:{97:{l:{108:{l:{97:{l:{114:{l:{59:{c:[9006]}}}}}}}}},108:{l:{105:{l:{110:{l:{101:{l:{59:{c:[8978]}}}}}}}}},115:{l:{117:{l:{114:{l:{102:{l:{59:{c:[8979]}}}}}}}}}}},112:{l:{59:{c:[8733]},116:{l:{111:{l:{59:{c:[8733]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8830]}}}}}}},117:{l:{114:{l:{101:{l:{108:{l:{59:{c:[8880]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120005]}}}}},105:{l:{59:{c:[968]}}}}},117:{l:{110:{l:{99:{l:{115:{l:{112:{l:{59:{c:[8200]}}}}}}}}}}}}},113:{l:{102:{l:{114:{l:{59:{c:[120110]}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10764]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120162]}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8279]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120006]}}}}}}},117:{l:{97:{l:{116:{l:{101:{l:{114:{l:{110:{l:{105:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8461]}}}}}}}}}}}}}}},105:{l:{110:{l:{116:{l:{59:{c:[10774]}}}}}}}}}}},101:{l:{115:{l:{116:{l:{59:{c:[63]},101:{l:{113:{l:{59:{c:[8799]}}}}}}}}}}},111:{l:{116:{l:{59:{c:[34]}},c:[34]}}}}}}},114:{l:{65:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8667]}}}}}}},114:{l:{114:{l:{59:{c:[8658]}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10524]}}}}}}}}}}},66:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10511]}}}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10596]}}}}}}},97:{l:{99:{l:{101:{l:{59:{c:[8765,817]}}},117:{l:{116:{l:{101:{l:{59:{c:[341]}}}}}}}}},100:{l:{105:{l:{99:{l:{59:{c:[8730]}}}}}}},101:{l:{109:{l:{112:{l:{116:{l:{121:{l:{118:{l:{59:{c:[10675]}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[10217]},100:{l:{59:{c:[10642]}}},101:{l:{59:{c:[10661]}}},108:{l:{101:{l:{59:{c:[10217]}}}}}}}}},113:{l:{117:{l:{111:{l:{59:{c:[187]}},c:[187]}}}}},114:{l:{114:{l:{59:{c:[8594]},97:{l:{112:{l:{59:{c:[10613]}}}}},98:{l:{59:{c:[8677]},102:{l:{115:{l:{59:{c:[10528]}}}}}}},99:{l:{59:{c:[10547]}}},102:{l:{115:{l:{59:{c:[10526]}}}}},104:{l:{107:{l:{59:{c:[8618]}}}}},108:{l:{112:{l:{59:{c:[8620]}}}}},112:{l:{108:{l:{59:{c:[10565]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[10612]}}}}}}},116:{l:{108:{l:{59:{c:[8611]}}}}},119:{l:{59:{c:[8605]}}}}}}},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[10522]}}}}}}},105:{l:{111:{l:{59:{c:[8758]},110:{l:{97:{l:{108:{l:{115:{l:{59:{c:[8474]}}}}}}}}}}}}}}}}},98:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10509]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10099]}}}}}}},114:{l:{97:{l:{99:{l:{101:{l:{59:{c:[125]}}},107:{l:{59:{c:[93]}}}}}}},107:{l:{101:{l:{59:{c:[10636]}}},115:{l:{108:{l:{100:{l:{59:{c:[10638]}}},117:{l:{59:{c:[10640]}}}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[345]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[343]}}}}}}},105:{l:{108:{l:{59:{c:[8969]}}}}}}},117:{l:{98:{l:{59:{c:[125]}}}}},121:{l:{59:{c:[1088]}}}}},100:{l:{99:{l:{97:{l:{59:{c:[10551]}}}}},108:{l:{100:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10601]}}}}}}}}}}},113:{l:{117:{l:{111:{l:{59:{c:[8221]},114:{l:{59:{c:[8221]}}}}}}}}},115:{l:{104:{l:{59:{c:[8627]}}}}}}},101:{l:{97:{l:{108:{l:{59:{c:[8476]},105:{l:{110:{l:{101:{l:{59:{c:[8475]}}}}}}},112:{l:{97:{l:{114:{l:{116:{l:{59:{c:[8476]}}}}}}}}},115:{l:{59:{c:[8477]}}}}}}},99:{l:{116:{l:{59:{c:[9645]}}}}},103:{l:{59:{c:[174]}},c:[174]}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10621]}}}}}}}}},108:{l:{111:{l:{111:{l:{114:{l:{59:{c:[8971]}}}}}}}}},114:{l:{59:{c:[120111]}}}}},104:{l:{97:{l:{114:{l:{100:{l:{59:{c:[8641]}}},117:{l:{59:{c:[8640]},108:{l:{59:{c:[10604]}}}}}}}}},111:{l:{59:{c:[961]},118:{l:{59:{c:[1009]}}}}}}},105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8594]},116:{l:{97:{l:{105:{l:{108:{l:{59:{c:[8611]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[8641]}}}}}}}}},117:{l:{112:{l:{59:{c:[8640]}}}}}}}}}}}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8644]}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{115:{l:{59:{c:[8652]}}}}}}}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8649]}}}}}}}}}}}}}}}}}}}}}}},115:{l:{113:{l:{117:{l:{105:{l:{103:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8605]}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8908]}}}}}}}}}}}}}}}}}}}}}}}}}}},110:{l:{103:{l:{59:{c:[730]}}}}},115:{l:{105:{l:{110:{l:{103:{l:{100:{l:{111:{l:{116:{l:{115:{l:{101:{l:{113:{l:{59:{c:[8787]}}}}}}}}}}}}}}}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8644]}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[8652]}}}}}}},109:{l:{59:{c:[8207]}}}}},109:{l:{111:{l:{117:{l:{115:{l:{116:{l:{59:{c:[9137]},97:{l:{99:{l:{104:{l:{101:{l:{59:{c:[9137]}}}}}}}}}}}}}}}}}}},110:{l:{109:{l:{105:{l:{100:{l:{59:{c:[10990]}}}}}}}}},111:{l:{97:{l:{110:{l:{103:{l:{59:{c:[10221]}}}}},114:{l:{114:{l:{59:{c:[8702]}}}}}}},98:{l:{114:{l:{107:{l:{59:{c:[10215]}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[10630]}}}}},102:{l:{59:{c:[120163]}}},108:{l:{117:{l:{115:{l:{59:{c:[10798]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[10805]}}}}}}}}}}}}},112:{l:{97:{l:{114:{l:{59:{c:[41]},103:{l:{116:{l:{59:{c:[10644]}}}}}}}}},112:{l:{111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10770]}}}}}}}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8649]}}}}}}}}},115:{l:{97:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8250]}}}}}}}}},99:{l:{114:{l:{59:{c:[120007]}}}}},104:{l:{59:{c:[8625]}}},113:{l:{98:{l:{59:{c:[93]}}},117:{l:{111:{l:{59:{c:[8217]},114:{l:{59:{c:[8217]}}}}}}}}}}},116:{l:{104:{l:{114:{l:{101:{l:{101:{l:{59:{c:[8908]}}}}}}}}},105:{l:{109:{l:{101:{l:{115:{l:{59:{c:[8906]}}}}}}}}},114:{l:{105:{l:{59:{c:[9657]},101:{l:{59:{c:[8885]}}},102:{l:{59:{c:[9656]}}},108:{l:{116:{l:{114:{l:{105:{l:{59:{c:[10702]}}}}}}}}}}}}}}},117:{l:{108:{l:{117:{l:{104:{l:{97:{l:{114:{l:{59:{c:[10600]}}}}}}}}}}}}},120:{l:{59:{c:[8478]}}}}},115:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[347]}}}}}}}}}}},98:{l:{113:{l:{117:{l:{111:{l:{59:{c:[8218]}}}}}}}}},99:{l:{59:{c:[8827]},69:{l:{59:{c:[10932]}}},97:{l:{112:{l:{59:{c:[10936]}}},114:{l:{111:{l:{110:{l:{59:{c:[353]}}}}}}}}},99:{l:{117:{l:{101:{l:{59:{c:[8829]}}}}}}},101:{l:{59:{c:[10928]},100:{l:{105:{l:{108:{l:{59:{c:[351]}}}}}}}}},105:{l:{114:{l:{99:{l:{59:{c:[349]}}}}}}},110:{l:{69:{l:{59:{c:[10934]}}},97:{l:{112:{l:{59:{c:[10938]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8937]}}}}}}}}},112:{l:{111:{l:{108:{l:{105:{l:{110:{l:{116:{l:{59:{c:[10771]}}}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8831]}}}}}}},121:{l:{59:{c:[1089]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8901]},98:{l:{59:{c:[8865]}}},101:{l:{59:{c:[10854]}}}}}}}}},101:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8664]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10533]}}}}},114:{l:{59:{c:[8600]},111:{l:{119:{l:{59:{c:[8600]}}}}}}}}}}},99:{l:{116:{l:{59:{c:[167]}},c:[167]}}},109:{l:{105:{l:{59:{c:[59]}}}}},115:{l:{119:{l:{97:{l:{114:{l:{59:{c:[10537]}}}}}}}}},116:{l:{109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8726]}}}}}}}}},110:{l:{59:{c:[8726]}}}}}}},120:{l:{116:{l:{59:{c:[10038]}}}}}}},102:{l:{114:{l:{59:{c:[120112]},111:{l:{119:{l:{110:{l:{59:{c:[8994]}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{59:{c:[9839]}}}}}}},99:{l:{104:{l:{99:{l:{121:{l:{59:{c:[1097]}}}}}}},121:{l:{59:{c:[1096]}}}}},111:{l:{114:{l:{116:{l:{109:{l:{105:{l:{100:{l:{59:{c:[8739]}}}}}}},112:{l:{97:{l:{114:{l:{97:{l:{108:{l:{108:{l:{101:{l:{108:{l:{59:{c:[8741]}}}}}}}}}}}}}}}}}}}}}}},121:{l:{59:{c:[173]}},c:[173]}}},105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[963]},102:{l:{59:{c:[962]}}},118:{l:{59:{c:[962]}}}}}}}}},109:{l:{59:{c:[8764]},100:{l:{111:{l:{116:{l:{59:{c:[10858]}}}}}}},101:{l:{59:{c:[8771]},113:{l:{59:{c:[8771]}}}}},103:{l:{59:{c:[10910]},69:{l:{59:{c:[10912]}}}}},108:{l:{59:{c:[10909]},69:{l:{59:{c:[10911]}}}}},110:{l:{101:{l:{59:{c:[8774]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10788]}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10610]}}}}}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8592]}}}}}}}}},109:{l:{97:{l:{108:{l:{108:{l:{115:{l:{101:{l:{116:{l:{109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[8726]}}}}}}}}}}}}}}}}}}}}},115:{l:{104:{l:{112:{l:{59:{c:[10803]}}}}}}}}},101:{l:{112:{l:{97:{l:{114:{l:{115:{l:{108:{l:{59:{c:[10724]}}}}}}}}}}}}},105:{l:{100:{l:{59:{c:[8739]}}},108:{l:{101:{l:{59:{c:[8995]}}}}}}},116:{l:{59:{c:[10922]},101:{l:{59:{c:[10924]},115:{l:{59:{c:[10924,65024]}}}}}}}}},111:{l:{102:{l:{116:{l:{99:{l:{121:{l:{59:{c:[1100]}}}}}}}}},108:{l:{59:{c:[47]},98:{l:{59:{c:[10692]},97:{l:{114:{l:{59:{c:[9023]}}}}}}}}},112:{l:{102:{l:{59:{c:[120164]}}}}}}},112:{l:{97:{l:{100:{l:{101:{l:{115:{l:{59:{c:[9824]},117:{l:{105:{l:{116:{l:{59:{c:[9824]}}}}}}}}}}}}},114:{l:{59:{c:[8741]}}}}}}},113:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8851]},115:{l:{59:{c:[8851,65024]}}}}}}},117:{l:{112:{l:{59:{c:[8852]},115:{l:{59:{c:[8852,65024]}}}}}}}}},115:{l:{117:{l:{98:{l:{59:{c:[8847]},101:{l:{59:{c:[8849]}}},115:{l:{101:{l:{116:{l:{59:{c:[8847]},101:{l:{113:{l:{59:{c:[8849]}}}}}}}}}}}}},112:{l:{59:{c:[8848]},101:{l:{59:{c:[8850]}}},115:{l:{101:{l:{116:{l:{59:{c:[8848]},101:{l:{113:{l:{59:{c:[8850]}}}}}}}}}}}}}}}}},117:{l:{59:{c:[9633]},97:{l:{114:{l:{101:{l:{59:{c:[9633]}}},102:{l:{59:{c:[9642]}}}}}}},102:{l:{59:{c:[9642]}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8594]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120008]}}}}},101:{l:{116:{l:{109:{l:{110:{l:{59:{c:[8726]}}}}}}}}},109:{l:{105:{l:{108:{l:{101:{l:{59:{c:[8995]}}}}}}}}},116:{l:{97:{l:{114:{l:{102:{l:{59:{c:[8902]}}}}}}}}}}},116:{l:{97:{l:{114:{l:{59:{c:[9734]},102:{l:{59:{c:[9733]}}}}}}},114:{l:{97:{l:{105:{l:{103:{l:{104:{l:{116:{l:{101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1013]}}}}}}}}}}}}}}},112:{l:{104:{l:{105:{l:{59:{c:[981]}}}}}}}}}}}}}}}}},110:{l:{115:{l:{59:{c:[175]}}}}}}}}},117:{l:{98:{l:{59:{c:[8834]},69:{l:{59:{c:[10949]}}},100:{l:{111:{l:{116:{l:{59:{c:[10941]}}}}}}},101:{l:{59:{c:[8838]},100:{l:{111:{l:{116:{l:{59:{c:[10947]}}}}}}}}},109:{l:{117:{l:{108:{l:{116:{l:{59:{c:[10945]}}}}}}}}},110:{l:{69:{l:{59:{c:[10955]}}},101:{l:{59:{c:[8842]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10943]}}}}}}}}},114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10617]}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8834]},101:{l:{113:{l:{59:{c:[8838]},113:{l:{59:{c:[10949]}}}}}}},110:{l:{101:{l:{113:{l:{59:{c:[8842]},113:{l:{59:{c:[10955]}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[10951]}}}}},117:{l:{98:{l:{59:{c:[10965]}}},112:{l:{59:{c:[10963]}}}}}}}}},99:{l:{99:{l:{59:{c:[8827]},97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10936]}}}}}}}}}}}}},99:{l:{117:{l:{114:{l:{108:{l:{121:{l:{101:{l:{113:{l:{59:{c:[8829]}}}}}}}}}}}}}}},101:{l:{113:{l:{59:{c:[10928]}}}}},110:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[10938]}}}}}}}}}}}}},101:{l:{113:{l:{113:{l:{59:{c:[10934]}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8937]}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8831]}}}}}}}}}}},109:{l:{59:{c:[8721]}}},110:{l:{103:{l:{59:{c:[9834]}}}}},112:{l:{49:{l:{59:{c:[185]}},c:[185]},50:{l:{59:{c:[178]}},c:[178]},51:{l:{59:{c:[179]}},c:[179]},59:{c:[8835]},69:{l:{59:{c:[10950]}}},100:{l:{111:{l:{116:{l:{59:{c:[10942]}}}}},115:{l:{117:{l:{98:{l:{59:{c:[10968]}}}}}}}}},101:{l:{59:{c:[8839]},100:{l:{111:{l:{116:{l:{59:{c:[10948]}}}}}}}}},104:{l:{115:{l:{111:{l:{108:{l:{59:{c:[10185]}}}}},117:{l:{98:{l:{59:{c:[10967]}}}}}}}}},108:{l:{97:{l:{114:{l:{114:{l:{59:{c:[10619]}}}}}}}}},109:{l:{117:{l:{108:{l:{116:{l:{59:{c:[10946]}}}}}}}}},110:{l:{69:{l:{59:{c:[10956]}}},101:{l:{59:{c:[8843]}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10944]}}}}}}}}},115:{l:{101:{l:{116:{l:{59:{c:[8835]},101:{l:{113:{l:{59:{c:[8839]},113:{l:{59:{c:[10950]}}}}}}},110:{l:{101:{l:{113:{l:{59:{c:[8843]},113:{l:{59:{c:[10956]}}}}}}}}}}}}},105:{l:{109:{l:{59:{c:[10952]}}}}},117:{l:{98:{l:{59:{c:[10964]}}},112:{l:{59:{c:[10966]}}}}}}}}}}},119:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8665]}}}}}}},97:{l:{114:{l:{104:{l:{107:{l:{59:{c:[10534]}}}}},114:{l:{59:{c:[8601]},111:{l:{119:{l:{59:{c:[8601]}}}}}}}}}}},110:{l:{119:{l:{97:{l:{114:{l:{59:{c:[10538]}}}}}}}}}}},122:{l:{108:{l:{105:{l:{103:{l:{59:{c:[223]}},c:[223]}}}}}}}}},116:{l:{97:{l:{114:{l:{103:{l:{101:{l:{116:{l:{59:{c:[8982]}}}}}}}}},117:{l:{59:{c:[964]}}}}},98:{l:{114:{l:{107:{l:{59:{c:[9140]}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[357]}}}}}}}}},101:{l:{100:{l:{105:{l:{108:{l:{59:{c:[355]}}}}}}}}},121:{l:{59:{c:[1090]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[8411]}}}}}}},101:{l:{108:{l:{114:{l:{101:{l:{99:{l:{59:{c:[8981]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120113]}}}}},104:{l:{101:{l:{114:{l:{101:{l:{52:{l:{59:{c:[8756]}}},102:{l:{111:{l:{114:{l:{101:{l:{59:{c:[8756]}}}}}}}}}}}}},116:{l:{97:{l:{59:{c:[952]},115:{l:{121:{l:{109:{l:{59:{c:[977]}}}}}}},118:{l:{59:{c:[977]}}}}}}}}},105:{l:{99:{l:{107:{l:{97:{l:{112:{l:{112:{l:{114:{l:{111:{l:{120:{l:{59:{c:[8776]}}}}}}}}}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764]}}}}}}}}}}},110:{l:{115:{l:{112:{l:{59:{c:[8201]}}}}}}}}},107:{l:{97:{l:{112:{l:{59:{c:[8776]}}}}},115:{l:{105:{l:{109:{l:{59:{c:[8764]}}}}}}}}},111:{l:{114:{l:{110:{l:{59:{c:[254]}},c:[254]}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[732]}}}}}}},109:{l:{101:{l:{115:{l:{59:{c:[215]},98:{l:{59:{c:[8864]},97:{l:{114:{l:{59:{c:[10801]}}}}}}},100:{l:{59:{c:[10800]}}}},c:[215]}}}}},110:{l:{116:{l:{59:{c:[8749]}}}}}}},111:{l:{101:{l:{97:{l:{59:{c:[10536]}}}}},112:{l:{59:{c:[8868]},98:{l:{111:{l:{116:{l:{59:{c:[9014]}}}}}}},99:{l:{105:{l:{114:{l:{59:{c:[10993]}}}}}}},102:{l:{59:{c:[120165]},111:{l:{114:{l:{107:{l:{59:{c:[10970]}}}}}}}}}}},115:{l:{97:{l:{59:{c:[10537]}}}}}}},112:{l:{114:{l:{105:{l:{109:{l:{101:{l:{59:{c:[8244]}}}}}}}}}}},114:{l:{97:{l:{100:{l:{101:{l:{59:{c:[8482]}}}}}}},105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[9653]},100:{l:{111:{l:{119:{l:{110:{l:{59:{c:[9663]}}}}}}}}},108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[9667]},101:{l:{113:{l:{59:{c:[8884]}}}}}}}}}}}}},113:{l:{59:{c:[8796]}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[9657]},101:{l:{113:{l:{59:{c:[8885]}}}}}}}}}}}}}}}}}}}}}}}}},100:{l:{111:{l:{116:{l:{59:{c:[9708]}}}}}}},101:{l:{59:{c:[8796]}}},109:{l:{105:{l:{110:{l:{117:{l:{115:{l:{59:{c:[10810]}}}}}}}}}}},112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10809]}}}}}}}}},115:{l:{98:{l:{59:{c:[10701]}}}}},116:{l:{105:{l:{109:{l:{101:{l:{59:{c:[10811]}}}}}}}}}}},112:{l:{101:{l:{122:{l:{105:{l:{117:{l:{109:{l:{59:{c:[9186]}}}}}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120009]}}},121:{l:{59:{c:[1094]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1115]}}}}}}},116:{l:{114:{l:{111:{l:{107:{l:{59:{c:[359]}}}}}}}}}}},119:{l:{105:{l:{120:{l:{116:{l:{59:{c:[8812]}}}}}}},111:{l:{104:{l:{101:{l:{97:{l:{100:{l:{108:{l:{101:{l:{102:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8606]}}}}}}}}}}}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8608]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},117:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8657]}}}}}}},72:{l:{97:{l:{114:{l:{59:{c:[10595]}}}}}}},97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[250]}},c:[250]}}}}}}},114:{l:{114:{l:{59:{c:[8593]}}}}}}},98:{l:{114:{l:{99:{l:{121:{l:{59:{c:[1118]}}}}},101:{l:{118:{l:{101:{l:{59:{c:[365]}}}}}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[251]}},c:[251]}}}}},121:{l:{59:{c:[1091]}}}}},100:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8645]}}}}}}},98:{l:{108:{l:{97:{l:{99:{l:{59:{c:[369]}}}}}}}}},104:{l:{97:{l:{114:{l:{59:{c:[10606]}}}}}}}}},102:{l:{105:{l:{115:{l:{104:{l:{116:{l:{59:{c:[10622]}}}}}}}}},114:{l:{59:{c:[120114]}}}}},103:{l:{114:{l:{97:{l:{118:{l:{101:{l:{59:{c:[249]}},c:[249]}}}}}}}}},104:{l:{97:{l:{114:{l:{108:{l:{59:{c:[8639]}}},114:{l:{59:{c:[8638]}}}}}}},98:{l:{108:{l:{107:{l:{59:{c:[9600]}}}}}}}}},108:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8988]},101:{l:{114:{l:{59:{c:[8988]}}}}}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8975]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9720]}}}}}}}}},109:{l:{97:{l:{99:{l:{114:{l:{59:{c:[363]}}}}}}},108:{l:{59:{c:[168]}},c:[168]}}},111:{l:{103:{l:{111:{l:{110:{l:{59:{c:[371]}}}}}}},112:{l:{102:{l:{59:{c:[120166]}}}}}}},112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8593]}}}}}}}}}}},100:{l:{111:{l:{119:{l:{110:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{59:{c:[8597]}}}}}}}}}}}}}}}}}}},104:{l:{97:{l:{114:{l:{112:{l:{111:{l:{111:{l:{110:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8639]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8638]}}}}}}}}}}}}}}}}}}}}}}}}},108:{l:{117:{l:{115:{l:{59:{c:[8846]}}}}}}},115:{l:{105:{l:{59:{c:[965]},104:{l:{59:{c:[978]}}},108:{l:{111:{l:{110:{l:{59:{c:[965]}}}}}}}}}}},117:{l:{112:{l:{97:{l:{114:{l:{114:{l:{111:{l:{119:{l:{115:{l:{59:{c:[8648]}}}}}}}}}}}}}}}}}}},114:{l:{99:{l:{111:{l:{114:{l:{110:{l:{59:{c:[8989]},101:{l:{114:{l:{59:{c:[8989]}}}}}}}}}}},114:{l:{111:{l:{112:{l:{59:{c:[8974]}}}}}}}}},105:{l:{110:{l:{103:{l:{59:{c:[367]}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9721]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120010]}}}}}}},116:{l:{100:{l:{111:{l:{116:{l:{59:{c:[8944]}}}}}}},105:{l:{108:{l:{100:{l:{101:{l:{59:{c:[361]}}}}}}}}},114:{l:{105:{l:{59:{c:[9653]},102:{l:{59:{c:[9652]}}}}}}}}},117:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8648]}}}}}}},109:{l:{108:{l:{59:{c:[252]}},c:[252]}}}}},119:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{59:{c:[10663]}}}}}}}}}}}}}}},118:{l:{65:{l:{114:{l:{114:{l:{59:{c:[8661]}}}}}}},66:{l:{97:{l:{114:{l:{59:{c:[10984]},118:{l:{59:{c:[10985]}}}}}}}}},68:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8872]}}}}}}}}},97:{l:{110:{l:{103:{l:{114:{l:{116:{l:{59:{c:[10652]}}}}}}}}},114:{l:{101:{l:{112:{l:{115:{l:{105:{l:{108:{l:{111:{l:{110:{l:{59:{c:[1013]}}}}}}}}}}}}}}},107:{l:{97:{l:{112:{l:{112:{l:{97:{l:{59:{c:[1008]}}}}}}}}}}},110:{l:{111:{l:{116:{l:{104:{l:{105:{l:{110:{l:{103:{l:{59:{c:[8709]}}}}}}}}}}}}}}},112:{l:{104:{l:{105:{l:{59:{c:[981]}}}}},105:{l:{59:{c:[982]}}},114:{l:{111:{l:{112:{l:{116:{l:{111:{l:{59:{c:[8733]}}}}}}}}}}}}},114:{l:{59:{c:[8597]},104:{l:{111:{l:{59:{c:[1009]}}}}}}},115:{l:{105:{l:{103:{l:{109:{l:{97:{l:{59:{c:[962]}}}}}}}}},117:{l:{98:{l:{115:{l:{101:{l:{116:{l:{110:{l:{101:{l:{113:{l:{59:{c:[8842,65024]},113:{l:{59:{c:[10955,65024]}}}}}}}}}}}}}}}}},112:{l:{115:{l:{101:{l:{116:{l:{110:{l:{101:{l:{113:{l:{59:{c:[8843,65024]},113:{l:{59:{c:[10956,65024]}}}}}}}}}}}}}}}}}}}}},116:{l:{104:{l:{101:{l:{116:{l:{97:{l:{59:{c:[977]}}}}}}}}},114:{l:{105:{l:{97:{l:{110:{l:{103:{l:{108:{l:{101:{l:{108:{l:{101:{l:{102:{l:{116:{l:{59:{c:[8882]}}}}}}}}},114:{l:{105:{l:{103:{l:{104:{l:{116:{l:{59:{c:[8883]}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}},99:{l:{121:{l:{59:{c:[1074]}}}}},100:{l:{97:{l:{115:{l:{104:{l:{59:{c:[8866]}}}}}}}}},101:{l:{101:{l:{59:{c:[8744]},98:{l:{97:{l:{114:{l:{59:{c:[8891]}}}}}}},101:{l:{113:{l:{59:{c:[8794]}}}}}}},108:{l:{108:{l:{105:{l:{112:{l:{59:{c:[8942]}}}}}}}}},114:{l:{98:{l:{97:{l:{114:{l:{59:{c:[124]}}}}}}},116:{l:{59:{c:[124]}}}}}}},102:{l:{114:{l:{59:{c:[120115]}}}}},108:{l:{116:{l:{114:{l:{105:{l:{59:{c:[8882]}}}}}}}}},110:{l:{115:{l:{117:{l:{98:{l:{59:{c:[8834,8402]}}},112:{l:{59:{c:[8835,8402]}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120167]}}}}}}},112:{l:{114:{l:{111:{l:{112:{l:{59:{c:[8733]}}}}}}}}},114:{l:{116:{l:{114:{l:{105:{l:{59:{c:[8883]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120011]}}}}},117:{l:{98:{l:{110:{l:{69:{l:{59:{c:[10955,65024]}}},101:{l:{59:{c:[8842,65024]}}}}}}},112:{l:{110:{l:{69:{l:{59:{c:[10956,65024]}}},101:{l:{59:{c:[8843,65024]}}}}}}}}}}},122:{l:{105:{l:{103:{l:{122:{l:{97:{l:{103:{l:{59:{c:[10650]}}}}}}}}}}}}}}},119:{l:{99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[373]}}}}}}}}},101:{l:{100:{l:{98:{l:{97:{l:{114:{l:{59:{c:[10847]}}}}}}},103:{l:{101:{l:{59:{c:[8743]},113:{l:{59:{c:[8793]}}}}}}}}},105:{l:{101:{l:{114:{l:{112:{l:{59:{c:[8472]}}}}}}}}}}},102:{l:{114:{l:{59:{c:[120116]}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120168]}}}}}}},112:{l:{59:{c:[8472]}}},114:{l:{59:{c:[8768]},101:{l:{97:{l:{116:{l:{104:{l:{59:{c:[8768]}}}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120012]}}}}}}}}},120:{l:{99:{l:{97:{l:{112:{l:{59:{c:[8898]}}}}},105:{l:{114:{l:{99:{l:{59:{c:[9711]}}}}}}},117:{l:{112:{l:{59:{c:[8899]}}}}}}},100:{l:{116:{l:{114:{l:{105:{l:{59:{c:[9661]}}}}}}}}},102:{l:{114:{l:{59:{c:[120117]}}}}},104:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10234]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10231]}}}}}}}}},105:{l:{59:{c:[958]}}},108:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10232]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10229]}}}}}}}}},109:{l:{97:{l:{112:{l:{59:{c:[10236]}}}}}}},110:{l:{105:{l:{115:{l:{59:{c:[8955]}}}}}}},111:{l:{100:{l:{111:{l:{116:{l:{59:{c:[10752]}}}}}}},112:{l:{102:{l:{59:{c:[120169]}}},108:{l:{117:{l:{115:{l:{59:{c:[10753]}}}}}}}}},116:{l:{105:{l:{109:{l:{101:{l:{59:{c:[10754]}}}}}}}}}}},114:{l:{65:{l:{114:{l:{114:{l:{59:{c:[10233]}}}}}}},97:{l:{114:{l:{114:{l:{59:{c:[10230]}}}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120013]}}}}},113:{l:{99:{l:{117:{l:{112:{l:{59:{c:[10758]}}}}}}}}}}},117:{l:{112:{l:{108:{l:{117:{l:{115:{l:{59:{c:[10756]}}}}}}}}},116:{l:{114:{l:{105:{l:{59:{c:[9651]}}}}}}}}},118:{l:{101:{l:{101:{l:{59:{c:[8897]}}}}}}},119:{l:{101:{l:{100:{l:{103:{l:{101:{l:{59:{c:[8896]}}}}}}}}}}}}},121:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[253]}},c:[253]}}}}},121:{l:{59:{c:[1103]}}}}}}},99:{l:{105:{l:{114:{l:{99:{l:{59:{c:[375]}}}}}}},121:{l:{59:{c:[1099]}}}}},101:{l:{110:{l:{59:{c:[165]}},c:[165]}}},102:{l:{114:{l:{59:{c:[120118]}}}}},105:{l:{99:{l:{121:{l:{59:{c:[1111]}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120170]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120014]}}}}}}},117:{l:{99:{l:{121:{l:{59:{c:[1102]}}}}},109:{l:{108:{l:{59:{c:[255]}},c:[255]}}}}}}},122:{l:{97:{l:{99:{l:{117:{l:{116:{l:{101:{l:{59:{c:[378]}}}}}}}}}}},99:{l:{97:{l:{114:{l:{111:{l:{110:{l:{59:{c:[382]}}}}}}}}},121:{l:{59:{c:[1079]}}}}},100:{l:{111:{l:{116:{l:{59:{c:[380]}}}}}}},101:{l:{101:{l:{116:{l:{114:{l:{102:{l:{59:{c:[8488]}}}}}}}}},116:{l:{97:{l:{59:{c:[950]}}}}}}},102:{l:{114:{l:{59:{c:[120119]}}}}},104:{l:{99:{l:{121:{l:{59:{c:[1078]}}}}}}},105:{l:{103:{l:{114:{l:{97:{l:{114:{l:{114:{l:{59:{c:[8669]}}}}}}}}}}}}},111:{l:{112:{l:{102:{l:{59:{c:[120171]}}}}}}},115:{l:{99:{l:{114:{l:{59:{c:[120015]}}}}}}},119:{l:{106:{l:{59:{c:[8205]}}},110:{l:{106:{l:{59:{c:[8204]}}}}}}}}}};
-//12.2.5.4.18 The "in template" insertion mode
-//------------------------------------------------------------------
-function startTagInTemplate(p, token) {
- var tn = token.tagName;
+},{}],99:[function(require,module,exports){
+'use strict';
+
+var UNICODE = require('../common/unicode');
+
+//Aliases
+var $ = UNICODE.CODE_POINTS;
+
+//Utils
+
+//OPTIMIZATION: these utility functions should not be moved out of this module. V8 Crankshaft will not inline
+//this functions if they will be situated in another module due to context switch.
+//Always perform inlining check before modifying this functions ('node --trace-inlining').
+function isSurrogatePair(cp1, cp2) {
+ return cp1 >= 0xD800 && cp1 <= 0xDBFF && cp2 >= 0xDC00 && cp2 <= 0xDFFF;
+}
+
+function getSurrogatePairCodePoint(cp1, cp2) {
+ return (cp1 - 0xD800) * 0x400 + 0x2400 + cp2;
+}
+
+//Preprocessor
+//NOTE: HTML input preprocessing
+//(see: http://www.whatwg.org/specs/web-apps/current-work/multipage/parsing.html#preprocessing-the-input-stream)
+var Preprocessor = module.exports = function () {
+ this.html = null;
+
+ this.pos = -1;
+ this.lastGapPos = -1;
+
+ this.gapStack = [];
+
+ this.skipNextNewLine = false;
+
+ this.lastChunkWritten = false;
+ this.endOfChunkHit = false;
+};
+
+
+Preprocessor.prototype._addGap = function () {
+ this.gapStack.push(this.lastGapPos);
+ this.lastGapPos = this.pos;
+};
+
+Preprocessor.prototype._processHighRangeCodePoint = function (cp) {
+ //NOTE: try to peek a surrogate pair
+ if (this.pos !== this.lastCharPos) {
+ var nextCp = this.html.charCodeAt(this.pos + 1);
+
+ if (isSurrogatePair(cp, nextCp)) {
+ //NOTE: we have a surrogate pair. Peek pair character and recalculate code point.
+ this.pos++;
+ cp = getSurrogatePairCodePoint(cp, nextCp);
+
+ //NOTE: add gap that should be avoided during retreat
+ this._addGap();
+ }
+ }
+
+ // NOTE: we've hit the end of chunk, stop processing at this point
+ else if (!this.lastChunkWritten) {
+ this.endOfChunkHit = true;
+ return $.EOF;
+ }
+
+ return cp;
+};
+
+Preprocessor.prototype.write = function (chunk, isLastChunk) {
+ if (this.html)
+ this.html += chunk;
+
+ else
+ this.html = chunk;
+
+ this.lastCharPos = this.html.length - 1;
+ this.endOfChunkHit = false;
+ this.lastChunkWritten = isLastChunk;
+};
+
+Preprocessor.prototype.insertHtmlAtCurrentPos = function (chunk) {
+ this.html = this.html.substring(0, this.pos + 1) +
+ chunk +
+ this.html.substring(this.pos + 1, this.html.length);
+
+ this.lastCharPos = this.html.length - 1;
+ this.endOfChunkHit = false;
+};
+
+
+Preprocessor.prototype.advance = function () {
+ this.pos++;
+
+ if (this.pos > this.lastCharPos) {
+ if (!this.lastChunkWritten)
+ this.endOfChunkHit = true;
+
+ return $.EOF;
+ }
+
+ var cp = this.html.charCodeAt(this.pos);
+
+ //NOTE: any U+000A LINE FEED (LF) characters that immediately follow a U+000D CARRIAGE RETURN (CR) character
+ //must be ignored.
+ if (this.skipNextNewLine && cp === $.LINE_FEED) {
+ this.skipNextNewLine = false;
+ this._addGap();
+ return this.advance();
+ }
+
+ //NOTE: all U+000D CARRIAGE RETURN (CR) characters must be converted to U+000A LINE FEED (LF) characters
+ if (cp === $.CARRIAGE_RETURN) {
+ this.skipNextNewLine = true;
+ return $.LINE_FEED;
+ }
+
+ this.skipNextNewLine = false;
+
+ //OPTIMIZATION: first perform check if the code point in the allowed range that covers most common
+ //HTML input (e.g. ASCII codes) to avoid performance-cost operations for high-range code points.
+ return cp >= 0xD800 ? this._processHighRangeCodePoint(cp) : cp;
+};
+
+Preprocessor.prototype.retreat = function () {
+ if (this.pos === this.lastGapPos) {
+ this.lastGapPos = this.gapStack.pop();
+ this.pos--;
+ }
+
+ this.pos--;
+};
+
- if (tn === $.BASE || tn === $.BASEFONT || tn === $.BGSOUND || tn === $.LINK || tn === $.META ||
- tn === $.NOFRAMES || tn === $.SCRIPT || tn === $.STYLE || tn === $.TEMPLATE || tn === $.TITLE) {
- startTagInHead(p, token);
- }
+},{"../common/unicode":84}],100:[function(require,module,exports){
+'use strict';
+
+/**
+ * @typedef {Object} TreeAdapter
+ */
+
+//Node construction
+
+/**
+ * Creates a document node.
+ *
+ * @function createDocument
+ * @memberof TreeAdapter
+ *
+ * @returns {ASTNode} document
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L19|default implementation.}
+ */
+exports.createDocument = function () {
+ return {
+ nodeName: '#document',
+ quirksMode: false,
+ childNodes: []
+ };
+};
+
+/**
+ * Creates a document fragment node.
+ *
+ * @function createDocumentFragment
+ * @memberof TreeAdapter
+ *
+ * @returns {ASTNode} fragment
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L37|default implementation.}
+ */
+exports.createDocumentFragment = function () {
+ return {
+ nodeName: '#document-fragment',
+ quirksMode: false,
+ childNodes: []
+ };
+};
+
+
+/**
+ * Creates an element node.
+ *
+ * @function createElement
+ * @memberof TreeAdapter
+ *
+ * @param {String} tagName - Tag name of the element.
+ * @param {String} namespaceURI - Namespace of the element.
+ * @param {Array} attrs - Attribute name-value pair array.
+ * Foreign attributes may contain `namespace` and `prefix` fields as well.
+ *
+ * @returns {ASTNode} element
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L61|default implementation.}
+ */
+exports.createElement = function (tagName, namespaceURI, attrs) {
+ return {
+ nodeName: tagName,
+ tagName: tagName,
+ attrs: attrs,
+ namespaceURI: namespaceURI,
+ childNodes: [],
+ parentNode: null
+ };
+};
+
+
+/**
+ * Creates a comment node.
+ *
+ * @function createCommentNode
+ * @memberof TreeAdapter
+ *
+ * @param {String} data - Comment text.
+ *
+ * @returns {ASTNode} comment
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L85|default implementation.}
+ */
+exports.createCommentNode = function (data) {
+ return {
+ nodeName: '#comment',
+ data: data,
+ parentNode: null
+ };
+};
+
+var createTextNode = function (value) {
+ return {
+ nodeName: '#text',
+ value: value,
+ parentNode: null
+ };
+};
+
+
+//Tree mutation
+/**
+ * Appends a child node to the given parent node.
+ *
+ * @function appendChild
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} parentNode - Parent node.
+ * @param {ASTNode} newNode - Child node.
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L114|default implementation.}
+ */
+var appendChild = exports.appendChild = function (parentNode, newNode) {
+ parentNode.childNodes.push(newNode);
+ newNode.parentNode = parentNode;
+};
+
+/**
+ * Inserts a child node to the given parent node before the given reference node.
+ *
+ * @function insertBefore
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} parentNode - Parent node.
+ * @param {ASTNode} newNode - Child node.
+ * @param {ASTNode} referenceNode - Reference node.
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L131|default implementation.}
+ */
+var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
+ var insertionIdx = parentNode.childNodes.indexOf(referenceNode);
+
+ parentNode.childNodes.splice(insertionIdx, 0, newNode);
+ newNode.parentNode = parentNode;
+};
+
+/**
+ * Sets the `` element content element.
+ *
+ * @function setTemplateContent
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} templateElement - `` element.
+ * @param {ASTNode} contentTemplate - Content element.
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L149|default implementation.}
+ */
+exports.setTemplateContent = function (templateElement, contentElement) {
+ templateElement.content = contentElement;
+};
+
+
+/**
+ * Returns the `` element content element.
+ *
+ * @function getTemplateContent
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} templateElement - `` element.
+
+ * @returns {ASTNode}
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L166|default implementation.}
+ */
+exports.getTemplateContent = function (templateElement) {
+ return templateElement.content;
+};
+
+/**
+ * Sets the document type. If the `document` already contains a document type node, the `name`, `publicId` and `systemId`
+ * properties of this node will be updated with the provided values. Otherwise, creates a new document type node
+ * with the given properties and inserts it into the `document`.
+ *
+ * @function setDocumentType
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} document - Document node.
+ * @param {String} name - Document type name.
+ * @param {String} publicId - Document type public identifier.
+ * @param {String} systemId - Document type system identifier.
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L185|default implementation.}
+ */
+exports.setDocumentType = function (document, name, publicId, systemId) {
+ var doctypeNode = null;
+
+ for (var i = 0; i < document.childNodes.length; i++) {
+ if (document.childNodes[i].nodeName === '#documentType') {
+ doctypeNode = document.childNodes[i];
+ break;
+ }
+ }
+
+ if (doctypeNode) {
+ doctypeNode.name = name;
+ doctypeNode.publicId = publicId;
+ doctypeNode.systemId = systemId;
+ }
+
+ else {
+ appendChild(document, {
+ nodeName: '#documentType',
+ name: name,
+ publicId: publicId,
+ systemId: systemId
+ });
+ }
+};
+
+/**
+ * Sets the document's quirks mode flag.
+ *
+ * @function setQuirksMode
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} document - Document node.
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L221|default implementation.}
+ */
+exports.setQuirksMode = function (document) {
+ document.quirksMode = true;
+};
+
+/**
+ * Determines if the document's quirks mode flag is set.
+ *
+ * @function isQuirksMode
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} document - Document node.
+
+ * @returns {Boolean}
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L237|default implementation.}
+ */
+exports.isQuirksMode = function (document) {
+ return document.quirksMode;
+};
+
+/**
+ * Removes a node from its parent.
+ *
+ * @function detachNode
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L251|default implementation.}
+ */
+exports.detachNode = function (node) {
+ if (node.parentNode) {
+ var idx = node.parentNode.childNodes.indexOf(node);
+
+ node.parentNode.childNodes.splice(idx, 1);
+ node.parentNode = null;
+ }
+};
+
+/**
+ * Inserts text into a node. If the last child of the node is a text node, the provided text will be appended to the
+ * text node content. Otherwise, inserts a new text node with the given text.
+ *
+ *
+ * @function insertText
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} parentNode - Node to insert text into.
+ * @param {String} text - Text to insert.
+
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L273|default implementation.}
+ */
+exports.insertText = function (parentNode, text) {
+ if (parentNode.childNodes.length) {
+ var prevNode = parentNode.childNodes[parentNode.childNodes.length - 1];
+
+ if (prevNode.nodeName === '#text') {
+ prevNode.value += text;
+ return;
+ }
+ }
+
+ appendChild(parentNode, createTextNode(text));
+};
+
+/**
+ * Inserts text into a sibling node that goes before the reference node. If this sibling node is the text node,
+ * the provided text will be appended to the text node content. Otherwise, inserts a new sibling text node with
+ * the given text before the reference node.
+ *
+ *
+ * @function insertTextBefore
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} parentNode - Node to insert text into.
+ * @param {String} text - Text to insert.
+ * @param {ASTNode} referenceNode - Node to insert text before.
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L301|default implementation.}
+ */
+exports.insertTextBefore = function (parentNode, text, referenceNode) {
+ var prevNode = parentNode.childNodes[parentNode.childNodes.indexOf(referenceNode) - 1];
+
+ if (prevNode && prevNode.nodeName === '#text')
+ prevNode.value += text;
+ else
+ insertBefore(parentNode, createTextNode(text), referenceNode);
+};
+
+/**
+ * Copies attributes to the given node. Only attributes that are not yet present in the node are copied.
+ *
+ * @function adoptAttributes
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} recipientNode - Node to copy attributes into.
+ * @param {Array} attrs - Attributes to copy.
+
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L321|default implementation.}
+ */
+exports.adoptAttributes = function (recipientNode, attrs) {
+ var recipientAttrsMap = [];
+
+ for (var i = 0; i < recipientNode.attrs.length; i++)
+ recipientAttrsMap.push(recipientNode.attrs[i].name);
+
+ for (var j = 0; j < attrs.length; j++) {
+ if (recipientAttrsMap.indexOf(attrs[j].name) === -1)
+ recipientNode.attrs.push(attrs[j]);
+ }
+};
+
+
+//Tree traversing
+
+/**
+ * Returns the first child of the given node.
+ *
+ * @function getFirstChild
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+ *
+ * @returns {ASTNode} firstChild
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L348|default implementation.}
+ */
+exports.getFirstChild = function (node) {
+ return node.childNodes[0];
+};
+
+/**
+ * Returns the given node's children in an array.
+ *
+ * @function getChildNodes
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+ *
+ * @returns {Array} children
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L364|default implementation.}
+ */
+exports.getChildNodes = function (node) {
+ return node.childNodes;
+};
+
+/**
+ * Returns the given node's parent.
+ *
+ * @function getParentNode
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+ *
+ * @returns {ASTNode} parent
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L380|default implementation.}
+ */
+exports.getParentNode = function (node) {
+ return node.parentNode;
+};
+
+/**
+ * Returns the given node's attributes in an array, in the form of name-value pairs.
+ * Foreign attributes may contain `namespace` and `prefix` fields as well.
+ *
+ * @function getAttrList
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+ *
+ * @returns {Array} attributes
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L397|default implementation.}
+ */
+exports.getAttrList = function (node) {
+ return node.attrs;
+};
+
+//Node data
+
+/**
+ * Returns the given element's tag name.
+ *
+ * @function getTagName
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} element - Element.
+ *
+ * @returns {String} tagName
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L415|default implementation.}
+ */
+exports.getTagName = function (element) {
+ return element.tagName;
+};
+
+/**
+ * Returns the given element's namespace.
+ *
+ * @function getNamespaceURI
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} element - Element.
+ *
+ * @returns {String} namespaceURI
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L431|default implementation.}
+ */
+exports.getNamespaceURI = function (element) {
+ return element.namespaceURI;
+};
+
+/**
+ * Returns the given text node's content.
+ *
+ * @function getTextNodeContent
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} textNode - Text node.
+ *
+ * @returns {String} text
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L447|default implementation.}
+ */
+exports.getTextNodeContent = function (textNode) {
+ return textNode.value;
+};
+
+/**
+ * Returns the given comment node's content.
+ *
+ * @function getCommentNodeContent
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} commentNode - Comment node.
+ *
+ * @returns {String} commentText
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L463|default implementation.}
+ */
+exports.getCommentNodeContent = function (commentNode) {
+ return commentNode.data;
+};
+
+/**
+ * Returns the given document type node's name.
+ *
+ * @function getDocumentTypeNodeName
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} doctypeNode - Document type node.
+ *
+ * @returns {String} name
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L479|default implementation.}
+ */
+exports.getDocumentTypeNodeName = function (doctypeNode) {
+ return doctypeNode.name;
+};
+
+/**
+ * Returns the given document type node's public identifier.
+ *
+ * @function getDocumentTypeNodePublicId
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} doctypeNode - Document type node.
+ *
+ * @returns {String} publicId
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L495|default implementation.}
+ */
+exports.getDocumentTypeNodePublicId = function (doctypeNode) {
+ return doctypeNode.publicId;
+};
+
+/**
+ * Returns the given document type node's system identifier.
+ *
+ * @function getDocumentTypeNodeSystemId
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} doctypeNode - Document type node.
+ *
+ * @returns {String} systemId
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L511|default implementation.}
+ */
+exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
+ return doctypeNode.systemId;
+};
+
+//Node types
+/**
+ * Determines if the given node is a text node.
+ *
+ * @function isTextNode
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+ *
+ * @returns {Boolean}
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L526|default implementation.}
+ */
+exports.isTextNode = function (node) {
+ return node.nodeName === '#text';
+};
+
+/**
+ * Determines if the given node is a comment node.
+ *
+ * @function isCommentNode
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+ *
+ * @returns {Boolean}
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L544|default implementation.}
+ */
+exports.isCommentNode = function (node) {
+ return node.nodeName === '#comment';
+};
+
+/**
+ * Determines if the given node is a document type node.
+ *
+ * @function isDocumentTypeNode
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+ *
+ * @returns {Boolean}
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L560|default implementation.}
+ */
+exports.isDocumentTypeNode = function (node) {
+ return node.nodeName === '#documentType';
+};
+
+/**
+ * Determines if the given node is an element.
+ *
+ * @function isElementNode
+ * @memberof TreeAdapter
+ *
+ * @param {ASTNode} node - Node.
+ *
+ * @returns {Boolean}
+ *
+ * @see {@link https://github.com/inikulin/parse5/blob/tree-adapter-docs-rev/lib/tree_adapters/default.js#L576|default implementation.}
+ */
+exports.isElementNode = function (node) {
+ return !!node.tagName;
+};
- else {
- var newInsertionMode = TEMPLATE_INSERTION_MODE_SWITCH_MAP[tn] || IN_BODY_MODE;
+},{}],101:[function(require,module,exports){
+'use strict';
+
+var doctype = require('../common/doctype');
+
+//Conversion tables for DOM Level1 structure emulation
+var nodeTypes = {
+ element: 1,
+ text: 3,
+ cdata: 4,
+ comment: 8
+};
+
+var nodePropertyShorthands = {
+ tagName: 'name',
+ childNodes: 'children',
+ parentNode: 'parent',
+ previousSibling: 'prev',
+ nextSibling: 'next',
+ nodeValue: 'data'
+};
+
+//Node
+var Node = function (props) {
+ for (var key in props) {
+ if (props.hasOwnProperty(key))
+ this[key] = props[key];
+ }
+};
+
+Node.prototype = {
+ get firstChild() {
+ var children = this.children;
+
+ return children && children[0] || null;
+ },
+
+ get lastChild() {
+ var children = this.children;
+
+ return children && children[children.length - 1] || null;
+ },
+
+ get nodeType() {
+ return nodeTypes[this.type] || nodeTypes.element;
+ }
+};
+
+Object.keys(nodePropertyShorthands).forEach(function (key) {
+ var shorthand = nodePropertyShorthands[key];
+
+ Object.defineProperty(Node.prototype, key, {
+ get: function () {
+ return this[shorthand] || null;
+ },
+ set: function (val) {
+ this[shorthand] = val;
+ return val;
+ }
+ });
+});
+
+
+//Node construction
+exports.createDocument =
+ exports.createDocumentFragment = function () {
+ return new Node({
+ type: 'root',
+ name: 'root',
+ parent: null,
+ prev: null,
+ next: null,
+ children: []
+ });
+ };
+
+exports.createElement = function (tagName, namespaceURI, attrs) {
+ var attribs = {},
+ attribsNamespace = {},
+ attribsPrefix = {};
+
+ for (var i = 0; i < attrs.length; i++) {
+ var attrName = attrs[i].name;
+
+ attribs[attrName] = attrs[i].value;
+ attribsNamespace[attrName] = attrs[i].namespace;
+ attribsPrefix[attrName] = attrs[i].prefix;
+ }
+
+ return new Node({
+ type: tagName === 'script' || tagName === 'style' ? tagName : 'tag',
+ name: tagName,
+ namespace: namespaceURI,
+ attribs: attribs,
+ 'x-attribsNamespace': attribsNamespace,
+ 'x-attribsPrefix': attribsPrefix,
+ children: [],
+ parent: null,
+ prev: null,
+ next: null
+ });
+};
+
+exports.createCommentNode = function (data) {
+ return new Node({
+ type: 'comment',
+ data: data,
+ parent: null,
+ prev: null,
+ next: null
+ });
+};
+
+var createTextNode = function (value) {
+ return new Node({
+ type: 'text',
+ data: value,
+ parent: null,
+ prev: null,
+ next: null
+ });
+};
+
+
+//Tree mutation
+var appendChild = exports.appendChild = function (parentNode, newNode) {
+ var prev = parentNode.children[parentNode.children.length - 1];
+
+ if (prev) {
+ prev.next = newNode;
+ newNode.prev = prev;
+ }
+
+ parentNode.children.push(newNode);
+ newNode.parent = parentNode;
+};
+
+var insertBefore = exports.insertBefore = function (parentNode, newNode, referenceNode) {
+ var insertionIdx = parentNode.children.indexOf(referenceNode),
+ prev = referenceNode.prev;
+
+ if (prev) {
+ prev.next = newNode;
+ newNode.prev = prev;
+ }
+
+ referenceNode.prev = newNode;
+ newNode.next = referenceNode;
+
+ parentNode.children.splice(insertionIdx, 0, newNode);
+ newNode.parent = parentNode;
+};
+
+exports.setTemplateContent = function (templateElement, contentElement) {
+ appendChild(templateElement, contentElement);
+};
+
+exports.getTemplateContent = function (templateElement) {
+ return templateElement.children[0];
+};
+
+exports.setDocumentType = function (document, name, publicId, systemId) {
+ var data = doctype.serializeContent(name, publicId, systemId),
+ doctypeNode = null;
+
+ for (var i = 0; i < document.children.length; i++) {
+ if (document.children[i].type === 'directive' && document.children[i].name === '!doctype') {
+ doctypeNode = document.children[i];
+ break;
+ }
+ }
+
+ if (doctypeNode) {
+ doctypeNode.data = data;
+ doctypeNode['x-name'] = name;
+ doctypeNode['x-publicId'] = publicId;
+ doctypeNode['x-systemId'] = systemId;
+ }
+
+ else {
+ appendChild(document, new Node({
+ type: 'directive',
+ name: '!doctype',
+ data: data,
+ 'x-name': name,
+ 'x-publicId': publicId,
+ 'x-systemId': systemId
+ }));
+ }
+
+};
+
+exports.setQuirksMode = function (document) {
+ document.quirksMode = true;
+};
+
+exports.isQuirksMode = function (document) {
+ return document.quirksMode;
+};
+
+exports.detachNode = function (node) {
+ if (node.parent) {
+ var idx = node.parent.children.indexOf(node),
+ prev = node.prev,
+ next = node.next;
+
+ node.prev = null;
+ node.next = null;
+
+ if (prev)
+ prev.next = next;
+
+ if (next)
+ next.prev = prev;
+
+ node.parent.children.splice(idx, 1);
+ node.parent = null;
+ }
+};
+
+exports.insertText = function (parentNode, text) {
+ var lastChild = parentNode.children[parentNode.children.length - 1];
+
+ if (lastChild && lastChild.type === 'text')
+ lastChild.data += text;
+ else
+ appendChild(parentNode, createTextNode(text));
+};
+
+exports.insertTextBefore = function (parentNode, text, referenceNode) {
+ var prevNode = parentNode.children[parentNode.children.indexOf(referenceNode) - 1];
+
+ if (prevNode && prevNode.type === 'text')
+ prevNode.data += text;
+ else
+ insertBefore(parentNode, createTextNode(text), referenceNode);
+};
+
+exports.adoptAttributes = function (recipientNode, attrs) {
+ for (var i = 0; i < attrs.length; i++) {
+ var attrName = attrs[i].name;
+
+ if (typeof recipientNode.attribs[attrName] === 'undefined') {
+ recipientNode.attribs[attrName] = attrs[i].value;
+ recipientNode['x-attribsNamespace'][attrName] = attrs[i].namespace;
+ recipientNode['x-attribsPrefix'][attrName] = attrs[i].prefix;
+ }
+ }
+};
+
+
+//Tree traversing
+exports.getFirstChild = function (node) {
+ return node.children[0];
+};
+
+exports.getChildNodes = function (node) {
+ return node.children;
+};
+
+exports.getParentNode = function (node) {
+ return node.parent;
+};
+
+exports.getAttrList = function (node) {
+ var attrList = [];
+
+ for (var name in node.attribs) {
+ if (node.attribs.hasOwnProperty(name)) {
+ attrList.push({
+ name: name,
+ value: node.attribs[name],
+ namespace: node['x-attribsNamespace'][name],
+ prefix: node['x-attribsPrefix'][name]
+ });
+ }
+ }
+
+ return attrList;
+};
+
+
+//Node data
+exports.getTagName = function (element) {
+ return element.name;
+};
+
+exports.getNamespaceURI = function (element) {
+ return element.namespace;
+};
+
+exports.getTextNodeContent = function (textNode) {
+ return textNode.data;
+};
+
+exports.getCommentNodeContent = function (commentNode) {
+ return commentNode.data;
+};
+
+exports.getDocumentTypeNodeName = function (doctypeNode) {
+ return doctypeNode['x-name'];
+};
+
+exports.getDocumentTypeNodePublicId = function (doctypeNode) {
+ return doctypeNode['x-publicId'];
+};
+
+exports.getDocumentTypeNodeSystemId = function (doctypeNode) {
+ return doctypeNode['x-systemId'];
+};
+
+
+//Node types
+exports.isTextNode = function (node) {
+ return node.type === 'text';
+};
+
+exports.isCommentNode = function (node) {
+ return node.type === 'comment';
+};
+
+exports.isDocumentTypeNode = function (node) {
+ return node.type === 'directive' && node.name === '!doctype';
+};
+
+exports.isElementNode = function (node) {
+ return !!node.attribs;
+};
- p._popTmplInsertionMode();
- p._pushTmplInsertionMode(newInsertionMode);
- p.insertionMode = newInsertionMode;
- p._processToken(token);
- }
-}
+},{"../common/doctype":80}],102:[function(require,module,exports){
+(function (Buffer){
+;(function (sax) { // wrapper for non-node envs
+ sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
+ sax.SAXParser = SAXParser
+ sax.SAXStream = SAXStream
+ sax.createStream = createStream
+
+ // When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
+ // When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
+ // since that's the earliest that a buffer overrun could occur. This way, checks are
+ // as rare as required, but as often as necessary to ensure never crossing this bound.
+ // Furthermore, buffers are only tested at most once per write(), so passing a very
+ // large string into write() might have undesirable effects, but this is manageable by
+ // the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
+ // edge case, result in creating at most one complete copy of the string passed in.
+ // Set to Infinity to have unlimited buffers.
+ sax.MAX_BUFFER_LENGTH = 64 * 1024
+
+ var buffers = [
+ 'comment', 'sgmlDecl', 'textNode', 'tagName', 'doctype',
+ 'procInstName', 'procInstBody', 'entity', 'attribName',
+ 'attribValue', 'cdata', 'script'
+ ]
-function endTagInTemplate(p, token) {
- if (token.tagName === $.TEMPLATE)
- endTagInHead(p, token);
-}
+ sax.EVENTS = [
+ 'text',
+ 'processinginstruction',
+ 'sgmldeclaration',
+ 'doctype',
+ 'comment',
+ 'opentagstart',
+ 'attribute',
+ 'opentag',
+ 'closetag',
+ 'opencdata',
+ 'cdata',
+ 'closecdata',
+ 'error',
+ 'end',
+ 'ready',
+ 'script',
+ 'opennamespace',
+ 'closenamespace'
+ ]
-function eofInTemplate(p, token) {
- if (p.openElements.tmplCount > 0) {
- p.openElements.popUntilTemplatePopped();
- p.activeFormattingElements.clearToLastMarker();
- p._popTmplInsertionMode();
- p._resetInsertionMode();
- p._processToken(token);
+ function SAXParser (strict, opt) {
+ if (!(this instanceof SAXParser)) {
+ return new SAXParser(strict, opt)
+ }
+
+ var parser = this
+ clearBuffers(parser)
+ parser.q = parser.c = ''
+ parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
+ parser.opt = opt || {}
+ parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
+ parser.looseCase = parser.opt.lowercase ? 'toLowerCase' : 'toUpperCase'
+ parser.tags = []
+ parser.closed = parser.closedRoot = parser.sawRoot = false
+ parser.tag = parser.error = null
+ parser.strict = !!strict
+ parser.noscript = !!(strict || parser.opt.noscript)
+ parser.state = S.BEGIN
+ parser.strictEntities = parser.opt.strictEntities
+ parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
+ parser.attribList = []
+
+ // namespaces form a prototype chain.
+ // it always points at the current tag,
+ // which protos to its parent tag.
+ if (parser.opt.xmlns) {
+ parser.ns = Object.create(rootNS)
+ }
+
+ // mostly just for error reporting
+ parser.trackPosition = parser.opt.position !== false
+ if (parser.trackPosition) {
+ parser.position = parser.line = parser.column = 0
}
+ emit(parser, 'onready')
+ }
- else
- p.stopped = true;
-}
-
-
-//12.2.5.4.19 The "after body" insertion mode
-//------------------------------------------------------------------
-function startTagAfterBody(p, token) {
- if (token.tagName === $.HTML)
- startTagInBody(p, token);
-
- else
- tokenAfterBody(p, token);
-}
-
-function endTagAfterBody(p, token) {
- if (token.tagName === $.HTML) {
- if (!p.fragmentContext)
- p.insertionMode = AFTER_AFTER_BODY_MODE;
+ if (!Object.create) {
+ Object.create = function (o) {
+ function F () {}
+ F.prototype = o
+ var newf = new F()
+ return newf
}
+ }
- else
- tokenAfterBody(p, token);
-}
-
-function tokenAfterBody(p, token) {
- p.insertionMode = IN_BODY_MODE;
- p._processToken(token);
-}
-
-//12.2.5.4.20 The "in frameset" insertion mode
-//------------------------------------------------------------------
-function startTagInFrameset(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML)
- startTagInBody(p, token);
-
- else if (tn === $.FRAMESET)
- p._insertElement(token, NS.HTML);
-
- else if (tn === $.FRAME)
- p._appendElement(token, NS.HTML);
-
- else if (tn === $.NOFRAMES)
- startTagInHead(p, token);
-}
-
-function endTagInFrameset(p, token) {
- if (token.tagName === $.FRAMESET && !p.openElements.isRootHtmlElementCurrent()) {
- p.openElements.pop();
-
- if (!p.fragmentContext && p.openElements.currentTagName !== $.FRAMESET)
- p.insertionMode = AFTER_FRAMESET_MODE;
+ if (!Object.keys) {
+ Object.keys = function (o) {
+ var a = []
+ for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
+ return a
}
-}
-
-//12.2.5.4.21 The "after frameset" insertion mode
-//------------------------------------------------------------------
-function startTagAfterFrameset(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML)
- startTagInBody(p, token);
-
- else if (tn === $.NOFRAMES)
- startTagInHead(p, token);
-}
-
-function endTagAfterFrameset(p, token) {
- if (token.tagName === $.HTML)
- p.insertionMode = AFTER_AFTER_FRAMESET_MODE;
-}
-
-//12.2.5.4.22 The "after after body" insertion mode
-//------------------------------------------------------------------
-function startTagAfterAfterBody(p, token) {
- if (token.tagName === $.HTML)
- startTagInBody(p, token);
-
- else
- tokenAfterAfterBody(p, token);
-}
-
-function tokenAfterAfterBody(p, token) {
- p.insertionMode = IN_BODY_MODE;
- p._processToken(token);
-}
-
-//12.2.5.4.23 The "after after frameset" insertion mode
-//------------------------------------------------------------------
-function startTagAfterAfterFrameset(p, token) {
- var tn = token.tagName;
-
- if (tn === $.HTML)
- startTagInBody(p, token);
-
- else if (tn === $.NOFRAMES)
- startTagInHead(p, token);
-}
+ }
+ function checkBufferLength (parser) {
+ var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
+ var maxActual = 0
+ for (var i = 0, l = buffers.length; i < l; i++) {
+ var len = parser[buffers[i]].length
+ if (len > maxAllowed) {
+ // Text/cdata nodes can get big, and since they're buffered,
+ // we can get here under normal conditions.
+ // Avoid issues by emitting the text node now,
+ // so at least it won't get any bigger.
+ switch (buffers[i]) {
+ case 'textNode':
+ closeText(parser)
+ break
-//12.2.5.5 The rules for parsing tokens in foreign content
-//------------------------------------------------------------------
-function nullCharacterInForeignContent(p, token) {
- token.chars = UNICODE.REPLACEMENT_CHARACTER;
- p._insertCharacters(token);
-}
+ case 'cdata':
+ emitNode(parser, 'oncdata', parser.cdata)
+ parser.cdata = ''
+ break
-function characterInForeignContent(p, token) {
- p._insertCharacters(token);
- p.framesetOk = false;
-}
+ case 'script':
+ emitNode(parser, 'onscript', parser.script)
+ parser.script = ''
+ break
-function startTagInForeignContent(p, token) {
- if (ForeignContent.causesExit(token) && !p.fragmentContext) {
- while (p.treeAdapter.getNamespaceURI(p.openElements.current) !== NS.HTML &&
- (!p._isMathMLTextIntegrationPoint(p.openElements.current)) &&
- (!p._isHtmlIntegrationPoint(p.openElements.current))) {
- p.openElements.pop();
+ default:
+ error(parser, 'Max buffer length exceeded: ' + buffers[i])
}
-
- p._processToken(token);
+ }
+ maxActual = Math.max(maxActual, len)
}
+ // schedule the next check for the earliest possible buffer overrun.
+ var m = sax.MAX_BUFFER_LENGTH - maxActual
+ parser.bufferCheckPosition = m + parser.position
+ }
- else {
- var current = p._getAdjustedCurrentElement(),
- currentNs = p.treeAdapter.getNamespaceURI(current);
-
- if (currentNs === NS.MATHML)
- ForeignContent.adjustTokenMathMLAttrs(token);
-
- else if (currentNs === NS.SVG) {
- ForeignContent.adjustTokenSVGTagName(token);
- ForeignContent.adjustTokenSVGAttrs(token);
- }
-
- ForeignContent.adjustTokenXMLAttrs(token);
-
- if (token.selfClosing)
- p._appendElement(token, currentNs);
- else
- p._insertElement(token, currentNs);
+ function clearBuffers (parser) {
+ for (var i = 0, l = buffers.length; i < l; i++) {
+ parser[buffers[i]] = ''
}
-}
-
-function endTagInForeignContent(p, token) {
- for (var i = p.openElements.stackTop; i > 0; i--) {
- var element = p.openElements.items[i];
-
- if (p.treeAdapter.getNamespaceURI(element) === NS.HTML) {
- p._processToken(token);
- break;
- }
+ }
- if (p.treeAdapter.getTagName(element).toLowerCase() === token.tagName) {
- p.openElements.popUntilElementPopped(element);
- break;
- }
+ function flushBuffers (parser) {
+ closeText(parser)
+ if (parser.cdata !== '') {
+ emitNode(parser, 'oncdata', parser.cdata)
+ parser.cdata = ''
}
-}
-
-},{"../common/doctype":79,"../common/foreign_content":80,"../common/html":81,"../common/unicode":82,"../common/utils":83,"../tokenization/tokenizer":92,"../tree_adapters/default":93,"./formatting_element_list":95,"./location_info_mixin":96,"./open_element_stack":97}],99:[function(require,module,exports){
-(function (Buffer){
-// wrapper for non-node envs
-;(function (sax) {
-
-sax.parser = function (strict, opt) { return new SAXParser(strict, opt) }
-sax.SAXParser = SAXParser
-sax.SAXStream = SAXStream
-sax.createStream = createStream
-
-// When we pass the MAX_BUFFER_LENGTH position, start checking for buffer overruns.
-// When we check, schedule the next check for MAX_BUFFER_LENGTH - (max(buffer lengths)),
-// since that's the earliest that a buffer overrun could occur. This way, checks are
-// as rare as required, but as often as necessary to ensure never crossing this bound.
-// Furthermore, buffers are only tested at most once per write(), so passing a very
-// large string into write() might have undesirable effects, but this is manageable by
-// the caller, so it is assumed to be safe. Thus, a call to write() may, in the extreme
-// edge case, result in creating at most one complete copy of the string passed in.
-// Set to Infinity to have unlimited buffers.
-sax.MAX_BUFFER_LENGTH = 64 * 1024
-
-var buffers = [
- "comment", "sgmlDecl", "textNode", "tagName", "doctype",
- "procInstName", "procInstBody", "entity", "attribName",
- "attribValue", "cdata", "script"
-]
-
-sax.EVENTS = // for discoverability.
- [ "text"
- , "processinginstruction"
- , "sgmldeclaration"
- , "doctype"
- , "comment"
- , "attribute"
- , "opentag"
- , "closetag"
- , "opencdata"
- , "cdata"
- , "closecdata"
- , "error"
- , "end"
- , "ready"
- , "script"
- , "opennamespace"
- , "closenamespace"
- ]
-
-function SAXParser (strict, opt) {
- if (!(this instanceof SAXParser)) return new SAXParser(strict, opt)
-
- var parser = this
- clearBuffers(parser)
- parser.q = parser.c = ""
- parser.bufferCheckPosition = sax.MAX_BUFFER_LENGTH
- parser.opt = opt || {}
- parser.opt.lowercase = parser.opt.lowercase || parser.opt.lowercasetags
- parser.looseCase = parser.opt.lowercase ? "toLowerCase" : "toUpperCase"
- parser.tags = []
- parser.closed = parser.closedRoot = parser.sawRoot = false
- parser.tag = parser.error = null
- parser.strict = !!strict
- parser.noscript = !!(strict || parser.opt.noscript)
- parser.state = S.BEGIN
- parser.strictEntities = parser.opt.strictEntities
- parser.ENTITIES = parser.strictEntities ? Object.create(sax.XML_ENTITIES) : Object.create(sax.ENTITIES)
- parser.attribList = []
-
- // namespaces form a prototype chain.
- // it always points at the current tag,
- // which protos to its parent tag.
- if (parser.opt.xmlns) parser.ns = Object.create(rootNS)
-
- // mostly just for error reporting
- parser.trackPosition = parser.opt.position !== false
- if (parser.trackPosition) {
- parser.position = parser.line = parser.column = 0
- }
- emit(parser, "onready")
-}
-
-if (!Object.create) Object.create = function (o) {
- function f () { this.__proto__ = o }
- f.prototype = o
- return new f
-}
-
-if (!Object.getPrototypeOf) Object.getPrototypeOf = function (o) {
- return o.__proto__
-}
-
-if (!Object.keys) Object.keys = function (o) {
- var a = []
- for (var i in o) if (o.hasOwnProperty(i)) a.push(i)
- return a
-}
-
-function checkBufferLength (parser) {
- var maxAllowed = Math.max(sax.MAX_BUFFER_LENGTH, 10)
- , maxActual = 0
- for (var i = 0, l = buffers.length; i < l; i ++) {
- var len = parser[buffers[i]].length
- if (len > maxAllowed) {
- // Text/cdata nodes can get big, and since they're buffered,
- // we can get here under normal conditions.
- // Avoid issues by emitting the text node now,
- // so at least it won't get any bigger.
- switch (buffers[i]) {
- case "textNode":
- closeText(parser)
- break
-
- case "cdata":
- emitNode(parser, "oncdata", parser.cdata)
- parser.cdata = ""
- break
-
- case "script":
- emitNode(parser, "onscript", parser.script)
- parser.script = ""
- break
-
- default:
- error(parser, "Max buffer length exceeded: "+buffers[i])
- }
+ if (parser.script !== '') {
+ emitNode(parser, 'onscript', parser.script)
+ parser.script = ''
}
- maxActual = Math.max(maxActual, len)
}
- // schedule the next check for the earliest possible buffer overrun.
- parser.bufferCheckPosition = (sax.MAX_BUFFER_LENGTH - maxActual)
- + parser.position
-}
-
-function clearBuffers (parser) {
- for (var i = 0, l = buffers.length; i < l; i ++) {
- parser[buffers[i]] = ""
- }
-}
-function flushBuffers (parser) {
- closeText(parser)
- if (parser.cdata !== "") {
- emitNode(parser, "oncdata", parser.cdata)
- parser.cdata = ""
+ SAXParser.prototype = {
+ end: function () { end(this) },
+ write: write,
+ resume: function () { this.error = null; return this },
+ close: function () { return this.write(null) },
+ flush: function () { flushBuffers(this) }
}
- if (parser.script !== "") {
- emitNode(parser, "onscript", parser.script)
- parser.script = ""
- }
-}
-SAXParser.prototype =
- { end: function () { end(this) }
- , write: write
- , resume: function () { this.error = null; return this }
- , close: function () { return this.write(null) }
- , flush: function () { flushBuffers(this) }
+ var Stream
+ try {
+ Stream = require('stream').Stream
+ } catch (ex) {
+ Stream = function () {}
}
-try {
- var Stream = require("stream").Stream
-} catch (ex) {
- var Stream = function () {}
-}
-
+ var streamWraps = sax.EVENTS.filter(function (ev) {
+ return ev !== 'error' && ev !== 'end'
+ })
-var streamWraps = sax.EVENTS.filter(function (ev) {
- return ev !== "error" && ev !== "end"
-})
+ function createStream (strict, opt) {
+ return new SAXStream(strict, opt)
+ }
-function createStream (strict, opt) {
- return new SAXStream(strict, opt)
-}
+ function SAXStream (strict, opt) {
+ if (!(this instanceof SAXStream)) {
+ return new SAXStream(strict, opt)
+ }
-function SAXStream (strict, opt) {
- if (!(this instanceof SAXStream)) return new SAXStream(strict, opt)
+ Stream.apply(this)
- Stream.apply(this)
+ this._parser = new SAXParser(strict, opt)
+ this.writable = true
+ this.readable = true
- this._parser = new SAXParser(strict, opt)
- this.writable = true
- this.readable = true
+ var me = this
+ this._parser.onend = function () {
+ me.emit('end')
+ }
- var me = this
+ this._parser.onerror = function (er) {
+ me.emit('error', er)
- this._parser.onend = function () {
- me.emit("end")
- }
+ // if didn't throw, then means error was handled.
+ // go ahead and clear error, so we can write again.
+ me._parser.error = null
+ }
- this._parser.onerror = function (er) {
- me.emit("error", er)
+ this._decoder = null
- // if didn't throw, then means error was handled.
- // go ahead and clear error, so we can write again.
- me._parser.error = null
+ streamWraps.forEach(function (ev) {
+ Object.defineProperty(me, 'on' + ev, {
+ get: function () {
+ return me._parser['on' + ev]
+ },
+ set: function (h) {
+ if (!h) {
+ me.removeAllListeners(ev)
+ me._parser['on' + ev] = h
+ return h
+ }
+ me.on(ev, h)
+ },
+ enumerable: true,
+ configurable: false
+ })
+ })
}
- this._decoder = null;
-
- streamWraps.forEach(function (ev) {
- Object.defineProperty(me, "on" + ev, {
- get: function () { return me._parser["on" + ev] },
- set: function (h) {
- if (!h) {
- me.removeAllListeners(ev)
- return me._parser["on"+ev] = h
- }
- me.on(ev, h)
- },
- enumerable: true,
- configurable: false
- })
+ SAXStream.prototype = Object.create(Stream.prototype, {
+ constructor: {
+ value: SAXStream
+ }
})
-}
-SAXStream.prototype = Object.create(Stream.prototype,
- { constructor: { value: SAXStream } })
-
-SAXStream.prototype.write = function (data) {
- if (typeof Buffer === 'function' &&
+ SAXStream.prototype.write = function (data) {
+ if (typeof Buffer === 'function' &&
typeof Buffer.isBuffer === 'function' &&
Buffer.isBuffer(data)) {
- if (!this._decoder) {
- var SD = require('string_decoder').StringDecoder
- this._decoder = new SD('utf8')
+ if (!this._decoder) {
+ var SD = require('string_decoder').StringDecoder
+ this._decoder = new SD('utf8')
+ }
+ data = this._decoder.write(data)
}
- data = this._decoder.write(data);
- }
-
- this._parser.write(data.toString())
- this.emit("data", data)
- return true
-}
-SAXStream.prototype.end = function (chunk) {
- if (chunk && chunk.length) this.write(chunk)
- this._parser.end()
- return true
-}
+ this._parser.write(data.toString())
+ this.emit('data', data)
+ return true
+ }
-SAXStream.prototype.on = function (ev, handler) {
- var me = this
- if (!me._parser["on"+ev] && streamWraps.indexOf(ev) !== -1) {
- me._parser["on"+ev] = function () {
- var args = arguments.length === 1 ? [arguments[0]]
- : Array.apply(null, arguments)
- args.splice(0, 0, ev)
- me.emit.apply(me, args)
+ SAXStream.prototype.end = function (chunk) {
+ if (chunk && chunk.length) {
+ this.write(chunk)
}
+ this._parser.end()
+ return true
}
- return Stream.prototype.on.call(me, ev, handler)
-}
+ SAXStream.prototype.on = function (ev, handler) {
+ var me = this
+ if (!me._parser['on' + ev] && streamWraps.indexOf(ev) !== -1) {
+ me._parser['on' + ev] = function () {
+ var args = arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments)
+ args.splice(0, 0, ev)
+ me.emit.apply(me, args)
+ }
+ }
+ return Stream.prototype.on.call(me, ev, handler)
+ }
+ // character classes and tokens
+ var whitespace = '\r\n\t '
-// character classes and tokens
-var whitespace = "\r\n\t "
// this really needs to be replaced with character classes.
// XML allows all manner of ridiculous numbers and digits.
- , number = "0124356789"
- , letter = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ var number = '0124356789'
+ var letter = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
+
// (Letter | "_" | ":")
- , quote = "'\""
- , entity = number+letter+"#"
- , attribEnd = whitespace + ">"
- , CDATA = "[CDATA["
- , DOCTYPE = "DOCTYPE"
- , XML_NAMESPACE = "http://www.w3.org/XML/1998/namespace"
- , XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/"
- , rootNS = { xml: XML_NAMESPACE, xmlns: XMLNS_NAMESPACE }
-
-// turn all the string character sets into character class objects.
-whitespace = charClass(whitespace)
-number = charClass(number)
-letter = charClass(letter)
-
-// http://www.w3.org/TR/REC-xml/#NT-NameStartChar
-// This implementation works on strings, a single character at a time
-// as such, it cannot ever support astral-plane characters (10000-EFFFF)
-// without a significant breaking change to either this parser, or the
-// JavaScript language. Implementation of an emoji-capable xml parser
-// is left as an exercise for the reader.
-var nameStart = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD]/
-
-var nameBody = /[:_A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\u00B7\u0300-\u036F\u203F-\u2040\.\d-]/
-
-quote = charClass(quote)
-entity = charClass(entity)
-attribEnd = charClass(attribEnd)
-
-function charClass (str) {
- return str.split("").reduce(function (s, c) {
- s[c] = true
- return s
- }, {})
-}
-
-function isRegExp (c) {
- return Object.prototype.toString.call(c) === '[object RegExp]'
-}
-
-function is (charclass, c) {
- return isRegExp(charclass) ? !!c.match(charclass) : charclass[c]
-}
-
-function not (charclass, c) {
- return !is(charclass, c)
-}
-
-var S = 0
-sax.STATE =
-{ BEGIN : S++ // leading byte order mark or whitespace
-, BEGIN_WHITESPACE : S++ // leading whitespace
-, TEXT : S++ // general stuff
-, TEXT_ENTITY : S++ // & and such.
-, OPEN_WAKA : S++ // <
-, SGML_DECL : S++ //
-, SCRIPT : S++ //