据说,看我文章时 关注、点赞、收藏 的 帅哥美女们 心情都会不自觉的好起来。
前言:
作者简介:大家好我是 user_from_future ,意思是 “ 来自未来的用户 ” ,寓意着未来的自己一定很棒~
✨个人主页:点我直达,在这里肯定能找到你想要的~
专栏介绍:猿人学WEB题目专解 ,提供猿人学WEB题目总计20题的解题思路与方法,如有讲述错误,请不吝赐教。
想看往期历史文章,可以浏览此博文: 历史文章目录
,后续所有文章发布都会同步更新此博文~
猿人学第6题
- 题目网址
- 题目详情
- 题目思路
- 使用 RPC 远程过程调用解决(失败)
- 正常逆向 JavaScript 解决
- 解题源码
题目网址
猿人学第6题
题目详情
让我们计算 全部 中奖的 总金额(包含一、二、三等奖),返回的数据只有 三等奖 的数据,得自己计算出一、二等奖的数据,一二等奖似乎是根据三等奖数据生成的。
题目思路
我们先实验一下,一、二等奖的生成是否与三等奖有关,改个返回数据,然后执行试试
执行前的数据:
执行后的数据:
果然,一、二等奖就是从三等奖生成出来的,那先不管他们,先来搞定三等奖数据的生成。
这题最主要的就是我们参数 m
的生成,所以直接打断点,刷新页面或点击其他页,跳转到 r
函数所在位置:
使用 RPC 远程过程调用解决(失败)
为什么会有想用这个的想法呢?原因有几个:
- 使用 RPC 远程过程调用很简单。
- 函数入口明确,可以直接调用出结果。
- 懒得逆向 / 逆向恐惧 / 不会逆向 等原因。
- 没有用过 RPC 远程过程调用,想尝试。
我们首先打开 RPC 服务端:
然后将断点放在 m
函数的设置处:
然后注入js并启动ws连接:
关掉断点,放开断点。
然后发现网页上仍然可以点击,但一用爬虫就…
好家伙,使用 RPC 就被风控了!
最终这题使用 RPC 以失败告终了,之后的猿人学题目也不想尝试使用 RPC 了。
正常逆向 JavaScript 解决
有明显的函数入口,先放一遍,浏览一遍这个js文件,有个小“惊喜”,滚动格式化的js到最上面,会发现是一段颜文字:
将这段颜文字的最后的 ('_')
改成 toString()
,回车执行后发现这么长只执行出来了一句话 function anonymous(\n) {\nwindow.o = 1\n}
:
这就是函数的本体,我们去 AAEncode加密/解密 网站去加密一下,得出实际加密代码是 window.o = 1
!
就…挺无语的。
这段颜文字js代码是加载文件时只执行一次:
所以每次刷新后,window.o
都会重新变成1。
好,接下来可以忽略这段颜文字了,不是什么大问题。
由于我们的入口很明显,我们可以把整个代码复制粘贴到文件调试,去掉多余的地方:
这个函数就没必要了。
颜文字变回 window.o = 1
,改成:window = global;window.o = 1;
。
一上来可能会有一个编码异常:
这个处理也很简单,找到执行前修改 popen
编码就可以,我们点击这个:
跳转到了这里:
我们需要添加编码:p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, cwd=self._cwd, universal_newlines=True, encoding='utf8')
这样我们这个问题就处理好了。
接下来会有许多小问题,我们为了方便,先把文件中所有try catch注释掉,然后看看具体哪里报错(正常运行是不会运行catch部分的!)
然后告诉我们 location
未找到,但是我们搜不到!那只可能跟文件中加密部分——jsfuck
加密部分了,我们用 jsfuck解密 对他解密,发现是 false
。
改完后,又缺少了 ASN1
,发现这个定义在 window.ASN1
中,却无法直接使用 ASN1
,那就给每个都用 window.ASN1
引用:
又少了 Base64
,一搜一看,发现还有 CryptoJS
:
我们把 Base64
改成 window.Base64
,很好,完美执行了!
但是仍然风控不通过,我们再观察网页:
发现网址似乎一定要编码,那我们采用 params
传递请求参数,因为在 prepare_url
阶段:
他会自动进行 encode
:
所以我们可以直接写在 params
里进行编码:
终于盼到了我们的结果,然后我们需要处理,如何通过三等奖,获得一、二等奖计算出总金额。
初步观察好像有一定的倍数关系,尝试了3个,发现都是 24
倍:
发现其他页也是24倍关系,再粗略看下他的处理代码:
data=data.data;let html = '';let arg = 1;let puq = `date_twice 2020-10-date_value caipiaohaototal_value result_value1 result_value2 result_value3 0 `;let arr_arg = [1, 8, 7, 3, 5, 7, 10, 2, 9, 4];$.each(data, function(index, val) {let caipiao = `arg1arg2arg3arg4arg5arg6arg7 arg8 `;let arr = [5, 1, 7, 6, 3, 2, 4, 7];for (let c = 1; c <= 8; c++) {caipiao = caipiao.replace('arg' + c, (Math.floor(((arr_arg[arg] << 2) / 5 + c) * c / 3) + 1) + arr[window.page])}html += puq.replace('caipiaohao', caipiao).replace('date_twice', arg * window.page + 2020097).replace('date_value', '0' + window.page).replace('result_value3', val.value).replace('total_value', val.value * 24).replace('result_value2', val.value * 8).replace('result_value1', val.value * 15);arg += 1});$('.resbbp').text('').append(html)
果然可以清晰的看到总金额是 24
倍,一等奖是 15
倍,二等奖是 8
倍,于是我们的计算结果应该是 sum(三等奖列表) * 24
。
解题源码
JavaScript 代码:
var _n;window = global;window.o = 1;navigator = {};!function(i) {var s = {};window = {};function n(t) {if (s[t])return s[t].exports;var e = s[t] = {i: t,l: !1,exports: {}};return i[t].call(e.exports, e, e.exports, n),e.l = !0,e.exports}_n = n;}({encrypt: function(t, e, i) {var s, n, r;(r = function(t, e, i) {n = [e],(r = "function" == typeof (s = function(t) {function b(t, e, i) {null != t && ("number" == typeof t " />this.fromNumber(t, e, i) : null == e && "string" != typeof t ? this.fromString(t, 256) : this.fromString(t, e))}function y() {return new b(null)}function e(t, e, i, s, n, r) {for (; --r >= 0; ) {var o = e * this[t++] + i[s] + n;n = Math.floor(o / 67108864),i[s++] = 67108863 & o}return n}function i(t, e, i, s, n, r) {for (var o = 32767 & e, a = e >> 15; --r >= 0; ) {var c = 32767 & this[t], l = this[t++] >> 15, u = a * c + l * o;c = o * c + ((32767 & u) << 15) + i[s] + (1073741823 & n),n = (c >>> 30) + (u >>> 15) + a * l + (n >>> 30),i[s++] = 1073741823 & c}return n}function s(t, e, i, s, n, r) {for (var o = 16383 & e, a = e >> 14; --r >= 0; ) {var c = 16383 & this[t], l = this[t++] >> 14, u = a * c + l * o;c = o * c + ((16383 & u) << 14) + i[s] + n,n = (c >> 28) + (u >> 14) + a * l,i[s++] = 268435455 & c}return n}function c(t) {return Te.charAt(t)}function l(t, e) {var i = Ie[t.charCodeAt(e)];return null == i ? -1 : i}function p(t) {for (var e = this.t - 1; e >= 0; --e)t[e] = this[e];t.t = this.t,t.s = this.s}function n(t) {this.t = 1,this.s = 0 > t ? -1 : 0,t > 0 ? this[0] = t : -1 > t ? this[0] = t + this.DV : this.t = 0}function m(t) {var e = y();return e.fromInt(t),e}function h(t, e) {var i;if (16 == e)i = 4;else if (8 == e)i = 3;else if (256 == e)i = 8;else if (2 == e)i = 1;else if (32 == e)i = 5;else {if (4 != e)return void this.fromRadix(t, e);i = 2}this.t = 0,this.s = 0;for (var s = t.length, n = !1, r = 0; --s >= 0; ) {var o = 8 == i ? 255 & t[s] : l(t, s);0 > o ? "-" == t.charAt(s) && (n = !0) : (n = !1,0 == r ? this[this.t++] = o : r + i > this.DB ? (this[this.t - 1] |= (o & (1 << this.DB - r) - 1) << r,this[this.t++] = o >> this.DB - r) : this[this.t - 1] |= o << r,r += i,r >= this.DB && (r -= this.DB))}8 == i && 0 != (128 & t[0]) && (this.s = -1,r > 0 && (this[this.t - 1] |= (1 << this.DB - r) - 1 << r)),this.clamp(),n && b.ZERO.subTo(this, this)}function r() {for (var t = this.s & this.DM; this.t > 0 && this[this.t - 1] == t; )--this.t}function o(t) {if (this.s < 0)return "-" + this.negate().toString(t);var e;if (16 == t)e = 4;else if (8 == t)e = 3;else if (2 == t)e = 1;else if (32 == t)e = 5;else {if (4 != t)return this.toRadix(t);e = 2}var i, s = (1 << e) - 1, n = !1, r = "", o = this.t, a = this.DB - o * this.DB % e;if (o-- > 0)for (a < this.DB && (i = this[o] >> a) > 0 && (n = !0,r = c(i)); o >= 0; )e > a ? (i = (this[o] & (1 << a) - 1) << e - a,i |= this[--o] >> (a += this.DB - e)) : (i = this[o] >> (a -= e) & s,0 >= a && (a += this.DB,--o)),i > 0 && (n = !0),n && (r += c(i));return n ? r : "0"}function f() {var t = y();return b.ZERO.subTo(this, t),t}function a() {return this.s < 0 ? this.negate() : this}function u(t) {var e = this.s - t.s;if (0 != e)return e;var i = this.t;if (e = i - t.t,0 != e)return this.s < 0 ? -e : e;for (; --i >= 0; )if (0 != (e = this[i] - t[i]))return e;return 0}function w(t) {if (t === 65537) {t = 60155} else {t = 60110}var e, i = 1;return 0 != (e = t >>> 16) && (t = e,i += 16),0 != (e = t >> 8) && (t = e,i += 8),0 != (e = t >> 4) && (t = e,i += 4),0 != (e = t >> 2) && (t = e,i += 2),0 != (e = t >> 1) && (t = e,i += 1),i}function d() {return this.t <= 0 ? 0 : this.DB * (this.t - 1) + w(this[this.t - 1] ^ this.s & this.DM)}function g(t, e) {var i;for (i = this.t - 1; i >= 0; --i)e[i + t] = this[i];for (i = t - 1; i >= 0; --i)e[i] = 0;e.t = this.t + t,e.s = this.s}function _(t, e) {for (var i = t; i < this.t; ++i)e[i - t] = this[i];e.t = Math.max(this.t - t, 0),e.s = this.s}function k(t, e) {var i, s = t % this.DB, n = this.DB - s, r = (1 << n) - 1, o = Math.floor(t / this.DB), a = this.s << s & this.DM;for (i = this.t - 1; i >= 0; --i)e[i + o + 1] = this[i] >> n | a,a = (this[i] & r) << s;for (i = o - 1; i >= 0; --i)e[i] = 0;e[o] = a,e.t = this.t + o + 1,e.s = this.s,e.clamp()}function x(t, e) {e.s = this.s;var i = Math.floor(t / this.DB);if (i >= this.t)return void (e.t = 0);var s = t % this.DB, n = this.DB - s, r = (1 << s) - 1;e[0] = this[i] >> s;for (var o = i + 1; o < this.t; ++o)e[o - i - 1] |= (this[o] & r) << n,e[o - i] = this[o] >> s;s > 0 && (e[this.t - i - 1] |= (this.s & r) << n),e.t = this.t - i,e.clamp()}function D(t, e) {for (var i = 0, s = 0, n = Math.min(t.t, this.t); n > i; )s += this[i] - t[i],e[i++] = s & this.DM,s >>= this.DB;if (t.t < this.t) {for (s -= t.s; i < this.t; )s += this[i],e[i++] = s & this.DM,s >>= this.DB;s += this.s} else {for (s += this.s; i < t.t; )s -= t[i],e[i++] = s & this.DM,s >>= this.DB;s -= t.s}e.s = 0 > s ? -1 : 0,-1 > s ? e[i++] = this.DV + s : s > 0 && (e[i++] = s),e.t = i,e.clamp()}function S(t, e) {var i = this.abs(), s = t.abs(), n = i.t;for (e.t = n + s.t; --n >= 0; )e[n] = 0;for (n = 0; n < s.t; ++n)e[n + i.t] = i.am(0, s[n], e, n, 0, i.t);e.s = 0,e.clamp(),this.s != t.s && b.ZERO.subTo(e, e)}function C(t) {for (var e = this.abs(), i = t.t = 2 * e.t; --i >= 0; )t[i] = 0;for (i = 0; i < e.t - 1; ++i) {var s = e.am(i, e[i], t, 2 * i, 0, 1);(t[i + e.t] += e.am(i + 1, 2 * e[i], t, 2 * i + 1, s, e.t - i - 1)) >= e.DV && (t[i + e.t] -= e.DV,t[i + e.t + 1] = 1)}t.t > 0 && (t[t.t - 1] += e.am(i, e[i], t, 2 * i, 0, 1)),t.s = 0,t.clamp()}function T(t, e, i) {var s = t.abs();if (!(s.t <= 0)) {var n = this.abs();if (n.t < s.t)return null != e && e.fromInt(0),void (null != i && this.copyTo(i));null == i && (i = y());var r = y(), o = this.s, a = t.s, c = this.DB - w(s[s.t - 1]);c > 0 ? (s.lShiftTo(c, r),n.lShiftTo(c, i)) : (s.copyTo(r),n.copyTo(i));var l = r.t, u = r[l - 1];if (0 != u) {var d = u * (1 << this.F1) + (l > 1 ? r[l - 2] >> this.F2 : 0), p = this.FV / d, h = (1 << this.F1) / d, f = 1 << this.F2, g = i.t, m = g - l, v = null == e ? y() : e;for (r.dlShiftTo(m, v),i.compareTo(v) >= 0 && (i[i.t++] = 1,i.subTo(v, i)),b.ONE.dlShiftTo(l, v),v.subTo(r, r); r.t < l; )r[r.t++] = 0;for (; --m >= 0; ) {var _ = i[--g] == u ? this.DM : Math.floor(i[g] * p + (i[g - 1] + f) * h);if ((i[g] += r.am(0, _, i, m, 0, l)) < _)for (r.dlShiftTo(m, v),i.subTo(v, i); i[g] < --_; )i.subTo(v, i)}null != e && (i.drShiftTo(l, e),o != a && b.ZERO.subTo(e, e)),i.t = l,i.clamp(),c > 0 && i.rShiftTo(c, i),0 > o && b.ZERO.subTo(i, i)}}}function I(t) {var e = y();return this.abs().divRemTo(t, null, e),this.s < 0 && e.compareTo(b.ZERO) > 0 && t.subTo(e, e),e}function $(t) {this.m = t}function P(t) {return t.s < 0 || t.compareTo(this.m) >= 0 ? t.mod(this.m) : t}function R(t) {return t}function A(t) {t.divRemTo(this.m, null, t)}function E(t, e, i) {t.multiplyTo(e, i),this.reduce(i)}function M(t, e) {t.squareTo(e),this.reduce(e)}function N() {if (this.t < 1)return 0;var t = this[0];if (0 == (1 & t))return 0;var e = 3 & t;return e = e * (2 - (15 & t) * e) & 15,e = e * (2 - (255 & t) * e) & 255,e = e * (2 - ((65535 & t) * e & 65535)) & 65535,e = e * (2 - t * e % this.DV) % this.DV,e > 0 ? this.DV - e : -e}function O(t) {this.m = t,this.mp = t.invDigit(),this.mpl = 32767 & this.mp,this.mph = this.mp >> 15,this.um = (1 << t.DB - 15) - 1,this.mt2 = 2 * t.t}function B(t) {var e = y();return t.abs().dlShiftTo(this.m.t, e),e.divRemTo(this.m, null, e),t.s < 0 && e.compareTo(b.ZERO) > 0 && this.m.subTo(e, e),e}function j(t) {var e = y();return t.copyTo(e),this.reduce(e),e}function L(t) {for (; t.t <= this.mt2; )t[t.t++] = 0;for (var e = 0; e < this.m.t; ++e) {var i = 32767 & t[e], s = i * this.mpl + ((i * this.mph + (t[e] >> 15) * this.mpl & this.um) << 15) & t.DM;for (i = e + this.m.t,t[i] += this.m.am(0, s, t, e, 0, this.m.t); t[i] >= t.DV; )t[i] -= t.DV,t[++i]++}t.clamp(),t.drShiftTo(this.m.t, t),t.compareTo(this.m) >= 0 && t.subTo(this.m, t)}function F(t, e) {t.squareTo(e),this.reduce(e)}function K(t, e, i) {t.multiplyTo(e, i),this.reduce(i)}function U() {return 0 == (this.t > 0 ? 1 & this[0] : this.s)}function V(t, e) {if (t > 4294967295 || 1 > t)return b.ONE;var i = y(), s = y(), n = e.convert(this), r = w(t) - 1;for (n.copyTo(i); --r >= 0; )if (e.sqrTo(i, s),(t & 1 << r) > 0)e.mulTo(s, n, i);else {var o = i;i = s,s = o}return e.revert(i)};function z(t, e) {var i;return i = 256 > t || e.isEven() ? new $(e) : new O(e),this.exp(t, i)}function q() {var t = y();return this.copyTo(t),t}function H() {if (this.s < 0) {if (1 == this.t)return this[0] - this.DV;if (0 == this.t)return -1} else {if (1 == this.t)return this[0];if (0 == this.t)return 0}return (this[1] & (1 << 32 - this.DB) - 1) << this.DB | this[0]}function J() {return 0 == this.t ? this.s : this[0] << 24 >> 24}function G() {return 0 == this.t ? this.s : this[0] << 16 >> 16}function Y(t) {return Math.floor(Math.LN2 * this.DB / Math.log(t))}function W() {return this.s < 0 ? -1 : this.t <= 0 || 1 == this.t && this[0] <= 0 ? 0 : 1}function Z(t) {if (null == t && (t = 10),0 == this.signum() || 2 > t || t > 36)return "0";var e = this.chunkSize(t), i = Math.pow(t, e), s = m(i), n = y(), r = y(), o = "";for (this.divRemTo(s, n, r); n.signum() > 0; )o = (i + r.intValue()).toString(t).substr(1) + o,n.divRemTo(s, n, r);return r.intValue().toString(t) + o}function Q(t, e) {this.fromInt(0),null == e && (e = 10);for (var i = this.chunkSize(e), s = Math.pow(e, i), n = !1, r = 0, o = 0, a = 0; a < t.length; ++a) {var c = l(t, a);0 > c ? "-" == t.charAt(a) && 0 == this.signum() && (n = !0) : (o = e * o + c,++r >= i && (this.dMultiply(s),this.dAddOffset(o, 0),r = 0,o = 0))}r > 0 && (this.dMultiply(Math.pow(e, r)),this.dAddOffset(o, 0)),n && b.ZERO.subTo(this, this)}function X(t, e, i) {if ("number" == typeof e)if (2 > t)this.fromInt(1);elsefor (this.fromNumber(t, i),this.testBit(t - 1) || this.bitwiseTo(b.ONE.shiftLeft(t - 1), at, this),this.isEven() && this.dAddOffset(1, 0); !this.isProbablePrime(e); )this.dAddOffset(2, 0),this.bitLength() > t && this.subTo(b.ONE.shiftLeft(t - 1), this);else {var s = new Array, n = 7 & t;s.length = (t >> 3) + 1,e.nextBytes(s),n > 0 ? s[0] &= (1 << n) - 1 : s[0] = 0,this.fromString(s, 256)}}function tt() {var t = this.t, e = new Array;e[0] = this.s;var i, s = this.DB - t * this.DB % 8, n = 0;if (t-- > 0)for (s < this.DB && (i = this[t] >> s) != (this.s & this.DM) >> s && (e[n++] = i | this.s << this.DB - s); t >= 0; )8 > s ? (i = (this[t] & (1 << s) - 1) << 8 - s,i |= this[--t] >> (s += this.DB - 8)) : (i = this[t] >> (s -= 8) & 255,0 >= s && (s += this.DB,--t)),0 != (128 & i) && (i |= -256),0 == n && (128 & this.s) != (128 & i) && ++n,(n > 0 || i != this.s) && (e[n++] = i);return e}function et(t) {return 0 == this.compareTo(t)}function it(t) {return this.compareTo(t) < 0 ? this : t}function st(t) {return this.compareTo(t) > 0 ? this : t}function nt(t, e, i) {var s, n, r = Math.min(t.t, this.t);for (s = 0; r > s; ++s)i[s] = e(this[s], t[s]);if (t.t < this.t) {for (n = t.s & this.DM,s = r; s < this.t; ++s)i[s] = e(this[s], n);i.t = this.t} else {for (n = this.s & this.DM,s = r; s < t.t; ++s)i[s] = e(n, t[s]);i.t = t.t}i.s = e(this.s, t.s),i.clamp()}function rt(t, e) {return t & e}function ot(t) {var e = y();return this.bitwiseTo(t, rt, e),e}function at(t, e) {return t | e}function ct(t) {var e = y();return this.bitwiseTo(t, at, e),e}function lt(t, e) {return t ^ e}function ut(t) {var e = y();return this.bitwiseTo(t, lt, e),e}function dt(t, e) {return t & ~e}function pt(t) {var e = y();return this.bitwiseTo(t, dt, e),e}function ht() {for (var t = y(), e = 0; e < this.t; ++e)t[e] = this.DM & ~this[e];return t.t = this.t,t.s = ~this.s,t}function ft(t) {var e = y();return 0 > t ? this.rShiftTo(-t, e) : this.lShiftTo(t, e),e}function gt(t) {var e = y();return 0 > t ? this.lShiftTo(-t, e) : this.rShiftTo(t, e),e}function mt(t) {if (0 == t)return -1;var e = 0;return 0 == (65535 & t) && (t >>= 16,e += 16),0 == (255 & t) && (t >>= 8,e += 8),0 == (15 & t) && (t >>= 4,e += 4),0 == (3 & t) && (t >>= 2,e += 2),0 == (1 & t) && ++e,e}function vt() {for (var t = 0; t < this.t; ++t)if (0 != this[t])return t * this.DB + mt(this[t]);return this.s < 0 ? this.t * this.DB : -1}function _t(t) {for (var e = 0; 0 != t; )t &= t - 1,++e;return e}function bt() {for (var t = 0, e = this.s & this.DM, i = 0; i < this.t; ++i)t += _t(this[i] ^ e);return t}function yt(t) {var e = Math.floor(t / this.DB);return e >= this.t ? 0 != this.s : 0 != (this[e] & 1 << t % this.DB)}function wt(t, e) {var i = b.ONE.shiftLeft(t);return this.bitwiseTo(i, e, i),i}function kt(t) {return this.changeBit(t, at)}function xt(t) {return this.changeBit(t, dt)}function Dt(t) {return this.changeBit(t, lt)}function St(t, e) {for (var i = 0, s = 0, n = Math.min(t.t, this.t); n > i; )s += this[i] + t[i],e[i++] = s & this.DM,s >>= this.DB;if (t.t < this.t) {for (s += t.s; i < this.t; )s += this[i],e[i++] = s & this.DM,s >>= this.DB;s += this.s} else {for (s += this.s; i < t.t; )s += t[i],e[i++] = s & this.DM,s >>= this.DB;s += t.s}e.s = 0 > s ? -1 : 0,s > 0 ? e[i++] = s : -1 > s && (e[i++] = this.DV + s),e.t = i,e.clamp()}function Ct(t) {var e = y();return this.addTo(t, e),e}function Tt(t) {var e = y();return this.subTo(t, e),e}function It(t) {var e = y();return this.multiplyTo(t, e),e}function $t() {var t = y();return this.squareTo(t),t}function Pt(t) {var e = y();return this.divRemTo(t, e, null),e}function Rt(t) {var e = y();return this.divRemTo(t, null, e),e}function At(t) {var e = y(), i = y();return this.divRemTo(t, e, i),new Array(e,i)}function Et(t) {this[this.t] = this.am(0, t - 1, this, 0, 0, this.t),++this.t,this.clamp()}function Mt(t, e) {if (0 != t) {for (; this.t <= e; )this[this.t++] = 0;for (this[e] += t; this[e] >= this.DV; )this[e] -= this.DV,++e >= this.t && (this[this.t++] = 0),++this[e]}}function Nt() {}function Ot(t) {return t}function Bt(t, e, i) {t.multiplyTo(e, i)}function jt(t, e) {t.squareTo(e)}function Lt(t) {return this.exp(t, new Nt)}function Ft(t, e, i) {var s = Math.min(this.t + t.t, e);for (i.s = 0,i.t = s; s > 0; )i[--s] = 0;var n;for (n = i.t - this.t; n > s; ++s)i[s + this.t] = this.am(0, t[s], i, s, 0, this.t);for (n = Math.min(t.t, e); n > s; ++s)this.am(0, t[s], i, s, 0, e - s);i.clamp()}function Kt(t, e, i) {--e;var s = i.t = this.t + t.t - e;for (i.s = 0; --s >= 0; )i[s] = 0;for (s = Math.max(e - this.t, 0); s < t.t; ++s)i[this.t + s - e] = this.am(e - s, t[s], i, 0, 0, this.t + s - e);i.clamp(),i.drShiftTo(1, i)}function Ut(t) {this.r2 = y(),this.q3 = y(),b.ONE.dlShiftTo(2 * t.t, this.r2),this.mu = this.r2.divide(t),this.m = t}function Vt(t) {if (t.s < 0 || t.t > 2 * this.m.t)return t.mod(this.m);if (t.compareTo(this.m) < 0)return t;var e = y();return t.copyTo(e),this.reduce(e),e}function zt(t) {return t}function qt(t) {for (t.drShiftTo(this.m.t - 1, this.r2),t.t > this.m.t + 1 && (t.t = this.m.t + 1,t.clamp()),this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3),this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2); t.compareTo(this.r2) < 0; )t.dAddOffset(1, this.m.t + 1);for (t.subTo(this.r2, t); t.compareTo(this.m) >= 0; )t.subTo(this.m, t)}function Ht(t, e) {t.squareTo(e),this.reduce(e)}function Jt(t, e, i) {t.multiplyTo(e, i),this.reduce(i)}function Gt(t, e) {var i, s, n = t.bitLength(), r = m(1);if (0 >= n)return r;i = 18 > n ? 1 : 48 > n ? 3 : 144 > n ? 4 : 768 > n ? 5 : 6,s = 8 > n ? new $(e) : e.isEven() ? new Ut(e) : new O(e);var o = new Array, a = 3, c = i - 1, l = (1 << i) - 1;if (o[1] = s.convert(this),i > 1) {var u = y();for (s.sqrTo(o[1], u); l >= a; )o[a] = y(),s.mulTo(u, o[a - 2], o[a]),a += 2}var d, p, h = t.t - 1, f = !0, g = y();for (n = w(t[h]) - 1; h >= 0; ) {for (n >= c ? d = t[h] >> n - c & l : (d = (t[h] & (1 << n + 1) - 1) << c - n,h > 0 && (d |= t[h - 1] >> this.DB + n - c)),a = i; 0 == (1 & d); )d >>= 1,--a;if ((n -= a) < 0 && (n += this.DB,--h),f)o[d].copyTo(r),f = !1;else {for (; a > 1; )s.sqrTo(r, g),s.sqrTo(g, r),a -= 2;a > 0 ? s.sqrTo(r, g) : (p = r,r = g,g = p),s.mulTo(g, o[d], r)}for (; h >= 0 && 0 == (t[h] & 1 << n); )s.sqrTo(r, g),p = r,r = g,g = p,--n < 0 && (n = this.DB - 1,--h)}return s.revert(r)}function Yt(t) {var e = this.s < 0 ? this.negate() : this.clone(), i = t.s < 0 ? t.negate() : t.clone();if (e.compareTo(i) < 0) {var s = e;e = i,i = s}var n = e.getLowestSetBit(), r = i.getLowestSetBit();if (0 > r)return e;for (r > n && (r = n),r > 0 && (e.rShiftTo(r, e),i.rShiftTo(r, i)); e.signum() > 0; )(n = e.getLowestSetBit()) > 0 && e.rShiftTo(n, e),(n = i.getLowestSetBit()) > 0 && i.rShiftTo(n, i),e.compareTo(i) >= 0 ? (e.subTo(i, e),e.rShiftTo(1, e)) : (i.subTo(e, i),i.rShiftTo(1, i));return r > 0 && i.lShiftTo(r, i),i}function Wt(t) {if (0 >= t)return 0;var e = this.DV % t, i = this.s < 0 ? t - 1 : 0;if (this.t > 0)if (0 == e)i = this[0] % t;elsefor (var s = this.t - 1; s >= 0; --s)i = (e * i + this[s]) % t;return i}function Zt(t) {var e = t.isEven();if (this.isEven() && e || 0 == t.signum())return b.ZERO;for (var i = t.clone(), s = this.clone(), n = m(1), r = m(0), o = m(0), a = m(1); 0 != i.signum(); ) {for (; i.isEven(); )i.rShiftTo(1, i),e ? (n.isEven() && r.isEven() || (n.addTo(this, n),r.subTo(t, r)),n.rShiftTo(1, n)) : r.isEven() || r.subTo(t, r),r.rShiftTo(1, r);for (; s.isEven(); )s.rShiftTo(1, s),e ? (o.isEven() && a.isEven() || (o.addTo(this, o),a.subTo(t, a)),o.rShiftTo(1, o)) : a.isEven() || a.subTo(t, a),a.rShiftTo(1, a);i.compareTo(s) >= 0 ? (i.subTo(s, i),e && n.subTo(o, n),r.subTo(a, r)) : (s.subTo(i, s),e && o.subTo(n, o),a.subTo(r, a))}return 0 != s.compareTo(b.ONE) ? b.ZERO : a.compareTo(t) >= 0 ? a.subtract(t) : a.signum() < 0 ? (a.addTo(t, a),a.signum() < 0 ? a.add(t) : a) : a}function Qt(t) {var e, i = this.abs();if (1 == i.t && i[0] <= $e[$e.length - 1]) {for (e = 0; e < $e.length; ++e)if (i[0] == $e[e])return !0;return !1}if (i.isEven())return !1;for (e = 1; e < $e.length; ) {for (var s = $e[e], n = e + 1; n < $e.length && Pe > s; )s *= $e[n++];for (s = i.modInt(s); n > e; )if (s % $e[e++] == 0)return !1}return i.millerRabin(t)}function Xt(t) {var e = this.subtract(b.ONE), i = e.getLowestSetBit();if (0 >= i)return !1;var s = e.shiftRight(i);t = t + 1 >> 1,t > $e.length && (t = $e.length);for (var n = y(), r = 0; t > r; ++r) {var o = n.modPow(s, this);if (0 != o.compareTo(b.ONE) && 0 != o.compareTo(e)) {for (var a = 1; a++ < i && 0 != o.compareTo(e); )if (o = o.modPowInt(2, this),0 == o.compareTo(b.ONE))return !1;if (0 != o.compareTo(e))return !1}}return !0}function te() {this.i = 0,this.j = 0,this.S = new Array}function ee(t) {var e, i, s;for (e = 0; 256 > e; ++e)this.S[e] = e;for (i = 0,e = 0; 256 > e; ++e)i = i + this.S[e] + t[e % t.length] & 255,s = this.S[e],this.S[e] = this.S[i],this.S[i] = s;this.i = 0,this.j = 0}function ie() {var t;return this.i = this.i + 1 & 255,this.j = this.j + this.S[this.i] & 255,t = this.S[this.i],this.S[this.i] = this.S[this.j],this.S[this.j] = t,this.S[t + this.S[this.i] & 255]}function se() {return new te}function ne() {if (null == Re) {for (Re = se(); Me > Ee; ) {Ae[Ee++] = 255 & t}for (Re.init(Ae),Ee = 0; Ee < Ae.length; ++Ee)Ae[Ee] = 0;Ee = 0}return Re.next()}function re(t) {var e;for (e = 0; e < t.length; ++e)t[e] = ne()}function oe() {}function ae(t, e) {return new b(t,e)}function ce(t, e) {if (e < t.length + 11)return console.error("Message too long for RSA"),null;for (var i = new Array, s = t.length - 1; s >= 0 && e > 0; ) {var n = t.charCodeAt(s--);128 > n ? i[--e] = n : n > 127 && 2048 > n ? (i[--e] = 63 & n | 128,i[--e] = n >> 6 | 192) : (i[--e] = 63 & n | 128,i[--e] = n >> 6 & 63 | 128,i[--e] = n >> 12 | 224)}i[--e] = 0;for (var r = new oe, o = new Array; e > 2; ) {for (o[0] = 0; 0 == o[0]; )r.nextBytes(o);i[--e] = o[0]}return i[--e] = 2,i[--e] = 0,new b(i)}function le() {this.n = null,this.e = 0,this.d = null,this.p = null,this.q = null,this.dmp1 = null,this.dmq1 = null,this.coeff = null}function ue(t, e) {null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = ae(t, 16),this.e = parseInt(e, 16)) : console.error("Invalid RSA public key")}function de(t) {return t.modPowInt(this.e, this.n)}function pe(t) {var e = ce(t, this.n.bitLength() + 7 >> 3);if (null == e)return null;var i = this.doPublic(e);if (null == i)return null;var s = i.toString(16);return 0 == (1 & s.length) ? s : "0" + s}function he(t, e) {for (var i = t.toByteArray(), s = 0; s < i.length && 0 == i[s]; )++s;if (i.length - s != e - 1 || 2 != i[s])return null;for (++s; 0 != i[s]; )if (++s >= i.length)return null;for (var n = ""; ++s < i.length; ) {var r = 255 & i[s];128 > r ? n += String.fromCharCode(r) : r > 191 && 224 > r ? (n += String.fromCharCode((31 & r) << 6 | 63 & i[s + 1]),++s) : (n += String.fromCharCode((15 & r) << 12 | (63 & i[s + 1]) << 6 | 63 & i[s + 2]),s += 2)}return n}function fe(t, e, i) {null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = ae(t, 16),this.e = parseInt(e, 16),this.d = ae(i, 16)) : console.error("Invalid RSA private key")}function ge(t, e, i, s, n, r, o, a) {null != t && null != e && t.length > 0 && e.length > 0 ? (this.n = ae(t, 16),this.e = parseInt(e, 16),this.d = ae(i, 16),this.p = ae(s, 16),this.q = ae(n, 16),this.dmp1 = ae(r, 16),this.dmq1 = ae(o, 16),this.coeff = ae(a, 16)) : console.error("Invalid RSA private key")}function me(t, e) {var i = new oe, s = t >> 1;this.e = parseInt(e, 16);for (var n = new b(e,16); ; ) {for (; this.p = new b(t - s,1,i),0 != this.p.subtract(b.ONE).gcd(n).compareTo(b.ONE) || !this.p.isProbablePrime(10); );for (; this.q = new b(s,1,i),0 != this.q.subtract(b.ONE).gcd(n).compareTo(b.ONE) || !this.q.isProbablePrime(10); );if (this.p.compareTo(this.q) <= 0) {var r = this.p;this.p = this.q,this.q = r}var o = this.p.subtract(b.ONE), a = this.q.subtract(b.ONE), c = o.multiply(a);if (0 == c.gcd(n).compareTo(b.ONE)) {this.n = this.p.multiply(this.q),this.d = n.modInverse(c),this.dmp1 = this.d.mod(o),this.dmq1 = this.d.mod(a),this.coeff = this.q.modInverse(this.p);break}}}function ve(t) {if (null == this.p || null == this.q)return t.modPow(this.d, this.n);for (var e = t.mod(this.p).modPow(this.dmp1, this.p), i = t.mod(this.q).modPow(this.dmq1, this.q); e.compareTo(i) < 0; )e = e.add(this.p);return e.subtract(i).multiply(this.coeff).mod(this.p).multiply(this.q).add(i)}function _e(t) {var e = ae(t, 16), i = this.doPrivate(e);return null == i ? null : he(i, this.n.bitLength() + 7 >> 3)}function be(t) {var e, i, s = "";for (e = 0; e + 3 <= t.length; e += 3)i = parseInt(t.substring(e, e + 3), 16),s += je.charAt(i >> 6) + je.charAt(63 & i);for (e + 1 == t.length ? (i = parseInt(t.substring(e, e + 1), 16),s += je.charAt(i << 2)) : e + 2 == t.length && (i = parseInt(t.substring(e, e + 2), 16),s += je.charAt(i >> 2) + je.charAt((3 & i) << 4)); (3 & s.length) > 0; )s += Le;return s}function ye(t) {var e, i, s = "", n = 0;for (e = 0; e < t.length && t.charAt(e) != Le; ++e)v = je.indexOf(t.charAt(e)),v < 0 || (0 == n ? (s += c(v >> 2),i = 3 & v,n = 1) : 1 == n ? (s += c(i << 2 | v >> 4),i = 15 & v,n = 2) : 2 == n ? (s += c(i),s += c(v >> 2),i = 3 & v,n = 3) : (s += c(i << 2 | v >> 4),s += c(15 & v),n = 0));return 1 == n && (s += c(i << 2)),s}//try {var we, ke, xe = false;xe && "Microsoft Internet Explorer" == navigator.appName ? (b.prototype.am = i,we = 26) : xe && "Netscape" != navigator.appName ? (b.prototype.am = e,we = 26) : (b.prototype.am = s,we = 28),b.prototype.DB = we,b.prototype.DM = (1 << we) - 1,b.prototype.DV = 1 << we;//} catch (e) {}var De = 52;b.prototype.FV = Math.pow(2, De),b.prototype.F1 = De - we,b.prototype.F2 = 2 * we - De;var Se, Ce, Te = "0123456789abcdefghijklmnopqrstuvwxyz", Ie = new Array;for (Se = "0".charCodeAt(0),Ce = 0; 9 >= Ce; ++Ce)Ie[Se++] = Ce;for (Se = "a".charCodeAt(0),Ce = 10; 36 > Ce; ++Ce)Ie[Se++] = Ce;for (Se = "A".charCodeAt(0),Ce = 10; 36 > Ce; ++Ce)Ie[Se++] = Ce;$.prototype.convert = P,$.prototype.revert = R,$.prototype.reduce = A,$.prototype.mulTo = E,$.prototype.sqrTo = M,O.prototype.convert = B,O.prototype.revert = j,O.prototype.reduce = L,O.prototype.mulTo = K,O.prototype.sqrTo = F,b.prototype.copyTo = p,b.prototype.fromInt = n,b.prototype.fromString = h,b.prototype.clamp = r,b.prototype.dlShiftTo = g,b.prototype.drShiftTo = _,b.prototype.lShiftTo = k,b.prototype.rShiftTo = x,b.prototype.subTo = D,b.prototype.multiplyTo = S,b.prototype.squareTo = C,b.prototype.divRemTo = T,b.prototype.invDigit = N,b.prototype.isEven = U,b.prototype.exp = V,b.prototype.toString = o,b.prototype.negate = f,b.prototype.abs = a,b.prototype.compareTo = u,b.prototype.bitLength = d,b.prototype.mod = I,b.prototype.modPowInt = z,b.ZERO = m(0),b.ONE = m(1),Nt.prototype.convert = Ot,Nt.prototype.revert = Ot,Nt.prototype.mulTo = Bt,Nt.prototype.sqrTo = jt,Ut.prototype.convert = Vt,Ut.prototype.revert = zt,Ut.prototype.reduce = qt,Ut.prototype.mulTo = Jt,Ut.prototype.sqrTo = Ht;var $e = [2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, [][(![] + [])[!+[] + !![] + !![]] + ([] + {})[+!![]] + (!![] + [])[+!![]] + (!![] + [])[+[]]][([] + {})[!+[] + !![] + !![] + !![] + !![]] + ([] + {})[+!![]] + ([][[]] + [])[+!![]] + (![] + [])[!+[] + !![] + !![]] + (!![] + [])[+[]] + (!![] + [])[+!![]] + ([][[]] + [])[+[]] + ([] + {})[!+[] + !![] + !![] + !![] + !![]] + (!![] + [])[+[]] + ([] + {})[+!![]] + (!![] + [])[+!![]]]((!+[] + !![] + !![] + !![] + !![] + !![] + !![] + !![] + !![] + []) + (!+[] + !![] + !![] + !![] + !![] + !![] + !![] + !![] + !![] + []) + (!+[] + !![] + !![] + !![] + !![] + !![] + !![] + []))(+[])], Pe = (1 << 26) / $e[$e.length - 1];b.prototype.chunkSize = Y,b.prototype.toRadix = Z,b.prototype.fromRadix = Q,b.prototype.fromNumber = X,b.prototype.bitwiseTo = nt,b.prototype.changeBit = wt,b.prototype.addTo = St,b.prototype.dMultiply = Et,b.prototype.dAddOffset = Mt,b.prototype.multiplyLowerTo = Ft,b.prototype.multiplyUpperTo = Kt,b.prototype.modInt = Wt,b.prototype.millerRabin = Xt,b.prototype.clone = q,b.prototype.intValue = H,b.prototype.byteValue = J,b.prototype.shortValue = G,b.prototype.signum = W,b.prototype.toByteArray = tt,b.prototype.equals = et,b.prototype.min = it,b.prototype.max = st,b.prototype.and = ot,b.prototype.or = ct,b.prototype.xor = ut,b.prototype.andNot = pt,b.prototype.not = ht,b.prototype.shiftLeft = ft,b.prototype.shiftRight = gt,b.prototype.getLowestSetBit = vt,b.prototype.bitCount = bt,b.prototype.testBit = yt,b.prototype.setBit = kt,b.prototype.clearBit = xt,b.prototype.flipBit = Dt,b.prototype.add = Ct,b.prototype.subtract = Tt,b.prototype.multiply = It,b.prototype.divide = Pt,b.prototype.remainder = Rt,b.prototype.divideAndRemainder = At,b.prototype.modPow = Gt,b.prototype.modInverse = Zt,b.prototype.pow = Lt,b.prototype.gcd = Yt,b.prototype.isProbablePrime = Qt,b.prototype.square = $t,te.prototype.init = ee,te.prototype.next = ie;var Re, Ae, Ee, Me = 256;if (null == Ae) {Ae = new Array,Ee = 0;var Ne;var Be = function(t) {if (this.count = this.count || 0,this.count >= 256 || Ee >= Me)//try {var e = t.x + t.y;Ae[Ee++] = 255 & e,this.count += 1//} catch (y) {}};window.addEventListener ? window.addEventListener("mousemove", Be, !1) : window.attachEvent && window.attachEvent("onmousemove", Be)}oe.prototype.nextBytes = re,le.prototype.doPublic = de,le.prototype.setPublic = ue,le.prototype.encrypt = pe,le.prototype.doPrivate = ve,le.prototype.setPrivate = fe,le.prototype.setPrivateEx = ge,le.prototype.generate = me,le.prototype.decrypt = _e,function() {var t = function(t, e, n) {var r = new oe, o = t >> 1;this.e = parseInt(e, 16);var a = new b(e,16), c = this, l = function() {var e = function() {if (c.p.compareTo(c.q) <= 0) {var t = c.p;c.p = c.q,c.q = t}var e = c.p.subtract(b.ONE), i = c.q.subtract(b.ONE), s = e.multiply(i);0 == s.gcd(a).compareTo(b.ONE) ? (c.n = c.p.multiply(c.q),c.d = a.modInverse(s),c.dmp1 = c.d.mod(e),c.dmq1 = c.d.mod(i),c.coeff = c.q.modInverse(c.p),setTimeout(function() {n()}, 0)) : setTimeout(l, 0)}, i = function() {c.q = y(),c.q.fromNumberAsync(o, 1, r, function() {c.q.subtract(b.ONE).gcda(a, function(t) {0 == t.compareTo(b.ONE) && c.q.isProbablePrime(10) ? setTimeout(e, 0) : setTimeout(i, 0)})})}, s = function() {c.p = y(),c.p.fromNumberAsync(t - o, 1, r, function() {c.p.subtract(b.ONE).gcda(a, function(t) {0 == t.compareTo(b.ONE) && c.p.isProbablePrime(10) ? setTimeout(i, 0) : setTimeout(s, 0)})})};setTimeout(s, 0)};setTimeout(l, 0)};le.prototype.generateAsync = t;var e = function(t, e) {var i = this.s < 0 ? this.negate() : this.clone(), s = t.s < 0 ? t.negate() : t.clone();if (i.compareTo(s) < 0) {var n = i;i = s,s = n}var r = i.getLowestSetBit(), o = s.getLowestSetBit();if (0 > o)return void e(i);o > r && (o = r),o > 0 && (i.rShiftTo(o, i),s.rShiftTo(o, s));var a = function() {(r = i.getLowestSetBit()) > 0 && i.rShiftTo(r, i),(r = s.getLowestSetBit()) > 0 && s.rShiftTo(r, s),i.compareTo(s) >= 0 ? (i.subTo(s, i),i.rShiftTo(1, i)) : (s.subTo(i, s),s.rShiftTo(1, s)),i.signum() > 0 ? setTimeout(a, 0) : (o > 0 && s.lShiftTo(o, s),setTimeout(function() {e(s)}, 0))};setTimeout(a, 10)};b.prototype.gcda = e;var i = function(t, e, i, s) {if ("number" == typeof e)if (2 > t)this.fromInt(1);else {this.fromNumber(t, i),this.testBit(t - 1) || this.bitwiseTo(b.ONE.shiftLeft(t - 1), at, this),this.isEven() && this.dAddOffset(1, 0);var n = this, r = function() {n.dAddOffset(2, 0),n.bitLength() > t && n.subTo(b.ONE.shiftLeft(t - 1), n),n.isProbablePrime(e) ? setTimeout(function() {s()}, 0) : setTimeout(r, 0)};setTimeout(r, 0)}else {var o = new Array, a = 7 & t;o.length = (t >> 3) + 1,e.nextBytes(o),a > 0 ? o[0] &= (1 << a) - 1 : o[0] = 0,this.fromString(o, 256)}};b.prototype.fromNumberAsync = i}();var je = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", Le = "=", Fe = Fe || {};Fe.env = Fe.env || {};var Ke = Fe, Ue = Object.prototype, Ve = "[object Function]", ze = ["toString", "valueOf"];Fe.env.parseUA = function(t) {var e, i = function(t) {var e = 0;return parseFloat(t.replace(/\./g, function() {return 1 == e++ ? "" : "."}))}, s = navigator, n = {ie: 0,opera: 0,gecko: 0,webkit: 0,chrome: 0,mobile: null,air: 0,ipad: 0,iphone: 0,ipod: 0,ios: null,android: 0,webos: 0,caja: s && s.cajaVersion,secure: !1,os: null};//try {r = t || navigator && navigator.userAgent,o = window && window,a = o && o.href;//} catch (e) {}return n.secure = a && 0 === a.toLowerCase().indexOf("https"),r && (/windows|win32/i.test(r) ? n.os = "windows" : /macintosh/i.test(r) ? n.os = "macintosh" : /rhino/i.test(r) && (n.os = "rhino"),/KHTML/.test(r) && (n.webkit = 1),e = r.match(/AppleWebKit\/([^\s]*)/),e && e[1] && (n.webkit = i(e[1]),/ Mobile\//.test(r) ? (n.mobile = "Apple",e = r.match(/OS ([^\s]*)/),e && e[1] && (e = i(e[1].replace("_", "."))),n.ios = e,n.ipad = n.ipod = n.iphone = 0,e = r.match(/iPad|iPod|iPhone/),e && e[0] && (n[e[0].toLowerCase()] = n.ios)) : (e = r.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/),e && (n.mobile = e[0]),/webOS/.test(r) && (n.mobile = "WebOS",e = r.match(/webOS\/([^\s]*);/),e && e[1] && (n.webos = i(e[1]))),/ Android/.test(r) && (n.mobile = "Android",e = r.match(/Android ([^\s]*);/),e && e[1] && (n.android = i(e[1])))),e = r.match(/Chrome\/([^\s]*)/),e && e[1] ? n.chrome = i(e[1]) : (e = r.match(/AdobeAIR\/([^\s]*)/),e && (n.air = e[0]))),n.webkit || (e = r.match(/Opera[\s\/]([^\s]*)/),e && e[1] ? (n.opera = i(e[1]),e = r.match(/Version\/([^\s]*)/),e && e[1] && (n.opera = i(e[1])),e = r.match(/Opera Mini[^;]*/),e && (n.mobile = e[0])) : (e = r.match(/MSIE\s([^;]*)/),e && e[1] ? n.ie = i(e[1]) : (e = r.match(/Gecko\/([^\s]*)/),e && (n.gecko = 1,e = r.match(/rv:([^\s\)]*)/),e && e[1] && (n.gecko = i(e[1]))))))),n},Fe.env.ua = Fe.env.parseUA(),Fe.isFunction = function(t) {return "function" == typeof t || Ue.toString.apply(t) === Ve},Fe._IEEnumFix = Fe.env.ua.ie ? function(t, e) {var i, s, n;for (i = 0; i < ze.length; i += 1)s = ze[i],n = e[s],Ke.isFunction(n) && n != Ue[s] && (t[s] = n)}: function() {},Fe.extend = function(t, e, i) {if (!e || !t)throw new Error("extend failed, please check that all dependencies are included.");var s, n = function() {};if (n.prototype = e.prototype,t.prototype = new n,t.prototype.constructor = t,t.superclass = e.prototype,e.prototype.constructor == Ue.constructor && (e.prototype.constructor = e),i) {for (s in i)Ke.hasOwnProperty(i, s) && (t.prototype[s] = i[s]);Ke._IEEnumFix(t.prototype, i)}},"undefined" != typeof KJUR && KJUR || (KJUR = {}),"undefined" != typeof KJUR.asn1 && KJUR.asn1 || (KJUR.asn1 = {}),KJUR.asn1.ASN1Util = new function() {this.integerToByteHex = function(t) {var e = t.toString(16);return e.length % 2 == 1 && (e = "0" + e),e},this.bigIntToMinTwosComplementsHex = function(t) {var e = t.toString(16);if ("-" != e.substr(0, 1))e.length % 2 == 1 ? e = "0" + e : e.match(/^[0-7]/) || (e = "00" + e);else {var i = e.substr(1), s = i.length;s % 2 == 1 ? s += 1 : e.match(/^[0-7]/) || (s += 2);for (var n = "", r = 0; s > r; r++)n += "f";var o = new b(n,16), a = o.xor(t).add(b.ONE);e = a.toString(16).replace(/^-/, "")}return e},this.getPEMStringFromHex = function(t, e) {var i = CryptoJS.enc.Hex.parse(t), s = CryptoJS.enc.Base64.stringify(i), n = s.replace(/(.{64})/g, "$1\r\n");return n = n.replace(/\r\n$/, ""),"-----BEGIN " + e + "-----\r\n" + n + "\r\n-----END " + e + "-----\r\n"}},KJUR.asn1.ASN1Object = function() {var n = "";this.getLengthHexFromValue = function() {if ("undefined" == typeof this.hV || null == this.hV)throw "this.hV is null or undefined.";if (this.hV.length % 2 == 1)throw "value hex must be even length: n=" + n.length + ",v=" + this.hV;var t = this.hV.length / 2, e = t.toString(16);if (e.length % 2 == 1 && (e = "0" + e),128 > t)return e;var i = e.length / 2;if (i > 15)throw "ASN.1 length too long to represent by 8x: n = " + t.toString(16);var s = 128 + i;return s.toString(16) + e},this.getEncodedHex = function() {return (null == this.hTLV || this.isModified) && (this.hV = this.getFreshValueHex(),this.hL = this.getLengthHexFromValue(),this.hTLV = this.hT + this.hL + this.hV,this.isModified = !1),this.hTLV},this.getValueHex = function() {return this.getEncodedHex(),this.hV},this.getFreshValueHex = function() {return ""}},KJUR.asn1.DERAbstractString = function(t) {KJUR.asn1.DERAbstractString.superclass.constructor.call(this);this.getString = function() {return this.s},this.setString = function(t) {this.hTLV = null,this.isModified = !0,this.s = t,this.hV = stohex(this.s)},this.setStringHex = function(t) {this.hTLV = null,this.isModified = !0,this.s = null,this.hV = t},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex && this.setStringHex(t.hex))},Fe.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object),KJUR.asn1.DERAbstractTime = function(t) {KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);this.localDateToUTC = function(t) {utc = t.getTime() + 6e4 * t.getTimezoneOffset();var e = new Date(utc);return e},this.formatDate = function(t, e) {var i = this.zeroPadding, s = this.localDateToUTC(t), n = String(s.getFullYear());"utc" == e && (n = n.substr(2, 2));var r = i(String(s.getMonth() + 1), 2), o = i(String(s.getDate()), 2), a = i(String(s.getHours()), 2), c = i(String(s.getMinutes()), 2), l = i(String(s.getSeconds()), 2);return n + r + o + a + c + l + "Z"},this.zeroPadding = function(t, e) {return t.length >= e ? t : new Array(e - t.length + 1).join("0") + t},this.getString = function() {return this.s},this.setString = function(t) {this.hTLV = null,this.isModified = !0,this.s = t,this.hV = stohex(this.s)},this.setByDateValue = function(t, e, i, s, n, r) {var o = new Date(Date.UTC(t, e - 1, i, s, n, r, 0));this.setByDate(o)},this.getFreshValueHex = function() {return this.hV}},Fe.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object),KJUR.asn1.DERAbstractStructured = function(t) {KJUR.asn1.DERAbstractString.superclass.constructor.call(this);this.setByASN1ObjectArray = function(t) {this.hTLV = null,this.isModified = !0,this.asn1Array = t},this.appendASN1Object = function(t) {this.hTLV = null,this.isModified = !0,this.asn1Array.push(t)},this.asn1Array = new Array,"undefined" != typeof t && "undefined" != typeof t.array && (this.asn1Array = t.array)},Fe.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object),KJUR.asn1.DERBoolean = function() {KJUR.asn1.DERBoolean.superclass.constructor.call(this),this.hT = "01",this.hTLV = "0101ff"},Fe.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object),KJUR.asn1.DERInteger = function(t) {KJUR.asn1.DERInteger.superclass.constructor.call(this),this.hT = "02",this.setByBigInteger = function(t) {this.hTLV = null,this.isModified = !0,this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(t)},this.setByInteger = function(t) {var e = new b(String(t),10);this.setByBigInteger(e)},this.setValueHex = function(t) {this.hV = t},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.bigint ? this.setByBigInteger(t.bigint) : "undefined" != typeof t["int"] ? this.setByInteger(t["int"]) : "undefined" != typeof t.hex && this.setValueHex(t.hex))},Fe.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object),KJUR.asn1.DERBitString = function(t) {KJUR.asn1.DERBitString.superclass.constructor.call(this),this.hT = "03",this.setHexValueIncludingUnusedBits = function(t) {this.hTLV = null,this.isModified = !0,this.hV = t},this.setUnusedBitsAndHexValue = function(t, e) {if (0 > t || t > 7)throw "unused bits shall be from 0 to 7: u = " + t;var i = "0" + t;this.hTLV = null,this.isModified = !0,this.hV = i + e},this.setByBinaryString = function(t) {t = t.replace(/0+$/, "");var e = 8 - t.length % 8;8 == e && (e = 0);for (var i = 0; e >= i; i++)t += "0";for (var s = "", i = 0; i < t.length - 1; i += 8) {var n = t.substr(i, 8), r = parseInt(n, 2).toString(16);1 == r.length && (r = "0" + r),s += r}this.hTLV = null,this.isModified = !0,this.hV = "0" + e + s},this.setByBooleanArray = function(t) {for (var e = "", i = 0; i < t.length; i++)e += 1 == t[i] ? "1" : "0";this.setByBinaryString(e)},this.newFalseArray = function(t) {for (var e = new Array(t), i = 0; t > i; i++)e[i] = !1;return e},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.hex ? this.setHexValueIncludingUnusedBits(t.hex) : "undefined" != typeof t.bin ? this.setByBinaryString(t.bin) : "undefined" != typeof t.array && this.setByBooleanArray(t.array))},Fe.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object),KJUR.asn1.DEROctetString = function(t) {KJUR.asn1.DEROctetString.superclass.constructor.call(this, t),this.hT = "04"},Fe.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString),KJUR.asn1.DERNull = function() {KJUR.asn1.DERNull.superclass.constructor.call(this),this.hT = "05",this.hTLV = "0500"},Fe.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object),KJUR.asn1.DERObjectIdentifier = function(t) {var c = function(t) {var e = t.toString(16);return 1 == e.length && (e = "0" + e),e}, r = function(t) {var e = "", i = new b(t,10), s = i.toString(2), n = 7 - s.length % 7;7 == n && (n = 0);for (var r = "", o = 0; n > o; o++)r += "0";s = r + s;for (var o = 0; o < s.length - 1; o += 7) {var a = s.substr(o, 7);o != s.length - 7 && (a = "1" + a),e += c(parseInt(a, 2))}return e};KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this),this.hT = "06",this.setValueHex = function(t) {this.hTLV = null,this.isModified = !0,this.s = null,this.hV = t},this.setValueOidString = function(t) {if (!t.match(/^[0-9.]+$/))throw "malformed oid string: " + t;var e = "", i = t.split("."), s = 40 * parseInt(i[0]) + parseInt(i[1]);e += c(s),i.splice(0, 2);for (var n = 0; n < i.length; n++)e += r(i[n]);this.hTLV = null,this.isModified = !0,this.s = null,this.hV = e},this.setValueName = function(t) {if ("undefined" == typeof KJUR.asn1.x509.OID.name2oidList[t])throw "DERObjectIdentifier oidName undefined: " + t;var e = KJUR.asn1.x509.OID.name2oidList[t];this.setValueOidString(e)},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.oid ? this.setValueOidString(t.oid) : "undefined" != typeof t.hex ? this.setValueHex(t.hex) : "undefined" != typeof t.name && this.setValueName(t.name))},Fe.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object),KJUR.asn1.DERUTF8String = function(t) {KJUR.asn1.DERUTF8String.superclass.constructor.call(this, t),this.hT = "0c"},Fe.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString),KJUR.asn1.DERNumericString = function(t) {KJUR.asn1.DERNumericString.superclass.constructor.call(this, t),this.hT = "12"},Fe.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString),KJUR.asn1.DERPrintableString = function(t) {KJUR.asn1.DERPrintableString.superclass.constructor.call(this, t),this.hT = "13"},Fe.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString),KJUR.asn1.DERTeletexString = function(t) {KJUR.asn1.DERTeletexString.superclass.constructor.call(this, t),this.hT = "14"},Fe.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString),KJUR.asn1.DERIA5String = function(t) {KJUR.asn1.DERIA5String.superclass.constructor.call(this, t),this.hT = "16"},Fe.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString),KJUR.asn1.DERUTCTime = function(t) {KJUR.asn1.DERUTCTime.superclass.constructor.call(this, t),this.hT = "17",this.setByDate = function(t) {this.hTLV = null,this.isModified = !0,this.date = t,this.s = this.formatDate(this.date, "utc"),this.hV = stohex(this.s)},"undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex ? this.setStringHex(t.hex) : "undefined" != typeof t.date && this.setByDate(t.date))},Fe.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime),KJUR.asn1.DERGeneralizedTime = function(t) {KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, t),this.hT = "18",this.setByDate = function(t) {this.hTLV = null,this.isModified = !0,this.date = t,this.s = this.formatDate(this.date, "gen"),this.hV = stohex(this.s)},"undefined" != typeof t && ("undefined" != typeof t.str ? this.setString(t.str) : "undefined" != typeof t.hex ? this.setStringHex(t.hex) : "undefined" != typeof t.date && this.setByDate(t.date))},Fe.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime),KJUR.asn1.DERSequence = function(t) {KJUR.asn1.DERSequence.superclass.constructor.call(this, t),this.hT = "30",this.getFreshValueHex = function() {for (var t = "", e = 0; e < this.asn1Array.length; e++) {var i = this.asn1Array[e];t += i.getEncodedHex()}return this.hV = t,this.hV}},Fe.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured),KJUR.asn1.DERSet = function(t) {KJUR.asn1.DERSet.superclass.constructor.call(this, t),this.hT = "31",this.getFreshValueHex = function() {for (var t = new Array, e = 0; e < this.asn1Array.length; e++) {var i = this.asn1Array[e];t.push(i.getEncodedHex())}return t.sort(),this.hV = t.join(""),this.hV}},Fe.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured),KJUR.asn1.DERTaggedObject = function(t) {KJUR.asn1.DERTaggedObject.superclass.constructor.call(this),this.hT = "a0",this.hV = "",this.isExplicit = !0,this.asn1Object = null,this.setASN1Object = function(t, e, i) {this.hT = e,this.isExplicit = t,this.asn1Object = i,this.isExplicit ? (this.hV = this.asn1Object.getEncodedHex(),this.hTLV = null,this.isModified = !0) : (this.hV = null,this.hTLV = i.getEncodedHex(),this.hTLV = this.hTLV.replace(/^../, e),this.isModified = !1)},this.getFreshValueHex = function() {return this.hV},"undefined" != typeof t && ("undefined" != typeof t.tag && (this.hT = t.tag),"undefined" != typeof t.explicit && (this.isExplicit = t.explicit),"undefined" != typeof t.obj && (this.asn1Object = t.obj,this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)))},Fe.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object),function(c) {"use strict";var l, t = {};t.decode = function(t) {var e;if (l === c) {var i = "0123456789ABCDEF", s = " \f\n\r\u2028\u2029";for (l = [],e = 0; 16 > e; ++e)l[i.charAt(e)] = e;for (i = i.toLowerCase(),e = 10; 16 > e; ++e)l[i.charAt(e)] = e;for (e = 0; e < s.length; ++e)l[s.charAt(e)] = -1}var n = [], r = 0, o = 0;for (e = 0; e < t.length; ++e) {var a = t.charAt(e);if ("=" == a)break;if (a = l[a],-1 != a) {if (a === c)throw "Illegal character at offset " + e;r |= a,++o >= 2 ? (n[n.length] = r,r = 0,o = 0) : r <<= 4}}if (o)throw "Hex encoding incomplete: 4 bits missing";return n},window.Hex = t}(),function(c) {"use strict";var l, i = {};i.decode = function(t) {var e;if (l === c) {var i = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", s = "= \f\n\r\u2028\u2029";for (l = [],e = 0; 64 > e; ++e)l[i.charAt(e)] = e;for (e = 0; e < s.length; ++e)l[s.charAt(e)] = -1}var n = [], r = 0, o = 0;for (e = 0; e < t.length; ++e) {var a = t.charAt(e);if ("=" == a)break;if (a = l[a],-1 != a) {if (a === c)throw "Illegal character at offset " + e;r |= a,++o >= 4 ? (n[n.length] = r >> 16,n[n.length] = r >> 8 & 255,n[n.length] = 255 & r,r = 0,o = 0) : r <<= 6}}switch (o) {case 1:throw "Base64 encoding incomplete: at least 2 bits missing";case 2:n[n.length] = r >> 10;break;case 3:n[n.length] = r >> 16,n[n.length] = r >> 8 & 255}return n},i.re = /-----BEGIN [^-]+-----([A-Za-z0-9+\/=\s]+)-----END [^-]+-----|begin-base64[^\n]+\n([A-Za-z0-9+\/=\s]+)====/,i.unarmor = function(t) {var e = i.re.exec(t);if (e)if (e[1])t = e[1];else {if (!e[2])throw "RegExp out of sync";t = e[2]}return i.decode(t)},window.Base64 = i}(),function(o) {"use strict";function l(t, e) {t instanceof l ? (this.enc = t.enc,this.pos = t.pos) : (this.enc = t,this.pos = e)}function u(t, e, i, s, n) {this.stream = t,this.header = e,this.length = i,this.tag = s,this.sub = n}var r = 100, a = "…", d = {tag: function(t, e) {},text: function(t) {}};l.prototype.get = function(t) {if (t === o && (t = this.pos++),t >= this.enc.length)throw "Requesting byte offset " + t + " on a stream of length " + this.enc.length;return this.enc[t]},l.prototype.hexDigits = "0123456789ABCDEF",l.prototype.hexByte = function(t) {return this.hexDigits.charAt(t >> 4 & 15) + this.hexDigits.charAt(15 & t)},l.prototype.hexDump = function(t, e, i) {for (var s = "", n = t; e > n; ++n)if (s += this.hexByte(this.get(n)),i !== !0)switch (15 & n) {case 7:s += " ";break;case 15:s += "\n";break;default:s += " "}return s},l.prototype.parseStringISO = function(t, e) {for (var i = "", s = t; e > s; ++s)i += String.fromCharCode(this.get(s));return i},l.prototype.parseStringUTF = function(t, e) {for (var i = "", s = t; e > s; ) {var n = this.get(s++);i += 128 > n ? String.fromCharCode(n) : n > 191 && 224 > n ? String.fromCharCode((31 & n) << 6 | 63 & this.get(s++)) : String.fromCharCode((15 & n) << 12 | (63 & this.get(s++)) << 6 | 63 & this.get(s++))}return i},l.prototype.parseStringBMP = function(t, e) {for (var i = "", s = t; e > s; s += 2) {var n = this.get(s), r = this.get(s + 1);i += String.fromCharCode((n << 8) + r)}return i},l.prototype.reTime = /^((?:1[89]|2\d)?\d\d)(0[1-9]|1[0-2])(0[1-9]|[12]\d|3[01])([01]\d|2[0-3])(?:([0-5]\d)(?:([0-5]\d)(?:[.,](\d{1,3}))?)?)?(Z|[-+](?:[0]\d|1[0-2])([0-5]\d)?)?$/,l.prototype.parseTime = function(t, e) {var i = this.parseStringISO(t, e), s = this.reTime.exec(i);return s ? (i = s[1] + "-" + s[2] + "-" + s[3] + " " + s[4],s[5] && (i += ":" + s[5],s[6] && (i += ":" + s[6],s[7] && (i += "." + s[7]))),s[8] && (i += " UTC","Z" != s[8] && (i += s[8],s[9] && (i += ":" + s[9]))),i) : "Unrecognized time: " + i},l.prototype.parseInteger = function(t, e) {var i = e - t;if (i > 4) {i <<= 3;var s = this.get(t);if (0 === s)i -= 8;elsefor (; 128 > s; )s <<= 1,--i;return "(" + i + " bit)"}for (var n = 0, r = t; e > r; ++r)n = n << 8 | this.get(r);return n},l.prototype.parseBitString = function(t, e) {var i = this.get(t), s = (e - t - 1 << 3) - i, n = "(" + s + " bit)";if (20 >= s) {var r = i;n += " ";for (var o = e - 1; o > t; --o) {for (var a = this.get(o), c = r; 8 > c; ++c)n += a >> c & 1 ? "1" : "0";r = 0}}return n},l.prototype.parseOctetString = function(t, e) {var i = e - t, s = "(" + i + " byte) ";i > r && (e = t + r);for (var n = t; e > n; ++n)s += this.hexByte(this.get(n));return i > r && (s += a),s},l.prototype.parseOID = function(t, e) {for (var i = "", s = 0, n = 0, r = t; e > r; ++r) {var o = this.get(r);if (s = s << 7 | 127 & o,n += 7,!(128 & o)) {if ("" === i) {var a = 80 > s ? 40 > s ? 0 : 1 : 2;i = a + "." + (s - 40 * a)} elsei += "." + (n >= 31 ? "bigint" : s);s = n = 0}}return i},u.prototype.typeName = function() {if (this.tag === o)return "unknown";var t = this.tag >> 6, e = (this.tag >> 5 & 1,31 & this.tag);switch (t) {case 0:switch (e) {case 0:return "EOC";case 1:return "BOOLEAN";case 2:return "INTEGER";case 3:return "BIT_STRING";case 4:return "OCTET_STRING";case 5:return "NULL";case 6:return "OBJECT_IDENTIFIER";case 7:return "ObjectDescriptor";case 8:return "EXTERNAL";case 9:return "REAL";case 10:return "ENUMERATED";case 11:return "EMBEDDED_PDV";case 12:return "UTF8String";case 16:return "SEQUENCE";case 17:return "SET";case 18:return "NumericString";case 19:return "PrintableString";case 20:return "TeletexString";case 21:return "VideotexString";case 22:return "IA5String";case 23:return "UTCTime";case 24:return "GeneralizedTime";case 25:return "GraphicString";case 26:return "VisibleString";case 27:return "GeneralString";case 28:return "UniversalString";case 30:return "BMPString";default:return "Universal_" + e.toString(16)}case 1:return "Application_" + e.toString(16);case 2:return "[" + e + "]";case 3:return "Private_" + e.toString(16)}},u.prototype.reSeemsASCII = /^[ -~]+$/,u.prototype.content = function() {if (this.tag === o)return null;var t = this.tag >> 6, e = 31 & this.tag, i = this.posContent(), s = Math.abs(this.length);if (0 !== t) {if (null !== this.sub)return "(" + this.sub.length + " elem)";var n = this.stream.parseStringISO(i, i + Math.min(s, r));return this.reSeemsASCII.test(n) ? n.substring(0, 2 * r) + (n.length > 2 * r ? a : "") : this.stream.parseOctetString(i, i + s)}switch (e) {case 1:return 0 === this.stream.get(i) ? "false" : "true";case 2:return this.stream.parseInteger(i, i + s);case 3:return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseBitString(i, i + s);case 4:return this.sub ? "(" + this.sub.length + " elem)" : this.stream.parseOctetString(i, i + s);case 6:return this.stream.parseOID(i, i + s);case 16:case 17:return "(" + this.sub.length + " elem)";case 12:return this.stream.parseStringUTF(i, i + s);case 18:case 19:case 20:case 21:case 22:case 26:return this.stream.parseStringISO(i, i + s);case 30:return this.stream.parseStringBMP(i, i + s);case 23:case 24:return this.stream.parseTime(i, i + s)}return null},u.prototype.toString = function() {return this.typeName() + "@" + this.stream.pos + "[header:" + this.header + ",length:" + this.length + ",sub:" + (null === this.sub ? "null" : this.sub.length) + "]"},u.prototype.print = function(t) {if (t === o && (t = ""),null !== this.sub) {t += " ";for (var e = 0, i = this.sub.length; i > e; ++e)this.sub[e].print(t)}},u.prototype.toPrettyString = function(t) {t === o && (t = "");var e = t + this.typeName() + " @" + this.stream.pos;if (this.length >= 0 && (e += "+"),e += this.length,32 & this.tag ? e += " (constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (e += " (encapsulates)"),e += "\n",null !== this.sub) {t += " ";for (var i = 0, s = this.sub.length; s > i; ++i)e += this.sub[i].toPrettyString(t)}return e},u.prototype.toDOM = function() {var t = d.tag("div", "node");t.asn1 = this;var e = d.tag("div", "head"), i = this.typeName().replace(/_/g, " ");e.innerHTML = i;var s = this.content();if (null !== s) {s = String(s).replace(/</g, "<");var n = d.tag("span", "preview");n.appendChild(d.text(s)),e.appendChild(n)}t.appendChild(e),this.node = t,this.head = e;var r = d.tag("div", "value");if (i = "Offset: " + this.stream.pos + "
",i += "Length: " + this.header + "+",i += this.length >= 0 ? this.length : -this.length + " (undefined)",32 & this.tag ? i += "
(constructed)" : 3 != this.tag && 4 != this.tag || null === this.sub || (i += "
(encapsulates)"),null !== s && (i += "
Value:
" + s + "","object" == typeof oids && 6 == this.tag)) {var o = oids[s];o && (o.d && (i += "
" + o.d),o.c && (i += "
" + o.c),o.w && (i += "
(warning!)"))}r.innerHTML = i,t.appendChild(r);var a = d.tag("div", "sub");if (null !== this.sub)for (var c = 0, l = this.sub.length; l > c; ++c)a.appendChild(this.sub[c].toDOM());return t.appendChild(a),e.onclick = function() {t.className = "node collapsed" == t.className ? "node" : "node collapsed"},t},u.prototype.posStart = function() {return this.stream.pos},u.prototype.posContent = function() {return this.stream.pos + this.header},u.prototype.posEnd = function() {return this.stream.pos + this.header + Math.abs(this.length)},u.prototype.fakeHover = function(t) {this.node.className += " hover",t && (this.head.className += " hover")},u.prototype.fakeOut = function(t) {var e = / ?hover/;this.node.className = this.node.className.replace(e, ""),t && (this.head.className = this.head.className.replace(e, ""))},u.prototype.toHexDOM_sub = function(t, e, i, s, n) {if (!(s >= n)) {var r = d.tag("span", e);r.appendChild(d.text(i.hexDump(s, n))),t.appendChild(r)}},u.prototype.toHexDOM = function(e) {var t = d.tag("span", "hex");if (e === o && (e = t),this.head.hexNode = t,this.head.onmouseover = function() {this.hexNode.className = "hexCurrent"},this.head.onmouseout = function() {this.hexNode.className = "hex"},t.asn1 = this,t.onmouseover = function() {var t = !e.selected;t && (e.selected = this.asn1,this.className = "hexCurrent"),this.asn1.fakeHover(t)},t.onmouseout = function() {var t = e.selected == this.asn1;this.asn1.fakeOut(t),t && (e.selected = null,this.className = "hex")},this.toHexDOM_sub(t, "tag", this.stream, this.posStart(), this.posStart() + 1),this.toHexDOM_sub(t, this.length >= 0 ? "dlen" : "ulen", this.stream, this.posStart() + 1, this.posContent()),null === this.sub)t.appendChild(d.text(this.stream.hexDump(this.posContent(), this.posEnd())));else if (this.sub.length > 0) {var i = this.sub[0], s = this.sub[this.sub.length - 1];this.toHexDOM_sub(t, "intro", this.stream, this.posContent(), i.posStart());for (var n = 0, r = this.sub.length; r > n; ++n)t.appendChild(this.sub[n].toHexDOM(e));this.toHexDOM_sub(t, "outro", this.stream, s.posEnd(), this.posEnd())}return t},u.prototype.toHexString = function(t) {return this.stream.hexDump(this.posStart(), this.posEnd(), !0)},u.decodeLength = function(t) {var e = t.get(), i = 127 & e;if (i == e)return i;if (i > 3)throw "Length over 24 bits not supported at position " + (t.pos - 1);if (0 === i)return -1;e = 0;for (var s = 0; i > s; ++s)e = e << 8 | t.get();return e},u.hasContent = function(t, e, i) {if (32 & t)return !0;if (3 > t || t > 4)return !1;var s = new l(i);3 == t && s.get();var n = s.get();if (n >> 6 & 1)return !1;//try {var r = u.decodeLength(s);return s.pos - i.pos + r == e//} catch (p) {//return !1//}},u.decode = function(t) {t instanceof l || (t = new l(t,0));var e = new l(t), i = t.get(), s = u.decodeLength(t), n = t.pos - e.pos, r = null;if (u.hasContent(i, s, t)) {var o = t.pos;if (3 == i && t.get(),r = [],s >= 0) {for (var a = o + s; t.pos < a; )r[r.length] = u.decode(t);if (t.pos != a)throw "Content size is not correct for container starting at offset " + o} else//try {for (; ; ) {var c = u.decode(t);if (0 === c.tag)break;r[r.length] = c}s = o - t.pos//} catch (h) {//throw "Exception while decoding undefined length content: " + h//}} elset.pos += s;return new u(e,n,s,i,r)},u.test = function() {for (var t = [{value: [39],expected: 39}, {value: [129, 201],expected: 201}, {value: [131, 254, 220, 186],expected: 16702650}], e = 0, i = t.length; i > e; ++e) {var s = new l(t[e].value,0), n = u.decodeLength(s);}},window.ASN1 = u}(),window.ASN1.prototype.getHexStringValue = function() {var t = this.toHexString(), e = 2 * this.header, i = 2 * this.length;return t.substr(e, i)},le.prototype.parseKey = function(t) {//try {var e = 0, i = 0, s = /^\s*(?:[0-9A-Fa-f][0-9A-Fa-f]\s*)+$/, n = s.test(t) ? Hex.decode(t) : window.Base64.unarmor(t), r = window.ASN1.decode(n);if (3 === r.sub.length && (r = r.sub[2].sub[0]),9 === r.sub.length) {e = r.sub[1].getHexStringValue(),this.n = ae(e, 16),i = r.sub[2].getHexStringValue(),this.e = parseInt(i, 16);var o = r.sub[3].getHexStringValue();this.d = ae(o, 16);var a = r.sub[4].getHexStringValue();this.p = ae(a, 16);var c = r.sub[5].getHexStringValue();this.q = ae(c, 16);var l = r.sub[6].getHexStringValue();this.dmp1 = ae(l, 16);var u = r.sub[7].getHexStringValue();this.dmq1 = ae(u, 16);var d = r.sub[8].getHexStringValue();this.coeff = ae(d, 16)} else {if (2 !== r.sub.length)return !1;var p = r.sub[1], h = p.sub[0];e = h.sub[0].getHexStringValue(),this.n = ae(e, 16),i = h.sub[1].getHexStringValue(),this.e = parseInt(i, 16)}return !0//} catch (f) {//return !1//}},le.prototype.getPrivateBaseKey = function() {var t = {array: [new KJUR.asn1.DERInteger({"int": 0}), new KJUR.asn1.DERInteger({bigint: this.n}), new KJUR.asn1.DERInteger({"int": this.e}), new KJUR.asn1.DERInteger({bigint: this.d}), new KJUR.asn1.DERInteger({bigint: this.p}), new KJUR.asn1.DERInteger({bigint: this.q}), new KJUR.asn1.DERInteger({bigint: this.dmp1}), new KJUR.asn1.DERInteger({bigint: this.dmq1}), new KJUR.asn1.DERInteger({bigint: this.coeff})]}, e = new KJUR.asn1.DERSequence(t);return e.getEncodedHex()},le.prototype.getPrivateBaseKeyB64 = function() {return be(this.getPrivateBaseKey())},le.prototype.getPublicBaseKey = function() {var t = {array: [new KJUR.asn1.DERObjectIdentifier({oid: "1.2.840.113549.1.1.1"}), new KJUR.asn1.DERNull]}, e = new KJUR.asn1.DERSequence(t);t = {array: [new KJUR.asn1.DERInteger({bigint: this.n}), new KJUR.asn1.DERInteger({"int": this.e})]};var i = new KJUR.asn1.DERSequence(t);t = {hex: "00" + i.getEncodedHex()};var s = new KJUR.asn1.DERBitString(t);t = {array: [e, s]};var n = new KJUR.asn1.DERSequence(t);return n.getEncodedHex()},le.prototype.getPublicBaseKeyB64 = function() {return be(this.getPublicBaseKey())},le.prototype.wordwrap = function(t, e) {if (e = e || 64,!t)return t;var i = "(.{1," + e + "})( +|$\n?)|(.{1," + e + "})";return t.match(RegExp(i, "g")).join("\n")},le.prototype.getPrivateKey = function() {var t = "-----BEGIN RSA PRIVATE KEY-----\n";return t += this.wordwrap(this.getPrivateBaseKeyB64()) + "\n",t += "-----END RSA PRIVATE KEY-----"},le.prototype.getPublicKey = function() {var t = "-----BEGIN PUBLIC KEY-----\n";return t += this.wordwrap(this.getPublicBaseKeyB64()) + "\n",t += "-----END PUBLIC KEY-----"},le.prototype.hasPublicKeyProperty = function(t) {return t = t || {},t.hasOwnProperty("n") && t.hasOwnProperty("e")},le.prototype.hasPrivateKeyProperty = function(t) {return t = t || {},t.hasOwnProperty("n") && t.hasOwnProperty("e") && t.hasOwnProperty("d") && t.hasOwnProperty("p") && t.hasOwnProperty("q") && t.hasOwnProperty("dmp1") && t.hasOwnProperty("dmq1") && t.hasOwnProperty("coeff")},le.prototype.parsePropertiesFrom = function(t) {this.n = t.n,this.e = t.e,t.hasOwnProperty("d") && (this.d = t.d,this.p = t.p,this.q = t.q,this.dmp1 = t.dmp1,this.dmq1 = t.dmq1,this.coeff = t.coeff)};var qe = function(t) {le.call(this),t && ("string" == typeof t ? this.parseKey(t) : (this.hasPrivateKeyProperty(t) || this.hasPublicKeyProperty(t)) && this.parsePropertiesFrom(t))};(qe.prototype = new le).constructor = qe;var He = function(t) {t = t || {},this.default_key_size = parseInt(t.default_key_size) || 1024,this.default_public_exponent = t.default_public_exponent || "010001",this.log = t.log || !1,this.key = null};He.prototype.setKey = function(t) {this.log && this.key && console.warn("A key was already set, overriding existing."),this.key = new qe(t)},He.prototype.setPrivateKey = function(t) {this.setKey(t)},He.prototype.setPublicKey = function(t) {this.setKey(t)},He.prototype.decrypt = function(t) {//try {return this.getKey().decrypt(ye(t))//} catch (b) {//return !1//}},He.prototype.encrypt = function(t) {//try {return be(this.getKey().encrypt(t))//} catch (b) {//return !1//}},He.prototype.getKey = function(t) {if (!this.key) {if (this.key = new qe,t && "[object Function]" === {}.toString.call(t))return void this.key.generateAsync(this.default_key_size, this.default_public_exponent, t);this.key.generate(this.default_key_size, this.default_public_exponent)}return this.key},He.prototype.getPrivateKey = function() {return this.getKey().getPrivateKey()},He.prototype.getPrivateKeyB64 = function() {return this.getKey().getPrivateBaseKeyB64()},He.prototype.getPublicKey = function() {return this.getKey().getPublicKey()},He.prototype.getPublicKeyB64 = function() {return this.getKey().getPublicBaseKeyB64()},He.version = "2.3.1",t.JSEncrypt = He}) ? s.apply(e, n) : s) === undefined || (i.exports = r)}.call(e, i, e, t)) === undefined || (t.exports = r)},jsencrypt: function(t, e, r) {var i;(i = function(t, e, i) {var s = r("encrypt");function n() {void 0 !== s && (this.jsencrypt = new s.JSEncrypt,this.jsencrypt.setPublicKey("-----BEGIN PUBLIC KEY-----MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDq04c6My441Gj0UFKgrqUhAUg+kQZeUeWSPlAU9fr4HBPDldAeqzx1UR99KJHuQh/zs1HOamE2dgX9z/2oXcJaqoRIA/FXysx+z2YlJkSk8XQLcQ8EBOkp//MZrixam7lCYpNOjadQBb2Ot0U/Ky+jF2p+Ie8gSZ7/u+Wnr5grywIDAQAB-----END PUBLIC KEY-----"))}n.prototype.encode = function(t, e) {var i = e ? e + "|" + t : t;return encodeURIComponent(this.jsencrypt.encrypt(i))},i.exports = n}.call(e, r, e, t)) === undefined || (t.exports = i)}});function z(pwd, time) {var n = _n("jsencrypt");var g = (new n);var r = g.encode(pwd, time);return r;}
Python代码::
import osimport timeimport execjsimport requestsimport jsonpathos.environ["EXECJS_RUNTIME"] = "Node"headers = {'cookie': 'sessionid=posx0v0g9da1ql6h66w643mtw04kamyo','User-Agent': 'yuanrenxue.project'}o = 1q = ''values = []for index in range(1, 6):t = int(time.time()) * 1000# 使用 RPC 远程过程调用解决(该题失败):var demo = new Hlclient("ws://127.0.0.1:12080/ws?group=yrx&name=q6");# url = 'http://localhost:12080/execjs'# data = {# 'group': 'yrx',# 'name': "q6",# 'jscode': f'z({t}, {o})'# }# m = requests.post(url, data=data).json()['data']# 正常逆向 JavaScript 解决js = open('q6.js', 'r', encoding='utf-8').read()# from execjs._external_runtime import ExternalRuntime# ExternalRuntime.Context._exec_with_pipe 中 p = Popen(..., encoding='utf8')m = execjs.compile(js).eval(f'z({t}, {o})')q = f'{o}-{t}|'url = "https://match.yuanrenxue.cn/api/match/6"# values.extend(v['value'] for v in requests.get(url, headers=headers, params={'page': index, 'm': m, 'q': q}).json()['data'])values.extend(jsonpath.jsonpath(requests.get(url, headers=headers, params={'page': index, 'm': m, 'q': q}).json(), '$..value'))o += 1print(sum(values) * 24)