/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 = /
车小蜂隐私政策
版本更新日期:2022年11月4日
版本生效日期:2022年11月4日
欢迎您使用我们的产品和服务!我们深知个人信息保护对您的重要性,您的信赖对我们非常重要,我们将严格依照法律法规要求采取相应的安全保护措施,致力于保护您的个人信息安全可控。
我们通过本《隐私政策》向您说明我们如何收集、使用、分享、转让、存储及保护您的个人信息,以及我们为您提供的访问、更新、删除等管理个人信息的权利。其中,有关您个人信息权益的重要条款内容我们已用加粗或下划线形式提示,请特别关注。
请您务必仔细阅读本《隐私政策》并确定了解我们对您个人信息的处理规则,确保您充分理解和同意之后再开始使用。本政策中涉及的专业词汇,我们尽量以简明通俗的表述向您解释,以便于您理解。如您对本政策内容有任何疑问、意见或建议,您可通过本政策文末的联系方式与我们联系。
特别提示:您同意本政策表示您已了解我们提供的功能或服务,并给予相应的信息收集使用授权。我们会在使用特定功能或服务时,收集、使用您的个人敏感信息,此时会根据您的实际使用情况单独征求您的同意。针对精确地理位置权限、相册(存储读取/写入权限)、麦克风权限、相机权限,均不会默认开启,只有经过您的明示授权才会在实现特定功能或服务时使用。具体权限申请和使用的说明情况请查阅:应用权限申请与使用情况说明,您也可以通过操作系统“设置-应用管理”撤回授权。
本政策将帮助您了解以下内容:
一、适用范围
二、我们如何收集和使用个人信息
三、我们如何存储和保护个人信息
四、我们如何使用 Cookie 和同类技术
五、我们如何使用SDK技术
六、我们如何共享、转让、公开披露您的个人信息
七、您的个人信息管理权利
八、未成年人个人信息的保护
九、政策的修订、通知和查看
十、联系我们
【附录】
一、适用范围
本《隐私政策》适用于由广州市有车以后信息科技有限公司作为运营主体(以下称“有车以后”),提供的车小蜂App、车小蜂微信小程序、车小蜂官网、车小蜂H5网页。除本《隐私政策》另有规定外,本《隐私政策》所用词语与《有车以后用户协议》所定义的词语具有相同的涵义。
本《隐私政策》不适用于:
1)第三方产品或服务,包括在我们应用内为您展示的产品或网站和广告或服务链接跳转到的其他产品或网站;
2)为我们的产品或服务进行广告宣传的其他第三方。
您使用这些第三方服务(包括您向这些第三方提供的任何个人信息),将受这些第三方的服务条款及隐私政策约束(而非本《隐私政策》),请您仔细阅读第三方的条款并妥善保护自己的个人信息,仅在必要的情况下向第三方提供。
请您了解,本《隐私政策》中所述的产品及相关服务会根据您所使用的设备型号、系统版本、软件应用程序版本、移动客户端等因素而有所不同。最终的产品和相关服务以您所使用的为准。
二、我们如何收集和使用您的个人信息
您在使用我们的产品/服务时,我们需要/可能需要收集和使用的您的个人信息包括如下两种:
1)为实现向您提供我们产品及/或服务的基本功能,您须授权我们收集、使用的必要信息。如您拒绝提供相应信息,将无法正常使用我们的产品及/或服务;
2)为实现向您提供我们产品及/或服务的附加功能,您可以选择单独同意或不同意我们收集、使用的信息。
您理解并同意:
1)因不同用户选择使用的产品/服务的范围存在差异,所以基本/附加功能及对应收集、使用的个人信息类型、范围会有所区别,请以具体的产品/服务功能为准。
2)为给您带来更好的产品/服务体验,我们可能适时推出新的或优化后的功能,可能需要收集、使用新的个人信息或变更个人信息使用目的或方式。我们将通过更新本隐私政策,以弹窗、页面提示等方式另行向您说明,并向您提供自主选择同意的方式,且会在征得您的明示同意后收集、使用。
我们会按照如下方式收集和使用您在使用我们服务时主动提供的,以及通过自动化手段收集您在使用功能或接受服务过程中产生的信息,用以实现我们的功能或服务。在特定目的场景下,针对必要的个人信息收集,我们会通过弹窗提醒方式告知并申请您的授权。特别注意:如果您提供的信息中包括非您本人的个人信息,请确保您已取得相关主体的授权同意。
1、账号注册、登录、认证和附加服务
1.1 注册、登录
我们基于有车以后统一平台账号体系服务(点击了解)为您提供基础账号服务,当您注册并创建账号时,您需要提供您的手机号码、密码。收集这些信息是为了帮助你完成注册和登录功能,在您之后的使用过程中,我们的客服人员会根据您的反馈需要,使用该手机号码与您联系,以响应您的需求。手机号码是履行国家法律法规关于网络实名制要求的必要信息,如果您不提供前述列举的个人信息,则无法完成账号注册,但这不会影响您使用我们提供的内容浏览、选车看车等其他功能或服务。
1)当您通过验证码方式注册登录,您需要授权同意我们向您发送短信验证码以验证您的身份。
2)当您选择一键登录(仅APP适用)方式注册登录时,您需要授权同意我们通过读取本机号码获取您的手机号码及该号码所属的运营商信息,请在操作前根据提示查看运营商的服务条款和隐私政策,并授权同意,您也可以选择通过其他方式进行注册登录。
2)当您选择微信授权登录时,我们会通过弹窗授权方式,经由您的授权同意后,获取您在第三方平台保存的个人信息完成注册和登录,请在操作前根据提示查看第三方平台的隐私条款并授权同意,一旦您授权同意,代表您将授权我们获取必要的个人信息。您也可以拒绝授权,并通过其他方式进行注册和登录。
1.2 附加用户服务
1)网络身份:您可以选择在注册成功后完善账号关联的网络身份信息(如头像、昵称、性别、个人简介),这些信息将会公开显示。
2)实名认证:在您使用身份认证功能和相关服务时,您需要根据功能页面的告知提示,提供您的真实身份信息(包括姓名、身份证号码、行驶证照片、电话号码、人脸信息等),我们会根据相关法律法规的要求完成实名验证。这些信息属于个人敏感信息,您务必清晰理解,实名认证服务是我们提供的附加功能,如果您拒绝提供,将不会影响其他基本功能与服务的正常使用。
3)信息发布:基于法律法规的相关要求,为维护真实有序的平台氛围,减少仿冒、造谣等不良行为,平台将会根据需要在个人主页中展示用户发布内容时所在地信息。其中境内展示到省/直辖市,境外展示到国家(地区),信息以网络运营商数据为准。
2、商品、资讯信息的浏览服务
为了让您快速地找到您所感兴趣的车型商品优惠信息、汽车资讯内容等,我们会主动收集如下必要的信息:
- 您的使用日志信息:浏览、点击查看、收藏、搜索关键词、分享、反馈、点赞、评论;
- 地理位置信息:精确地理位置信息(GPS定位);
其中的地理位置信息,我们会通过系统弹窗方式提醒并申请您的授权,如果您拒绝授权提供,我们将不会根据地理位置信息向您推荐或展示内容和服务,但这并不影响其他功能的正常使用;您可以在手机系统“设置-应用权限”管理界面(具体参考您的设备操作系统指引)关闭定位权限,以拒绝我们获取您的地理位置信息。
同时,我们通过如下措施努力保障您的隐私体验:
1)如果您想删除您的搜索记录,您可以在“搜索框-搜索记录”中删除;
2)如果您拒绝位置定位授权,我们仅会基于您的网络IP地址识别城市信息向您展示您所在城市的相关信息或提供相应的服务;
3)如果您不希望接受我们为您推荐的内容服务,您可以进入“我的-设置-隐私设置-个性化推荐”开启/关闭功能。
4)我们收集、使用上述信息进行了去标识化处理,无法直接关联识别您的身份。
3、在线购车服务(下订、交易、物流交付)
当您希望获得我们提供的经销商/厂商/集团及相关金融服务方提供的车型商品促销价格、团购优惠、金融优惠等购车权益活动信息时(以下或称“咨询”、“下订”),我们会按如下方式收集您的必要信息:
1)下订和订单管理
当您访问车型优惠信息并使用下订服务时,您需要提供您的真实身份信息(包括姓名、身份认证信息)、手机号码、购车车型信息、物流地址信息,同时订单中会记录您预订的购车优惠权益信息、订单号、创建时间、订单金额信息,以便我们帮助您锁定购车优惠权益,查询和管理订单信息以及提供售前和售后服务。这些信息包含个人敏感信息,您务必清晰理解,如果您拒绝提供,将不会影响其他基本功能与服务的正常使用。
2)在线合同签署
当您购车下订提交订单后,我们的销售客服/咨询顾问会与您沟通在线签署电子合同,你需要提交您的个人真实身份、电子签名、人脸识别等信息,并授权我们与我们合作的第三方合同代理机构共享前述信息中的必要信息。请您放心,如您不愿意授权,您可以随时联系我们终止交易;
为方便我们及时获悉并确认您的支付进度及状态、为您提供售后和争议解决服务,您需要授权并同意我们可从您选择的支付金融机构处收集与支付进度相关的信息。
3)支付服务
当您参与购车权益预订活动时,你可能需要支付一定金额的意向金/订金/定金用于锁定优惠权益,在您提交订单后,您需要授权我们合作的第三方支付机构(微信支付或银联)所提供的支付服务。我们需要将您订单交易金额、支付安全及其他法律法规要求的相关必要信息与这些支付机构共享,以实现其确认您的支付指令并完成支付。如您选择由其他金融机构为您提供支付服务,我们还会将您的包括银行卡号、有效期在内的银行卡支付必要信息与您选择的金融机构共享。
为方便我们及时获悉并确认您的支付进度及状态、为您提供售后和争议解决服务,您需要授权并同意我们可从您选择的支付金融机构处收集与支付进度相关的信息。
3)交付服务
为保证您购买的商品及/或服务能够顺利、安全、准时送达,我们会向为我们提供物流和技术服务的第三方物流平台共享和披露订单配送相关的必要信息(包括地址、联系号码)。您知晓并同意相应物流配送主体不可避免地获知及使用您的个人信息,用于完成商品/或服务的交付。
4、提供降价提醒订阅、与分享功能
您可以通过设置车型商品降价提醒,我们将会收集您订阅的车型商品信息,并在之后会通过应用消息通知方式,或者向在前述过程中收集的手机号码通过短信、电话的方式,为您提供信息提醒。请您放心,如您不愿意接受这些信息,您可以在APP中取消或关闭相应的功能,或通过「联系我们」提供的方式与我们联系处理取消;
4.1 您可以主动对您浏览的车型商品、资讯内容进行分享,我们会收集包括您的账号信息、分享记录在内的服务日志信息,以便跟踪被分享人的访问记录。
4.2 在您对车型商品、资讯内容进行分享或接收分享时,我们的“复制链接”功能需要访问您的剪切板,读取其中包含的口令、链接,以实现跳转、分享等功能或服务。
5、信息公开发布功能和服务(买车服务评价)
5.1 您在完成订单后,可以选择发布商品评价或服务评价,我们将收集您发布的内容信息,并展示您的昵称、头像、所在城市、发布内容等。
5.2 在您使用发布功能,选择发布相册图片、音视频录制的内容时,我们会请求您授权相机权限、相册读取权限(存储)、麦克风权限。如果您拒绝授权提供,将无法使用此功能,但不影响您正常使用其他功能。
6、在线咨询销售顾问服务
我们提供的在线咨询服务包括:在线客服消息咨询、在线3D真人语音带看。当您使用在线咨询服务时,我们会按如下方式收集和使用您的个人信息:
1)当您选择发起在线咨询时,客服人员将会获取您的个人信息,包括历史咨询问题、访问浏览路径、搜索日志记录,以便响应您的咨询;
2)当您发起在线语音带看时,将会与我们的客服进行实时连线语音互动,我们会以弹窗方式,获得您授权麦克风权限。
为便于在服务结束后与您联系、尽快帮助您解决问题或记录相关问题的处理方案及结果,我们会根据必要性保存您与我们的通信内容/通话录音记录以及资询过程中记录的相关信息(包括不限于账号信息、订单信息、联系方式以及在服务过程中您提供的其他信息)。
当您与我们联系或提出售中、售后、争议纠纷处理申请时,为了保障您的账号及系统安全,我们需要您提供必要的个人信息以核验您的账号身份。
7、保障产品运营、服务的运行/使用安全
我们致力于提供可靠、安全、可信的产品与使用环境,为帮助更好地了解我们服务的运行环境和情况,以维护产品服务运行的安全,我们会在如下场景收集个人信息:
1)为保障软件的安全稳定运行,我们会收集:
- 您的设备信息,包括:设备标识符(Android如IMEI、AndroidID、OAID、IMSI、MEID、硬件序列号,iOS如IDFA)、MAC地址、设备品牌、设备型号、屏幕分辨率、操作系统版本号、应用列表信息、应用信息或运行中应用进程信息、设备陀螺仪传感器数据;
- 您的网络信息,包括:IP地址、网络运营商、网络接入方式、基站、WLAN接入点、网络状态、网络质量数据;
2)为预防恶意程序以及提升应用运行体验,我们会收集:安装的应用信息或正在运行的进程信息、应用程序的总体运行、使用情况与频率、应用崩溃情况、总体安装使用情况、性能数据、应用来源;
3)为更准确地预防钓鱼网站欺诈和保护账号安全,我们会使用您的账号信息、浏览信息、订单信息、设备信息、服务日志信息以及我们关联公司、合作方在获得您授权或依法可以共享的信息,来判断您的账号风险、检测及防范安全事件。
4)为更好的提升您在使用我们产品服务过程中的体验和节省网络流量,我们会尝试申请读/写存储权限来缓存部分网络数据,若您拒绝提供可能会影响使用体验。
上述信息仅用于维护产品/服务的安全运行之目的,我们将在APP启动后必要阶段申请获取一次,并在本次服务运行期间授权我们使用。您可以在手机机系统“设置-应用权限”(不同设备系统路径可能不同)关闭相应权限以拒绝我们获取信息。
8、其他可选的附加功能
1)当您希望在应用内直接与相关服务商(如:经销商客服)进行电话联系时,我们会申请电话权限,申请该权限的目的仅为帮助您调起手机拨号键盘和显示对方电话以实现您在App内即可进行电话拨打,请您放心,我们不会通过该权限获取您的电话号码、通话内容,也不会在您不知情的情况下拨打电话。您如果拒绝授权提供,将无法使用此功能,但不影响您正常使用其他功能。
2)为提升您在询价及预约等功能时的使用体验,我们会在您进行询价及预约咨询的页面帮您预先填写您登录时或最近询价留资时使用的手机号(号码展示时中间四位会去标识化处理),且只有在您点击提交按钮之后才会根据您的授权进行共享。若您拒绝使用手机号预填充功能,也可直接在页面主动输入相关信息并继续使用我们的产品/服务。
为提供更便捷的功能及/或服务,提升您的体验,我们会提供其他基于系统权限的附加服务,如果您不同意开启相关权限,不会影响您使用基本服务,但您可能无法使用相关的附加服务给您带来的体验,您可点击应用权限申请与使用情况说明查阅详细说明。
9、我们从第三方收集个人信息的场景
1)当您使用第三方账号登录时,经过您的明确同意授权,我们会从第三方收集您的第三方账号昵称、头像、地区、性别以及您授权的其他信息;
2)其他用户使用我们的产品或服务而被我们收集的信息,如:其他用户使用内容发布的信息中可能含有您的部分信息(包括不限于:评论、留言、发布图文、音视频);
3)您在由我们运营主体提供的其他产品或服务中使用有车以后统一平台账号填写或发布的信息(例如:个人信息、评论、发布文本/音视频内容),包括不限于车小蜂小程序、有车以后App、有车以后+小程序;
10、依法豁免征得同意收集和使用的个人信息
请您理解,根据法律法规及相关国家标准,在以下情形中,我们收集、使用和对外提供您的个人信息无需征得您的授权同意:
1)为履行法定义务所必需的;
2)为订立、履行您作为一方当事人的合同所必需;
3)为应对突发公共卫生事件,或者紧急情况下为保护自然人的生命健康和财产安全所必需;
4)在合理的范围内处理个人自行公开或者其他已经合法公开的个人信息;
5)法律、行政法规规定的其他情形。
三、我们如何使用Cookie和同类技术
Cookie和同类技术是互联网中的通用常用技术。当您使用产品及相关服务时,我们可能会使用相关技术向您的设备发送一个或多个Cookie或匿名标识符(Cookie 通常包含标识符、站点名称以及一些号码和字符),以收集和存储您访问、使用本产品时的信息。我们使用 Cookie 和同类技术主要为了实现以下功能或服务:
1)保障产品与服务的安全、高效运转
我们可能会设置认证与保障安全性的cookie 或匿名标识符,使我们确认您是否安全登录服务,或者是否遇到盗用、欺诈等不法行为,这些技术还会帮助我们改进服务效率,提升登录和响应速度。
2)帮助您获得更轻松的访问体验。
使用此类技术可以帮助您省去重复填写个人信息、输入搜索内容的步骤和流程(示例:记录搜索、表单填写);
我们不会将上述信息用于本隐私政策所述目的之外的任何用途。大多数浏览器均为用户提供了清除浏览器缓存数据的功能,您可以在浏览器设置功能中进行相应的数据清除操作。如您进行清除,您可能无法使用依赖于Cookie的功能及服务和安全保障,如:每次访问我们的网站或应用时需要另行设置,您之前设置记录的相关信息也可能会被删除,并且对您所使用服务的安全性有一定影响。
四、我们如何使用和集成SDK技术
为实现更优质功能、保障应用稳定运行,我们的应用中会嵌入授权合作伙伴的SDK软件产品,包括开发工具包、应用程序接口(API)、插件等。我们会尽到审慎义务,对合作方获取信息进行严格的约定和安全监测,令其按照本政策所述的安全措施,以明确的目的和方式提供服务,以保护数据安全。您可点击查阅我们接入集成的SDK详情。
五、我们如何存储和保护个人信息
1、存储位置
我们依照法律法规的规定,将在境内运营过程中收集和产生的您的个人信息存储于中华人民共和国境内。目前,我们不会将上述信息传输至境外,如果我们向境外传输,我们将会遵循法律法规的规定,征求您的自主选择同意。
2、存储期限
我们仅在为提供我们产品及相关服务之目的所必需的期间内保留您的个人信息,除非法律法规有强制的留存要求。例如您发布的内容、评论、点赞等信息,在您未注销账号期间,我们会保留相关信息。例如《中华人民共和国电子商务法》要求商品和服务信息、交易信息保存时间自交易完成之日不少于三年。超出必要期限后,我们将对您的个人信息进行删除或匿名化处理,但法律法规另有规定的除外。
3、安全保护
我们非常重视您的个人信息安全,并采取一切合理可行的措施,保护您的个人信息:
3.1 数据安全技术措施
我们会采用符合业界标准的安全防护措施,包括建立合理的制度规范、安全技术来防止您的个人信息遭到未经授权的访问使用、修改,避免数据的损坏或丢失。我们采取加密技术对用户个人信息进行加密保存,并通过隔离技术进行隔离。在个人信息使用时,例如个人信息展示、个人信息关联计算,我们会采用包括内容替换、SHA256在内多种数据脱敏技术增强个人信息在使用中安全性。我们采用严格的数据访问权限控制和多重身份认证技术保护个人信息,避免数据被违规使用。我们采用代码安全自动检查、数据访问日志分析技术进行个人信息安全审计。
3.2 我们为保护个人信息采取的其他安全措施
我们通过建立数据分类分级制度、数据安全管理规范、数据安全开发规范来管理规范个人信息的存储和使用。我们通过信息接触者保密协议、监控和审计机制来对数据进行全面安全控制。
我们建立信息安全管理委员会来推进和保障个人信息安全。
安全认证和服务——我们存储您个人数据的底层云技术通过了公安部安全等级保护二级认证。
加强安全意识——我们还会举办安全和隐私保护培训课程,加强员工对于保护个人信息重要性的认识。
3.3 个人信息访问权限控制
我们仅允许有必要知晓这些信息的公司内部员工访问个人信息,并为此设置了严格的访问权限控制和监控机制。我们同时要求可能接触到您个人信息的所有人员履行相应的保密义务。如果未能履行这些义务,可能会被追究法律责任或被中止与我们的合作关系。
3.4 个人信息收集与保留
我们会采取一切合理可行的措施,确保未收集无关的个人信息。我们只会在达成本政策所述目的所需的期限内保留您的个人信息,除非需要延长保留期或受到法律的允许。
3.5 互联网环境安全性保障声明
互联网并非绝对安全的环境,而且电子邮件、即时通讯、社交软件等与其他用户的交流方式无法确定是否完全加密,我们建议您使用此类工具时请使用复杂密码,并注意保护您的个人信息安全。我们将尽力确保或担保您发送给我们的任何信息的安全性。
3.6 安全事件处置
在通过有车以后与第三方进行网上服务的交易时,您不可避免的要向交易对方或潜在的交易对方披露自己的个人信息,如联系方式或者通信地址等。请您妥善保护自己的个人信息,仅在必要的情形下向他人提供。
为应对个人信息泄露、损毁和丢失等可能出现的风险,我们制定了多项制度,明确安全事件、安全漏洞的分类分级标准及相应的处理流程。我们也为安全事件建立了专门的应急响应团队,按照安全事件处置规范要求,针对不同安全事件启动安全预案,进行止损、分析、定位、制定补救措施、联合相关部门进行溯源和打击。
如果我们的物理、技术、或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改或毁坏,导致您的合法权益受损,我们会及时启动应急预案,采取合理必要的措施,以尽可能降低对您个人的影响。如不幸发生个人信息安全事件后,我们将按照法律法规的要求,及时向您告知:安全事件的基本情况和可能的影响、我们已采取或将要采取的处置措施、您可自主防范和降低风险的建议、对您的补救措施等。我们同时将及时将事件相关情况以邮件、电话等方式告知您,难以逐一告知个人信息主体时,我们会采取合理、有效的方式发布公告。同时,我们还将按照监管部门要求,主动上报个人信息安全事件的处置情况。
3.7 免责声明
本《隐私政策》提供的个人信息保护措施仅适用于我们的产品及相关服务。一旦您离开产品及相关服务,浏览或使用其他网站、服务及内容资源,我们没有能力及义务保护您在我们产品及相关服务之外的软件、网站提交的任何个人信息,无论您登录、浏览或使用上述软件、以及网站是否基于我们的链接或引导。当由于以上情形而导致发生个人信息安全事件时,我们将会尽我们所能帮助您进行补救或者止损,但我们将不承担相应的法律责任。
3.8 联系我们
如果您对我们的个人信息保护有任何疑问,尤其是您的账号及密码发生泄露,可通过下方的「联系我们」与我们联系,以便我们采取相应措施。
六、我们如何共享、转让、公开披露您的个人信息
1、共享(委托处理)
1.1 共享原则
1)授权同意:经过您本人明确单独授权同意,或者共享的个人信息是去标识化处理后的信息、并且第三方无法重新识别此类信息的自然人主体。
2)合法与最小必要:向关联方、第三方合作伙伴共享的数据必须具有合法正当目的,且数据范围以达成目的必要为限。例如为订立、履行您作为一方当事人的合同所必需的个人信息。
3)安全审慎:我们将审慎评估关联方、第三方数据使用共享信息的目的,对其的安全保证能力进行综合评估,并要求其遵循合作法律协议。为了遵守法律、执行或适用我们的使用条件和其他协议,或者为了保护我们、您或其他用户的权利及其财产或安全,比如为防止欺诈等违法活动和减少信用风险,而与其他公司和组织交换信息。不过这并不包括违反本《隐私政策》中所作的承诺而为获利目的出售、出租、共享或以其它方式披露您的个人信息。
1.2 委托处理
我们可能会委托合作伙伴处理您的个人信息,以便授权合作伙伴代表我们为您提供某些服务或履行职能。我们仅会出于本政策声明的合法、正当、必要、特定、明确目的的委托其处理您的信息,授权合作伙伴只能获取到其履行职责所必需的信息,且我们会通过协议要求其不得将此信息用于其他任何超出委托范围的目的。我们不会将您的个人身份识别信息交由关联公司、合作伙伴处理,如果授权合作伙伴将您的个人信息用于我们未委托的用途,其将以显著方式单独征得您的同意。
我们会进行个人信息共享或委托处理的关联公司、合作伙伴包括以下类型:
1)汽车经销商、厂商及集团;
2)具备分期购车服务能力的汽车融资租赁平台/公司、汽车金融公司;
3)具备汽车保险服务能力的汽车保险平台/公司;
4)具备汽车或其他商品物流转运能力的物流平台/公司;
5)具备线上支付能力的支付机构/银行;
6)线上合同签署服务机构(如:E签宝);
1.3 在以下服务场景中,经过您的自主选择、单独授权同意并提交,我们会共享您的个人信息
(1)车价咨询服务
我们可能会向相关汽车经销商、厂商及集团(包括但不限于您主动选择的
经销商、在您仅选择品牌但未明确具体经销商的情形下我们根据您所在区域为您匹配的优质经销商)共享您在表单中主动填写提交的信息,并由其在合法正当的范围内使用,比如:由经销商及时与您进行电话联络和回访。
我们可能会根据您的选择(包括但不限于您通过分期购车入口进入询价、在询价表单中主动选择“分期”方案、在我们客服电话回访时表明有分期购车意向) ,向我们的业务合作伙伴(比如:具备分期购车服务能力的汽车融资租赁平台/公司、汽车金融公司)共享您授权主动提交的个人信息,并由其在合法正当的范围内使用,比如:及时与您进行电话回访联络。
(2)支付服务
支付功能由我们合作的第三方支付机构向您提供服务。第三方支付机构可能需要收集您的姓名、银行卡类型及卡号、有效期及手机号码(请注意以上属于个人敏感信息),这些信息是支付功能所必须的信息,拒绝提供将导致您无法使用该功能,但不影响其他功能的正常使用。
(3)地理位置服务
当您使用地理位置相关服务(例如:查阅地区优惠车辆信息),在由您的单独授权之后,我们会将获取的您位置信息与合作伙伴方(百度地图)进行共享,以便查询地理位置,向您反馈结果。如您拒绝授权,将会影响精确位置服务功能,但不影响其他功能的正常使用。
2、转让
我们不会将您的个人信息转让给任何公司、组织和个人,但以下情况除外:
1)在事先获得您明确的同意或授权;
2)履行法定义务所必需;
3)为订立、履行您作为一方当事人的合同所必需;
在涉及合并、收购、破产清算或资产转让或类似的交易时,如涉及到个人信息转让,我们会要求新的持有您个人信息的公司、组织及时发布公告接收方的主体信息,且继续受本《隐私政策》的约束,否则我们将要求该公司、组织重新单独向您征求授权同意。
3、公开披露
我们仅会在以下情况下,才会公开披露您的个人信息:
1)根据您的需求,在您明确同意的披露方式下披露您所指定的个人信息;
2)履行法定义务所必需;
3)根据法律、行政法规的要求;
在符合法律法规的前提下,当我们收到上述披露信息的请求时,我们会要求必须出具与之相应的法律文件,如传票或调查函。我们坚信,对于要求我们提供的信息,应该在法律允许的范围内尽可能保持透明。我们对所有的请求都进行了慎重的审查,以确保其具备合法依据,且仅限于执法部门因特定调查目的且有合法权利获取的数据。
特别提示:使用我们的产品和服务过程中,您主动公开分享、共享的个人信息,不受本政策限制(如向其他互联网平台转发内容)。您应注意,任何您分享的信息均可被任何第三方阅读、收集和使用,请您审慎考虑您发布和传播的内容以及其中可能指向您个人的信息。我们建议您在使用互动功能时特别关注您的个人信息是否已做好隐私保护,发布汽车相关内容时我们建议您对车牌号进行马赛克处理,也建议您不在发布内容中展示个人手机号码。
七、您的个人信息管理权利
我们非常重视您对个人信息的管理,按照中国相关的法律、法规、标准,以及其他国家、地区的通行做法,我们尽全力保障您对自己的个人信息行使以下权利:
1、查询、更正和补充
除法律法规规定外,您有权随时访问和查询您的个人信息:
1)您可以在“我的”页面点击您的头像或者用户名,进入“编辑个人资料”模块查询和更正您的头像、昵称、个人简介等个人信息。
2)进入“我的”页面,点击“关注”可以访问和查询您所关注的账号,您也可以进行取消关注的操作。
3)进入“我的”页面,点击“收藏”可以访问和查询您所收藏的内容,您也可以进行取消收藏的操作。
4)进入“我的”页面,点击右上角“设置-个性化推荐”进行开启/关闭,自主控制个性化推荐的开启和关闭
5)进入“我的”页面,点击右上角“设置-消息推送”,进行开启/关闭,自主控制消息通知服务的开启和关闭
2、获取个人信息副本
您有权获取您的个人信息副本,您可以通过本《隐私政策》文末提供的方式联系我们,在核实您的身份后,我们将向您提供您在我们的服务中的个人信息副本(包括基本资料、身份信息),但法律法规另有规定的或本政策另有约定的除外。
3、改变您授权的范围或撤回您的授权
您可以通过在设备系统“设置-应用权限”中,管理或撤回应用授权权限。请您理解,当您撤回同意或授权后,我们无法继续为您提供撤回同意或授权所对应的服务,也不再处理您相应的个人信息。但您撤回同意或授权的决定,不会影响此前基于您的授权而开展的个人信息处理。
4、注销账号
您可以在我们的APP中“我的”-“设置”-“账号管理”-“账号注销”直接申请注销账号,您注销账号后,我们将停止为您提供产品/服务,除法律法规另有规定外,我们将按照《有车以后账号注销协议》协议规定处理。
5、响应您的上述请求
如果您无法通过上述方式访问、更正或删除您的个人信息,或您需要访问、更正或删除您在使用我们产品与/或服务时所产生的其他个人信息,或您认为我们存在任何违反法律法规或与您关于个人信息的收集或使用的约定,您均可以发送电子邮件至dev_support@youcheyihou.com或通过本《隐私政策》下方的“联系我们”提及的方式与我们联系。我们将再15个工作日内做出响应。
在以下情形中,按照法律法规要求,我们将无法响应您的请求:
(1)与国家安全、国防安全相关的;
(2)与公共安全、公共卫生、重大公共利益相关的;
(3)与犯罪侦查、起诉和审判和执行判决等直接相关的;
(4)有充分证据表明您存在主观恶意或滥用权利的;
(5)响应您的请求将导致您或其他个人、组织的合法权益受到严重损害的;
(6)涉及商业秘密的。
八、未成年人个人信息的保护
1、我们非常重视对未成年人个人信息的保护。若您是14周岁以下的未成年人,在使用我们的产品与/或服务或向我们提供个人信息之前,我们要求您的家长或法定监护人仔细阅读本政策,并事先取得您的家长或法定监护人的同意。
2、有车以后根据国家相关法律法规的规定保护未成年人的个人信息,对于经父母或法定监护人同意而收集未成年人个人信息的情况,我们只会在受到法律允许、父母或监护人明确同意或者保护未成年人所必要的情况下使用、共享、转让或披露此信息。
3、如果有事实证明未成年人并未取得父母或法定监护人同意的情况下注册使用了我们的产品与/或服务,我们会与相关监护人协商,并设法尽快删除相关个人信息。
九、政策的修订、通知和查看
1、为了给您提供更好的服务体验,我们的服务和业务流程将不时更新与变化,我们会适时对本隐私政策进行修订,这些修订构成本隐私政策的一部分。
2、本隐私政策更新后,我们会在应用内发出更新版本,并在更新后通过公告或其他适当的方式提醒您更新的内容。如您继续使用我们的服务,表示同意接受修订后的《隐私政策》的内容,但是如果更新的内容需要采集音视频、获取您通讯录、联系方式、地理位置等个人敏感信息,仍会再次以显著方式征求您的同意。
3、对于重大变更,我们还会提供更为显著的通知(包括但不限于弹窗提醒、邮件)说明具体变更内容。
本《隐私政策》所指的重大变更包括但不限于:
(1)我们的服务模式发生重大变化,如处理个人信息的目的、处理的个人信息类型、个人信息的使用方式等;
(2)我们在所有权结构、组织架构等方面发生重大变化。如业务调整、破产并购等引起的所有者变更等;
(3)个人信息共享、转让或公开披露的主要对象发生变化;
(4)您参与个人信息处理方面的权利及其行使方式发生重大变化;
(5)我们负责处理个人信息安全的责任部门、联络方式及投诉渠道发生变化时;
(6)个人信息安全影响评估报告表明存在高风险时。
4、您可以在首次使用App产品时通过弹窗查看本《隐私政策》,也可通过“我的-设置-隐私政策”再次查看。我们恳请您定期查看本《隐私政策》,以确保您对本政策最新版本始终保持了解。
十、联系我们
1、我们设立了专门负责个人信息保护的部门,如您对本政策有任何疑问、意见或建议,您可以通过以下方式与我们取得联系:
(1)点击“我的-设置-问题反馈”给我们留言反馈;
(2)发送邮件至:dev_support@youcheyihou.com;
(3)邮寄信件至:广东省广州市海珠区新港西路135号中山大学国家大学科技园B座14楼 邮编:510275。
2、我们会在收到您的反馈或意见后的【15个工作日】内核验您的身份并尽快向您回复。如无法响应您的请求,我们会在法律规定的最大时限要求内,向您发送通知并解释原因。请注意,我们可能不会回复与本政策或您个人信息权利无关的反馈。
3、如您对我们的回复不满意,或我们对您个人信息的处理方式侵害了您的合法权益,且在您向我们反馈后我们无法提供让您满意的回复且拒绝改进的,您可以通过向被告所在地有管辖权的相关监管机构进行投诉和举报寻求解决。
【附录】
1、本隐私政策中的标题仅为方便阅读而设,并不影响政策中任何规定的含义或解释。
2、相关词语释义:
车小蜂:是指车小蜂客户端应用程序(App)、微信小程序及网站提供的产品和服务
有车以后:指广州市有车以后信息科技有限公司以及关联公司作为运营主体的简称,是有车以后App、车小蜂App等产品和服务的互联网信息、服务、技术提供者。
有车以后统一平台账号:是指有车以后作为运营主体的统一平台账号体系服务(点击了解)。
关联公司:是指广州市有车以后信息科技有限公司及其旗下平台服务提供者的关联公司,包括:海南超速度商务有限公司
儿童:指不满十四周岁的未成年人。
个人信息:个人信息是以电子或者其他方式记录的与已识别或者可识别的自然人有关的各种信息,不包括匿名化处理后的信息。
个人敏感信息:是一旦泄露或者非法使用,容易导致自然人的人格尊严受到侵害或者人身、财产安全受到危害的个人信息,包括生物识别、宗教信仰、特定身份、医疗健康、金融账号、行踪轨迹等信息,以及不满十四周岁未成年人的个人信息。
服务日志信息:包括浏览记录、点击记录、搜索记录、收藏、添加购物车、交易、售后、关注、分享、发布的信息、以及IP地址、浏览器类型、网络运营商、系统语言、访问日期时间。
设备信息:包括设备识别信息(如:IMEI、AndroidID、OAID、IMSI、MEID、Mac地址)、应用信息(崩溃日志、通知开关状态、应用安装列表)、设备参数及系统信息(设备类型、型号、操作系统及硬件相关信息)、您安装的应用信息或运行中的进程信息。
网络信息:是指如IP地址、WIFI状态信息、基站信息等相关信息。
去标识化:是指通过对个人信息的技术处理,使其在不借助额外信息的情况下,无法识别个人信息主体的过程。去标识化后的信息属于个人信息。
匿名化:是指通过对个人信息的技术处理,使得个人信息主体无法被识别,且处理后的信息不能被复原的过程。匿名化后的信息不属于个人信息。
删除:在实现日常业务功能所涉及的系统中去除信息的行为,使其保持不可被检索、访问的状态。
3、本隐私政策版权为广州市有车以后信息科技有限公司及其关联公司(包括海南超速度商务有限公司)运营主体所有,在法律允许的范围内,我们拥有解释和修改的权利。