/gi, R = /^(?:body|html)$/i, Z = /([A-Z])/g, z = ["val", "css", "html", "text", "data", "width", "height", "offset"], q = A.createElement("table"), H = A.createElement("tr"), I = { tr: A.createElement("tbody"), tbody: q, thead: q, tfoot: q, td: H, th: H, "*": A.createElement("div") }, V = /complete|loaded|interactive/, _ = /^[\w-]*$/, B = {}, U = B.toString, X = {}, J = A.createElement("div"), W = { tabindex: "tabIndex", readonly: "readOnly", for: "htmlFor", class: "className", maxlength: "maxLength", cellspacing: "cellSpacing", cellpadding: "cellPadding", rowspan: "rowSpan", colspan: "colSpan", usemap: "useMap", frameborder: "frameBorder", contenteditable: "contentEditable" }, Y = Array.isArray || function (t) { return t instanceof Array }; return X.matches = function (t, e) { if (!e || !t || 1 !== t.nodeType) return !1; var n = t.matches || t.webkitMatchesSelector || t.mozMatchesSelector || t.oMatchesSelector || t.matchesSelector; if (n) return n.call(t, e); var r, i = t.parentNode, o = !i; return o && (i = J).appendChild(t), r = ~X.qsa(i, e).indexOf(t), o && J.removeChild(t), r }, w = function (t) { return t.replace(/-+(.)?/g, function (t, e) { return e ? e.toUpperCase() : "" }) }, S = function (t) { return O.call(t, function (e, n) { return t.indexOf(e) == n }) }, X.fragment = function (t, e, n) { var r, i, o; return k.test(t) && (r = j(A.createElement(RegExp.$1))), r || (t.replace && (t = t.replace(M, "<$1>$2>")), e === b && (e = F.test(t) && RegExp.$1), e in I || (e = "*"), (o = I[e]).innerHTML = "" + t, r = j.each(P.call(o.childNodes), function () { o.removeChild(this) })), a(n) && (i = j(r), j.each(n, function (t, e) { z.indexOf(t) > -1 ? i[t](e) : i.attr(t, e) })), r }, X.Z = function (t, e) { return new p(t, e) }, X.isZ = function (t) { return t instanceof X.Z }, X.init = function (t, e) { var r; if (!t) return X.Z(); if ("string" == typeof t) if ("<" == (t = t.trim())[0] && F.test(t)) r = X.fragment(t, RegExp.$1, e), t = null; else { if (e !== b) return j(e).find(t); r = X.qsa(A, t) } else { if (n(t)) return j(A).ready(t); if (X.isZ(t)) return t; if (Y(t)) r = function (t) { return O.call(t, function (t) { return null != t }) }(t); else if (o(t)) r = [t], t = null; else if (F.test(t)) r = X.fragment(t.trim(), RegExp.$1, e), t = null; else { if (e !== b) return j(e).find(t); r = X.qsa(A, t) } } return X.Z(r, t) }, (j = function (t, e) { return X.init(t, e) }).extend = function (t) { var e, n = P.call(arguments, 1); return "boolean" == typeof t && (e = t, t = n.shift()), n.forEach(function (n) { d(t, n, e) }), t }, X.qsa = function (t, e) { var n, r = "#" == e[0], i = !r && "." == e[0], o = r || i ? e.slice(1) : e, a = _.test(o); return t.getElementById && a && r ? (n = t.getElementById(o)) ? [n] : [] : 1 !== t.nodeType && 9 !== t.nodeType && 11 !== t.nodeType ? [] : P.call(a && !r && t.getElementsByClassName ? i ? t.getElementsByClassName(o) : t.getElementsByTagName(e) : t.querySelectorAll(e)) }, j.contains = A.documentElement.contains ? function (t, e) { return t !== e && t.contains(e) } : function (t, e) { for (; e && (e = e.parentNode);)if (e === t) return !0; return !1 }, j.type = e, j.isFunction = n, j.isWindow = r, j.isArray = Y, j.isPlainObject = a, j.isEmptyObject = function (t) { var e; for (e in t) return !1; return !0 }, j.isNumeric = function (t) { var e = Number(t), n = typeof t; return null != t && "boolean" != n && ("string" != n || t.length) && !isNaN(e) && isFinite(e) || !1 }, j.inArray = function (t, e, n) { return C.indexOf.call(e, t, n) }, j.camelCase = w, j.trim = function (t) { return null == t ? "" : String.prototype.trim.call(t) }, j.uuid = 0, j.support = {}, j.expr = {}, j.noop = function () { }, j.map = function (t, e) { var n, r, i, o = []; if (s(t)) for (r = 0; r < t.length; r++)null != (n = e(t[r], r)) && o.push(n); else for (i in t) null != (n = e(t[i], i)) && o.push(n); return u(o) }, j.each = function (t, e) { var n, r; if (s(t)) { for (n = 0; n < t.length; n++)if (!1 === e.call(t[n], n, t[n])) return t } else for (r in t) if (!1 === e.call(t[r], r, t[r])) return t; return t }, j.grep = function (t, e) { return O.call(t, e) }, t.JSON && (j.parseJSON = JSON.parse), j.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function (t, e) { B["[object " + e + "]"] = e.toLowerCase() }), j.fn = { constructor: X.Z, length: 0, forEach: C.forEach, reduce: C.reduce, push: C.push, sort: C.sort, splice: C.splice, indexOf: C.indexOf, concat: function () { var t, e, n = []; for (t = 0; t < arguments.length; t++)e = arguments[t], n[t] = X.isZ(e) ? e.toArray() : e; return N.apply(X.isZ(this) ? this.toArray() : this, n) }, map: function (t) { return j(j.map(this, function (e, n) { return t.call(e, n, e) })) }, slice: function () { return j(P.apply(this, arguments)) }, ready: function (t) { return V.test(A.readyState) && A.body ? t(j) : A.addEventListener("DOMContentLoaded", function () { t(j) }, !1), this }, get: function (t) { return t === b ? P.call(this) : this[t >= 0 ? t : t + this.length] }, toArray: function () { return this.get() }, size: function () { return this.length }, remove: function () { return this.each(function () { null != this.parentNode && this.parentNode.removeChild(this) }) }, each: function (t) { return C.every.call(this, function (e, n) { return !1 !== t.call(e, n, e) }), this }, filter: function (t) { return n(t) ? this.not(this.not(t)) : j(O.call(this, function (e) { return X.matches(e, t) })) }, add: function (t, e) { return j(S(this.concat(j(t, e)))) }, is: function (t) { return this.length > 0 && X.matches(this[0], t) }, not: function (t) { var e = []; if (n(t) && t.call !== b) this.each(function (n) { t.call(this, n) || e.push(this) }); else { var r = "string" == typeof t ? this.filter(t) : s(t) && n(t.item) ? P.call(t) : j(t); this.forEach(function (t) { r.indexOf(t) < 0 && e.push(t) }) } return j(e) }, has: function (t) { return this.filter(function () { return o(t) ? j.contains(this, t) : j(this).find(t).size() }) }, eq: function (t) { return -1 === t ? this.slice(t) : this.slice(t, +t + 1) }, first: function () { var t = this[0]; return t && !o(t) ? t : j(t) }, last: function () { var t = this[this.length - 1]; return t && !o(t) ? t : j(t) }, find: function (t) { var e = this; return t ? "object" == typeof t ? j(t).filter(function () { var t = this; return C.some.call(e, function (e) { return j.contains(e, t) }) }) : 1 == this.length ? j(X.qsa(this[0], t)) : this.map(function () { return X.qsa(this, t) }) : j() }, closest: function (t, e) { var n = [], r = "object" == typeof t && j(t); return this.each(function (o, a) { for (; a && !(r ? r.indexOf(a) >= 0 : X.matches(a, t));)a = a !== e && !i(a) && a.parentNode; a && n.indexOf(a) < 0 && n.push(a) }), j(n) }, parents: function (t) { for (var e = [], n = this; n.length > 0;)n = j.map(n, function (t) { return (t = t.parentNode) && !i(t) && e.indexOf(t) < 0 ? (e.push(t), t) : void 0 }); return m(e, t) }, parent: function (t) { return m(S(this.pluck("parentNode")), t) }, children: function (t) { return m(this.map(function () { return h(this) }), t) }, contents: function () { return this.map(function () { return this.contentDocument || P.call(this.childNodes) }) }, siblings: function (t) { return m(this.map(function (t, e) { return O.call(h(e.parentNode), function (t) { return t !== e }) }), t) }, empty: function () { return this.each(function () { this.innerHTML = "" }) }, pluck: function (t) { return j.map(this, function (e) { return e[t] }) }, show: function () { return this.each(function () { var t, e, n; "none" == this.style.display && (this.style.display = ""), "none" == getComputedStyle(this, "").getPropertyValue("display") && (this.style.display = (t = this.nodeName, D[t] || (e = A.createElement(t), A.body.appendChild(e), n = getComputedStyle(e, "").getPropertyValue("display"), e.parentNode.removeChild(e), "none" == n && (n = "block"), D[t] = n), D[t])) }) }, replaceWith: function (t) { return this.before(t).remove() }, wrap: function (t) { var e = n(t); if (this[0] && !e) var r = j(t).get(0), i = r.parentNode || this.length > 1; return this.each(function (n) { j(this).wrapAll(e ? t.call(this, n) : i ? r.cloneNode(!0) : r) }) }, wrapAll: function (t) { if (this[0]) { j(this[0]).before(t = j(t)); for (var e; (e = t.children()).length;)t = e.first(); j(t).append(this) } return this }, wrapInner: function (t) { var e = n(t); return this.each(function (n) { var r = j(this), i = r.contents(), o = e ? t.call(this, n) : t; i.length ? i.wrapAll(o) : r.append(o) }) }, unwrap: function () { return this.parent().each(function () { j(this).replaceWith(j(this).children()) }), this }, clone: function () { return this.map(function () { return this.cloneNode(!0) }) }, hide: function () { return this.css("display", "none") }, toggle: function (t) { return this.each(function () { var e = j(this); (t === b ? "none" == e.css("display") : t) ? e.show() : e.hide() }) }, prev: function (t) { return j(this.pluck("previousElementSibling")).filter(t || "*") }, next: function (t) { return j(this.pluck("nextElementSibling")).filter(t || "*") }, html: function (t) { return 0 in arguments ? this.each(function (e) { var n = this.innerHTML; j(this).empty().append(v(this, t, e, n)) }) : 0 in this ? this[0].innerHTML : null }, text: function (t) { return 0 in arguments ? this.each(function (e) { var n = v(this, t, e, this.textContent); this.textContent = null == n ? "" : "" + n }) : 0 in this ? this.pluck("textContent").join("") : null }, attr: function (t, e) { var n; return "string" != typeof t || 1 in arguments ? this.each(function (n) { if (1 === this.nodeType) if (o(t)) for (E in t) g(this, E, t[E]); else g(this, t, v(this, e, n, this.getAttribute(t))) }) : 0 in this && 1 == this[0].nodeType && null != (n = this[0].getAttribute(t)) ? n : b }, removeAttr: function (t) { return this.each(function () { 1 === this.nodeType && t.split(" ").forEach(function (t) { g(this, t) }, this) }) }, prop: function (t, e) { return t = W[t] || t, 1 in arguments ? this.each(function (n) { this[t] = v(this, e, n, this[t]) }) : this[0] && this[0][t] }, removeProp: function (t) { return t = W[t] || t, this.each(function () { delete this[t] }) }, data: function (t, e) { var n = "data-" + t.replace(Z, "-$1").toLowerCase(), r = 1 in arguments ? this.attr(n, e) : this.attr(n); return null !== r ? x(r) : b }, val: function (t) { return 0 in arguments ? (null == t && (t = ""), this.each(function (e) { this.value = v(this, t, e, this.value) })) : this[0] && (this[0].multiple ? j(this[0]).find("option").filter(function () { return this.selected }).pluck("value") : this[0].value) }, offset: function (e) { if (e) return this.each(function (t) { var n = j(this), r = v(this, e, t, n.offset()), i = n.offsetParent().offset(), o = { top: r.top - i.top, left: r.left - i.left }; "static" == n.css("position") && (o.position = "relative"), n.css(o) }); if (!this.length) return null; if (A.documentElement !== this[0] && !j.contains(A.documentElement, this[0])) return { top: 0, left: 0 }; var n = this[0].getBoundingClientRect(); return { left: n.left + t.pageXOffset, top: n.top + t.pageYOffset, width: Math.round(n.width), height: Math.round(n.height) } }, css: function (t, n) { if (arguments.length < 2) { var r = this[0]; if ("string" == typeof t) { if (!r) return; return r.style[w(t)] || getComputedStyle(r, "").getPropertyValue(t) } if (Y(t)) { if (!r) return; var i = {}, o = getComputedStyle(r, ""); return j.each(t, function (t, e) { i[e] = r.style[w(e)] || o.getPropertyValue(e) }), i } } var a = ""; if ("string" == e(t)) n || 0 === n ? a = c(t) + ":" + f(t, n) : this.each(function () { this.style.removeProperty(c(t)) }); else for (E in t) t[E] || 0 === t[E] ? a += c(E) + ":" + f(E, t[E]) + ";" : this.each(function () { this.style.removeProperty(c(E)) }); return this.each(function () { this.style.cssText += ";" + a }) }, index: function (t) { return t ? this.indexOf(j(t)[0]) : this.parent().children().indexOf(this[0]) }, hasClass: function (t) { return !!t && C.some.call(this, function (t) { return this.test(y(t)) }, l(t)) }, addClass: function (t) { return t ? this.each(function (e) { if ("className" in this) { T = []; var n = y(this); v(this, t, e, n).split(/\s+/g).forEach(function (t) { j(this).hasClass(t) || T.push(t) }, this), T.length && y(this, n + (n ? " " : "") + T.join(" ")) } }) : this }, removeClass: function (t) { return this.each(function (e) { if ("className" in this) { if (t === b) return y(this, ""); T = y(this), v(this, t, e, T).split(/\s+/g).forEach(function (t) { T = T.replace(l(t), " ") }), y(this, T.trim()) } }) }, toggleClass: function (t, e) { return t ? this.each(function (n) { var r = j(this); v(this, t, n, y(this)).split(/\s+/g).forEach(function (t) { (e === b ? !r.hasClass(t) : e) ? r.addClass(t) : r.removeClass(t) }) }) : this }, scrollTop: function (t) { if (this.length) { var e = "scrollTop" in this[0]; return t === b ? e ? this[0].scrollTop : this[0].pageYOffset : this.each(e ? function () { this.scrollTop = t } : function () { this.scrollTo(this.scrollX, t) }) } }, scrollLeft: function (t) { if (this.length) { var e = "scrollLeft" in this[0]; return t === b ? e ? this[0].scrollLeft : this[0].pageXOffset : this.each(e ? function () { this.scrollLeft = t } : function () { this.scrollTo(t, this.scrollY) }) } }, position: function () { if (this.length) { var t = this[0], e = this.offsetParent(), n = this.offset(), r = R.test(e[0].nodeName) ? { top: 0, left: 0 } : e.offset(); return n.top -= parseFloat(j(t).css("margin-top")) || 0, n.left -= parseFloat(j(t).css("margin-left")) || 0, r.top += parseFloat(j(e[0]).css("border-top-width")) || 0, r.left += parseFloat(j(e[0]).css("border-left-width")) || 0, { top: n.top - r.top, left: n.left - r.left } } }, offsetParent: function () { return this.map(function () { for (var t = this.offsetParent || A.body; t && !R.test(t.nodeName) && "static" == j(t).css("position");)t = t.offsetParent; return t }) } }, j.fn.detach = j.fn.remove, ["width", "height"].forEach(function (t) { var e = t.replace(/./, function (t) { return t[0].toUpperCase() }); j.fn[t] = function (n) { var o, a = this[0]; return n === b ? r(a) ? a["inner" + e] : i(a) ? a.documentElement["scroll" + e] : (o = this.offset()) && o[t] : this.each(function (e) { (a = j(this)).css(t, v(this, n, e, a[t]())) }) } }), ["after", "prepend", "before", "append"].forEach(function (n, r) { var i = r % 2; j.fn[n] = function () { var n, o, a = j.map(arguments, function (t) { var r = []; return "array" == (n = e(t)) ? (t.forEach(function (t) { return t.nodeType !== b ? r.push(t) : j.zepto.isZ(t) ? r = r.concat(t.get()) : void (r = r.concat(X.fragment(t))) }), r) : "object" == n || null == t ? t : X.fragment(t) }), s = this.length > 1; return a.length < 1 ? this : this.each(function (e, n) { o = i ? n : n.parentNode, n = 0 == r ? n.nextSibling : 1 == r ? n.firstChild : 2 == r ? n : null; var u = j.contains(A.documentElement, o); a.forEach(function (e) { if (s) e = e.cloneNode(!0); else if (!o) return j(e).remove(); o.insertBefore(e, n), u && function t(e, n) { n(e); for (var r = 0, i = e.childNodes.length; i > r; r++)t(e.childNodes[r], n) }(e, function (e) { if (!(null == e.nodeName || "SCRIPT" !== e.nodeName.toUpperCase() || e.type && "text/javascript" !== e.type || e.src)) { var n = e.ownerDocument ? e.ownerDocument.defaultView : t; n.eval.call(n, e.innerHTML) } }) }) }) }, j.fn[i ? n + "To" : "insert" + (r ? "Before" : "After")] = function (t) { return j(t)[n](this), this } }), X.Z.prototype = p.prototype = j.fn, X.uniq = S, X.deserializeValue = x, j.zepto = X, j }(); return t.Zepto = e, void 0 === t.$ && (t.$ = e), function (e) { function n(t) { return t._zid || (t._zid = h++) } function r(t, e, r, o) { if ((e = i(e)).ns) var a = function (t) { return new RegExp("(?:^| )" + t.replace(" ", " .* ?") + "(?: |$)") }(e.ns); return (v[n(t)] || []).filter(function (t) { return t && (!e.e || t.e == e.e) && (!e.ns || a.test(t.ns)) && (!r || n(t.fn) === n(r)) && (!o || t.sel == o) }) } function i(t) { var e = ("" + t).split("."); return { e: e[0], ns: e.slice(1).sort().join(" ") } } function o(t, e) { return t.del && !y && t.e in x || !!e } function a(t) { return b[t] || y && x[t] || t } function s(t, r, s, u, l, h, p) { var d = n(t), m = v[d] || (v[d] = []); r.split(/\s/).forEach(function (n) { if ("ready" == n) return e(document).ready(s); var r = i(n); r.fn = s, r.sel = l, r.e in b && (s = function (t) { var n = t.relatedTarget; return !n || n !== this && !e.contains(this, n) ? r.fn.apply(this, arguments) : void 0 }), r.del = h; var d = h || s; r.proxy = function (e) { if (!(e = c(e)).isImmediatePropagationStopped()) { e.data = u; var n = d.apply(t, e._args == f ? [e] : [e].concat(e._args)); return !1 === n && (e.preventDefault(), e.stopPropagation()), n } }, r.i = m.length, m.push(r), "addEventListener" in t && t.addEventListener(a(r.e), r.proxy, o(r, p)) }) } function u(t, e, i, s, u) { var c = n(t); (e || "").split(/\s/).forEach(function (e) { r(t, e, i, s).forEach(function (e) { delete v[c][e.i], "removeEventListener" in t && t.removeEventListener(a(e.e), e.proxy, o(e, u)) }) }) } function c(t, n) { return (n || !t.isDefaultPrevented) && (n || (n = t), e.each(w, function (e, r) { var i = n[e]; t[e] = function () { return this[r] = E, i && i.apply(n, arguments) }, t[r] = j }), t.timeStamp || (t.timeStamp = Date.now()), (n.defaultPrevented !== f ? n.defaultPrevented : "returnValue" in n ? !1 === n.returnValue : n.getPreventDefault && n.getPreventDefault()) && (t.isDefaultPrevented = E)), t } function l(t) { var e, n = { originalEvent: t }; for (e in t) T.test(e) || t[e] === f || (n[e] = t[e]); return c(n, t) } var f, h = 1, p = Array.prototype.slice, d = e.isFunction, m = function (t) { return "string" == typeof t }, v = {}, g = {}, y = "onfocusin" in t, x = { focus: "focusin", blur: "focusout" }, b = { mouseenter: "mouseover", mouseleave: "mouseout" }; g.click = g.mousedown = g.mouseup = g.mousemove = "MouseEvents", e.event = { add: s, remove: u }, e.proxy = function (t, r) { var i = 2 in arguments && p.call(arguments, 2); if (d(t)) { var o = function () { return t.apply(r, i ? i.concat(p.call(arguments)) : arguments) }; return o._zid = n(t), o } if (m(r)) return i ? (i.unshift(t[r], t), e.proxy.apply(null, i)) : e.proxy(t[r], t); throw new TypeError("expected function") }, e.fn.bind = function (t, e, n) { return this.on(t, e, n) }, e.fn.unbind = function (t, e) { return this.off(t, e) }, e.fn.one = function (t, e, n, r) { return this.on(t, e, n, r, 1) }; var E = function () { return !0 }, j = function () { return !1 }, T = /^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/, w = { preventDefault: "isDefaultPrevented", stopImmediatePropagation: "isImmediatePropagationStopped", stopPropagation: "isPropagationStopped" }; e.fn.delegate = function (t, e, n) { return this.on(e, t, n) }, e.fn.undelegate = function (t, e, n) { return this.off(e, t, n) }, e.fn.live = function (t, n) { return e(document.body).delegate(this.selector, t, n), this }, e.fn.die = function (t, n) { return e(document.body).undelegate(this.selector, t, n), this }, e.fn.on = function (t, n, r, i, o) { var a, c, h = this; return t && !m(t) ? (e.each(t, function (t, e) { h.on(t, n, r, e, o) }), h) : (m(n) || d(i) || !1 === i || (i = r, r = n, n = f), (i === f || !1 === r) && (i = r, r = f), !1 === i && (i = j), h.each(function (f, h) { o && (a = function (t) { return u(h, t.type, i), i.apply(this, arguments) }), n && (c = function (t) { var r, o = e(t.target).closest(n, h).get(0); return o && o !== h ? (r = e.extend(l(t), { currentTarget: o, liveFired: h }), (a || i).apply(o, [r].concat(p.call(arguments, 1)))) : void 0 }), s(h, t, i, r, n, c || a) })) }, e.fn.off = function (t, n, r) { var i = this; return t && !m(t) ? (e.each(t, function (t, e) { i.off(t, n, e) }), i) : (m(n) || d(r) || !1 === r || (r = n, n = f), !1 === r && (r = j), i.each(function () { u(this, t, r, n) })) }, e.fn.trigger = function (t, n) { return (t = m(t) || e.isPlainObject(t) ? e.Event(t) : c(t))._args = n, this.each(function () { t.type in x && "function" == typeof this[t.type] ? this[t.type]() : "dispatchEvent" in this ? this.dispatchEvent(t) : e(this).triggerHandler(t, n) }) }, e.fn.triggerHandler = function (t, n) { var i, o; return this.each(function (a, s) { (i = l(m(t) ? e.Event(t) : t))._args = n, i.target = s, e.each(r(s, t.type || t), function (t, e) { return o = e.proxy(i), !i.isImmediatePropagationStopped() && void 0 }) }), o }, "focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function (t) { e.fn[t] = function (e) { return 0 in arguments ? this.bind(t, e) : this.trigger(t) } }), e.Event = function (t, e) { m(t) || (t = (e = t).type); var n = document.createEvent(g[t] || "Events"), r = !0; if (e) for (var i in e) "bubbles" == i ? r = !!e[i] : n[i] = e[i]; return n.initEvent(t, r, !0), c(n) } }(e), function (e) { function n(t, n, r) { var i = e.Event(n); return e(t).trigger(i, r), !i.isDefaultPrevented() } function r(t, e, r, i) { return t.global ? n(e || g, r, i) : void 0 } function i(t) { t.global && 0 == e.active++ && r(t, null, "ajaxStart") } function o(t) { t.global && !--e.active && r(t, null, "ajaxStop") } function a(t, e) { var n = e.context; return !1 !== e.beforeSend.call(n, t, e) && !1 !== r(e, n, "ajaxBeforeSend", [t, e]) && void r(e, n, "ajaxSend", [t, e]) } function s(t, e, n, i) { var o = n.context, a = "success"; n.success.call(o, t, a, e), i && i.resolveWith(o, [t, a, e]), r(n, o, "ajaxSuccess", [e, n, t]), c(a, e, n) } function u(t, e, n, i, o) { var a = i.context; i.error.call(a, n, e, t), o && o.rejectWith(a, [n, e, t]), r(i, a, "ajaxError", [n, i, t || e]), c(e, n, i) } function c(t, e, n) { var i = n.context; n.complete.call(i, e, t), r(n, i, "ajaxComplete", [e, n]), o(n) } function l() { } function f(t) { return t && (t = t.split(";", 2)[0]), t && (t == j ? "html" : t == E ? "json" : x.test(t) ? "script" : b.test(t) && "xml") || "text" } function h(t, e) { return "" == e ? t : (t + "&" + e).replace(/[&?]{1,2}/, "?") } function p(t, n, r, i) { return e.isFunction(n) && (i = r, r = n, n = void 0), e.isFunction(r) || (i = r, r = void 0), { url: t, data: n, success: r, dataType: i } } var d, m, v = +new Date, g = t.document, y = /
第三方SDK信息收集和共享说明
为保障App的稳定安全运行或实现相关功能,我们会接入由第三方提供的软件产品(包括开发工具包SDK、开发插件、应用程序API接口、统计分析工具等)实现前述目的。我们会尽到审慎义务,对合作方获取信息进行严格的安全监测,以保护数据安全。
我们接入的第三方SDK主要服务于您及其他用户的需求,因此在满足新的服务需求及业务功能变更时,我们可能会调整我们接入的三方SDK。请您知晓并理解,SDK技术由与我们合作的第三方机构提供,我们仅能知悉其要求获得授权的权限以及其明确向我们披露的要收集的敏感信息。我们会及时在本说明中向您公开说明接入第三方SDK的最新情况。
以下是我们接入并使用的第三方软件产品及其收集的个人信息,请您详阅:
百度定位SDK
所属系统:安卓/苹果
使用目的:提供精确或粗略位置信息定位服务
使用场景:为您展示所在区域附近的经销商家,使用到城市位置定位的功能时
运营主体:北京百度网讯科技有限公司
隐私政策:https://lbs.baidu.com/index.php?title=openprivacy
信息类型:设备标识(Android ID、IDFA、IDFV)、设备信息(操作系统版本、设备品牌及型号、设备配置)、位置相关信息(可能包括经纬度、GNSS信息、WiFi网关地址、WiFi MAC地址、WiFi信号强度、WiFi状态、WiFi参数、WiFi列表、基站ID数据信息、运营商信息、设备信号强度信息、IP地址、蓝牙信息和传感器信息【加速度,陀螺仪、方向、压力、旋转矢量、光照、磁力计】)、网络类型(如移动网络、WiFi网络)、应用信息(应用名、应用安装列表信息)
调用权限:电话权限、获取位置权限、访问WI-FI状态权限、设备存储权限
共享方式:SDK本机收集,不涉及共享
微信SDK
所属系统:安卓/苹果
使用目的:实现微信账号授权登录、分享服务
使用场景:用户使用微信账号登录或者分享内容时
运营主体:深圳市腾讯计算机系统有限公司
官网链接:https://open.weixin.qq.com/
隐私政策:https://support.weixin.qq.com/cgi-bin/mmsupportacctnodeweb-bin/pages/RYiYJkLOrQwu0nb8
信息类型:设备标识(Android如IMEI、Android ID、Serial,iOS如IDFV),MAC地址、WLAN接入点、分享图片或内容
收集方式:SDK直接收集,不涉及共享
微信支付SDK
所属系统:安卓/苹果
使用目的:帮助用户实现应用内微信支付服务功能
使用场景:用户使用微信支付时
运营主体:财付通支付科技有限公司
隐私政策:https://weixin.qq.com/cgi-bin/readtemplate?lang=zh_CN&t=weixin_agreement&s=privacy
信息类型:设备标识(Android如IMEI、Android ID、Serial),MAC地址、WLAN接入点
共享方式:SDK本机收集,不涉及共享
七牛上传SDK
所属系统:安卓、苹果iOS
使用目的:用于图片、视频内容发布的上传云存储服务
使用场景:在应用中需要上传图片、视频内容时
运营主体:上海七牛信息技术有限公司
隐私政策:https://developer.qiniu.com/pili/8027/sdk-privacy-policy
信息类型:网络类型(例如 Wi-FI、3G、4G)、设备信息(设备品牌、设备型号、Android系统版本)
调用权限:设备存储读权限(相册权限)
共享方式:SDK本机收集,不涉及共享
七牛短视频SDK
所属系统:安卓、苹果iOS
使用目的:用于图片、视频内容发布的上传云存储服务
使用场景:在应用中需要采集并编辑图片、视频内容时
运营主体:上海七牛信息技术有限公司
隐私政策:https://developer.qiniu.com/pili/8027/sdk-privacy-policy
信息类型:设备标识符(Android ID、IDFV)、设备信息(品牌、型号、厂商、Android系统版本)
、网络状态、网络类型( Wi-FI状态、3G/4G)
调用权限:相机权限、麦克风权限、设备存储读写权限(相册权限)、屏幕录制权限
共享方式:SDK本机收集,不涉及共享
网易七鱼SDK(在线客服功能)
所属系统:安卓、苹果iOS
使用目的:提供养车车品商城的客服会话服务
使用场景:在应用中用户需要咨询养车商城商品服务或售后服务时
运营主体:杭州网易质云科技有限公司
隐私政策:https://qi.163.com/termsService
信息类型:设备传感器数据(听筒红外距离),网络信息(网络状态、wifi信息,IP地址、运营商)、设备信息(设备品牌、型号、设备所运行系统版本、名称、编辑版本)、日志信息(浏览器类型及版本信息、云信通信服务运行日志信息)、应用信息(Bundle ID、应用包名)
调用权限:相机权限、麦克风权限、设备存储读写权限(相册权限)
共享方式:SDK本机收集,不涉及共享
个推消息推送SDK(包含合作方)
所属系统:安卓、苹果iOS
使用目的:为App用户推送应用通知栏消息通知服务
使用场景:在为用户推送促销活动、订阅提醒、优质资讯内容等应用通知消息时
运营主体:每日互动股份有限公司
隐私政策:https://docs.getui.com/privacy/
信息类型:设备识别标识(包含IMEI、IDFA、Android ID、MAC、OAID、Advertising ID、Serial Number、IMSI、UAID、ICCID、IDFV)、网络信息及位置相关信息(IP地址、WIFI信息、基站信息、运营商信息)、设备信息(设备识别码、设备序列号、设备平台、设备厂商用于生成唯一的推送目标CID和GID、设备品牌、设备型号及系统版本)、应用相关信息(应用安装列表、渠道、时间戳、页面唯一标识、用户打点事件)
调用权限:存储权限、设备权限、访问WI-FI状态权限
共享方式:SDK本机收集,不涉及共享
卓信ID SDK(个推消息推送SDK的合作方)
所属系统:安卓、苹果iOS
使用目的:提供设备标识与安全风控服务
使用场景:为用户推送应用通知信息时
运营主体:中国信息通信研究院
官网链接: https://zxid.caict.ac.cn
隐私政策: https://zxid.caict.ac.cn/privacy
涉及信息收集:设备弱特征(不具备唯一性和稳定性的特征)、设备信息(设备制造商、设备型号、设备系统信息)、设备网络信息(设备联网方式和状态信息)、设备环境信息(屏幕亮度、电池状态及所在国家、设备应用信息(设备常见应用的版本等安装信息)
共享方式:SDK本机收集,不涉及共享
华为推送SDK
所属系统:安卓
使用目的:1、用于我们向华为手机用户推送应用消息;2、统计华为推送SDK接口调用成功率
使用场景:在为用户推送应用通知消息时
运营主体:华为软件技术有限公司
隐私政策: https://developer.huawei.com/consumer/cn/doc/development/HMSCore-Guides/sdk-data-security-0000001050042177
信息类型:设备标识符(MAC地址、AAID、Push Token)、网络信息(IP地址、基站信息)、设备信息(型号、名称)、应用信息(AppID,HMS Core应用版本号,SDK版本号,应用版本号和应用包名)、系统基本信息和系统设置信息
共享方式:SDK本机收集,不涉及共享
小米推送SDK
所属系统:安卓
使用目的:1、用于我们向小米手机用户推送应用消息;2、统计小米推送SDK接口调用成功率
使用场景:在为用户推送应用通知消息时
运营主体:北京小米移动软件有限公司
隐私政策: https://dev.mi.com/console/doc/detail?pId=1822
信息类型:设备标识(OAID、加密的Android ID)、设备信息(设备厂商、型号、归属地、运营商名称)、通知栏设置、推送消息内容
共享方式:SDK本机收集,不涉及共享
OPPO推送SDK(OPUSH SDK)
所属系统:安卓
使用目的:1、用于我们向OPPO手机用户推送应用消息;2、统计OPPO推送SDK接口调用成功率
使用场景:在为用户推送应用通知消息时
运营主体:北京小米移动软件有限公司
隐私政策: https://open.oppomobile.com/new/developmentDoc/info?id=10288
信息类型:设备相关信息(如IMEI或OAID,Serial Number,IMSI,User ID,Android ID,Google Advertising ID, 手机Region设置,设备型号,手机电量,手机操作系统版本及语言)、使用推送服务的应用信息(如APP包名及版本号,运行状态)、推送SDK版本号、网络相关信息(如IP或域名连接结果,当前网络类型)、消息发送结果、通知栏状态(如通知栏权限、用户点击行为),锁屏状态(如是否锁屏,是否允许锁屏通知)
共享方式:SDK本机收集,不涉及共享
VIVO推送SDK
所属系统:安卓
使用目的:1、用于我们向vivo手机用户推送应用消息;2、统计vivo推送SDK接口调用成功率
使用场景:在为用户推送应用通知消息时
运营主体:维沃移动通信有限公司
隐私政策: https://dev.vivo.com.cn/documentCenter/doc/652
信息类型:设备标识信息(如IMEI、EmmCID、UFSID、ANDROIDID、GUID、GAID、OPENID、VAID、OAID、RegID、加密的Android ID)、使用推送服务的应用软件信息(如应用包名、版本号、APPID、安装、卸载、恢复出厂设置、运行状态)、设备制造商、网络类型、国家码、设备类型
收集方式:SDK直接收集
闪验SDK(一键登录号码认证)
所属系统:安卓
使用目的:1、为了实现一键注册、登录的网关取号技术;2、实现统计分析服务能力,提供反欺诈功能
使用场景:在用户注册登录账号时
运营主体:上海创蓝云智信息科技股份有限公司
隐私政策:http://shanyan.253.com/document/details?lid=639&cid=91&pc=28&pn=%25E9%2597%25AA%25E9%25AA%258CSDK
信息类型:为了实现网关取号技术,闪验SDK需要获取IP地址、网卡(MAC)地址、国际移动设备识别码(IMEI)、OAID(替代IMEI)、sim卡信息,并会收集手机机型、系统类型、系统版本、网络环境、网关取号报错日志等数据以提供统计分析服务能力,并可提供反欺诈等功能
收集方式:委托SDK收集,采用HTTPS等加密传输协议保障安全,加密/去标识化等安全措施脱敏处理
移动一键登录SDK(移动号码认证)
所属系统:安卓
使用目的:1、识别⽤户的⼿机号码快速登录/号码校验;2、实现业务风控功能,问题查询、分析、风险控制
使用场景:在用户注册登录账号时,识别⽤户的⼿机号码快速登录及号码校验,问题查询、分析、风险控制
运营主体:中移互联网有限公司
隐私政策: https://wap.cmpassport.com/resources/html/contract2.html
信息类型:本机号码信息,设备标识IMSI,设备信息(设备类型、设备厂商、操作系统类型及版本),网络信息(网络链接类型、网络状态信息、运营商类型、网络IP地址、蜂窝网络类型),应用信息(应用进程信息、应用包名、应用签名)
收集方式:委托SDK收集,采用HTTPS等加密传输协议保障安全,加密/去标识化等安全措施脱敏处理
天翼一键登录SDK(电信天翼号码认证)
所属系统:安卓
使用目的:1、识别⽤户的⼿机号码快速登录/号码校验;2、实现业务风控功能
使用场景:在用户注册登录账号时
运营主体:世纪龙信息网络有限责任公司
隐私政策: https://e.189.cn/sdk/agreement/detail.do?hidetop=true
信息类型:本机号码信息,设备标识IMSI,设备信息(设备类型、设备厂商、操作系统类型及版本),网络信息(网络链接类型、网络状态信息、运营商类型、网络IP地址、蜂窝网络类型),应用信息(应用进程信息、应用包名、应用签名)
收集方式:SDK直接收集
联通一键登录SDK(联通号码认证)
所属系统:安卓
使用目的:1、识别⽤户的⼿机号码快速登录/号码校验;2、实现业务风控功能
使用场景:在用户注册登录账号时
运营主体:中国联合网络通信有限公司
隐私政策: https://opencloud.wostore.cn/authz/resource/html/disclaimer.html?fromsdk=true
信息类型:本机号码信息,设备标识IMSI,设备信息(设备类型、设备厂商、操作系统类型及版本),网络信息(网络链接类型、网络状态信息、运营商类型、网络IP地址、蜂窝网络类型),应用信息(应用进程信息、应用包名、应用签名)
收集方式:SDK直接收集
移动安全联盟MSA设备标识SDK
所属系统:安卓
使用目的:保护用户的隐私,标识设备的唯一性,实现对开放匿名设备标识符(OAID)、开发者匿名设备标识符(VAID)和应用匿名设备标识符(AAID)的读取,但不包括对设备唯一标识符(UDID)的读取
使用场景:在账号注册登录,以及应用安全风险决策保障时
运营主体:中国信息通信研究院
隐私政策: http://www.msa-alliance.cn/col.jsp?id=122&from_wecom=1
信息类型:设备信息(设备制造商,设备型号,设备品牌),网络信息(网络运营商类型),应用信息(App包名及签名信息)
收集方式:委托SDK采集,应用调用时读取并本地判断,SDK不会存储和网络传输
友盟应用统计SDK(U-APP统计分析服务)
所属系统:安卓
使用目的:1、基于设备的应用统计指标分析(新增用户、累计用户);2、基于IP提供的地区数据报表;3、提供反劫持SDK技术
使用场景:在应用需要统计分析应用的新增用户数时
运营主体:友盟同欣(北京)科技有限公司、北京锐讯灵通科技有限公司
隐私政策: https://www.umeng.com/page/policy
信息类型:设备标识(MAC、IMSI、IMEI、Android ID、OpenUDID、GUID、苹果IDFA、ICCID)、设备信息(MAC地址、设备品牌、设备型号)、网络信息(IP地址、网络状态)
共享方式:SDK本机收集,不涉及共享
腾讯Bugly统计SDK
所属系统:安卓、苹果iOS
使用目的:用于排查应用崩溃问题,帮助提升App稳定性
使用场景:在应用发生异常崩溃时上报应用运行错误日志(不包括个人敏感信息)
运营主体:深圳市腾讯计算机系统有限公司
隐私政策: https://privacy.qq.com/document/preview/fc748b3d96224fdb825ea79e132c1a56
信息类型:设备标识(Android ID、序列号SerialNumber、IDFV)网络信息(网络类型)、设备信息(设备品牌、设备型号、Android系统版本、App应用版本信息、设备磁盘空间信息)、应用信息(当前应用进程名和PID、应用安装列表信息)
调用权限:访问网络、WI-FI状态权限
共享方式:SDK本机收集,不涉及共享
腾讯浏览服务TBS(X5浏览器内核)
所属系统:安卓
使用目的:用于提供浏览器内核服务,在应用内打开网页页面加载浏览
使用场景:在应用内的部分资讯内容详情浏览,商城活动详情、第三方页面跳转展示
运营主体:深圳市腾讯计算机系统有限公司
隐私政策: https://rule.tencent.com/rule/preview/1c4e2b4b-d0f6-4a75-a5c6-1cfce00a390d
信息类型:网络信息(Wi-Fi状态和参数)、设备信息(设备型号、操作系统、CPU类型)、应用信息(宿主应用包名,版本号)
共享方式:SDK本机收集,不涉及共享
秒针AdMaster SDK(第三方广告监测服务)
所属系统:安卓
使用目的:用于提供第三方广告数据统计
使用场景:在应用为您展示广告时
运营主体:秒针信息技术有限公司
官方网站:https://www.miaozhen.com/cn/media_studio/admonitor
信息类型:设备标识符(Android ID、MAC地址)、网络及位置信息(IP地址)
共享方式:应用SDK通过网络接口传输,不涉及数据共享
Kotlin Stdlib SDK(安卓开发语言组件)
所属系统:安卓
使用目的:用于提供标准开发库服务
使用场景:在应用开发和运行时支撑应用服务功能逻辑的运行
运营主体:Kotlin Foundation
官方网站:https://kotlinlang.org/api/latest/jvm/stdlib/
信息类型:设备标识符(Android ID)
共享方式:SDK本机收集,不涉及共享
Unity3D SDK
所属系统:安卓、苹果
使用目的:用于提供3D模型处理展示
使用场景:在您进入车型3D看车展示时
运营主体:Unity Inc
官方网站:https://unity.cn/legal/china-privacy-policy
信息类型:设备标识符(Android ID、IDFA、IDFV、MAC 地址)、网络信息及位置信息(IP地址)、设备信息(设备名称和 ID、硬件型号、屏幕分辨率、操作系统和版本以及移动网络信息)、应用信息(安装信息)
共享方式:SDK本机收集,不涉及共享
Glide SDK(Bumptech开源图片加载安卓组件)
所属系统:安卓
使用目的:用于提供图片列表加载的缓存加速,提升浏览体验
使用场景:在应用需要加载图片列表时
运营主体:GitHub Inc
官方网站:https://github.com/bumptech/glide
信息类型:网络信息及位置信息(IP地址)、设备信息(设备名称、型号)、应用信息(系统API级别数字/字符)
调用权限:设备存储权限
共享方式:SDK本机收集,不涉及共享
EventBus SDK(GreenRobot 开源应用事件总线安卓组件)
所属系统:安卓
使用目的:用于应用内代码组件消息通信
使用场景:在应用运行页面事件触发时
运营主体:GitHub Inc
官方网站:https://github.com/greenrobot/EventBus
信息类型:设备标识符(MAC地址)、网络及位置信息(IP地址)
共享方式:SDK本机收集,不涉及共享
LeakCanary SDK
所属系统:安卓
使用目的:用于应用质量崩溃检测
使用场景:在应用运行发生内存泄漏或崩溃时
运营主体:GitHub Inc
官方网站:https://github.com/bumptech/glide
信息类型:设备信息(设备型号、名称、制造商、品牌)、应用信息(应用程序列表、系统API级别数字/字符)
共享方式:SDK本机收集,不涉及共享
【特别说明】
上述收集信息类型的定义请参看隐私政策的附录定义部分。