diff --git a/parser.js b/parser.js
index 0936350..3c29951 100644
--- a/parser.js
+++ b/parser.js
@@ -4,9 +4,14 @@ var util = require('util')
var stream = require('stream')
var ParserState = require('./parserState')
-
+var defaults = {
+ resourcePath: '',
+ emitOnNodeName: false,
+ attrsKey: '$',
+ textKey: '_'
+}
function XmlParser (opts) {
- this.opts = opts || {}
+ this.opts = _.defaults(opts, defaults)
this.parserState = new ParserState()
this.parser = new expat.Parser('UTF-8')
// var transformOpts = { readableObjectMode: true }
@@ -29,13 +34,15 @@ XmlParser.prototype.parse = function (chunk) {
var state = this.parserState
var lastIndex
var resourcePath = this.opts.resourcePath
+ var attrsKey = this.opts.attrsKey
+ var textKey = this.opts.textKey
if (state.isRootNode) registerEvents()
if (typeof chunk === 'string') {
- parser.parse('', true)
+ if (!parser.parse('', true)) processError()
} else {
- parser.parse(chunk.toString())
+ if (!parser.parse(chunk.toString())) processError()
}
function registerEvents () {
@@ -59,21 +66,33 @@ XmlParser.prototype.parse = function (chunk) {
})
parser.on('error', function (err) {
- scope.emit('error', new Error(err + 'at line no:' + parser.getCurrentLineNumber() + ' on column no:' + parser.getCurrentColumnNumber()))
+ processError(err)
})
parser.on('end', function () {
+ scope.emit('end')
})
}
+ function processError (err) {
+ var error = ''
+
+ if (err) {
+ error = err
+ } else {
+ error = parser.getError()
+ }
+ scope.emit('error', new Error(error + ' at line no: ' + parser.getCurrentLineNumber()))
+ }
+
function processStartElement (name, attrs) {
if (!name) return
var obj = {}
- if (attrs && !_.isEmpty(attrs)) obj.$ = attrs
+ if (attrs && !_.isEmpty(attrs)) obj[attrsKey] = attrs
var tempObj = state.object
var path = getRelativePath(name)
if (!path) {
- if (attrs && !_.isEmpty(attrs)) state.object.$ = attrs
+ if (attrs && !_.isEmpty(attrs)) state.object[attrsKey] = attrs
return
}
var tokens = path.split('.')
@@ -95,7 +114,7 @@ XmlParser.prototype.parse = function (chunk) {
var rpath = resourcePath.substring(0, index)
if (rpath === state.currentPath) {
- if (scope.opts.emitEventsOnNodeName) scope.emit(name, state.object)
+ if (scope.opts.emitOnNodeName) scope.emit(name, state.object)
scope.push(state.object)
state.object = {}
}
@@ -108,8 +127,8 @@ XmlParser.prototype.parse = function (chunk) {
var path = getRelativePath()
var tempObj = state.object
if (!path) {
- if (!state.object._) state.object._ = ''
- state.object._ = state.object._ + text
+ if (!state.object[textKey]) state.object[textKey] = ''
+ state.object[textKey] = state.object[textKey] + text
return
}
var tokens = path.split('.')
@@ -123,8 +142,8 @@ XmlParser.prototype.parse = function (chunk) {
if (Array.isArray(tempObj) && i !== tokens.length - 1) tempObj = tempObj[tempObj.length - 1]
}
var obj = tempObj[tempObj.length - 1]
- if (!obj._) obj._ = ''
- obj._ = obj._ + text
+ if (!obj[textKey]) obj[textKey] = ''
+ obj[textKey] = obj[textKey] + text
}
function checkForResourcePath (name) {
@@ -157,10 +176,9 @@ XmlParser.prototype.parse = function (chunk) {
temp = resourcePath
}
index = temp.indexOf('/')
- temp = temp.substring(0, index)
-
+ if (index !== -1) temp = temp.substring(0, index)
if (temp !== name) {
- this.end()
+ scope.end()
}
}
}
diff --git a/test/TestFiles/CData-comments.xml b/test/TestFiles/CData-comments.xml
new file mode 100644
index 0000000..37630c4
--- /dev/null
+++ b/test/TestFiles/CData-comments.xml
@@ -0,0 +1,1211 @@
+
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+
\ No newline at end of file
diff --git a/test/TestFiles/largeCorruptedFile.xml b/test/TestFiles/largeCorruptedFile.xml
new file mode 100644
index 0000000..c310f97
--- /dev/null
+++ b/test/TestFiles/largeCorruptedFile.xml
@@ -0,0 +1,8346 @@
+
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+
\ No newline at end of file
diff --git a/test/TestFiles/multipleInterestedNodes.xml b/test/TestFiles/multipleInterestedNodes.xml
new file mode 100644
index 0000000..a62d389
--- /dev/null
+++ b/test/TestFiles/multipleInterestedNodes.xml
@@ -0,0 +1,44 @@
+
+
+-
+ one
+ two
+
+-
+ three
+ four
+ five
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+-
+ one
+ two
+
+
+ one
+ two
+
+
+ one
+ two
+
+
+ one
+ two
+
+
+ one
+ two
+
+
+ one
+ two
+
+
\ No newline at end of file
diff --git a/test/test.js b/test/test.js
index cea8fdf..4aee4f4 100644
--- a/test/test.js
+++ b/test/test.js
@@ -1,10 +1,11 @@
var should = require('should')
var fs = require('fs')
+var zlib = require('zlib')
var ParserFactory = require('../parser')
describe('Tests', function () {
- describe('simple behaviour testing', function () {
+ describe('Basic behaviour', function () {
it('should properly parse a simple file.', function (done) {
var xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
var parser = new ParserFactory({resourcePath: '/items/item'})
@@ -155,4 +156,602 @@ describe('Tests', function () {
xmlStream.pipe(parser)
})
})
+
+ describe('pause and resume', function () {
+ it('should properly parse a simple file.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var expectedData = [
+ { '$': { id: '1', test: 'hello' },
+ subitem:
+ [ { '$': { sub: 'TESTING SUB' }, _: 'one' },
+ { '$': { sub: '2' }, _: 'two' } ] },
+ { '$': { id: '2' },
+ subitem: [ { _: 'three' }, { _: 'four' }, { _: 'five' } ] } ]
+ var actualData = []
+ var dataEventCount = 0
+ var isSetTimeoutHappened = true
+ this.timeout(4000)
+ parser.on('data', function (data) {
+ actualData.push(data)
+ parser.pause()
+ isSetTimeoutHappened.should.equal(true)
+ setTimeout(function () {
+ parser.resume()
+ isSetTimeoutHappened = true
+ }, 3000)
+ dataEventCount++
+ isSetTimeoutHappened = false
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('actualData=', actualData)
+ // console.log('dataEventCount=', dataEventCount)
+ actualData.should.deepEqual(expectedData)
+ dataEventCount.should.equal(2)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should emit data events with 1sec interval between each using pause and resume.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/medium.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+
+ var dataEventCount = 0
+ var isSetTimeoutHappened = true
+ this.timeout(20000)
+ parser.on('data', function (data) {
+ parser.pause()
+ isSetTimeoutHappened.should.equal(true)
+ setTimeout(function () {
+ parser.resume()
+ isSetTimeoutHappened = true
+ }, 2000)
+ dataEventCount++
+ isSetTimeoutHappened = false
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(10)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+ })
+
+ describe('should respect the options passed', function () {
+ it('should properly generate objects with $ as key for attrs and _ as key for text value of node.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var expectedData = [
+ { '$': { id: '1', test: 'hello' },
+ subitem:
+ [ { '$': { sub: 'TESTING SUB' }, _: 'one' },
+ { '$': { sub: '2' }, _: 'two' } ] },
+ { '$': { id: '2' },
+ subitem: [ { _: 'three' }, { _: 'four' }, { _: 'five' } ] } ]
+ var actualData = []
+ var dataEventCount = 0
+
+ parser.on('data', function (data) {
+ actualData.push(data)
+ dataEventCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('actualData=', actualData)
+ // console.log('dataEventCount=', dataEventCount)
+ actualData.should.deepEqual(expectedData)
+ dataEventCount.should.equal(2)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly generate objects with passed attrs and text keys in the options.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item', attrsKey: 'attrs', textKey: 'text'})
+ var expectedData = [
+ { 'attrs': { id: '1', test: 'hello' },
+ subitem:
+ [ { 'attrs': { sub: 'TESTING SUB' }, text: 'one' },
+ { 'attrs': { sub: '2' }, text: 'two' } ] },
+ { 'attrs': { id: '2' },
+ subitem: [ { text: 'three' }, { text: 'four' }, { text: 'five' } ] } ]
+ var actualData = []
+ var dataEventCount = 0
+
+ parser.on('data', function (data) {
+ actualData.push(data)
+ dataEventCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('actualData=', JSON.stringify(actualData, null, 1))
+ // console.log('dataEventCount=', dataEventCount)
+ actualData.should.deepEqual(expectedData)
+ dataEventCount.should.equal(2)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly generate objects when special symbols are passed as attrs and text keys in the options.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item', attrsKey: '!', textKey: '%'})
+ var expectedData = [
+ { '!': { id: '1', test: 'hello' },
+ subitem:
+ [ { '!': { sub: 'TESTING SUB' }, '%': 'one' },
+ { '!': { sub: '2' }, '%': 'two' } ] },
+ { '!': { id: '2' },
+ subitem: [ { '%': 'three' }, { '%': 'four' }, { '%': 'five' } ] } ]
+ var actualData = []
+ var dataEventCount = 0
+
+ parser.on('data', function (data) {
+ actualData.push(data)
+ dataEventCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('actualData=', JSON.stringify(actualData, null, 1))
+ // console.log('dataEventCount=', dataEventCount)
+ actualData.should.deepEqual(expectedData)
+ dataEventCount.should.equal(2)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+ })
+
+ describe('should properly handle uncompressed files', function () {
+ it('should properly parse a uncompressed xml file.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/medium.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var gzip = zlib.createGzip()
+ var gunzip = zlib.createGunzip()
+ var dataEventCount = 0
+
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(10)
+ done()
+ })
+ xmlStream.pipe(gzip).pipe(gunzip).pipe(parser)
+ })
+
+ it('should properly parse uncompressed file and go fine with pause and resume.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/medium.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var gzip = zlib.createGzip()
+ var gunzip = zlib.createGunzip()
+
+ var dataEventCount = 0
+ var isSetTimeoutHappened = true
+ this.timeout(20000)
+ parser.on('data', function (data) {
+ parser.pause()
+ isSetTimeoutHappened.should.equal(true)
+ setTimeout(function () {
+ parser.resume()
+ isSetTimeoutHappened = true
+ }, 2000)
+ dataEventCount++
+ isSetTimeoutHappened = false
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(10)
+ done()
+ })
+ xmlStream.pipe(gzip).pipe(gunzip).pipe(parser)
+ })
+ })
+
+ describe('read method', function () {
+ it('should properly parse a simple file.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var expectedData = [
+ { '$': { id: '1', test: 'hello' },
+ subitem:
+ [ { '$': { sub: 'TESTING SUB' }, _: 'one' },
+ { '$': { sub: '2' }, _: 'two' } ] },
+ { '$': { id: '2' },
+ subitem: [ { _: 'three' }, { _: 'four' }, { _: 'five' } ] } ]
+ var actualData = []
+ var obj
+ var Timeout
+
+ parser.on('readable', function () {
+ Timeout = setInterval(function () {
+ if ((obj = parser.read())) actualData.push(obj)
+ obj = null
+ }, 50)
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('actualData=', actualData)
+ // console.log('dataEventCount=', dataEventCount)
+ clearInterval(Timeout)
+ actualData.should.deepEqual(expectedData)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly parse a file containing many nodes.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/manyItems.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var objCount = 0
+ var endEventOcurred = false
+
+ parser.on('readable', function () {
+ read()
+ })
+
+ function read () {
+ while (parser.read()) objCount++
+ if (!endEventOcurred) setTimeout(read, 50)
+ }
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log(objCount)
+ objCount.should.deepEqual(296)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly parse a huge.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/hugeFile.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var objCount = 0
+ var endEventOcurred = false
+
+ parser.on('readable', function () {
+ read()
+ })
+
+ function read () {
+ while (parser.read()) objCount++
+ if (!endEventOcurred) setTimeout(read, 50)
+ }
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log(objCount)
+ objCount.should.deepEqual(2072)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+ })
+
+ describe('Error Handling', function () {
+ it('should properly return error if the xml file is corrupted.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/corrupted.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var dataEventCount = 0
+
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('error', function (err) {
+ // console.log(err)
+ err.message.should.equal('mismatched tag at line no: 11')
+ done()
+ })
+
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly return error if the large xml file is corrupted.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/largeCorruptedFile.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+ var dataEventCount = 0
+
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('error', function (err) {
+ // console.log(err)
+ err.message.should.equal('mismatched tag at line no: 8346')
+ done()
+ })
+
+ xmlStream.pipe(parser)
+ })
+ })
+
+ describe('CData and comments in xml', function () {
+ it('should properly parse a simple file.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/CData-comments.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item'})
+
+ var dataEventCount = 0
+
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(296)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+ })
+
+ describe('emitOnNodeName', function () {
+ it('should properly emit events on node names.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item', emitOnNodeName: true})
+ var expectedData = [
+ { '$': { id: '1', test: 'hello' },
+ subitem:
+ [ { '$': { sub: 'TESTING SUB' }, _: 'one' },
+ { '$': { sub: '2' }, _: 'two' } ] },
+ { '$': { id: '2' },
+ subitem: [ { _: 'three' }, { _: 'four' }, { _: 'five' } ] } ]
+ var actualData = []
+ var itemData = []
+ var dataEventCount = 0
+ var itemCount = 0
+
+ parser.on('data', function (data) {
+ actualData.push(data)
+ dataEventCount++
+ })
+
+ parser.on('item', function (item) {
+ itemData.push(item)
+ itemCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('actualData=', actualData)
+ // console.log('dataEventCount=', dataEventCount)
+ actualData.should.deepEqual(expectedData)
+ dataEventCount.should.equal(2)
+ itemData.should.deepEqual(expectedData)
+ itemCount.should.equal(2)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly emit events on node names while parsing a medium size file.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/medium.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item', emitOnNodeName: true})
+
+ var dataEventCount = 0
+ var itemCount = 0
+
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('item', function (data) {
+ itemCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(10)
+ itemCount.should.equal(10)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly parse a file containing many nodes.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/manyItems.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item', emitOnNodeName: true})
+
+ var dataEventCount = 0
+ var itemCount = 0
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('item', function (data) {
+ itemCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(296)
+ itemCount.should.equal(296)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly parse a huge file.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/hugeFile.xml')
+ var parser = new ParserFactory({resourcePath: '/items/item', emitOnNodeName: true})
+
+ var dataEventCount = 0
+ var itemCount = 0
+
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('item', function (item) {
+ itemCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(2072)
+ itemCount.should.equal(2072)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+ })
+
+ describe('wrong resourcePath', function () {
+ it('should be able to detect the wrong resourcePath at root level.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/item.xml')
+ var parser = new ParserFactory({resourcePath: '/wrong/noNodes', emitOnNodeName: true})
+
+ var actualData = []
+ var itemData = []
+ var dataEventCount = 0
+ var itemCount = 0
+
+ parser.on('data', function (data) {
+ actualData.push(data)
+ dataEventCount++
+ })
+
+ parser.on('item', function (item) {
+ itemData.push(item)
+ itemCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('actualData=', actualData)
+ // console.log('dataEventCount=', dataEventCount)
+ actualData.length.should.equal(0)
+ dataEventCount.should.equal(0)
+ itemData.length.should.equal(0)
+ itemCount.should.equal(0)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should be able to detect wrong resourcePath while parsing xml', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/manyItems.xml')
+ var parser = new ParserFactory({resourcePath: '/wrong/noNodes', emitOnNodeName: true})
+
+ var dataEventCount = 0
+ var itemCount = 0
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('item', function (data) {
+ itemCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(0)
+ itemCount.should.equal(0)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+
+ it('should properly parse a huge file.', function (done) {
+ var xmlStream = fs.createReadStream('./test/TestFiles/hugeFile.xml')
+ var parser = new ParserFactory({resourcePath: '/wrong/path', emitOnNodeName: true})
+
+ var dataEventCount = 0
+ var itemCount = 0
+
+ parser.on('data', function (data) {
+ dataEventCount++
+ })
+
+ parser.on('item', function (item) {
+ itemCount++
+ })
+
+ parser.on('error', function (err) {
+ done(err)
+ })
+
+ parser.on('end', function () {
+ // console.log('dataEventCount=', dataEventCount)
+ dataEventCount.should.equal(0)
+ itemCount.should.equal(0)
+ done()
+ })
+ xmlStream.pipe(parser)
+ })
+ })
})