// { "framework": "Vue" }
"use weex:vue";

!function(t){var e={};function n(r){if(e[r])return e[r].exports;var o=e[r]={i:r,l:!1,exports:{}};return t[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}n.m=t,n.c=e,n.d=function(t,e,r){n.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},n.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return n.d(e,"a",e),e},n.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},n.p="",n(n.s=38)}([function(t,e){var n=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=n)},function(t,e){var n={}.hasOwnProperty;t.exports=function(t,e){return n.call(t,e)}},function(t,e,n){var r=n(3),o=n(11);t.exports=n(4)?function(t,e,n){return r.f(t,e,o(1,n))}:function(t,e,n){return t[e]=n,t}},function(t,e,n){var r=n(9),o=n(30),i=n(16),a=Object.defineProperty;e.f=n(4)?Object.defineProperty:function(t,e,n){if(r(t),e=i(e,!0),r(n),o)try{return a(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}},function(t,e,n){t.exports=!n(10)(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(52),o=n(14);t.exports=function(t){return r(o(t))}},function(t,e,n){var r=n(20)("wks"),o=n(12),i=n(0).Symbol,a="function"==typeof i;(t.exports=function(t){return r[t]||(r[t]=a&&i[t]||(a?i:o)("Symbol."+t))}).store=r},function(t,e){t.exports=function(t){return"object"==typeof t?null!==t:"function"==typeof t}},function(t,e){var n=t.exports={version:"2.5.3"};"number"==typeof __e&&(__e=n)},function(t,e,n){var r=n(7);t.exports=function(t){if(!r(t))throw TypeError(t+" is not an object!");return t}},function(t,e){t.exports=function(t){try{return!!t()}catch(t){return!0}}},function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},function(t,e){var n=0,r=Math.random();t.exports=function(t){return"Symbol(".concat(void 0===t?"":t,")_",(++n+r).toString(36))}},function(t,e){var n=Math.ceil,r=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?r:n)(t)}},function(t,e){t.exports=function(t){if(void 0==t)throw TypeError("Can't call method on  "+t);return t}},function(t,e){t.exports=!0},function(t,e,n){var r=n(7);t.exports=function(t,e){if(!r(t))return t;var n,o;if(e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;if("function"==typeof(n=t.valueOf)&&!r(o=n.call(t)))return o;if(!e&&"function"==typeof(n=t.toString)&&!r(o=n.call(t)))return o;throw TypeError("Can't convert object to primitive value")}},function(t,e){t.exports={}},function(t,e,n){var r=n(34),o=n(21);t.exports=Object.keys||function(t){return r(t,o)}},function(t,e,n){var r=n(20)("keys"),o=n(12);t.exports=function(t){return r[t]||(r[t]=o(t))}},function(t,e,n){var r=n(0),o=r["__core-js_shared__"]||(r["__core-js_shared__"]={});t.exports=function(t){return o[t]||(o[t]={})}},function(t,e){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},function(t,e,n){var r=n(3).f,o=n(1),i=n(6)("toStringTag");t.exports=function(t,e,n){t&&!o(t=n?t:t.prototype,i)&&r(t,i,{configurable:!0,value:e})}},function(t,e,n){e.f=n(6)},function(t,e,n){var r=n(0),o=n(8),i=n(15),a=n(23),u=n(3).f;t.exports=function(t){var e=o.Symbol||(o.Symbol=i?{}:r.Symbol||{});"_"==t.charAt(0)||t in e||u(e,t,{value:a.f(t)})}},function(t,e){e.f={}.propertyIsEnumerable},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0}),e.fetchNews=e.fetchDoodle=e.readAbout=e.saveAbout=e.fetchAbout=e.readGuide=e.saveGuide=e.fetchGuide=e.readExamples=e.saveExamples=e.fetchExamples=void 0;var r=i(n(42)),o=i(n(27));function i(t){return t&&t.__esModule?t:{default:t}}e.createLink=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=[];for(var r in e)"string"==typeof e[r]&&n.push(s(r)+"="+s(e[r]));if("Web"===WXEnvironment.platform)return n.unshift("page="+t+".web.js"),"/?"+n.join("&");return""+function(){var t=weex.config.bundleUrl,e=t.indexOf("your_current_IP")>=0||t.indexOf("file://assets/")>=0,n=t.indexOf("file:///")>=0&&t.indexOf("WeexDemo.app")>0;if(e)return"file://assets/";if(n)return t.substring(0,t.lastIndexOf("/")+1);return""}()+t+".weex.js"+(n.length?"?"+n.join("&"):"")},e.createURL=f,e.i18n=l,e.parseLanguage=d,e.setLanguage=function(t){var e=d(t);e&&u.setItem("WEEX_PLAYGROUND_LANGUAGE",e)},e.clearStorageLanguage=function(){u.removeItem("WEEX_PLAYGROUND_LANGUAGE")},e.getStorageLanguage=v,e.getSystemLanguage=g,e.getLanguage=y,e.jumpTo=function(t,e,n){y(function(r){u.setItem("CURRENT_DOCUMENT_URL",l(t,n||r)),c.push({url:f("bf0305c14b511b24a4e616f53926432b",{language:r,title:l(e,n||r)})})})},e.viewSource=function(t){y(function(e){c.push({url:f("f6ce29faf686eabc38b410bf4828fa5a",{hash:t,language:e})})})},e.setTitleBar=function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"en";if("[object Object]"!==Object.prototype.toString.apply(t))return;var n=weex.requireModule("titleBar");if(t.color||t.backgroundColor)try{n.setStyle({foregroundColor:t.color||"#FFFFFF",backgroundColor:t.backgroundColor||"#00B4FF"})}catch(t){}var r=l(t.title,e);if(r)try{n.setTitle(r)}catch(t){}},e.fetchData=_,e.saveData=x,e.readData=b;var a=weex.requireModule("stream"),u=weex.requireModule("storage"),c=weex.requireModule("navigator"),s="function"==typeof encodeURIComponent?encodeURIComponent:"function"==typeof encodeURI?encodeURI:function(t){return t};function f(t,e){if("Web"===WXEnvironment.platform)return"http://dotwe.org/raw/htmlVue/"+t;var n="http://dotwe.org/raw/dist/"+t+".bundle.wx",r=function(t){if(!t||"object"!==(void 0===t?"undefined":(0,o.default)(t)))return"";var e=[];for(var n in t)"string"==typeof t[n]&&e.push(s(n)+"="+s(t[n]));return e.join("&")}(e);return"TB"===WXEnvironment.appName?n+"?_wx_tpl="+n+"&"+r:"WXSample"===WXEnvironment.appName?n+"?"+r:n+"?wx_weex=true&"+r}function l(t,e){return"string"==typeof t?t:"[object Object]"===Object.prototype.toString.call(t)?t[this&&this.language||e||"en"]:void 0}var p=/(en|zh)\_?\w*/i;function d(t){var e=p.exec(t+"");return e&&e[1]?e[1]:""}function v(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){};if("function"!==!(void 0===t||(0,o.default)(t)))try{u.getItem("WEEX_PLAYGROUND_LANGUAGE",function(n){if("success"===n.result){var r=d(n.data);r?t(r):e()}else e(n)})}catch(t){e(t)}}function g(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){};if("function"!==!(void 0===t||(0,o.default)(t)))if("web"===WXEnvironment.platform.toLowerCase()){var n=d(window.navigator.language);n?t(n):e()}else try{var r=weex.requireModule("locale")||weex.requireModule("local"),i=!1,a=d(r.getLanguage(function(n){var r=d(n);r?i||t(r):e()}));a?(i=!0,t(a)):e()}catch(t){e(t)}}var h=/.+[\?\&]{1}language=([\d\w]+)[\?\&]?.*/i;function y(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:function(){},e=h.exec(weex.config.bundleUrl||""),n=d(e&&e[1]);n?t(n):v(t,function(){g(t,function(){t("en")})})}var m={doodle:"WEEX_PLAYGROUND_APP_DOODLE",guide:"WEEX_PLAYGROUND_APP_GUIDE",examples:"WEEX_PLAYGROUND_APP_EXAMPLES",news:"WEEX_PLAYGROUND_APP_NEWS",about:"WEEX_PLAYGROUND_APP_ABOUT"};function _(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){};try{a.fetch({url:"http://dotwe.org/query/weex-playground-app",method:"post",headers:{"Content-Type":"application/x-www-form-urlencoded"},type:"json",body:"name="+t},function(t){t.ok&&t.data&&t.data.success?e(t.data):n(t)})}catch(t){n(t)}}function x(t,e){var n=m[t];n&&e&&"object"===(void 0===e?"undefined":(0,o.default)(e))&&(e.timestamp=Date.now(),u.setItem(n,(0,r.default)(e)))}function b(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:function(){},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:function(){},r=m[t];if(!r)return n();try{u.getItem(r,function(r){if("success"===r.result){var o=JSON.parse(r.data);if(o&&Array.isArray(o[t]))return e(o[t])}n(r)})}catch(t){n(t)}}e.fetchExamples=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return _.apply(void 0,["examples"].concat(e))},e.saveExamples=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return x.apply(void 0,["examples"].concat(e))},e.readExamples=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return b.apply(void 0,["examples"].concat(e))},e.fetchGuide=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return _.apply(void 0,["guide"].concat(e))},e.saveGuide=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return x.apply(void 0,["guide"].concat(e))},e.readGuide=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return b.apply(void 0,["guide"].concat(e))},e.fetchAbout=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return _.apply(void 0,["about"].concat(e))},e.saveAbout=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return x.apply(void 0,["about"].concat(e))},e.readAbout=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return b.apply(void 0,["about"].concat(e))},e.fetchDoodle=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return _.apply(void 0,["doodle"].concat(e))},e.fetchNews=function(){for(var t=arguments.length,e=Array(t),n=0;n<t;n++)e[n]=arguments[n];return _.apply(void 0,["news"].concat(e))}},function(t,e,n){"use strict";e.__esModule=!0;var r=a(n(44)),o=a(n(63)),i="function"==typeof o.default&&"symbol"==typeof r.default?function(t){return typeof t}:function(t){return t&&"function"==typeof o.default&&t.constructor===o.default&&t!==o.default.prototype?"symbol":typeof t};function a(t){return t&&t.__esModule?t:{default:t}}e.default="function"==typeof o.default&&"symbol"===i(r.default)?function(t){return void 0===t?"undefined":i(t)}:function(t){return t&&"function"==typeof o.default&&t.constructor===o.default&&t!==o.default.prototype?"symbol":void 0===t?"undefined":i(t)}},function(t,e,n){"use strict";var r=n(15),o=n(29),i=n(32),a=n(2),u=n(1),c=n(17),s=n(50),f=n(22),l=n(57),p=n(6)("iterator"),d=!([].keys&&"next"in[].keys()),v=function(){return this};t.exports=function(t,e,n,g,h,y,m){s(n,e,g);var _,x,b,w=function(t){if(!d&&t in j)return j[t];switch(t){case"keys":case"values":return function(){return new n(this,t)}}return function(){return new n(this,t)}},S=e+" Iterator",O="values"==h,E=!1,j=t.prototype,A=j[p]||j["@@iterator"]||h&&j[h],L=!d&&A||w(h),C=h?O?w("entries"):L:void 0,P="Array"==e&&j.entries||A;if(P&&(b=l(P.call(new t)))!==Object.prototype&&b.next&&(f(b,S,!0),r||u(b,p)||a(b,p,v)),O&&A&&"values"!==A.name&&(E=!0,L=function(){return A.call(this)}),r&&!m||!d&&!E&&j[p]||a(j,p,L),c[e]=L,c[S]=v,h)if(_={values:O?L:w("values"),keys:y?L:w("keys"),entries:C},m)for(x in _)x in j||i(j,x,_[x]);else o(o.P+o.F*(d||E),e,_);return _}},function(t,e,n){var r=n(0),o=n(8),i=n(48),a=n(2),u=function(t,e,n){var c,s,f,l=t&u.F,p=t&u.G,d=t&u.S,v=t&u.P,g=t&u.B,h=t&u.W,y=p?o:o[e]||(o[e]={}),m=y.prototype,_=p?r:d?r[e]:(r[e]||{}).prototype;for(c in p&&(n=e),n)(s=!l&&_&&void 0!==_[c])&&c in y||(f=s?_[c]:n[c],y[c]=p&&"function"!=typeof _[c]?n[c]:g&&s?i(f,r):h&&_[c]==f?function(t){var e=function(e,n,r){if(this instanceof t){switch(arguments.length){case 0:return new t;case 1:return new t(e);case 2:return new t(e,n)}return new t(e,n,r)}return t.apply(this,arguments)};return e.prototype=t.prototype,e}(f):v&&"function"==typeof f?i(Function.call,f):f,v&&((y.virtual||(y.virtual={}))[c]=f,t&u.R&&m&&!m[c]&&a(m,c,f)))};u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,t.exports=u},function(t,e,n){t.exports=!n(4)&&!n(10)(function(){return 7!=Object.defineProperty(n(31)("div"),"a",{get:function(){return 7}}).a})},function(t,e,n){var r=n(7),o=n(0).document,i=r(o)&&r(o.createElement);t.exports=function(t){return i?o.createElement(t):{}}},function(t,e,n){t.exports=n(2)},function(t,e,n){var r=n(9),o=n(51),i=n(21),a=n(19)("IE_PROTO"),u=function(){},c=function(){var t,e=n(31)("iframe"),r=i.length;for(e.style.display="none",n(56).appendChild(e),e.src="javascript:",(t=e.contentWindow.document).open(),t.write("<script>document.F=Object<\/script>"),t.close(),c=t.F;r--;)delete c.prototype[i[r]];return c()};t.exports=Object.create||function(t,e){var n;return null!==t?(u.prototype=r(t),n=new u,u.prototype=null,n[a]=t):n=c(),void 0===e?n:o(n,e)}},function(t,e,n){var r=n(1),o=n(5),i=n(53)(!1),a=n(19)("IE_PROTO");t.exports=function(t,e){var n,u=o(t),c=0,s=[];for(n in u)n!=a&&r(u,n)&&s.push(n);for(;e.length>c;)r(u,n=e[c++])&&(~i(s,n)||s.push(n));return s}},function(t,e){var n={}.toString;t.exports=function(t){return n.call(t).slice(8,-1)}},function(t,e){e.f=Object.getOwnPropertySymbols},function(t,e,n){var r=n(34),o=n(21).concat("length","prototype");e.f=Object.getOwnPropertyNames||function(t){return r(t,o)}},function(t,e,n){"use strict";var r=i(n(39)),o=i(n(79));function i(t){return t&&t.__esModule?t:{default:t}}Vue.mixin(o.default),r.default.el="#root",new Vue(r.default)},function(t,e,n){var r,o,i=[];i.push(n(40)),r=n(41);var a=n(78);o=r=r||{},"object"!=typeof r.default&&"function"!=typeof r.default||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t})&&console.error("named exports are not supported in *.vue files."),o=r=r.default),"function"==typeof o&&(o=o.options),o.__file="/Users/Hanks/Codes/work/weex-vue-examples/src/pages/About.vue",o.render=a.render,o.staticRenderFns=a.staticRenderFns,o._scopeId="data-v-6a7331ce",o.style=o.style||{},i.forEach(function(t){for(var e in t)o.style[e]=t[e]}),"function"==typeof __register_static_styles__&&__register_static_styles__(o._scopeId,i),t.exports=r},function(t,e){t.exports={list:{backgroundColor:"#F5F5F5"},item:{paddingTop:"30",paddingBottom:"30",paddingLeft:"60",paddingRight:"40",borderBottomWidth:"1",borderBottomStyle:"solid",borderBottomColor:"#E6E6E6",backgroundColor:"#FFFFFF",flexDirection:"row",justifyContent:"space-between",alignItems:"center"},"item-1":{borderTopWidth:"1",borderTopStyle:"solid",borderTopColor:"#E6E6E6"},"item-title":{fontSize:"42",color:"#606060"},"item-value":{fontSize:"36",color:"#999999"},"arrow-icon":{width:"22",height:"36"},copyright:{marginTop:"50",paddingBottom:"20"},"copyright-text":{fontSize:"22",color:"#A0A0A0",textAlign:"center"}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}(n(26)),i=n(74),a=(r=i)&&r.__esModule?r:{default:r};var u=weex.requireModule("picker"),c=new BroadcastChannel("language"),s={en:"Follow System",zh:"跟随系统"};e.default={components:{AppInfoCard:a.default},data:function(){return{language:"en",followSystem:!0,navigationBarOptions:{title:{zh:"关于 Weex",en:"About Weex"}},tips:{LANGUAGE:{en:"Language",zh:"语言"}},items:[{title:{en:"Weex Official Website",zh:"Weex 官方网站"},link:{en:"http://weex-project.io/",zh:"http://weex-project.io/cn/"}},{title:{en:"Apache Software Foundation",zh:"Apache 软件基金会"},link:"http://www.apache.org/"},{title:{en:"Who is using Weex",zh:"谁在使用 Weex"},link:{en:"http://weex-project.io/who-is-using-weex.html",zh:"http://weex-project.io/cn/who-is-using-weex.html"}},{title:{en:"Contribution",zh:"参与贡献"},link:{en:"http://weex-project.io/guide/contributing.html",zh:"http://weex-project.io/cn/guide/contributing.html"}},{title:{en:"Release Note",zh:"版本变更"},link:{en:"http://weex-project.io/releasenote.html",zh:"http://weex-project.io/cn/releasenote.html"}},{title:{en:"FAQ",zh:"常见问题"},link:{en:"http://weex-project.io/faq.html",zh:"http://weex-project.io/cn/faq.html"}}]}},watch:{language:function(){c.postMessage({language:this.language})}},computed:{languageName:function(){return this.followSystem?this.i18n(s):this.i18n({en:"English",zh:"简体中文"})}},created:function(){var t=this;o.readAbout(function(e){t.items=e}),o.getStorageLanguage(function(e){return t.followSystem=!1},function(){return t.followSystem=!0})},methods:{chooseLanguage:function(){var t=this,e=["","en","zh"],n=this.followSystem?0:e.indexOf(this.language);u.pick({index:n,items:[this.i18n(s),"English","中文"]},function(n){var r=n.result,i=n.data;if("success"===r){var a=e[i];a?(t.followSystem=!1,t.language=a,o.setLanguage(a)):(t.followSystem=!0,o.clearStorageLanguage(),o.getSystemLanguage(function(e){t.language=e},function(e){t.language="en"}))}})}}}},function(t,e,n){t.exports={default:n(43),__esModule:!0}},function(t,e,n){var r=n(8),o=r.JSON||(r.JSON={stringify:JSON.stringify});t.exports=function(t){return o.stringify.apply(o,arguments)}},function(t,e,n){t.exports={default:n(45),__esModule:!0}},function(t,e,n){n(46),n(59),t.exports=n(23).f("iterator")},function(t,e,n){"use strict";var r=n(47)(!0);n(28)(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=r(e,n),this._i+=t.length,{value:t,done:!1})})},function(t,e,n){var r=n(13),o=n(14);t.exports=function(t){return function(e,n){var i,a,u=String(o(e)),c=r(n),s=u.length;return c<0||c>=s?t?"":void 0:(i=u.charCodeAt(c))<55296||i>56319||c+1===s||(a=u.charCodeAt(c+1))<56320||a>57343?t?u.charAt(c):i:t?u.slice(c,c+2):a-56320+(i-55296<<10)+65536}}},function(t,e,n){var r=n(49);t.exports=function(t,e,n){if(r(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)}}},function(t,e){t.exports=function(t){if("function"!=typeof t)throw TypeError(t+" is not a function!");return t}},function(t,e,n){"use strict";var r=n(33),o=n(11),i=n(22),a={};n(2)(a,n(6)("iterator"),function(){return this}),t.exports=function(t,e,n){t.prototype=r(a,{next:o(1,n)}),i(t,e+" Iterator")}},function(t,e,n){var r=n(3),o=n(9),i=n(18);t.exports=n(4)?Object.defineProperties:function(t,e){o(t);for(var n,a=i(e),u=a.length,c=0;u>c;)r.f(t,n=a[c++],e[n]);return t}},function(t,e,n){var r=n(35);t.exports=Object("z").propertyIsEnumerable(0)?Object:function(t){return"String"==r(t)?t.split(""):Object(t)}},function(t,e,n){var r=n(5),o=n(54),i=n(55);t.exports=function(t){return function(e,n,a){var u,c=r(e),s=o(c.length),f=i(a,s);if(t&&n!=n){for(;s>f;)if((u=c[f++])!=u)return!0}else for(;s>f;f++)if((t||f in c)&&c[f]===n)return t||f||0;return!t&&-1}}},function(t,e,n){var r=n(13),o=Math.min;t.exports=function(t){return t>0?o(r(t),9007199254740991):0}},function(t,e,n){var r=n(13),o=Math.max,i=Math.min;t.exports=function(t,e){return(t=r(t))<0?o(t+e,0):i(t,e)}},function(t,e,n){var r=n(0).document;t.exports=r&&r.documentElement},function(t,e,n){var r=n(1),o=n(58),i=n(19)("IE_PROTO"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=o(t),r(t,i)?t[i]:"function"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},function(t,e,n){var r=n(14);t.exports=function(t){return Object(r(t))}},function(t,e,n){n(60);for(var r=n(0),o=n(2),i=n(17),a=n(6)("toStringTag"),u="CSSRuleList,CSSStyleDeclaration,CSSValueList,ClientRectList,DOMRectList,DOMStringList,DOMTokenList,DataTransferItemList,FileList,HTMLAllCollection,HTMLCollection,HTMLFormElement,HTMLSelectElement,MediaList,MimeTypeArray,NamedNodeMap,NodeList,PaintRequestList,Plugin,PluginArray,SVGLengthList,SVGNumberList,SVGPathSegList,SVGPointList,SVGStringList,SVGTransformList,SourceBufferList,StyleSheetList,TextTrackCueList,TextTrackList,TouchList".split(","),c=0;c<u.length;c++){var s=u[c],f=r[s],l=f&&f.prototype;l&&!l[a]&&o(l,a,s),i[s]=i.Array}},function(t,e,n){"use strict";var r=n(61),o=n(62),i=n(17),a=n(5);t.exports=n(28)(Array,"Array",function(t,e){this._t=a(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,o(1)):o(0,"keys"==e?n:"values"==e?t[n]:[n,t[n]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},function(t,e){t.exports=function(){}},function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},function(t,e,n){t.exports={default:n(64),__esModule:!0}},function(t,e,n){n(65),n(71),n(72),n(73),t.exports=n(8).Symbol},function(t,e,n){"use strict";var r=n(0),o=n(1),i=n(4),a=n(29),u=n(32),c=n(66).KEY,s=n(10),f=n(20),l=n(22),p=n(12),d=n(6),v=n(23),g=n(24),h=n(67),y=n(68),m=n(9),_=n(7),x=n(5),b=n(16),w=n(11),S=n(33),O=n(69),E=n(70),j=n(3),A=n(18),L=E.f,C=j.f,P=O.f,M=r.Symbol,T=r.JSON,k=T&&T.stringify,F=d("_hidden"),D=d("toPrimitive"),N={}.propertyIsEnumerable,R=f("symbol-registry"),W=f("symbols"),U=f("op-symbols"),I=Object.prototype,G="function"==typeof M,z=r.QObject,X=!z||!z.prototype||!z.prototype.findChild,B=i&&s(function(){return 7!=S(C({},"a",{get:function(){return C(this,"a",{value:7}).a}})).a})?function(t,e,n){var r=L(I,e);r&&delete I[e],C(t,e,n),r&&t!==I&&C(I,e,r)}:C,V=function(t){var e=W[t]=S(M.prototype);return e._k=t,e},q=G&&"symbol"==typeof M.iterator?function(t){return"symbol"==typeof t}:function(t){return t instanceof M},J=function(t,e,n){return t===I&&J(U,e,n),m(t),e=b(e,!0),m(n),o(W,e)?(n.enumerable?(o(t,F)&&t[F][e]&&(t[F][e]=!1),n=S(n,{enumerable:w(0,!1)})):(o(t,F)||C(t,F,w(1,{})),t[F][e]=!0),B(t,e,n)):C(t,e,n)},Y=function(t,e){m(t);for(var n,r=h(e=x(e)),o=0,i=r.length;i>o;)J(t,n=r[o++],e[n]);return t},H=function(t){var e=N.call(this,t=b(t,!0));return!(this===I&&o(W,t)&&!o(U,t))&&(!(e||!o(this,t)||!o(W,t)||o(this,F)&&this[F][t])||e)},K=function(t,e){if(t=x(t),e=b(e,!0),t!==I||!o(W,e)||o(U,e)){var n=L(t,e);return!n||!o(W,e)||o(t,F)&&t[F][e]||(n.enumerable=!0),n}},$=function(t){for(var e,n=P(x(t)),r=[],i=0;n.length>i;)o(W,e=n[i++])||e==F||e==c||r.push(e);return r},Q=function(t){for(var e,n=t===I,r=P(n?U:x(t)),i=[],a=0;r.length>a;)!o(W,e=r[a++])||n&&!o(I,e)||i.push(W[e]);return i};G||(u((M=function(){if(this instanceof M)throw TypeError("Symbol is not a constructor!");var t=p(arguments.length>0?arguments[0]:void 0),e=function(n){this===I&&e.call(U,n),o(this,F)&&o(this[F],t)&&(this[F][t]=!1),B(this,t,w(1,n))};return i&&X&&B(I,t,{configurable:!0,set:e}),V(t)}).prototype,"toString",function(){return this._k}),E.f=K,j.f=J,n(37).f=O.f=$,n(25).f=H,n(36).f=Q,i&&!n(15)&&u(I,"propertyIsEnumerable",H,!0),v.f=function(t){return V(d(t))}),a(a.G+a.W+a.F*!G,{Symbol:M});for(var Z="hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables".split(","),tt=0;Z.length>tt;)d(Z[tt++]);for(var et=A(d.store),nt=0;et.length>nt;)g(et[nt++]);a(a.S+a.F*!G,"Symbol",{for:function(t){return o(R,t+="")?R[t]:R[t]=M(t)},keyFor:function(t){if(!q(t))throw TypeError(t+" is not a symbol!");for(var e in R)if(R[e]===t)return e},useSetter:function(){X=!0},useSimple:function(){X=!1}}),a(a.S+a.F*!G,"Object",{create:function(t,e){return void 0===e?S(t):Y(S(t),e)},defineProperty:J,defineProperties:Y,getOwnPropertyDescriptor:K,getOwnPropertyNames:$,getOwnPropertySymbols:Q}),T&&a(a.S+a.F*(!G||s(function(){var t=M();return"[null]"!=k([t])||"{}"!=k({a:t})||"{}"!=k(Object(t))})),"JSON",{stringify:function(t){for(var e,n,r=[t],o=1;arguments.length>o;)r.push(arguments[o++]);if(n=e=r[1],(_(e)||void 0!==t)&&!q(t))return y(e)||(e=function(t,e){if("function"==typeof n&&(e=n.call(this,t,e)),!q(e))return e}),r[1]=e,k.apply(T,r)}}),M.prototype[D]||n(2)(M.prototype,D,M.prototype.valueOf),l(M,"Symbol"),l(Math,"Math",!0),l(r.JSON,"JSON",!0)},function(t,e,n){var r=n(12)("meta"),o=n(7),i=n(1),a=n(3).f,u=0,c=Object.isExtensible||function(){return!0},s=!n(10)(function(){return c(Object.preventExtensions({}))}),f=function(t){a(t,r,{value:{i:"O"+ ++u,w:{}}})},l=t.exports={KEY:r,NEED:!1,fastKey:function(t,e){if(!o(t))return"symbol"==typeof t?t:("string"==typeof t?"S":"P")+t;if(!i(t,r)){if(!c(t))return"F";if(!e)return"E";f(t)}return t[r].i},getWeak:function(t,e){if(!i(t,r)){if(!c(t))return!0;if(!e)return!1;f(t)}return t[r].w},onFreeze:function(t){return s&&l.NEED&&c(t)&&!i(t,r)&&f(t),t}}},function(t,e,n){var r=n(18),o=n(36),i=n(25);t.exports=function(t){var e=r(t),n=o.f;if(n)for(var a,u=n(t),c=i.f,s=0;u.length>s;)c.call(t,a=u[s++])&&e.push(a);return e}},function(t,e,n){var r=n(35);t.exports=Array.isArray||function(t){return"Array"==r(t)}},function(t,e,n){var r=n(5),o=n(37).f,i={}.toString,a="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[];t.exports.f=function(t){return a&&"[object Window]"==i.call(t)?function(t){try{return o(t)}catch(t){return a.slice()}}(t):o(r(t))}},function(t,e,n){var r=n(25),o=n(11),i=n(5),a=n(16),u=n(1),c=n(30),s=Object.getOwnPropertyDescriptor;e.f=n(4)?s:function(t,e){if(t=i(t),e=a(e,!0),c)try{return s(t,e)}catch(t){}if(u(t,e))return o(!r.f.call(t,e),t[e])}},function(t,e){},function(t,e,n){n(24)("asyncIterator")},function(t,e,n){n(24)("observable")},function(t,e,n){var r,o,i=[];i.push(n(75)),r=n(76);var a=n(77);o=r=r||{},"object"!=typeof r.default&&"function"!=typeof r.default||(Object.keys(r).some(function(t){return"default"!==t&&"__esModule"!==t})&&console.error("named exports are not supported in *.vue files."),o=r=r.default),"function"==typeof o&&(o=o.options),o.__file="/Users/Hanks/Codes/work/weex-vue-examples/src/components/AppInfoCard.vue",o.render=a.render,o.staticRenderFns=a.staticRenderFns,o._scopeId="data-v-6e3be69f",o.style=o.style||{},i.forEach(function(t){for(var e in t)o.style[e]=t[e]}),"function"==typeof __register_static_styles__&&__register_static_styles__(o._scopeId,i),t.exports=r},function(t,e){t.exports={card:{width:"650",justifyContent:"center",borderWidth:"1",borderColor:"#DDDDDD",borderRadius:"20",paddingTop:"50",paddingRight:"50",paddingBottom:"50",paddingLeft:"50",marginTop:"50",marginRight:"50",marginBottom:"50",marginLeft:"50",backgroundColor:"#FFFFFF"},title:{fontSize:"34",textAlign:"center",color:"#808080",marginBottom:"20"},version:{fontSize:"80",textAlign:"center",marginBottom:"30",color:"#323232"},group:{marginTop:"10",flexDirection:"row"},label:{width:"260",fontSize:"32",textAlign:"right",color:"#888888"},value:{width:"230",paddingLeft:"50",fontSize:"32",color:"#414141"}}},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,o=n(27),i=(r=o)&&r.__esModule?r:{default:r};var a="- invalid -";e.default={data:function(){return{version:a,jsfmVersion:a,platform:a,osVersion:a,deviceModel:a}},created:function(){try{this.jsfmVersion=getJSFMVersion()}catch(t){this.jsfmVersion="≤ 0.15.6"}"object"===("undefined"==typeof WXEnvironment?"undefined":(0,i.default)(WXEnvironment))&&(this.version=WXEnvironment.weexVersion||"- - -",this.platform=WXEnvironment.platform||"- - -",this.osVersion=WXEnvironment.osVersion||"- - -",this.deviceModel=WXEnvironment.deviceModel||"- - -")}}},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:["card"]},[n("div",{staticClass:["info"]},[n("text",{staticClass:["title"]},[t._v("Weex SDK Version")]),n("text",{staticClass:["version"]},[t._v(t._s(t.version))]),n("div",{staticClass:["group"]},[n("text",{staticClass:["label"]},[t._v("JS Framework")]),n("text",{staticClass:["value"]},[t._v(t._s(t.jsfmVersion))])]),n("div",{staticClass:["group"]},[n("text",{staticClass:["label"]},[t._v("platform")]),n("text",{staticClass:["value"]},[t._v(t._s(t.platform))])]),n("div",{staticClass:["group"]},[n("text",{staticClass:["label"]},[t._v("osVersion")]),n("text",{staticClass:["value"]},[t._v(t._s(t.osVersion))])]),n("div",{staticClass:["group"]},[n("text",{staticClass:["label"]},[t._v("deviceModel")]),n("text",{staticClass:["value"]},[t._v(t._s(t.deviceModel))])])])])},staticRenderFns:[]},t.exports.render._withStripped=!0},function(t,e){t.exports={render:function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("list",{staticClass:["list"]},[n("cell",{appendAsTree:!0,attrs:{append:"tree"}},[n("app-info-card")],1),t._l(t.items,function(e,r){return n("cell",{key:r,class:["item-cell","item-cell-"+(r+1)],appendAsTree:!0,attrs:{append:"tree"}},[e.link?n("div",{class:["item","item-"+(r+1)],on:{click:function(n){t.jumpTo(e.link,t.i18n(e.title))}}},[n("text",{staticClass:["item-title"]},[t._v(t._s(t.i18n(e.title)))]),n("image",{staticClass:["arrow-icon"],attrs:{src:"https://gw.alicdn.com/tfs/TB1iL2fkLDH8KJjy1XcXXcpdXXa-32-49.png"}})]):t._e()])}),n("cell",{staticClass:["item-cell"],appendAsTree:!0,attrs:{append:"tree"}},[n("div",{staticClass:["item"],on:{click:t.chooseLanguage}},[n("text",{staticClass:["item-title"]},[t._v(t._s(t.i18n(t.tips.LANGUAGE)))]),n("text",{staticClass:["item-value"]},[t._v(t._s(t.languageName))])])]),t._m(0)],2)},staticRenderFns:[function(){var t=this.$createElement,e=this._self._c||t;return e("cell",{appendAsTree:!0,attrs:{append:"tree"}},[e("div",{staticClass:["copyright"]},[e("text",{staticClass:["copyright-text"]},[this._v("Copyright(c) 2017 The Apache Software Foundation.")]),e("text",{staticClass:["copyright-text"]},[this._v("Licensed under the Apache License, Version 2.0")])])])}]},t.exports.render._withStripped=!0},function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e.default=t,e}(n(26));var o=weex.requireModule("storage");e.default={filters:{i18n:r.i18n,url:r.createURL,link:r.createLink},methods:{createLink:r.createLink,createURL:r.createURL,i18n:r.i18n,getLanguage:r.getLanguage,fetchData:r.fetchData,saveData:r.saveData,readData:r.readData,jumpTo:r.jumpTo},created:function(){var t=this;r.getLanguage(function(e){t.language=e,r.setTitleBar(t.navigationBarOptions,e)}),new BroadcastChannel("language").onmessage=function(e){e.data&&e.data.language&&(t.language=e.data.language)}},beforeDestroy:function(){o.removeItem("CURRENT_DOCUMENT_URL"),o.removeItem("CURRENT_SOURCE_HASH")}}}]);