!function(t,e){
"function"==typeof
define&&define.amd?define([],e):"object"==typeof
module&&module.exports?module.exports=e():t.CSV=e()
}
(this,function(){
"use strict";
function t(t){
var e=typeof t;return"function"===e||"object"===e&&!!t
}function e(t){
return"string"==typeof t
}function n(t){
return!isNaN(+t)
}function i(t){
return 0==t||1==t
}function r(t){
return null==t
}function o(t){
return null!=t
}function c(t,e){
return o(t)?t:e
}function u(t,e){
for(var n=0,i=t.length;i>n&&e(t[n],n)!==!1;n+=1);
}function s(t){
return t.replace(/"/g,'\\"')
}function a(t){
return"attrs["+t+"]"
}function l(t,e){
return n(t)?"Number("+a(e)+")":i(t)?"Boolean("+a(e)+" == true)":"String("+a(e)+")"
}function f(t,n,i,r){
var o=[];
return 3==arguments.length?(n?g(n)?u(i,function(i,r){
e(n[r])?n[r]=n[r].toLowerCase():t[n[r]]=n[r],o.push("deserialize[cast["+r+"]]("+a(r)+")")
}):u(i,function(t,e){
o.push(l(t,e))
}):u(i,function(t,e){
o.push(a(e))
}),o="return ["+o.join(",")+"]"):(n?g(n)?u(i,function(i,c){
e(n[c])?n[c]=n[c].toLowerCase():t[n[c]]=n[c],
o.push('"'+s(r[c])+'": deserialize[cast['+c+"]]("+a(c)+")")
}):u(i,function(t,e){
o.push('"'+s(r[e])+'": '+l(t,e))
}):u(i,function(t,e){
o.push('"'+s(r[e])+'": '+a(e))
}),o="return {"+o.join(",")+"}"),
Function("attrs","deserialize","cast",o)
}function h(t,e){
var n,i=0;return u(e,function(e){
var r,
o=e;
-1!=p.indexOf(e)&&(o="\\"+o),
r=t.match(RegExp(o,"g")),
r&&r.length>i&&(i=r.length,n=e)
}),n||e[0]
}var p=["|","^"],
d=[",",";"," ","|","^"],
m=["\r\n","\r","\n"],
g=Array.isArray||function(t){
return"[object Array]"===toString.call(t)
},y=function(){
function n(t,n){
if(n||(n={}),g(t))this.mode="encode";
else{
if(!e(t))throw Error("Incompatible format!");
this.mode="parse"
}this.data=t,this.options={
header:c(n.header,!1),cast:c(n.cast,!0)
};
var i=n.lineDelimiter||n.line,
r=n.cellDelimiter||n.delimiter;
this.isParser()?(this.options.lineDelimiter=i||h(this.data,m),
this.options.cellDelimiter=r||h(this.data,d),
this.data=o(this.data,this.options.lineDelimiter)):this.isEncoder()&&(this.options.lineDelimiter=i||"\r\n",
this.options.cellDelimiter=r||",")
}function i(t,e,n,i,r){
t(new e(n,i,r))
}function o(t,e){
return t.slice(-e.length)!=e&&(t+=e),
t
}function s(n){
return g(n)?"array":t(n)?"object":e(n)?"string":r(n)?"null":"primitive"
}return n.prototype.set=function(t,e){
return this.options[t]=e
},n.prototype.isParser=function(){
return"parse"==this.mode
},n.prototype.isEncoder=function(){
return"encode"==this.mode
},n.prototype.parse=function(t){
function e(){
s={
escaped:!1,
quote:!1,
cell:!0
}
}function n(){
m.cell=""
}function r(){
m.line=[]}function o(t){
m.line.push(s.escaped?t.slice(1,-1).replace(/""/g,'"'):t),
n(),
e()
}function c(t){
o(t.slice(0,1-p.lineDelimiter.length))
}function u(){
d?g(d)?(a=f(y,p.cast,m.line,d),
(u=function(){
i(t,a,m.line,y,p.cast)
})()):d=m.line:(a||(a=f(y,p.cast,m.line)),
(u=function(){
i(t,a,m.line,y,p.cast)
})())
}if("parse"==this.mode){
if(0===this.data.trim().length)return[];
var s,
a,
l,
h=this.data,
p=this.options,
d=p.header,
m={cell:"",line:[]},
y=this.deserialize;
t||(l=[],
t=function(t){
l.push(t)
}),1==p.lineDelimiter.length&&(c=o);
var v,
A,
D,
b=h.length,
j=p.cellDelimiter.charCodeAt(0),
w=p.lineDelimiter.charCodeAt(p.lineDelimiter.length-1);
for(e(),
v=0,
A=0;
b>v;
v++)D=h.charCodeAt(v),
s.cell&&(s.cell=!1,34==D)?s.escaped=!0:s.escaped&&34==D?s.quote=!s.quote:(s.escaped&&s.quote||!s.escaped)&&(D==j?(o(m.cell+h.slice(A,v)),A=v+1):D==w&&(c(m.cell+h.slice(A,v)),
A=v+1,
(m.line.length>1||""!==m.line[0])&&u(),
r()));
return l?l:this
}
},n.prototype.deserialize={
string:function(t){
return t+""
},number:function(t){
return+t
},"boolean":function(t){
return!!t
}
},n.prototype.serialize={
object:function(t){
var e=this,
n=Object.keys(t),
i=Array(n.length);
return u(n,function(n,r){
i[r]=e[s(t[n])](t[n])
}),i
},array:function(t){
var e=this,
n=Array(t.length);
return u(t,function(t,i){
n[i]=e[s(t)](t)
}),n
},string:function(t){
return'"'+(t+"").replace(/"/g,'""')+'"'
},"null":function(){
return""
},primitive:function(t){
return t
}
},n.prototype.encode=function(t){
function n(t){
return t.join(c.cellDelimiter)
}if("encode"==this.mode){
if(0==this.data.length)return"";
var i,
r,
o=this.data,
c=this.options,
a=c.header,
l=o[0],
f=this.serialize,
h=0;
t||(r=Array(o.length),
t=function(t,e){
r[e+h]=t
}),a&&(g(a)||(i=Object.keys(l),a=i),
t(n(f.array(a)),0),
h=1);
var p,
d=s(l);
return"array"==d?(g(c.cast)?(p=Array(c.cast.length),
u(c.cast,
function(t,n){
e(t)?p[n]=t.toLowerCase():(p[n]=t,f[t]=t)
})):(p=Array(l.length),
u(l,function(t,e){
p[e]=s(t)
})),u(o,function(e,i){
var r=Array(p.length);
u(e,function(t,e){
r[e]=f[p[e]](t)
}),t(n(r),i)
})):"object"==d&&(i=Object.keys(l),
g(c.cast)?(p=Array(c.cast.length),
u(c.cast,
function(t,n){
e(t)?p[n]=t.toLowerCase():(p[n]=t,f[t]=t)
})):(p=Array(i.length),
u(i,
function(t,e){
p[e]=s(l[t])
})),u(o,
function(e,r){
var o=Array(i.length);
u(i,
function(t,n){
o[n]=f[p[n]](e[t])
}),t(n(o),r)
})),r?r.join(c.lineDelimiter):this
}
},n.prototype.forEach=function(t){
return this[this.mode](t)
},n
}();return y.parse=function(t,e){
return new y(t,e).parse()
},y.encode=function(t,e){
return new y(t,e).encode()
},y.forEach=function(t,e,n){
return 2==arguments.length&&(n=e),
new y(t,e).forEach(n)
},y
});