(this.nativeLog||function(e){console.log(e)})("START JS FRAMEWORK 0.23.6, Build 2017-12-29 15:36."),this.getJSFMVersion=function(){return"0.23.6"};var global=this,process={env:{}},setTimeout=global.setTimeout;!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t():"function"==typeof define&&define.amd?define(t):t()}(0,function(){"use strict";var e={framework:"0.23.6",transformer:">=0.1.5 <0.5"};Array.from||(Array.from=function(){var e=Object.prototype.toString,t=function(t){return"function"==typeof t||"[object Function]"===e.call(t)},n=Math.pow(2,53)-1,r=function(e){var t=function(e){var t=Number(e);return isNaN(t)?0:0!==t&&isFinite(t)?(t>0?1:-1)*Math.floor(Math.abs(t)):t}(e);return Math.min(Math.max(t,0),n)};return function(e){var n=Object(e);if(null==e)throw new TypeError("Array.from requires an array-like object - not null or undefined");var o,i=arguments.length>1?arguments[1]:void 0;if(void 0!==i){if(!t(i))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(o=arguments[2])}for(var a,s=r(n.length),u=t(this)?Object(new this(s)):new Array(s),c=0;c<s;)a=n[c],u[c]=i?void 0===o?i(a,c):i.call(o,a,c):a,c+=1;return u.length=s,u}}());var t="undefined"!=typeof window?window:void 0!==global?global:"undefined"!=typeof self?self:{};function n(e){return e&&e.__esModule?e.default:e}function r(e,t){return e(t={exports:{}},t.exports),t.exports}var o=r(function(e){var t=e.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=t)}),i=r(function(e){var t=e.exports={version:"2.5.3"};"number"==typeof __e&&(__e=t)}),a=function(e){return"object"==typeof e?null!==e:"function"==typeof e},s=a,u=function(e){if(!s(e))throw TypeError(e+" is not an object!");return e},c=function(e){try{return!!e()}catch(e){return!0}},l=!c(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),f=a,d=o.document,p=f(d)&&f(d.createElement),h=function(e){return p?d.createElement(e):{}},v=!l&&!c(function(){return 7!=Object.defineProperty(h("div"),"a",{get:function(){return 7}}).a}),y=a,m=u,_=v,g=function(e,t){if(!y(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!y(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!y(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!y(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},b=Object.defineProperty,w={f:l?Object.defineProperty:function(e,t,n){if(m(e),t=g(t,!0),m(n),_)try{return b(e,t,n)}catch(e){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(e[t]=n.value),e}},C=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},k=w,x=C,S=l?function(e,t,n){return k.f(e,t,x(1,n))}:function(e,t,n){return e[t]=n,e},E={}.hasOwnProperty,O=function(e,t){return E.call(e,t)},j=0,A=Math.random(),I=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++j+A).toString(36))},T=r(function(e){var t=o,n=S,r=O,a=I("src"),s="toString",u=Function[s],c=(""+u).split(s);i.inspectSource=function(e){return u.call(e)},(e.exports=function(e,o,i,s){var u="function"==typeof i;u&&(r(i,"name")||n(i,"name",o)),e[o]!==i&&(u&&(r(i,a)||n(i,a,e[o]?""+e[o]:c.join(String(o)))),e===t?e[o]=i:s?e[o]?e[o]=i:n(e,o,i):(delete e[o],n(e,o,i)))})(Function.prototype,s,function(){return"function"==typeof this&&this[a]||u.call(this)})}),P=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e},N=P,M=function(e,t,n){if(N(e),void 0===t)return e;switch(n){case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,o){return e.call(t,n,r,o)}}return function(){return e.apply(t,arguments)}},$=o,R=i,D=S,F=T,L=M,V="prototype",W=function(e,t,n){var r,o,i,a,s=e&W.F,u=e&W.G,c=e&W.S,l=e&W.P,f=e&W.B,d=u?$:c?$[t]||($[t]={}):($[t]||{})[V],p=u?R:R[t]||(R[t]={}),h=p[V]||(p[V]={});u&&(n=t);for(r in n)i=((o=!s&&d&&void 0!==d[r])?d:n)[r],a=f&&o?L(i,$):l&&"function"==typeof i?L(Function.call,i):i,d&&F(d,r,i,e&W.U),p[r]!=i&&D(p,r,a),l&&h[r]!=i&&(h[r]=i)};$.core=R,W.F=1,W.G=2,W.S=4,W.P=8,W.B=16,W.W=32,W.U=64,W.R=128;var B,U=W,J={}.toString,z=function(e){return J.call(e).slice(8,-1)},q=z,H=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==q(e)?e.split(""):Object(e)},G=function(e){if(void 0==e)throw TypeError("Can't call method on  "+e);return e},X=H,K=G,Z=function(e){return X(K(e))},Q=Math.ceil,Y=Math.floor,ee=function(e){return isNaN(e=+e)?0:(e>0?Y:Q)(e)},te=ee,ne=Math.min,re=function(e){return e>0?ne(te(e),9007199254740991):0},oe=ee,ie=Math.max,ae=Math.min,se=Z,ue=re,ce=function(e,t){return(e=oe(e))<0?ie(e+t,0):ae(e,t)},le=o,fe="__core-js_shared__",de=le[fe]||(le[fe]={}),pe=function(e){return de[e]||(de[e]={})},he=pe("keys"),ve=I,ye=function(e){return he[e]||(he[e]=ve(e))},me=O,_e=Z,ge=(B=!1,function(e,t,n){var r,o=se(e),i=ue(o.length),a=ce(n,i);if(B&&t!=t){for(;i>a;)if((r=o[a++])!=r)return!0}else for(;i>a;a++)if((B||a in o)&&o[a]===t)return B||a||0;return!B&&-1}),be=ye("IE_PROTO"),we="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),Ce=function(e,t){var n,r=_e(e),o=0,i=[];for(n in r)n!=be&&me(r,n)&&i.push(n);for(;t.length>o;)me(r,n=t[o++])&&(~ge(i,n)||i.push(n));return i},ke=we,xe=Object.keys||function(e){return Ce(e,ke)},Se=G,Ee=function(e){return Object(Se(e))},Oe=xe,je={f:Object.getOwnPropertySymbols},Ae={f:{}.propertyIsEnumerable},Ie=Ee,Te=H,Pe=Object.assign,Ne=!Pe||c(function(){var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach(function(e){t[e]=e}),7!=Pe({},e)[n]||Object.keys(Pe({},t)).join("")!=r})?function(e,t){for(var n=arguments,r=Ie(e),o=arguments.length,i=1,a=je.f,s=Ae.f;o>i;)for(var u,c=Te(n[i++]),l=a?Oe(c).concat(a(c)):Oe(c),f=l.length,d=0;f>d;)s.call(c,u=l[d++])&&(r[u]=c[u]);return r}:Pe,Me=U;Me(Me.S+Me.F,"Object",{assign:Ne}),Object.setPrototypeOf||(Object.setPrototypeOf=function(e,t){var n;function r(e,t){return n.call(e,t),e}try{(n=e.getOwnPropertyDescriptor(e.prototype,t).set).call({},null)}catch(o){if(e.prototype!=={}[t])return;n=function(e){this[t]=e},r.polyfill=r(r({},null),e.prototype)instanceof e}return r}(Object,"__proto__"));var $e=t.WXEnvironment;$e&&"iOS"===$e.platform&&(t.Promise=void 0);var Re=r(function(e){var t=pe("wks"),n=I,r=o.Symbol,i="function"==typeof r;(e.exports=function(e){return t[e]||(t[e]=i&&r[e]||(i?r:n)("Symbol."+e))}).store=t}),De=z,Fe=Re("toStringTag"),Le="Arguments"==De(function(){return arguments}()),Ve=function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),Fe))?n:Le?De(t):"Object"==(r=De(t))&&"function"==typeof t.callee?"Arguments":r},We=Ve,Be={};Be[Re("toStringTag")]="z",Be+""!="[object z]"&&T(Object.prototype,"toString",function(){return"[object "+We(this)+"]"},!0);var Ue=ee,Je=G,ze={},qe=w,He=u,Ge=xe,Xe=l?Object.defineProperties:function(e,t){He(e);for(var n,r=Ge(t),o=r.length,i=0;o>i;)qe.f(e,n=r[i++],t[n]);return e},Ke=o.document,Ze=Ke&&Ke.documentElement,Qe=u,Ye=Xe,et=we,tt=ye("IE_PROTO"),nt=function(){},rt="prototype",ot=function(){var e,t=h("iframe"),n=et.length;for(t.style.display="none",Ze.appendChild(t),t.src="javascript:",(e=t.contentWindow.document).open(),e.write("<script>document.F=Object<\/script>"),e.close(),ot=e.F;n--;)delete ot[rt][et[n]];return ot()},it=Object.create||function(e,t){var n;return null!==e?(nt[rt]=Qe(e),n=new nt,nt[rt]=null,n[tt]=e):n=ot(),void 0===t?n:Ye(n,t)},at=w.f,st=O,ut=Re("toStringTag"),ct=function(e,t,n){e&&!st(e=n?e:e.prototype,ut)&&at(e,ut,{configurable:!0,value:t})},lt=it,ft=C,dt=ct,pt={};S(pt,Re("iterator"),function(){return this});var ht,vt=O,yt=Ee,mt=ye("IE_PROTO"),_t=Object.prototype,gt=Object.getPrototypeOf||function(e){return e=yt(e),vt(e,mt)?e[mt]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?_t:null},bt=U,wt=T,Ct=S,kt=O,xt=ze,St=function(e,t,n){e.prototype=lt(pt,{next:ft(1,n)}),dt(e,t+" Iterator")},Et=ct,Ot=gt,jt=Re("iterator"),At=!([].keys&&"next"in[].keys()),It="values",Tt=function(){return this},Pt=function(e,t,n,r,o,i,a){St(n,t,r);var s,u,c,l=function(e){if(!At&&e in h)return h[e];switch(e){case"keys":case It:return function(){return new n(this,e)}}return function(){return new n(this,e)}},f=t+" Iterator",d=o==It,p=!1,h=e.prototype,v=h[jt]||h["@@iterator"]||o&&h[o],y=!At&&v||l(o),m=o?d?l("entries"):y:void 0,_="Array"==t?h.entries||v:v;if(_&&(c=Ot(_.call(new e)))!==Object.prototype&&c.next&&(Et(c,f,!0),kt(c,jt)||Ct(c,jt,Tt)),d&&v&&v.name!==It&&(p=!0,y=function(){return v.call(this)}),(At||p||!h[jt])&&Ct(h,jt,y),xt[t]=y,xt[f]=Tt,o)if(s={values:d?y:l(It),keys:i?y:l("keys"),entries:m},a)for(u in s)u in h||wt(h,u,s[u]);else bt(bt.P+bt.F*(At||p),t,s);return s},Nt=(ht=!0,function(e,t){var n,r,o=String(Je(e)),i=Ue(t),a=o.length;return i<0||i>=a?ht?"":void 0:(n=o.charCodeAt(i))<55296||n>56319||i+1===a||(r=o.charCodeAt(i+1))<56320||r>57343?ht?o.charAt(i):n:ht?o.slice(i,i+2):r-56320+(n-55296<<10)+65536});Pt(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,t=this._t,n=this._i;return n>=t.length?{value:void 0,done:!0}:(e=Nt(t,n),this._i+=e.length,{value:e,done:!1})});var Mt=Re("unscopables"),$t=Array.prototype;void 0==$t[Mt]&&S($t,Mt,{});var Rt=function(e){$t[Mt][e]=!0},Dt=function(e,t){return{value:t,done:!!e}},Ft=ze,Lt=Z,Vt=Pt(Array,"Array",function(e,t){this._t=Lt(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,n=this._i++;return!e||n>=e.length?(this._t=void 0,Dt(1)):Dt(0,"keys"==t?n:"values"==t?e[n]:[n,e[n]])},"values");Ft.Arguments=Ft.Array,Rt("keys"),Rt("values"),Rt("entries");for(var Wt=Vt,Bt=xe,Ut=T,Jt=o,zt=S,qt=ze,Ht=Re,Gt=Ht("iterator"),Xt=Ht("toStringTag"),Kt=qt.Array,Zt={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},Qt=Bt(Zt),Yt=0;Yt<Qt.length;Yt++){var en,tn=Qt[Yt],nn=Zt[tn],rn=Jt[tn],on=rn&&rn.prototype;if(on&&(on[Gt]||zt(on,Gt,Kt),on[Xt]||zt(on,Xt,tn),qt[tn]=Kt,nn))for(en in Wt)on[en]||Ut(on,en,Wt[en],!0)}var an,sn,un,cn=u,ln=function(e,t,n,r){try{return r?t(cn(n)[0],n[1]):t(n)}catch(t){var o=e.return;throw void 0!==o&&cn(o.call(e)),t}},fn=ze,dn=Re("iterator"),pn=Array.prototype,hn=function(e){return void 0!==e&&(fn.Array===e||pn[dn]===e)},vn=Ve,yn=Re("iterator"),mn=ze,_n=i.getIteratorMethod=function(e){if(void 0!=e)return e[yn]||e["@@iterator"]||mn[vn(e)]},gn=r(function(e){var t=M,n=ln,r=hn,o=u,i=re,a=_n,s={},c={},l=e.exports=function(e,u,l,f,d){var p,h,v,y,m=d?function(){return e}:a(e),_=t(l,f,u?2:1),g=0;if("function"!=typeof m)throw TypeError(e+" is not iterable!");if(r(m)){for(p=i(e.length);p>g;g++)if((y=u?_(o(h=e[g])[0],h[1]):_(e[g]))===s||y===c)return y}else for(v=m.call(e);!(h=v.next()).done;)if((y=n(v,_,h.value,u))===s||y===c)return y};l.BREAK=s,l.RETURN=c}),bn=u,wn=P,Cn=Re("species"),kn=M,xn=function(e,t,n){var r=void 0===n;switch(t.length){case 0:return r?e():e.call(n);case 1:return r?e(t[0]):e.call(n,t[0]);case 2:return r?e(t[0],t[1]):e.call(n,t[0],t[1]);case 3:return r?e(t[0],t[1],t[2]):e.call(n,t[0],t[1],t[2]);case 4:return r?e(t[0],t[1],t[2],t[3]):e.call(n,t[0],t[1],t[2],t[3])}return e.apply(n,t)},Sn=Ze,En=h,On=o,jn=On.process,An=On.setImmediate,In=On.clearImmediate,Tn=On.MessageChannel,Pn=On.Dispatch,Nn=0,Mn={},$n="onreadystatechange",Rn=function(){var e=+this;if(Mn.hasOwnProperty(e)){var t=Mn[e];delete Mn[e],t()}},Dn=function(e){Rn.call(e.data)};An&&In||(An=function(e){for(var t=arguments,n=[],r=1;arguments.length>r;)n.push(t[r++]);return Mn[++Nn]=function(){xn("function"==typeof e?e:Function(e),n)},an(Nn),Nn},In=function(e){delete Mn[e]},"process"==z(jn)?an=function(e){jn.nextTick(kn(Rn,e,1))}:Pn&&Pn.now?an=function(e){Pn.now(kn(Rn,e,1))}:Tn?(un=(sn=new Tn).port2,sn.port1.onmessage=Dn,an=kn(un.postMessage,un,1)):On.addEventListener&&"function"==typeof postMessage&&!On.importScripts?(an=function(e){On.postMessage(e+"","*")},On.addEventListener("message",Dn,!1)):an=$n in En("script")?function(e){Sn.appendChild(En("script"))[$n]=function(){Sn.removeChild(this),Rn.call(e)}}:function(e){setTimeout(kn(Rn,e,1),0)});var Fn={set:An,clear:In},Ln=o,Vn=Fn.set,Wn=Ln.MutationObserver||Ln.WebKitMutationObserver,Bn=Ln.process,Un=Ln.Promise,Jn="process"==z(Bn),zn=P;var qn={f:function(e){return new function(e){var t,n;this.promise=new e(function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r}),this.resolve=zn(t),this.reject=zn(n)}(e)}},Hn=u,Gn=a,Xn=qn,Kn=T,Zn=o,Qn=w,Yn=l,er=Re("species"),tr=Re("iterator"),nr=!1;try{var rr=[7][tr]();rr.return=function(){nr=!0},Array.from(rr,function(){throw 2})}catch(e){}var or,ir,ar,sr,ur=o,cr=M,lr=Ve,fr=U,dr=a,pr=P,hr=function(e,t,n,r){if(!(e instanceof t)||void 0!==r&&r in e)throw TypeError(n+": incorrect invocation!");return e},vr=gn,yr=function(e,t){var n,r=bn(e).constructor;return void 0===r||void 0==(n=bn(r)[Cn])?t:wn(n)},mr=Fn.set,_r=function(){var e,t,n,r=function(){var r,o;for(Jn&&(r=Bn.domain)&&r.exit();e;){o=e.fn,e=e.next;try{o()}catch(r){throw e?n():t=void 0,r}}t=void 0,r&&r.enter()};if(Jn)n=function(){Bn.nextTick(r)};else if(!Wn||Ln.navigator&&Ln.navigator.standalone)if(Un&&Un.resolve){var o=Un.resolve();n=function(){o.then(r)}}else n=function(){Vn.call(Ln,r)};else{var i=!0,a=document.createTextNode("");new Wn(r).observe(a,{characterData:!0}),n=function(){a.data=i=!i}}return function(r){var o={fn:r,next:void 0};t&&(t.next=o),e||(e=o,n()),t=o}}(),gr=qn,br=function(e){try{return{e:!1,v:e()}}catch(e){return{e:!0,v:e}}},wr=function(e,t){if(Hn(e),Gn(t)&&t.constructor===e)return t;var n=Xn.f(e);return(0,n.resolve)(t),n.promise},Cr="Promise",kr=ur.TypeError,xr=ur.process,Sr=ur[Cr],Er="process"==lr(xr),Or=function(){},jr=ir=gr.f,Ar=!!function(){try{var e=Sr.resolve(1),t=(e.constructor={})[Re("species")]=function(e){e(Or,Or)};return(Er||"function"==typeof PromiseRejectionEvent)&&e.then(Or)instanceof t}catch(e){}}(),Ir=function(e){var t;return!(!dr(e)||"function"!=typeof(t=e.then))&&t},Tr=function(e,t){if(!e._n){e._n=!0;var n=e._c;_r(function(){for(var r=e._v,o=1==e._s,i=0,a=function(t){var n,i,a=o?t.ok:t.fail,s=t.resolve,u=t.reject,c=t.domain;try{a?(o||(2==e._h&&Mr(e),e._h=1),!0===a?n=r:(c&&c.enter(),n=a(r),c&&c.exit()),n===t.promise?u(kr("Promise-chain cycle")):(i=Ir(n))?i.call(n,s,u):s(n)):u(r)}catch(e){u(e)}};n.length>i;)a(n[i++]);e._c=[],e._n=!1,t&&!e._h&&Pr(e)})}},Pr=function(e){mr.call(ur,function(){var t,n,r,o=e._v,i=Nr(e);if(i&&(t=br(function(){Er?xr.emit("unhandledRejection",o,e):(n=ur.onunhandledrejection)?n({promise:e,reason:o}):(r=ur.console)&&r.error&&r.error("Unhandled promise rejection",o)}),e._h=Er||Nr(e)?2:1),e._a=void 0,i&&t.e)throw t.v})},Nr=function(e){return 1!==e._h&&0===(e._a||e._c).length},Mr=function(e){mr.call(ur,function(){var t;Er?xr.emit("rejectionHandled",e):(t=ur.onrejectionhandled)&&t({promise:e,reason:e._v})})},$r=function(e){var t=this;t._d||(t._d=!0,(t=t._w||t)._v=e,t._s=2,t._a||(t._a=t._c.slice()),Tr(t,!0))},Rr=function(e){var t,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===e)throw kr("Promise can't be resolved itself");(t=Ir(e))?_r(function(){var r={_w:n,_d:!1};try{t.call(e,cr(Rr,r,1),cr($r,r,1))}catch(e){$r.call(r,e)}}):(n._v=e,n._s=1,Tr(n,!1))}catch(e){$r.call({_w:n,_d:!1},e)}}};Ar||(Sr=function(e){hr(this,Sr,Cr,"_h"),pr(e),or.call(this);try{e(cr(Rr,this,1),cr($r,this,1))}catch(e){$r.call(this,e)}},(or=function(e){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=function(e,t,n){for(var r in t)Kn(e,r,t[r],n);return e}(Sr.prototype,{then:function(e,t){var n=jr(yr(this,Sr));return n.ok="function"!=typeof e||e,n.fail="function"==typeof t&&t,n.domain=Er?xr.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&Tr(this,!1),n.promise},catch:function(e){return this.then(void 0,e)}}),ar=function(){var e=new or;this.promise=e,this.resolve=cr(Rr,e,1),this.reject=cr($r,e,1)},gr.f=jr=function(e){return e===Sr||e===sr?new ar(e):ir(e)}),fr(fr.G+fr.W+fr.F*!Ar,{Promise:Sr}),ct(Sr,Cr),function(e){var t=Zn[e];Yn&&t&&!t[er]&&Qn.f(t,er,{configurable:!0,get:function(){return this}})}(Cr),sr=i[Cr],fr(fr.S+fr.F*!Ar,Cr,{reject:function(e){var t=jr(this);return(0,t.reject)(e),t.promise}}),fr(fr.S+fr.F*!Ar,Cr,{resolve:function(e){return wr(this,e)}}),fr(fr.S+fr.F*!(Ar&&function(e,t){if(!t&&!nr)return!1;var n=!1;try{var r=[7],o=r[tr]();o.next=function(){return{done:n=!0}},r[tr]=function(){return o},e(r)}catch(e){}return n}(function(e){Sr.all(e).catch(Or)})),Cr,{all:function(e){var t=this,n=jr(t),r=n.resolve,o=n.reject,i=br(function(){var n=[],i=0,a=1;vr(e,!1,function(e){var s=i++,u=!1;n.push(void 0),a++,t.resolve(e).then(function(e){u||(u=!0,n[s]=e,--a||r(n))},o)}),--a||r(n)});return i.e&&o(i.v),n.promise},race:function(e){var t=this,n=jr(t),r=n.reject,o=br(function(){vr(e,!1,function(e){t.resolve(e).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}});var Dr=["off","error","warn","info","log","debug"],Fr={},Lr=global.console;function Vr(e){var t=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return Fr[t]&&Fr[t][e]}function Wr(e){return e.map(function(e){return e="[object object]"===Object.prototype.toString.call(e).toLowerCase()?JSON.stringify(e):String(e)})}var Br=global.setTimeout,Ur=global.setTimeoutNative;function Jr(){if(void 0===setTimeout&&"function"==typeof Ur){var e={},t=0;global.setTimeout=function(n,r){e[++t]=n,Ur(t.toString(),r)},global.setTimeoutCallback=function(t){"function"==typeof e[t]&&(e[t](),delete e[t])}}}Jr();function zr(){Object.freeze(Object),Object.freeze(Array),function(){var e=Object.prototype,t="Object.prototype";qr(e,"__defineGetter__",t),qr(e,"__defineSetter__",t),qr(e,"__lookupGetter__",t),qr(e,"__lookupSetter__",t),qr(e,"constructor",t),qr(e,"hasOwnProperty",t),qr(e,"isPrototypeOf",t),qr(e,"propertyIsEnumerable",t),qr(e,"toLocaleString",t),qr(e,"toString",t),qr(e,"valueOf",t),Object.seal(e)}(),Object.freeze(Array.prototype),Object.freeze(String.prototype),Object.freeze(Number.prototype),Object.freeze(Boolean.prototype),function(){var e=Error.prototype,t="Error.prototype";qr(e,"name",t),qr(e,"message",t),qr(e,"toString",t),qr(e,"constructor",t),Object.seal(e)}(),Object.freeze(Date.prototype),Object.freeze(RegExp.prototype)}function qr(e,t,n){if(e.hasOwnProperty(t)){var r=e[t];Object.defineProperty(e,t,{get:function(){return r},set:function(r){if(this===e)throw Error("Cannot assign to read only property "+t+" of "+n);return Object.defineProperty(this,t,{value:r,writable:!0}),r}})}}var Hr=1;function Gr(){return(Hr++).toString()}function Xr(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1)}function Kr(e){if("function"!=typeof btoa)return"";var t=Array.prototype.map.call(new Uint8Array(e),function(e){return String.fromCharCode(e)}).join("");return btoa(t)}function Zr(e){if(!e||"object"!=typeof e)return!0;for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t))return!1;return!0}function Qr(e){if("Object"===Xr(e)){if(e["@type"]&&"binary"===e["@type"])return function(e){if("function"!=typeof atob)return new ArrayBuffer(0);var t=atob(e),n=new Uint8Array(t.length);return Array.prototype.forEach.call(t,function(e,t){n[t]=e.charCodeAt(0)}),n.buffer}(e.base64||"");var t={};for(var n in e)t[n]=Qr(e[n]);return t}return"Array"===Xr(e)?e.map(Qr):e}function Yr(e,t,n){return t+"@"+n+"#"+e}var eo=function(e){this.instanceId=String(e),this.lastCallbackId=0,this.callbacks={},this.hooks={}};eo.prototype.add=function(e){return this.lastCallbackId++,this.callbacks[this.lastCallbackId]=e,this.lastCallbackId},eo.prototype.remove=function(e){var t=this.callbacks[e];return delete this.callbacks[e],t},eo.prototype.registerHook=function(e,t,n,r){var o=Yr(e,t,n);this.hooks[o]&&console.warn('[JS Framework] Override an existing component hook "'+o+'".'),this.hooks[o]=r},eo.prototype.triggerHook=function(e,t,n,r){void 0===r&&(r={});var o=Yr(e,t,n),i=this.hooks[o];if("function"!=typeof i)return console.error("[JS Framework] Invalid hook function type ("+typeof i+') on "'+o+'".'),null;var a=null;try{a=i.apply(null,r.args||[])}catch(e){console.error('[JS Framework] Failed to execute the hook function on "'+o+'".')}return a},eo.prototype.consume=function(e,t,n){var r=this.callbacks[e];return void 0!==n&&!1!==n||delete this.callbacks[e],"function"==typeof r?r(Qr(t)):new Error('invalid callback id "'+e+'"')},eo.prototype.close=function(){this.callbacks={},this.hooks={}};var to={};function no(e){return to[e]}function ro(e){var t=to[e];return t&&t.taskCenter?t.taskCenter:null}function oo(e,t,n){var r=e.documentElement;if(!(r.pureChildren.length>0||t.parentNode)){var o=r.children,i=o.indexOf(n);i<0?o.push(t):o.splice(i,0,t),1===t.nodeType?("body"===t.role?(t.docId=e.id,t.ownerDocument=e,t.parentNode=r,ao(t,r)):(t.children.forEach(function(e){e.parentNode=t}),io(e,t),t.docId=e.id,t.ownerDocument=e,ao(t,r),delete e.nodeMap[t.nodeId]),r.pureChildren.push(t),function(e,t){var n=t.toJSON();e&&e.taskCenter&&"function"==typeof e.taskCenter.send&&e.taskCenter.send("dom",{action:"createBody"},[n])}(e,t)):(t.parentNode=r,e.nodeMap[t.ref]=t)}}function io(e,t){t.role="body",t.depth=1,delete e.nodeMap[t.nodeId],t.ref="_root",e.nodeMap._root=t,e.body=t}function ao(e,t){e.parentNode=t,t.docId&&(e.docId=t.docId,e.ownerDocument=t.ownerDocument,e.ownerDocument.nodeMap[e.nodeId]=e,e.depth=t.depth+1),e.children.forEach(function(t){ao(t,e)})}function so(e){for(;e;){if(1===e.nodeType)return e;e=e.nextSibling}}function uo(e){for(;e;){if(1===e.nodeType)return e;e=e.previousSibling}}function co(e,t,n,r){n<0&&(n=0);var o=t[n-1],i=t[n];return t.splice(n,0,e),r&&(o&&(o.nextSibling=e),e.previousSibling=o,e.nextSibling=i,i&&(i.previousSibling=e)),n}function lo(e,t,n,r){var o=t.indexOf(e);if(o<0)return-1;if(r){var i=t[o-1],a=t[o+1];i&&(i.nextSibling=a),a&&(a.previousSibling=i)}t.splice(o,1);var s=n;o<=n&&(s=n-1);var u=t[s-1],c=t[s];return t.splice(s,0,e),r&&(u&&(u.nextSibling=e),e.previousSibling=u,e.nextSibling=c,c&&(c.previousSibling=e)),o===s?-1:n}function fo(e,t,n){var r=t.indexOf(e);if(!(r<0)){if(n){var o=t[r-1],i=t[r+1];o&&(o.nextSibling=i),i&&(i.previousSibling=o)}t.splice(r,1)}}var po=function(){this.nodeId=Gr(),this.ref=this.nodeId,this.children=[],this.pureChildren=[],this.parentNode=null,this.nextSibling=null,this.previousSibling=null};po.prototype.destroy=function(){var e=no(this.docId);e&&(delete this.docId,delete e.nodeMap[this.nodeId]),this.children.forEach(function(e){e.destroy()})};var ho;var vo={};var yo="div",mo=["click","longpress","touchstart","touchmove","touchend","panstart","panmove","panend","horizontalpan","verticalpan","swipe"];function _o(e,t){no(e).nodeMap[t.nodeId]=t}var go=function(e){function t(t,n,r){void 0===t&&(t=yo),e.call(this);var o,i=(o=t,vo[o]);if(i&&!r)return new i(t,n,!0);n=n||{},this.nodeType=1,this.nodeId=Gr(),this.ref=this.nodeId,this.type=t,this.attr=n.attr||{},this.style=n.style||{},this.classStyle=n.classStyle||{},this.event={},this.children=[],this.pureChildren=[]}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.appendChild=function(e){if(!e.parentNode||e.parentNode===this)if(e.parentNode){if(lo(e,this.children,this.children.length,!0),1===e.nodeType){var t=lo(e,this.pureChildren,this.pureChildren.length),n=ro(this.docId);if(n&&t>=0)return n.send("dom",{action:"moveElement"},[e.ref,this.ref,t])}}else if(ao(e,this),co(e,this.children,this.children.length,!0),this.docId&&_o(this.docId,e),1===e.nodeType){co(e,this.pureChildren,this.pureChildren.length);var r=ro(this.docId);if(r)return r.send("dom",{action:"addElement"},[this.ref,e.toJSON(),-1])}},t.prototype.insertBefore=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.nextSibling&&e.nextSibling===t))if(e.parentNode){if(lo(e,this.children,this.children.indexOf(t),!0),1===e.nodeType){var n=so(t),r=lo(e,this.pureChildren,n?this.pureChildren.indexOf(n):this.pureChildren.length),o=ro(this.docId);if(o&&r>=0)return o.send("dom",{action:"moveElement"},[e.ref,this.ref,r])}}else if(ao(e,this),co(e,this.children,this.children.indexOf(t),!0),this.docId&&_o(this.docId,e),1===e.nodeType){var i=so(t),a=co(e,this.pureChildren,i?this.pureChildren.indexOf(i):this.pureChildren.length),s=ro(this.docId);if(s)return s.send("dom",{action:"addElement"},[this.ref,e.toJSON(),a])}},t.prototype.insertAfter=function(e,t){if(!(e.parentNode&&e.parentNode!==this||e===t||e.previousSibling&&e.previousSibling===t))if(e.parentNode){if(lo(e,this.children,this.children.indexOf(t)+1,!0),1===e.nodeType){var n=lo(e,this.pureChildren,this.pureChildren.indexOf(uo(t))+1),r=ro(this.docId);if(r&&n>=0)return r.send("dom",{action:"moveElement"},[e.ref,this.ref,n])}}else if(ao(e,this),co(e,this.children,this.children.indexOf(t)+1,!0),this.docId&&_o(this.docId,e),1===e.nodeType){var o=co(e,this.pureChildren,this.pureChildren.indexOf(uo(t))+1),i=ro(this.docId);if(i)return i.send("dom",{action:"addElement"},[this.ref,e.toJSON(),o])}},t.prototype.removeChild=function(e,t){if(e.parentNode&&(fo(e,this.children,!0),1===e.nodeType)){fo(e,this.pureChildren);var n=ro(this.docId);n&&n.send("dom",{action:"removeElement"},[e.ref])}t||e.destroy()},t.prototype.clear=function(){var e=ro(this.docId);e&&this.pureChildren.forEach(function(t){e.send("dom",{action:"removeElement"},[t.ref])}),this.children.forEach(function(e){e.destroy()}),this.children.length=0,this.pureChildren.length=0},t.prototype.setAttr=function(e,t,n){if(this.attr[e]!==t||!1===n){this.attr[e]=t;var r=ro(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateAttrs"},[this.ref,o])}}},t.prototype.setAttrs=function(e,t){if(!Zr(e)){var n={};for(var r in e)this.attr[r]!==e[r]&&(this.attr[r]=e[r],n[r]=e[r]);if(!Zr(n)){var o=ro(this.docId);!t&&o&&o.send("dom",{action:"updateAttrs"},[this.ref,n])}}},t.prototype.setStyle=function(e,t,n){if(this.style[e]!==t||!1===n){this.style[e]=t;var r=ro(this.docId);if(!n&&r){var o={};o[e]=t,r.send("dom",{action:"updateStyle"},[this.ref,o])}}},t.prototype.setStyles=function(e,t){if(!Zr(e)){var n={};for(var r in e)this.style[r]!==e[r]&&(this.style[r]=e[r],n[r]=e[r]);if(!Zr(n)){var o=ro(this.docId);!t&&o&&o.send("dom",{action:"updateStyle"},[this.ref,n])}}},t.prototype.setClassStyle=function(e){for(var t in this.classStyle)this.classStyle[t]="";Object.assign(this.classStyle,e);var n=ro(this.docId);n&&n.send("dom",{action:"updateStyle"},[this.ref,this.toStyle()])},t.prototype.addEvent=function(e,t,n){if(this.event||(this.event={}),!this.event[e]){this.event[e]={handler:t,params:n};var r=ro(this.docId);r&&r.send("dom",{action:"addEvent"},[this.ref,e])}},t.prototype.removeEvent=function(e){if(this.event&&this.event[e]){delete this.event[e];var t=ro(this.docId);t&&t.send("dom",{action:"removeEvent"},[this.ref,e])}},t.prototype.fireEvent=function(e,t,n,r){var o=null,i=!1,a=this.event[e];if(a&&t){var s=a.handler;t.stopPropagation=function(){i=!0},o=r&&r.params?s.call.apply(s,[this].concat(r.params,[t])):s.call(this,t)}return!i&&n&&-1!==mo.indexOf(e)&&this.parentNode&&this.parentNode.fireEvent&&(t.currentTarget=this.parentNode,this.parentNode.fireEvent(e,t,n)),o},t.prototype.toStyle=function(){return Object.assign({},this.classStyle,this.style)},t.prototype.toJSON=function(){var e={ref:this.ref.toString(),type:this.type,attr:this.attr,style:this.toStyle()},t=[];for(var n in this.event){var r=this.event[n].params;r?t.push({type:n,params:r}):t.push(n)}return t.length&&(e.event=t),this.pureChildren.length&&(e.children=this.pureChildren.map(function(e){return e.toJSON()})),e},t.prototype.toString=function(){return"<"+this.type+" attr="+JSON.stringify(this.attr)+" style="+JSON.stringify(this.toStyle())+">"+this.pureChildren.map(function(e){return e.toString()}).join("")+"</"+this.type+">"},t}(po);ho=go;var bo=function(){},wo=function(e,t){Object.defineProperty(this,"instanceId",{enumerable:!0,value:String(e)}),Object.defineProperty(this,"callbackManager",{enumerable:!0,value:new eo(e)}),bo=t||function(){}};wo.prototype.callback=function(e,t,n){return this.callbackManager.consume(e,t,n)},wo.prototype.registerHook=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return(n=this.callbackManager).registerHook.apply(n,e);var n},wo.prototype.triggerHook=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return(n=this.callbackManager).triggerHook.apply(n,e);var n},wo.prototype.updateData=function(e,t,n){this.send("module",{module:"dom",method:"updateComponentData"},[e,t,n])},wo.prototype.destroyCallback=function(){return this.callbackManager.close()},wo.prototype.normalize=function(e){var t=Xr(e);return e&&e instanceof go?e.ref:e&&e._isVue&&e.$el instanceof go?e.$el.ref:"Function"===t?this.callbackManager.add(e).toString():function(e){var t=Xr(e);switch(t){case"Undefined":case"Null":return"";case"RegExp":return e.toString();case"Date":return e.toISOString();case"Number":case"String":case"Boolean":case"Array":case"Object":return e;case"ArrayBuffer":return{"@type":"binary",dataType:t,base64:Kr(e)};case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":return{"@type":"binary",dataType:t,base64:Kr(e.buffer)};default:return JSON.stringify(e)}}(e)},wo.prototype.send=function(e,t,n,r){var o=this,i=t.action,a=t.component,s=t.ref,u=t.module,c=t.method;switch(n=n.map(function(e){return o.normalize(e)}),e){case"dom":return this[i](this.instanceId,n);case"component":return this.componentHandler(this.instanceId,s,c,n,Object.assign({component:a},r));default:return this.moduleHandler(this.instanceId,u,c,n,r)}},wo.prototype.callDOM=function(e,t){return this[e](this.instanceId,t)},wo.prototype.callComponent=function(e,t,n,r){return this.componentHandler(this.instanceId,e,t,n,r)},wo.prototype.callModule=function(e,t,n,r){return this.moduleHandler(this.instanceId,e,t,n,r)};function Co(e,t){var n=no(e);return n?Array.isArray(t)?t.map(function(e){switch(e.method){case"callback":return function(e,t,n,r){return e.taskCenter.callback(t,n,r)}.apply(void 0,[n].concat(e.args));case"fireEventSync":case"fireEvent":return function(e,t,n,r,o,i){var a=e.getRef(t);return a?e.fireEvent(a,n,r,o,i):new Error('invalid element reference "'+t+'"')}.apply(void 0,[n].concat(e.args));case"componentHook":return function(e,t,n,r,o){if(!e||!e.taskCenter)return console.error('[JS Framework] Can\'t find "document" or "taskCenter".'),null;var i=null;try{i=e.taskCenter.triggerHook(t,n,r,o)}catch(e){console.error('[JS Framework] Failed to trigger the "'+n+"@"+r+'" hook on '+t+".")}return i}.apply(void 0,[n].concat(e.args))}}):void 0:new Error("[JS Framework] Failed to receiveTasks, instance ("+e+") is not available.")}var ko={};function xo(e){var t=function(t){ko[t]||(ko[t]={}),e[t].forEach(function(e){"string"==typeof e?ko[t][e]=!0:ko[t][e.name]=e.args})};for(var n in e)t(n)}function So(e,t){return"string"==typeof t?!(!ko[e]||!ko[e][t]):!!ko[e]}var Eo={};function Oo(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?Eo[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(Eo[e.type]=e,function(e,t){if(t&&t.length){var n=function(e){function t(){e.apply(this,arguments)}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t}(ho);t.forEach(function(t){n.prototype[t]=function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var o=ro(this.docId);if(o)return o.send("component",{ref:this.ref,component:e,method:t},n)}}),vo[e]=n}}(e.type,e.methods)))})}function jo(e){return!!Eo[e]}var Ao=[];function Io(e,t){Po(e)?console.warn('Service "'+e+'" has been registered already!'):(t=Object.assign({},t),Ao.push({name:e,options:t}))}function To(e){Ao.some(function(t,n){if(t.name===e)return Ao.splice(n,1),!0})}function Po(e){return t=e,Ao.map(function(e){return e.name}).indexOf(t)>=0;var t}var No=function(e){function t(t){e.call(this),this.nodeType=8,this.nodeId=Gr(),this.ref=this.nodeId,this.type="comment",this.value=t,this.children=[],this.pureChildren=[]}return e&&(t.__proto__=e),t.prototype=Object.create(e&&e.prototype),t.prototype.constructor=t,t.prototype.toString=function(){return"\x3c!-- "+this.value+" --\x3e"},t}(po);function Mo(e,t){return void 0===t&&(t=[]),{module:"dom",method:e,args:t}}var $o=function(e,t){this.id=e,this.batched=!1,this.updates=[],"function"==typeof t?Object.defineProperty(this,"handler",{configurable:!0,enumerable:!0,writable:!0,value:t}):console.error("[JS Runtime] invalid parameter, handler must be a function")};$o.prototype.createFinish=function(e){return(0,this.handler)([Mo("createFinish")],e)},$o.prototype.updateFinish=function(e){return(0,this.handler)([Mo("updateFinish")],e)},$o.prototype.refreshFinish=function(e){return(0,this.handler)([Mo("refreshFinish")],e)},$o.prototype.createBody=function(e){var t=e.toJSON(),n=t.children;delete t.children;var r=[Mo("createBody",[t])];return n&&r.push.apply(r,n.map(function(e){return Mo("addElement",[t.ref,e,-1])})),this.addActions(r)},$o.prototype.addElement=function(e,t,n){return n>=0||(n=-1),this.addActions(Mo("addElement",[t,e.toJSON(),n]))},$o.prototype.removeElement=function(e){if(Array.isArray(e)){var t=e.map(function(e){return Mo("removeElement",[e])});return this.addActions(t)}return this.addActions(Mo("removeElement",[e]))},$o.prototype.moveElement=function(e,t,n){return this.addActions(Mo("moveElement",[e,t,n]))},$o.prototype.setAttr=function(e,t,n){var r={};return r[t]=n,this.addActions(Mo("updateAttrs",[e,r]))},$o.prototype.setStyle=function(e,t,n){var r={};return r[t]=n,this.addActions(Mo("updateStyle",[e,r]))},$o.prototype.setStyles=function(e,t){return this.addActions(Mo("updateStyle",[e,t]))},$o.prototype.addEvent=function(e,t){return this.addActions(Mo("addEvent",[e,t]))},$o.prototype.removeEvent=function(e,t){return this.addActions(Mo("removeEvent",[e,t]))},$o.prototype.handler=function(e,t){return t&&t()},$o.prototype.addActions=function(e){var t=this.updates,n=this.handler;if(Array.isArray(e)||(e=[e]),!this.batched)return n(e);t.push.apply(t,e)};var Ro={createBody:"callCreateBody",addElement:"callAddElement",removeElement:"callRemoveElement",moveElement:"callMoveElement",updateAttrs:"callUpdateAttrs",updateStyle:"callUpdateStyle",addEvent:"callAddEvent",removeEvent:"callRemoveEvent"};function Do(e,t,n){var r=t.module,o=t.method,i=t.args;if(a=o,"dom"===r&&Ro[a]&&"function"==typeof global[Ro[a]])return global[Ro[o]].apply(global,[e].concat(i,["-1"]));var a;return n(e,[t],"-1")}var Fo=function e(t,n,r){t=t?t.toString():"",this.id=t,this.URL=n,i=this,(o=t)&&(to[o]=i);var o,i;this.nodeMap={};var a=e.Listener||$o;this.listener=new a(t,r||function(e,t){var n=t||global.callNative;return"function"!=typeof n&&console.error("[JS Runtime] no default handler"),function(t){Array.isArray(t)||(t=[t]);for(var r=0;r<t.length;r++){var o=Do(e,t[r],n);if(-1===o)return o}}}(t,e.handler)),this.taskCenter=new wo(t,r?function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return r.apply(void 0,t)}:e.handler),this.createDocumentElement()};Fo.prototype.getRef=function(e){return this.nodeMap[e]},Fo.prototype.open=function(){this.listener.batched=!1},Fo.prototype.close=function(){this.listener.batched=!0},Fo.prototype.createDocumentElement=function(){var e=this;if(!this.documentElement){var t=new go("document");t.docId=this.id,t.ownerDocument=this,t.role="documentElement",t.depth=0,t.ref="_documentElement",this.nodeMap._documentElement=t,this.documentElement=t,Object.defineProperty(t,"appendChild",{configurable:!0,enumerable:!0,writable:!0,value:function(t){oo(e,t)}}),Object.defineProperty(t,"insertBefore",{configurable:!0,enumerable:!0,writable:!0,value:function(t,n){oo(e,t,n)}})}return this.documentElement},Fo.prototype.createBody=function(e,t){if(!this.body){io(this,new go(e,t))}return this.body},Fo.prototype.createElement=function(e,t){return new go(e,t)},Fo.prototype.createComment=function(e){return new No(e)},Fo.prototype.fireEvent=function(e,t,n,r,o){if(e){(n=n||{}).type=n.type||t,n.target=e,n.currentTarget=e,n.timestamp=Date.now(),r&&function(e,t){var n=t.attrs||{};for(var r in n)e.setAttr(r,n[r],!0);var o=t.style||{};for(var i in o)e.setStyle(i,o[i],!0)}(e,r);var i="true"===this.getRef("_root").attr.bubble;return e.fireEvent(t,n,i,o)}},Fo.prototype.destroy=function(){this.taskCenter.destroyCallback(),delete this.listener,delete this.nodeMap,delete this.taskCenter,e=this.id,delete to[e];var e},Fo.handler=null;var Lo={};function Vo(e,t,n){var r=ro(e);return r&&"function"==typeof r.send?function(){for(var e=[],o=arguments.length;o--;)e[o]=arguments[o];return r.send("module",{module:t,method:n},e)}:(console.error("[JS Framework] Failed to find taskCenter ("+e+")."),null)}var Wo=function(e,t){n=this,r=String(e),Object.defineProperty(n,"[[CurrentInstanceId]]",{value:r});var n,r;this.config=t||{},this.document=new Fo(e,this.config.bundleUrl),this.requireModule=this.requireModule.bind(this),this.isRegisteredModule=So,this.isRegisteredComponent=jo};Wo.prototype.requireModule=function(e){var t,n=(t=this,t["[[CurrentInstanceId]]"]);if(n&&this.document&&this.document.taskCenter){if(So(e)){var r=e+"#"+n;if(!Lo[r]){var o=(u=e,ko[u]),i={},a=function(t){Object.defineProperty(i,t,{enumerable:!0,configurable:!0,get:function(){return Vo(n,e,t)},set:function(r){return function(e,t,n,r){var o=ro(e);return o&&"function"==typeof o.send?"function"!=typeof r?(console.error("[JS Framework] "+t+"."+n+" must be assigned as a function."),null):function(e){return o.send("module",{module:t,method:n},[e])}:(console.error("[JS Framework] Failed to find taskCenter ("+e+")."),null)}(n,e,t,r)}})};for(var s in o)a(s);"function"==typeof Proxy?Lo[r]=new Proxy(i,{get:function(t,r){return r in t?t[r]:(console.warn('[JS Framework] using unregistered method "'+e+"."+r+'"'),Vo(n,e,r))}}):Lo[r]=i}var u;return Lo[r]}console.warn('[JS Framework] using unregistered weex module "'+e+'"')}else console.error('[JS Framework] Failed to requireModule("'+e+'"), instance ('+n+") doesn't exist anymore.")},Wo.prototype.supports=function(e){if("string"!=typeof e)return null;var t=e.match(/^@(\w+)\/(\w+)(\.(\w+))?$/i);if(t){var n=t[1],r=t[2],o=t[4];switch(n){case"module":return So(r,o);case"component":return jo(r)}}return null};var Bo,Uo,Jo=/^\s*\/\/ *(\{[^}]*\}) *\r?\n/;var zo={};function qo(e){return zo[e]}function Ho(e,t,n){void 0===t&&(t={});var r=new Wo(e,t);Object.freeze(r);var o=t.bundleType||"Vue";zo[e]=o;var i=Uo.frameworks[o];if(!i)return new Error('[JS Framework] Invalid bundle type "'+o+'".');!function(e,t,n){var r=ro(e);if(r&&"function"==typeof r.send)if(t&&n){var o="jsfm."+t+"."+n;try{if(So("userTrack","addPerfPoint")){var i=Object.create(null);i[o]="4",r.send("module",{module:"userTrack",method:"addPerfPoint"},[i])}}catch(e){console.error('[JS Framework] Failed to trace "'+o+'"!')}}else console.warn("[JS Framework] Invalid track type ("+t+") or value ("+n+")");else console.error("[JS Framework] Failed to create tracker!")}(e,"bundleType",o);var a=function(e,t,n){var r=Object.create(null);return r.service=Object.create(null),Ao.forEach(function(o){o.name;var i=o.options.create;if(i){var a=i(e,t,n);Object.assign(r.service,a),Object.assign(r,a.instance)}}),delete r.service.instance,Object.freeze(r.service),r}(e,{weex:r,bundleType:o},Uo);Object.freeze(a);var s=Object.create(null);Object.assign(s,a,{weex:r,services:a}),Object.freeze(s);var u=Object.create(s);return"function"==typeof i.createInstanceContext&&Object.assign(u,i.createInstanceContext(e,s,n)),Object.freeze(u),u}var Go={createInstance:function(e,t,n,r){if(zo[e])return new Error('The instance id "'+e+'" has already been used!');var o=function(e){var t=Jo.exec(e);if(t)try{return JSON.parse(t[1]).framework}catch(e){}return"Weex"}(t);zo[e]=o,(n=JSON.parse(JSON.stringify(n||{}))).env=JSON.parse(JSON.stringify(global.WXEnvironment||{})),n.bundleType=o;var i=Uo.frameworks[o];if(!i)return new Error('[JS Framework] Invalid bundle type "'+o+'".');"Weex"===o&&console.error('[JS Framework] COMPATIBILITY WARNING: Weex DSL 1.0 (.we) framework is no longer supported! It will be removed in the next version of WeexSDK, your page would be crash if you still using the ".we" framework. Please upgrade it to Vue.js or Rax.');var a=Ho(e,n,r);if("function"==typeof i.createInstance){if("Rax"===o||"Weex"===o){var s=Object.assign({config:n,created:Date.now(),framework:o},a);return i.createInstance(e,t,n,r,s)}return i.createInstance(e,t,n,r,a)}!function(e,t){var n=[],r=[];for(var o in t)n.push(o),r.push(t[o]);var i="\n    (function (global) {\n      "+e+"\n    })(Object.create(this))\n  ";(new(Function.prototype.bind.apply(Function,[null].concat(n,[i])))).apply(void 0,r)}(t,a)},createInstanceContext:Ho,getRoot:function(e){var t=no(e);try{if(t&&t.body)return t.body.toJSON()}catch(e){return void console.error("[JS Framework] Failed to get the virtual dom tree.")}},getDocument:no,registerService:Io,unregisterService:To,callJS:function(e,t){var n=Bo[qo(e)];return n&&"function"==typeof n.receiveTasks?n.receiveTasks(e,t):Co(e,t)}};function Xo(e){Go[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=t[0],o=qo(r);if(o&&Bo[o]){var i=(s=Bo[o])[e].apply(s,t),a={framework:o};return"refreshInstance"===e?Ao.forEach(function(e){var t=e.options.refresh;t&&t(r,{info:a,runtime:Uo})}):"destroyInstance"===e&&(Ao.forEach(function(e){var t=e.options.destroy;t&&t(r,{info:a,runtime:Uo})}),delete zo[r]),i}return new Error('[JS Framework] Using invalid instance id "'+r+'" when calling '+e+".");var s}}function Ko(e,t){Go[e]=function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];"function"==typeof t&&t.apply(void 0,n);for(var o in Uo.frameworks){var i=Uo.frameworks[o];i&&i[e]&&i[e].apply(i,n)}}}var Zo={Document:Fo,Element:go,Comment:No,Listener:$o,TaskCenter:wo,sendTasks:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];return"function"==typeof callNative?callNative.apply(void 0,e):(global.callNative||function(){}).apply(void 0,e)}};Fo.handler=Zo.sendTasks;var Qo={setNativeConsole:function(){if(Dr.forEach(function(e){var t=Dr.indexOf(e);Fr[e]={},Dr.forEach(function(n){var r=Dr.indexOf(n);r<=t&&(Fr[e][n]=!0)})}),global.WXEnvironment&&"Web"!==global.WXEnvironment.platform)global.console={debug:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("debug")&&global.nativeLog.apply(global,Wr(e).concat(["__DEBUG"]))},log:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("log")&&global.nativeLog.apply(global,Wr(e).concat(["__LOG"]))},info:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("info")&&global.nativeLog.apply(global,Wr(e).concat(["__INFO"]))},warn:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("warn")&&global.nativeLog.apply(global,Wr(e).concat(["__WARN"]))},error:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("error")&&global.nativeLog.apply(global,Wr(e).concat(["__ERROR"]))}};else{var e=console.debug,t=console.log,n=console.info,r=console.warn,o=console.error;console.__ori__={debug:e,log:t,info:n,warn:r,error:o},console.debug=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("debug")&&console.__ori__.debug.apply(console,e)},console.log=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("log")&&console.__ori__.log.apply(console,e)},console.info=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("info")&&console.__ori__.info.apply(console,e)},console.warn=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("warn")&&console.__ori__.warn.apply(console,e)},console.error=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];Vr("error")&&console.__ori__.error.apply(console,e)}}},resetNativeConsole:function(){Fr={},global.console=Lr},setNativeTimer:Jr,resetNativeTimer:function(){global.setTimeout=Br,global.setTimeoutCallback=null},service:{register:Io,unregister:To,has:Po},freezePrototype:function(){zr(),Object.freeze(Zo.Comment),Object.freeze(Zo.Listener),Object.freeze(Zo.Document.prototype),Object.freeze(Zo.Comment.prototype),Object.freeze(Zo.Listener.prototype)},init:function(e){Bo=(Uo=e||{}).frameworks||{},function(){var e={createFinish:global.callCreateFinish,updateFinish:global.callUpdateFinish,refreshFinish:global.callRefreshFinish,createBody:global.callCreateBody,addElement:global.callAddElement,removeElement:global.callRemoveElement,moveElement:global.callMoveElement,updateAttrs:global.callUpdateAttrs,updateStyle:global.callUpdateStyle,addEvent:global.callAddEvent,removeEvent:global.callRemoveEvent},t=wo.prototype,n=function(n){var r=e[n];t[n]=r?function(e,t){return r.apply(void 0,[e].concat(t))}:function(e,t){return bo(e,[{module:"dom",method:n,args:t}],"-1")}};for(var r in e)n(r);t.componentHandler=global.callNativeComponent||function(e,t,n,r,o){return bo(e,[{component:o.component,ref:t,method:n,args:r}])},t.moduleHandler=global.callNativeModule||function(e,t,n,r){return bo(e,[{module:t,method:n,args:r}])}}();for(var t in Bo){var n=Bo[t];if("function"==typeof n.init)try{n.init(e)}catch(e){}}return Ko("registerComponents",Oo),Ko("registerModules",xo),Ko("registerMethods"),["destroyInstance","refreshInstance"].forEach(Xo),Go},config:Zo};function Yo(e,t){void 0===t&&(t={}),this.type=e||"message",this.data=t.data||null,this.origin=t.origin||"",this.source=t.source||null,this.ports=t.ports||[],this.target=null,this.timeStamp=Date.now()}var ei={},ti={};function ni(){}ni.prototype.postMessage=function(e){if(this._closed)throw new Error('BroadcastChannel "'+this.name+'" is closed.');var t=ei[this.name];if(t&&t.length)for(var n=0;n<t.length;++n){var r=t[n];r._closed||r===this||"function"==typeof r.onmessage&&r.onmessage(new Yo("message",{data:e}))}},ni.prototype.close=function(){var e=this;if(!this._closed&&(this._closed=!0,ei[this.name])){var t=ei[this.name].filter(function(t){return t!==e});t.length?ei[this.name]=t:delete ei[this.name]}};var ri={BroadcastChannel:{create:function(e,t,n){if(ti[e]=[],"function"==typeof global.BroadcastChannel)return{};var r={BroadcastChannel:function(t){Object.defineProperty(this,"name",{configurable:!1,enumerable:!0,writable:!1,value:String(t)}),this._closed=!1,this.onmessage=null,ei[this.name]||(ei[this.name]=[]),ei[this.name].push(this),ti[e].push(this)}};return r.BroadcastChannel.prototype=ni.prototype,{instance:r}},destroy:function(e,t){ti[e].forEach(function(e){return e.close()}),delete ti[e]}}},oi={},ii={};var ai=Object.freeze({init:function(e){oi.Document=e.Document,oi.Element=e.Element,oi.Comment=e.Comment,oi.sendTasks=e.sendTasks},createInstance:function(e,t,n,r,o){void 0===n&&(n={}),void 0===r&&(r={}),void 0===o&&(o={});var i=new oi.Document(e,n.bundleUrl),a={},s={id:e,data:r,document:i,callbacks:a},u=0;i.addCallback=function(e){return a[++u]=e,u},i.handleCallback=function(e,t,n){var r=a[e];return n&&delete a[e],r(t)},ii[e]=s;var c=Object.assign({Document:oi.Document,Element:oi.Element,Comment:oi.Comment,sendTasks:function(t){return oi.sendTasks(e,t,-1)},options:n,document:i},o),l=[],f=[];for(var d in c)l.push(d),f.push(c[d]);return l.push(t),(new(Function.prototype.bind.apply(Function,[null].concat(l)))).apply(void 0,f),oi.sendTasks(e,[{module:"dom",method:"createFinish",args:[]}],-1),s},destroyInstance:function(e){delete ii[e]},getRoot:function(e){return ii[e].document.body.toJSON()},receiveTasks:function(e,t){var n={fireEvent:function(e,t,n,r,o){var i=ii[e].document,a=i.getRef(t);return i.fireEvent(a,n,r,o)},callback:function(e,t,n,r){return ii[e].document.handleCallback(t,n,r)}};if((ii[e]||{}).document&&Array.isArray(t)){var r=[];return t.forEach(function(t){var o=n[t.method],i=[].concat(t.args);"function"==typeof o&&(i.unshift(e),r.push(o.apply(void 0,i)))}),r}}}),si=r(function(e){e.exports=function(e,n){var r=Object.freeze({});function o(e){return void 0===e||null===e}function i(e){return void 0!==e&&null!==e}function a(e){return!0===e}function s(e){return"string"==typeof e||"number"==typeof e||"boolean"==typeof e}function u(e){return null!==e&&"object"==typeof e}var c=Object.prototype.toString;function l(e){return"[object Object]"===c.call(e)}function f(e){return"[object RegExp]"===c.call(e)}function d(e){var t=parseFloat(String(e));return t>=0&&Math.floor(t)===t&&isFinite(e)}function p(e){return null==e?"":"object"==typeof e?JSON.stringify(e,null,2):String(e)}function h(e){var t=parseFloat(e);return isNaN(t)?e:t}function v(e,t){for(var n=Object.create(null),r=e.split(","),o=0;o<r.length;o++)n[r[o]]=!0;return t?function(e){return n[e.toLowerCase()]}:function(e){return n[e]}}v("slot,component",!0);var y=v("key,ref,slot,slot-scope,is");function m(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}var _=Object.prototype.hasOwnProperty;function g(e,t){return _.call(e,t)}function b(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var w=/-(\w)/g,C=b(function(e){return e.replace(w,function(e,t){return t?t.toUpperCase():""})}),k=b(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),x=/\B([A-Z])/g,S=b(function(e){return e.replace(x,"-$1").toLowerCase()});function E(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n}function O(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function j(e,t){for(var n in t)e[n]=t[n];return e}function A(e,t,n){}var I=function(e,t,n){return!1},T=function(e){return e};function P(e,t){if(e===t)return!0;var n=u(e),r=u(t);if(!n||!r)return!n&&!r&&String(e)===String(t);try{var o=Array.isArray(e),i=Array.isArray(t);if(o&&i)return e.length===t.length&&e.every(function(e,n){return P(e,t[n])});if(o||i)return!1;var a=Object.keys(e),s=Object.keys(t);return a.length===s.length&&a.every(function(n){return P(e[n],t[n])})}catch(e){return!1}}function N(e,t){for(var n=0;n<e.length;n++)if(P(e[n],t))return n;return-1}function M(e){var t=!1;return function(){t||(t=!0,e.apply(this,arguments))}}var $="data-server-rendered",R=["component","directive","filter"],D=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],F={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:I,isReservedAttr:I,isUnknownElement:I,getTagNamespace:A,parsePlatformTagName:T,mustUseProp:I,_lifecycleHooks:D};function L(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}function V(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}var W=/[^\w.$]/;var B="__proto__"in{},U="undefined"!=typeof window,J="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,z=J&&WXEnvironment.platform.toLowerCase(),q=U&&window.navigator.userAgent.toLowerCase(),H=(q&&/msie|trident/.test(q),q&&q.indexOf("msie 9.0")>0),G=q&&q.indexOf("edge/")>0,X=(q&&q.indexOf("android"),q&&/iphone|ipad|ipod|ios/.test(q)||"ios"===z),K=(q&&/chrome\/\d+/.test(q),{}.watch);if(U)try{var Z={};Object.defineProperty(Z,"passive",{get:function(){}}),window.addEventListener("test-passive",null,Z)}catch(e){}var Q,Y=function(){return void 0===Q&&(Q=!U&&void 0!==t&&"server"===t.process.env.VUE_ENV),Q},ee=U&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function te(e){return"function"==typeof e&&/native code/.test(e.toString())}var ne,re="undefined"!=typeof Symbol&&te(Symbol)&&"undefined"!=typeof Reflect&&te(Reflect.ownKeys);ne="undefined"!=typeof Set&&te(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var oe=A,ie=0,ae=function(){this.id=ie++,this.subs=[]};ae.prototype.addSub=function(e){this.subs.push(e)},ae.prototype.removeSub=function(e){m(this.subs,e)},ae.prototype.depend=function(){ae.target&&ae.target.addDep(this)},ae.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()},ae.target=null;var se=[];var ue=function(e,t,n,r,o,i,a,s){this.tag=e,this.data=t,this.children=n,this.text=r,this.elm=o,this.ns=void 0,this.context=i,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=t&&t.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},ce={child:{configurable:!0}};ce.child.get=function(){return this.componentInstance},Object.defineProperties(ue.prototype,ce);var le=function(e){void 0===e&&(e="");var t=new ue;return t.text=e,t.isComment=!0,t};function fe(e){return new ue(void 0,void 0,void 0,String(e))}function de(e,t){var n=e.componentOptions,r=new ue(e.tag,e.data,e.children,e.text,e.elm,e.context,n,e.asyncFactory);return r.ns=e.ns,r.isStatic=e.isStatic,r.key=e.key,r.isComment=e.isComment,r.fnContext=e.fnContext,r.fnOptions=e.fnOptions,r.fnScopeId=e.fnScopeId,r.isCloned=!0,t&&(e.children&&(r.children=pe(e.children,!0)),n&&n.children&&(n.children=pe(n.children,!0))),r}function pe(e,t){for(var n=e.length,r=new Array(n),o=0;o<n;o++)r[o]=de(e[o],t);return r}var he=Array.prototype,ve=Object.create(he);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=he[e];V(ve,e,function(){for(var n=arguments,r=[],o=arguments.length;o--;)r[o]=n[o];var i,a=t.apply(this,r),s=this.__ob__;switch(e){case"push":case"unshift":i=r;break;case"splice":i=r.slice(2)}return i&&s.observeArray(i),s.dep.notify(),a})});var ye=Object.getOwnPropertyNames(ve),me={shouldConvert:!0},_e=function(e){if(this.value=e,this.dep=new ae,this.vmCount=0,V(e,"__ob__",this),Array.isArray(e)){(B?ge:be)(e,ve,ye),this.observeArray(e)}else this.walk(e)};_e.prototype.walk=function(e){for(var t=Object.keys(e),n=0;n<t.length;n++)Ce(e,t[n],e[t[n]])},_e.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)we(e[t])};function ge(e,t,n){e.__proto__=t}function be(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];V(e,i,t[i])}}function we(e,t){if(u(e)&&!(e instanceof ue)){var n;return g(e,"__ob__")&&e.__ob__ instanceof _e?n=e.__ob__:me.shouldConvert&&!Y()&&(Array.isArray(e)||l(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new _e(e)),t&&n&&n.vmCount++,n}}function Ce(e,t,n,r,o){var i=new ae,a=Object.getOwnPropertyDescriptor(e,t);if(!a||!1!==a.configurable){var s=a&&a.get,u=a&&a.set,c=!o&&we(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=s?s.call(e):n;return ae.target&&(i.depend(),c&&(c.dep.depend(),Array.isArray(t)&&function e(t){for(var n=void 0,r=0,o=t.length;r<o;r++)(n=t[r])&&n.__ob__&&n.__ob__.dep.depend(),Array.isArray(n)&&e(n)}(t))),t},set:function(t){var r=s?s.call(e):n;t===r||t!=t&&r!=r||(u?u.call(e,t):n=t,c=!o&&we(t),i.notify())}})}}function ke(e,t,n){if(Array.isArray(e)&&d(t))return e.length=Math.max(e.length,t),e.splice(t,1,n),n;if(t in e&&!(t in Object.prototype))return e[t]=n,n;var r=e.__ob__;return e._isVue||r&&r.vmCount?n:r?(Ce(r.value,t,n),r.dep.notify(),n):(e[t]=n,n)}function xe(e,t){if(Array.isArray(e)&&d(t))e.splice(t,1);else{var n=e.__ob__;e._isVue||n&&n.vmCount||g(e,t)&&(delete e[t],n&&n.dep.notify())}}var Se=F.optionMergeStrategies;function Ee(e,t){if(!t)return e;for(var n,r,o,i=Object.keys(t),a=0;a<i.length;a++)r=e[n=i[a]],o=t[n],g(e,n)?l(r)&&l(o)&&Ee(r,o):ke(e,n,o);return e}function Oe(e,t,n){return n?function(){var r="function"==typeof t?t.call(n,n):t,o="function"==typeof e?e.call(n,n):e;return r?Ee(r,o):o}:t?e?function(){return Ee("function"==typeof t?t.call(this,this):t,"function"==typeof e?e.call(this,this):e)}:t:e}Se.data=function(e,t,n){return n?Oe(e,t,n):t&&"function"!=typeof t?e:Oe(e,t)};function je(e,t){return t?e?e.concat(t):Array.isArray(t)?t:[t]:e}D.forEach(function(e){Se[e]=je});function Ae(e,t,n,r){var o=Object.create(e||null);return t?j(o,t):o}R.forEach(function(e){Se[e+"s"]=Ae}),Se.watch=function(e,t,n,r){if(e===K&&(e=void 0),t===K&&(t=void 0),!t)return Object.create(e||null);if(!e)return t;var o={};j(o,e);for(var i in t){var a=o[i],s=t[i];a&&!Array.isArray(a)&&(a=[a]),o[i]=a?a.concat(s):Array.isArray(s)?s:[s]}return o},Se.props=Se.methods=Se.inject=Se.computed=function(e,t,n,r){if(!e)return t;var o=Object.create(null);return j(o,e),t&&j(o,t),o},Se.provide=Oe;var Ie=function(e,t){return void 0===t?e:t};function Te(e,t,n){"function"==typeof t&&(t=t.options),function(e,t){var n=e.props;if(n){var r,o,i={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(o=n[r])&&(i[C(o)]={type:null});else if(l(n))for(var a in n)o=n[a],i[C(a)]=l(o)?o:{type:o};e.props=i}}(t),function(e,t){var n=e.inject;if(n){var r=e.inject={};if(Array.isArray(n))for(var o=0;o<n.length;o++)r[n[o]]={from:n[o]};else if(l(n))for(var i in n){var a=n[i];r[i]=l(a)?j({from:i},a):{from:a}}}}(t),function(e){var t=e.directives;if(t)for(var n in t){var r=t[n];"function"==typeof r&&(t[n]={bind:r,update:r})}}(t);var r=t.extends;if(r&&(e=Te(e,r,n)),t.mixins)for(var o=0,i=t.mixins.length;o<i;o++)e=Te(e,t.mixins[o],n);var a,s={};for(a in e)u(a);for(a in t)g(e,a)||u(a);function u(r){var o=Se[r]||Ie;s[r]=o(e[r],t[r],n,r)}return s}function Pe(e,t,n,r){if("string"==typeof n){var o=e[t];if(g(o,n))return o[n];var i=C(n);if(g(o,i))return o[i];var a=k(i);if(g(o,a))return o[a];var s=o[n]||o[i]||o[a];return s}}function Ne(e,t,n,r){var o=t[e],i=!g(n,e),a=n[e];if($e(Boolean,o.type)&&(i&&!g(o,"default")?a=!1:$e(String,o.type)||""!==a&&a!==S(e)||(a=!0)),void 0===a){a=function(e,t,n){if(!g(t,"default"))return;var r=t.default;0;if(e&&e.$options.propsData&&void 0===e.$options.propsData[n]&&void 0!==e._props[n])return e._props[n];return"function"==typeof r&&"Function"!==Me(t.type)?r.call(e):r}(r,o,e);var s=me.shouldConvert;me.shouldConvert=!0,we(a),me.shouldConvert=s}return a}function Me(e){var t=e&&e.toString().match(/^\s*function (\w+)/);return t?t[1]:""}function $e(e,t){if(!Array.isArray(t))return Me(t)===Me(e);for(var n=0,r=t.length;n<r;n++)if(Me(t[n])===Me(e))return!0;return!1}function Re(e,t,n){if(t)for(var r=t;r=r.$parent;){var o=r.$options.errorCaptured;if(o)for(var i=0;i<o.length;i++)try{if(!1===o[i].call(r,e,t,n))return}catch(e){De(e,r,"errorCaptured hook")}}De(e,t,n)}function De(e,t,n){if(F.errorHandler)try{return F.errorHandler.call(null,e,t,n)}catch(e){Fe(e,null,"config.errorHandler")}Fe(e,t,n)}function Fe(e,t,n){if(!U&&!J||"undefined"==typeof console)throw e;console.error(e)}var Le=[],Ve=!1;function We(){Ve=!1;var e=Le.slice(0);Le.length=0;for(var t=0;t<e.length;t++)e[t]()}var Be,Ue,Je=!1;if("undefined"!=typeof setImmediate&&te(setImmediate))Ue=function(){setImmediate(We)};else if("undefined"==typeof MessageChannel||!te(MessageChannel)&&"[object MessageChannelConstructor]"!==MessageChannel.toString())Ue=function(){setTimeout(We,0)};else{var ze=new MessageChannel,qe=ze.port2;ze.port1.onmessage=We,Ue=function(){qe.postMessage(1)}}if("undefined"!=typeof Promise&&te(Promise)){var He=Promise.resolve();Be=function(){He.then(We),X&&setTimeout(A)}}else Be=Ue;function Ge(e,t){var n;if(Le.push(function(){if(e)try{e.call(t)}catch(e){Re(e,t,"nextTick")}else n&&n(t)}),Ve||(Ve=!0,Je?Ue():Be()),!e&&"undefined"!=typeof Promise)return new Promise(function(e){n=e})}var Xe=new ne;function Ke(e){!function e(t,n){var r,o;var i=Array.isArray(t);if(!i&&!u(t)||Object.isFrozen(t))return;if(t.__ob__){var a=t.__ob__.dep.id;if(n.has(a))return;n.add(a)}if(i)for(r=t.length;r--;)e(t[r],n);else for(o=Object.keys(t),r=o.length;r--;)e(t[o[r]],n)}(e,Xe),Xe.clear()}var Ze=b(function(e){var t="&"===e.charAt(0),n="~"===(e=t?e.slice(1):e).charAt(0),r="!"===(e=n?e.slice(1):e).charAt(0);return{name:e=r?e.slice(1):e,once:n,capture:r,passive:t}});function Qe(e){function t(){var e=arguments,n=t.fns;if(!Array.isArray(n))return n.apply(null,arguments);for(var r=n.slice(),o=0;o<r.length;o++)r[o].apply(null,e)}return t.fns=e,t}function Ye(e,t,n,r,i){var a,s,u,c,f;for(a in e)s=u=e[a],c=t[a],f=Ze(a),l(s)&&(u=s.handler,f.params=s.params),o(u)||(o(c)?(o(u.fns)&&(u=e[a]=Qe(u)),n(f.name,u,f.once,f.capture,f.passive,f.params)):u!==c&&(c.fns=u,e[a]=c));for(a in t)o(e[a])&&r((f=Ze(a)).name,t[a],f.capture)}function et(e,t,n){e instanceof ue&&(e=e.data.hook||(e.data.hook={}));var r,s=e[t];function u(){n.apply(this,arguments),m(r.fns,u)}o(s)?r=Qe([u]):i(s.fns)&&a(s.merged)?(r=s).fns.push(u):r=Qe([s,u]),r.merged=!0,e[t]=r}function tt(e,t,n,r,o){if(i(t)){if(g(t,n))return e[n]=t[n],o||delete t[n],!0;if(g(t,r))return e[n]=t[r],o||delete t[r],!0}return!1}function nt(e){return s(e)?[fe(e)]:Array.isArray(e)?function e(t,n){var r=[];var u,c,l,f;for(u=0;u<t.length;u++)o(c=t[u])||"boolean"==typeof c||(l=r.length-1,f=r[l],Array.isArray(c)?c.length>0&&(rt((c=e(c,(n||"")+"_"+u))[0])&&rt(f)&&(r[l]=fe(f.text+c[0].text),c.shift()),r.push.apply(r,c)):s(c)?rt(f)?r[l]=fe(f.text+c):""!==c&&r.push(fe(c)):rt(c)&&rt(f)?r[l]=fe(f.text+c.text):(a(t._isVList)&&i(c.tag)&&o(c.key)&&i(n)&&(c.key="__vlist"+n+"_"+u+"__"),r.push(c)));return r}(e):void 0}function rt(e){return i(e)&&i(e.text)&&(t=e.isComment,!1===t);var t}function ot(e,t){return(e.__esModule||re&&"Module"===e[Symbol.toStringTag])&&(e=e.default),u(e)?t.extend(e):e}function it(e){return e.isComment&&e.asyncFactory}function at(e){if(Array.isArray(e))for(var t=0;t<e.length;t++){var n=e[t];if(i(n)&&(i(n.componentOptions)||it(n)))return n}}function st(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&ft(e,t)}var ut;function ct(e,t,n){n?ut.$once(e,t):ut.$on(e,t)}function lt(e,t){ut.$off(e,t)}function ft(e,t,n){ut=e,Ye(t,n||{},ct,lt),ut=void 0}function dt(e,t){var n={};if(!e)return n;for(var r=0,o=e.length;r<o;r++){var i=e[r],a=i.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,i.context!==t&&i.fnContext!==t||!a||null==a.slot)(n.default||(n.default=[])).push(i);else{var s=a.slot,u=n[s]||(n[s]=[]);"template"===i.tag?u.push.apply(u,i.children||[]):u.push(i)}}for(var c in n)n[c].every(pt)&&delete n[c];return n}function pt(e){return e.isComment&&!e.asyncFactory||" "===e.text}function ht(e,t){t=t||{};for(var n=0;n<e.length;n++)Array.isArray(e[n])?ht(e[n],t):t[e[n].key]=e[n].fn;return t}var vt=null;function yt(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}function mt(e){for(;e&&(e=e.$parent);)if(e._inactive)return!0;return!1}function _t(e,t){if(t){if(e._directInactive=!1,mt(e))return}else if(e._directInactive)return;if(e._inactive||null===e._inactive){e._inactive=!1;for(var n=0;n<e.$children.length;n++)_t(e.$children[n]);gt(e,"activated")}}function gt(e,t){var n=e.$options[t];if(n)for(var r=0,o=n.length;r<o;r++)try{n[r].call(e)}catch(n){Re(n,e,t+" hook")}e._hasHookEvent&&e.$emit("hook:"+t)}var bt=[],wt=[],Ct={},kt=!1,xt=!1,St=0;function Et(){xt=!0;var e,t;for(bt.sort(function(e,t){return e.id-t.id}),St=0;St<bt.length;St++)t=(e=bt[St]).id,Ct[t]=null,e.run();var n=wt.slice(),r=bt.slice();St=bt.length=wt.length=0,Ct={},kt=xt=!1,function(e){for(var t=0;t<e.length;t++)e[t]._inactive=!0,_t(e[t],!0)}(n),function(e){var t=e.length;for(;t--;){var n=e[t],r=n.vm;r._watcher===n&&r._isMounted&&gt(r,"updated")}}(r),ee&&F.devtools&&ee.emit("flush")}var Ot=0,jt=function(e,t,n,r,o){this.vm=e,o&&(e._watcher=this),e._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++Ot,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new ne,this.newDepIds=new ne,this.expression="","function"==typeof t?this.getter=t:(this.getter=function(e){if(!W.test(e)){var t=e.split(".");return function(e){for(var n=0;n<t.length;n++){if(!e)return;e=e[t[n]]}return e}}}(t),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};jt.prototype.get=function(){e=this,ae.target&&se.push(ae.target),ae.target=e;var e,t,n=this.vm;try{t=this.getter.call(n,n)}catch(e){if(!this.user)throw e;Re(e,n,'getter for watcher "'+this.expression+'"')}finally{this.deep&&Ke(t),ae.target=se.pop(),this.cleanupDeps()}return t},jt.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},jt.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},jt.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(e){var t=e.id;if(null==Ct[t]){if(Ct[t]=!0,xt){for(var n=bt.length-1;n>St&&bt[n].id>e.id;)n--;bt.splice(n+1,0,e)}else bt.push(e);kt||(kt=!0,Ge(Et))}}(this)},jt.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||u(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Re(e,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,e,t)}}},jt.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},jt.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},jt.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||m(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var At={enumerable:!0,configurable:!0,get:A,set:A};function It(e,t,n){At.get=function(){return this[t][n]},At.set=function(e){this[t][n]=e},Object.defineProperty(e,n,At)}function Tt(e){e._watchers=[],e._inlineComputed=null;var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},o=e.$options._propKeys=[],i=!e.$parent;me.shouldConvert=i;var a=function(i){o.push(i);var a=Ne(i,t,n,e);Ce(r,i,a),i in e||It(e,"_props",i)};for(var s in t)a(s);me.shouldConvert=!0}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]=null==t[n]?A:E(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;l(t=e._data="function"==typeof t?Pt(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,o=(e.$options.methods,n.length);for(;o--;){var i=n[o];r&&g(r,i)||L(i)||It(e,"_data",i)}we(t,!0)}(e):we(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=Y();for(var o in t){var i=t[o],a="function"==typeof i?i:i.get;0,r||(n[o]=new jt(e,a||A,A,Nt)),o in e||Mt(e,o,i)}}(e,t.computed),t.watch&&t.watch!==K&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var o=0;o<r.length;o++)Rt(e,n,r[o]);else Rt(e,n,r)}}(e,t.watch)}function Pt(e,t){try{return e.call(t,t)}catch(e){return Re(e,t,"data()"),{}}}var Nt={lazy:!0};function Mt(e,t,n){var r=!Y();"function"==typeof n?(At.get=r?$t(t):n,At.set=A):(At.get=n.get?r&&!1!==n.cache?$t(t):n.get:A,At.set=n.set?n.set:A),Object.defineProperty(e,t,At)}function $t(e){return function(){var t=this._computedWatchers&&this._computedWatchers[e];if(t)return t.dirty&&t.evaluate(),ae.target&&t.depend(),t.value}}function Rt(e,t,n,r){return l(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=e[n]),e.$watch(t,n,r)}function Dt(e){var t=e.$options.provide;t&&(e._provided="function"==typeof t?t.call(e):t)}function Ft(e){var t=Lt(e.$options.inject,e);t&&(me.shouldConvert=!1,Object.keys(t).forEach(function(n){Ce(e,n,t[n])}),me.shouldConvert=!0)}function Lt(e,t){if(e){for(var n=Object.create(null),r=re?Reflect.ownKeys(e).filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}):Object.keys(e),o=0;o<r.length;o++){for(var i=r[o],a=e[i].from,s=t;s;){if(s._provided&&a in s._provided){n[i]=s._provided[a];break}s=s.$parent}if(!s&&"default"in e[i]){var u=e[i].default;n[i]="function"==typeof u?u.call(t):u}}return n}}function Vt(e,t){var n,r,o,a,s;if(Array.isArray(e)||"string"==typeof e)for(n=new Array(e.length),r=0,o=e.length;r<o;r++)n[r]=t(e[r],r);else if("number"==typeof e)for(n=new Array(e),r=0;r<e;r++)n[r]=t(r+1,r);else if(u(e))for(a=Object.keys(e),n=new Array(a.length),r=0,o=a.length;r<o;r++)s=a[r],n[r]=t(e[s],s,r);return i(n)&&(n._isVList=!0),n}function Wt(e,t,n,r){var o,i=this.$scopedSlots[e];if(i)n=n||{},r&&(n=j(j({},r),n)),o=i(n)||t;else{var a=this.$slots[e];a&&(a._rendered=!0),o=a||t}var s=n&&n.slot;return s?this.$createElement("template",{slot:s},o):o}function Bt(e){return Pe(this.$options,"filters",e)||T}function Ut(e,t,n,r){var o=F.keyCodes[t]||n;return o?Array.isArray(o)?-1===o.indexOf(e):o!==e:r?S(r)!==t:void 0}function Jt(e,t,n,r,o){if(n)if(u(n)){Array.isArray(n)&&(n=function(e){for(var t={},n=0;n<e.length;n++)e[n]&&j(t,e[n]);return t}(n));var i,a=function(a){if("class"===a||"style"===a||y(a))i=e;else{var s=e.attrs&&e.attrs.type;i=r||F.mustUseProp(t,s,a)?e.domProps||(e.domProps={}):e.attrs||(e.attrs={})}if(!(a in i)&&(i[a]=n[a],o)){(e.on||(e.on={}))["update:"+a]=function(e){n[a]=e}}};for(var s in n)a(s)}else;return e}function zt(e,t){var n=this._staticTrees||(this._staticTrees=[]),r=n[e];return r&&!t?Array.isArray(r)?pe(r):de(r):(Ht(r=n[e]=this.$options.staticRenderFns[e].call(this._renderProxy,null,this),"__static__"+e,!1),r)}function qt(e,t,n){return Ht(e,"__once__"+t+(n?"_"+n:""),!0),e}function Ht(e,t,n){if(Array.isArray(e))for(var r=0;r<e.length;r++)e[r]&&"string"!=typeof e[r]&&Gt(e[r],t+"_"+r,n);else Gt(e,t,n)}function Gt(e,t,n){e.isStatic=!0,e.key=t,e.isOnce=n}function Xt(e,t){if(t)if(l(t)){var n=e.on=e.on?j({},e.on):{};for(var r in t){var o=n[r],i=t[r];n[r]=o?[].concat(o,i):i}}else;return e}function Kt(e,t){var n=this._inlineComputed||(this._inlineComputed={}),r=n[e];return r?r.value:(n[e]=new jt(this,t,A,{sync:!0}),n[e].value)}function Zt(e){e._o=qt,e._n=h,e._s=p,e._l=Vt,e._t=Wt,e._q=P,e._i=N,e._m=zt,e._f=Bt,e._k=Ut,e._b=Jt,e._v=fe,e._e=le,e._u=ht,e._g=Xt,e._a=Kt}function Qt(e,t,n,o,i){var s=i.options;this.data=e,this.props=t,this.children=n,this.parent=o,this.listeners=e.on||r,this.injections=Lt(s.inject,o),this.slots=function(){return dt(n,o)};var u=Object.create(o),c=a(s._compiled),l=!c;c&&(this.$options=s,this.$slots=this.slots(),this.$scopedSlots=e.scopedSlots||r),s._scopeId?this._c=function(e,t,n,r){var i=vn(u,e,t,n,r,l);return i&&(i.fnScopeId=s._scopeId,i.fnContext=o),i}:this._c=function(e,t,n,r){return vn(u,e,t,n,r,l)}}Zt(Qt.prototype);function Yt(e,t){for(var n in t)e[C(n)]=t[n]}var en="@inRecycleList";function tn(e,t,r,o){if(n&&n.taskCenter)return"function"==typeof n.taskCenter.registerHook?n.taskCenter.registerHook(e,t,r,o):void oe('Failed to register component hook "'+t+"@"+r+"#"+e+'".');oe('Can\'t find available "document" or "taskCenter".')}function nn(e,t,r){if(n&&n.taskCenter)return"function"==typeof n.taskCenter.updateData?n.taskCenter.updateData(e,t,r):void oe("Failed to update component data ("+e+").");oe('Can\'t find available "document" or "taskCenter".')}var rn=0;function on(e){void 0===e&&(e={});var t=this,n=e.componentId;t._uid="virtual-component-"+rn++,t._isVue=!0,e&&e._isComponent?_n(t,e):t.$options=Te(gn(t.constructor),e||{},t),t._renderProxy=t,t._self=t,yt(t),st(t),yn(t),gt(t,"beforeCreate"),Ft(t),Tt(t),Dt(t),gt(t,"created");var r=t.$options.data,o="function"==typeof r?Pt(r,t):r||{};l(o)&&nn(n,o),tn(n,"lifecycle","attach",function(){gt(t,"beforeMount");new jt(t,function(){t._update(t._vnode,!1)},A,null,!0),t._isMounted=!0,gt(t,"mounted")}),tn(n,"lifecycle","detach",function(){t.$destroy()})}function an(e){var t=this,n=t.$options.componentId;if(t._isMounted&&gt(t,"beforeUpdate"),t._vnode=e,t._isMounted&&n){nn(n,Object.assign({},t._data),function(){gt(t,"updated")})}}function sn(e){delete e.data.attrs[en],function(e){var t=e.componentOptions.Ctor,n=t.extend({}),r=n.cid;n.prototype._init=on,n.prototype._update=an,e.componentOptions.Ctor=t.extend({beforeCreate:function(){tn(r,"lifecycle","create",function(e,t){new n({componentId:e,propsData:t})})},beforeDestroy:function(){delete this._virtualComponents}})}(e);var t=fn(e),n=t.$options["@render"];if(n)try{return n.call(t)}catch(e){Re(e,t,"@render")}else oe('@render function not defined on component used in <recycle-list>. Make sure to declare `recyclable="true"` on the component\'s template.',t)}var un={init:function(e,t,n,r){if(!e.componentInstance||e.componentInstance._isDestroyed){(e.componentInstance=fn(e,vt,n,r)).$mount(t?e.elm:void 0,t)}else if(e.data.keepAlive){var o=e;un.prepatch(o,o)}},prepatch:function(e,t){var n=t.componentOptions;!function(e,t,n,o,i){var a=!!(i||e.$options._renderChildren||o.data.scopedSlots||e.$scopedSlots!==r);if(e.$options._parentVnode=o,e.$vnode=o,e._vnode&&(e._vnode.parent=o),e.$options._renderChildren=i,e.$attrs=o.data&&o.data.attrs||r,e.$listeners=n||r,t&&e.$options.props){me.shouldConvert=!1;for(var s=e._props,u=e.$options._propKeys||[],c=0;c<u.length;c++){var l=u[c];s[l]=Ne(l,e.$options.props,t,e)}me.shouldConvert=!0,e.$options.propsData=t}if(n){var f=e.$options._parentListeners;e.$options._parentListeners=n,ft(e,n,f)}a&&(e.$slots=dt(i,o.context),e.$forceUpdate())}(t.componentInstance=e.componentInstance,n.propsData,n.listeners,t,n.children)},insert:function(e){var t=e.context,n=e.componentInstance;n._isMounted||(n._isMounted=!0,gt(n,"mounted")),e.data.keepAlive&&(t._isMounted?((r=n)._inactive=!1,wt.push(r)):_t(n,!0));var r},destroy:function(e){var t=e.componentInstance;t._isDestroyed||(e.data.keepAlive?function e(t,n){if(!(n&&(t._directInactive=!0,mt(t))||t._inactive)){t._inactive=!0;for(var r=0;r<t.$children.length;r++)e(t.$children[r]);gt(t,"deactivated")}}(t,!0):t.$destroy())}},cn=Object.keys(un);function ln(e,t,n,s,c){if(!o(e)){var l=n.$options._base;if(u(e)&&(e=l.extend(e)),"function"==typeof e){var f;if(o(e.cid)&&void 0===(e=function(e,t,n){if(a(e.error)&&i(e.errorComp))return e.errorComp;if(i(e.resolved))return e.resolved;if(a(e.loading)&&i(e.loadingComp))return e.loadingComp;if(!i(e.contexts)){var r=e.contexts=[n],s=!0,c=function(){for(var e=0,t=r.length;e<t;e++)r[e].$forceUpdate()},l=M(function(n){e.resolved=ot(n,t),s||c()}),f=M(function(t){i(e.errorComp)&&(e.error=!0,c())}),d=e(l,f);return u(d)&&("function"==typeof d.then?o(e.resolved)&&d.then(l,f):i(d.component)&&"function"==typeof d.component.then&&(d.component.then(l,f),i(d.error)&&(e.errorComp=ot(d.error,t)),i(d.loading)&&(e.loadingComp=ot(d.loading,t),0===d.delay?e.loading=!0:setTimeout(function(){o(e.resolved)&&o(e.error)&&(e.loading=!0,c())},d.delay||200)),i(d.timeout)&&setTimeout(function(){o(e.resolved)&&f(null)},d.timeout))),s=!1,e.loading?e.loadingComp:e.resolved}e.contexts.push(n)}(f=e,l,n)))return function(e,t,n,r,o){var i=le();return i.asyncFactory=e,i.asyncMeta={data:t,context:n,children:r,tag:o},i}(f,t,n,s,c);t=t||{},gn(e),i(t.model)&&function(e,t){var n=e.model&&e.model.prop||"value",r=e.model&&e.model.event||"input";(t.props||(t.props={}))[n]=t.model.value;var o=t.on||(t.on={});i(o[r])?o[r]=[t.model.callback].concat(o[r]):o[r]=t.model.callback}(e.options,t);var d=function(e,t,n){var r=t.options.props;if(!o(r)){var a={},s=e.attrs,u=e.props;if(i(s)||i(u))for(var c in r){var l=S(c);tt(a,u,c,l,!0)||tt(a,s,c,l,!1)}return a}}(t,e);if(a(e.options.functional))return function(e,t,n,o,a){var s=e.options,u={},c=s.props;if(i(c))for(var l in c)u[l]=Ne(l,c,t||r);else i(n.attrs)&&Yt(u,n.attrs),i(n.props)&&Yt(u,n.props);var f=new Qt(n,u,a,o,e),d=s.render.call(null,f._c,f);return d instanceof ue&&(d.fnContext=o,d.fnOptions=s,n.slot&&((d.data||(d.data={})).slot=n.slot)),d}(e,d,t,n,s);var p=t.on;if(t.on=t.nativeOn,a(e.options.abstract)){var h=t.slot;t={},h&&(t.slot=h)}!function(e){e.hook||(e.hook={});for(var t=0;t<cn.length;t++){var n=cn[t],r=e.hook[n],o=un[n];e.hook[n]=r?dn(o,r):o}}(t);var v=e.options.name||c,y=new ue("vue-component-"+e.cid+(v?"-"+v:""),t,void 0,void 0,void 0,n,{Ctor:e,propsData:d,listeners:p,tag:c,children:s},f);if((m=y).data.attrs&&en in m.data.attrs)return sn(y);var m;return y}}}function fn(e,t,n,r){var o={_isComponent:!0,parent:t,_parentVnode:e,_parentElm:n||null,_refElm:r||null},a=e.data.inlineTemplate;return i(a)&&(o.render=a.render,o.staticRenderFns=a.staticRenderFns),new e.componentOptions.Ctor(o)}function dn(e,t){return function(n,r,o,i){e(n,r,o,i),t(n,r,o,i)}}var pn=1,hn=2;function vn(e,t,n,r,u,c){return(Array.isArray(n)||s(n))&&(u=r,r=n,n=void 0),a(c)&&(u=hn),function(e,t,n,r,s){if(i(n)&&i(n.__ob__))return le();i(n)&&i(n.is)&&(t=n.is);if(!t)return le();0;Array.isArray(r)&&"function"==typeof r[0]&&((n=n||{}).scopedSlots={default:r[0]},r.length=0);s===hn?r=nt(r):s===pn&&(r=function(e){for(var t=0;t<e.length;t++)if(Array.isArray(e[t]))return Array.prototype.concat.apply([],e);return e}(r));var u,c;if("string"==typeof t){var l;c=e.$vnode&&e.$vnode.ns||F.getTagNamespace(t),u=F.isReservedTag(t)?new ue(F.parsePlatformTagName(t),n,r,void 0,void 0,e):i(l=Pe(e.$options,"components",t))?ln(l,n,e,r,t):new ue(t,n,r,void 0,void 0,e)}else u=ln(t,n,e,r);return i(u)?(c&&function e(t,n,r){t.ns=n;"foreignObject"===t.tag&&(n=void 0,r=!0);if(i(t.children))for(var s=0,u=t.children.length;s<u;s++){var c=t.children[s];i(c.tag)&&(o(c.ns)||a(r))&&e(c,n,r)}}(u,c),u):le()}(e,t,n,r,u)}function yn(e){e._vnode=null,e._staticTrees=null;var t=e.$options,n=e.$vnode=t._parentVnode,o=n&&n.context;e.$slots=dt(t._renderChildren,o),e.$scopedSlots=r,e._c=function(t,n,r,o){return vn(e,t,n,r,o,!1)},e.$createElement=function(t,n,r,o){return vn(e,t,n,r,o,!0)};var i=n&&n.data;Ce(e,"$attrs",i&&i.attrs||r,0,!0),Ce(e,"$listeners",t._parentListeners||r,0,!0)}var mn=0;function _n(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r,n._parentElm=t._parentElm,n._refElm=t._refElm;var o=r.componentOptions;n.propsData=o.propsData,n._parentListeners=o.listeners,n._renderChildren=o.children,n._componentTag=o.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}function gn(e){var t=e.options;if(e.super){var n=gn(e.super);if(n!==e.superOptions){e.superOptions=n;var r=function(e){var t,n=e.options,r=e.extendOptions,o=e.sealedOptions;for(var i in n)n[i]!==o[i]&&(t||(t={}),t[i]=bn(n[i],r[i],o[i]));return t}(e);r&&j(e.extendOptions,r),(t=e.options=Te(n,e.extendOptions)).name&&(t.components[t.name]=e)}}return t}function bn(e,t,n){if(Array.isArray(e)){var r=[];n=Array.isArray(n)?n:[n],t=Array.isArray(t)?t:[t];for(var o=0;o<e.length;o++)(t.indexOf(e[o])>=0||n.indexOf(e[o])<0)&&r.push(e[o]);return r}return e}function wn(e){this._init(e)}wn.prototype._init=function(e){this._uid=mn++,this._isVue=!0,e&&e._isComponent?_n(this,e):this.$options=Te(gn(this.constructor),e||{},this),this._renderProxy=this,this._self=this,yt(this),st(this),yn(this),gt(this,"beforeCreate"),Ft(this),Tt(this),Dt(this),gt(this,"created"),this.$options.el&&this.$mount(this.$options.el)};!function(e){var t={};t.get=function(){return this._data};var n={};n.get=function(){return this._props},Object.defineProperty(e.prototype,"$data",t),Object.defineProperty(e.prototype,"$props",n),e.prototype.$set=ke,e.prototype.$delete=xe,e.prototype.$watch=function(e,t,n){if(l(t))return Rt(this,e,t,n);(n=n||{}).user=!0;var r=new jt(this,e,t,n);return n.immediate&&t.call(this,r.value),function(){r.teardown()}}}(wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){if(Array.isArray(e))for(var r=0,o=e.length;r<o;r++)this.$on(e[r],n);else(this._events[e]||(this._events[e]=[])).push(n),t.test(e)&&(this._hasHookEvent=!0);return this},e.prototype.$once=function(e,t){var n=this;function r(){n.$off(e,r),t.apply(n,arguments)}return r.fn=t,n.$on(e,r),n},e.prototype.$off=function(e,t){if(!arguments.length)return this._events=Object.create(null),this;if(Array.isArray(e)){for(var n=0,r=e.length;n<r;n++)this.$off(e[n],t);return this}var o=this._events[e];if(!o)return this;if(!t)return this._events[e]=null,this;if(t)for(var i,a=o.length;a--;)if((i=o[a])===t||i.fn===t){o.splice(a,1);break}return this},e.prototype.$emit=function(e){var t=this,n=t._events[e];if(n){n=n.length>1?O(n):n;for(var r=O(arguments,1),o=0,i=n.length;o<i;o++)try{n[o].apply(t,r)}catch(n){Re(n,t,'event handler for "'+e+'"')}}return t}}(wn),(Cn=wn).prototype._update=function(e,t){this._isMounted&&gt(this,"beforeUpdate");var n=this.$el,r=this._vnode,o=vt;vt=this,this._vnode=e,r?this.$el=this.__patch__(r,e):(this.$el=this.__patch__(this.$el,e,t,!1,this.$options._parentElm,this.$options._refElm),this.$options._parentElm=this.$options._refElm=null),vt=o,n&&(n.__vue__=null),this.$el&&(this.$el.__vue__=this),this.$vnode&&this.$parent&&this.$vnode===this.$parent._vnode&&(this.$parent.$el=this.$el)},Cn.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},Cn.prototype.$destroy=function(){if(!this._isBeingDestroyed){gt(this,"beforeDestroy"),this._isBeingDestroyed=!0;var e=this.$parent;!e||e._isBeingDestroyed||this.$options.abstract||m(e.$children,this),this._watcher&&this._watcher.teardown();for(var t=this._watchers.length;t--;)this._watchers[t].teardown();this._data.__ob__&&this._data.__ob__.vmCount--,this._isDestroyed=!0,this.__patch__(this._vnode,null),gt(this,"destroyed"),this.$off(),this.$el&&(this.$el.__vue__=null),this.$vnode&&(this.$vnode.parent=null)}};var Cn;Zt((kn=wn).prototype),kn.prototype.$nextTick=function(e){return Ge(e,this)},kn.prototype._render=function(){var e=this,t=e.$options,n=t.render,o=t._parentVnode;if(e._isMounted)for(var i in e.$slots){var a=e.$slots[i];(a._rendered||a[0]&&a[0].elm)&&(e.$slots[i]=pe(a,!0))}e.$scopedSlots=o&&o.data.scopedSlots||r,e.$vnode=o;var s;try{s=n.call(e._renderProxy,e.$createElement)}catch(t){Re(t,e,"render"),s=e._vnode}return s instanceof ue||(s=le()),s.parent=o,s};var kn;function xn(e){e.cid=0;var t=1;e.extend=function(e){e=e||{};var n=this,r=n.cid,o=e._Ctor||(e._Ctor={});if(o[r])return o[r];var i=e.name||n.options.name;var a=function(e){this._init(e)};return(a.prototype=Object.create(n.prototype)).constructor=a,a.cid=t++,a.options=Te(n.options,e),a.super=n,a.options.props&&function(e){var t=e.options.props;for(var n in t)It(e.prototype,"_props",n)}(a),a.options.computed&&function(e){var t=e.options.computed;for(var n in t)Mt(e.prototype,n,t[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,R.forEach(function(e){a[e]=n[e]}),i&&(a.options.components[i]=a),a.superOptions=n.options,a.extendOptions=e,a.sealedOptions=j({},a.options),o[r]=a,a}}function Sn(e){return e&&(e.Ctor.options.name||e.tag)}function En(e,t){return Array.isArray(e)?e.indexOf(t)>-1:"string"==typeof e?e.split(",").indexOf(t)>-1:!!f(e)&&e.test(t)}function On(e,t){var n=e.cache,r=e.keys,o=e._vnode;for(var i in n){var a=n[i];if(a){var s=Sn(a.componentOptions);s&&!t(s)&&jn(n,i,r,o)}}}function jn(e,t,n,r){var o=e[t];!o||r&&o.tag===r.tag||o.componentInstance.$destroy(),e[t]=null,m(n,t)}var An=[String,RegExp,Array],In={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:An,exclude:An,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var e in this.cache)jn(this.cache,e,this.keys)},watch:{include:function(e){On(this,function(t){return En(e,t)})},exclude:function(e){On(this,function(t){return!En(e,t)})}},render:function(){var e=this.$slots.default,t=at(e),n=t&&t.componentOptions;if(n){var r=Sn(n),o=this.include,i=this.exclude;if(o&&(!r||!En(o,r))||i&&r&&En(i,r))return t;var a=this.cache,s=this.keys,u=null==t.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):t.key;a[u]?(t.componentInstance=a[u].componentInstance,m(s,u),s.push(u)):(a[u]=t,s.push(u),this.max&&s.length>parseInt(this.max)&&jn(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={};t.get=function(){return F},Object.defineProperty(e,"config",t),e.util={warn:oe,extend:j,mergeOptions:Te,defineReactive:Ce},e.set=ke,e.delete=xe,e.nextTick=Ge,e.options=Object.create(null),R.forEach(function(t){e.options[t+"s"]=Object.create(null)}),e.options._base=e,j(e.options.components,In),e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=O(arguments,1);return n.unshift(this),"function"==typeof e.install?e.install.apply(e,n):"function"==typeof e&&e.apply(null,n),t.push(e),this},e.mixin=function(e){return this.options=Te(this.options,e),this},xn(e),n=e,R.forEach(function(e){n[e]=function(t,n){return n?("component"===e&&l(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}});var n}(wn),Object.defineProperty(wn.prototype,"$isServer",{get:Y}),Object.defineProperty(wn.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),wn.version="2.5.11";var Tn=1;function Pn(e){return n.createElement(e)}var Nn=Object.freeze({namespaceMap:{},createElement:Pn,createElementNS:function(e,t){return n.createElement(e+":"+t)},createTextNode:function(e){return new function(e){this.instanceId="",this.nodeId=Tn++,this.parentNode=null,this.nodeType=3,this.text=e}(e)},createComment:function(e){return n.createComment(e)},insertBefore:function(e,t,n){if(3!==t.nodeType)e.insertBefore(t,n);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var r=Pn("text");r.setAttr("value",t.text),e.insertBefore(r,n)}},removeChild:function(e,t){3!==t.nodeType?e.removeChild(t):e.setAttr("value","")},appendChild:function(e,t){if(3!==t.nodeType)e.appendChild(t);else if("text"===e.type)e.setAttr("value",t.text),t.parentNode=e;else{var n=Pn("text");n.setAttr("value",t.text),e.appendChild(n)}},parentNode:function(e){return e.parentNode},nextSibling:function(e){return e.nextSibling},tagName:function(e){return e.type},setTextContent:function(e,t){e.parentNode.setAttr("value",t)},setAttribute:function(e,t,n){e.setAttr(t,n)}}),Mn={create:function(e,t){$n(t)},update:function(e,t){e.data.ref!==t.data.ref&&($n(e,!0),$n(t))},destroy:function(e){$n(e,!0)}};function $n(e,t){var n=e.data.ref;if(n){var r=e.context,o=e.componentInstance||e.elm,i=r.$refs;t?Array.isArray(i[n])?m(i[n],o):i[n]===o&&(i[n]=void 0):e.data.refInFor?Array.isArray(i[n])?i[n].indexOf(o)<0&&i[n].push(o):i[n]=[o]:i[n]=o}}v("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),v("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0);var Rn=v("text,number,password,search,email,tel,url"),Dn=new ue("",{},[]),Fn=["create","activate","update","remove","destroy"];function Ln(e,t){return e.key===t.key&&(e.tag===t.tag&&e.isComment===t.isComment&&i(e.data)===i(t.data)&&function(e,t){if("input"!==e.tag)return!0;var n,r=i(n=e.data)&&i(n=n.attrs)&&n.type,o=i(n=t.data)&&i(n=n.attrs)&&n.type;return r===o||Rn(r)&&Rn(o)}(e,t)||a(e.isAsyncPlaceholder)&&e.asyncFactory===t.asyncFactory&&o(t.asyncFactory.error))}function Vn(e,t,n){var r,o,a={};for(r=t;r<=n;++r)i(o=e[r].key)&&(a[o]=r);return a}var Wn={create:Bn,update:Bn,destroy:function(e){Bn(e,Dn)}};function Bn(e,t){(e.data.directives||t.data.directives)&&function(e,t){var n,r,o,i=e===Dn,a=t===Dn,s=Jn(e.data.directives,e.context),u=Jn(t.data.directives,t.context),c=[],l=[];for(n in u)r=s[n],o=u[n],r?(o.oldValue=r.value,zn(o,"update",t,e),o.def&&o.def.componentUpdated&&l.push(o)):(zn(o,"bind",t,e),o.def&&o.def.inserted&&c.push(o));if(c.length){var f=function(){for(var n=0;n<c.length;n++)zn(c[n],"inserted",t,e)};i?et(t,"insert",f):f()}l.length&&et(t,"postpatch",function(){for(var n=0;n<l.length;n++)zn(l[n],"componentUpdated",t,e)});if(!i)for(n in s)u[n]||zn(s[n],"unbind",e,e,a)}(e,t)}var Un=Object.create(null);function Jn(e,t){var n=Object.create(null);if(!e)return n;var r,o;for(r=0;r<e.length;r++)(o=e[r]).modifiers||(o.modifiers=Un),n[(i=o,i.rawName||i.name+"."+Object.keys(i.modifiers||{}).join("."))]=o,o.def=Pe(t.$options,"directives",o.name);var i;return n}function zn(e,t,n,r,o){var i=e.def&&e.def[t];if(i)try{i(n.elm,e,n,r,o)}catch(r){Re(r,n.context,"directive "+e.name+" "+t+" hook")}}var qn=[Mn,Wn];function Hn(e,t){if(e.data.attrs||t.data.attrs){var n,r,o=t.elm,i=e.data.attrs||{},a=t.data.attrs||{};a.__ob__&&(a=t.data.attrs=j({},a));var s="function"==typeof o.setAttrs,u={};for(n in a)r=a[n],i[n]!==r&&(s?u[n]=r:o.setAttr(n,r));for(n in i)null==a[n]&&(s?u[n]=void 0:o.setAttr(n));s&&o.setAttrs(u)}}var Gn={create:Hn,update:Hn};function Xn(e,t){var n=t.elm,r=t.context,o=t.data,i=e.data;if(o.staticClass||o.class||i&&(i.staticClass||i.class)){var a=[],s=i.staticClass;s&&a.push.apply(a,s),i.class&&a.push.apply(a,i.class);var u=[],c=o.staticClass;c&&u.push.apply(u,c),o.class&&u.push.apply(u,o.class);var l=function(e,t,n){var r=n.$options.style||{},o={};return t.forEach(function(e){var t=r[e];j(o,t)}),e.forEach(function(e){var t=r[e];for(var n in t)o.hasOwnProperty(n)||(o[n]="")}),o}(a,u,r);if("function"==typeof n.setStyles)n.setStyles(l);else for(var f in l)n.setStyle(f,l[f])}}var Kn,Zn={create:Xn,update:Xn};function Qn(e,t,n,r,o,i){if(r)console.log("Weex do not support event in bubble phase.");else{if(n){var a=t,s=Kn;t=function(t){null!==(1===arguments.length?a(t):a.apply(null,arguments))&&Yn(e,null,null,s)}}Kn.addEvent(e,t,i)}}function Yn(e,t,n,r){(r||Kn).removeEvent(e)}function er(e,t){if(e.data.on||t.data.on){var n=t.data.on||{},r=e.data.on||{};Kn=t.elm,Ye(n,r,Qn,Yn,t.context),Kn=void 0}}var tr={create:er,update:er},nr=b(C);function rr(e,t){if(e.data.style||t.data.style){var n,r,o=t.elm,i=e.data.style||{},a=t.data.style||{},s=a.__ob__;Array.isArray(a)&&(a=t.data.style=function(e){for(var t={},n=0;n<e.length;n++)e[n]&&j(t,e[n]);return t}(a)),s&&(a=t.data.style=j({},a));var u="function"==typeof o.setStyles,c={};for(r in i)a[r]||(u?c[nr(r)]="":o.setStyle(nr(r),""));for(r in a)n=a[r],u?c[nr(r)]=n:o.setStyle(nr(r),n);u&&o.setStyles(c)}}var or={create:function(e,t){if(t.data.staticStyle){var n=t.elm,r=t.data.staticStyle,o="function"==typeof n.setStyles,i={};for(var a in r)r[a]&&(o?i[nr(a)]=r[a]:n.setStyle(nr(a),r[a]));o&&n.setStyles(i),rr(e,t)}else rr(e,t)},update:rr};function ir(e){if(e){if("object"==typeof e){var t={};return!1!==e.css&&j(t,ar(e.name||"v")),j(t,e),t}return"string"==typeof e?ar(e):void 0}}var ar=b(function(e){return{enterClass:e+"-enter",enterToClass:e+"-enter-to",enterActiveClass:e+"-enter-active",leaveClass:e+"-leave",leaveToClass:e+"-leave-to",leaveActiveClass:e+"-leave-active"}});U&&!H&&(void 0===window.ontransitionend&&window.onwebkittransitionend,void 0===window.onanimationend&&window.onwebkitanimationend);U&&window.requestAnimationFrame&&window.requestAnimationFrame.bind(window);function sr(e,t){var n=t.elm;n._leaveCb&&(n._leaveCb.cancelled=!0,n._leaveCb());var r=ir(t.data.transition);if(r&&!n._enterCb){for(var o=r.enterClass,i=r.enterToClass,a=r.enterActiveClass,s=r.appearClass,u=r.appearToClass,c=r.appearActiveClass,l=r.beforeEnter,f=r.enter,d=r.afterEnter,p=r.enterCancelled,h=r.beforeAppear,v=r.appear,y=r.afterAppear,m=r.appearCancelled,_=vt,g=vt.$vnode;g&&g.parent;)_=(g=g.parent).context;var b=!_._isMounted||!t.isRootInsert;if(!b||v||""===v){var w=b?s:o,C=b?u:i,k=b?c:a,x=b?h||l:l,S=b&&"function"==typeof v?v:f,E=b?y||d:d,O=b?m||p:p,I=S&&(S._length||S.length)>1,T=t.context.$options.style||{},P=T[w],N=T["@TRANSITION"]&&T["@TRANSITION"][k]||{},$=function(e,t,n,r,o,i){var a={},s=t[n],u=t[r],c=t[o];if(s)for(var l in s)a[l]=e.style[l];if(c)for(var f in c)0!==f.indexOf("transition")&&(a[f]=c[f]);u&&j(a,u);return a}(n,T,w,C,k,t.context),R=Object.keys($).length>0,D=n._enterCb=M(function(){D.cancelled?O&&O(n):E&&E(n),n._enterCb=null});if(setTimeout(function(){var e=n.parentNode,r=e&&e._pending&&e._pending[t.key];if(r&&r.context===t.context&&r.tag===t.tag&&r.elm._leaveCb&&r.elm._leaveCb(),S&&S(n,D),R){t.context.$requireWeexModule("animation").transition(n.ref,{styles:$,duration:N.duration||0,delay:N.delay||0,timingFunction:N.timingFunction||"linear"},I?A:D)}else I||D()},16),x&&x(n),P)if("function"==typeof n.setStyles)n.setStyles(P);else for(var F in P)n.setStyle(F,P[F]);R||I||D()}}}var ur=function(e){var t,n,r={},u=e.modules,c=e.nodeOps;for(t=0;t<Fn.length;++t)for(r[Fn[t]]=[],n=0;n<u.length;++n)i(u[n][Fn[t]])&&r[Fn[t]].push(u[n][Fn[t]]);function l(e){var t=c.parentNode(e);i(t)&&c.removeChild(t,e)}function f(e,t,n,o,s){if(e.isRootInsert=!s,!function(e,t,n,o){var s=e.data;if(i(s)){var u=i(e.componentInstance)&&s.keepAlive;if(i(s=s.hook)&&i(s=s.init)&&s(e,!1,n,o),i(e.componentInstance))return d(e,t),a(u)&&function(e,t,n,o){for(var a,s=e;s.componentInstance;)if(s=s.componentInstance._vnode,i(a=s.data)&&i(a=a.transition)){for(a=0;a<r.activate.length;++a)r.activate[a](Dn,s);t.push(s);break}p(n,e.elm,o)}(e,t,n,o),!0}}(e,t,n,o)){var u=e.data,l=e.children,f=e.tag;if(i(f)){e.elm=e.ns?c.createElementNS(e.ns,f):c.createElement(f,e),_(e);var v=i(u)&&a(u.appendAsTree);v||(i(u)&&m(e,t),p(n,e.elm,o)),h(e,l,t),v&&(i(u)&&m(e,t),p(n,e.elm,o))}else a(e.isComment)?(e.elm=c.createComment(e.text),p(n,e.elm,o)):(e.elm=c.createTextNode(e.text),p(n,e.elm,o))}}function d(e,t){i(e.data.pendingInsert)&&(t.push.apply(t,e.data.pendingInsert),e.data.pendingInsert=null),e.elm=e.componentInstance.$el,y(e)?(m(e,t),_(e)):($n(e),t.push(e))}function p(e,t,n){i(e)&&(i(n)?n.parentNode===e&&c.insertBefore(e,t,n):c.appendChild(e,t))}function h(e,t,n){if(Array.isArray(t))for(var r=0;r<t.length;++r)f(t[r],n,e.elm,null,!0);else s(e.text)&&c.appendChild(e.elm,c.createTextNode(e.text))}function y(e){for(;e.componentInstance;)e=e.componentInstance._vnode;return i(e.tag)}function m(e,n){for(var o=0;o<r.create.length;++o)r.create[o](Dn,e);i(t=e.data.hook)&&(i(t.create)&&t.create(Dn,e),i(t.insert)&&n.push(e))}function _(e){var t;if(i(t=e.fnScopeId))c.setAttribute(e.elm,t,"");else for(var n=e;n;)i(t=n.context)&&i(t=t.$options._scopeId)&&c.setAttribute(e.elm,t,""),n=n.parent;i(t=vt)&&t!==e.context&&t!==e.fnContext&&i(t=t.$options._scopeId)&&c.setAttribute(e.elm,t,"")}function g(e,t,n,r,o,i){for(;r<=o;++r)f(n[r],i,e,t)}function b(e){var t,n,o=e.data;if(i(o))for(i(t=o.hook)&&i(t=t.destroy)&&t(e),t=0;t<r.destroy.length;++t)r.destroy[t](e);if(i(t=e.children))for(n=0;n<e.children.length;++n)b(e.children[n])}function w(e,t,n,r){for(;n<=r;++n){var o=t[n];i(o)&&(i(o.tag)?(C(o),b(o)):l(o.elm))}}function C(e,t){if(i(t)||i(e.data)){var n,o=r.remove.length+1;for(i(t)?t.listeners+=o:t=function(e,t){function n(){0==--n.listeners&&l(e)}return n.listeners=t,n}(e.elm,o),i(n=e.componentInstance)&&i(n=n._vnode)&&i(n.data)&&C(n,t),n=0;n<r.remove.length;++n)r.remove[n](e,t);i(n=e.data.hook)&&i(n=n.remove)?n(e,t):t()}else l(e.elm)}function k(e,t,n,r){for(var o=n;o<r;o++){var a=t[o];if(i(a)&&Ln(e,a))return o}}function x(e,t,n,s){if(e!==t){var u=t.elm=e.elm;if(a(e.isAsyncPlaceholder))i(t.asyncFactory.resolved)?O(e.elm,t,n):t.isAsyncPlaceholder=!0;else if(a(t.isStatic)&&a(e.isStatic)&&t.key===e.key&&(a(t.isCloned)||a(t.isOnce)))t.componentInstance=e.componentInstance;else{var l,d=t.data;i(d)&&i(l=d.hook)&&i(l=l.prepatch)&&l(e,t);var p=e.children,h=t.children;if(i(d)&&y(t)){for(l=0;l<r.update.length;++l)r.update[l](e,t);i(l=d.hook)&&i(l=l.update)&&l(e,t)}o(t.text)?i(p)&&i(h)?p!==h&&function(e,t,n,r,a){for(var s,u,l,d=0,p=0,h=t.length-1,v=t[0],y=t[h],m=n.length-1,_=n[0],b=n[m],C=!a;d<=h&&p<=m;)o(v)?v=t[++d]:o(y)?y=t[--h]:Ln(v,_)?(x(v,_,r),v=t[++d],_=n[++p]):Ln(y,b)?(x(y,b,r),y=t[--h],b=n[--m]):Ln(v,b)?(x(v,b,r),C&&c.insertBefore(e,v.elm,c.nextSibling(y.elm)),v=t[++d],b=n[--m]):Ln(y,_)?(x(y,_,r),C&&c.insertBefore(e,y.elm,v.elm),y=t[--h],_=n[++p]):(o(s)&&(s=Vn(t,d,h)),o(u=i(_.key)?s[_.key]:k(_,t,d,h))?f(_,r,e,v.elm):Ln(l=t[u],_)?(x(l,_,r),t[u]=void 0,C&&c.insertBefore(e,l.elm,v.elm)):f(_,r,e,v.elm),_=n[++p]);d>h?g(e,o(n[m+1])?null:n[m+1].elm,n,p,m,r):p>m&&w(0,t,d,h)}(u,p,h,n,s):i(h)?(i(e.text)&&c.setTextContent(u,""),g(u,null,h,0,h.length-1,n)):i(p)?w(0,p,0,p.length-1):i(e.text)&&c.setTextContent(u,""):e.text!==t.text&&c.setTextContent(u,t.text),i(d)&&i(l=d.hook)&&i(l=l.postpatch)&&l(e,t)}}}function S(e,t,n){if(a(n)&&i(e.parent))e.parent.data.pendingInsert=t;else for(var r=0;r<t.length;++r)t[r].data.hook.insert(t[r])}var E=v("attrs,class,staticClass,staticStyle,key");function O(e,t,n,r){var o,s=t.tag,u=t.data,c=t.children;if(r=r||u&&u.pre,t.elm=e,a(t.isComment)&&i(t.asyncFactory))return t.isAsyncPlaceholder=!0,!0;if(i(u)&&(i(o=u.hook)&&i(o=o.init)&&o(t,!0),i(o=t.componentInstance)))return d(t,n),!0;if(i(s)){if(i(c))if(e.hasChildNodes())if(i(o=u)&&i(o=o.domProps)&&i(o=o.innerHTML)){if(o!==e.innerHTML)return!1}else{for(var l=!0,f=e.firstChild,p=0;p<c.length;p++){if(!f||!O(f,c[p],n,r)){l=!1;break}f=f.nextSibling}if(!l||f)return!1}else h(t,c,n);if(i(u)){var v=!1;for(var y in u)if(!E(y)){v=!0,m(t,n);break}!v&&u.class&&Ke(u.class)}}else e.data!==t.text&&(e.data=t.text);return!0}return function(e,t,n,s,u,l){if(!o(t)){var d=!1,p=[];if(o(e))d=!0,f(t,p,u,l);else{var h=i(e.nodeType);if(!h&&Ln(e,t))x(e,t,p,s);else{if(h){if(1===e.nodeType&&e.hasAttribute($)&&(e.removeAttribute($),n=!0),a(n)&&O(e,t,p))return S(t,p,!0),e;A=e,e=new ue(c.tagName(A).toLowerCase(),{},[],void 0,A)}var v=e.elm,m=c.parentNode(v);if(f(t,p,v._leaveCb?null:m,c.nextSibling(v)),i(t.parent))for(var _=t.parent,g=y(t);_;){for(var C=0;C<r.destroy.length;++C)r.destroy[C](_);if(_.elm=t.elm,g){for(var k=0;k<r.create.length;++k)r.create[k](Dn,_);var E=_.data.hook.insert;if(E.merged)for(var j=1;j<E.fns.length;j++)E.fns[j]()}else $n(_);_=_.parent}i(m)?w(0,[e],0,0):i(e.tag)&&b(e)}}var A;return S(t,p,d),t.elm}i(e)&&b(e)}}({nodeOps:Nn,modules:[Gn,Zn,tr,or,{create:sr,activate:sr,remove:function(e,t){var n=e.elm;n._enterCb&&(n._enterCb.cancelled=!0,n._enterCb());var r=ir(e.data.transition);if(!r)return t();if(n._leaveCb)return;var o=r.leaveClass,i=r.leaveToClass,a=r.leaveActiveClass,s=r.beforeLeave,u=r.leave,c=r.afterLeave,l=r.leaveCancelled,f=r.delayLeave,d=u&&(u._length||u.length)>1,p=e.context.$options.style||{},h=p[o],v=p[i]||p[a],y=p["@TRANSITION"]&&p["@TRANSITION"][a]||{},m=n._leaveCb=M(function(){n.parentNode&&n.parentNode._pending&&(n.parentNode._pending[e.key]=null),m.cancelled?l&&l(n):(t(),c&&c(n)),n._leaveCb=null});f?f(_):_();function _(){var t=e.context.$requireWeexModule("animation");m.cancelled||(e.data.show||((n.parentNode._pending||(n.parentNode._pending={}))[e.key]=e),s&&s(n),h?t.transition(n.ref,{styles:h},r):r(),u&&u(n,m),v||d||m());function r(){t.transition(n.ref,{styles:v,duration:y.duration||0,delay:y.delay||0,timingFunction:y.timingFunction||"linear"},d?A:m)}}}}].concat(qn),LONG_LIST_THRESHOLD:10});function cr(e){if(e.length)return e.map(function(e){var t,n=(t=e,t.tag?t.tag.replace(/vue\-component\-(\d+\-)?/,""):""),r={type:n};if(n){if(r.style=function(e){if(e&&e.data){var t=e.data,n=t.staticStyle,r=t.staticClass;if(e.data.style||e.data.class||n||r){var o=Object.assign({},n,e.data.style),i=e.context.$options.style||{};return[].concat(r,e.data.class).forEach(function(e){e&&i[e]&&Object.assign(o,i[e])}),o}}}(e),e.data&&(r.attr=e.data.attrs,e.data.on&&(r.events=e.data.on)),"span"===n&&(o=e,o.children&&1===o.children.length&&!o.children[0].tag))return r.attr=r.attr||{},r.attr.value=e.children[0].text.trim(),r}else r.type="span",r.attr={value:(e.text||"").trim()};var o;return e.children&&e.children.length&&(r.children=cr(e.children)),r})}var lr={name:"richtext",render:function(e){return e("weex:richtext",{on:this._events,attrs:{value:cr(this.$options._renderChildren||[])}})}},fr={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function dr(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?dr(at(t.children)):e}function pr(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var o=n._parentListeners;for(var i in o)t[C(i)]=o[i];return t}function hr(e,t){if(/\d-keep-alive$/.test(t.tag))return e("keep-alive",{props:t.componentOptions.propsData})}var vr={name:"transition",props:fr,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(function(e){return e.tag||it(e)})).length){0;var r=this.mode;0;var o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var i=dr(o);if(!i)return o;if(this._leaving)return hr(e,o);var a="__transition-"+this._uid+"-";i.key=null==i.key?i.isComment?a+"comment":a+i.tag:s(i.key)?0===String(i.key).indexOf(a)?i.key:a+i.key:i.key;var u=(i.data||(i.data={})).transition=pr(this),c=this._vnode,l=dr(c);if(i.data.directives&&i.data.directives.some(function(e){return"show"===e.name})&&(i.data.show=!0),l&&l.data&&(h=i,v=l,v.key!==h.key||v.tag!==h.tag)&&!it(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=j({},u);if("out-in"===r)return this._leaving=!0,et(f,"afterLeave",function(){t._leaving=!1,t.$forceUpdate()}),hr(e,o);if("in-out"===r){if(it(i))return c;var d,p=function(){d()};et(u,"afterEnter",p),et(u,"enterCancelled",p),et(f,"delayLeave",function(e){d=e})}}var h,v;return o}}},yr=j({tag:String,moveClass:String},fr);delete yr.mode;var mr={Richtext:lr,Transition:vr,TransitionGroup:{props:yr,created:function(){var e=this.$requireWeexModule("dom");this.getPosition=function(t){return new Promise(function(n,r){e.getComponentRect(t.ref,function(e){e.result?n(e.size):r(new Error("failed to get rect for element: "+t.tag))})})};var t=this.$requireWeexModule("animation");this.animate=function(e,n){return new Promise(function(r){t.transition(e.ref,n,r)})}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,o=this.$slots.default||[],i=this.children=[],a=pr(this),s=0;s<o.length;s++){var u=o[s];u.tag&&null!=u.key&&0!==String(u.key).indexOf("__vlist")&&(i.push(u),n[u.key]=u,(u.data||(u.data={})).transition=a)}if(r){var c=[],l=[];r.forEach(function(e){e.data.transition=a,n[e.key]?c.push(e):l.push(e)}),this.kept=e(t,null,c),this.removed=l}return e(t,null,i)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var e=this.prevChildren,t=this.moveClass||(this.name||"v")+"-move";e.length&&this.getMoveData(e[0].context,t)},methods:{getMoveData:function(e,t){var n=e.$options.style||{};return n["@TRANSITION"]&&n["@TRANSITION"][t]}}}},_r=v("template,script,style,element,content,slot,link,meta,svg,view,a,div,img,image,text,span,input,switch,textarea,spinner,select,slider,slider-neighbor,indicator,canvas,list,cell,header,loading,loading-indicator,refresh,scrollable,scroller,video,web,embed,tabbar,tabheader,datepicker,timepicker,marquee,countdown",!0),gr=(v("web,spinner,switch,video,textarea,canvas,indicator,marquee,countdown",!0),v("richtext,transition,transition-group",!0));v("embed,img,image,input,link,meta",!0);wn.config.mustUseProp=function(e,t,n){return!1},wn.config.isReservedTag=_r,wn.config.isRuntimeComponent=gr,wn.config.isUnknownElement=function(e){return!1},wn.options.directives={},wn.options.components=mr,wn.prototype.__patch__=ur,wn.prototype.$mount=function(e,t){return n=this,r=e&&function(e,t){var n=t.createComment("root");return n.hasAttribute=n.removeAttribute=function(){},t.documentElement.appendChild(n),n}(0,this.$document),o=t,n.$el=r,n.$options.render||(n.$options.render=le),gt(n,"beforeMount"),new jt(n,function(){n._update(n._render(),o)},A,null,!0),o=!1,null==n.$vnode&&(n._isMounted=!0,gt(n,"mounted")),n;var n,r,o},e.Vue=wn}}),ui=r(function(e,t){Object.defineProperty(t,"__esModule",{value:!0});var n=si,r={};t.createInstanceContext=function(e,t,o){void 0===o&&(o={});var i=t.weex,a=(r[e]={instanceId:e,config:i.config,document:i.document,data:o}).Vue=function(e,t){var o={};n(o,t.document);var i=o.Vue,a=r[e],s=/^weex:/i,u=i.config.isReservedTag||function(){return!1},c=i.config.isRuntimeComponent||function(){return!1};return i.config.isReservedTag=function(e){return!c(e)&&t.supports("@component/"+e)||u(e)||s.test(e)},i.config.parsePlatformTagName=function(e){return e.replace(s,"")},i.prototype.$instanceId=e,i.prototype.$document=a.document,i.prototype.$requireWeexModule=t.requireModule,i.mixin({beforeCreate:function(){var e=this.$options;if(e.el){var t=e.data,n=("function"==typeof t?t():t)||{};e.data=Object.assign(n,a.data),a.app=this}},mounted:function(){if(this.$options.el&&t.document&&a.app===this)try{t.document.taskCenter.send("dom",{action:"createFinish"},[])}catch(e){}}}),i.prototype.$getConfig=function(){if(a.app instanceof i)return a.config},i}(e,i),s=function(e,t){var n=r[e],o=t("timer");return{setTimeout:function(){for(var e=arguments,t=[],r=arguments.length;r--;)t[r]=e[r];return o.setTimeout(function(){t[0].apply(t,t.slice(2))},t[1]),n.document.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var e=arguments,t=[],r=arguments.length;r--;)t[r]=e[r];return o.setInterval(function(){t[0].apply(t,t.slice(2))},t[1]),n.document.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){o.clearTimeout(e)},clearInterval:function(e){o.clearInterval(e)}}}(e,i.requireModule),u=Object.assign({Vue:a},s);return Object.freeze(u),u},t.destroyInstance=function(e){var t=r[e];if(t&&t.app instanceof t.Vue){try{t.app.$destroy(),t.document.destroy()}catch(e){}delete t.document,delete t.app}delete r[e]},t.refreshInstance=function(e,t){var n=r[e];if(!(n&&n.app instanceof n.Vue))return new Error("refreshInstance: instance "+e+" not found!");if(n.Vue&&n.Vue.set)for(var o in t)n.Vue.set(n.app,o,t[o]);n.document.taskCenter.send("dom",{action:"refreshFinish"},[])}}),ci=n(ui),li=ui.refreshInstance,fi=ui.destroyInstance,di=ui.createInstanceContext,pi=Object.freeze({default:ci,__moduleExports:ui,refreshInstance:li,destroyInstance:fi,createInstanceContext:di});var hi=Object.freeze({$:function(e){console.warn("[JS Framework] Vm#$ is deprecated, please use Vm#$vm instead");var t=this._ids[e];if(t)return t.vm},$el:function(e){var t=this._ids[e];if(t)return t.el},$vm:function(e){var t=this._ids[e];if(t)return t.vm},$renderThen:function(e){return this._app.differ.then(function(){e()})},$scrollTo:function(e,t){console.warn("[JS Framework] Vm#$scrollTo is deprecated, please use \"require('@weex-module/dom').scrollTo(el, options)\" instead");var n=this.$el(e);n&&this._app.requireModule("dom").scrollToElement(n.ref,{offset:t})},$transition:function(e,t,n){var r=this,o=this.$el(e);o&&t&&t.styles&&this._app.requireModule("animation").transition(o.ref,t,function(){for(var e=[],i=arguments.length;i--;)e[i]=arguments[i];r._setStyle(o,t.styles),n&&n.apply(void 0,e)})},$getConfig:function(e){var t=this._app.options;return"function"==typeof e&&(console.warn("[JS Framework] the callback of Vm#$getConfig(callback) is deprecated, this api now can directly RETURN config info."),e(t)),t},$sendHttp:function(e,t){console.warn("[JS Framework] Vm#$sendHttp is deprecated, please use \"require('@weex-module/stream').sendHttp(params, callback)\" instead"),this._app.requireModule("stream").sendHttp(e,t)},$openURL:function(e){console.warn("[JS Framework] Vm#$openURL is deprecated, please use \"require('@weex-module/event').openURL(url)\" instead"),this._app.requireModule("event").openURL(e)},$setTitle:function(e){console.warn("[JS Framework] Vm#$setTitle is deprecated, please use \"require('@weex-module/pageInfo').setTitle(title)\" instead"),this._app.requireModule("pageInfo").setTitle(e)},$call:function(e,t){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];console.warn("[JS Framework] Vm#$call is deprecated, please use \"require('@weex-module/moduleName')\" instead");var o=this._app.requireModule(e);o&&o[t]&&o[t].apply(o,n)}});function vi(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];if("function"==typeof Object.assign)Object.assign.apply(Object,[e].concat(t));else{var r=t.shift();for(var o in r)e[o]=r[o];t.length&&vi.apply(void 0,[e].concat(t))}return e}function yi(e,t,n,r){Object.defineProperty(e,t,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function mi(e,t){if(e.length){var n=e.indexOf(t);if(n>-1)return e.splice(n,1)}}var _i=Object.prototype.hasOwnProperty;function gi(e,t){return _i.call(e,t)}function bi(e,t){return function(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}}function wi(e){return null!==e&&"object"==typeof e}var Ci=Object.prototype.toString,ki="[object Object]";function xi(e){return Ci.call(e)===ki}function Si(e){var t=(e+"").charCodeAt(0);return 36===t||95===t}var Ei,Oi="__proto__"in{};"undefined"!=typeof Set&&Set.toString().match(/native code/)?Ei=Set:((Ei=function(){this.set=Object.create(null)}).prototype.has=function(e){return void 0!==this.set[e]},Ei.prototype.add=function(e){null==e||this.set[e]||(this.set[e]=1)},Ei.prototype.clear=function(){this.set=Object.create(null)});function ji(){return"object"==typeof nativeSet?nativeSet.create():new Ei}function Ai(e){var t=Object.prototype.toString.call(e);return t.substring(8,t.length-1).toLowerCase()}var Ii=/^@weex-component\//,Ti=/^@weex-module\//,Pi=/^\.{1,2}\//,Ni=/\.js$/,Mi=function(e){return!!e.match(Ii)},$i=function(e){return!!e.match(Ti)},Ri=function(e){return!!e.match(Pi)},Di=function(e){return!Mi(e)&&!$i(e)&&!Ri(e)};function Fi(e){return e.replace(Ii,"").replace(Ti,"")}function Li(e){return e.replace(Ni,"")}var Vi=0;function Wi(){this.id=Vi++,this.subs=[]}Wi.target=null;var Bi=[];function Ui(){Wi.target=null,Bi=[]}Wi.prototype.addSub=function(e){this.subs.push(e)},Wi.prototype.removeSub=function(e){mi(this.subs,e)},Wi.prototype.depend=function(){Wi.target&&Wi.target.addDep(this)},Wi.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t<n;t++)e[t].update()};var Ji=0;function zi(e,t,n,r){r&&vi(this,r);var o="function"==typeof t;this.vm=e,e._watchers.push(this),this.expression=t,this.cb=n,this.id=++Ji,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=ji(),this.newDepIds=ji(),o&&(this.getter=t),this.value=this.lazy?void 0:this.get(),this.queued=this.shallow=!1}zi.prototype.get=function(){e=this,Wi.target&&Bi.push(Wi.target),Wi.target=e;var e,t=this.getter.call(this.vm,this.vm);return this.deep&&function e(t,n){var r,o,i,a;n||(n=qi).clear();i=Array.isArray(t);a=wi(t);if(i||a){if(t.__ob__){var s=t.__ob__.dep.id;if(n.has(s))return;n.add(s)}if(i)for(r=t.length;r--;)e(t[r],n);else if(a)for(o=Object.keys(t),r=o.length;r--;)e(t[o[r]],n)}}(t),Wi.target=Bi.pop(),this.cleanupDeps(),t},zi.prototype.addDep=function(e){var t=e.id;this.newDepIds.has(t)||(this.newDepIds.add(t),this.newDeps.push(e),this.depIds.has(t)||e.addSub(this))},zi.prototype.cleanupDeps=function(){for(var e=this.deps.length;e--;){var t=this.deps[e];this.newDepIds.has(t.id)||t.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},zi.prototype.update=function(e){this.lazy?this.dirty=!0:this.run()},zi.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||(wi(e)||this.deep)&&!this.shallow){var t=this.value;this.value=e,this.cb.call(this.vm,e,t)}this.queued=this.shallow=!1}},zi.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},zi.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},zi.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||this.vm._vForRemoving||mi(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1,this.vm=this.cb=this.value=null}};var qi=ji();var Hi=Array.prototype,Gi=Object.create(Hi);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(e){var t=Hi[e];yi(Gi,e,function(){for(var n=arguments,r=arguments.length,o=new Array(r);r--;)o[r]=n[r];var i,a=t.apply(this,o),s=this.__ob__;switch(e){case"push":case"unshift":i=o;break;case"splice":i=o.slice(2)}return i&&s.observeArray(i),s.dep.notify(),a})}),yi(Hi,"$set",function(e,t){return console.warn('[JS Framework] "Array.prototype.$set" is not a standard API, it will be removed in the next version.'),e>=this.length&&(this.length=e+1),this.splice(e,1,t)[0]}),yi(Hi,"$remove",function(e){console.warn('[JS Framework] "Array.prototype.$remove" is not a standard API, it will be removed in the next version.'),this.length&&("number"!=typeof e&&(e=this.indexOf(e)),e>-1&&this.splice(e,1))});var Xi=Object.getOwnPropertyNames(Gi);function Ki(e){if(this.value=e,this.dep=new Wi,yi(e,"__ob__",this),Array.isArray(e)){(Oi?Zi:Qi)(e,Gi,Xi),this.observeArray(e)}else this.walk(e)}Ki.prototype.walk=function(e){for(var t in e)this.convert(t,e[t])},Ki.prototype.observeArray=function(e){for(var t=0,n=e.length;t<n;t++)Yi(e[t])},Ki.prototype.convert=function(e,t){!function(e,t,n){var r=new Wi,o=Object.getOwnPropertyDescriptor(e,t);if(o&&!1===o.configurable)return;var i=o&&o.get,a=o&&o.set,s=Yi(n);Object.defineProperty(e,t,{enumerable:!0,configurable:!0,get:function(){var t=i?i.call(e):n;if(Wi.target&&(r.depend(),s&&s.dep.depend(),Array.isArray(t)))for(var o=void 0,a=0,u=t.length;a<u;a++)(o=t[a])&&o.__ob__&&o.__ob__.dep.depend();return t},set:function(t){var o=i?i.call(e):n;t!==o&&(a?a.call(e,t):n=t,s=Yi(t),r.notify())}})}(this.value,e,t)},Ki.prototype.addVm=function(e){(this.vms||(this.vms=[])).push(e)},Ki.prototype.removeVm=function(e){mi(this.vms,e)};function Zi(e,t){e.__proto__=t}function Qi(e,t,n){for(var r=0,o=n.length;r<o;r++){var i=n[r];yi(e,i,t[i])}}function Yi(e,t){if(wi(e)){var n;return gi(e,"__ob__")&&e.__ob__ instanceof Ki?n=e.__ob__:(Array.isArray(e)||xi(e))&&Object.isExtensible(e)&&!e._isVue&&(n=new Ki(e)),n&&t&&n.addVm(t),n}}var ea=["$index","$value","$event"];function ta(e,t){(ea.indexOf(t)>-1||!Si(t))&&Object.defineProperty(e,t,{configurable:!0,enumerable:!0,get:function(){return e._data[t]},set:function(n){e._data[t]=n}})}function na(e){var t=e._data;xi(t)||(t={});for(var n=Object.keys(t),r=n.length;r--;)ta(e,n[r]);Yi(t,e)}function ra(){}function oa(e){var t=e._computed;if(t)for(var n in t){var r=t[n],o={enumerable:!0,configurable:!0};"function"==typeof r?(o.get=ia(r,e),o.set=ra):(o.get=r.get?!1!==r.cache?ia(r.get,e):bi(r.get,e):ra,o.set=r.set?bi(r.set,e):ra),Object.defineProperty(e,n,o)}}function ia(e,t){var n=new zi(t,e,null,{lazy:!0});return function(){return n.dirty&&n.evaluate(),Wi.target&&n.depend(),n.value}}var aa={nativeComponentMap:{text:!0,image:!0,container:!0,slider:{type:"slider",append:"tree"},cell:{type:"cell",append:"tree"}}},sa=aa.nativeComponentMap,ua={attr:"setAttr",style:"setStyle",event:"addEvent"};function ca(e,t,n){da(e,t,n.id,e),r=e,o=t,i=n.attr,ha(r,o,"attr",i);var r,o,i;!function(e,t,n){if("function"!=typeof n&&!Array.isArray(n))return;if(Array.isArray(n)&&!n.length)return void t.setClassStyle({});var r=e._options&&e._options.style||{};if("function"==typeof n){var o=ya(e,n,function(e){pa(t,r,e)});pa(t,r,o)}else pa(t,r,n)}(e,t,n.classList),a=e,s=t,u=n.style,ha(a,s,"style",u);var a,s,u;!function(e,t,n){if(!n)return;var r=Object.keys(n),o=r.length;for(;o--;){var i=r[o],a=n[i];"string"==typeof a&&((a=e[a])||console.warn('[JS Framework] The event handler "'+a+'" is not defined.')),s=e,u=i,c=a,t.addEvent(u,bi(c,s))}var s,u,c}(e,t,n.events)}function la(e,t,n,r){void 0===r&&(r={}),function(e,t,n){var r=t._options&&t._options.style||{};if(!n._rootEl)return;var o="@originalRootEl";r[o]=n._rootEl.classStyle;function i(e,t){"array"===Ai(e)&&e.unshift(t)}if("function"==typeof e){var a=ya(t,e,function(e){i(e,o),pa(n._rootEl,r,e)});i(a,o),pa(n._rootEl,r,a)}else null!=e&&(i(e,o),pa(n._rootEl,r,e))}(n.classList,e,t),function(e,t,n){var r=function(r){var o=e[r];if("function"==typeof o){var i=ya(t,o,function(e){n._rootEl&&n._rootEl.setStyle(r,e)});n._rootEl.setStyle(r,i)}else n._rootEl&&n._rootEl.setStyle(r,o)};for(var o in e)r(o)}(n.style,e,t),r.children?r.children[r.children.length-1]._vm=t:r._vm=t}function fa(e,t,n,r){if(e){var o=function(o){if(!t||t[o]){var i=e[o];if("function"==typeof i){var a=ya(n,i,function(e){r[o]=e});r[o]=a}else r[o]=i}};for(var i in e)o(i)}}function da(e,t,n,r){var o=Object.create(null);if(Object.defineProperties(o,{vm:{value:r,writable:!1,configurable:!1},el:{get:function(){return t||r._rootEl},configurable:!1}}),"function"==typeof n){var i=n;((n=i.call(e))||0===n)&&(e._ids[n]=o),ya(e,i,function(t){t&&(e._ids[t]=o)})}else n&&"string"==typeof n&&(e._ids[n]=o)}function pa(e,t,n){"string"==typeof n&&(n=n.split(/\s+/)),n.forEach(function(e,t){n.splice.apply(n,[t,1].concat(e.split(/\s+/)))});for(var r={},o=n.length,i=function(e){var o=t[n[e]];o&&Object.keys(o).forEach(function(e){r[e]=o[e]})},a=0;a<o;a++)i(a);e.setClassStyle(r)}function ha(e,t,n,r){if(r)for(var o=Object.keys(r),i=o.length;i--;){var a=o[i],s=r[a];"function"==typeof s?va(e,t,n,a,s):t[ua[n]](a,s)}}function va(e,t,n,r,o){var i=ua[n],a=ya(e,o,function(n){function o(){t[i](r,n)}var a=e&&e._app&&e._app.differ;a?a.append("element",t.depth||0,t.ref,o):o()});t[i](r,a)}function ya(e,t,n){if(e._static)return t.call(e,e);return new zi(e,t,function(e,t){"object"!=typeof e&&e===t||n(e)}).value}function ma(e,t){var n,r,o=(n=e,n._app.doc.createComment("start")),i=(r=e,r._app.doc.createComment("end")),a=_a++;if(t.element){var s=t.updateMark;s?(s.element&&(s=s.end),t.element.insertAfter(i,s),t.element.insertAfter(o,s),t.updateMark=i):(t.element.insertBefore(o,t.end),t.element.insertBefore(i,t.end)),t=t.element}else t.appendChild(o),t.appendChild(i);return{start:o,end:i,element:t,blockId:a}}var _a=1;function ga(e,t,n){if(n.element){var r=n.end,o=n.updateMark;if(n.children&&n.children.push(t),o){var i=ba(e,t,o);return n.updateMark=t.element?t.end:t,i}if(!t.element)return n.element.insertBefore(t,r);n.element.insertBefore(t.start,r),n.element.insertBefore(t.end,r)}else{if(!t.element)return n.appendChild(t);n.appendChild(t.start),n.appendChild(t.end)}}function ba(e,t,n){return t.element?function(e,t){var n=t.parentNode;if(n){for(var r,o=e.start,i=[o];o&&o!==e.end;)o=o.nextSibling,i.push(o);var a=t;return i.every(function(e){return r=n.insertAfter(e,a),a=e,-1!==r}),r}}(t,n):function(e,t){var n=t.parentNode;if(n)return n.insertAfter(e,t)}(t,n)}function wa(e,t,n){void 0===n&&(n=!1),t.element?function(e,t){void 0===t&&(t=!1);var n=[],r=e.start.nextSibling;for(;r&&r!==e.end;)n.push(r),r=r.nextSibling;t||Ca(e.start);n.forEach(function(e){Ca(e)}),t||Ca(e.end)}(t,n):Ca(t),t._vm&&t._vm.$emit("hook:destroyed")}function Ca(e){var t=e.parentNode;t&&t.removeChild(e)}function ka(e,t,n,r){if(-1!==(e._app||{}).lastSignal)if(t.attr&&t.attr.hasOwnProperty("static")&&(e._static=!0),o=t,Array.isArray(o))!function(e,t,n,r){var o=ma(e,n);t.forEach(function(t){ka(e,t,o,r)})}(e,t,n,r);else{var o;if(r=r||{},"content"===(i=t).type||"slot"===i.type)return console.debug('[JS Framework] compile "content" block by',t),void(e._content=ma(e,n));var i;if(a=t,!r.hasOwnProperty("repeat")&&a.repeat)return console.debug('[JS Framework] compile "repeat" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `repeat` directive!"):function(e,t,n){var r=t.repeat,o="function"==typeof r,i=r.getter||r.expression||r;"function"!=typeof i&&(i=function(){return[]});var a=r.key||"$index",s=r.value||"$value",u=r.trackBy||t.trackBy||t.attr&&t.attr.trackBy,c=ma(e,n);c.children=[],c.data=[],c.vms=[],function(e,t,n,r){var o=n.vms,i=n.children,a=r.getter,s=r.trackBy,u=r.oldStyle,c=r.key,l=r.value;function f(e,r,i){var a;u?(a=e,wi(e)?(a[c]=r,a.hasOwnProperty("INDEX")||Object.defineProperty(a,"INDEX",{value:function(){console.warn('[JS Framework] "INDEX" in repeat is deprecated, please use "$index" instead')}})):(console.warn("[JS Framework] Each list item must be an object in old-style repeat, please use `repeat={{v in list}}` instead."),(a={})[c]=r,a[l]=e)):((a={})[c]=r,a[l]=e);var s=function(e,t){var n=Object.create(e);n._data=t,na(n),oa(n),n._realParent=e,e._static&&(n._static=e._static);return n}(i,a);o.push(s),ka(s,t,n,{repeat:e})}var d=Sa(e,n,a,"repeat",function(t){if(console.debug('[JS Framework] the "repeat" item has changed',t),n&&t){var r=i.slice(),a=o.slice(),d=n.data.slice(),p={},h={};t.forEach(function(e,t){var n=s?e[s]:u?e[c]:t;null!=n&&""!==n&&(p[n]=e)});var v=[];d.forEach(function(e,t){var n=s?e[s]:u?e[c]:t;p.hasOwnProperty(n)?(h[n]={item:e,index:t,key:n,target:r[t],vm:a[t]},v.push(e)):wa(0,r[t])}),i.length=0,o.length=0,n.data=t.slice(),n.updateMark=n.start,t.forEach(function(t,r){var a=s?t[s]:u?t[c]:r,d=h[a];d?(d.item===v[0]?v.shift():(v.$remove(d.item),ba(0,d.target,n.updateMark)),i.push(d.target),o.push(d.vm),u?d.vm=t:d.vm[l]=t,d.vm[c]=r,n.updateMark=d.target):f(t,r,e)}),delete n.updateMark}});n.data=d.slice(0),d.forEach(function(t,n){f(t,n,e)})}(e,t,c,{getter:i,key:a,value:s,trackBy:u,oldStyle:o})}(e,t,n));var a;if(s=t,!r.hasOwnProperty("shown")&&s.shown)return console.debug('[JS Framework] compile "if" logic by',t),void("document"===n.type?console.warn("[JS Framework] The root element does't support `if` directive!"):function(e,t,n,r){var o={shown:!0},i=ma(e,n);n.element&&n.children&&n.children.push(i);r.repeat&&(o.repeat=r.repeat);!function(e,t,n,r){var o=Sa(e,n,t.shown,"shown",function(o){console.debug('[JS Framework] the "if" item was changed',o),n&&!!n.display!=!!o&&(n.display=!!o,o?ka(e,t,n,r):wa(0,n,!0))});n.display=!!o,o&&ka(e,t,n,r)}(e,t,i,o)}(e,t,n,r));var s,u=r.type||t.type;if("function"!=typeof u||r.hasOwnProperty("type")){var c=u,l=function(e,t,n){var r;e._app&&e._app.customComponentMap&&(r=e._app.customComponentMap[n]);e._options&&e._options.components&&(r=e._options.components[n]);t.component&&(r=r||{});return r}(e,t,c);if(l)return console.debug("[JS Framework] compile composed component by",t),void function(e,t,n,r,o,i){var a=new(0,e.constructor)(o,t,e,r,void 0,{"hook:init":function(){e._static&&(this._static=e._static),da(e,null,n.id,this),this._externalBinding={parent:e,template:n}},"hook:created":function(){!function(e,t,n,r){t=t||{},n=n||{};var o=(t._options||{}).props;Array.isArray(o)&&(o=o.reduce(function(e,t){return e[t]=!0,e},{})),fa(r,o,e,t),fa(n.attr,o,e,t)}(e,this,n,i.repeat)},"hook:ready":function(){this._content&&xa(e,n,this._content)}});la(e,a,n,r)}(e,l,t,n,c,r);console.debug("[JS Framework] compile native component by",t),function(e,t,n,r){!function(e){var t=e.type,n=sa[t];if("object"==typeof n)for(var r in n)if(null==e[r])e[r]=n[r];else if("object"===Ai(e[r])&&"object"===Ai(n[r]))for(var o in n[r])null==e[r][o]&&(e[r][o]=n[r][o])}(t);var o;"_documentElement"===n.ref?(console.debug("[JS Framework] compile to create body for "+r),a=r,o=e._app.doc.createBody(a)):(console.debug("[JS Framework] compile to create element for "+r),i=r,o=e._app.doc.createElement(i));var i;var a;if(!e._rootEl){e._rootEl=o;var s=e._externalBinding||{},u=s.template,c=s.parent;if(u&&u.events&&c&&o)for(var l in u.events){var f=c[u.events[l]];f&&o.addEvent(l,bi(f,c))}}ca(e,o,t),t.attr&&t.attr.append&&(t.append=t.attr.append);t.append&&(o.attr=o.attr||{},o.attr.append=t.append);var d="tree"===t.append,p=e._app||{};-1===p.lastSignal||d||(console.debug("[JS Framework] compile to append single node for",o),p.lastSignal=ga(e,o,n));-1!==p.lastSignal&&xa(e,t,o);-1!==p.lastSignal&&d&&(console.debug("[JS Framework] compile to append whole tree for",o),p.lastSignal=ga(e,o,n))}(e,t,n,c)}else!function(e,t,n,r,o){var i=vi({type:r.call(e)},o),a=ma(e,n);n.element&&n.children&&n.children.push(a);ya(e,r,function(n){var r=vi({type:n},o);wa(0,a,!0),ka(e,t,a,r)}),ka(e,t,a,i)}(e,t,n,u,r)}}function xa(e,t,n){var r=e._app||{},o=t.children;o&&o.length&&o.every(function(t){return ka(e,t,n),-1!==r.lastSignal})}function Sa(e,t,n,r,o){var i=e&&e._app&&e._app.differ,a={},s=(t.element.depth||0)+1;return ya(e,n,function(e){a.latestValue=e,i&&!a.recorded&&i.append(r,s,t.blockId,function(){var e=a.latestValue;o(e),a.recorded=!1,a.latestValue=void 0}),a.recorded=!0})}function Ea(e,t){if(t instanceof Ea)return t;this.timestamp=Date.now(),this.detail=t,this.type=e;var n=!1;this.stop=function(){n=!0},this.hasStopped=function(){return n}}function Oa(e,t){var n=this,r=this._vmEvents[e];if(r){var o=new Ea(e,t);r.forEach(function(e){e.call(n,o)})}}function ja(e,t){var n=new Ea(e,t);this.$emit(e,n),!n.hasStopped()&&this._parent&&this._parent.$dispatch&&this._parent.$dispatch(e,n)}function Aa(e,t){var n=new Ea(e,t);this.$emit(e,n),!n.hasStopped()&&this._childrenVms&&this._childrenVms.forEach(function(t){t.$broadcast(e,n)})}function Ia(e,t){if(e&&"function"==typeof t){var n=this._vmEvents,r=n[e]||[];r.push(t),n[e]=r,"hook:ready"===e&&this._ready&&this.$emit("hook:ready")}}function Ta(e,t){if(e){var n=this._vmEvents;if(t){var r=n[e];r&&r.$remove(t)}else delete n[e]}}var Pa=["init","created","ready","destroyed"];function Na(e,t,n,r,o,i){n=n||{},this._parent=n._realParent?n._realParent:n,this._app=n._app||{},n._childrenVms&&n._childrenVms.push(this),!t&&this._app.customComponentMap&&(t=this._app.customComponentMap[e]);var a=(t=t||{}).data||{};this._options=t,this._methods=t.methods||{},this._computed=t.computed||{},this._css=t.style||{},this._ids={},this._vmEvents={},this._childrenVms=[],this._type=e,function(e,t){var n=e._options||{},r=n.events||{};for(var o in r)e.$on(o,r[o]);for(var i in t)e.$on(i,t[i]);Pa.forEach(function(t){e.$on("hook:"+t,n[t])})}(this,i),console.debug('[JS Framework] "init" lifecycle in Vm('+this._type+")"),this.$emit("hook:init"),this._inited=!0,this._data="function"==typeof a?a():a,o&&vi(this._data,o),(s=this)._watchers=[],na(s),oa(s),function(e){var t=e._methods;if(t)for(var n in t)e[n]=t[n]}(s);var s;console.debug('[JS Framework] "created" lifecycle in Vm('+this._type+")"),this.$emit("hook:created"),this._created=!0,t.methods&&t.methods.ready&&(console.warn('"exports.methods.ready" is deprecated, please use "exports.created" instead'),t.methods.ready.call(this)),this._app.doc&&(this._parentEl=r||this._app.doc.documentElement,function(e){var t=e._options||{},n=t.template||{};t.replace?n.children&&1===n.children.length?ka(e,n.children[0],e._parentEl):ka(e,n.children,e._parentEl):ka(e,n,e._parentEl),console.debug('[JS Framework] "ready" lifecycle in Vm('+e._type+")"),e.$emit("hook:ready"),e._ready=!0}(this))}(Ma=Na.prototype).$emit=Oa,Ma.$dispatch=ja,Ma.$broadcast=Aa,Ma.$on=Ia,Ma.$off=Ta;var Ma;Na.prototype.$watch=function(e,t){ya(this,e,t)},Na.set=function e(t,n,r){if(Array.isArray(t))return t.splice(n,1,r);if(gi(t,n))t[n]=r;else if(t._isVue)e(t._data,n,r);else{var o=t.__ob__;if(o){if(o.convert(n,r),o.dep.notify(),o.vms)for(var i=o.vms.length;i--;)ta(o.vms[i],n);return r}t[n]=r}},Na.delete=function(e,t){if(gi(e,t)){delete e[t];var n=e.__ob__;if(n){if(n.dep.notify(),n.vms)for(var r=n.vms.length;r--;)o=n.vms[r],Si(i=t)||delete o[i]}else e._isVue&&delete e._data[t]}var o,i};var $a={};function Ra(e,t){var n=function(n){var r=$a[n];r||(r={},$a[n]=r),e[n].forEach(function(e){"string"==typeof e&&(e={name:e}),r[e.name]&&!t||(r[e.name]=e)})};for(var r in e)n(r)}function Da(e,t){return e.customComponentMap[t]}function Fa(e,t,n){var r=e.customComponentMap;r[t]?console.error("[JS Framework] define a component("+t+") that already exists"):r[t]=n}var La=r(function(e,t){t=e.exports=q;var n;"object"==typeof process&&process.env,n=function(){},t.SEMVER_SPEC_VERSION="2.0.0";var r=256,o=Number.MAX_SAFE_INTEGER||9007199254740991,i=t.re=[],a=t.src=[],s=0,u=s++;a[u]="0|[1-9]\\d*";var c=s++;a[c]="[0-9]+";var l=s++;a[l]="\\d*[a-zA-Z-][a-zA-Z0-9-]*";var f=s++;a[f]="("+a[u]+")\\.("+a[u]+")\\.("+a[u]+")";var d=s++;a[d]="("+a[c]+")\\.("+a[c]+")\\.("+a[c]+")";var p=s++;a[p]="(?:"+a[u]+"|"+a[l]+")";var h=s++;a[h]="(?:"+a[c]+"|"+a[l]+")";var v=s++;a[v]="(?:-("+a[p]+"(?:\\."+a[p]+")*))";var y=s++;a[y]="(?:-?("+a[h]+"(?:\\."+a[h]+")*))";var m=s++;a[m]="[0-9A-Za-z-]+";var _=s++;a[_]="(?:\\+("+a[m]+"(?:\\."+a[m]+")*))";var g=s++,b="v?"+a[f]+a[v]+"?"+a[_]+"?";a[g]="^"+b+"$";var w="[v=\\s]*"+a[d]+a[y]+"?"+a[_]+"?",C=s++;a[C]="^"+w+"$";var k=s++;a[k]="((?:<|>)?=?)";var x=s++;a[x]=a[c]+"|x|X|\\*";var S=s++;a[S]=a[u]+"|x|X|\\*";var E=s++;a[E]="[v=\\s]*("+a[S]+")(?:\\.("+a[S]+")(?:\\.("+a[S]+")(?:"+a[v]+")?"+a[_]+"?)?)?";var O=s++;a[O]="[v=\\s]*("+a[x]+")(?:\\.("+a[x]+")(?:\\.("+a[x]+")(?:"+a[y]+")?"+a[_]+"?)?)?";var j=s++;a[j]="^"+a[k]+"\\s*"+a[E]+"$";var A=s++;a[A]="^"+a[k]+"\\s*"+a[O]+"$";var I=s++;a[I]="(?:~>?)";var T=s++;a[T]="(\\s*)"+a[I]+"\\s+",i[T]=new RegExp(a[T],"g");var P=s++;a[P]="^"+a[I]+a[E]+"$";var N=s++;a[N]="^"+a[I]+a[O]+"$";var M=s++;a[M]="(?:\\^)";var $=s++;a[$]="(\\s*)"+a[M]+"\\s+",i[$]=new RegExp(a[$],"g");var R=s++;a[R]="^"+a[M]+a[E]+"$";var D=s++;a[D]="^"+a[M]+a[O]+"$";var F=s++;a[F]="^"+a[k]+"\\s*("+w+")$|^$";var L=s++;a[L]="^"+a[k]+"\\s*("+b+")$|^$";var V=s++;a[V]="(\\s*)"+a[k]+"\\s*("+w+"|"+a[E]+")",i[V]=new RegExp(a[V],"g");var W=s++;a[W]="^\\s*("+a[E]+")\\s+-\\s+("+a[E]+")\\s*$";var B=s++;a[B]="^\\s*("+a[O]+")\\s+-\\s+("+a[O]+")\\s*$";var U=s++;a[U]="(<|>)?=?\\s*\\*";for(var J=0;J<s;J++)n(J,a[J]),i[J]||(i[J]=new RegExp(a[J]));t.parse=z;function z(e,t){if(e instanceof q)return e;if("string"!=typeof e)return null;if(e.length>r)return null;if(!(t?i[C]:i[g]).test(e))return null;try{return new q(e,t)}catch(e){return null}}t.valid=function(e,t){var n=z(e,t);return n?n.version:null};t.clean=function(e,t){var n=z(e.trim().replace(/^[=v]+/,""),t);return n?n.version:null};t.SemVer=q;function q(e,t){if(e instanceof q){if(e.loose===t)return e;e=e.version}else if("string"!=typeof e)throw new TypeError("Invalid Version: "+e);if(e.length>r)throw new TypeError("version is longer than "+r+" characters");if(!(this instanceof q))return new q(e,t);n("SemVer",e,t),this.loose=t;var a=e.trim().match(t?i[C]:i[g]);if(!a)throw new TypeError("Invalid Version: "+e);if(this.raw=e,this.major=+a[1],this.minor=+a[2],this.patch=+a[3],this.major>o||this.major<0)throw new TypeError("Invalid major version");if(this.minor>o||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>o||this.patch<0)throw new TypeError("Invalid patch version");a[4]?this.prerelease=a[4].split(".").map(function(e){if(/^[0-9]+$/.test(e)){var t=+e;if(t>=0&&t<o)return t}return e}):this.prerelease=[],this.build=a[5]?a[5].split("."):[],this.format()}q.prototype.format=function(){return this.version=this.major+"."+this.minor+"."+this.patch,this.prerelease.length&&(this.version+="-"+this.prerelease.join(".")),this.version},q.prototype.toString=function(){return this.version},q.prototype.compare=function(e){return n("SemVer.compare",this.version,this.loose,e),e instanceof q||(e=new q(e,this.loose)),this.compareMain(e)||this.comparePre(e)},q.prototype.compareMain=function(e){return e instanceof q||(e=new q(e,this.loose)),G(this.major,e.major)||G(this.minor,e.minor)||G(this.patch,e.patch)},q.prototype.comparePre=function(e){if(e instanceof q||(e=new q(e,this.loose)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;var t=0;do{var r=this.prerelease[t],o=e.prerelease[t];if(n("prerelease compare",t,r,o),void 0===r&&void 0===o)return 0;if(void 0===o)return 1;if(void 0===r)return-1;if(r!==o)return G(r,o)}while(++t)},q.prototype.inc=function(e,t){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",t);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",t);break;case"prepatch":this.prerelease.length=0,this.inc("patch",t),this.inc("pre",t);break;case"prerelease":0===this.prerelease.length&&this.inc("patch",t),this.inc("pre",t);break;case"major":0===this.minor&&0===this.patch&&0!==this.prerelease.length||this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":0===this.patch&&0!==this.prerelease.length||this.minor++,this.patch=0,this.prerelease=[];break;case"patch":0===this.prerelease.length&&this.patch++,this.prerelease=[];break;case"pre":if(0===this.prerelease.length)this.prerelease=[0];else{for(var n=this.prerelease.length;--n>=0;)"number"==typeof this.prerelease[n]&&(this.prerelease[n]++,n=-2);-1===n&&this.prerelease.push(0)}t&&(this.prerelease[0]===t?isNaN(this.prerelease[1])&&(this.prerelease=[t,0]):this.prerelease=[t,0]);break;default:throw new Error("invalid increment argument: "+e)}return this.format(),this.raw=this.version,this},t.inc=function(e,t,n,r){"string"==typeof n&&(r=n,n=void 0);try{return new q(e,n).inc(t,r).version}catch(e){return null}};t.diff=function(e,t){{if(Q(e,t))return null;var n=z(e),r=z(t);if(n.prerelease.length||r.prerelease.length){for(var o in n)if(("major"===o||"minor"===o||"patch"===o)&&n[o]!==r[o])return"pre"+o;return"prerelease"}for(var o in n)if(("major"===o||"minor"===o||"patch"===o)&&n[o]!==r[o])return o}};t.compareIdentifiers=G;var H=/^[0-9]+$/;function G(e,t){var n=H.test(e),r=H.test(t);return n&&r&&(e=+e,t=+t),n&&!r?-1:r&&!n?1:e<t?-1:e>t?1:0}t.rcompareIdentifiers=function(e,t){return G(t,e)};t.major=function(e,t){return new q(e,t).major};t.minor=function(e,t){return new q(e,t).minor};t.patch=function(e,t){return new q(e,t).patch};t.compare=X;function X(e,t,n){return new q(e,n).compare(new q(t,n))}t.compareLoose=function(e,t){return X(e,t,!0)};t.rcompare=function(e,t,n){return X(t,e,n)};t.sort=function(e,n){return e.sort(function(e,r){return t.compare(e,r,n)})};t.rsort=function(e,n){return e.sort(function(e,r){return t.rcompare(e,r,n)})};t.gt=K;function K(e,t,n){return X(e,t,n)>0}t.lt=Z;function Z(e,t,n){return X(e,t,n)<0}t.eq=Q;function Q(e,t,n){return 0===X(e,t,n)}t.neq=Y;function Y(e,t,n){return 0!==X(e,t,n)}t.gte=ee;function ee(e,t,n){return X(e,t,n)>=0}t.lte=te;function te(e,t,n){return X(e,t,n)<=0}t.cmp=ne;function ne(e,t,n,r){var o;switch(t){case"===":"object"==typeof e&&(e=e.version),"object"==typeof n&&(n=n.version),o=e===n;break;case"!==":"object"==typeof e&&(e=e.version),"object"==typeof n&&(n=n.version),o=e!==n;break;case"":case"=":case"==":o=Q(e,n,r);break;case"!=":o=Y(e,n,r);break;case">":o=K(e,n,r);break;case">=":o=ee(e,n,r);break;case"<":o=Z(e,n,r);break;case"<=":o=te(e,n,r);break;default:throw new TypeError("Invalid operator: "+t)}return o}t.Comparator=re;function re(e,t){if(e instanceof re){if(e.loose===t)return e;e=e.value}if(!(this instanceof re))return new re(e,t);n("comparator",e,t),this.loose=t,this.parse(e),this.semver===oe?this.value="":this.value=this.operator+this.semver.version,n("comp",this)}var oe={};re.prototype.parse=function(e){var t=this.loose?i[F]:i[L],n=e.match(t);if(!n)throw new TypeError("Invalid comparator: "+e);this.operator=n[1],"="===this.operator&&(this.operator=""),n[2]?this.semver=new q(n[2],this.loose):this.semver=oe},re.prototype.toString=function(){return this.value},re.prototype.test=function(e){return n("Comparator.test",e,this.loose),this.semver===oe||("string"==typeof e&&(e=new q(e,this.loose)),ne(e,this.operator,this.semver,this.loose))},re.prototype.intersects=function(e,t){if(!(e instanceof re))throw new TypeError("a Comparator is required");var n;if(""===this.operator)return n=new ie(e.value,t),ce(this.value,n,t);if(""===e.operator)return n=new ie(this.value,t),ce(e.semver,n,t);var r=!(">="!==this.operator&&">"!==this.operator||">="!==e.operator&&">"!==e.operator),o=!("<="!==this.operator&&"<"!==this.operator||"<="!==e.operator&&"<"!==e.operator),i=this.semver.version===e.semver.version,a=!(">="!==this.operator&&"<="!==this.operator||">="!==e.operator&&"<="!==e.operator),s=ne(this.semver,"<",e.semver,t)&&(">="===this.operator||">"===this.operator)&&("<="===e.operator||"<"===e.operator),u=ne(this.semver,">",e.semver,t)&&("<="===this.operator||"<"===this.operator)&&(">="===e.operator||">"===e.operator);return r||o||i&&a||s||u},t.Range=ie;function ie(e,t){if(e instanceof ie)return e.loose===t?e:new ie(e.raw,t);if(e instanceof re)return new ie(e.value,t);if(!(this instanceof ie))return new ie(e,t);if(this.loose=t,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(function(e){return this.parseRange(e.trim())},this).filter(function(e){return e.length}),!this.set.length)throw new TypeError("Invalid SemVer Range: "+e);this.format()}ie.prototype.format=function(){return this.range=this.set.map(function(e){return e.join(" ").trim()}).join("||").trim(),this.range},ie.prototype.toString=function(){return this.range},ie.prototype.parseRange=function(e){var t=this.loose;e=e.trim(),n("range",e,t);var r=t?i[B]:i[W];e=e.replace(r,se),n("hyphen replace",e),e=e.replace(i[V],"$1$2$3"),n("comparator trim",e,i[V]),e=(e=(e=e.replace(i[T],"$1~")).replace(i[$],"$1^")).split(/\s+/).join(" ");var o=t?i[F]:i[L],a=e.split(" ").map(function(e){return function(e,t){return n("comp",e),l=e,f=t,e=l.trim().split(/\s+/).map(function(e){return function(e,t){n("caret",e,t);var r=t?i[D]:i[R];return e.replace(r,function(t,r,o,i,a){n("caret",e,t,r,o,i,a);var s;return ae(r)?s="":ae(o)?s=">="+r+".0.0 <"+(+r+1)+".0.0":ae(i)?s="0"===r?">="+r+"."+o+".0 <"+r+"."+(+o+1)+".0":">="+r+"."+o+".0 <"+(+r+1)+".0.0":a?(n("replaceCaret pr",a),"-"!==a.charAt(0)&&(a="-"+a),s="0"===r?"0"===o?">="+r+"."+o+"."+i+a+" <"+r+"."+o+"."+(+i+1):">="+r+"."+o+"."+i+a+" <"+r+"."+(+o+1)+".0":">="+r+"."+o+"."+i+a+" <"+(+r+1)+".0.0"):(n("no pr"),s="0"===r?"0"===o?">="+r+"."+o+"."+i+" <"+r+"."+o+"."+(+i+1):">="+r+"."+o+"."+i+" <"+r+"."+(+o+1)+".0":">="+r+"."+o+"."+i+" <"+(+r+1)+".0.0"),n("caret return",s),s})}(e,f)}).join(" "),n("caret",e),u=e,c=t,e=u.trim().split(/\s+/).map(function(e){return function(e,t){var r=t?i[N]:i[P];return e.replace(r,function(t,r,o,i,a){n("tilde",e,t,r,o,i,a);var s;return ae(r)?s="":ae(o)?s=">="+r+".0.0 <"+(+r+1)+".0.0":ae(i)?s=">="+r+"."+o+".0 <"+r+"."+(+o+1)+".0":a?(n("replaceTilde pr",a),"-"!==a.charAt(0)&&(a="-"+a),s=">="+r+"."+o+"."+i+a+" <"+r+"."+(+o+1)+".0"):s=">="+r+"."+o+"."+i+" <"+r+"."+(+o+1)+".0",n("tilde return",s),s})}(e,c)}).join(" "),n("tildes",e),a=e,s=t,n("replaceXRanges",a,s),e=a.split(/\s+/).map(function(e){return function(e,t){e=e.trim();var r=t?i[A]:i[j];return e.replace(r,function(t,r,o,i,a,s){n("xRange",e,t,r,o,i,a,s);var u=ae(o),c=u||ae(i),l=c||ae(a),f=l;return"="===r&&f&&(r=""),u?t=">"===r||"<"===r?"<0.0.0":"*":r&&f?(c&&(i=0),l&&(a=0),">"===r?(r=">=",c?(o=+o+1,i=0,a=0):l&&(i=+i+1,a=0)):"<="===r&&(r="<",c?o=+o+1:i=+i+1),t=r+o+"."+i+"."+a):c?t=">="+o+".0.0 <"+(+o+1)+".0.0":l&&(t=">="+o+"."+i+".0 <"+o+"."+(+i+1)+".0"),n("xRange return",t),t})}(e,s)}).join(" "),n("xrange",e),r=e,o=t,n("replaceStars",r,o),e=r.trim().replace(i[U],""),n("stars",e),e;var r,o;var a,s;var u,c;var l,f}(e,t)}).join(" ").split(/\s+/);return this.loose&&(a=a.filter(function(e){return!!e.match(o)})),a=a.map(function(e){return new re(e,t)})},ie.prototype.intersects=function(e,t){if(!(e instanceof ie))throw new TypeError("a Range is required");return this.set.some(function(n){return n.every(function(n){return e.set.some(function(e){return e.every(function(e){return n.intersects(e,t)})})})})},t.toComparators=function(e,t){return new ie(e,t).set.map(function(e){return e.map(function(e){return e.value}).join(" ").trim().split(" ")})};function ae(e){return!e||"x"===e.toLowerCase()||"*"===e}function se(e,t,n,r,o,i,a,s,u,c,l,f,d){return((t=ae(n)?"":ae(r)?">="+n+".0.0":ae(o)?">="+n+"."+r+".0":">="+t)+" "+(s=ae(u)?"":ae(c)?"<"+(+u+1)+".0.0":ae(l)?"<"+u+"."+(+c+1)+".0":f?"<="+u+"."+c+"."+l+"-"+f:"<="+s)).trim()}ie.prototype.test=function(e){if(!e)return!1;"string"==typeof e&&(e=new q(e,this.loose));for(var t=0;t<this.set.length;t++)if(ue(this.set[t],e))return!0;return!1};function ue(e,t){for(var r=0;r<e.length;r++)if(!e[r].test(t))return!1;if(t.prerelease.length){for(r=0;r<e.length;r++)if(n(e[r].semver),e[r].semver!==oe&&e[r].semver.prerelease.length>0){var o=e[r].semver;if(o.major===t.major&&o.minor===t.minor&&o.patch===t.patch)return!0}return!1}return!0}t.satisfies=ce;function ce(e,t,n){try{t=new ie(t,n)}catch(e){return!1}return t.test(e)}t.maxSatisfying=function(e,t,n){var r=null,o=null;try{var i=new ie(t,n)}catch(e){return null}return e.forEach(function(e){i.test(e)&&(r&&-1!==o.compare(e)||(o=new q(r=e,n)))}),r};t.minSatisfying=function(e,t,n){var r=null,o=null;try{var i=new ie(t,n)}catch(e){return null}return e.forEach(function(e){i.test(e)&&(r&&1!==o.compare(e)||(o=new q(r=e,n)))}),r};t.validRange=function(e,t){try{return new ie(e,t).range||"*"}catch(e){return null}};t.ltr=function(e,t,n){return le(e,t,"<",n)};t.gtr=function(e,t,n){return le(e,t,">",n)};t.outside=le;function le(e,t,n,r){e=new q(e,r),t=new ie(t,r);var o,i,a,s,u;switch(n){case">":o=K,i=te,a=Z,s=">",u=">=";break;case"<":o=Z,i=ee,a=K,s="<",u="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ce(e,t,r))return!1;for(var c=0;c<t.set.length;++c){var l=null,f=null;if(t.set[c].forEach(function(e){e.semver===oe&&(e=new re(">=0.0.0")),l=l||e,f=f||e,o(e.semver,l.semver,r)?l=e:a(e.semver,f.semver,r)&&(f=e)}),l.operator===s||l.operator===u)return!1;if((!f.operator||f.operator===s)&&i(e,f.semver))return!1;if(f.operator===u&&a(e,f.semver))return!1}return!0}t.prerelease=function(e,t){var n=z(e,t);return n&&n.prerelease.length?n.prerelease:null};t.intersects=function(e,t,n){return e=new ie(e,n),t=new ie(t,n),e.intersects(t)}});function Va(e){if(La.valid(e))return e;for(var t=(e="string"==typeof e?e:"").split("."),n=0,r=[];n<3;){var o="string"==typeof t[n]&&t[n]?t[n]:"0";r.push(o),n++}return r.join(".")}function Wa(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();r.errorMessage=(i=e,a=t,s=n,"Downgrade["+i+"] :: deviceInfo "+a+" matched criteria "+s);var i,a,s;return o.indexOf("osversion")>=0?r.code=1001:o.indexOf("appversion")>=0?r.code=1002:o.indexOf("weexversion")>=0?r.code=1003:o.indexOf("devicemodel")>=0&&(r.code=1004),r}function Ba(e,t,n,r){console.debug("[JS Framework] bootstrap for "+t);var o;if(Mi(t))o=Fi(t);else{if(!Di(t))return new Error("Wrong component name: "+t);if(!Da(e,o=Li(t)))return new Error("It's not a component: "+t)}if("string"==typeof(n=xi(n)?n:{}).transformerVersion&&"string"==typeof global.transformerVersion&&!La.satisfies(n.transformerVersion,global.transformerVersion))return new Error("JS Bundle version: "+n.transformerVersion+" not compatible with "+global.transformerVersion);var i=function(e,t){t=xi(t=t||global.WXEnvironment)?t:{};var n={isDowngrade:!1};if("function"===Ai(e)){var r=e.call(this,t,{semver:La,normalizeVersion:Va});n=(r=!!r)?Wa("custom","","custom params"):n}else{var o=(e=xi(e)?e:{})[(t.platform||"unknow").toLowerCase()]||{};for(var i in t){var a=i,s=a.toLowerCase(),u=t[i],c=s.indexOf("version")>=0,l=s.indexOf("devicemodel")>=0,f=o[i];if(f&&c){var d=Va(f),p=Va(t[i]);if(La.satisfies(p,d)){n=Wa(a,u,f);break}}else if(l&&("array"===Ai(f)?f:[f]).indexOf(u)>=0){n=Wa(a,u,f);break}}}return n}(n.downgrade);if(i.isDowngrade)return e.callTasks([{module:"instanceWrap",method:"error",args:[i.errorType,i.code,i.errorMessage]}]),new Error("Downgrade["+i.code+"]: "+i.errorMessage);n.viewport&&function(e,t){if(void 0===t&&(t={}),e&&e.callTasks)e.callTasks([{module:"meta",method:"setViewport",args:[t]}])}(e,n.viewport),e.vm=new Na(o,null,{_app:e},null,r)}var Ua=function(e,t){for(var n=[],r=arguments.length-2;r-- >0;)n[r]=arguments[r+2];console.debug("[JS Framework] define a component "+t);var o,i;if("function"==typeof(i=n.length>1?n[1]:n[0])&&(o=i,i=null),o){var a={exports:{}};o(function(t){if(Mi(t)){var n=Fi(t);return Da(e,n)}if($i(t)){var r=Fi(t);return e.requireModule(r)}if(Ri(t)||Di(t)){var o=Li(t);return e.commonModules[o]}},a.exports,a),i=a.exports}if(Mi(t)){var s=Fi(t);Fa(e,s,i)}else if($i(t)){var u;Ra(((u={})[Fi(t)]=i,u))}else if(Ri(t)){var c=Li(t);e.commonModules[c]=i}else if(Di(t)){var l=Li(t);i.template||i.style||i.methods?Fa(e,l,i):e.commonModules[l]=i}};function Ja(e){console.debug("[JS Framework] Destory an instance("+e.id+")"),e.vm&&function e(t){delete t._app;delete t._computed;delete t._css;delete t._data;delete t._ids;delete t._methods;delete t._options;delete t._parent;delete t._parentEl;delete t._rootEl;if(t._watchers){for(var n=t._watchers.length;n--;)t._watchers[n].teardown();delete t._watchers}if(t._childrenVms){for(var r=t._childrenVms.length;r--;)e(t._childrenVms[r]);delete t._childrenVms}console.debug('[JS Framework] "destroyed" lifecycle in Vm('+t._type+")");t.$emit("hook:destroyed");delete t._type;delete t._vmEvents}(e.vm),e.id="",e.options=null,e.blocks=null,e.vm=null,e.doc.taskCenter.destroyCallback(),e.doc.destroy(),e.doc=null,e.customComponentMap=null,e.commonModules=null}function za(e){e.differ.flush()}function qa(e,t,n,r){console.debug("[JS Framework] Intialize an instance with:\n",n);var o,i=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return Ua.apply(void 0,[e].concat(t))},a=function(t,r,i){o=Ba(e,t,r,i||n),za(e),e.doc.listener.createFinish(),console.debug("[JS Framework] After intialized an instance("+e.id+")")},s=Na,u=e.doc,c=function(t){return e.requireModule(Fi(t))},l={config:e.options,define:i,bootstrap:a,requireModule:c,document:u,Vm:s};Object.freeze(l);var f;"function"==typeof t?f=t.toString().substr(12):t&&(f=t.toString()),f='(function(global){\n\n"use strict";\n\n '+f+" \n\n})(Object.create(this))";var d=global.WXEnvironment,p={};if(d&&"Web"!==d.platform){var h=e.requireModule("timer");Object.assign(p,{setTimeout:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return h.setTimeout(function(){t[0].apply(t,t.slice(2))},t[1]),e.doc.taskCenter.callbackManager.lastCallbackId.toString()},setInterval:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return h.setInterval(function(){t[0].apply(t,t.slice(2))},t[1]),e.doc.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(e){h.clearTimeout(e)},clearInterval:function(e){h.clearInterval(e)}})}var v=Object.assign({define:i,require:function(t){return function(n){o=Ba(e,t,{},n)}},bootstrap:a,register:function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];return function(e,t,n){console.warn("[JS Framework] Register is deprecated, please install lastest transformer."),Fa(e,t,n)}.apply(void 0,[e].concat(t))},render:function(t,n){o=Ba(e,t,{},n)},__weex_define__:i,__weex_bootstrap__:a,__weex_document__:u,__weex_require__:c,__weex_viewmodel__:s,weex:l},p,r);return function(e,t){if("function"!=typeof compileAndRunBundle)return!1;var n=void 0,r=!1,o="(function (",i=[],a=[];for(var s in e)i.push(s),a.push(e[s]);for(var u=0;u<i.length-1;++u)o+=i[u],o+=",";o+=i[i.length-1],o+=") {",o+=t,o+="} )";try{var c=e.weex||{},l=c.config||{};(n=compileAndRunBundle(o,l.bundleUrl,l.bundleDigest,l.codeCachePath))&&"function"==typeof n&&(n.apply(void 0,a),r=!0)}catch(e){console.error(e)}return r}(v,f)||function(e,t){var n=[],r=[];for(var o in e)n.push(o),r.push(e[o]);n.push(t);(new(Function.prototype.bind.apply(Function,[null].concat(n)))).apply(void 0,r)}(v,f),o}var Ha=function(e){this.id=e,this.map=[],this.hooks=[]};Ha.prototype.isEmpty=function(){return 0===this.map.length},Ha.prototype.append=function(e,t,n,r){var o=this;void 0===t&&(t=0),this.hasTimer||(this.hasTimer=!0,setTimeout(function(){o.hasTimer=!1,o.flush(!0)},0));var i=this.map;i[t]||(i[t]={});var a=i[t];a[e]||(a[e]={}),"element"===e?(a[e][n]||(a[e][n]=[]),a[e][n].push(r)):a[e][n]=r},Ha.prototype.flush=function(e){var t=this.map.slice();this.map.length=0,t.forEach(function(e){Ga(e,"repeat"),Ga(e,"shown"),function(e,t){var n=e[t];for(var r in n){var o=n[r];o.forEach(function(e){e()})}}(e,"element")});var n=this.hooks.slice();this.hooks.length=0,n.forEach(function(e){e()}),this.isEmpty()||this.flush()},Ha.prototype.then=function(e){this.hooks.push(e)};function Ga(e,t){var n=e[t];for(var r in n)n[r]()}function Xa(e,t){this.id=e,this.options=t||{},this.vm=null,this.customComponentMap={},this.commonModules={},this.doc=new aa.Document(e,this.options.bundleUrl,null,aa.Listener),this.differ=new Ha(e)}Xa.prototype.requireModule=function(e){return function(e,t){var n=$a[t],r={},o=function(n){Object.defineProperty(r,n,{configurable:!0,enumerable:!0,get:function(){return function(){for(var r=[],o=arguments.length;o--;)r[o]=arguments[o];return e.callTasks({module:t,method:n,args:r})}},set:function(r){if("function"==typeof r)return e.callTasks({module:t,method:n,args:[r]})}})};for(var i in n)o(i);return r}(this,e)},Xa.prototype.updateActions=function(){return za(this)},Xa.prototype.callTasks=function(e){return function(e,t){var n;return"array"!==Ai(t)&&(t=[t]),t.forEach(function(t){n=e.doc.taskCenter.send("module",{module:t.module,method:t.method},t.args)}),n}(this,e)},Object.freeze(Xa),Object.freeze(Xa.prototype);var Ka={};var Za=aa.nativeComponentMap;function Qa(e){"object"==typeof e&&function(e,t){var n=e.prototype;for(var r in t)n.hasOwnProperty(r)||(n[r]=t[r])}(Na,e)}global.registerMethods=Qa;var Ya={fireEvent:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return function e(t,n,r,o,i){console.debug('[JS Framework] Fire a "'+r+'" event on an element('+n+") in instance("+t.id+")");{if(!Array.isArray(n)){var a=t.doc.getRef(n);if(a){var s=t.doc.fireEvent(a,r,o,i);return t.differ.flush(),t.doc.taskCenter.send("dom",{action:"updateFinish"},[]),s}return new Error('invalid element reference "'+n+'"')}n.some(function(n){return!1!==e(t,n,r,o)})}}.apply(void 0,[Ka[e]].concat(t))},callback:function(e){for(var t=[],n=arguments.length-1;n-- >0;)t[n]=arguments[n+1];return function(e,t,n,r){console.debug("[JS Framework] Invoke a callback("+t+") with",n,"in instance("+e.id+")");var o=e.doc.taskCenter.callback(t,n,r);return za(e),e.doc.taskCenter.send("dom",{action:"updateFinish"},[]),o}.apply(void 0,[Ka[e]].concat(t))}};Qa(hi),Object.freeze(Na);var es=Object.freeze({registerComponents:function(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?Za[e]=!0:"object"==typeof e&&"string"==typeof e.type&&(Za[e.type]=e))})},registerModules:function(e){"object"==typeof e&&Ra(e)},registerMethods:Qa,createInstance:function(e,t,n,r,o){var i=(o||{}).services;Ui();var a=Ka[e];n=n||{};var s;return a?s=new Error('invalid instance id "'+e+'"'):(a=new Xa(e,n),Ka[e]=a,s=qa(a,t,r,i)),s instanceof Error?s:a},init:function(e){aa.Document=e.Document,aa.Element=e.Element,aa.Comment=e.Comment,aa.sendTasks=e.sendTasks,aa.Listener=e.Listener},refreshInstance:function(e,t){var n=Ka[e];return n?function(e,t){console.debug("[JS Framework] Refresh with",t,"in instance["+e.id+"]");var n=e.vm;return n&&t?("function"==typeof n.refreshData?n.refreshData(t):vi(n,t),e.differ.flush(),void e.doc.taskCenter.send("dom",{action:"refreshFinish"},[])):new Error('invalid data "'+t+'"')}(n,t):new Error('invalid instance id "'+e+'"')},destroyInstance:function(e){"function"==typeof markupState&&markupState(),Ui();var t=Ka[e];if(!t)return new Error('invalid instance id "'+e+'"');Ja(t),delete Ka[e];var n=Math.round(e);n>0&&(n%18||"function"!=typeof notifyTrimMemory||notifyTrimMemory());return Ka},receiveTasks:function(e,t){if(Ka[e]&&Array.isArray(t)){var n=[];return t.forEach(function(t){var r=Ya[t.method],o=[].concat(t.args);"function"==typeof r&&(o.unshift(e),n.push(r.apply(void 0,o)))}),n}return new Error('invalid instance id "'+e+'" or tasks')},getRoot:function(e){var t=Ka[e];return t?function(e){var t=(e.doc||{}).body||{};return t.toJSON?t.toJSON():{}}(t):new Error('invalid instance id "'+e+'"')}});!function(t){var n=Qo.init,r=Qo.config;r.frameworks=t;var o=e.native,i=e.transformer;for(var a in ri)Qo.service.register(a,ri[a]);Qo.freezePrototype(),Qo.setNativeConsole(),global.frameworkVersion=o,global.transformerVersion=i;var s=n(r),u=function(e){global[e]=function(){for(var t=[],n=arguments.length;n--;)t[n]=arguments[n];var r=s[e].apply(s,t);return r instanceof Error&&console.error(r.toString()),r}};for(var c in s)u(c)}({Vanilla:ai,Vue:pi,Rax:n(r(function(e){e.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=3)}([function(e,t,n){var r=e.exports.createUniqueKey="undefined"!=typeof Symbol?Symbol:function(e){return"[["+e+"_"+Math.random().toFixed(8).slice(2)+"]]"},o=e.exports.isObject=function(e){return"object"==typeof e&&null!==e};e.exports.LISTENERS=r("listeners"),e.exports.CAPTURE=1,e.exports.BUBBLE=2,e.exports.ATTRIBUTE=3,e.exports.newNode=function(e,t,n){var r=o(n);return{listener:e,kind:t,once:r&&Boolean(n.once),passive:r&&Boolean(n.passive),next:null}}},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();var o=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._listeners={}}return r(e,[{key:"_addListener",value:function(e,t,n){return this._listeners[e]=this._listeners[e]||[],this._listeners[e].push({listener:t,once:n}),this}},{key:"on",value:function(e,t){return this._addListener(e,t,!1)}},{key:"once",value:function(e,t){return this._addListener(e,t,!0)}},{key:"off",value:function(e,t){return this._listeners[e]&&this._listeners[e].length?t?(this._listeners[e]=this._listeners[e].filter(function(e){return!(e.listener===t)}),this):(delete this._listeners[e],this):this}},{key:"emit",value:function(e,t){var n=this;return this._listeners[e]?(this._listeners[e].forEach(function(r){r.listener.apply(n,[t]),r.once&&n.removeListener(e,r.listener)}),this):this}}]),e}();t.default=o,e.exports=t.default},function(e,t,n){var r=n(0),o=n(15),i=n(16),a=r.isObject,s=r.LISTENERS,u=r.CAPTURE,c=r.BUBBLE,l=r.ATTRIBUTE,f=r.newNode,d=o.defineCustomEventTarget,p=i.createEventWrapper,h=i.STOP_IMMEDIATE_PROPAGATION_FLAG,v=i.PASSIVE_LISTENER_FLAG,y="undefined"!=typeof window&&void 0!==window.EventTarget,m=e.exports=function e(){var t=arguments;if(!(this instanceof e)){if(1===arguments.length&&Array.isArray(arguments[0]))return d(e,arguments[0]);if(arguments.length>0){for(var n=Array(arguments.length),r=0;r<arguments.length;++r)n[r]=t[r];return d(e,n)}throw new TypeError("Cannot call a class as a function")}Object.defineProperty(this,s,{value:Object.create(null)})};m.prototype=Object.create((y?window.EventTarget:Object).prototype,{constructor:{value:m,writable:!0,configurable:!0},addEventListener:{value:function(e,t,n){if(null==t)return!1;if("function"!=typeof t&&"object"!=typeof t)throw new TypeError('"listener" is not an object.');var r=(a(n)?Boolean(n.capture):Boolean(n))?u:c,o=this[s][e];if(null==o)return this[s][e]=f(t,r,n),!0;for(var i=null;null!=o;){if(o.listener===t&&o.kind===r)return!1;i=o,o=o.next}return i.next=f(t,r,n),!0},configurable:!0,writable:!0},removeEventListener:{value:function(e,t,n){if(null==t)return!1;for(var r=(a(n)?Boolean(n.capture):Boolean(n))?u:c,o=null,i=this[s][e];null!=i;){if(i.listener===t&&i.kind===r)return null==o?this[s][e]=i.next:o.next=i.next,!0;o=i,i=i.next}return!1},configurable:!0,writable:!0},dispatchEvent:{value:function(e){var t=e.type,n=this[s][t];if(null==n)return!0;for(var r=p(e,this),o=null;null!=n&&(n.once?null==o?this[s][t]=n.next:o.next=n.next:o=n,r[v]=n.passive,"function"==typeof n.listener?n.listener.call(this,r):n.kind!==l&&"function"==typeof n.listener.handleEvent&&n.listener.handleEvent(r),!r[h]);)n=n.next;return!r.defaultPrevented},configurable:!0,writable:!0}})},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(){return function(e,t){if(Array.isArray(e))return e;if(Symbol.iterator in Object(e))return function(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{!r&&s.return&&s.return()}finally{if(o)throw i}}return n}(e,t);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),o=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.getInstance=g,t.init=function(e){d=e.Document,e.Element,e.Comment},t.registerComponents=function(e){Array.isArray(e)&&e.forEach(function(e){e&&("string"==typeof e?l[e]=!0:"object"===(void 0===e?"undefined":i(e))&&"string"==typeof e.type&&(l[e.type]=e))})},t.registerMethods=function(e){},t.registerModules=function(e){if("object"===(void 0===e?"undefined":i(e)))for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(f[t]=e[t])},t.createInstance=function(e,t,r,a,u){var l=y[e];{if(void 0!=l)throw new Error('Instance id "'+e+'" existed when create instance');var g=Date.now(),C="object"===("undefined"==typeof WXEnvironment?"undefined":i(WXEnvironment))&&WXEnvironment||{},k=n(6)(),x="function"==typeof x?x:k.Promise,S="function"==typeof S?S:k.Symbol,E="function"==typeof E?E:k.Set,O="function"==typeof O?O:k.Map,j="function"==typeof j?j:k.WeakMap,A="function"==typeof A?A:k.WeakSet,I=k.URL,T=k.URLSearchParams,P=k.FontFace,N=k.matchMedia,M=r.bundleUrl||"about:blank";r.bundleUrl?M.split("//")[0]||(M="https:"+M):console.error('Error: Must have bundleUrl option when createInstance, downgrade to "about:blank".');var $=new d(e,M),R=new I(M),D={};l=y[e]={document:$,instanceId:e,bundleUrl:M,bundleCode:t,modules:D,origin:R.origin,uid:0},function(e,t){if("object"===(void 0===f?"undefined":i(f))){var n=function(n){var r=p+n;e[r]={module:{exports:{}},isInitialized:!0},f[n].forEach(function(o){"string"==typeof o&&(o={name:o});var a=o.name;e[r].module.exports[a]=function(){for(var e=arguments,r=arguments.length,o=Array(r),s=0;s<r;s++)o[s]=e[s];var u={},c=o[o.length-1];return c&&"object"===(void 0===c?"undefined":i(c))&&c.__weex_options__&&(u=c.__weex_options__,o.pop()),t.taskCenter.send("module",{module:n,method:a},o,u)}})};for(var r in f)n(r)}}(D,$);var F=n(7)(D),L=n(8)(D),V=n(9)(L);n(11)(L,$);var W=n(12)(L,R),B=n(13)(L,x),U=B.fetch,J=B.Headers,z=B.Request,q=B.Response,H=n(14)(L),G=n(17)(L),X=n(18)(L,$),K=X.setTimeout,Z=X.clearTimeout,Q=X.setInterval,Y=X.clearInterval,ee=X.requestAnimationFrame,te=X.cancelAnimationFrame,ne=n(19)(),re=ne.atob,oe=ne.btoa,ie=n(20)(g),ae=n(21)(),se=ae.Event,ue=ae.CustomEvent,ce=new c.default,le={Promise:x,Symbol:S,Map:O,Set:E,WeakMap:j,WeakSet:A,name:"",closed:!1,atob:re,btoa:oe,performance:ie,document:$,location:W,navigator:{product:"Weex",platform:C.platform,appName:C.appName,appVersion:C.appVersion,userAgent:"Weex/"+C.weexVersion+" "+C.platform+"/"+C.osVersion+" ("+C.deviceModel+") "+C.appName+"/"+C.appVersion},screen:{width:C.deviceWidth,height:C.deviceHeight,availWidth:C.deviceWidth,availHeight:C.deviceHeight,colorDepth:24,pixelDepth:24},devicePixelRatio:C.scale,fetch:U,Headers:J,Response:q,Request:z,XMLHttpRequest:H,URL:I,URLSearchParams:T,FontFace:P,WebSocket:G,Event:se,CustomEvent:ue,matchMedia:N,setTimeout:K,clearTimeout:Z,setInterval:Q,clearInterval:Y,requestAnimationFrame:ee,cancelAnimationFrame:te,alert:function(e){var t=L(h);t.alert({message:e},function(){})},open:function(e){var t=L(v);t.push({url:e,animated:!0},_)},close:function(){var e=L(v);e.close({animated:!0},_,_)},postMessage:function(e,t){var n={origin:W.origin,data:JSON.parse(JSON.stringify(e)),type:"message",source:le};!function(e,t){var n;for(var r in y)y.hasOwnProperty(r)&&(n=y[r],"*"!==t&&t!==n.origin||(e.target=n.window,n.window.dispatchEvent(e)))}(n,t)},addEventListener:function(e,t){ce.on(e,t)},removeEventListener:function(e,t){ce.off(e,t)},dispatchEvent:function(e){ce.emit(e.type,e)},define:F,require:L,__weex_document__:$,__weex_module_supports__:b,__weex_tag_supports__:w,__weex_define__:F,__weex_require__:L,__weex_downgrade__:V,__weex_env__:C,__weex_code__:t,__weex_options__:r,__weex_data__:a,__weex_config__:u};l.window=le.self=le.window=le;var fe={},de={};try{fe=u.services.builtinGlobals,de=u.services.builtinModules}catch(e){}Object.assign(le,fe);var pe=o({},s.ModuleFactories,de);if(function(e,t,n){for(var r in t)e[r]={factory:t[r].bind(n),module:{exports:{}},isInitialized:!1}}(D,pe,le),"Web"!==C.platform){var he=ie.timing;he.domLoading=Date.now();var ve=m[t]?m[t]:new Function('with(this){(function(){"use strict";\n'+t+"\n}).call(this)}");ve.call(le),he.domInteractive=he.domComplete=he.domInteractive=Date.now(),m[t]=ve}else{var ye=new Function('"use strict";\n'+t);ye.call(le)}}},t.refreshInstance=function(e,t){var n=g(e).document;n.documentElement.fireEvent("refresh",{timestamp:Date.now(),data:t}),n.taskCenter.send("dom",{action:"refreshFinish"},[])},t.destroyInstance=function(e){var t=g(e),n=t.bundleCode;t.window.closed=!0;var r=t.document;r.documentElement.fireEvent("destory",{timestamp:Date.now()}),r.destroy&&r.destroy();r.taskCenter&&r.taskCenter.destroyCallback&&r.taskCenter.destroyCallback();delete y[e],delete m[n]},t.getRoot=function(e){var t=g(e).document;return t.toJSON?t.toJSON():{}},t.receiveTasks=function(e,t){var n=g(e);if(Array.isArray(t)){var o=n.document,i=[];return t.forEach(function(e){var t=void 0;if("fireEvent"===e.method){var n=r(e.args,5),a=n[0],s=n[1],u=n[2],c=n[3],l=n[4];t=function e(t,n,r,o,i,a){if(Array.isArray(n))return void n.some(function(n){return!1!==e(t,n,r,o)});var s=t.getRef(n);if(s){var u=t.fireEvent(s,r,o,i,a);return u}return new Error('Invalid element reference "'+n+'"')}(o,a,s,u,c,l)}else if("callback"===e.method){var f=r(e.args,3),d=f[0],p=f[1],h=f[2];t=o.taskCenter.callback(d,p,h)}i.push(t)}),i}};var a,s=n(4),u=n(1),c=(a=u,a&&a.__esModule?a:{default:a});var l={},f={},d=void 0,p="@weex-module/",h=p+"modal",v=p+"navigator",y={},m={},_=function(){};function g(e){var t=y[e];if(!t)throw new Error('Invalid instance id "'+e+'"');return t}function b(e){var t=e.split(".");if(1===t.length)return Boolean(f[e]);var n=t[0],r=t[1],o=f[n];if(o)for(var a=0;a<o.length;a++){var s=o[a];if("object"===(void 0===s?"undefined":i(s))&&s.name===r||s===r)return!0}return!1}function w(e){return Boolean(l[e])}t.default=t},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});t.ModuleFactories={rax:n(5)}},function(e,t){e.exports=function(e,t,n){var r=this.__weex_document__,o=this.document;n.exports=function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=17)}([function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={component:null,mountID:1,sandbox:!0,rootComponents:{},rootInstances:{},hook:null,driver:null,monitor:null},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=c(n(0)),o=n(6),i=c(n(9)),a=c(n(2)),s=c(n(3)),u=c(n(19));function c(e){return e&&e.__esModule?e:{default:e}}var l="$$instance";t.default={set:function(e,t){e[l]||(e[l]=t,t.rootID&&(r.default.rootInstances[t.rootID]=t,r.default.rootComponents[t.rootID]=t._internal))},get:function(e){return e[l]},remove:function(e){var t=this.get(e);t&&(e[l]=null,t.rootID&&(delete r.default.rootComponents[t.rootID],delete r.default.rootInstances[t.rootID]))},mount:function(e,t,n){r.default.driver.beforeRender&&r.default.driver.beforeRender(),null==t&&(t=r.default.driver.createBody());var c=void 0;if(n){var l=n._internal;c=l._processChildContext(l._context)}var f=this.get(t);if(f&&f.isRootComponent){var d=f.getRenderedComponent(),p=d._currentElement;if((0,s.default)(p,e)){var h=d._context;return d.updateComponent(p,e,h,c||h),f}r.default.hook.Reconciler.unmountComponent(f),(0,i.default)(t)}var v=(0,o.createElement)(u.default,null,e),y=(0,a.default)(v),m=c||{},_=y.mountComponent(t,null,m);return this.set(t,_),r.default.driver.afterRender&&r.default.driver.afterRender(_),r.default.hook.Mount._renderNewRootComponent(_._internal),_}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},i=n(0),a=(r=i,r&&r.__esModule?r:{default:r});t.default=function(e){var t=void 0;if(void 0===e||null===e||!1===e||!0===e)t=new a.default.EmptyComponent;else if(Array.isArray(e))t=new a.default.FragmentComponent(e);else if("object"===(void 0===e?"undefined":o(e))&&e.type)t="string"==typeof e.type?new a.default.NativeComponent(e):new a.default.CompositeComponent(e);else{if("string"!=typeof e&&"number"!=typeof e)throw new Error("Invalid element type: "+e+". (keys: "+Object.keys(e)+")");t=new a.default.TextComponent(e)}return t._mountIndex=0,t},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default=function(e,t){var n=null===e,o=null===t;if(n||o)return n===o;var i=void 0===e?"undefined":r(e),a=void 0===t?"undefined":r(t);return"string"===i||"number"===i?"string"===a||"number"===a:"object"===i&&"object"===a&&e.type===t.type&&e.key===t.key},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();var o=function(){function e(t,n,r){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.props=t,this.context=n,this.refs={},this.updater=r}return r(e,[{key:"isComponentClass",value:function(){}},{key:"setState",value:function(e,t){this.updater.setState(this,e,t)}},{key:"forceUpdate",value:function(e){this.updater.forceUpdate(this,e)}}]),e}();t.default=o,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=i(n(1)),o=i(n(0));function i(e){return e&&e.__esModule?e:{default:e}}t.default={ComponentTree:{getClosestInstanceFromNode:function(e){return r.default.get(e)},getNodeFromInstance:function(e){for(;e._renderedComponent;)e=e._renderedComponent;return e?e._nativeNode:null}},Mount:{_instancesByReactRootID:o.default.rootComponents,_renderNewRootComponent:function(){}},Reconciler:{mountComponent:function(){},receiveComponent:function(){},unmountComponent:function(){}},monitor:null},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.createElement=f,t.createFactory=function(e){var t=f.bind(null,e);return t.type=e,t},t.cloneElement=function(e,t){var n=arguments;if(!d(e))throw Error("cloneElement: not a valid element."+c());var r=Object.assign({},e.props),a=e.key,s=e.ref,f=e._owner;if(t){void 0!==t.ref&&(s=t.ref,f=o.default.component),void 0!==t.key&&(a=String(t.key));var p=void 0;e.type&&e.type.defaultProps&&(p=e.type.defaultProps);var h=void 0;for(h in t)t.hasOwnProperty(h)&&!u.hasOwnProperty(h)&&(void 0===t[h]&&void 0!==p?r[h]=p[h]:r[h]=t[h])}for(var v=arguments.length,y=Array(v>2?v-2:0),m=2;m<v;m++)y[m-2]=n[m];y.length&&(r.children=(0,i.default)(y));return new l(e.type,a,s,r,f)},t.isValidElement=d;var o=s(n(0)),i=s(n(7)),a=n(8);function s(e){return e&&e.__esModule?e:{default:e}}var u={key:!0,ref:!0};function c(){if(o.default.component){var e=o.default.component.getName();if(e)return" Check the render method of `"+e+"`."}return""}function l(e,t,n,r,o){return a.isWeex&&(r=function(e,t){if("text"===e){var n=t.children,r=t.value;null==r&&null!=n&&(Array.isArray(n)?n=n.map(function(e){return"number"==typeof e||"string"==typeof e?e:""}).join(""):"number"!=typeof n&&"string"!=typeof n&&(n=""),t.value=String(n)),t.children=null}return t}(e,r)),{type:e,key:t,ref:n,props:r,_owner:o}}t.default=l;function f(e,t,n){var a=arguments;if(null==e)throw Error("createElement: type should not be null or undefined."+c());var s={},f=void 0,d=null,p=null;if(null!=t){p=void 0===t.ref?null:t.ref,d=void 0===t.key?null:String(t.key);for(f in t)u[f]||(s[f]=t[f])}var h=arguments.length-2;if(h>0)if(1!==h||Array.isArray(n)){var v=n;if(h>1){v=new Array(h);for(var y=0;y<h;y++)v[y]=a[y+2]}s.children=(0,i.default)(v)}else s.children=n;if(e&&e.defaultProps){var m=e.defaultProps;for(f in m)void 0===s[f]&&(s[f]=m[f])}return s.style&&(Array.isArray(s.style)||"object"===r(s.style))&&(s.style=function e(t){if(t){if(Array.isArray(t)){for(var n={},r=0;r<t.length;++r){var o=e(t[r]);if(o)for(var i in o)n[i]=o[i]}return n}return t}}(s.style)),new l(e,d,p,s,o.default.component)}function d(e){return"object"===(void 0===e?"undefined":r(e))&&null!==e&&e.type&&e.props}},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){if(null==e)return e;var t=[];(function e(t,n){if(Array.isArray(t))for(var r=0,o=t.length;r<o;r++)e(t[r],n);else n.push(t)})(e,t),1===t.length&&(t=t[0]);return t};e.exports=t.default},function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"===r(Symbol.iterator)?function(e){return void 0===e?"undefined":r(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":r(e)};t.isWeb="object"===("undefined"==typeof navigator?"undefined":o(navigator))&&("Mozilla"===navigator.appCodeName||"Gecko"===navigator.product),t.isNode=void 0!==process&&!(!process.versions||!process.versions.node),t.isWeex="function"==typeof callNative,t.isReactNative="undefined"!=typeof __fbBatchedBridgeConfig;t.default=e.exports,t.default=e.exports},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=i.default.get(e);if(!t)return!1;return i.default.remove(e),t._internal.unmountComponent(),!0};var r,o=n(1),i=(r=o,r&&r.__esModule?r:{default:r});e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=i(n(22)),o=i(n(1));i(n(0));function i(e){return e&&e.__esModule?e:{default:e}}t.default=function(e,t,n,i){"function"==typeof n&&(i=n,n=null),n=n||{},(0,r.default)(n);var a=o.default.mount(e,t,n.parent).getPublicInstance();return i&&i.call(a),a},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=l(n(0)),i=l(n(12)),a=l(n(2)),s=l(n(3)),u=l(n(13)),c=l(n(1));function l(e){return e&&e.__esModule?e:{default:e}}var f=/on[A-Z]/,d=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._currentElement=t}return r(e,[{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n,this._mountID=o.default.mountID++;var a=this._currentElement.props,s={_internal:this,type:this._currentElement.type,props:a},u=a.append;this._instance=s,this._prevStyleCopy=Object.assign({},a.style);var c=this.getNativeNode();"tree"!==u&&(r?r(c,e):o.default.driver.appendChild(c,e)),this._currentElement&&this._currentElement.ref&&i.default.attach(this._currentElement._owner,this._currentElement.ref,this);var l=a.children;return null!=l&&this.mountChildren(l,n),"tree"===u&&(r?r(c,e):o.default.driver.appendChild(c,e)),o.default.hook.Reconciler.mountComponent(this),s}},{key:"mountChildren",value:function(e,t){var n=this;Array.isArray(e)||(e=[e]);var r=this._renderedChildren={};return e.map(function(e,o){var i=(0,a.default)(e),s=(0,u.default)(r,e,o);r[s]=i,i._mountIndex=o;return i.mountComponent(n.getNativeNode(),n._instance,t,null)})}},{key:"unmountChildren",value:function(e){var t=this._renderedChildren;if(t){for(var n in t){t[n].unmountComponent(e)}this._renderedChildren=null}}},{key:"unmountComponent",value:function(e){if(this._nativeNode){var t=this._currentElement.ref;t&&i.default.detach(this._currentElement._owner,t,this),c.default.remove(this._nativeNode),e||o.default.driver.removeChild(this._nativeNode,this._parent),o.default.driver.removeAllEventListeners(this._nativeNode)}this.unmountChildren(e),o.default.hook.Reconciler.unmountComponent(this),this._currentElement=null,this._nativeNode=null,this._parent=null,this._parentInstance=null,this._context=null,this._instance=null,this._prevStyleCopy=null}},{key:"updateComponent",value:function(e,t,n,r){this._currentElement=t,i.default.update(e,t,this);var a=e.props,s=t.props;this.updateProperties(a,s),this.updateChildren(s.children,r),o.default.hook.Reconciler.receiveComponent(this)}},{key:"updateProperties",value:function(e,t){var n=void 0,r=void 0,i=void 0;for(n in e)if("children"!==n&&!t.hasOwnProperty(n)&&e.hasOwnProperty(n)&&null!=e[n])if("style"===n){var a=this._prevStyleCopy;for(r in a)a.hasOwnProperty(r)&&((i=i||{})[r]="");this._prevStyleCopy=null}else f.test(n)?"function"==typeof e[n]&&o.default.driver.removeEventListener(this.getNativeNode(),n.slice(2).toLowerCase(),e[n]):o.default.driver.removeAttribute(this.getNativeNode(),n,e[n]);for(n in t){var s=t[n],u="style"===n?this._prevStyleCopy:null!=e?e[n]:void 0;if("children"!==n&&t.hasOwnProperty(n)&&s!==u&&(null!=s||null!=u))if("style"===n)if(s?s=this._prevStyleCopy=Object.assign({},s):this._prevStyleCopy=null,null!=u){for(r in u)!u.hasOwnProperty(r)||s&&s.hasOwnProperty(r)||((i=i||{})[r]="");for(r in s)s.hasOwnProperty(r)&&u[r]!==s[r]&&((i=i||{})[r]=s[r])}else i=s;else if(f.test(n)){var c=n.slice(2).toLowerCase();"function"==typeof u&&o.default.driver.removeEventListener(this.getNativeNode(),c,u,t),"function"==typeof s&&o.default.driver.addEventListener(this.getNativeNode(),c,s,t)}else{null!=s?o.default.driver.setAttribute(this.getNativeNode(),n,s):o.default.driver.removeAttribute(this.getNativeNode(),n,e[n])}}i&&o.default.driver.setStyles(this.getNativeNode(),i)}},{key:"updateChildren",value:function(e,t){var n=this,r=this._renderedChildren;if(null!=e||null!=r){var i={},c={};if(null!=e){Array.isArray(e)||(e=[e]);for(var l=0,f=e.length;l<f;l++){var d=e[l],p=(0,u.default)(i,d,l),h=r&&r[p],v=h&&h._currentElement;if(null!=h&&(0,s.default)(v,d))h.updateComponent(v,d,t,t),i[p]=h;else{if(h){var y=h.getNativeNode();h.unmountComponent(!0),c[p]=y}i[p]=(0,a.default)(d)}}}var m=void 0,_=void 0;if(null!=r)for(var g in r)if(r.hasOwnProperty(g)){var b=r[g],w=!i[g];m?w&&b.unmountComponent():(m=b,_=w)}null!=i&&function(){var e=0,a=0,s=null,u=[],l=function(l){if(!i.hasOwnProperty(l))return"continue";var f=i[l],d=r&&r[l];if(d===f){var p=d.getNativeNode();if(Array.isArray(p)||(p=[p]),d._mountIndex<e){Array.isArray(s)&&(s=s[s.length-1]);for(var h=p.length-1;h>=0;h--)o.default.driver.insertAfter(p[h],s)}u=u.concat(p),e=Math.max(d._mountIndex,e),d._mountIndex=a}else{null!=d&&(e=Math.max(d._mountIndex,e));var v=n.getNativeNode();Array.isArray(v)&&(v=n._parent),f.mountComponent(v,n._instance,t,function(e,t){var n=c[l];if(Array.isArray(e)||(e=[e]),n){Array.isArray(n)||(n=[n]);for(var r=void 0,i=0;i<e.length;i++){var a=e[i];n[i]?o.default.driver.replaceChild(a,n[i]):o.default.driver.insertAfter(a,r),r=a}if(e.length<n.length)for(var f=e.length;f<n.length;f++)o.default.driver.removeChild(n[f])}else{Array.isArray(s)&&(s=s[s.length-1]);var d=void 0;m&&!s&&(d=m.getNativeNode(),Array.isArray(d)&&(d=d[0]));for(var p=e.length-1;p>=0;p--){var h=e[p];s?o.default.driver.insertAfter(h,s):d?o.default.driver.insertBefore(h,d):o.default.driver.appendChild(h,t)}}u=u.concat(e)}),f._mountIndex=a}a++,s=f.getNativeNode()};for(var f in i){l(f)}if(Array.isArray(n._nativeNode)){n._nativeNode.splice(0,n._nativeNode.length);for(var d=0;d<u.length;d++)n._nativeNode.push(u[d])}}(),_&&m.unmountComponent(),this._renderedChildren=i}}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=o.default.driver.createElement(this._instance),c.default.set(this._nativeNode,this._instance)),this._nativeNode}},{key:"getPublicInstance",value:function(){return this.getNativeNode()}},{key:"getName",value:function(){return this._currentElement.type}}]),e}();t.default=d,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={update:function(e,t,n){var r=null!=e&&e.ref,o=null!=t&&t.ref;r!==o&&(null!=r&&this.detach(e._owner,r,n),null!=o&&this.attach(t._owner,o,n))},attach:function(e,t,n){if(!e)throw new Error("You might be adding a ref to a component that was not created inside a component's `render` method, or you have multiple copies of Rax loaded.");var r=n.getPublicInstance();"function"==typeof t?t(r):e._instance.refs[t]=r},detach:function(e,t,n){if("function"==typeof t)t(null);else{var r=n.getPublicInstance();e._instance.refs[t]===r&&delete e._instance.refs[t]}}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,n){var r=t&&t.key,o="string"==typeof r,i="."+n.toString(36);if(o){var a="$"+r,s=void 0===e[a];return s||console.warn('Encountered two children with the same key "'+r+'".'),s?a:i}return i},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.isRem=s,t.calcRem=u,t.getRem=function(){return a},t.setRem=function(e){a=e},t.isUnitNumber=c,t.convertUnit=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:a;{if(t&&c(e,t))return e*n+"px";if(s(e))return u(e,n)}return e};var r={animationIterationCount:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridRow:!0,gridColumn:!0,fontWeight:!0,lineClamp:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,lines:!0},o="rem",i=/[-+]?\d*\.?\d+rem/g,a=1;function s(e){return"string"==typeof e&&-1!==e.indexOf(o)}function u(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:a;return e.replace(i,function(e){return parseFloat(e)*t+"px"})}function c(e,t){return"number"==typeof e&&!r[t]}t.default=e.exports,t.default=e.exports},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.transformPropsAttrsToStyle=function(e,t){return e.style=e.style||{},t.forEach(function(t){e[t]&&!e.style[t]&&(e.style[t]=e[t],delete e[t])}),e},t.renamePropsAttr=function(e,t,n){e[t]&&!e[n]&&(e[n]=e[t],delete e[t]);return e};t.default=e.exports,t.default=e.exports},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=n(0),i=(r=o,r&&r.__esModule?r:{default:r});t.default=function(e){if(null==e)return null;if(e.ownerDocument||e.nodeType)return e;if(e._nativeNode)return e._nativeNode;if("string"==typeof e)return i.default.driver.getElementById(e);if("function"!=typeof e.render)throw new Error("findDOMNode: find by neither component nor DOM node.");var t=e._internal;if(t){for(;!t._nativeNode;)if(null==(t=t._renderedComponent))return null;return t._nativeNode}throw new Error("findDOMNode: find on an unmounted component.")},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.Children=t.version=t.setNativeProps=t.findComponentInstance=t.unmountComponentAtNode=t.findDOMNode=t.hydrate=t.render=t.PropTypes=t.PureComponent=t.Component=t.createFactory=t.isValidElement=t.cloneElement=t.createElement=void 0,n(18);var r=n(6),o=v(n(4)),i=v(n(20)),a=v(n(21)),s=v(n(10)),u=v(n(42)),c=v(n(16)),l=v(n(9)),f=v(n(43)),d=v(n(44)),p=v(n(45)),h=v(n(46));function v(e){return e&&e.__esModule?e:{default:e}}t.createElement=r.createElement,t.cloneElement=r.cloneElement,t.isValidElement=r.isValidElement,t.createFactory=r.createFactory,t.Component=o.default,t.PureComponent=i.default,t.PropTypes=a.default,t.render=s.default,t.hydrate=u.default,t.findDOMNode=c.default,t.unmountComponentAtNode=l.default,t.findComponentInstance=f.default,t.setNativeProps=d.default,t.version=p.default,t.Children=h.default},function(e,t,n){var r,o=n(5),i=(r=o,r&&r.__esModule?r:{default:r});"undefined"!=typeof __REACT_DEVTOOLS_GLOBAL_HOOK__&&"function"==typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.inject&&__REACT_DEVTOOLS_GLOBAL_HOOK__.inject(i.default)},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(4),a=(r=i,r&&r.__esModule?r:{default:r});function s(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}var u=1,c=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,a.default);function t(){var e,n,r,o=arguments;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t);for(var i=arguments.length,a=Array(i),c=0;c<i;c++)a[c]=o[c];return n=r=s(this,(e=t.__proto__||Object.getPrototypeOf(t)).call.apply(e,[this].concat(a))),r.rootID=u++,s(r,n)}return o(t,[{key:"isRootComponent",value:function(){}},{key:"render",value:function(){return this.props.children}},{key:"getPublicInstance",value:function(){return this.getRenderedComponent().getPublicInstance()}},{key:"getRenderedComponent",value:function(){return this._internal._renderedComponent}}]),t}();t.default=c,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(4),a=(r=i,r&&r.__esModule?r:{default:r});var s=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,a.default);function t(e,n){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n))}return o(t,[{key:"isPureComponentClass",value:function(){}}]),t}();t.default=s,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(e){function t(e,t,n,o,i,a){return r}var n=t.bind(null,!1);return n.isRequired=t.bind(null,!0),n}();t.default={array:r,bool:r,func:r,number:r,object:r,string:r,symbol:r,element:r,node:r,any:r,arrayOf:r,instanceOf:r,objectOf:r,oneOf:r,oneOfType:r,shape:r},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e){var t=e.driver,n=e.hook,p=e.measurer,h=e.deviceWidth,v=e.viewportWidth,y=e.eventRegistry;if(o.default.EmptyComponent=i.default,o.default.NativeComponent=a.default,o.default.TextComponent=s.default,o.default.FragmentComponent=c.default,o.default.CompositeComponent=u.default,o.default.hook=n||d.default,o.default.measurer=p,!o.default.driver){if(!t)if(r.isWeex)t=l.default;else{if(!r.isWeb)throw Error("No builtin driver matched");t=f.default}o.default.driver=t}h&&o.default.driver.setDeviceWidth&&o.default.driver.setDeviceWidth(h);v&&o.default.driver.setViewportWidth&&o.default.driver.setViewportWidth(v);y&&(o.default.driver.eventRegistry=y)};var r=n(8),o=p(n(0)),i=p(n(23)),a=p(n(11)),s=p(n(24)),u=p(n(25)),c=p(n(29)),l=p(n(30)),f=p(n(40)),d=p(n(5));function p(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),a=(r=i,r&&r.__esModule?r:{default:r});var s=function(){function e(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._currentElement=null}return o(e,[{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n;var o={_internal:this},i=this.getNativeNode();return r?r(i,e):a.default.driver.appendChild(i,e),o}},{key:"unmountComponent",value:function(e){this._nativeNode&&!e&&a.default.driver.removeChild(this._nativeNode,this._parent),this._nativeNode=null,this._parent=null,this._parentInstance=null,this._context=null}},{key:"updateComponent",value:function(){}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=a.default.driver.createEmpty()),this._nativeNode}}]),e}();t.default=s,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),a=(r=i,r&&r.__esModule?r:{default:r});var s=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._currentElement=t,this._stringText=String(t)}return o(e,[{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n,this._mountID=a.default.mountID++;var o=this.getNativeNode();r?r(o,e):a.default.driver.appendChild(o,e);var i={_internal:this};return a.default.hook.Reconciler.mountComponent(this),i}},{key:"unmountComponent",value:function(e){this._nativeNode&&!e&&a.default.driver.removeChild(this._nativeNode,this._parent),a.default.hook.Reconciler.unmountComponent(this),this._currentElement=null,this._nativeNode=null,this._parent=null,this._parentInstance=null,this._context=null,this._stringText=null}},{key:"updateComponent",value:function(e,t,n){e!==t&&(this._currentElement=t,this._stringText=String(t),a.default.driver.updateText(this.getNativeNode(),this._stringText),a.default.hook.Reconciler.receiveComponent(this))}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=a.default.driver.createText(this._stringText)),this._nativeNode}}]),e}();t.default=s,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=f(n(26)),i=f(n(27)),a=f(n(0)),s=f(n(12)),u=f(n(2)),c=f(n(3)),l=f(n(28));function f(e){return e&&e.__esModule?e:{default:e}}function d(e,t,n){try{return e()}catch(e){n?n(e):p(t,e)}}function p(e,t){for(var n=void 0;e;){if("function"==typeof e.componentDidCatch){n=e;break}if(!e._internal||!e._internal._parentInstance)break;e=e._internal._parentInstance}if(n)n.componentDidCatch(t);else{if(!a.default.sandbox)throw t;setTimeout(function(){throw t},0)}}var h=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this._currentElement=t}return r(e,[{key:"getName",value:function(){var e=this._currentElement.type,t=this._instance&&this._instance.constructor;return e.displayName||t&&t.displayName||e.name||t&&t.name||null}},{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n,this._mountID=a.default.mountID++,this._updateCount=0;var c=this._currentElement.type,l=this._currentElement.props,f=c.prototype,h=f&&c.prototype.isComponentClass,v=f&&c.prototype.render,y=this._processContext(n),m=void 0,_=void 0;if(h||v)m=new c(l,y,i.default);else{if("function"!=typeof c)throw new Error("Invalid component type: "+c+". (keys: "+Object.keys(c)+")");m=new o.default(c)}m.props=l,m.context=y,m.refs={},m.updater=i.default,m._internal=this,this._instance=m;var g=m.state;void 0===g&&(m.state=g=null);var b=null,w=function(e){b=e};return m.componentWillMount&&d(function(){m.componentWillMount()},m,w),null==_&&(a.default.component=this,m.state=this._processPendingState(l,y),d(function(){_=m.render()},m,w),a.default.component=null),this._renderedComponent=(0,u.default)(_),this._renderedComponent.mountComponent(this._parent,m,this._processChildContext(n),r),b&&p(m,b),this._currentElement&&this._currentElement.ref&&s.default.attach(this._currentElement._owner,this._currentElement.ref,this),m.componentDidMount&&d(function(){m.componentDidMount()},m),a.default.hook.Reconciler.mountComponent(this),m}},{key:"unmountComponent",value:function(e){var t=this._instance;if(t.componentWillUnmount&&d(function(){t.componentWillUnmount()},t),a.default.hook.Reconciler.unmountComponent(this),t._internal=null,null!=this._renderedComponent){var n=this._currentElement.ref;n&&s.default.detach(this._currentElement._owner,n,this),this._renderedComponent.unmountComponent(e),this._renderedComponent=null,this._instance=null}this._currentElement=null,this._parentInstance=null,this._pendingStateQueue=null,this._pendingForceUpdate=!1,this._context=null}},{key:"_processContext",value:function(e){var t=this._currentElement.type.contextTypes;if(!t)return{};var n={};for(var r in t)n[r]=e[r];return n}},{key:"_processChildContext",value:function(e){var t=this._instance,n=t.getChildContext&&t.getChildContext();return n?Object.assign({},e,n):e}},{key:"_processPendingState",value:function(e,t){var n=this._instance,r=this._pendingStateQueue;if(!r)return n.state;this._pendingStateQueue=null;for(var o=Object.assign({},n.state),i=0;i<r.length;i++){var a=r[i];Object.assign(o,"function"==typeof a?a.call(n,o,e,t):a)}return o}},{key:"updateComponent",value:function(e,t,n,r){var o=this._instance;o||console.error("Update component '"+this.getName()+"' that has already been unmounted (or failed to mount).");var u=!1,c=void 0,f=void 0;this._context===r?c=o.context:(c=this._processContext(r),u=!0),e===t?f=t.props:(f=t.props,u=!0);var p=u&&o.componentWillReceiveProps;p&&(this._pendingState=!0,d(function(){o.componentWillReceiveProps(f,c)},o),this._pendingState=!1),s.default.update(e,t,this);var h=!0,v=o.props,y=o.state,m=this._processPendingState(f,c);if(this._pendingForceUpdate||(o.shouldComponentUpdate?h=d(function(){return o.shouldComponentUpdate(f,m,c)},o):o.isPureComponentClass&&(h=!(0,l.default)(v,f)||!(0,l.default)(y,m))),h){this._pendingForceUpdate=!1;var _=o.context;d(function(){o.componentWillUpdate&&o.componentWillUpdate(f,m,c)},o),this._currentElement=t,this._context=r,o.props=f,o.state=m,o.context=c,this._updateRenderedComponent(r),d(function(){o.componentDidUpdate&&o.componentDidUpdate(v,y,_)},o),this._updateCount++}else this._currentElement=t,this._context=r,o.props=f,o.state=m,o.context=c;if(p){var g=this._pendingCallbacks;this._pendingCallbacks=null,i.default.runCallbacks(g,o)}a.default.hook.Reconciler.receiveComponent(this)}},{key:"_updateRenderedComponent",value:function(e){var t=this._renderedComponent,n=t._currentElement,r=this._instance,o=void 0;if(a.default.component=this,d(function(){o=r.render()},r),a.default.component=null,(0,c.default)(n,o))t.updateComponent(n,o,t._context,this._processChildContext(e));else{var i=t.getNativeNode();t.unmountComponent(!0),this._renderedComponent=(0,u.default)(o),this._renderedComponent.mountComponent(this._parent,r,this._processChildContext(e),function(e,t){Array.isArray(e)||(e=[e]),Array.isArray(i)||(i=[i]);for(var n=void 0,r=0;r<e.length;r++){var o=e[r];i[r]?a.default.driver.replaceChild(o,i[r]):a.default.driver.insertAfter(o,n),n=o}if(e.length<i.length)for(var s=e.length;s<i.length;s++)a.default.driver.removeChild(i[s])})}}},{key:"getNativeNode",value:function(){var e=this._renderedComponent;if(e)return e.getNativeNode()}},{key:"getPublicInstance",value:function(){var e=this._instance;return e instanceof o.default?null:e}}]),e}();t.default=h,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0);r=i,r&&r.__esModule;var a=function(){function e(t){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.pureRender=t}return o(e,[{key:"render",value:function(){return this.pureRender(this.props,this.context)}}]),e}();t.default=a,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});function r(e,t){if(t){(e._pendingCallbacks||(e._pendingCallbacks=[])).push(t)}}var o={setState:function(e,t,n){var o=e._internal;if(o){i=o,(a=t)&&(i._pendingStateQueue||(i._pendingStateQueue=[])).push(a);var i,a;r(o,n),!o._pendingState&&o._renderedComponent&&this.runUpdate(e)}},forceUpdate:function(e,t){var n=e._internal;n&&(n._pendingForceUpdate=!0,r(n,t),n._renderedComponent&&this.runUpdate(e))},runUpdate:function(e){var t=e._internal,n=t._pendingCallbacks;t._pendingCallbacks=null;var r=t._currentElement,o=t._context;(t._pendingStateQueue||t._pendingForceUpdate)&&t.updateComponent(r,r,o,o),this.runCallbacks(n,e)},runCallbacks:function(e,t){if(e)for(var n=0;n<e.length;n++)e[n].call(t)}};t.default=o,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=Object.prototype.hasOwnProperty;function i(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t}t.default=function(e,t){if(i(e,t))return!0;if("object"!==(void 0===e?"undefined":r(e))||null===e||"object"!==(void 0===t?"undefined":r(t))||null===t)return!1;var n=Object.keys(e),a=Object.keys(t);if(n.length!==a.length)return!1;for(var s=0;s<n.length;s++)if(!o.call(t,n[s])||!i(e[n[s]],t[n[s]]))return!1;return!0},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),o=c(n(0)),i=c(n(11)),a=c(n(1)),s=c(n(2)),u=c(n(13));function c(e){return e&&e.__esModule?e:{default:e}}var l=function(e){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(t,i.default);function t(e){return function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t),function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e))}return r(t,[{key:"mountComponent",value:function(e,t,n,r){this._parent=e,this._parentInstance=t,this._context=n,this._mountID=o.default.mountID++;var i={_internal:this};this._instance=i;var a=this.getNativeNode(),s=this._currentElement;if(this.mountChildren(s,n),r)r(a,e);else for(var u=Array.isArray(e),c=0;c<a.length;c++){var l=a[c];u?e.push(l):o.default.driver.appendChild(l,e)}return i}},{key:"mountChildren",value:function(e,t){var n=this,r=this._renderedChildren={},o=this.getNativeNode();return e.map(function(e,i){var a=(0,s.default)(e),c=(0,u.default)(r,e,i);r[c]=a,a._mountIndex=i;return a.mountComponent(n._parent,n._instance,t,function(e){if(Array.isArray(e))for(var t=0;t<e.length;t++)o.push(e[t]);else o.push(e)})})}},{key:"unmountComponent",value:function(e){if(this._nativeNode&&(a.default.remove(this._nativeNode),!e))for(var t=0;t<this._nativeNode.length;t++)o.default.driver.removeChild(this._nativeNode[t]);this.unmountChildren(!0),this._currentElement=null,this._nativeNode=null,this._parent=null,this._parentInstance=null,this._context=null,this._instance=null}},{key:"updateComponent",value:function(e,t,n,r){this._currentElement=t,this.updateChildren(this._currentElement,r)}},{key:"getNativeNode",value:function(){return null==this._nativeNode&&(this._nativeNode=[]),this._nativeNode}},{key:"getPublicInstance",value:function(){return this.getNativeNode()}},{key:"getName",value:function(){return"fragment"}}]),t}();t.default=l,e.exports=t.default},function(e,t,n){var o="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var i,a="function"==typeof Symbol&&"symbol"===o(Symbol.iterator)?function(e){return void 0===e?"undefined":o(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":o(e)},s=n(14),u=n(31),c=(i=u,i&&i.__esModule?i:{default:i});var l=/^on[A-Z]/,f=/^aria-/,d={},p="object"===(void 0===r?"undefined":a(r))?r:"object"===(void 0===p?"undefined":a(p))?p:null,h={deviceWidth:750,viewportWidth:750,getDeviceWidth:function(){return this.deviceWidth},setDeviceWidth:function(e){this.deviceWidth=e},getViewportWidth:function(){return this.viewportWidth},setViewportWidth:function(e){this.viewportWidth=e},getElementById:function(e){return d[e]},createBody:function(){if(p.body)return p.body;var e=p.documentElement,t=p.createBody();return e.appendChild(t),t},createComment:function(e){return p.createComment(e)},createEmpty:function(){return this.createComment(" empty ")},createText:function(e){return h.createElement({type:"text",props:{value:e}})},updateText:function(e,t){this.setAttribute(e,"value",t)},createElement:function(e){var t=c.default[e.type];t&&(e=t.parse(e));var n=e.props,r={},o=n.style;for(var i in o)r[i]=(0,s.convertUnit)(o[i],i);var a=p.createElement(e.type,{style:r});return this.setNativeProps(a,n,!0),a},appendChild:function(e,t){return t.appendChild(e)},removeChild:function(e,t){t=t||e.parentNode;var n=e.attr&&e.attr.id;return null!=n&&(d[n]=null),t.removeChild(e)},replaceChild:function(e,t,n){n=n||t.parentNode;var r=t.previousSibling,o=t.nextSibling;this.removeChild(t,n),r?this.insertAfter(e,r,n):o?this.insertBefore(e,o,n):this.appendChild(e,n)},insertAfter:function(e,t,n){return(n=n||t.parentNode).insertAfter(e,t)},insertBefore:function(e,t,n){return(n=n||t.parentNode).insertBefore(e,t)},addEventListener:function(e,t,n,r){var o=r[t+"EventParams"];return e.addEvent(t,n,o)},removeEventListener:function(e,t,n){return e.removeEvent(t,n)},removeAllEventListeners:function(e){},removeAttribute:function(e,t,n){return"id"==t&&(d[n]=null),e.setAttr(t,void 0,!1)},setAttribute:function(e,t,n){return"id"==t&&(d[n]=e),f.test(t)&&(t=t.replace(/\-(\w)/,function(e,t){return t.toUpperCase()})),e.setAttr(t,n,!1)},setStyles:function(e,t){for(var n in t){var r=t[n];r=(0,s.convertUnit)(r,n),e.setStyle(n,r)}},beforeRender:function(){p.open(),(0,s.setRem)(this.getDeviceWidth()/this.getViewportWidth())},afterRender:function(){p.listener&&p.listener.createFinish&&p.listener.createFinish(),p.close()},setNativeProps:function(e,t,n){for(var r in t){var o=t[r];if("children"!==r&&null!=o)if("style"===r){if(n)continue;this.setStyles(e,o)}else if(l.test(r)){var i=r.slice(2).toLowerCase();this.addEventListener(e,i,o,t)}else this.setAttribute(e,r,o)}}};t.default=h,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=f(n(32)),o=f(n(33)),i=f(n(34)),a=f(n(35)),s=f(n(36)),u=f(n(37)),c=f(n(38)),l=f(n(39));function f(e){return e&&e.__esModule?e:{default:e}}t.default={span:a.default,p:s.default,img:r.default,button:u.default,video:o.default,textarea:i.default,h1:c.default,h2:c.default,h3:c.default,h4:c.default,h5:c.default,h6:c.default,nav:l.default,article:l.default,section:l.default,footer:l.default,aside:l.default,main:l.default},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(15);t.default={parse:function(e){var t=e.props;return e.type="image",e.props=(0,r.transformPropsAttrsToStyle)(t,["width","height"]),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=n(15);t.default={parse:function(e){var t=e.props;return e.props=(0,r.transformPropsAttrsToStyle)(t,["width","height"]),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){var t=e.props;return"string"!=typeof t.children||t.value||(t.value=t.children,t.children=null),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){var t=e.props;return e.type="text","string"!=typeof t.children||t.value||(t.value=t.children,t.children=null),e}},e.exports=t.default},function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};Object.defineProperty(t,"__esModule",{value:!0});var o="function"==typeof Symbol&&"symbol"===r(Symbol.iterator)?function(e){return void 0===e?"undefined":r(e)}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":void 0===e?"undefined":r(e)},i=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e},a={fontSize:28,marginTop:28,marginBottom:28},s={u:{textDecoration:"underline"},s:{textDecoration:"line-through"},i:{fontStyle:"italic"},b:{fontWeight:"bold"},del:{textDecoration:"line-through"},em:{fontStyle:"italic"},strong:{fontWeight:"bold"},big:{fontSize:33.6},small:{fontSize:28*.8}};function u(e){var t=e.type,n=e.props,r=n.style,o=n.children;"img"===t&&(t="image"),s[t]&&(r=i({},s[t],r),t="span"),n.style=null,n.children=null;var a={type:t,style:r,attr:n||{}};return o&&("span"===t&&"string"==typeof o?a.attr.value=o:a.children=c(o)),a}function c(e){var t=[];Array.isArray(e)||(e=[e]);for(var n=0;n<e.length;n++){var r=e[n];"string"==typeof r?t.push({type:"span",attr:{value:r}}):"object"===(void 0===r?"undefined":o(r))&&t.push(u(r))}return t}t.default={parse:function(e){var t=e.props,n=t.children;return e.type="richtext",t.style=i({},a,t.style),t.value=c(n),t.children=null,e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};t.default={parse:function(e){var t=e.props;e.type="text";var n=t.style,o=t.disabled,i=t.children,a=r({textAlign:"center",fontSize:22,paddingTop:4,paddingRight:12,paddingBottom:6,paddingLeft:12,borderWidth:4,borderStyle:"solid",borderColor:"#000000",backgroudColor:"#c0c0c0"},n);return o&&(t.onClick=null,a=r({},a,{color:"#7f7f7f",borderColor:"#7f7f7f"})),"string"==typeof i&&(t.value=i,t.children=null),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r=Object.assign||function(e){for(var t=arguments,n=1;n<arguments.length;n++){var r=t[n];for(var o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o])}return e};function o(e,t,n){return{fontSize:e*t,marginTop:e*t*n,marginBottom:e*t*n,fontWeight:"bold"}}var i={h1:o(28,2,.67),h2:o(28,1.5,.83),h3:o(28,1.17,1),h4:o(28,1,1.33),h5:o(28,.83,1.67),h6:o(28,.67,2.33)};t.default={parse:function(e){var t=e.type,n=e.props;return e.type="text",n.style=r({},i[t]||i.h6,n.style),"string"!=typeof n.children||n.value||(n.value=n.children,n.children=null),e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default={parse:function(e){return e.type="div",e}},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,i=n(14),a=n(41),s=(r=a,r&&r.__esModule?r:{default:r});var u="dangerouslySetInnerHTML",c=/on[A-Z]/,l={deviceWidth:"undefined"!=typeof DEVICE_WIDTH&&DEVICE_WIDTH||null,viewportWidth:"undefined"!=typeof VIEWPORT_WIDTH&&VIEWPORT_WIDTH||750,eventRegistry:{},getDeviceWidth:function(){return this.deviceWidth||o.documentElement.clientWidth},setDeviceWidth:function(e){this.deviceWidth=e},getViewportWidth:function(){return this.viewportWidth},setViewportWidth:function(e){this.viewportWidth=e},getElementById:function(e){return o.getElementById(e)},createBody:function(){return o.body},createComment:function(e){return o.createComment(e)},createEmpty:function(){return this.createComment(" empty ")},createText:function(e){return o.createTextNode(e)},updateText:function(e,t){e["textContent"in o?"textContent":"nodeValue"]=t},createElement:function(e){var t=o.createElement(e.type),n=e.props;return this.setNativeProps(t,n),t},appendChild:function(e,t){return t.appendChild(e)},removeChild:function(e,t){(t=t||e.parentNode)&&t.removeChild(e)},replaceChild:function(e,t,n){(n=n||t.parentNode).replaceChild(e,t)},insertAfter:function(e,t,n){n=n||t.parentNode;var r=t.nextSibling;r?n.insertBefore(e,r):n.appendChild(e)},insertBefore:function(e,t,n){(n=n||t.parentNode).insertBefore(e,t)},addEventListener:function(e,t,n,r){return this.eventRegistry[t]?this.eventRegistry[t]("addEvent",e,t,n,r):e.addEventListener(t,n)},removeEventListener:function(e,t,n,r){return this.eventRegistry[t]?this.eventRegistry[t]("removeEvent",e,t,n,r):e.removeEventListener(t,n)},removeAllEventListeners:function(e){},removeAttribute:function(e,t){if(t===u)return e.innerHTML=null;if("className"===t&&(t="class"),t in e)try{e[t]=null}catch(e){}e.removeAttribute(t)},setAttribute:function(e,t,n){if(t===u)return e.innerHTML=n.__html;if("className"===t&&(t="class"),t in e)try{e[t]=n}catch(r){e.setAttribute(t,n)}else e.setAttribute(t,n)},setStyles:function(e,t){var n={};for(var r in t){var o=t[r];s.default.isFlexProp(r)?s.default[r](o,n):n[r]=(0,i.convertUnit)(o,r)}for(var a in n){var u=n[a];if(Array.isArray(u))for(var c=0;c<u.length;c++)e.style[a]=u[c];else e.style[a]=u}},beforeRender:function(){(0,i.setRem)(this.getDeviceWidth()/this.getViewportWidth())},setNativeProps:function(e,t){for(var n in t){var r=t[n];if("children"!==n&&null!=r)if("style"===n)this.setStyles(e,r);else if(c.test(n)){var o=n.slice(2).toLowerCase();this.addEventListener(e,o,r)}else this.setAttribute(e,n,r)}}};t.default=l,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r={stretch:"stretch","flex-start":"start","flex-end":"end",center:"center"},o={row:"horizontal",column:"vertical"},i={"flex-start":"start","flex-end":"end",center:"center","space-between":"justify","space-around":"justify"},a={display:!0,flex:!0,alignItems:!0,alignSelf:!0,flexDirection:!0,justifyContent:!0,flexWrap:!0},s={isFlexProp:function(e){return a[e]},display:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.display="flex"===e?["-webkit-box","-webkit-flex","flex"]:e,t},flex:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxFlex=e,t.webkitFlex=e,t.flex=e,t},flexWrap:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.flexWrap=e,t},alignItems:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxAlign=r[e],t.webkitAlignItems=e,t.alignItems=e,t},alignSelf:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitAlignSelf=e,t.alignSelf=e,t},flexDirection:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxOrient=o[e],t.webkitFlexDirection=e,t.flexDirection=e,t},justifyContent:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return t.webkitBoxPack=i[e],t.webkitJustifyContent=e,t.justifyContent=e,t}};t.default=s,e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=n(10),i=(r=o,r&&r.__esModule?r:{default:r});t.default=function(e,t,n,r){if(t.childNodes)for(var o=[].concat(function(e){if(Array.isArray(e)){for(var t=0,n=Array(e.length);t<e.length;t++)n[t]=e[t];return n}return Array.from(e)}(t.childNodes)),a=0;a<o.length;a++){var s=o[a];t.removeChild(s)}return(0,i.default)(e,t,n,r)},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=n(1),i=(r=o,r&&r.__esModule?r:{default:r});t.default=function(e){return null==e?null:i.default.get(e)},e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t){e=(0,o.default)(e),r.default.driver.setNativeProps(e,t)};var r=i(n(0)),o=i(n(16));function i(e){return e&&e.__esModule?e:{default:e}}e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0}),t.default="0.4.20",e.exports=t.default},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r,o=n(7),i=(r=o,r&&r.__esModule?r:{default:r});function a(e){return e=(0,i.default)(e,[]),Array.isArray(e)?e:[].concat(e)}var s={map:function(e,t,n){return null==e?null:(e=a(e)).map(function(e,r){return t.call(n,e,r)})},forEach:function(e,t,n){if(null==e)return null;(e=a(e)).forEach(function(e,r){return t.call(n,e,r)})},count:function(e){return null==e?0:a(e).length},only:function(e){if(1!==(e=s.toArray(e)).length)throw new Error("Children.only: expected to receive a single element child.");return e[0]},toArray:function(e){return null==e?[]:a(e).filter(function(e){return null!==e})}};t.default=s,e.exports=t.default}])}},function(e,n){e.exports=function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:r})},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=2)}([function(e,t,n){var r,o,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},a=Object.defineProperties,s=Object.defineProperty,u=Object.create(null);function c(e){if(!(t=e)||!("symbol"===(void 0===t?"undefined":i(t))||t.constructor&&"Symbol"===t.constructor.name&&"Symbol"===t[t.constructor.toStringTag]))throw new TypeError(e+" is not a symbol");var t;return e}var l=function(){var e=Object.create(null);return function(t){for(var n=0;e[t+(n||"")];)++n;return e[t+=n||""]=!0,"@@"+t}}();o=function(e){if(this instanceof o)throw new TypeError("Symbol is not a constructor");return r(e)},e.exports=r=function e(t){var n;if(this instanceof e)throw new TypeError("Symbol is not a constructor");return n=Object.create(o.prototype),t=void 0===t?"":String(t),a(n,{__description__:{value:t},__name__:{value:l(t)}})},a(r,{for:{value:function(e){return u[e]?u[e]:u[e]=r(String(e))}},keyFor:{value:function(e){var t;c(e);for(t in u)if(u[t]===e)return t}},hasInstance:{value:r("hasInstance")},isConcatSpreadable:{value:r("isConcatSpreadable")},iterator:{value:r("iterator")},match:{value:r("match")},replace:{value:r("replace")},search:{value:r("search")},species:{value:r("species")},split:{value:r("split")},toPrimitive:{value:r("toPrimitive")},toStringTag:{value:r("toStringTag")},unscopables:{value:r("unscopables")}}),a(o.prototype,{constructor:{value:r},toString:{value:function(){return this.__name__}}}),a(r.prototype,{toString:{value:function(){return"Symbol ("+c(this).__description__+")"}},valueOf:{value:function(){return c(this)}}}),s(r.prototype,r.toPrimitive,{value:function(){var e=c(this);return"symbol"===(void 0===e?"undefined":i(e))?e:e.toString()}}),s(r.prototype,r.toStringTag,{value:"Symbol"}),s(o.prototype,r.toStringTag,{value:r.prototype[r.toStringTag]}),s(o.prototype,r.toPrimitive,{value:r.prototype[r.toPrimitive]})},function(e,t,n){var r,o=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),i=n(0),a=(r=i,r&&r.__esModule?r:{default:r});var s=/[!'\(\)~]|%20|%00/g,u=/\+/g,c={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+","%00":"\0"},l=function(e){return c[e]},f="__URLSearchParams__";function d(e){return encodeURIComponent(e).replace(s,l)}function p(e){return decodeURIComponent(e.replace(u," "))}var h=function(){function e(t){if(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this[f]=Object.create(null),t){"?"===t.charAt(0)&&(t=t.slice(1));for(var n,r,o=(t||"").split("&"),i=0,a=o.length;i<a;i++)-1<(n=(r=o[i]).indexOf("="))?this.append(p(r.slice(0,n)),p(r.slice(n+1))):r.length&&this.append(p(r),"")}}return o(e,[{key:"append",value:function(e,t){var n=this[f];e in n?n[e].push(""+t):n[e]=[""+t]}},{key:"delete",value:function(e){delete this[f][e]}},{key:"get",value:function(e){var t=this[f];return e in t?t[e][0]:null}},{key:"getAll",value:function(e){var t=this[f];return e in t?t[e].slice(0):[]}},{key:"has",value:function(e){return e in this[f]}},{key:"set",value:function(e,t){this[f][e]=[""+t]}},{key:"forEach",value:function(e,t){var n=this[f];Object.getOwnPropertyNames(n).forEach(function(r){n[r].forEach(function(n){e.call(t,n,r,this)},this)},this)}},{key:"keys",value:function(){var e=[];this.forEach(function(t,n){e.push(n)});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[a.default.iterator]=function(){return t},t}},{key:"values",value:function(){var e=[];this.forEach(function(t){e.push(t)});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[a.default.iterator]=function(){return t},t}},{key:"entries",value:function(){var e=[];this.forEach(function(t,n){e.push([n,t])});var t={next:function(){var t=e.shift();return{done:void 0===t,value:t}}};return t[a.default.iterator]=function(){return t},t}},{key:"toString",value:function(){var e,t,n,r,o=this[f],i=[];for(t in o)for(n=d(t),e=0,r=o[t];e<r.length;e++)i.push(n+"="+d(r[e]));return i.join("&")}}]),e}();h.prototype[a.default.iterator]=h.prototype.entries,e.exports=h},function(e,t,n){e.exports={get Promise(){return n(3)},get Symbol(){return n(0)},get Map(){return n(4)},get Set(){return n(5)},get WeakMap(){return n(6)},get WeakSet(){return n(7)},get FontFace(){return n(8)},get URL(){return n(9)},get URLSearchParams(){return n(1)},get matchMedia(){return n(10)}}},function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};function o(){}var i="function"==typeof setImmediate&&setImmediate||function(e){"function"==typeof setTimeout?setTimeout(e,0):e()},a=function(e){"undefined"!=typeof console&&console&&console.log("Possible Unhandled Promise Rejection:",e)};function s(e){if("object"!==r(this))throw new TypeError("Promises must be constructed via new");if("function"!=typeof e)throw new TypeError("Promise resolver is not a function");this._state=0,this._handled=!1,this._value=void 0,this._deferreds=[],d(e,this)}function u(e,t){for(;3===e._state;)e=e._value;0!==e._state?(e._handled=!0,i(function(){var n=1===e._state?t.onFulfilled:t.onRejected;if(null!==n){var r;try{r=n(e._value)}catch(e){return void l(t.promise,e)}c(t.promise,r)}else(1===e._state?c:l)(t.promise,e._value)})):e._deferreds.push(t)}function c(e,t){try{if(t===e)throw new TypeError("A promise cannot be resolved with itself.");if(t&&("object"===(void 0===t?"undefined":r(t))||"function"==typeof t)){var n=t.then;if(t instanceof s)return e._state=3,e._value=t,void f(e);if("function"==typeof n)return void d((o=n,i=t,function(){o.apply(i,arguments)}),e)}e._state=1,e._value=t,f(e)}catch(t){l(e,t)}var o,i}function l(e,t){e._state=2,e._value=t,f(e)}function f(e){2===e._state&&0===e._deferreds.length&&i(function(){e._handled||a(e._value)});for(var t=0,n=e._deferreds.length;t<n;t++)u(e,e._deferreds[t]);e._deferreds=null}function d(e,t){var n=!1;try{e(function(e){n||(n=!0,c(t,e))},function(e){n||(n=!0,l(t,e))})}catch(e){if(n)return;n=!0,l(t,e)}}s.prototype.catch=function(e){return this.then(null,e)},s.prototype.then=function(e,t){var n=new this.constructor(o);return u(this,new function(e,t,n){this.onFulfilled="function"==typeof e?e:null,this.onRejected="function"==typeof t?t:null,this.promise=n}(e,t,n)),n},s.all=function(e){var t=Array.prototype.slice.call(e);return new s(function(e,n){if(0===t.length)return e([]);var o=t.length;function i(a,s){try{if(s&&("object"===(void 0===s?"undefined":r(s))||"function"==typeof s)){var u=s.then;if("function"==typeof u)return void u.call(s,function(e){i(a,e)},n)}t[a]=s,0==--o&&e(t)}catch(e){n(e)}}for(var a=0;a<t.length;a++)i(a,t[a])})},s.resolve=function(e){return e&&"object"===(void 0===e?"undefined":r(e))&&e.constructor===s?e:new s(function(t){t(e)})},s.reject=function(e){return new s(function(t,n){n(e)})},s.race=function(e){return new s(function(t,n){for(var r=0,o=e.length;r<o;r++)e[r].then(t,n)})},s._setImmediateFn=function(e){i=e},s._setUnhandledRejectionFn=function(e){a=e},e.exports=s},function(e,n,r){var o,i=r(0),a=(o=i,o&&o.__esModule?o:{default:o});var s=(0,a.default)("undef"),u=(0,a.default)("NaN"),c=!0;function l(e){return Number.isNaN(e)?u:e}function f(e){return e===u?NaN:e}function d(e,t){var n=0,r=!1;return{next:function(){if(n===e._keys.length&&(r=!0),r)return{value:void 0,done:!0};for(;e._keys[n]===s;)n++;return{value:t.call(e,n++),done:!1}}}}function p(e){for(var t=0,n=0,r=e._keys.length;n<r;n++)e._keys[n]!==s&&t++;return t}function h(e,t){return"function"==typeof e[t]}var v=function e(t){this._keys=[],this._values=[],t&&h(t,"forEach")&&(t instanceof e||h(t,"clear")&&h(t,"delete")&&h(t,"entries")&&h(t,"forEach")&&h(t,"get")&&h(t,"has")&&h(t,"keys")&&h(t,"set")&&h(t,"values")?t.forEach(function(e,t){this.set.apply(this,[t,e])},this):t.forEach(function(e){this.set.apply(this,e)},this)),c||(this.size=p(this))};v.prototype={};try{Object.defineProperty(v.prototype,"size",{get:function(){return p(this)}})}catch(e){c=!1}v.prototype.get=function(e){var t=this._keys.indexOf(l(e));return-1!==t?this._values[t]:void 0},v.prototype.set=function(e,t){var n=this._keys.indexOf(l(e));return-1!==n?this._values[n]=t:(this._keys.push(l(e)),this._values.push(t),c||(this.size=p(this))),this},v.prototype.has=function(e){return-1!==this._keys.indexOf(l(e))},v.prototype.delete=function(e){var t=this._keys.indexOf(l(e));return-1!==t&&(this._keys[t]=s,this._values[t]=s,c||(this.size=p(this)),!0)},v.prototype.clear=function(){this._keys=this._values=[],c||(this.size=0)},v.prototype.values=function(){return d(this,function(e){return this._values[e]})},v.prototype.keys=function(){return d(this,function(e){return f(this._keys[e])})},v.prototype.entries=v.prototype[a.default.iterator]=function(){return d(this,function(e){return[f(this._keys[e]),this._values[e]]})},v.prototype.forEach=function(e,n){n=n||t;for(var r=this.entries(),o=r.next();!1===o.done;)e.call(n,o.value[1],o.value[0],this),o=r.next()},v.prototype[a.default.species]=v,Object.defineProperty(v,"constructor",{value:v});try{Object.defineProperty(v,"length",{value:0})}catch(e){}e.exports=v},function(e,n,r){var o,i=r(0),a=(o=i,o&&o.__esModule?o:{default:o});var s=(0,a.default)("undef"),u=(0,a.default)("NaN"),c=!0;function l(e){return Number.isNaN(e)?u:e}function f(e){return e===u?NaN:e}function d(e,t){var n=0;return{next:function(){for(;e._values[n]===s;)n++;return n===e._values.length?{value:void 0,done:!0}:{value:t.call(e,n++),done:!1}}}}function p(e){for(var t=0,n=0,r=e._values.length;n<r;n++)e._values[n]!==s&&t++;return t}var h=function(e){this._values=[],e&&"function"==typeof e.forEach&&e.forEach(function(e){this.add.call(this,e)},this),c||(this.size=p(this))};try{Object.defineProperty(h.prototype,"size",{get:function(){return p(this)}})}catch(e){c=!1}h.prototype.add=function(e){return e=l(e),-1===this._values.indexOf(e)&&(this._values.push(e),c||(this.size=p(this))),this},h.prototype.has=function(e){return-1!==this._values.indexOf(l(e))},h.prototype.delete=function(e){var t=this._values.indexOf(l(e));return-1!==t&&(this._values[t]=s,c||(this.size=p(this)),!0)},h.prototype.clear=function(){this._values=[],c||(this.size=0)},h.prototype.values=h.prototype.keys=function(){return d(this,function(e){return f(this._values[e])})},h.prototype.entries=h.prototype[a.default.iterator]=function(){return d(this,function(e){return[f(this._values[e]),f(this._values[e])]})},h.prototype.forEach=function(e,n){n=n||t;for(var r=this.entries(),o=r.next();!1===o.done;)e.call(n,o.value[1],o.value[0],this),o=r.next()},h.prototype[a.default.species]=h,Object.defineProperty(h,"constructor",{value:h});try{Object.defineProperty(h,"length",{value:0})}catch(e){}e.exports=h},function(e,t,n){var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},o=Object.defineProperty,i=Date.now()%1e9,a=function(e){this.name="__st"+(1e9*Math.random()>>>0)+i+++"__",e&&e.forEach&&e.forEach(function(e){this.set.apply(this,e)},this)};a.prototype.set=function(e,t){if("object"!==(void 0===e?"undefined":r(e))&&"function"!=typeof e)throw new TypeError("Invalid value used as weak map key");var n=e[this.name];return n&&n[0]===e?n[1]=t:o(e,this.name,{value:[e,t],writable:!0}),this},a.prototype.get=function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},a.prototype.delete=function(e){var t=e[this.name];return!(!t||t[0]!==e)&&(t[0]=t[1]=void 0,!0)},a.prototype.has=function(e){var t=e[this.name];return!!t&&t[0]===e},e.exports=a},function(e,t,n){var r=Date.now()%1e9,o=function(e){this.name="__st"+(1e9*Math.random()>>>0)+r+++"__",e&&e.forEach&&e.forEach(this.add,this)};o.prototype.add=function(e){var t=this.name;return e[t]||Object.defineProperty(e,t,{value:!0,writable:!0}),this},o.prototype.delete=function(e){return!!e[this.name]&&(e[this.name]=void 0,!0)},o.prototype.has=function(e){return!!e[this.name]},e.exports=o},function(e,t,n){e.exports=function e(t,n){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.family=t,this.source=n}},function(e,t,n){var r=n(1),o=Object.create(null);o.ftp=21,o.file=0,o.gopher=70,o.http=80,o.https=443,o.ws=80,o.wss=443;var i=Object.create(null);i["%2e"]=".",i[".%2e"]="..",i["%2e."]="..",i["%2e%2e"]="..";function a(e){return void 0!==o[e]}function s(){v.call(this),this._isInvalid=!0}function u(e){return""==e&&s.call(this),e.toLowerCase()}function c(e){var t=e.charCodeAt(0);return t>32&&t<127&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function l(e){var t=e.charCodeAt(0);return t>32&&t<127&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}var f=void 0,d=/[a-zA-Z]/,p=/[a-zA-Z0-9\+\-\.]/;function h(e,t,n){function r(e){g.push(e)}var h=t||"scheme start",v=0,y="",m=!1,_=!1,g=[];e:for(;(e[v-1]!=f||0==v)&&!this._isInvalid;){var b=e[v];switch(h){case"scheme start":if(!b||!d.test(b)){if(t){r("Invalid scheme.");break e}y="",h="no scheme";continue}y+=b.toLowerCase(),h="scheme";break;case"scheme":if(b&&p.test(b))y+=b.toLowerCase();else{if(":"!=b){if(t){if(f==b)break e;r("Code point not allowed in scheme: "+b);break e}y="",v=0,h="no scheme";continue}if(this._scheme=y,y="",t)break e;a(this._scheme)&&(this._isRelative=!0),h="file"==this._scheme?"relative":this._isRelative&&n&&n._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?h="query":"#"==b?(this._fragment="#",h="fragment"):f!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=c(b));break;case"no scheme":if(n&&a(n._scheme)){h="relative";continue}r("Missing scheme."),s.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[v+1]){r("Expected /, got: "+b),h="relative";continue}h="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=n._scheme),f==b){this._host=n._host,this._port=n._port,this._path=n._path.slice(),this._query=n._query,this._username=n._username,this._password=n._password;break e}if("/"==b||"\\"==b)"\\"==b&&r("\\ is an invalid code point."),h="relative slash";else if("?"==b)this._host=n._host,this._port=n._port,this._path=n._path.slice(),this._query="?",this._username=n._username,this._password=n._password,h="query";else{if("#"!=b){var w=e[v+1],C=e[v+2];("file"!=this._scheme||!d.test(b)||":"!=w&&"|"!=w||f!=C&&"/"!=C&&"\\"!=C&&"?"!=C&&"#"!=C)&&(this._host=n._host,this._port=n._port,this._username=n._username,this._password=n._password,this._path=n._path.slice(),this._path.pop()),h="relative path";continue}this._host=n._host,this._port=n._port,this._path=n._path.slice(),this._query=n._query,this._fragment="#",this._username=n._username,this._password=n._password,h="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=n._host,this._port=n._port,this._username=n._username,this._password=n._password),h="relative path";continue}"\\"==b&&r("\\ is an invalid code point."),h="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){r("Expected '/', got: "+b),h="authority ignore slashes";continue}h="authority second slash";break;case"authority second slash":if(h="authority ignore slashes","/"!=b){r("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){h="authority";continue}r("Expected authority, got: "+b);break;case"authority":if("@"==b){m&&(r("@ already seen."),y+="%40"),m=!0;for(var k=0;k<y.length;k++){var x=y[k];if("\t"!=x&&"\n"!=x&&"\r"!=x)if(":"!=x||null!==this._password){var S=c(x);null!==this._password?this._password+=S:this._username+=S}else this._password="";else r("Invalid whitespace in authority.")}y=""}else{if(f==b||"/"==b||"\\"==b||"?"==b||"#"==b){v-=y.length,y="",h="host";continue}y+=b}break;case"file host":if(f==b||"/"==b||"\\"==b||"?"==b||"#"==b){2!=y.length||!d.test(y[0])||":"!=y[1]&&"|"!=y[1]?0==y.length?h="relative path start":(this._host=u.call(this,y),y="",h="relative path start"):h="relative path";continue}"\t"==b||"\n"==b||"\r"==b?r("Invalid whitespace in file host."):y+=b;break;case"host":case"hostname":if(":"!=b||_){if(f==b||"/"==b||"\\"==b||"?"==b||"#"==b){if(this._host=u.call(this,y),y="",h="relative path start",t)break e;continue}"\t"!=b&&"\n"!=b&&"\r"!=b?("["==b?_=!0:"]"==b&&(_=!1),y+=b):r("Invalid code point in host/hostname: "+b)}else if(this._host=u.call(this,y),y="",h="port","hostname"==t)break e;break;case"port":if(/[0-9]/.test(b))y+=b;else{if(f==b||"/"==b||"\\"==b||"?"==b||"#"==b||t){if(""!=y){var E=parseInt(y,10);E!=o[this._scheme]&&(this._port=E+""),y=""}if(t)break e;h="relative path start";continue}"\t"==b||"\n"==b||"\r"==b?r("Invalid code point in port: "+b):s.call(this)}break;case"relative path start":if("\\"==b&&r("'\\' not allowed in path."),h="relative path","/"!=b&&"\\"!=b)continue;break;case"relative path":if(f!=b&&"/"!=b&&"\\"!=b&&(t||"?"!=b&&"#"!=b))"\t"!=b&&"\n"!=b&&"\r"!=b&&(y+=c(b));else{"\\"==b&&r("\\ not allowed in relative path.");var O;(O=i[y.toLowerCase()])&&(y=O),".."==y?(this._path.pop(),"/"!=b&&"\\"!=b&&this._path.push("")):"."==y&&"/"!=b&&"\\"!=b?this._path.push(""):"."!=y&&("file"==this._scheme&&0==this._path.length&&2==y.length&&d.test(y[0])&&"|"==y[1]&&(y=y[0]+":"),this._path.push(y)),y="","?"==b?(this._query="?",h="query"):"#"==b&&(this._fragment="#",h="fragment")}break;case"query":t||"#"!=b?f!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._query+=l(b)):(this._fragment="#",h="fragment");break;case"fragment":f!=b&&"\t"!=b&&"\n"!=b&&"\r"!=b&&(this._fragment+=b)}v++}}function v(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function y(e,t){void 0===t||t instanceof y||(t=new y(String(t))),this._url=e,v.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");h.call(this,n,null,t)}y.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){v.call(this),h.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||h.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&h.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&h.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&h.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],h.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),h.call(this,e,"query"))},get searchParams(){return new r(this.search)},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),h.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return(e=this.host)?this._scheme+"://"+e:""}},e.exports=y},function(e,t,n){var r=/^(?:(only|not)?\s*([_a-z][_a-z0-9-]*)|(\([^\)]+\)))(?:\s*and\s*(.*))?$/i,o=/^\(\s*([_a-z-][_a-z0-9-]*)\s*(?:\:\s*([^\)]+))?\s*\)$/,i=/^(?:(min|max)-)?(.+)/;function a(e,t){return(n=e,n.split(",").map(function(e){var t=(e=e.trim()).match(r);if(!t)throw new SyntaxError('Invalid CSS media query: "'+e+'"');var n=t[1],a=t[2],s=((t[3]||"")+(t[4]||"")).trim(),u={};if(u.inverse=!!n&&"not"===n.toLowerCase(),u.type=a?a.toLowerCase():"all",!s)return u.expressions=[],u;if(!(s=s.match(/\([^\)]+\)/g)))throw new SyntaxError('Invalid CSS media query: "'+e+'"');return u.expressions=s.map(function(t){var n=t.match(o);if(!n)throw new SyntaxError('Invalid CSS media query: "'+e+'"');var r=n[1].toLowerCase().match(i);return{modifier:r[1],feature:r[2],value:n[2]}}),u})).some(function(e){var n=e.inverse,r="all"===e.type||t.type===e.type;if(r&&n||!r&&!n)return!1;var o=e.expressions.every(function(e){var n=e.feature,r=e.modifier,o=e.value,i=t[n];if(!i)return!1;switch(n){case"width":case"height":o=parseFloat(o),i=parseFloat(i)}switch(r){case"min":return i>=o;case"max":return i<=o;default:return i===o}});return o&&!n||!o&&n});var n}e.exports=function(e){var t={matches:!1,media:e};return""===e?(t.matches=!0,t):(t.matches=a(e,{type:"screen",width:window.screen.width,height:window.screen.height}),t)}}])}},function(e,t,n){e.exports=function(e){return function(t,n,r){n instanceof Function&&(r=n,n=[]),e[t]={factory:r,deps:n,module:{exports:{}},isInitialized:!1,hasError:!1}}}},function(e,t,n){e.exports=function(e){return function t(n){var r=e[n];if(r&&r.isInitialized)return r.module.exports;if(!r)throw new Error('Requiring unknown module "'+n+'"');if(r.hasError)throw new Error('Requiring module "'+n+'" which threw an exception');try{r.isInitialized=!0,r.factory(t,r.module.exports,r.module)}catch(e){throw r.hasError=!0,r.isInitialized=!1,e}return r.module.exports}}},function(e,t,n){var r,o=n(10),i=(r=o,r&&r.__esModule?r:{default:r});function a(e){if("*"==e)return e;for(var t=(e="string"==typeof e?e:"").split("."),n=0,r=[];n<3;){var o="string"==typeof t[n]&&t[n]?t[n]:"0";r.push(o),n++}return r.join(".")}function s(e,t,n){var r={isDowngrade:!0,errorType:1,code:1e3},o=e.toLowerCase();o.indexOf("osversion")>=0?r.code=1001:o.indexOf("appversion")>=0?r.code=1002:o.indexOf("weexversion")>=0?r.code=1003:o.indexOf("devicemodel")>=0&&(r.code=1004),r.errorMessage=(i=e,a=t,s=n,"Downgrade["+i+"] :: deviceInfo "+a+" matched criteria "+s);var i,a,s;return r}e.exports=function(e){return function(t){var n=e("@weex-module/instanceWrap"),r=function(e){var t={isDowngrade:!1},n=WXEnvironment,r=e[(n.platform||"unknow").toLowerCase()]||{};for(var o in n){var u=o,c=u.toLowerCase(),l=n[o],f=c.indexOf("version")>=0,d=c.indexOf("devicemodel")>=0,p=r[o];if(p&&f){var h=a(p),v=a(n[o]);if(i.default.satisfies(v,h)){t=s(u,l,p);break}}else if(d&&(Array.isArray(p)?p:[p]).indexOf(l)>=0){t=s(u,l,p);break}}return t}(t);return!!r.isDowngrade&&(n.error(r.errorType,r.code,r.errorMessage),!0)}}},function(e,t,n){Object.defineProperty(t,"__esModule",{value:!0});var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e};t.default={satisfies:function(e,t){if((void 0===e?"undefined":r(e))+(void 0===t?"undefined":r(t))!="stringstring")return!1;if("*"==t)return!0;for(var n=t.match(/(\W+)?([\d|.]+)/),o=e.split("."),i=n[2].split("."),a=Math.max(o.length,i.length),s=0,u=0;u<a;u++){if(o[u]&&!i[u]&&parseInt(o[u])>0||parseInt(o[u])>parseInt(i[u])){s=1;break}if(i[u]&&!o[u]&&parseInt(i[u])>0||parseInt(o[u])<parseInt(i[u])){s=-1;break}}switch(n[1]){case"<":if(-1===s)return!0;break;case"<=":if(1!==s)return!0;break;case">":if(1===s)return!0;break;case">=":if(-1!==s)return!0;break;default:if(0===s)return!0}return!1}},e.exports=t.default},function(e,t,n){var r,o=n(1),i=(r=o,r&&r.__esModule?r:{default:r});var a="visible",s="hidden",u="visibilitychange";function c(e){e.body.addEvent("viewappear",function(t){e.visibilityState=a,t.type=u,e.dispatchEvent(t)}),e.body.addEvent("viewdisappear",function(t){e.visibilityState=s,t.type=u,e.dispatchEvent(t)})}e.exports=function(e,t){var n=new i.default,r=!1;try{t.addEventListener=function(e,o){e===u&&(t.body?c(t):r=!0),n.on(e,o)},t.removeEventListener=function(e,r){e===u&&(o=t).body&&(o.body.removeEvent("viewappear"),o.body.removeEvent("viewdisappear"));var o;n.off(e,r)},t.dispatchEvent=function(e){n.emit(e.type,e)},t.fonts={add:function(t){e("@weex-module/dom").addRule("fontFace",{fontFamily:t.family,src:t.source})}},t.visibilityState=a;var o=t.createBody;Object.defineProperty(t,"createBody",{value:function(){var e=o.apply(t,arguments);return r&&c(t),e}})}catch(e){console.log(e)}return t}},function(e,t,n){var r="@weex-module/location";e.exports=function(e,t){return t.assign=function(t){e("@weex-module/navigator").push({url:t,animated:"true"},function(e){})},t.replace=function(t){e(r).replace(t)},t.reload=function(t){e(r).reload(t)},t}},function(e,t,n){e.exports=function(e,t){function n(e){return"string"!=typeof e&&(e=String(e)),e.toLowerCase()}function r(e){return"string"!=typeof e&&(e=String(e)),e}function o(e){this.originHeaders=e,this.map={},e instanceof o?e.forEach(function(e,t){this.append(t,e)},this):e&&Object.getOwnPropertyNames(e).forEach(function(t){this.append(t,e[t])},this)}o.prototype.append=function(e,t){e=n(e),t=r(t);var o=this.map[e];this.map[e]=o?o+","+t:t},o.prototype.delete=function(e){delete this.map[n(e)]},o.prototype.get=function(e){return e=n(e),this.has(e)?this.map[e]:null},o.prototype.has=function(e){return this.map.hasOwnProperty(n(e))},o.prototype.set=function(e,t){this.map[n(e)]=[r(t)]},o.prototype.forEach=function(e,t){for(var n in this.map)this.map.hasOwnProperty(n)&&e.call(t,this.map[n],n,this)};function i(){return this.bodyUsed=!1,this._initBody=function(e,t){if(this._bodyInit=e,"string"==typeof e)this._bodyText=e;else{if(e)throw new Error("unsupported BodyInit type");this._bodyText=""}},this.text=function(){var e=function(e){if(e.bodyUsed)return t.reject(new TypeError("Already read"));e.bodyUsed=!0}(this);return e||t.resolve(this._bodyText)},this.json=function(){return this.text().then(JSON.parse)},this}var a=["DELETE","GET","HEAD","OPTIONS","POST","PUT"];function s(e,t){var n=(t=t||{}).body;if(s.prototype.isPrototypeOf(e)){if(e.bodyUsed)throw new TypeError("Already read");this.url=e.url,this.credentials=e.credentials,t.headers||(this.headers=new o(e.headers)),this.method=e.method,this.mode=e.mode,n||(n=e._bodyInit,e.bodyUsed=!0)}else this.url=e;if(this.credentials=t.credentials||this.credentials||"omit",!t.headers&&this.headers||(this.headers=new o(t.headers)),this.method=function(e){var t=e.toUpperCase();return a.indexOf(t)>-1?t:e}(t.method||this.method||"GET"),this.mode=t.mode||this.mode||null,this.referrer=null,("GET"===this.method||"HEAD"===this.method)&&n)throw new TypeError("Body not allowed for GET or HEAD requests");this._initBody(n,t)}s.prototype.clone=function(){return new s(this)};i.call(s.prototype);function u(e,t){t||(t={}),this.type="default",this.status="status"in t?t.status:200,this.ok=this.status>=200&&this.status<300,this.statusText="statusText"in t?t.statusText:"OK",this.headers=new o(t.headers),this.url=t.url||"",this._initBody(e,t)}i.call(u.prototype),u.prototype.clone=function(){return new u(this._bodyInit,{status:this.status,statusText:this.statusText,headers:new o(this.headers),url:this.url})},u.error=function(){var e=new u(null,{status:0,statusText:""});return e.type="error",e};var c=[301,302,303,307,308];u.redirect=function(e,t){if(-1===c.indexOf(t))throw new RangeError("Invalid status code");return new u(null,{status:t,headers:{location:e}})};return{fetch:function(n,r){return new t(function(t,o){var i,a={url:(i=s.prototype.isPrototypeOf(n)&&!r?n:new s(n,r)).url,method:i.method,headers:i.headers&&i.headers.originHeaders};void 0!==i._bodyInit&&(a.body=i._bodyInit),a.type=r&&r.dataType?r.dataType:"text",(0,e("@weex-module/stream").fetch)(a,function(e){try{"string"==typeof e&&(e=JSON.parse(e));var n=new u("string"==typeof e.data?e.data:JSON.stringify(e.data),{status:e.status,statusText:e.statusText,headers:e.headers,url:i.url});t(n)}catch(e){o(e)}},function(e){})})},Headers:o,Request:s,Response:u}}},function(e,t,n){var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();var o=n(2),i=0,a=1,s=2,u=3,c=4,l=["abort","error","load","loadstart","progress","timeout","loadend","readystatechange"];e.exports=function(e){var t=function(t){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(n,o.apply(undefined,l));function n(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,n);var e=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(n.__proto__||Object.getPrototypeOf(n)).call(this));return e.UNSENT=i,e.OPENED=a,e.HEADERS_RECEIVED=s,e.LOADING=u,e.DONE=c,e.readyState=i,e.status=0,e.statusText="",e.timeout=0,e._aborted=!1,e._hasError=!1,e._method=null,e._response="",e._url=null,e._timedOut=!1,e._reset(),e}return r(n,[{key:"_reset",value:function(){this.readyState=this.UNSENT,this.responseHeaders=void 0,this.status=0,this._hasError=!1,this._headers={},this._response="",this._responseType="",this._sent=!1,this._lowerCaseResponseHeaders={},this._timedOut=!1}},{key:"getAllResponseHeaders",value:function(){if(!this.responseHeaders)return null;var e=this.responseHeaders||{};return Object.keys(e).map(function(t){return t+": "+e[t]}).join("\r\n")}},{key:"getResponseHeader",value:function(e){var t=this._lowerCaseResponseHeaders[e.toLowerCase()];return void 0!==t?t:null}},{key:"setRequestHeader",value:function(e,t){if(this.readyState!==this.OPENED)throw new Error("Request has not been opened");this._headers[e.toLowerCase()]=String(t)}},{key:"open",value:function(e,t,n){if(this.readyState!==this.UNSENT)throw new Error("Cannot open, already sending");if(void 0!==n&&!n)throw new Error("Synchronous http requests are not supported");if(!t)throw new Error("Cannot load an empty url");this._method=e.toUpperCase(),this._url=t,this._aborted=!1,this.setReadyState(this.OPENED)}},{key:"send",value:function(t){var n=this;if(this.readyState!==this.OPENED)throw new Error("Request has not been opened");if(this._sent)throw new Error("Request has already been sent");this._sent=!0;(0,e("@weex-module/stream").fetch)({method:this._method,url:this._url,headers:this._headers,body:t,type:"text"},function(e){try{"string"==typeof e&&(e=JSON.parse(e)),n.status=e.status,n.statusText=e.statusText,n.setResponseHeaders(e.headers),e.ok?n._response=e.data:(""!==n._responseType&&"text"!==n._responseType||(n._response=e.data),n._hasError=!0)}catch(e){}n.setReadyState(n.DONE)},function(e){n.status=e.status,n.statusText=e.statusText,n.setResponseHeaders(e.headers),n.setReadyState(e.readyState)})}},{key:"abort",value:function(){this._aborted=!0,this.readyState===this.UNSENT||this.readyState===this.OPENED&&!this._sent||this.readyState===this.DONE||(this._reset(),this.setReadyState(this.DONE)),this._reset()}},{key:"setResponseHeaders",value:function(e){this.responseHeaders=e||null;var t=e||{};this._lowerCaseResponseHeaders=Object.keys(t).reduce(function(e,n){return e[n.toLowerCase()]=t[n],e},{})}},{key:"setReadyState",value:function(e){this.readyState=e,this.dispatchEvent({type:"readystatechange"}),e===this.DONE&&(this._aborted?this.dispatchEvent({type:"abort"}):this._hasError?this._timedOut?this.dispatchEvent({type:"timeout"}):this.dispatchEvent({type:"error"}):this.dispatchEvent({type:"load"}),this.dispatchEvent({type:"loadend"}))}},{key:"responseType",get:function(){return this._responseType},set:function(e){if(this._sent)throw new Error("Failed to set the 'responseType' property on 'XMLHttpRequest': The response type cannot be set after the request has been sent.");this._responseType=e}},{key:"responseText",get:function(){if(""!==this._responseType&&"text"!==this._responseType)throw new Error("The 'responseText' property is only available if 'responseType' is set to '' or 'text', but it is '"+this._responseType+"'.");return this.readyState<u?"":this._response}},{key:"response",get:function(){var e=this.responseType;return""===e||"text"===e?this.readyState<u||this._hasError?"":this._response:this.readyState!==c?null:void 0}}]),n}();return t.UNSENT=i,t.OPENED=a,t.HEADERS_RECEIVED=s,t.LOADING=u,t.DONE=c,t}},function(e,t,n){var r=n(0),o=r.LISTENERS,i=r.ATTRIBUTE,a=r.newNode;e.exports.defineCustomEventTarget=function(e,t){function n(){e.call(this)}var r={constructor:{value:n,configurable:!0,writable:!0}};return t.forEach(function(e){r["on"+e]={get:function(){return function(e,t){for(var n=e[o][t];null!=n;){if(n.kind===i)return n.listener;n=n.next}return null}(this,e)},set:function(t){!function(e,t,n){"function"!=typeof n&&"object"!=typeof n&&(n=null);for(var r=null,s=e[o][t];null!=s;)s.kind===i?null==r?e[o][t]=s.next:r.next=s.next:r=s,s=s.next;null!=n&&(null==r?e[o][t]=a(n,i):r.next=a(n,i))}(this,e,t)},configurable:!0,enumerable:!0}}),n.prototype=Object.create(e.prototype,r),n}},function(e,t,n){var r=n(0).createUniqueKey,o=r("stop_immediate_propagation_flag"),i=r("canceled_flag"),a=r("passive_listener_flag"),s=r("original_event"),u=Object.freeze({stopPropagation:Object.freeze({value:function(){var e=this[s];"function"==typeof e.stopPropagation&&e.stopPropagation()},writable:!0,configurable:!0}),stopImmediatePropagation:Object.freeze({value:function(){this[o]=!0;var e=this[s];"function"==typeof e.stopImmediatePropagation&&e.stopImmediatePropagation()},writable:!0,configurable:!0}),preventDefault:Object.freeze({value:function(){if(!this[a]){!0===this.cancelable&&(this[i]=!0);var e=this[s];"function"==typeof e.preventDefault&&e.preventDefault()}},writable:!0,configurable:!0}),defaultPrevented:Object.freeze({get:function(){return this[i]},enumerable:!0,configurable:!0})});e.exports.STOP_IMMEDIATE_PROPAGATION_FLAG=o,e.exports.PASSIVE_LISTENER_FLAG=a,e.exports.createEventWrapper=function(e,t){var n="number"==typeof e.timeStamp?e.timeStamp:Date.now(),r={type:{value:e.type,enumerable:!0},target:{value:t,enumerable:!0},currentTarget:{value:t,enumerable:!0},eventPhase:{value:2,enumerable:!0},bubbles:{value:Boolean(e.bubbles),enumerable:!0},cancelable:{value:Boolean(e.cancelable),enumerable:!0},timeStamp:{value:n,enumerable:!0},isTrusted:{value:!1,enumerable:!0}};return r[o]={value:!1,writable:!0},r[i]={value:!1,writable:!0},r[a]={value:!1,writable:!0},r[s]={value:e},void 0!==e.detail&&(r.detail={value:e.detail,enumerable:!0}),Object.create(Object.create(e,u),r)}},function(e,t,n){var r=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}();function o(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}var i=n(2),a="@weex-module/webSocket",s=0,u=1,c=3,l=["close","error","message","open"],f=function e(t,n){o(this,e),this.type=t.toString(),Object.assign(this,n)};e.exports=function(e){var t=function(t){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(n,i(l));function n(t,r){o(this,n);var i=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(n.__proto__||Object.getPrototypeOf(n)).call(this)),l=e(a);return l.WebSocket(t,r),i.readyState=s,i.websocket=l,l.onmessage(function(e){i.dispatchEvent(new f("message",e))}),l.onopen(function(e){i.readyState=u,i.dispatchEvent(new f("open"))}),l.onclose(function(e){i.readyState=c,i.dispatchEvent(new f("close",{code:e.code,reason:e.reason}))}),l.onerror(function(e){i.dispatchEvent(new f("error",e))}),i}return r(n,[{key:"close",value:function(e,t){2!==this.readyState&&this.readyState!==c&&(this.readyState=2,this.websocket.close(e,t))}},{key:"send",value:function(e){if("string"!=typeof e)throw new Error("Unsupported data type");this.websocket.send(e)}}]),n}();return t.CONNECTING=s,t.OPEN=u,t.CLOSING=2,t.CLOSED=c,t}},function(e,t,n){var r="@weex-module/timer";e.exports=function(e,t){return{setTimeout:function(n,o){return e(r).setTimeout(n,o),t.taskCenter.callbackManager.lastCallbackId.toString()},clearTimeout:function(t){e(r).clearTimeout(t)},setInterval:function(n,o){return e(r).setInterval(n,o),t.taskCenter.callbackManager.lastCallbackId.toString()},clearInterval:function(t){e(r).clearInterval(t)},requestAnimationFrame:function(t){return e(r).setTimeout(t,16)},cancelAnimationFrame:function(t){e(r).clearTimeout(t)}}}},function(e,t,n){e.exports=function(){var e={},t="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";return e.btoa=function(e){for(var n,r,o=String(e),i=0,a=t,s="";o.charAt(0|i)||(a="=",i%1);s+=a.charAt(63&n>>8-i%1*8)){if((r=o.charCodeAt(i+=.75))>255)throw new Error("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");n=n<<8|r}return s},e.atob=function(e){var n=String(e).replace(/=+$/,"");if(n.length%4==1)throw new Error("'atob' failed: The string to be decoded is not correctly encoded.");for(var r,o,i=0,a=0,s="";o=n.charAt(a++);~o&&(r=i%4?64*r+o:o,i++%4)?s+=String.fromCharCode(255&r>>(-2*i&6)):0)o=t.indexOf(o);return s},e}},function(e,t,n){function r(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}e.exports=function(e){var t,n={};return n.timing=(t={unloadEventStart:0,unloadEventEnd:0,navigationStart:e,redirectStart:0,redirectEnd:0,fetchStart:e,domainLookupStart:e,domainLookupEnd:e,connectStart:e,secureConnectionStart:e},r(t,"connectStart",e),r(t,"requestStart",e),r(t,"responseStart",e),r(t,"responseEnd",e),r(t,"domLoading",0),r(t,"domInteractive",0),r(t,"domComplete",0),r(t,"domContentLoadedEventStart",0),r(t,"domContentLoadedEventEnd",0),r(t,"loadEventStart",0),r(t,"loadEventEnd",0),t),n.now=function(){return Date.now()-n.timing.navigationStart},n}},function(e,t,n){function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}e.exports=function(){var e=function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r(this,e),this.type=t,this.bubbles=Boolean(n.bubbles),this.cancelable=Boolean(n.cancelable)};return{Event:e,CustomEvent:function(t){!function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)}(n,e);function n(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};r(this,n);var o=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t}(this,(n.__proto__||Object.getPrototypeOf(n)).call(this,e,t));return o.detail=t.detail,o}return n}()}}}])})),Weex:es})});
