!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.WeexRuntime=e()}(this,function(){"use strict";function t(t,e){return e={exports:{}},t(e,e.exports),e.exports}function e(t){var e,n;this.promise=new t(function(t,r){if(void 0!==e||void 0!==n)throw TypeError("Bad Promise constructor");e=t,n=r}),this.resolve=Pr(e),this.reject=Pr(n)}function n(){wo.forEach(function(t){var e=wo.indexOf(t);jo[t]={},wo.forEach(function(n){wo.indexOf(n)<=e&&(jo[t][n]=!0)})})}function r(t){var e=global.WXEnvironment&&global.WXEnvironment.logLevel||"log";return jo[e]&&jo[e][t]}function o(t){return t.map(function(t){return t="[object object]"===Object.prototype.toString.call(t).toLowerCase()?JSON.stringify(t):String(t)})}function i(){if("undefined"==typeof setTimeout&&"function"==typeof Io){var t={},e=0;global.setTimeout=function(n,r){t[++e]=n,Io(e.toString(),r)},global.setTimeoutCallback=function(e){"function"==typeof t[e]&&(t[e](),delete t[e])}}}function a(){Object.freeze(Object),Object.freeze(Array),c(),Object.freeze(Array.prototype),Object.freeze(String.prototype),Object.freeze(Number.prototype),Object.freeze(Boolean.prototype),s(),Object.freeze(Date.prototype),Object.freeze(RegExp.prototype)}function c(){var t=Object.prototype,e="Object.prototype";u(t,"__defineGetter__",e),u(t,"__defineSetter__",e),u(t,"__lookupGetter__",e),u(t,"__lookupSetter__",e),u(t,"constructor",e),u(t,"hasOwnProperty",e),u(t,"isPrototypeOf",e),u(t,"propertyIsEnumerable",e),u(t,"toLocaleString",e),u(t,"toString",e),u(t,"valueOf",e),Object.seal(t)}function s(){var t=Error.prototype,e="Error.prototype";u(t,"name",e),u(t,"message",e),u(t,"toString",e),u(t,"constructor",e),Object.seal(t)}function u(t,e,n){if(t.hasOwnProperty(e)){var r=t[e];Object.defineProperty(t,e,{get:function(){return r},set:function(r){if(this===t)throw Error("Cannot assign to read only property "+e+" of "+n);return Object.defineProperty(this,e,{value:r,writable:!0}),r}})}}function l(){return(To++).toString()}function f(t){var e=Object.prototype.toString.call(t);return e.substring(8,e.length-1)}function d(t){if("function"!=typeof btoa)return"";var e=Array.prototype.map.call(new Uint8Array(t),function(t){return String.fromCharCode(t)}).join("");return btoa(e)}function p(t){if("function"!=typeof atob)return new ArrayBuffer(0);var e=atob(t),n=new Uint8Array(e.length);return Array.prototype.forEach.call(e,function(t,e){n[e]=t.charCodeAt(0)}),n.buffer}function h(t){var e=f(t);switch(e){case"Undefined":case"Null":return"";case"RegExp":return t.toString();case"Date":return t.toISOString();case"Number":case"String":case"Boolean":case"Array":case"Object":return t;case"ArrayBuffer":return{"@type":"binary",dataType:e,base64:d(t)};case"Int8Array":case"Uint8Array":case"Uint8ClampedArray":case"Int16Array":case"Uint16Array":case"Int32Array":case"Uint32Array":case"Float32Array":case"Float64Array":return{"@type":"binary",dataType:e,base64:d(t.buffer)};default:return JSON.stringify(t)}}function v(t){if("Object"===f(t)){if(t["@type"]&&"binary"===t["@type"])return p(t.base64||"");var e={};for(var n in t)e[n]=v(t[n]);return e}return"Array"===f(t)?t.map(v):t}function y(t,e){t&&(ko[t]=e)}function m(t){return ko[t]}function g(t){delete ko[t]}function b(t){var e=ko[t];return e&&e.taskCenter?e.taskCenter:null}function _(t,e,n){var r=t.documentElement;if(!(r.pureChildren.length>0||e.parentNode)){var o=r.children,i=o.indexOf(n);i<0?o.push(e):o.splice(i,0,e),1===e.nodeType?("body"===e.role?(e.docId=t.id,e.ownerDocument=t,e.parentNode=r,E(e,r)):(e.children.forEach(function(t){t.parentNode=e}),O(t,e),e.docId=t.id,e.ownerDocument=t,E(e,r),delete t.nodeMap[e.nodeId]),r.pureChildren.push(e),S(t,e)):(e.parentNode=r,t.nodeMap[e.ref]=e)}}function S(t,e){var n=e.toJSON(),r=n.children;delete n.children;var o=t.taskCenter.send("dom",{action:"createBody"},[n]);return r&&r.forEach(function(e){o=t.taskCenter.send("dom",{action:"addElement"},[n.ref,e,-1])}),o}function O(t,e){e.role="body",e.depth=1,delete t.nodeMap[e.nodeId],e.ref="_root",t.nodeMap._root=e,t.body=e}function E(t,e){t.parentNode=e,e.docId&&(t.docId=e.docId,t.ownerDocument=e.ownerDocument,t.ownerDocument.nodeMap[t.nodeId]=t,t.depth=e.depth+1),t.children.forEach(function(e){E(e,t)})}function w(t){for(;t;){if(1===t.nodeType)return t;t=t.nextSibling}}function j(t){for(;t;){if(1===t.nodeType)return t;t=t.previousSibling}}function A(t,e,n,r){n<0&&(n=0);var o=e[n-1],i=e[n];return e.splice(n,0,t),r&&(o&&(o.nextSibling=t),t.previousSibling=o,t.nextSibling=i,i&&(i.previousSibling=t)),n}function C(t,e,n,r){var o=e.indexOf(t);if(o<0)return-1;if(r){var i=e[o-1],a=e[o+1];i&&(i.nextSibling=a),a&&(a.previousSibling=i)}e.splice(o,1);var c=n;o<=n&&(c=n-1);var s=e[c-1],u=e[c];return e.splice(c,0,t),r&&(s&&(s.nextSibling=t),t.previousSibling=s,t.nextSibling=u,u&&(u.previousSibling=t)),o===c?-1:n}function I(t,e,n){var r=e.indexOf(t);if(!(r<0)){if(n){var o=e[r-1],i=e[r+1];o&&(o.nextSibling=i),i&&(i.previousSibling=o)}e.splice(r,1)}}function T(t,e){if(e&&e.length){var n=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Mo);e.forEach(function(e){n.prototype[e]=function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var o=b(this.docId);if(o)return o.send("component",{ref:this.ref,component:t,method:e},n)}}),Po[t]=n}}function N(t){return Po[t]}function k(t){return"String"===f(t)?{"@binding":t}:t}function x(t){for(var e,n,r=[],o=Lo.lastIndex=0;e=Lo.exec(t);){(n=e.index)>o&&r.push(t.slice(o,n));var i=k(e[1].trim());r.push(i),o=n+e[0].length}return o<t.length&&r.push(t.slice(o)),1===r.length?r[0]:r}function M(t){if("String"===f(t)&&Lo.test(t))return x(t);if("Object"===f(t)){var e={};for(var n in t)e[n]=M(t[n]);return e}return"Array"===f(t)?t.map(M):t}function P(t,e){m(t).nodeMap[e.nodeId]=e}function L(){var t={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},e=Bo.prototype;for(var n in t)!function(n){var r=t[n];e[n]=r?function(t,e){return r.apply(void 0,[t].concat(e))}:function(t,e){return zo(t,[{module:"dom",method:n,args:e}],"-1")}}(n);e.componentHandler=global.callNativeComponent||function(t,e,n,r,o){return zo(t,[{component:o.component,ref:e,method:n,args:r}])},e.moduleHandler=global.callNativeModule||function(t,e,n,r){return zo(t,[{module:e,method:n,args:r}])}}function F(t,e){D(t)?console.warn('Service "'+t+'" has been registered already!'):(e=Object.assign({},e),Wo.push({name:t,options:e}))}function R(t){Wo.some(function(e,n){if(e.name===t)return Wo.splice(n,1),!0})}function D(t){return z(t)>=0}function z(t){return Wo.map(function(t){return t.name}).indexOf(t)}function B(t){var e=Go.exec(t);if(e)try{return JSON.parse(e[1]).framework}catch(t){}return"Weex"}function J(t,e,n){var r=Object.create(null);return r.service=Object.create(null),Wo.forEach(function(o){o.name;var i=o.options.create;if(i){var a=i(t,e,n);Object.assign(r.service,a),Object.assign(r,a.instance)}}),delete r.service.instance,Object.freeze(r.service),r}function U(t){if(Ho[t])return Ho[t].framework}function W(t){Vo[t]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];"registerComponents"===t&&G(e[0]);for(var r in Jo){var o=Jo[r];o&&o[t]&&o[t].apply(o,e)}}}function G(t){Array.isArray(t)&&t.forEach(function(t){t&&t.type&&t.methods&&T(t.type,t.methods)})}function H(t){Vo[t]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var r=e[0],o=U(r);if(o&&Jo[o]){var i=(c=Jo[o])[t].apply(c,e),a={framework:o};return"refreshInstance"===t?Wo.forEach(function(t){var e=t.options.refresh;e&&e(r,{info:a,runtime:Uo})}):"destroyInstance"===t&&(Wo.forEach(function(t){var e=t.options.destroy;e&&e(r,{info:a,runtime:Uo})}),delete Ho[r]),i}return new Error('invalid instance id "'+r+'"');var c}}function V(t,e){Vo[e]=function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];var r=e[0],o=U(r);return o&&Jo[o]?(i=Jo[o])[t].apply(i,e):new Error('invalid instance id "'+r+'"');var i}}function X(t,e){return void 0===e&&(e=[]),{module:"dom",method:t,args:e}}function q(t,e){var n=e||global.callNative;return"function"!=typeof n&&console.error("[JS Runtime] no default handler"),function(e){Array.isArray(e)||(e=[e]);for(var r=0;r<e.length;r++){var o=$(t,e[r],n);if(-1===o)return o}}}function K(t,e){return"dom"===t&&Ko[e]&&"function"==typeof global[Ko[e]]}function $(t,e,n){var r=e.module,o=e.method,i=e.args;return K(r,o)?global[Ko[o]].apply(global,[t].concat(i,["-1"])):n(t,[e],"-1")}function Q(t,e){var n=e.attrs||{};for(var r in n)t.setAttr(r,n[r],!0);var o=e.style||{};for(var i in o)t.setStyle(i,o[i],!0)}Array.from||(Array.from=function(){var t=Object.prototype.toString,e=function(e){return"function"==typeof e||"[object Function]"===t.call(e)},n=function(t){var e=Number(t);return isNaN(e)?0:0!==e&&isFinite(e)?(e>0?1:-1)*Math.floor(Math.abs(e)):e},r=Math.pow(2,53)-1,o=function(t){var e=n(t);return Math.min(Math.max(e,0),r)};return function(t){var n=this,r=Object(t);if(null==t)throw new TypeError("Array.from requires an array-like object - not null or undefined");var i,a=arguments.length>1?arguments[1]:void 0;if(void 0!==a){if(!e(a))throw new TypeError("Array.from: when provided, the second argument must be a function");arguments.length>2&&(i=arguments[2])}for(var c,s=o(r.length),u=e(n)?Object(new n(s)):new Array(s),l=0;l<s;)c=r[l],u[l]=a?void 0===i?a(c,l):a.call(i,c,l):c,l+=1;return u.length=s,u}}());var Y="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},Z=t(function(t){var e=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=e)}),tt=t(function(t){var e=t.exports={version:"2.5.0"};"number"==typeof __e&&(__e=e)}),et=function(t){return"object"==typeof t?null!==t:"function"==typeof t},nt=et,rt=function(t){if(!nt(t))throw TypeError(t+" is not an object!");return t},ot=function(t){try{return!!t()}catch(t){return!0}},it=!ot(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a}),at=et,ct=Z.document,st=at(ct)&&at(ct.createElement),ut=function(t){return st?ct.createElement(t):{}},lt=!it&&!ot(function(){return 7!=Object.defineProperty(ut("div"),"a",{get:function(){return 7}}).a}),ft=et,dt=rt,pt=lt,ht=function(t,e){if(!ft(t))return t;var n,r;if(e&&"function"==typeof(n=t.toString)&&!ft(r=n.call(t)))return r;if("function"==typeof(n=t.valueOf)&&!ft(r=n.call(t)))return r;if(!e&&"function"==typeof(n=t.toString)&&!ft(r=n.call(t)))return r;throw TypeError("Can't convert object to primitive value")},vt=Object.defineProperty,yt={f:it?Object.defineProperty:function(t,e,n){if(dt(t),e=ht(e,!0),dt(n),pt)try{return vt(t,e,n)}catch(t){}if("get"in n||"set"in n)throw TypeError("Accessors not supported!");return"value"in n&&(t[e]=n.value),t}},mt=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}},gt=yt,bt=mt,_t=it?function(t,e,n){return gt.f(t,e,bt(1,n))}:function(t,e,n){return t[e]=n,t},St={}.hasOwnProperty,Ot=function(t,e){return St.call(t,e)},Et=0,wt=Math.random(),jt=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++Et+wt).toString(36))},At=t(function(t){var e=Z,n=_t,r=Ot,o=jt("src"),i=Function.toString,a=(""+i).split("toString");tt.inspectSource=function(t){return i.call(t)},(t.exports=function(t,i,c,s){var u="function"==typeof c;u&&(r(c,"name")||n(c,"name",i)),t[i]!==c&&(u&&(r(c,o)||n(c,o,t[i]?""+t[i]:a.join(String(i)))),t===e?t[i]=c:s?t[i]?t[i]=c:n(t,i,c):(delete t[i],n(t,i,c)))})(Function.prototype,"toString",function(){return"function"==typeof this&&this[o]||i.call(this)})}),Ct=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t},It=Ct,Tt=function(t,e,n){if(It(t),void 0===e)return t;switch(n){case 1:return function(n){return t.call(e,n)};case 2:return function(n,r){return t.call(e,n,r)};case 3:return function(n,r,o){return t.call(e,n,r,o)}}return function(){return t.apply(e,arguments)}},Nt=Z,kt=tt,xt=_t,Mt=At,Pt=Tt,Lt=function(t,e,n){var r,o,i,a,c=t&Lt.F,s=t&Lt.G,u=t&Lt.S,l=t&Lt.P,f=t&Lt.B,d=s?Nt:u?Nt[e]||(Nt[e]={}):(Nt[e]||{}).prototype,p=s?kt:kt[e]||(kt[e]={}),h=p.prototype||(p.prototype={});s&&(n=e);for(r in n)i=((o=!c&&d&&void 0!==d[r])?d:n)[r],a=f&&o?Pt(i,Nt):l&&"function"==typeof i?Pt(Function.call,i):i,d&&Mt(d,r,i,t&Lt.U),p[r]!=i&&xt(p,r,a),l&&h[r]!=i&&(h[r]=i)};Nt.core=kt,Lt.F=1,Lt.G=2,Lt.S=4,Lt.P=8,Lt.B=16,Lt.W=32,Lt.U=64,Lt.R=128;var Ft=Lt,Rt={}.toString,Dt=function(t){return Rt.call(t).slice(8,-1)},zt=Dt,Bt=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==zt(t)?t.split(""):Object(t)},Jt=function(t){if(void 0==t)throw TypeError("Can't call method on  "+t);return t},Ut=Bt,Wt=Jt,Gt=function(t){return Ut(Wt(t))},Ht=Math.ceil,Vt=Math.floor,Xt=function(t){return isNaN(t=+t)?0:(t>0?Vt:Ht)(t)},qt=Xt,Kt=Math.min,$t=function(t){return t>0?Kt(qt(t),9007199254740991):0},Qt=Xt,Yt=Math.max,Zt=Math.min,te=Gt,ee=$t,ne=function(t,e){return(t=Qt(t))<0?Yt(t+e,0):Zt(t,e)},re=Z,oe=re["__core-js_shared__"]||(re["__core-js_shared__"]={}),ie=function(t){return oe[t]||(oe[t]={})},ae=ie("keys"),ce=jt,se=function(t){return ae[t]||(ae[t]=ce(t))},ue=Ot,le=Gt,fe=function(t){return function(e,n,r){var o,i=te(e),a=ee(i.length),c=ne(r,a);if(t&&n!=n){for(;a>c;)if((o=i[c++])!=o)return!0}else for(;a>c;c++)if((t||c in i)&&i[c]===n)return t||c||0;return!t&&-1}}(!1),de=se("IE_PROTO"),pe="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(","),he=function(t,e){var n,r=le(t),o=0,i=[];for(n in r)n!=de&&ue(r,n)&&i.push(n);for(;e.length>o;)ue(r,n=e[o++])&&(~fe(i,n)||i.push(n));return i},ve=pe,ye=Object.keys||function(t){return he(t,ve)},me=Jt,ge=function(t){return Object(me(t))},be=ye,_e={f:Object.getOwnPropertySymbols},Se={f:{}.propertyIsEnumerable},Oe=ge,Ee=Bt,we=Object.assign,je=!we||ot(function(){var t={},e={},n=Symbol(),r="abcdefghijklmnopqrst";return t[n]=7,r.split("").forEach(function(t){e[t]=t}),7!=we({},t)[n]||Object.keys(we({},e)).join("")!=r})?function(t,e){for(var n=arguments,r=Oe(t),o=arguments.length,i=1,a=_e.f,c=Se.f;o>i;)for(var s,u=Ee(n[i++]),l=a?be(u).concat(a(u)):be(u),f=l.length,d=0;f>d;)c.call(u,s=l[d++])&&(r[s]=u[s]);return r}:we,Ae=Ft;Ae(Ae.S+Ae.F,"Object",{assign:je}),Object.setPrototypeOf||(Object.setPrototypeOf=function(t,e){function n(t,e){return r.call(t,e),t}var r;try{(r=t.getOwnPropertyDescriptor(t.prototype,"__proto__").set).call({},null)}catch(e){if(t.prototype!=={}.__proto__||void 0==={__proto__:null}.__proto__)return;r=function(t){this.__proto__=t},n.polyfill=n(n({},null),t.prototype)instanceof t}return n}(Object));var Ce=Y.WXEnvironment;Ce&&"iOS"===Ce.platform&&(Y.Promise=void 0);var Ie=t(function(t){var e=ie("wks"),n=jt,r=Z.Symbol,o="function"==typeof r;(t.exports=function(t){return e[t]||(e[t]=o&&r[t]||(o?r:n)("Symbol."+t))}).store=e}),Te=Dt,Ne=Ie("toStringTag"),ke="Arguments"==Te(function(){return arguments}()),xe=function(t,e){try{return t[e]}catch(t){}},Me=function(t){var e,n,r;return void 0===t?"Undefined":null===t?"Null":"string"==typeof(n=xe(e=Object(t),Ne))?n:ke?Te(e):"Object"==(r=Te(e))&&"function"==typeof e.callee?"Arguments":r},Pe=Me,Le={};Le[Ie("toStringTag")]="z",Le+""!="[object z]"&&At(Object.prototype,"toString",function(){return"[object "+Pe(this)+"]"},!0);var Fe=Xt,Re=Jt,De={},ze=yt,Be=rt,Je=ye,Ue=it?Object.defineProperties:function(t,e){Be(t);for(var n,r=Je(e),o=r.length,i=0;o>i;)ze.f(t,n=r[i++],e[n]);return t},We=Z.document,Ge=We&&We.documentElement,He=rt,Ve=Ue,Xe=pe,qe=se("IE_PROTO"),Ke=function(){},$e=function(){var t,e=ut("iframe"),n=Xe.length;for(e.style.display="none",Ge.appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),$e=t.F;n--;)delete $e.prototype[Xe[n]];return $e()},Qe=Object.create||function(t,e){var n;return null!==t?(Ke.prototype=He(t),n=new Ke,Ke.prototype=null,n[qe]=t):n=$e(),void 0===e?n:Ve(n,e)},Ye=yt.f,Ze=Ot,tn=Ie("toStringTag"),en=function(t,e,n){t&&!Ze(t=n?t:t.prototype,tn)&&Ye(t,tn,{configurable:!0,value:e})},nn=Qe,rn=mt,on=en,an={};_t(an,Ie("iterator"),function(){return this});var cn=Ot,sn=ge,un=se("IE_PROTO"),ln=Object.prototype,fn=Object.getPrototypeOf||function(t){return t=sn(t),cn(t,un)?t[un]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?ln:null},dn=Ft,pn=At,hn=_t,vn=Ot,yn=De,mn=function(t,e,n){t.prototype=nn(an,{next:rn(1,n)}),on(t,e+" Iterator")},gn=en,bn=fn,_n=Ie("iterator"),Sn=!([].keys&&"next"in[].keys()),On=function(){return this},En=function(t,e,n,r,o,i,a){mn(n,e,r);var c,s,u,l=function(t){if(!Sn&&t in h)return h[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},f=e+" Iterator",d="values"==o,p=!1,h=t.prototype,v=h[_n]||h["@@iterator"]||o&&h[o],y=v||l(o),m=o?d?l("entries"):y:void 0,g="Array"==e?h.entries||v:v;if(g&&(u=bn(g.call(new t)))!==Object.prototype&&u.next&&(gn(u,f,!0),vn(u,_n)||hn(u,_n,On)),d&&v&&"values"!==v.name&&(p=!0,y=function(){return v.call(this)}),(Sn||p||!h[_n])&&hn(h,_n,y),yn[e]=y,yn[f]=On,o)if(c={values:d?y:l("values"),keys:i?y:l("keys"),entries:m},a)for(s in c)s in h||pn(h,s,c[s]);else dn(dn.P+dn.F*(Sn||p),e,c);return c},wn=function(t){return function(e,n){var r,o,i=String(Re(e)),a=Fe(n),c=i.length;return a<0||a>=c?t?"":void 0:(r=i.charCodeAt(a))<55296||r>56319||a+1===c||(o=i.charCodeAt(a+1))<56320||o>57343?t?i.charAt(a):r:t?i.slice(a,a+2):o-56320+(r-55296<<10)+65536}}(!0);En(String,"String",function(t){this._t=String(t),this._i=0},function(){var t,e=this._t,n=this._i;return n>=e.length?{value:void 0,done:!0}:(t=wn(e,n),this._i+=t.length,{value:t,done:!1})});var jn=Ie("unscopables"),An=Array.prototype;void 0==An[jn]&&_t(An,jn,{});var Cn=function(t){An[jn][t]=!0},In=function(t,e){return{value:e,done:!!t}},Tn=De,Nn=Gt,kn=En(Array,"Array",function(t,e){this._t=Nn(t),this._i=0,this._k=e},function(){var t=this._t,e=this._k,n=this._i++;return!t||n>=t.length?(this._t=void 0,In(1)):"keys"==e?In(0,n):"values"==e?In(0,t[n]):In(0,[n,t[n]])},"values");Tn.Arguments=Tn.Array,Cn("keys"),Cn("values"),Cn("entries");for(var xn=kn,Mn=ye,Pn=At,Ln=Z,Fn=_t,Rn=De,Dn=Ie,zn=Dn("iterator"),Bn=Dn("toStringTag"),Jn=Rn.Array,Un={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},Wn=Mn(Un),Gn=0;Gn<Wn.length;Gn++){var Hn,Vn=Wn[Gn],Xn=Un[Vn],qn=Ln[Vn],Kn=qn&&qn.prototype;if(Kn&&(Kn[zn]||Fn(Kn,zn,Jn),Kn[Bn]||Fn(Kn,Bn,Vn),Rn[Vn]=Jn,Xn))for(Hn in xn)Kn[Hn]||Pn(Kn,Hn,xn[Hn],!0)}var $n,Qn,Yn,Zn=rt,tr=function(t,e,n,r){try{return r?e(Zn(n)[0],n[1]):e(n)}catch(e){var o=t.return;throw void 0!==o&&Zn(o.call(t)),e}},er=De,nr=Ie("iterator"),rr=Array.prototype,or=function(t){return void 0!==t&&(er.Array===t||rr[nr]===t)},ir=Me,ar=Ie("iterator"),cr=De,sr=tt.getIteratorMethod=function(t){if(void 0!=t)return t[ar]||t["@@iterator"]||cr[ir(t)]},ur=t(function(t){var e=Tt,n=tr,r=or,o=rt,i=$t,a=sr,c={},s={},u=t.exports=function(t,u,l,f,d){var p,h,v,y,m=d?function(){return t}:a(t),g=e(l,f,u?2:1),b=0;if("function"!=typeof m)throw TypeError(t+" is not iterable!");if(r(m)){for(p=i(t.length);p>b;b++)if((y=u?g(o(h=t[b])[0],h[1]):g(t[b]))===c||y===s)return y}else for(v=m.call(t);!(h=v.next()).done;)if((y=n(v,g,h.value,u))===c||y===s)return y};u.BREAK=c,u.RETURN=s}),lr=rt,fr=Ct,dr=Ie("species"),pr=Tt,hr=function(t,e,n){var r=void 0===n;switch(e.length){case 0:return r?t():t.call(n);case 1:return r?t(e[0]):t.call(n,e[0]);case 2:return r?t(e[0],e[1]):t.call(n,e[0],e[1]);case 3:return r?t(e[0],e[1],e[2]):t.call(n,e[0],e[1],e[2]);case 4:return r?t(e[0],e[1],e[2],e[3]):t.call(n,e[0],e[1],e[2],e[3])}return t.apply(n,e)},vr=Ge,yr=ut,mr=Z,gr=mr.process,br=mr.setImmediate,_r=mr.clearImmediate,Sr=mr.MessageChannel,Or=mr.Dispatch,Er=0,wr={},jr=function(){var t=+this;if(wr.hasOwnProperty(t)){var e=wr[t];delete wr[t],e()}},Ar=function(t){jr.call(t.data)};br&&_r||(br=function(t){for(var e=arguments,n=[],r=1;arguments.length>r;)n.push(e[r++]);return wr[++Er]=function(){hr("function"==typeof t?t:Function(t),n)},$n(Er),Er},_r=function(t){delete wr[t]},"process"==Dt(gr)?$n=function(t){gr.nextTick(pr(jr,t,1))}:Or&&Or.now?$n=function(t){Or.now(pr(jr,t,1))}:Sr?(Yn=(Qn=new Sr).port2,Qn.port1.onmessage=Ar,$n=pr(Yn.postMessage,Yn,1)):mr.addEventListener&&"function"==typeof postMessage&&!mr.importScripts?($n=function(t){mr.postMessage(t+"","*")},mr.addEventListener("message",Ar,!1)):$n="onreadystatechange"in yr("script")?function(t){vr.appendChild(yr("script")).onreadystatechange=function(){vr.removeChild(this),jr.call(t)}}:function(t){setTimeout(pr(jr,t,1),0)});var Cr={set:br,clear:_r},Ir=Z,Tr=Cr.set,Nr=Ir.MutationObserver||Ir.WebKitMutationObserver,kr=Ir.process,xr=Ir.Promise,Mr="process"==Dt(kr),Pr=Ct,Lr={f:function(t){return new e(t)}},Fr=Lr,Rr=At,Dr=Z,zr=yt,Br=it,Jr=Ie("species"),Ur=Ie("iterator"),Wr=!1;try{var Gr=[7][Ur]();Gr.return=function(){Wr=!0},Array.from(Gr,function(){throw 2})}catch(t){}var Hr,Vr,Xr,qr=Z,Kr=Tt,$r=Me,Qr=Ft,Yr=et,Zr=Ct,to=function(t,e,n,r){if(!(t instanceof e)||void 0!==r&&r in t)throw TypeError(n+": incorrect invocation!");return t},eo=ur,no=function(t,e){var n,r=lr(t).constructor;return void 0===r||void 0==(n=lr(r)[dr])?e:fr(n)},ro=Cr.set,oo=function(){var t,e,n,r=function(){var r,o;for(Mr&&(r=kr.domain)&&r.exit();t;){o=t.fn,t=t.next;try{o()}catch(r){throw t?n():e=void 0,r}}e=void 0,r&&r.enter()};if(Mr)n=function(){kr.nextTick(r)};else if(Nr){var o=!0,i=document.createTextNode("");new Nr(r).observe(i,{characterData:!0}),n=function(){i.data=o=!o}}else if(xr&&xr.resolve){var a=xr.resolve();n=function(){a.then(r)}}else n=function(){Tr.call(Ir,r)};return function(r){var o={fn:r,next:void 0};e&&(e.next=o),t||(t=o,n()),e=o}}(),io=Lr,ao=function(t){try{return{e:!1,v:t()}}catch(t){return{e:!0,v:t}}},co=function(t,e){var n=Fr.f(t);return(0,n.resolve)(e),n.promise},so=qr.TypeError,uo=qr.process,lo=qr.Promise,fo="process"==$r(uo),po=function(){},ho=Vr=io.f,vo=!!function(){try{var t=lo.resolve(1),e=(t.constructor={})[Ie("species")]=function(t){t(po,po)};return(fo||"function"==typeof PromiseRejectionEvent)&&t.then(po)instanceof e}catch(t){}}(),yo=function(t,e){return t===e},mo=function(t){var e;return!(!Yr(t)||"function"!=typeof(e=t.then))&&e},go=function(t,e){if(!t._n){t._n=!0;var n=t._c;oo(function(){for(var r=t._v,o=1==t._s,i=0;n.length>i;)!function(e){var n,i,a=o?e.ok:e.fail,c=e.resolve,s=e.reject,u=e.domain;try{a?(o||(2==t._h&&So(t),t._h=1),!0===a?n=r:(u&&u.enter(),n=a(r),u&&u.exit()),n===e.promise?s(so("Promise-chain cycle")):(i=mo(n))?i.call(n,c,s):c(n)):s(r)}catch(t){s(t)}}(n[i++]);t._c=[],t._n=!1,e&&!t._h&&bo(t)})}},bo=function(t){ro.call(qr,function(){var e,n,r,o=t._v,i=_o(t);if(i&&(e=ao(function(){fo?uo.emit("unhandledRejection",o,t):(n=qr.onunhandledrejection)?n({promise:t,reason:o}):(r=qr.console)&&r.error&&r.error("Unhandled promise rejection",o)}),t._h=fo||_o(t)?2:1),t._a=void 0,i&&e.e)throw e.v})},_o=function(t){if(1==t._h)return!1;for(var e,n=t._a||t._c,r=0;n.length>r;)if((e=n[r++]).fail||!_o(e.promise))return!1;return!0},So=function(t){ro.call(qr,function(){var e;fo?uo.emit("rejectionHandled",t):(e=qr.onrejectionhandled)&&e({promise:t,reason:t._v})})},Oo=function(t){var e=this;e._d||(e._d=!0,(e=e._w||e)._v=t,e._s=2,e._a||(e._a=e._c.slice()),go(e,!0))},Eo=function(t){var e,n=this;if(!n._d){n._d=!0,n=n._w||n;try{if(n===t)throw so("Promise can't be resolved itself");(e=mo(t))?oo(function(){var r={_w:n,_d:!1};try{e.call(t,Kr(Eo,r,1),Kr(Oo,r,1))}catch(t){Oo.call(r,t)}}):(n._v=t,n._s=1,go(n,!1))}catch(t){Oo.call({_w:n,_d:!1},t)}}};vo||(lo=function(t){to(this,lo,"Promise","_h"),Zr(t),Hr.call(this);try{t(Kr(Eo,this,1),Kr(Oo,this,1))}catch(t){Oo.call(this,t)}},(Hr=function(t){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1}).prototype=function(t,e,n){for(var r in e)Rr(t,r,e[r],n);return t}(lo.prototype,{then:function(t,e){var n=ho(no(this,lo));return n.ok="function"!=typeof t||t,n.fail="function"==typeof e&&e,n.domain=fo?uo.domain:void 0,this._c.push(n),this._a&&this._a.push(n),this._s&&go(this,!1),n.promise},catch:function(t){return this.then(void 0,t)}}),Xr=function(){var t=new Hr;this.promise=t,this.resolve=Kr(Eo,t,1),this.reject=Kr(Oo,t,1)},io.f=ho=function(t){return yo(lo,t)?new Xr(t):Vr(t)}),Qr(Qr.G+Qr.W+Qr.F*!vo,{Promise:lo}),en(lo,"Promise"),function(t){var e=Dr[t];Br&&e&&!e[Jr]&&zr.f(e,Jr,{configurable:!0,get:function(){return this}})}("Promise"),tt.Promise,Qr(Qr.S+Qr.F*!vo,"Promise",{reject:function(t){var e=ho(this);return(0,e.reject)(t),e.promise}}),Qr(Qr.S+Qr.F*!vo,"Promise",{resolve:function(t){return t instanceof lo&&yo(t.constructor,this)?t:co(this,t)}}),Qr(Qr.S+Qr.F*!(vo&&function(t,e){if(!e&&!Wr)return!1;var n=!1;try{var r=[7],o=r[Ur]();o.next=function(){return{done:n=!0}},r[Ur]=function(){return o},t(r)}catch(t){}return n}(function(t){lo.all(t).catch(po)})),"Promise",{all:function(t){var e=this,n=ho(e),r=n.resolve,o=n.reject,i=ao(function(){var n=[],i=0,a=1;eo(t,!1,function(t){var c=i++,s=!1;n.push(void 0),a++,e.resolve(t).then(function(t){s||(s=!0,n[c]=t,--a||r(n))},o)}),--a||r(n)});return i.e&&o(i.v),n.promise},race:function(t){var e=this,n=ho(e),r=n.reject,o=ao(function(){eo(t,!1,function(t){e.resolve(t).then(n.resolve,r)})});return o.e&&r(o.v),n.promise}});var wo=["off","error","warn","info","log","debug"],jo={},Ao=global.console,Co=global.setTimeout,Io=global.setTimeoutNative;i();var To=1,No=function(t){this.instanceId=t,this.lastCallbackId=0,this.callbacks={}};No.prototype.add=function(t){return this.lastCallbackId++,this.callbacks[this.lastCallbackId]=t,this.lastCallbackId},No.prototype.remove=function(t){var e=this.callbacks[t];return delete this.callbacks[t],e},No.prototype.consume=function(t,e,n){var r=this.callbacks[t];return void 0!==n&&!1!==n||delete this.callbacks[t],"function"==typeof r?r(v(e)):new Error('invalid callback id "'+t+'"')},No.prototype.close=function(){this.callbacks={}};var ko={},xo=function(){this.nodeId=l(),this.ref=this.nodeId,this.children=[],this.pureChildren=[],this.parentNode=null,this.nextSibling=null,this.previousSibling=null};xo.prototype.destroy=function(){var t=m(this.docId);t&&(delete this.docId,delete t.nodeMap[this.nodeId]),this.children.forEach(function(t){t.destroy()})};var Mo,Po={},Lo=/\[\[((?:.|\n)+?)\]\]/g,Fo="div",Ro=["click","longpress","touchstart","touchmove","touchend","panstart","panmove","panend","horizontalpan","verticalpan","swipe"],Do=function(t){function e(e,n,r){void 0===e&&(e=Fo),t.call(this);var o=N(e);if(o&&!r)return new o(n);n=n||{},this.nodeType=1,this.nodeId=l(),this.ref=this.nodeId,this.type=e,this.attr=n.attr||{},this.style=n.style||{},this.classStyle=n.classStyle||{},this.event={},this.children=[],this.pureChildren=[]}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.appendChild=function(t){if(!t.parentNode||t.parentNode===this)if(t.parentNode){if(C(t,this.children,this.children.length,!0),1===t.nodeType){var e=C(t,this.pureChildren,this.pureChildren.length),n=b(this.docId);if(n&&e>=0)return n.send("dom",{action:"moveElement"},[t.ref,this.ref,e])}}else if(E(t,this),A(t,this.children,this.children.length,!0),this.docId&&P(this.docId,t),1===t.nodeType){A(t,this.pureChildren,this.pureChildren.length);var r=b(this.docId);if(r)return r.send("dom",{action:"addElement"},[this.ref,t.toJSON(),-1])}},e.prototype.insertBefore=function(t,e){if(!(t.parentNode&&t.parentNode!==this||t===e||t.nextSibling&&t.nextSibling===e))if(t.parentNode){if(C(t,this.children,this.children.indexOf(e),!0),1===t.nodeType){var n=w(e),r=C(t,this.pureChildren,n?this.pureChildren.indexOf(n):this.pureChildren.length),o=b(this.docId);if(o&&r>=0)return o.send("dom",{action:"moveElement"},[t.ref,this.ref,r])}}else if(E(t,this),A(t,this.children,this.children.indexOf(e),!0),this.docId&&P(this.docId,t),1===t.nodeType){var i=w(e),a=A(t,this.pureChildren,i?this.pureChildren.indexOf(i):this.pureChildren.length),c=b(this.docId);if(c)return c.send("dom",{action:"addElement"},[this.ref,t.toJSON(),a])}},e.prototype.insertAfter=function(t,e){if(!(t.parentNode&&t.parentNode!==this||t===e||t.previousSibling&&t.previousSibling===e))if(t.parentNode){if(C(t,this.children,this.children.indexOf(e)+1,!0),1===t.nodeType){var n=C(t,this.pureChildren,this.pureChildren.indexOf(j(e))+1),r=b(this.docId);if(r&&n>=0)return r.send("dom",{action:"moveElement"},[t.ref,this.ref,n])}}else if(E(t,this),A(t,this.children,this.children.indexOf(e)+1,!0),this.docId&&P(this.docId,t),1===t.nodeType){var o=A(t,this.pureChildren,this.pureChildren.indexOf(j(e))+1),i=b(this.docId);if(i)return i.send("dom",{action:"addElement"},[this.ref,t.toJSON(),o])}},e.prototype.removeChild=function(t,e){if(t.parentNode&&(I(t,this.children,!0),1===t.nodeType)){I(t,this.pureChildren);var n=b(this.docId);n&&n.send("dom",{action:"removeElement"},[t.ref])}e||t.destroy()},e.prototype.clear=function(){var t=b(this.docId);t&&this.pureChildren.forEach(function(e){t.send("dom",{action:"removeElement"},[e.ref])}),this.children.forEach(function(t){t.destroy()}),this.children.length=0,this.pureChildren.length=0},e.prototype.setAttr=function(t,e,n){if(this.attr[t]!==e||!1===n){this.attr[t]=e;var r=b(this.docId);if(!n&&r){var o={};o[t]=M(e),r.send("dom",{action:"updateAttrs"},[this.ref,o])}}},e.prototype.setStyle=function(t,e,n){if(this.style[t]!==e||!1===n){this.style[t]=e;var r=b(this.docId);if(!n&&r){var o={};o[t]=e,r.send("dom",{action:"updateStyle"},[this.ref,o])}}},e.prototype.setClassStyle=function(t){var e=this;for(var n in this.classStyle)e.classStyle[n]="";Object.assign(this.classStyle,t);var r=b(this.docId);r&&r.send("dom",{action:"updateStyle"},[this.ref,this.toStyle()])},e.prototype.addEvent=function(t,e,n){if(this.event||(this.event={}),!this.event[t]){this.event[t]={handler:e,params:n};var r=b(this.docId);r&&r.send("dom",{action:"addEvent"},[this.ref,t])}},e.prototype.removeEvent=function(t){if(this.event&&this.event[t]){delete this.event[t];var e=b(this.docId);e&&e.send("dom",{action:"removeEvent"},[this.ref,t])}},e.prototype.fireEvent=function(t,e,n,r){var o=null,i=!1,a=this.event[t];if(a&&e){var c=a.handler;e.stopPropagation=function(){i=!0},o=r&&r.params?c.call.apply(c,[this].concat(r.params,[e])):c.call(this,e)}return!i&&n&&Ro.includes(t)&&this.parentNode&&this.parentNode.fireEvent&&(e.currentTarget=this.parentNode,this.parentNode.fireEvent(t,e,n)),o},e.prototype.toStyle=function(){return Object.assign({},this.classStyle,this.style)},e.prototype.toJSON=function(){var t=this,e={ref:this.ref.toString(),type:this.type,attr:M(this.attr),style:this.toStyle()},n=[];for(var r in this.event){var o=t.event[r].params;o?n.push({type:r,params:o}):n.push(r)}return n.length&&(e.event=n),this.pureChildren.length&&(e.children=this.pureChildren.map(function(t){return t.toJSON()})),e},e.prototype.toString=function(){return"<"+this.type+" attr="+JSON.stringify(this.attr)+" style="+JSON.stringify(this.toStyle())+">"+this.pureChildren.map(function(t){return t.toString()}).join("")+"</"+this.type+">"},e}(xo);!function(t){Mo=t}(Do);var zo=function(){},Bo=function(t,e){Object.defineProperty(this,"instanceId",{enumerable:!0,value:t}),Object.defineProperty(this,"callbackManager",{enumerable:!0,value:new No(t)}),zo=e||function(){}};Bo.prototype.callback=function(t,e,n){return this.callbackManager.consume(t,e,n)},Bo.prototype.destroyCallback=function(){return this.callbackManager.close()},Bo.prototype.normalize=function(t){var e=f(t);return t&&t instanceof Do?t.ref:t&&t._isVue&&t.$el instanceof Do?t.$el.ref:"Function"===e?this.callbackManager.add(t).toString():h(t)},Bo.prototype.send=function(t,e,n,r){var o=this,i=e.action,a=e.component,c=e.ref,s=e.module,u=e.method;switch(n=n.map(function(t){return o.normalize(t)}),t){case"dom":return this[i](this.instanceId,n);case"component":return this.componentHandler(this.instanceId,c,u,n,Object.assign({component:a},r));default:return this.moduleHandler(this.instanceId,s,u,n,r)}},Bo.prototype.callDOM=function(t,e){return this[t](this.instanceId,e)},Bo.prototype.callComponent=function(t,e,n,r){return this.componentHandler(this.instanceId,t,e,n,r)},Bo.prototype.callModule=function(t,e,n,r){return this.moduleHandler(this.instanceId,t,e,n,r)};var Jo,Uo,Wo=[],Go=/^\s*\/\/ *(\{[^}]*\}) *\r?\n/,Ho={},Vo={createInstance:function(t,e,n,r){if(Ho[t])return new Error('invalid instance id "'+t+'"');var o=B(e);(n=JSON.parse(JSON.stringify(n||{}))).env=JSON.parse(JSON.stringify(global.WXEnvironment||{}));var i={config:n,created:Date.now(),framework:o};i.services=J(t,i,Uo),Ho[t]=i;var a=Jo[o];return a?a.createInstance(t,e,n,r,i):new Error('invalid bundle type "'+o+'".')},registerService:F,unregisterService:R},Xo=function(t){function e(e){t.call(this),this.nodeType=8,this.nodeId=l(),this.ref=this.nodeId,this.type="comment",this.value=e,this.children=[],this.pureChildren=[]}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.toString=function(){return"\x3c!-- "+this.value+" --\x3e"},e}(xo),qo=function(t,e){this.id=t,this.batched=!1,this.updates=[],"function"==typeof e?Object.defineProperty(this,"handler",{configurable:!0,enumerable:!0,writable:!0,value:e}):console.error("[JS Runtime] invalid parameter, handler must be a function")};qo.prototype.createFinish=function(t){return(0,this.handler)([X("createFinish")],t)},qo.prototype.updateFinish=function(t){return(0,this.handler)([X("updateFinish")],t)},qo.prototype.refreshFinish=function(t){return(0,this.handler)([X("refreshFinish")],t)},qo.prototype.createBody=function(t){var e=t.toJSON(),n=e.children;delete e.children;var r=[X("createBody",[e])];return n&&r.push.apply(r,n.map(function(t){return X("addElement",[e.ref,t,-1])})),this.addActions(r)},qo.prototype.addElement=function(t,e,n){return n>=0||(n=-1),this.addActions(X("addElement",[e,t.toJSON(),n]))},qo.prototype.removeElement=function(t){if(Array.isArray(t)){var e=t.map(function(t){return X("removeElement",[t])});return this.addActions(e)}return this.addActions(X("removeElement",[t]))},qo.prototype.moveElement=function(t,e,n){return this.addActions(X("moveElement",[t,e,n]))},qo.prototype.setAttr=function(t,e,n){var r={};return r[e]=n,this.addActions(X("updateAttrs",[t,r]))},qo.prototype.setStyle=function(t,e,n){var r={};return r[e]=n,this.addActions(X("updateStyle",[t,r]))},qo.prototype.setStyles=function(t,e){return this.addActions(X("updateStyle",[t,e]))},qo.prototype.addEvent=function(t,e){return this.addActions(X("addEvent",[t,e]))},qo.prototype.removeEvent=function(t,e){return this.addActions(X("removeEvent",[t,e]))},qo.prototype.handler=function(t,e){return e&&e()},qo.prototype.addActions=function(t){var e=this.updates,n=this.handler;if(Array.isArray(t)||(t=[t]),!this.batched)return n(t);e.push.apply(e,t)};var Ko={createBody:"callCreateBody",addElement:"callAddElement",removeElement:"callRemoveElement",moveElement:"callMoveElement",updateAttrs:"callUpdateAttrs",updateStyle:"callUpdateStyle",addEvent:"callAddEvent",removeEvent:"callRemoveEvent"},$o=function t(e,n,r){e=e?e.toString():"",this.id=e,this.URL=n,y(e,this),this.nodeMap={};var o=t.Listener||qo;this.listener=new o(e,r||q(e,t.handler)),this.taskCenter=new Bo(e,r?function(t){for(var e=[],n=arguments.length-1;n-- >0;)e[n]=arguments[n+1];return r.apply(void 0,e)}:t.handler),this.createDocumentElement()};$o.prototype.getRef=function(t){return this.nodeMap[t]},$o.prototype.open=function(){this.listener.batched=!1},$o.prototype.close=function(){this.listener.batched=!0},$o.prototype.createDocumentElement=function(){var t=this;if(!this.documentElement){var e=new Do("document");e.docId=this.id,e.ownerDocument=this,e.role="documentElement",e.depth=0,e.ref="_documentElement",this.nodeMap._documentElement=e,this.documentElement=e,Object.defineProperty(e,"appendChild",{configurable:!0,enumerable:!0,writable:!0,value:function(e){_(t,e)}}),Object.defineProperty(e,"insertBefore",{configurable:!0,enumerable:!0,writable:!0,value:function(e,n){_(t,e,n)}})}return this.documentElement},$o.prototype.createBody=function(t,e){return this.body||O(this,new Do(t,e)),this.body},$o.prototype.createElement=function(t,e){return new Do(t,e)},$o.prototype.createComment=function(t){return new Xo(t)},$o.prototype.fireEvent=function(t,e,n,r,o){if(t){(n=n||{}).type=e,n.target=t,n.currentTarget=t,n.timestamp=Date.now(),r&&Q(t,r);var i="true"===this.getRef("_root").attr.bubble;return t.fireEvent(e,n,i,o)}},$o.prototype.destroy=function(){this.taskCenter.destroyCallback(),delete this.listener,delete this.nodeMap,delete this.taskCenter,g(this.id)},$o.handler=null;var Qo={Document:$o,Element:Do,Comment:Xo,Listener:qo,TaskCenter:Bo,sendTasks:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];return"function"==typeof callNative?callNative.apply(void 0,t):(global.callNative||function(){}).apply(void 0,t)}};return $o.handler=Qo.sendTasks,{setNativeConsole:function(){if(n(),global.WXEnvironment&&"Web"!==global.WXEnvironment.platform)global.console={debug:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("debug")&&global.nativeLog.apply(global,o(t).concat(["__DEBUG"]))},log:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("log")&&global.nativeLog.apply(global,o(t).concat(["__LOG"]))},info:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("info")&&global.nativeLog.apply(global,o(t).concat(["__INFO"]))},warn:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("warn")&&global.nativeLog.apply(global,o(t).concat(["__WARN"]))},error:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("error")&&global.nativeLog.apply(global,o(t).concat(["__ERROR"]))}};else{var t=console.debug,e=console.log,i=console.info,a=console.warn,c=console.error;console.__ori__={debug:t,log:e,info:i,warn:a,error:c},console.debug=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("debug")&&console.__ori__.debug.apply(console,t)},console.log=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("log")&&console.__ori__.log.apply(console,t)},console.info=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("info")&&console.__ori__.info.apply(console,t)},console.warn=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("warn")&&console.__ori__.warn.apply(console,t)},console.error=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];r("error")&&console.__ori__.error.apply(console,t)}}},resetNativeConsole:function(){jo={},global.console=Ao},setNativeTimer:i,resetNativeTimer:function(){global.setTimeout=Co,global.setTimeoutCallback=null},service:{register:F,unregister:R,has:D},freezePrototype:function(){a(),Object.freeze(Qo.Element),Object.freeze(Qo.Comment),Object.freeze(Qo.Listener),Object.freeze(Qo.Document.prototype),Object.freeze(Qo.Element.prototype),Object.freeze(Qo.Comment.prototype),Object.freeze(Qo.Listener.prototype)},init:function(t){Jo=(Uo=t||{}).frameworks||{},L();for(var e in Jo)Jo[e].init(t);return["registerComponents","registerModules","registerMethods"].forEach(W),["destroyInstance","refreshInstance","receiveTasks","getRoot"].forEach(H),V("receiveTasks","callJS"),Vo},config:Qo}});
