小程序 Rsa加密

var RSA = require ( 'rsa.js' );
//RSA公钥
var publicKey_pkcs1 = ''

//RSA加密方法
function RSAEncrypt(word) {
var encrypt_rsa = new RSA.RSAKey();
encrypt_rsa = RSA.KEYUTIL.getKey(publicKey_pkcs1);
console.log(encrypt_rsa)
var encStr = encrypt_rsa.encrypt(word)
encStr = RSA.hex2b64(encStr);
return encStr;
}

//以下Rsa.js

var navigator2 = {
  appName: 'Netscape',
  userAgent: 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'
};

var window2 = {
  ASN1: null,
  Base64: null,
  Hex: null,
  crypto: null,
  href: null
};

var KJUR = null;

if (typeof YAHOO == "undefined" || !YAHOO) {
  var YAHOO = {};
}
YAHOO.namespace = function () {
  var b = arguments,
    g = null,
    e, c, f;
  for (e = 0; e < b.length; e = e + 1) {
    f = ("" + b[e]).split(".");
    g = YAHOO;
    for (c = (f[0] == "YAHOO") ? 1 : 0; c < f.length; c = c + 1) {
      g[f[c]] = g[f[c]] || {};
      g = g[f[c]];
    }
  }
  return g;
};
YAHOO.log = function (d, a, c) {
  var b = YAHOO.widget.Logger;
  if (b && b.log) {
    return b.log(d, a, c);
  } else {
    return false;
  }
};
YAHOO.register = function (a, f, e) {
  var k = YAHOO.env.modules,
    c, j, h, g, d;
  if (!k[a]) {
    k[a] = {
      versions: [],
      builds: []
    };
  }
  c = k[a];
  j = e.version;
  h = e.build;
  g = YAHOO.env.listeners;
  c.name = a;
  c.version = j;
  c.build = h;
  c.versions.push(j);
  c.builds.push(h);
  c.mainClass = f;
  for (d = 0; d < g.length; d = d + 1) {
    g[d](c);
  }
  if (f) {
    f.VERSION = j;
    f.BUILD = h;
  } else {
    YAHOO.log("mainClass is undefined for module " + a, "warn");
  }
};
YAHOO.env = YAHOO.env || {
  modules: [],
  listeners: []
};
YAHOO.env.getVersion = function (a) {
  return YAHOO.env.modules[a] || null;
};
YAHOO.env.parseUA = function (d) {
  var e = function (i) {
    var j = 0;
    return parseFloat(i.replace(/\./g,
      function () {
        return (j++ == 1) ? "" : ".";
      }));
  },
    h = navigator2,
    g = {
      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: h && h.cajaVersion,
      secure: false,
      os: null
    },
    c = d || (navigator2 && navigator2.userAgent),
    f = window2 && window2.location,
    b = f && f.href,
    a;
  g.secure = b && (b.toLowerCase().indexOf("https") === 0);
  if (c) {
    if ((/windows|win32/i).test(c)) {
      g.os = "windows";
    } else {
      if ((/macintosh/i).test(c)) {
        g.os = "macintosh";
      } else {
        if ((/rhino/i).test(c)) {
          g.os = "rhino";
        }
      }
    }
    if ((/KHTML/).test(c)) {
      g.webkit = 1;
    }
    a = c.match(/AppleWebKit\/([^\s]*)/);
    if (a && a[1]) {
      g.webkit = e(a[1]);
      if (/ Mobile\//.test(c)) {
        g.mobile = "Apple";
        a = c.match(/OS ([^\s]*)/);
        if (a && a[1]) {
          a = e(a[1].replace("_", "."));
        }
        g.ios = a;
        g.ipad = g.ipod = g.iphone = 0;
        a = c.match(/iPad|iPod|iPhone/);
        if (a && a[0]) {
          g[a[0].toLowerCase()] = g.ios;
        }
      } else {
        a = c.match(/NokiaN[^\/]*|Android \d\.\d|webOS\/\d\.\d/);
        if (a) {
          g.mobile = a[0];
        }
        if (/webOS/.test(c)) {
          g.mobile = "WebOS";
          a = c.match(/webOS\/([^\s]*);/);
          if (a && a[1]) {
            g.webos = e(a[1]);
          }
        }
        if (/ Android/.test(c)) {
          g.mobile = "Android";
          a = c.match(/Android ([^\s]*);/);
          if (a && a[1]) {
            g.android = e(a[1]);
          }
        }
      }
      a = c.match(/Chrome\/([^\s]*)/);
      if (a && a[1]) {
        g.chrome = e(a[1]);
      } else {
        a = c.match(/AdobeAIR\/([^\s]*)/);
        if (a) {
          g.air = a[0];
        }
      }
    }
    if (!g.webkit) {
      a = c.match(/Opera[\s\/]([^\s]*)/);
      if (a && a[1]) {
        g.opera = e(a[1]);
        a = c.match(/Version\/([^\s]*)/);
        if (a && a[1]) {
          g.opera = e(a[1]);
        }
        a = c.match(/Opera Mini[^;]*/);
        if (a) {
          g.mobile = a[0];
        }
      } else {
        a = c.match(/MSIE\s([^;]*)/);
        if (a && a[1]) {
          g.ie = e(a[1]);
        } else {
          a = c.match(/Gecko\/([^\s]*)/);
          if (a) {
            g.gecko = 1;
            a = c.match(/rv:([^\s\)]*)/);
            if (a && a[1]) {
              g.gecko = e(a[1]);
            }
          }
        }
      }
    }
  }
  return g;
};
YAHOO.env.ua = YAHOO.env.parseUA(); (function () {
  YAHOO.namespace("util", "widget", "example");
  if ("undefined" !== typeof YAHOO_config) {
    var b = YAHOO_config.listener,
      a = YAHOO.env.listeners,
      d = true,
      c;
    if (b) {
      for (c = 0; c < a.length; c++) {
        if (a[c] == b) {
          d = false;
          break;
        }
      }
      if (d) {
        a.push(b);
      }
    }
  }
})();
YAHOO.lang = YAHOO.lang || {}; (function () {
  var f = YAHOO.lang,
    a = Object.prototype,
    c = "[object Array]",
    h = "[object Function]",
    i = "[object Object]",
    b = [],
    g = {
      "&": "&amp;",
      "<": "&lt;",
      ">": "&gt;",
      '"': "&quot;",
      "'": "&#x27;",
      "/": "&#x2F;",
      "`": "&#x60;"
    },
    d = ["toString", "valueOf"],
    e = {
      isArray: function (j) {
        return a.toString.apply(j) === c;
      },
      isBoolean: function (j) {
        return typeof j === "boolean";
      },
      isFunction: function (j) {
        return (typeof j === "function") || a.toString.apply(j) === h;
      },
      isNull: function (j) {
        return j === null;
      },
      isNumber: function (j) {
        return typeof j === "number" && isFinite(j);
      },
      isObject: function (j) {
        return (j && (typeof j === "object" || f.isFunction(j))) || false;
      },
      isString: function (j) {
        return typeof j === "string";
      },
      isUndefined: function (j) {
        return typeof j === "undefined";
      },
      _IEEnumFix: (YAHOO.env.ua.ie) ?
        function (l, k) {
          var j, n, m;
          for (j = 0; j < d.length; j = j + 1) {
            n = d[j];
            m = k[n];
            if (f.isFunction(m) && m != a[n]) {
              l[n] = m;
            }
          }
        } : function () { },
      escapeHTML: function (j) {
        return j.replace(/[&<>"'\/`]/g,
          function (k) {
            return g[k];
          });
      },
      extend: function (m, n, l) {
        if (!n || !m) {
          throw new Error("extend failed, please check that " + "all dependencies are included.");
        }
        var k = function () { },
          j;
        k.prototype = n.prototype;
        m.prototype = new k();
        m.prototype.constructor = m;
        m.superclass = n.prototype;
        if (n.prototype.constructor == a.constructor) {
          n.prototype.constructor = n;
        }
        if (l) {
          for (j in l) {
            if (f.hasOwnProperty(l, j)) {
              m.prototype[j] = l[j];
            }
          }
          f._IEEnumFix(m.prototype, l);
        }
      },
      augmentObject: function (n, m) {
        if (!m || !n) {
          throw new Error("Absorb failed, verify dependencies.");
        }
        var j = arguments,
          l, o, k = j[2];
        if (k && k !== true) {
          for (l = 2; l < j.length; l = l + 1) {
            n[j[l]] = m[j[l]];
          }
        } else {
          for (o in m) {
            if (k || !(o in n)) {
              n[o] = m[o];
            }
          }
          f._IEEnumFix(n, m);
        }
        return n;
      },
      augmentProto: function (m, l) {
        if (!l || !m) {
          throw new Error("Augment failed, verify dependencies.");
        }
        var j = [m.prototype, l.prototype],
          k;
        for (k = 2; k < arguments.length; k = k + 1) {
          j.push(arguments[k]);
        }
        f.augmentObject.apply(this, j);
        return m;
      },
      dump: function (j, p) {
        var l, n, r = [],
          t = "{...}",
          k = "f(){...}",
          q = ", ",
          m = " => ";
        if (!f.isObject(j)) {
          return j + "";
        } else {
          if (j instanceof Date || ("nodeType" in j && "tagName" in j)) {
            return j;
          } else {
            if (f.isFunction(j)) {
              return k;
            }
          }
        }
        p = (f.isNumber(p)) ? p : 3;
        if (f.isArray(j)) {
          r.push("[");
          for (l = 0, n = j.length; l < n; l = l + 1) {
            if (f.isObject(j[l])) {
              r.push((p > 0) ? f.dump(j[l], p - 1) : t);
            } else {
              r.push(j[l]);
            }
            r.push(q);
          }
          if (r.length > 1) {
            r.pop();
          }
          r.push("]");
        } else {
          r.push("{");
          for (l in j) {
            if (f.hasOwnProperty(j, l)) {
              r.push(l + m);
              if (f.isObject(j[l])) {
                r.push((p > 0) ? f.dump(j[l], p - 1) : t);
              } else {
                r.push(j[l]);
              }
              r.push(q);
            }
          }
          if (r.length > 1) {
            r.pop();
          }
          r.push("}");
        }
        return r.join("");
      },
      substitute: function (x, y, E, l) {
        var D, C, B, G, t, u, F = [],
          p,
          z = x.length,
          A = "dump",
          r = " ",
          q = "{",
          m = "}",
          n,
          w;
        for (; ;) {
          D = x.lastIndexOf(q, z);
          if (D < 0) {
            break;
          }
          C = x.indexOf(m, D);
          if (D + 1 > C) {
            break;
          }
          p = x.substring(D + 1, C);
          G = p;
          u = null;
          B = G.indexOf(r);
          if (B > -1) {
            u = G.substring(B + 1);
            G = G.substring(0, B);
          }
          t = y[G];
          if (E) {
            t = E(G, t, u);
          }
          if (f.isObject(t)) {
            if (f.isArray(t)) {
              t = f.dump(t, parseInt(u, 10));
            } else {
              u = u || "";
              n = u.indexOf(A);
              if (n > -1) {
                u = u.substring(4);
              }
              w = t.toString();
              if (w === i || n > -1) {
                t = f.dump(t, parseInt(u, 10));
              } else {
                t = w;
              }
            }
          } else {
            if (!f.isString(t) && !f.isNumber(t)) {
              t = "~-" + F.length + "-~";
              F[F.length] = p;
            }
          }
          x = x.substring(0, D) + t + x.substring(C + 1);
          if (l === false) {
            z = D - 1;
          }
        }
        for (D = F.length - 1; D >= 0; D = D - 1) {
          x = x.replace(new RegExp("~-" + D + "-~"), "{" + F[D] + "}", "g");
        }
        return x;
      },
      trim: function (j) {
        try {
          return j.replace(/^\s+|\s+$/g, "");
        } catch (k) {
          return j;
        }
      },
      merge: function () {
        var n = {},
          k = arguments,
          j = k.length,
          m;
        for (m = 0; m < j; m = m + 1) {
          f.augmentObject(n, k[m], true);
        }
        return n;
      },
      later: function (t, k, u, n, p) {
        t = t || 0;
        k = k || {};
        var l = u,
          s = n,
          q, j;
        if (f.isString(u)) {
          l = k[u];
        }
        if (!l) {
          throw new TypeError("method undefined");
        }
        if (!f.isUndefined(n) && !f.isArray(s)) {
          s = [n];
        }
        q = function () {
          l.apply(k, s || b);
        };
        j = (p) ? setInterval(q, t) : setTimeout(q, t);
        return {
          interval: p,
          cancel: function () {
            if (this.interval) {
              clearInterval(j);
            } else {
              clearTimeout(j);
            }
          }
        };
      },
      isValue: function (j) {
        return (f.isObject(j) || f.isString(j) || f.isNumber(j) || f.isBoolean(j));
      }
    };
  f.hasOwnProperty = (a.hasOwnProperty) ?
    function (j, k) {
      return j && j.hasOwnProperty && j.hasOwnProperty(k);
    } : function (j, k) {
      return !f.isUndefined(j[k]) && j.constructor.prototype[k] !== j[k];
    };
  e.augmentObject(f, e, true);
  YAHOO.util.Lang = f;
  f.augment = f.augmentProto;
  YAHOO.augment = f.augmentProto;
  YAHOO.extend = f.extend;
})();
YAHOO.register("yahoo", YAHOO, {
  version: "2.9.0",
  build: "2800"
});

var CryptoJS = CryptoJS || (function (e, g) {
  var a = {};
  var b = a.lib = {};
  var j = b.Base = (function () {
    function n() { }
    return {
      extend: function (p) {
        n.prototype = this;
        var o = new n();
        if (p) {
          o.mixIn(p)
        }
        if (!o.hasOwnProperty("init")) {
          o.init = function () {
            o.$super.init.apply(this, arguments)
          }
        }
        o.init.prototype = o;
        o.$super = this;
        return o
      },
      create: function () {
        var o = this.extend();
        o.init.apply(o, arguments);
        return o
      },
      init: function () { },
      mixIn: function (p) {
        for (var o in p) {
          if (p.hasOwnProperty(o)) {
            this[o] = p[o]
          }
        }
        if (p.hasOwnProperty("toString")) {
          this.toString = p.toString
        }
      },
      clone: function () {
        return this.init.prototype.extend(this)
      }
    }
  }());
  var l = b.WordArray = j.extend({
    init: function (o, n) {
      o = this.words = o || [];
      if (n != g) {
        this.sigBytes = n
      } else {
        this.sigBytes = o.length * 4
      }
    },
    toString: function (n) {
      return (n || h).stringify(this)
    },
    concat: function (t) {
      var q = this.words;
      var p = t.words;
      var n = this.sigBytes;
      var s = t.sigBytes;
      this.clamp();
      if (n % 4) {
        for (var r = 0; r < s; r++) {
          var o = (p[r >>> 2] >>> (24 - (r % 4) * 8)) & 255;
          q[(n + r) >>> 2] |= o << (24 - ((n + r) % 4) * 8)
        }
      } else {
        for (var r = 0; r < s; r += 4) {
          q[(n + r) >>> 2] = p[r >>> 2]
        }
      }
      this.sigBytes += s;
      return this
    },
    clamp: function () {
      var o = this.words;
      var n = this.sigBytes;
      o[n >>> 2] &= 4294967295 << (32 - (n % 4) * 8);
      o.length = e.ceil(n / 4)
    },
    clone: function () {
      var n = j.clone.call(this);
      n.words = this.words.slice(0);
      return n
    },
    random: function (p) {
      var o = [];
      for (var n = 0; n < p; n += 4) {
        o.push((e.random() * 4294967296) | 0)
      }
      return new l.init(o, p)
    }
  });
  var m = a.enc = {};
  var h = m.Hex = {
    stringify: function (p) {
      var r = p.words;
      var o = p.sigBytes;
      var q = [];
      for (var n = 0; n < o; n++) {
        var s = (r[n >>> 2] >>> (24 - (n % 4) * 8)) & 255;
        q.push((s >>> 4).toString(16));
        q.push((s & 15).toString(16))
      }
      return q.join("")
    },
    parse: function (p) {
      var n = p.length;
      var q = [];
      for (var o = 0; o < n; o += 2) {
        q[o >>> 3] |= parseInt(p.substr(o, 2), 16) << (24 - (o % 8) * 4)
      }
      return new l.init(q, n / 2)
    }
  };
  var d = m.Latin1 = {
    stringify: function (q) {
      var r = q.words;
      var p = q.sigBytes;
      var n = [];
      for (var o = 0; o < p; o++) {
        var s = (r[o >>> 2] >>> (24 - (o % 4) * 8)) & 255;
        n.push(String.fromCharCode(s))
      }
      return n.join("")
    },
    parse: function (p) {
      var n = p.length;
      var q = [];
      for (var o = 0; o < n; o++) {
        q[o >>> 2] |= (p.charCodeAt(o) & 255) << (24 - (o % 4) * 8)
      }
      return new l.init(q, n)
    }
  };
  var c = m.Utf8 = {
    stringify: function (n) {
      try {
        return decodeURIComponent(escape(d.stringify(n)))
      } catch (o) {
        throw new Error("Malformed UTF-8 data")
      }
    },
    parse: function (n) {
      return d.parse(unescape(encodeURIComponent(n)))
    }
  };
  var i = b.BufferedBlockAlgorithm = j.extend({
    reset: function () {
      this._data = new l.init();
      this._nDataBytes = 0
    },
    _append: function (n) {
      if (typeof n == "string") {
        n = c.parse(n)
      }
      this._data.concat(n);
      this._nDataBytes += n.sigBytes
    },
    _process: function (w) {
      var q = this._data;
      var x = q.words;
      var n = q.sigBytes;
      var t = this.blockSize;
      var v = t * 4;
      var u = n / v;
      if (w) {
        u = e.ceil(u)
      } else {
        u = e.max((u | 0) - this._minBufferSize, 0)
      }
      var s = u * t;
      var r = e.min(s * 4, n);
      if (s) {
        for (var p = 0; p < s; p += t) {
          this._doProcessBlock(x, p)
        }
        var o = x.splice(0, s);
        q.sigBytes -= r
      }
      return new l.init(o, r)
    },
    clone: function () {
      var n = j.clone.call(this);
      n._data = this._data.clone();
      return n
    },
    _minBufferSize: 0
  });
  var f = b.Hasher = i.extend({
    cfg: j.extend(),
    init: function (n) {
      this.cfg = this.cfg.extend(n);
      this.reset()
    },
    reset: function () {
      i.reset.call(this);
      this._doReset()
    },
    update: function (n) {
      this._append(n);
      this._process();
      return this
    },
    finalize: function (n) {
      if (n) {
        this._append(n)
      }
      var o = this._doFinalize();
      return o
    },
    blockSize: 512 / 32,
    _createHelper: function (n) {
      return function (p, o) {
        return new n.init(o).finalize(p)
      }
    },
    _createHmacHelper: function (n) {
      return function (p, o) {
        return new k.HMAC.init(n, o).finalize(p)
      }
    }
  });
  var k = a.algo = {};
  return a
}(Math));

(function (g) {
  var a = CryptoJS,
    f = a.lib,
    e = f.Base,
    h = f.WordArray,
    a = a.x64 = {};
  a.Word = e.extend({
    init: function (b, c) {
      this.high = b;
      this.low = c
    }
  });
  a.WordArray = e.extend({
    init: function (b, c) {
      b = this.words = b || [];
      this.sigBytes = c != g ? c : 8 * b.length
    },
    toX32: function () {
      for (var b = this.words,
        c = b.length,
        a = [], d = 0; d < c; d++) {
        var e = b[d];
        a.push(e.high);
        a.push(e.low)
      }
      return h.create(a, this.sigBytes)
    },
    clone: function () {
      for (var b = e.clone.call(this), c = b.words = this.words.slice(0), a = c.length, d = 0; d < a; d++) c[d] = c[d].clone();
      return b
    }
  })
})();

CryptoJS.lib.Cipher ||
  function (u) {
    var g = CryptoJS,
      f = g.lib,
      k = f.Base,
      l = f.WordArray,
      q = f.BufferedBlockAlgorithm,
      r = g.enc.Base64,
      v = g.algo.EvpKDF,
      n = f.Cipher = q.extend({
        cfg: k.extend(),
        createEncryptor: function (a, b) {
          return this.create(this._ENC_XFORM_MODE, a, b)
        },
        createDecryptor: function (a, b) {
          return this.create(this._DEC_XFORM_MODE, a, b)
        },
        init: function (a, b, c) {
          this.cfg = this.cfg.extend(c);
          this._xformMode = a;
          this._key = b;
          this.reset()
        },
        reset: function () {
          q.reset.call(this);
          this._doReset()
        },
        process: function (a) {
          this._append(a);
          return this._process()
        },
        finalize: function (a) {
          a && this._append(a);
          return this._doFinalize()
        },
        keySize: 4,
        ivSize: 4,
        _ENC_XFORM_MODE: 1,
        _DEC_XFORM_MODE: 2,
        _createHelper: function (a) {
          return {
            encrypt: function (b, c, d) {
              return ("string" == typeof c ? s : j).encrypt(a, b, c, d)
            },
            decrypt: function (b, c, d) {
              return ("string" == typeof c ? s : j).decrypt(a, b, c, d)
            }
          }
        }
      });
    f.StreamCipher = n.extend({
      _doFinalize: function () {
        return this._process(!0)
      },
      blockSize: 1
    });
    var m = g.mode = {},
      t = function (a, b, c) {
        var d = this._iv;
        d ? this._iv = u : d = this._prevBlock;
        for (var e = 0; e < c; e++) a[b + e] ^= d[e]
      },
      h = (f.BlockCipherMode = k.extend({
        createEncryptor: function (a, b) {
          return this.Encryptor.create(a, b)
        },
        createDecryptor: function (a, b) {
          return this.Decryptor.create(a, b)
        },
        init: function (a, b) {
          this._cipher = a;
          this._iv = b
        }
      })).extend();
    h.Encryptor = h.extend({
      processBlock: function (a, b) {
        var c = this._cipher,
          d = c.blockSize;
        t.call(this, a, b, d);
        c.encryptBlock(a, b);
        this._prevBlock = a.slice(b, b + d)
      }
    });
    h.Decryptor = h.extend({
      processBlock: function (a, b) {
        var c = this._cipher,
          d = c.blockSize,
          e = a.slice(b, b + d);
        c.decryptBlock(a, b);
        t.call(this, a, b, d);
        this._prevBlock = e
      }
    });
    m = m.CBC = h;
    h = (g.pad = {}).Pkcs7 = {
      pad: function (a, b) {
        for (var c = 4 * b,
          c = c - a.sigBytes % c,
          d = c << 24 | c << 16 | c << 8 | c,
          e = [], f = 0; f < c; f += 4) e.push(d);
        c = l.create(e, c);
        a.concat(c)
      },
      unpad: function (a) {
        a.sigBytes -= a.words[a.sigBytes - 1 >>> 2] & 255
      }
    };
    f.BlockCipher = n.extend({
      cfg: n.cfg.extend({
        mode: m,
        padding: h
      }),
      reset: function () {
        n.reset.call(this);
        var a = this.cfg,
          b = a.iv,
          a = a.mode;
        if (this._xformMode == this._ENC_XFORM_MODE) var c = a.createEncryptor;
        else c = a.createDecryptor,
          this._minBufferSize = 1;
        this._mode = c.call(a, this, b && b.words)
      },
      _doProcessBlock: function (a, b) {
        this._mode.processBlock(a, b)
      },
      _doFinalize: function () {
        var a = this.cfg.padding;
        if (this._xformMode == this._ENC_XFORM_MODE) {
          a.pad(this._data, this.blockSize);
          var b = this._process(!0)
        } else b = this._process(!0),
          a.unpad(b);
        return b
      },
      blockSize: 4
    });
    var p = f.CipherParams = k.extend({
      init: function (a) {
        this.mixIn(a)
      },
      toString: function (a) {
        return (a || this.formatter).stringify(this)
      }
    }),
      m = (g.format = {}).OpenSSL = {
        stringify: function (a) {
          var b = a.ciphertext;
          a = a.salt;
          return (a ? l.create([1398893684, 1701076831]).concat(a).concat(b) : b).toString(r)
        },
        parse: function (a) {
          a = r.parse(a);
          var b = a.words;
          if (1398893684 == b[0] && 1701076831 == b[1]) {
            var c = l.create(b.slice(2, 4));
            b.splice(0, 4);
            a.sigBytes -= 16
          }
          return p.create({
            ciphertext: a,
            salt: c
          })
        }
      },
      j = f.SerializableCipher = k.extend({
        cfg: k.extend({
          format: m
        }),
        encrypt: function (a, b, c, d) {
          d = this.cfg.extend(d);
          var e = a.createEncryptor(c, d);
          b = e.finalize(b);
          e = e.cfg;
          return p.create({
            ciphertext: b,
            key: c,
            iv: e.iv,
            algorithm: a,
            mode: e.mode,
            padding: e.padding,
            blockSize: a.blockSize,
            formatter: d.format
          })
        },
        decrypt: function (a, b, c, d) {
          d = this.cfg.extend(d);
          b = this._parse(b, d.format);
          return a.createDecryptor(c, d).finalize(b.ciphertext)
        },
        _parse: function (a, b) {
          return "string" == typeof a ? b.parse(a, this) : a
        }
      }),
      g = (g.kdf = {}).OpenSSL = {
        execute: function (a, b, c, d) {
          d || (d = l.random(8));
          a = v.create({
            keySize: b + c
          }).compute(a, d);
          c = l.create(a.words.slice(b), 4 * c);
          a.sigBytes = 4 * b;
          return p.create({
            key: a,
            iv: c,
            salt: d
          })
        }
      },
      s = f.PasswordBasedCipher = j.extend({
        cfg: j.cfg.extend({
          kdf: g
        }),
        encrypt: function (a, b, c, d) {
          d = this.cfg.extend(d);
          c = d.kdf.execute(c, a.keySize, a.ivSize);
          d.iv = c.iv;
          a = j.encrypt.call(this, a, b, c.key, d);
          a.mixIn(c);
          return a
        },
        decrypt: function (a, b, c, d) {
          d = this.cfg.extend(d);
          b = this._parse(b, d.format);
          c = d.kdf.execute(c, a.keySize, a.ivSize, b.salt);
          d.iv = c.iv;
          return j.decrypt.call(this, a, b, c.key, d)
        }
      })
  }();

(function () {
  for (var q = CryptoJS,
    x = q.lib.BlockCipher,
    r = q.algo,
    j = [], y = [], z = [], A = [], B = [], C = [], s = [], u = [], v = [], w = [], g = [], k = 0; 256 > k; k++) g[k] = 128 > k ? k << 1 : k << 1 ^ 283;
  for (var n = 0,
    l = 0,
    k = 0; 256 > k; k++) {
    var f = l ^ l << 1 ^ l << 2 ^ l << 3 ^ l << 4,
      f = f >>> 8 ^ f & 255 ^ 99;
    j[n] = f;
    y[f] = n;
    var t = g[n],
      D = g[t],
      E = g[D],
      b = 257 * g[f] ^ 16843008 * f;
    z[n] = b << 24 | b >>> 8;
    A[n] = b << 16 | b >>> 16;
    B[n] = b << 8 | b >>> 24;
    C[n] = b;
    b = 16843009 * E ^ 65537 * D ^ 257 * t ^ 16843008 * n;
    s[f] = b << 24 | b >>> 8;
    u[f] = b << 16 | b >>> 16;
    v[f] = b << 8 | b >>> 24;
    w[f] = b;
    n ? (n = t ^ g[g[g[E ^ t]]], l ^= g[g[l]]) : n = l = 1
  }
  var F = [0, 1, 2, 4, 8, 16, 32, 64, 128, 27, 54],
    r = r.AES = x.extend({
      _doReset: function () {
        for (var c = this._key,
          e = c.words,
          a = c.sigBytes / 4,
          c = 4 * ((this._nRounds = a + 6) + 1), b = this._keySchedule = [], h = 0; h < c; h++) if (h < a) b[h] = e[h];
          else {
            var d = b[h - 1];
            h % a ? 6 < a && 4 == h % a && (d = j[d >>> 24] << 24 | j[d >>> 16 & 255] << 16 | j[d >>> 8 & 255] << 8 | j[d & 255]) : (d = d << 8 | d >>> 24, d = j[d >>> 24] << 24 | j[d >>> 16 & 255] << 16 | j[d >>> 8 & 255] << 8 | j[d & 255], d ^= F[h / a | 0] << 24);
            b[h] = b[h - a] ^ d
          }
        e = this._invKeySchedule = [];
        for (a = 0; a < c; a++) h = c - a,
          d = a % 4 ? b[h] : b[h - 4],
          e[a] = 4 > a || 4 >= h ? d : s[j[d >>> 24]] ^ u[j[d >>> 16 & 255]] ^ v[j[d >>> 8 & 255]] ^ w[j[d & 255]]
      },
      encryptBlock: function (c, e) {
        this._doCryptBlock(c, e, this._keySchedule, z, A, B, C, j)
      },
      decryptBlock: function (c, e) {
        var a = c[e + 1];
        c[e + 1] = c[e + 3];
        c[e + 3] = a;
        this._doCryptBlock(c, e, this._invKeySchedule, s, u, v, w, y);
        a = c[e + 1];
        c[e + 1] = c[e + 3];
        c[e + 3] = a
      },
      _doCryptBlock: function (c, e, a, b, h, d, j, m) {
        for (var n = this._nRounds,
          f = c[e] ^ a[0], g = c[e + 1] ^ a[1], k = c[e + 2] ^ a[2], p = c[e + 3] ^ a[3], l = 4, t = 1; t < n; t++) var q = b[f >>> 24] ^ h[g >>> 16 & 255] ^ d[k >>> 8 & 255] ^ j[p & 255] ^ a[l++],
            r = b[g >>> 24] ^ h[k >>> 16 & 255] ^ d[p >>> 8 & 255] ^ j[f & 255] ^ a[l++],
            s = b[k >>> 24] ^ h[p >>> 16 & 255] ^ d[f >>> 8 & 255] ^ j[g & 255] ^ a[l++],
            p = b[p >>> 24] ^ h[f >>> 16 & 255] ^ d[g >>> 8 & 255] ^ j[k & 255] ^ a[l++],
            f = q,
            g = r,
            k = s;
        q = (m[f >>> 24] << 24 | m[g >>> 16 & 255] << 16 | m[k >>> 8 & 255] << 8 | m[p & 255]) ^ a[l++];
        r = (m[g >>> 24] << 24 | m[k >>> 16 & 255] << 16 | m[p >>> 8 & 255] << 8 | m[f & 255]) ^ a[l++];
        s = (m[k >>> 24] << 24 | m[p >>> 16 & 255] << 16 | m[f >>> 8 & 255] << 8 | m[g & 255]) ^ a[l++];
        p = (m[p >>> 24] << 24 | m[f >>> 16 & 255] << 16 | m[g >>> 8 & 255] << 8 | m[k & 255]) ^ a[l++];
        c[e] = q;
        c[e + 1] = r;
        c[e + 2] = s;
        c[e + 3] = p
      },
      keySize: 8
    });
  q.AES = x._createHelper(r)
})();

(function () {
  function j(b, c) {
    var a = (this._lBlock >>> b ^ this._rBlock) & c;
    this._rBlock ^= a;
    this._lBlock ^= a << b
  }
  function l(b, c) {
    var a = (this._rBlock >>> b ^ this._lBlock) & c;
    this._lBlock ^= a;
    this._rBlock ^= a << b
  }
  var h = CryptoJS,
    e = h.lib,
    n = e.WordArray,
    e = e.BlockCipher,
    g = h.algo,
    q = [57, 49, 41, 33, 25, 17, 9, 1, 58, 50, 42, 34, 26, 18, 10, 2, 59, 51, 43, 35, 27, 19, 11, 3, 60, 52, 44, 36, 63, 55, 47, 39, 31, 23, 15, 7, 62, 54, 46, 38, 30, 22, 14, 6, 61, 53, 45, 37, 29, 21, 13, 5, 28, 20, 12, 4],
    p = [14, 17, 11, 24, 1, 5, 3, 28, 15, 6, 21, 10, 23, 19, 12, 4, 26, 8, 16, 7, 27, 20, 13, 2, 41, 52, 31, 37, 47, 55, 30, 40, 51, 45, 33, 48, 44, 49, 39, 56, 34, 53, 46, 42, 50, 36, 29, 32],
    r = [1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23, 25, 27, 28],
    s = [{
      "0": 8421888,
      268435456: 32768,
      536870912: 8421378,
      805306368: 2,
      1073741824: 512,
      1342177280: 8421890,
      1610612736: 8389122,
      1879048192: 8388608,
      2147483648: 514,
      2415919104: 8389120,
      2684354560: 33280,
      2952790016: 8421376,
      3221225472: 32770,
      3489660928: 8388610,
      3758096384: 0,
      4026531840: 33282,
      134217728: 0,
      402653184: 8421890,
      671088640: 33282,
      939524096: 32768,
      1207959552: 8421888,
      1476395008: 512,
      1744830464: 8421378,
      2013265920: 2,
      2281701376: 8389120,
      2550136832: 33280,
      2818572288: 8421376,
      3087007744: 8389122,
      3355443200: 8388610,
      3623878656: 32770,
      3892314112: 514,
      4160749568: 8388608,
      1: 32768,
      268435457: 2,
      536870913: 8421888,
      805306369: 8388608,
      1073741825: 8421378,
      1342177281: 33280,
      1610612737: 512,
      1879048193: 8389122,
      2147483649: 8421890,
      2415919105: 8421376,
      2684354561: 8388610,
      2952790017: 33282,
      3221225473: 514,
      3489660929: 8389120,
      3758096385: 32770,
      4026531841: 0,
      134217729: 8421890,
      402653185: 8421376,
      671088641: 8388608,
      939524097: 512,
      1207959553: 32768,
      1476395009: 8388610,
      1744830465: 2,
      2013265921: 33282,
      2281701377: 32770,
      2550136833: 8389122,
      2818572289: 514,
      3087007745: 8421888,
      3355443201: 8389120,
      3623878657: 0,
      3892314113: 33280,
      4160749569: 8421378
    },
    {
      "0": 1074282512,
      16777216: 16384,
      33554432: 524288,
      50331648: 1074266128,
      67108864: 1073741840,
      83886080: 1074282496,
      100663296: 1073758208,
      117440512: 16,
      134217728: 540672,
      150994944: 1073758224,
      167772160: 1073741824,
      184549376: 540688,
      201326592: 524304,
      218103808: 0,
      234881024: 16400,
      251658240: 1074266112,
      8388608: 1073758208,
      25165824: 540688,
      41943040: 16,
      58720256: 1073758224,
      75497472: 1074282512,
      92274688: 1073741824,
      109051904: 524288,
      125829120: 1074266128,
      142606336: 524304,
      159383552: 0,
      176160768: 16384,
      192937984: 1074266112,
      209715200: 1073741840,
      226492416: 540672,
      243269632: 1074282496,
      260046848: 16400,
      268435456: 0,
      285212672: 1074266128,
      301989888: 1073758224,
      318767104: 1074282496,
      335544320: 1074266112,
      352321536: 16,
      369098752: 540688,
      385875968: 16384,
      402653184: 16400,
      419430400: 524288,
      436207616: 524304,
      452984832: 1073741840,
      469762048: 540672,
      486539264: 1073758208,
      503316480: 1073741824,
      520093696: 1074282512,
      276824064: 540688,
      293601280: 524288,
      310378496: 1074266112,
      327155712: 16384,
      343932928: 1073758208,
      360710144: 1074282512,
      377487360: 16,
      394264576: 1073741824,
      411041792: 1074282496,
      427819008: 1073741840,
      444596224: 1073758224,
      461373440: 524304,
      478150656: 0,
      494927872: 16400,
      511705088: 1074266128,
      528482304: 540672
    },
    {
      "0": 260,
      1048576: 0,
      2097152: 67109120,
      3145728: 65796,
      4194304: 65540,
      5242880: 67108868,
      6291456: 67174660,
      7340032: 67174400,
      8388608: 67108864,
      9437184: 67174656,
      10485760: 65792,
      11534336: 67174404,
      12582912: 67109124,
      13631488: 65536,
      14680064: 4,
      15728640: 256,
      524288: 67174656,
      1572864: 67174404,
      2621440: 0,
      3670016: 67109120,
      4718592: 67108868,
      5767168: 65536,
      6815744: 65540,
      7864320: 260,
      8912896: 4,
      9961472: 256,
      11010048: 67174400,
      12058624: 65796,
      13107200: 65792,
      14155776: 67109124,
      15204352: 67174660,
      16252928: 67108864,
      16777216: 67174656,
      17825792: 65540,
      18874368: 65536,
      19922944: 67109120,
      20971520: 256,
      22020096: 67174660,
      23068672: 67108868,
      24117248: 0,
      25165824: 67109124,
      26214400: 67108864,
      27262976: 4,
      28311552: 65792,
      29360128: 67174400,
      30408704: 260,
      31457280: 65796,
      32505856: 67174404,
      17301504: 67108864,
      18350080: 260,
      19398656: 67174656,
      20447232: 0,
      21495808: 65540,
      22544384: 67109120,
      23592960: 256,
      24641536: 67174404,
      25690112: 65536,
      26738688: 67174660,
      27787264: 65796,
      28835840: 67108868,
      29884416: 67109124,
      30932992: 67174400,
      31981568: 4,
      33030144: 65792
    },
    {
      "0": 2151682048,
      65536: 2147487808,
      131072: 4198464,
      196608: 2151677952,
      262144: 0,
      327680: 4198400,
      393216: 2147483712,
      458752: 4194368,
      524288: 2147483648,
      589824: 4194304,
      655360: 64,
      720896: 2147487744,
      786432: 2151678016,
      851968: 4160,
      917504: 4096,
      983040: 2151682112,
      32768: 2147487808,
      98304: 64,
      163840: 2151678016,
      229376: 2147487744,
      294912: 4198400,
      360448: 2151682112,
      425984: 0,
      491520: 2151677952,
      557056: 4096,
      622592: 2151682048,
      688128: 4194304,
      753664: 4160,
      819200: 2147483648,
      884736: 4194368,
      950272: 4198464,
      1015808: 2147483712,
      1048576: 4194368,
      1114112: 4198400,
      1179648: 2147483712,
      1245184: 0,
      1310720: 4160,
      1376256: 2151678016,
      1441792: 2151682048,
      1507328: 2147487808,
      1572864: 2151682112,
      1638400: 2147483648,
      1703936: 2151677952,
      1769472: 4198464,
      1835008: 2147487744,
      1900544: 4194304,
      1966080: 64,
      2031616: 4096,
      1081344: 2151677952,
      1146880: 2151682112,
      1212416: 0,
      1277952: 4198400,
      1343488: 4194368,
      1409024: 2147483648,
      1474560: 2147487808,
      1540096: 64,
      1605632: 2147483712,
      1671168: 4096,
      1736704: 2147487744,
      1802240: 2151678016,
      1867776: 4160,
      1933312: 2151682048,
      1998848: 4194304,
      2064384: 4198464
    },
    {
      "0": 128,
      4096: 17039360,
      8192: 262144,
      12288: 536870912,
      16384: 537133184,
      20480: 16777344,
      24576: 553648256,
      28672: 262272,
      32768: 16777216,
      36864: 537133056,
      40960: 536871040,
      45056: 553910400,
      49152: 553910272,
      53248: 0,
      57344: 17039488,
      61440: 553648128,
      2048: 17039488,
      6144: 553648256,
      10240: 128,
      14336: 17039360,
      18432: 262144,
      22528: 537133184,
      26624: 553910272,
      30720: 536870912,
      34816: 537133056,
      38912: 0,
      43008: 553910400,
      47104: 16777344,
      51200: 536871040,
      55296: 553648128,
      59392: 16777216,
      63488: 262272,
      65536: 262144,
      69632: 128,
      73728: 536870912,
      77824: 553648256,
      81920: 16777344,
      86016: 553910272,
      90112: 537133184,
      94208: 16777216,
      98304: 553910400,
      102400: 553648128,
      106496: 17039360,
      110592: 537133056,
      114688: 262272,
      118784: 536871040,
      122880: 0,
      126976: 17039488,
      67584: 553648256,
      71680: 16777216,
      75776: 17039360,
      79872: 537133184,
      83968: 536870912,
      88064: 17039488,
      92160: 128,
      96256: 553910272,
      100352: 262272,
      104448: 553910400,
      108544: 0,
      112640: 553648128,
      116736: 16777344,
      120832: 262144,
      124928: 537133056,
      129024: 536871040
    },
    {
      "0": 268435464,
      256: 8192,
      512: 270532608,
      768: 270540808,
      1024: 268443648,
      1280: 2097152,
      1536: 2097160,
      1792: 268435456,
      2048: 0,
      2304: 268443656,
      2560: 2105344,
      2816: 8,
      3072: 270532616,
      3328: 2105352,
      3584: 8200,
      3840: 270540800,
      128: 270532608,
      384: 270540808,
      640: 8,
      896: 2097152,
      1152: 2105352,
      1408: 268435464,
      1664: 268443648,
      1920: 8200,
      2176: 2097160,
      2432: 8192,
      2688: 268443656,
      2944: 270532616,
      3200: 0,
      3456: 270540800,
      3712: 2105344,
      3968: 268435456,
      4096: 268443648,
      4352: 270532616,
      4608: 270540808,
      4864: 8200,
      5120: 2097152,
      5376: 268435456,
      5632: 268435464,
      5888: 2105344,
      6144: 2105352,
      6400: 0,
      6656: 8,
      6912: 270532608,
      7168: 8192,
      7424: 268443656,
      7680: 270540800,
      7936: 2097160,
      4224: 8,
      4480: 2105344,
      4736: 2097152,
      4992: 268435464,
      5248: 268443648,
      5504: 8200,
      5760: 270540808,
      6016: 270532608,
      6272: 270540800,
      6528: 270532616,
      6784: 8192,
      7040: 2105352,
      7296: 2097160,
      7552: 0,
      7808: 268435456,
      8064: 268443656
    },
    {
      "0": 1048576,
      16: 33555457,
      32: 1024,
      48: 1049601,
      64: 34604033,
      80: 0,
      96: 1,
      112: 34603009,
      128: 33555456,
      144: 1048577,
      160: 33554433,
      176: 34604032,
      192: 34603008,
      208: 1025,
      224: 1049600,
      240: 33554432,
      8: 34603009,
      24: 0,
      40: 33555457,
      56: 34604032,
      72: 1048576,
      88: 33554433,
      104: 33554432,
      120: 1025,
      136: 1049601,
      152: 33555456,
      168: 34603008,
      184: 1048577,
      200: 1024,
      216: 34604033,
      232: 1,
      248: 1049600,
      256: 33554432,
      272: 1048576,
      288: 33555457,
      304: 34603009,
      320: 1048577,
      336: 33555456,
      352: 34604032,
      368: 1049601,
      384: 1025,
      400: 34604033,
      416: 1049600,
      432: 1,
      448: 0,
      464: 34603008,
      480: 33554433,
      496: 1024,
      264: 1049600,
      280: 33555457,
      296: 34603009,
      312: 1,
      328: 33554432,
      344: 1048576,
      360: 1025,
      376: 34604032,
      392: 33554433,
      408: 34603008,
      424: 0,
      440: 34604033,
      456: 1049601,
      472: 1024,
      488: 33555456,
      504: 1048577
    },
    {
      "0": 134219808,
      1: 131072,
      2: 134217728,
      3: 32,
      4: 131104,
      5: 134350880,
      6: 134350848,
      7: 2048,
      8: 134348800,
      9: 134219776,
      10: 133120,
      11: 134348832,
      12: 2080,
      13: 0,
      14: 134217760,
      15: 133152,
      2147483648: 2048,
      2147483649: 134350880,
      2147483650: 134219808,
      2147483651: 134217728,
      2147483652: 134348800,
      2147483653: 133120,
      2147483654: 133152,
      2147483655: 32,
      2147483656: 134217760,
      2147483657: 2080,
      2147483658: 131104,
      2147483659: 134350848,
      2147483660: 0,
      2147483661: 134348832,
      2147483662: 134219776,
      2147483663: 131072,
      16: 133152,
      17: 134350848,
      18: 32,
      19: 2048,
      20: 134219776,
      21: 134217760,
      22: 134348832,
      23: 131072,
      24: 0,
      25: 131104,
      26: 134348800,
      27: 134219808,
      28: 134350880,
      29: 133120,
      30: 2080,
      31: 134217728,
      2147483664: 131072,
      2147483665: 2048,
      2147483666: 134348832,
      2147483667: 133152,
      2147483668: 32,
      2147483669: 134348800,
      2147483670: 134217728,
      2147483671: 134219808,
      2147483672: 134350880,
      2147483673: 134217760,
      2147483674: 134219776,
      2147483675: 0,
      2147483676: 133120,
      2147483677: 2080,
      2147483678: 131104,
      2147483679: 134350848
    }],
    t = [4160749569, 528482304, 33030144, 2064384, 129024, 8064, 504, 2147483679],
    m = g.DES = e.extend({
      _doReset: function () {
        for (var b = this._key.words,
          c = [], a = 0; 56 > a; a++) {
          var f = q[a] - 1;
          c[a] = b[f >>> 5] >>> 31 - f % 32 & 1
        }
        b = this._subKeys = [];
        for (f = 0; 16 > f; f++) {
          for (var d = b[f] = [], e = r[f], a = 0; 24 > a; a++) d[a / 6 | 0] |= c[(p[a] - 1 + e) % 28] << 31 - a % 6,
            d[4 + (a / 6 | 0)] |= c[28 + (p[a + 24] - 1 + e) % 28] << 31 - a % 6;
          d[0] = d[0] << 1 | d[0] >>> 31;
          for (a = 1; 7 > a; a++) d[a] >>>= 4 * (a - 1) + 3;
          d[7] = d[7] << 5 | d[7] >>> 27
        }
        c = this._invSubKeys = [];
        for (a = 0; 16 > a; a++) c[a] = b[15 - a]
      },
      encryptBlock: function (b, c) {
        this._doCryptBlock(b, c, this._subKeys)
      },
      decryptBlock: function (b, c) {
        this._doCryptBlock(b, c, this._invSubKeys)
      },
      _doCryptBlock: function (b, c, a) {
        this._lBlock = b[c];
        this._rBlock = b[c + 1];
        j.call(this, 4, 252645135);
        j.call(this, 16, 65535);
        l.call(this, 2, 858993459);
        l.call(this, 8, 16711935);
        j.call(this, 1, 1431655765);
        for (var f = 0; 16 > f; f++) {
          for (var d = a[f], e = this._lBlock, h = this._rBlock, g = 0, k = 0; 8 > k; k++) g |= s[k][((h ^ d[k]) & t[k]) >>> 0];
          this._lBlock = h;
          this._rBlock = e ^ g
        }
        a = this._lBlock;
        this._lBlock = this._rBlock;
        this._rBlock = a;
        j.call(this, 1, 1431655765);
        l.call(this, 8, 16711935);
        l.call(this, 2, 858993459);
        j.call(this, 16, 65535);
        j.call(this, 4, 252645135);
        b[c] = this._lBlock;
        b[c + 1] = this._rBlock
      },
      keySize: 2,
      ivSize: 2,
      blockSize: 2
    });
  h.DES = e._createHelper(m);
  g = g.TripleDES = e.extend({
    _doReset: function () {
      var b = this._key.words;
      this._des1 = m.createEncryptor(n.create(b.slice(0, 2)));
      this._des2 = m.createEncryptor(n.create(b.slice(2, 4)));
      this._des3 = m.createEncryptor(n.create(b.slice(4, 6)))
    },
    encryptBlock: function (b, c) {
      this._des1.encryptBlock(b, c);
      this._des2.decryptBlock(b, c);
      this._des3.encryptBlock(b, c)
    },
    decryptBlock: function (b, c) {
      this._des3.decryptBlock(b, c);
      this._des2.encryptBlock(b, c);
      this._des1.decryptBlock(b, c)
    },
    keySize: 6,
    ivSize: 2,
    blockSize: 2
  });
  h.TripleDES = e._createHelper(g)
})();

(function () {
  var h = CryptoJS,
    j = h.lib.WordArray;
  h.enc.Base64 = {
    stringify: function (b) {
      var e = b.words,
        f = b.sigBytes,
        c = this._map;
      b.clamp();
      b = [];
      for (var a = 0; a < f; a += 3) for (var d = (e[a >>> 2] >>> 24 - 8 * (a % 4) & 255) << 16 | (e[a + 1 >>> 2] >>> 24 - 8 * ((a + 1) % 4) & 255) << 8 | e[a + 2 >>> 2] >>> 24 - 8 * ((a + 2) % 4) & 255, g = 0; 4 > g && a + 0.75 * g < f; g++) b.push(c.charAt(d >>> 6 * (3 - g) & 63));
      if (e = c.charAt(64)) for (; b.length % 4;) b.push(e);
      return b.join("")
    },
    parse: function (b) {
      var e = b.length,
        f = this._map,
        c = f.charAt(64);
      c && (c = b.indexOf(c), -1 != c && (e = c));
      for (var c = [], a = 0, d = 0; d < e; d++) if (d % 4) {
        var g = f.indexOf(b.charAt(d - 1)) << 2 * (d % 4),
          h = f.indexOf(b.charAt(d)) >>> 6 - 2 * (d % 4);
        c[a >>> 2] |= (g | h) << 24 - 8 * (a % 4);
        a++
      }
      return j.create(c, a)
    },
    _map: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="
  }
})();

(function (E) {
  function h(a, f, g, j, p, h, k) {
    a = a + (f & g | ~f & j) + p + k;
    return (a << h | a >>> 32 - h) + f
  }
  function k(a, f, g, j, p, h, k) {
    a = a + (f & j | g & ~j) + p + k;
    return (a << h | a >>> 32 - h) + f
  }
  function l(a, f, g, j, h, k, l) {
    a = a + (f ^ g ^ j) + h + l;
    return (a << k | a >>> 32 - k) + f
  }
  function n(a, f, g, j, h, k, l) {
    a = a + (g ^ (f | ~j)) + h + l;
    return (a << k | a >>> 32 - k) + f
  }
  for (var r = CryptoJS,
    q = r.lib,
    F = q.WordArray,
    s = q.Hasher,
    q = r.algo,
    a = [], t = 0; 64 > t; t++) a[t] = 4294967296 * E.abs(E.sin(t + 1)) | 0;
  q = q.MD5 = s.extend({
    _doReset: function () {
      this._hash = new F.init([1732584193, 4023233417, 2562383102, 271733878])
    },
    _doProcessBlock: function (m, f) {
      for (var g = 0; 16 > g; g++) {
        var j = f + g,
          p = m[j];
        m[j] = (p << 8 | p >>> 24) & 16711935 | (p << 24 | p >>> 8) & 4278255360
      }
      var g = this._hash.words,
        j = m[f + 0],
        p = m[f + 1],
        q = m[f + 2],
        r = m[f + 3],
        s = m[f + 4],
        t = m[f + 5],
        u = m[f + 6],
        v = m[f + 7],
        w = m[f + 8],
        x = m[f + 9],
        y = m[f + 10],
        z = m[f + 11],
        A = m[f + 12],
        B = m[f + 13],
        C = m[f + 14],
        D = m[f + 15],
        b = g[0],
        c = g[1],
        d = g[2],
        e = g[3],
        b = h(b, c, d, e, j, 7, a[0]),
        e = h(e, b, c, d, p, 12, a[1]),
        d = h(d, e, b, c, q, 17, a[2]),
        c = h(c, d, e, b, r, 22, a[3]),
        b = h(b, c, d, e, s, 7, a[4]),
        e = h(e, b, c, d, t, 12, a[5]),
        d = h(d, e, b, c, u, 17, a[6]),
        c = h(c, d, e, b, v, 22, a[7]),
        b = h(b, c, d, e, w, 7, a[8]),
        e = h(e, b, c, d, x, 12, a[9]),
        d = h(d, e, b, c, y, 17, a[10]),
        c = h(c, d, e, b, z, 22, a[11]),
        b = h(b, c, d, e, A, 7, a[12]),
        e = h(e, b, c, d, B, 12, a[13]),
        d = h(d, e, b, c, C, 17, a[14]),
        c = h(c, d, e, b, D, 22, a[15]),
        b = k(b, c, d, e, p, 5, a[16]),
        e = k(e, b, c, d, u, 9, a[17]),
        d = k(d, e, b, c, z, 14, a[18]),
        c = k(c, d, e, b, j, 20, a[19]),
        b = k(b, c, d, e, t, 5, a[20]),
        e = k(e, b, c, d, y, 9, a[21]),
        d = k(d, e, b, c, D, 14, a[22]),
        c = k(c, d, e, b, s, 20, a[23]),
        b = k(b, c, d, e, x, 5, a[24]),
        e = k(e, b, c, d, C, 9, a[25]),
        d = k(d, e, b, c, r, 14, a[26]),
        c = k(c, d, e, b, w, 20, a[27]),
        b = k(b, c, d, e, B, 5, a[28]),
        e = k(e, b, c, d, q, 9, a[29]),
        d = k(d, e, b, c, v, 14, a[30]),
        c = k(c, d, e, b, A, 20, a[31]),
        b = l(b, c, d, e, t, 4, a[32]),
        e = l(e, b, c, d, w, 11, a[33]),
        d = l(d, e, b, c, z, 16, a[34]),
        c = l(c, d, e, b, C, 23, a[35]),
        b = l(b, c, d, e, p, 4, a[36]),
        e = l(e, b, c, d, s, 11, a[37]),
        d = l(d, e, b, c, v, 16, a[38]),
        c = l(c, d, e, b, y, 23, a[39]),
        b = l(b, c, d, e, B, 4, a[40]),
        e = l(e, b, c, d, j, 11, a[41]),
        d = l(d, e, b, c, r, 16, a[42]),
        c = l(c, d, e, b, u, 23, a[43]),
        b = l(b, c, d, e, x, 4, a[44]),
        e = l(e, b, c, d, A, 11, a[45]),
        d = l(d, e, b, c, D, 16, a[46]),
        c = l(c, d, e, b, q, 23, a[47]),
        b = n(b, c, d, e, j, 6, a[48]),
        e = n(e, b, c, d, v, 10, a[49]),
        d = n(d, e, b, c, C, 15, a[50]),
        c = n(c, d, e, b, t, 21, a[51]),
        b = n(b, c, d, e, A, 6, a[52]),
        e = n(e, b, c, d, r, 10, a[53]),
        d = n(d, e, b, c, y, 15, a[54]),
        c = n(c, d, e, b, p, 21, a[55]),
        b = n(b, c, d, e, w, 6, a[56]),
        e = n(e, b, c, d, D, 10, a[57]),
        d = n(d, e, b, c, u, 15, a[58]),
        c = n(c, d, e, b, B, 21, a[59]),
        b = n(b, c, d, e, s, 6, a[60]),
        e = n(e, b, c, d, z, 10, a[61]),
        d = n(d, e, b, c, q, 15, a[62]),
        c = n(c, d, e, b, x, 21, a[63]);
      g[0] = g[0] + b | 0;
      g[1] = g[1] + c | 0;
      g[2] = g[2] + d | 0;
      g[3] = g[3] + e | 0
    },
    _doFinalize: function () {
      var a = this._data,
        f = a.words,
        g = 8 * this._nDataBytes,
        j = 8 * a.sigBytes;
      f[j >>> 5] |= 128 << 24 - j % 32;
      var h = E.floor(g / 4294967296);
      f[(j + 64 >>> 9 << 4) + 15] = (h << 8 | h >>> 24) & 16711935 | (h << 24 | h >>> 8) & 4278255360;
      f[(j + 64 >>> 9 << 4) + 14] = (g << 8 | g >>> 24) & 16711935 | (g << 24 | g >>> 8) & 4278255360;
      a.sigBytes = 4 * (f.length + 1);
      this._process();
      a = this._hash;
      f = a.words;
      for (g = 0; 4 > g; g++) j = f[g],
        f[g] = (j << 8 | j >>> 24) & 16711935 | (j << 24 | j >>> 8) & 4278255360;
      return a
    },
    clone: function () {
      var a = s.clone.call(this);
      a._hash = this._hash.clone();
      return a
    }
  });
  r.MD5 = s._createHelper(q);
  r.HmacMD5 = s._createHmacHelper(q)
})(Math);

(function () {
  var k = CryptoJS,
    b = k.lib,
    m = b.WordArray,
    l = b.Hasher,
    d = [],
    b = k.algo.SHA1 = l.extend({
      _doReset: function () {
        this._hash = new m.init([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
      },
      _doProcessBlock: function (n, p) {
        for (var a = this._hash.words,
          e = a[0], f = a[1], h = a[2], j = a[3], b = a[4], c = 0; 80 > c; c++) {
          if (16 > c) d[c] = n[p + c] | 0;
          else {
            var g = d[c - 3] ^ d[c - 8] ^ d[c - 14] ^ d[c - 16];
            d[c] = g << 1 | g >>> 31
          }
          g = (e << 5 | e >>> 27) + b + d[c];
          g = 20 > c ? g + ((f & h | ~f & j) + 1518500249) : 40 > c ? g + ((f ^ h ^ j) + 1859775393) : 60 > c ? g + ((f & h | f & j | h & j) - 1894007588) : g + ((f ^ h ^ j) - 899497514);
          b = j;
          j = h;
          h = f << 30 | f >>> 2;
          f = e;
          e = g
        }
        a[0] = a[0] + e | 0;
        a[1] = a[1] + f | 0;
        a[2] = a[2] + h | 0;
        a[3] = a[3] + j | 0;
        a[4] = a[4] + b | 0
      },
      _doFinalize: function () {
        var b = this._data,
          d = b.words,
          a = 8 * this._nDataBytes,
          e = 8 * b.sigBytes;
        d[e >>> 5] |= 128 << 24 - e % 32;
        d[(e + 64 >>> 9 << 4) + 14] = Math.floor(a / 4294967296);
        d[(e + 64 >>> 9 << 4) + 15] = a;
        b.sigBytes = 4 * d.length;
        this._process();
        return this._hash
      },
      clone: function () {
        var b = l.clone.call(this);
        b._hash = this._hash.clone();
        return b
      }
    });
  k.SHA1 = l._createHelper(b);
  k.HmacSHA1 = l._createHmacHelper(b)
})();

(function (k) {
  for (var g = CryptoJS,
    h = g.lib,
    v = h.WordArray,
    j = h.Hasher,
    h = g.algo,
    s = [], t = [], u = function (q) {
      return 4294967296 * (q - (q | 0)) | 0
    },
    l = 2, b = 0; 64 > b;) {
    var d;
    a: {
      d = l;
      for (var w = k.sqrt(d), r = 2; r <= w; r++) if (!(d % r)) {
        d = !1;
        break a
      }
      d = !0
    }
    d && (8 > b && (s[b] = u(k.pow(l, 0.5))), t[b] = u(k.pow(l, 1 / 3)), b++);
    l++
  }
  var n = [],
    h = h.SHA256 = j.extend({
      _doReset: function () {
        this._hash = new v.init(s.slice(0))
      },
      _doProcessBlock: function (q, h) {
        for (var a = this._hash.words,
          c = a[0], d = a[1], b = a[2], k = a[3], f = a[4], g = a[5], j = a[6], l = a[7], e = 0; 64 > e; e++) {
          if (16 > e) n[e] = q[h + e] | 0;
          else {
            var m = n[e - 15],
              p = n[e - 2];
            n[e] = ((m << 25 | m >>> 7) ^ (m << 14 | m >>> 18) ^ m >>> 3) + n[e - 7] + ((p << 15 | p >>> 17) ^ (p << 13 | p >>> 19) ^ p >>> 10) + n[e - 16]
          }
          m = l + ((f << 26 | f >>> 6) ^ (f << 21 | f >>> 11) ^ (f << 7 | f >>> 25)) + (f & g ^ ~f & j) + t[e] + n[e];
          p = ((c << 30 | c >>> 2) ^ (c << 19 | c >>> 13) ^ (c << 10 | c >>> 22)) + (c & d ^ c & b ^ d & b);
          l = j;
          j = g;
          g = f;
          f = k + m | 0;
          k = b;
          b = d;
          d = c;
          c = m + p | 0
        }
        a[0] = a[0] + c | 0;
        a[1] = a[1] + d | 0;
        a[2] = a[2] + b | 0;
        a[3] = a[3] + k | 0;
        a[4] = a[4] + f | 0;
        a[5] = a[5] + g | 0;
        a[6] = a[6] + j | 0;
        a[7] = a[7] + l | 0
      },
      _doFinalize: function () {
        var d = this._data,
          b = d.words,
          a = 8 * this._nDataBytes,
          c = 8 * d.sigBytes;
        b[c >>> 5] |= 128 << 24 - c % 32;
        b[(c + 64 >>> 9 << 4) + 14] = k.floor(a / 4294967296);
        b[(c + 64 >>> 9 << 4) + 15] = a;
        d.sigBytes = 4 * b.length;
        this._process();
        return this._hash
      },
      clone: function () {
        var b = j.clone.call(this);
        b._hash = this._hash.clone();
        return b
      }
    });
  g.SHA256 = j._createHelper(h);
  g.HmacSHA256 = j._createHmacHelper(h)
})(Math);

(function () {
  var b = CryptoJS,
    d = b.lib.WordArray,
    a = b.algo,
    c = a.SHA256,
    a = a.SHA224 = c.extend({
      _doReset: function () {
        this._hash = new d.init([3238371032, 914150663, 812702999, 4144912697, 4290775857, 1750603025, 1694076839, 3204075428])
      },
      _doFinalize: function () {
        var a = c._doFinalize.call(this);
        a.sigBytes -= 4;
        return a
      }
    });
  b.SHA224 = c._createHelper(a);
  b.HmacSHA224 = c._createHmacHelper(a)
})();

(function () {
  function a() {
    return d.create.apply(d, arguments)
  }
  for (var n = CryptoJS,
    r = n.lib.Hasher,
    e = n.x64,
    d = e.Word,
    T = e.WordArray,
    e = n.algo,
    ea = [a(1116352408, 3609767458), a(1899447441, 602891725), a(3049323471, 3964484399), a(3921009573, 2173295548), a(961987163, 4081628472), a(1508970993, 3053834265), a(2453635748, 2937671579), a(2870763221, 3664609560), a(3624381080, 2734883394), a(310598401, 1164996542), a(607225278, 1323610764), a(1426881987, 3590304994), a(1925078388, 4068182383), a(2162078206, 991336113), a(2614888103, 633803317), a(3248222580, 3479774868), a(3835390401, 2666613458), a(4022224774, 944711139), a(264347078, 2341262773), a(604807628, 2007800933), a(770255983, 1495990901), a(1249150122, 1856431235), a(1555081692, 3175218132), a(1996064986, 2198950837), a(2554220882, 3999719339), a(2821834349, 766784016), a(2952996808, 2566594879), a(3210313671, 3203337956), a(3336571891, 1034457026), a(3584528711, 2466948901), a(113926993, 3758326383), a(338241895, 168717936), a(666307205, 1188179964), a(773529912, 1546045734), a(1294757372, 1522805485), a(1396182291, 2643833823), a(1695183700, 2343527390), a(1986661051, 1014477480), a(2177026350, 1206759142), a(2456956037, 344077627), a(2730485921, 1290863460), a(2820302411, 3158454273), a(3259730800, 3505952657), a(3345764771, 106217008), a(3516065817, 3606008344), a(3600352804, 1432725776), a(4094571909, 1467031594), a(275423344, 851169720), a(430227734, 3100823752), a(506948616, 1363258195), a(659060556, 3750685593), a(883997877, 3785050280), a(958139571, 3318307427), a(1322822218, 3812723403), a(1537002063, 2003034995), a(1747873779, 3602036899), a(1955562222, 1575990012), a(2024104815, 1125592928), a(2227730452, 2716904306), a(2361852424, 442776044), a(2428436474, 593698344), a(2756734187, 3733110249), a(3204031479, 2999351573), a(3329325298, 3815920427), a(3391569614, 3928383900), a(3515267271, 566280711), a(3940187606, 3454069534), a(4118630271, 4000239992), a(116418474, 1914138554), a(174292421, 2731055270), a(289380356, 3203993006), a(460393269, 320620315), a(685471733, 587496836), a(852142971, 1086792851), a(1017036298, 365543100), a(1126000580, 2618297676), a(1288033470, 3409855158), a(1501505948, 4234509866), a(1607167915, 987167468), a(1816402316, 1246189591)], v = [], w = 0; 80 > w; w++) v[w] = a();
  e = e.SHA512 = r.extend({
    _doReset: function () {
      this._hash = new T.init([new d.init(1779033703, 4089235720), new d.init(3144134277, 2227873595), new d.init(1013904242, 4271175723), new d.init(2773480762, 1595750129), new d.init(1359893119, 2917565137), new d.init(2600822924, 725511199), new d.init(528734635, 4215389547), new d.init(1541459225, 327033209)])
    },
    _doProcessBlock: function (a, d) {
      for (var f = this._hash.words,
        F = f[0], e = f[1], n = f[2], r = f[3], G = f[4], H = f[5], I = f[6], f = f[7], w = F.high, J = F.low, X = e.high, K = e.low, Y = n.high, L = n.low, Z = r.high, M = r.low, $ = G.high, N = G.low, aa = H.high, O = H.low, ba = I.high, P = I.low, ca = f.high, Q = f.low, k = w, g = J, z = X, x = K, A = Y, y = L, U = Z, B = M, l = $, h = N, R = aa, C = O, S = ba, D = P, V = ca, E = Q, m = 0; 80 > m; m++) {
        var s = v[m];
        if (16 > m) var j = s.high = a[d + 2 * m] | 0,
          b = s.low = a[d + 2 * m + 1] | 0;
        else {
          var j = v[m - 15],
            b = j.high,
            p = j.low,
            j = (b >>> 1 | p << 31) ^ (b >>> 8 | p << 24) ^ b >>> 7,
            p = (p >>> 1 | b << 31) ^ (p >>> 8 | b << 24) ^ (p >>> 7 | b << 25),
            u = v[m - 2],
            b = u.high,
            c = u.low,
            u = (b >>> 19 | c << 13) ^ (b << 3 | c >>> 29) ^ b >>> 6,
            c = (c >>> 19 | b << 13) ^ (c << 3 | b >>> 29) ^ (c >>> 6 | b << 26),
            b = v[m - 7],
            W = b.high,
            t = v[m - 16],
            q = t.high,
            t = t.low,
            b = p + b.low,
            j = j + W + (b >>> 0 < p >>> 0 ? 1 : 0),
            b = b + c,
            j = j + u + (b >>> 0 < c >>> 0 ? 1 : 0),
            b = b + t,
            j = j + q + (b >>> 0 < t >>> 0 ? 1 : 0);
          s.high = j;
          s.low = b
        }
        var W = l & R ^ ~l & S,
          t = h & C ^ ~h & D,
          s = k & z ^ k & A ^ z & A,
          T = g & x ^ g & y ^ x & y,
          p = (k >>> 28 | g << 4) ^ (k << 30 | g >>> 2) ^ (k << 25 | g >>> 7),
          u = (g >>> 28 | k << 4) ^ (g << 30 | k >>> 2) ^ (g << 25 | k >>> 7),
          c = ea[m],
          fa = c.high,
          da = c.low,
          c = E + ((h >>> 14 | l << 18) ^ (h >>> 18 | l << 14) ^ (h << 23 | l >>> 9)),
          q = V + ((l >>> 14 | h << 18) ^ (l >>> 18 | h << 14) ^ (l << 23 | h >>> 9)) + (c >>> 0 < E >>> 0 ? 1 : 0),
          c = c + t,
          q = q + W + (c >>> 0 < t >>> 0 ? 1 : 0),
          c = c + da,
          q = q + fa + (c >>> 0 < da >>> 0 ? 1 : 0),
          c = c + b,
          q = q + j + (c >>> 0 < b >>> 0 ? 1 : 0),
          b = u + T,
          s = p + s + (b >>> 0 < u >>> 0 ? 1 : 0),
          V = S,
          E = D,
          S = R,
          D = C,
          R = l,
          C = h,
          h = B + c | 0,
          l = U + q + (h >>> 0 < B >>> 0 ? 1 : 0) | 0,
          U = A,
          B = y,
          A = z,
          y = x,
          z = k,
          x = g,
          g = c + b | 0,
          k = q + s + (g >>> 0 < c >>> 0 ? 1 : 0) | 0
      }
      J = F.low = J + g;
      F.high = w + k + (J >>> 0 < g >>> 0 ? 1 : 0);
      K = e.low = K + x;
      e.high = X + z + (K >>> 0 < x >>> 0 ? 1 : 0);
      L = n.low = L + y;
      n.high = Y + A + (L >>> 0 < y >>> 0 ? 1 : 0);
      M = r.low = M + B;
      r.high = Z + U + (M >>> 0 < B >>> 0 ? 1 : 0);
      N = G.low = N + h;
      G.high = $ + l + (N >>> 0 < h >>> 0 ? 1 : 0);
      O = H.low = O + C;
      H.high = aa + R + (O >>> 0 < C >>> 0 ? 1 : 0);
      P = I.low = P + D;
      I.high = ba + S + (P >>> 0 < D >>> 0 ? 1 : 0);
      Q = f.low = Q + E;
      f.high = ca + V + (Q >>> 0 < E >>> 0 ? 1 : 0)
    },
    _doFinalize: function () {
      var a = this._data,
        d = a.words,
        f = 8 * this._nDataBytes,
        e = 8 * a.sigBytes;
      d[e >>> 5] |= 128 << 24 - e % 32;
      d[(e + 128 >>> 10 << 5) + 30] = Math.floor(f / 4294967296);
      d[(e + 128 >>> 10 << 5) + 31] = f;
      a.sigBytes = 4 * d.length;
      this._process();
      return this._hash.toX32()
    },
    clone: function () {
      var a = r.clone.call(this);
      a._hash = this._hash.clone();
      return a
    },
    blockSize: 32
  });
  n.SHA512 = r._createHelper(e);
  n.HmacSHA512 = r._createHmacHelper(e)
})();

(function () {
  var c = CryptoJS,
    a = c.x64,
    b = a.Word,
    e = a.WordArray,
    a = c.algo,
    d = a.SHA512,
    a = a.SHA384 = d.extend({
      _doReset: function () {
        this._hash = new e.init([new b.init(3418070365, 3238371032), new b.init(1654270250, 914150663), new b.init(2438529370, 812702999), new b.init(355462360, 4144912697), new b.init(1731405415, 4290775857), new b.init(2394180231, 1750603025), new b.init(3675008525, 1694076839), new b.init(1203062813, 3204075428)])
      },
      _doFinalize: function () {
        var a = d._doFinalize.call(this);
        a.sigBytes -= 16;
        return a
      }
    });
  c.SHA384 = d._createHelper(a);
  c.HmacSHA384 = d._createHmacHelper(a)
})();

(function () {
  var q = CryptoJS,
    d = q.lib,
    n = d.WordArray,
    p = d.Hasher,
    d = q.algo,
    x = n.create([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8, 3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12, 1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2, 4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13]),
    y = n.create([5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12, 6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2, 15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13, 8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14, 12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11]),
    z = n.create([11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8, 7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12, 11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5, 11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12, 9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6]),
    A = n.create([8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6, 9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11, 9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5, 15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8, 8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11]),
    B = n.create([0, 1518500249, 1859775393, 2400959708, 2840853838]),
    C = n.create([1352829926, 1548603684, 1836072691, 2053994217, 0]),
    d = d.RIPEMD160 = p.extend({
      _doReset: function () {
        this._hash = n.create([1732584193, 4023233417, 2562383102, 271733878, 3285377520])
      },
      _doProcessBlock: function (e, v) {
        for (var b = 0; 16 > b; b++) {
          var c = v + b,
            f = e[c];
          e[c] = (f << 8 | f >>> 24) & 16711935 | (f << 24 | f >>> 8) & 4278255360
        }
        var c = this._hash.words,
          f = B.words,
          d = C.words,
          n = x.words,
          q = y.words,
          p = z.words,
          w = A.words,
          t, g, h, j, r, u, k, l, m, s;
        u = t = c[0];
        k = g = c[1];
        l = h = c[2];
        m = j = c[3];
        s = r = c[4];
        for (var a, b = 0; 80 > b; b += 1) a = t + e[v + n[b]] | 0,
          a = 16 > b ? a + ((g ^ h ^ j) + f[0]) : 32 > b ? a + ((g & h | ~g & j) + f[1]) : 48 > b ? a + (((g | ~h) ^ j) + f[2]) : 64 > b ? a + ((g & j | h & ~j) + f[3]) : a + ((g ^ (h | ~j)) + f[4]),
          a |= 0,
          a = a << p[b] | a >>> 32 - p[b],
          a = a + r | 0,
          t = r,
          r = j,
          j = h << 10 | h >>> 22,
          h = g,
          g = a,
          a = u + e[v + q[b]] | 0,
          a = 16 > b ? a + ((k ^ (l | ~m)) + d[0]) : 32 > b ? a + ((k & m | l & ~m) + d[1]) : 48 > b ? a + (((k | ~l) ^ m) + d[2]) : 64 > b ? a + ((k & l | ~k & m) + d[3]) : a + ((k ^ l ^ m) + d[4]),
          a |= 0,
          a = a << w[b] | a >>> 32 - w[b],
          a = a + s | 0,
          u = s,
          s = m,
          m = l << 10 | l >>> 22,
          l = k,
          k = a;
        a = c[1] + h + m | 0;
        c[1] = c[2] + j + s | 0;
        c[2] = c[3] + r + u | 0;
        c[3] = c[4] + t + k | 0;
        c[4] = c[0] + g + l | 0;
        c[0] = a
      },
      _doFinalize: function () {
        var e = this._data,
          d = e.words,
          b = 8 * this._nDataBytes,
          c = 8 * e.sigBytes;
        d[c >>> 5] |= 128 << 24 - c % 32;
        d[(c + 64 >>> 9 << 4) + 14] = (b << 8 | b >>> 24) & 16711935 | (b << 24 | b >>> 8) & 4278255360;
        e.sigBytes = 4 * (d.length + 1);
        this._process();
        e = this._hash;
        d = e.words;
        for (b = 0; 5 > b; b++) c = d[b],
          d[b] = (c << 8 | c >>> 24) & 16711935 | (c << 24 | c >>> 8) & 4278255360;
        return e
      },
      clone: function () {
        var d = p.clone.call(this);
        d._hash = this._hash.clone();
        return d
      }
    });
  q.RIPEMD160 = p._createHelper(d);
  q.HmacRIPEMD160 = p._createHmacHelper(d)
})(Math);

/*
CryptoJS v3.1.2 hmac.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function () {
  var c = CryptoJS,
    k = c.enc.Utf8;
  c.algo.HMAC = c.lib.Base.extend({
    init: function (a, b) {
      a = this._hasher = new a.init;
      "string" == typeof b && (b = k.parse(b));
      var c = a.blockSize,
        e = 4 * c;
      b.sigBytes > e && (b = a.finalize(b));
      b.clamp();
      for (var f = this._oKey = b.clone(), g = this._iKey = b.clone(), h = f.words, j = g.words, d = 0; d < c; d++) h[d] ^= 1549556828,
        j[d] ^= 909522486;
      f.sigBytes = g.sigBytes = e;
      this.reset()
    },
    reset: function () {
      var a = this._hasher;
      a.reset();
      a.update(this._iKey)
    },
    update: function (a) {
      this._hasher.update(a);
      return this
    },
    finalize: function (a) {
      var b = this._hasher;
      a = b.finalize(a);
      b.reset();
      return b.finalize(this._oKey.clone().concat(a))
    }
  })
})();

/*
CryptoJS v3.1.2 pbkdf2-min.js
code.google.com/p/crypto-js
(c) 2009-2013 by Jeff Mott. All rights reserved.
code.google.com/p/crypto-js/wiki/License
*/
(function () {
  var b = CryptoJS,
    a = b.lib,
    d = a.Base,
    m = a.WordArray,
    a = b.algo,
    q = a.HMAC,
    l = a.PBKDF2 = d.extend({
      cfg: d.extend({
        keySize: 4,
        hasher: a.SHA1,
        iterations: 1
      }),
      init: function (a) {
        this.cfg = this.cfg.extend(a)
      },
      compute: function (a, b) {
        for (var c = this.cfg,
          f = q.create(c.hasher, a), g = m.create(), d = m.create([1]), l = g.words, r = d.words, n = c.keySize, c = c.iterations; l.length < n;) {
          var h = f.update(b).finalize(d);
          f.reset();
          for (var j = h.words,
            s = j.length,
            k = h,
            p = 1; p < c; p++) {
            k = f.finalize(k);
            f.reset();
            for (var t = k.words,
              e = 0; e < s; e++) j[e] ^= t[e]
          }
          g.concat(h);
          r[0]++
        }
        g.sigBytes = 4 * n;
        return g
      }
    });
  b.PBKDF2 = function (a, b, c) {
    return l.create(c).compute(a, b)
  }
})();

/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
var b64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
var b64pad = "=";
function hex2b64(d) {
  var b;
  var e;
  var a = "";
  for (b = 0; b + 3 <= d.length; b += 3) {
    e = parseInt(d.substring(b, b + 3), 16);
    a += b64map.charAt(e >> 6) + b64map.charAt(e & 63)
  }
  if (b + 1 == d.length) {
    e = parseInt(d.substring(b, b + 1), 16);
    a += b64map.charAt(e << 2)
  } else {
    if (b + 2 == d.length) {
      e = parseInt(d.substring(b, b + 2), 16);
      a += b64map.charAt(e >> 2) + b64map.charAt((e & 3) << 4)
    }
  }
  if (b64pad) {
    while ((a.length & 3) > 0) {
      a += b64pad
    }
  }
  return a
}
function b64tohex(f) {
  var d = "";
  var e;
  var b = 0;
  var c;
  var a;
  for (e = 0; e < f.length; ++e) {
    if (f.charAt(e) == b64pad) {
      break
    }
    a = b64map.indexOf(f.charAt(e));
    if (a < 0) {
      continue
    }
    if (b == 0) {
      d += int2char(a >> 2);
      c = a & 3;
      b = 1
    } else {
      if (b == 1) {
        d += int2char((c << 2) | (a >> 4));
        c = a & 15;
        b = 2
      } else {
        if (b == 2) {
          d += int2char(c);
          d += int2char(a >> 2);
          c = a & 3;
          b = 3
        } else {
          d += int2char((c << 2) | (a >> 4));
          d += int2char(a & 15);
          b = 0
        }
      }
    }
  }
  if (b == 1) {
    d += int2char(c << 2)
  }
  return d
}
function b64toBA(e) {
  var d = b64tohex(e);
  var c;
  var b = new Array();
  for (c = 0; 2 * c < d.length; ++c) {
    b[c] = parseInt(d.substring(2 * c, 2 * c + 2), 16)
  }
  return b
};
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
var dbits;
var canary = 244837814094590;
var j_lm = ((canary & 16777215) == 15715070);
function BigInteger(e, d, f) {
  if (e != null) {
    if ("number" == typeof e) {
      this.fromNumber(e, d, f)
    } else {
      if (d == null && "string" != typeof e) {
        this.fromString(e, 256)
      } else {
        this.fromString(e, d)
      }
    }
  }
}
function nbi() {
  return new BigInteger(null)
}
function am1(f, a, b, e, h, g) {
  while (--g >= 0) {
    var d = a * this[f++] + b[e] + h;
    h = Math.floor(d / 67108864);
    b[e++] = d & 67108863
  }
  return h
}
function am2(f, q, r, e, o, a) {
  var k = q & 32767,
    p = q >> 15;
  while (--a >= 0) {
    var d = this[f] & 32767;
    var g = this[f++] >> 15;
    var b = p * d + g * k;
    d = k * d + ((b & 32767) << 15) + r[e] + (o & 1073741823);
    o = (d >>> 30) + (b >>> 15) + p * g + (o >>> 30);
    r[e++] = d & 1073741823
  }
  return o
}
function am3(f, q, r, e, o, a) {
  var k = q & 16383,
    p = q >> 14;
  while (--a >= 0) {
    var d = this[f] & 16383;
    var g = this[f++] >> 14;
    var b = p * d + g * k;
    d = k * d + ((b & 16383) << 14) + r[e] + o;
    o = (d >> 28) + (b >> 14) + p * g;
    r[e++] = d & 268435455
  }
  return o
}
if (j_lm && (navigator2.appName == "Microsoft Internet Explorer")) {
  BigInteger.prototype.am = am2;
  dbits = 30
} else {
  if (j_lm && (navigator2.appName != "Netscape")) {
    BigInteger.prototype.am = am1;
    dbits = 26
  } else {
    BigInteger.prototype.am = am3;
    dbits = 28
  }
}
BigInteger.prototype.DB = dbits;
BigInteger.prototype.DM = ((1 << dbits) - 1);
BigInteger.prototype.DV = (1 << dbits);
var BI_FP = 52;
BigInteger.prototype.FV = Math.pow(2, BI_FP);
BigInteger.prototype.F1 = BI_FP - dbits;
BigInteger.prototype.F2 = 2 * dbits - BI_FP;
var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
var BI_RC = new Array();
var rr, vv;
rr = "0".charCodeAt(0);
for (vv = 0; vv <= 9; ++vv) {
  BI_RC[rr++] = vv
}
rr = "a".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) {
  BI_RC[rr++] = vv
}
rr = "A".charCodeAt(0);
for (vv = 10; vv < 36; ++vv) {
  BI_RC[rr++] = vv
}
function int2char(a) {
  return BI_RM.charAt(a)
}
function intAt(b, a) {
  var d = BI_RC[b.charCodeAt(a)];
  return (d == null) ? -1 : d
}
function bnpCopyTo(b) {
  for (var a = this.t - 1; a >= 0; --a) {
    b[a] = this[a]
  }
  b.t = this.t;
  b.s = this.s
}
function bnpFromInt(a) {
  this.t = 1;
  this.s = (a < 0) ? -1 : 0;
  if (a > 0) {
    this[0] = a
  } else {
    if (a < -1) {
      this[0] = a + this.DV
    } else {
      this.t = 0
    }
  }
}
function nbv(a) {
  var b = nbi();
  b.fromInt(a);
  return b
}
function bnpFromString(h, c) {
  var e;
  if (c == 16) {
    e = 4
  } else {
    if (c == 8) {
      e = 3
    } else {
      if (c == 256) {
        e = 8
      } else {
        if (c == 2) {
          e = 1
        } else {
          if (c == 32) {
            e = 5
          } else {
            if (c == 4) {
              e = 2
            } else {
              this.fromRadix(h, c);
              return
            }
          }
        }
      }
    }
  }
  this.t = 0;
  this.s = 0;
  var g = h.length,
    d = false,
    f = 0;
  while (--g >= 0) {
    var a = (e == 8) ? h[g] & 255 : intAt(h, g);
    if (a < 0) {
      if (h.charAt(g) == "-") {
        d = true
      }
      continue
    }
    d = false;
    if (f == 0) {
      this[this.t++] = a
    } else {
      if (f + e > this.DB) {
        this[this.t - 1] |= (a & ((1 << (this.DB - f)) - 1)) << f;
        this[this.t++] = (a >> (this.DB - f))
      } else {
        this[this.t - 1] |= a << f
      }
    }
    f += e;
    if (f >= this.DB) {
      f -= this.DB
    }
  }
  if (e == 8 && (h[0] & 128) != 0) {
    this.s = -1;
    if (f > 0) {
      this[this.t - 1] |= ((1 << (this.DB - f)) - 1) << f
    }
  }
  this.clamp();
  if (d) {
    BigInteger.ZERO.subTo(this, this)
  }
}
function bnpClamp() {
  var a = this.s & this.DM;
  while (this.t > 0 && this[this.t - 1] == a) {
    --this.t
  }
}
function bnToString(c) {
  if (this.s < 0) {
    return "-" + this.negate().toString(c)
  }
  var e;
  if (c == 16) {
    e = 4
  } else {
    if (c == 8) {
      e = 3
    } else {
      if (c == 2) {
        e = 1
      } else {
        if (c == 32) {
          e = 5
        } else {
          if (c == 4) {
            e = 2
          } else {
            return this.toRadix(c)
          }
        }
      }
    }
  }
  var g = (1 << e) - 1,
    l,
    a = false,
    h = "",
    f = this.t;
  var j = this.DB - (f * this.DB) % e;
  if (f-- > 0) {
    if (j < this.DB && (l = this[f] >> j) > 0) {
      a = true;
      h = int2char(l)
    }
    while (f >= 0) {
      if (j < e) {
        l = (this[f] & ((1 << j) - 1)) << (e - j);
        l |= this[--f] >> (j += this.DB - e)
      } else {
        l = (this[f] >> (j -= e)) & g;
        if (j <= 0) {
          j += this.DB; --f
        }
      }
      if (l > 0) {
        a = true
      }
      if (a) {
        h += int2char(l)
      }
    }
  }
  return a ? h : "0"
}
function bnNegate() {
  var a = nbi();
  BigInteger.ZERO.subTo(this, a);
  return a
}
function bnAbs() {
  return (this.s < 0) ? this.negate() : this
}
function bnCompareTo(b) {
  var d = this.s - b.s;
  if (d != 0) {
    return d
  }
  var c = this.t;
  d = c - b.t;
  if (d != 0) {
    return (this.s < 0) ? -d : d
  }
  while (--c >= 0) {
    if ((d = this[c] - b[c]) != 0) {
      return d
    }
  }
  return 0
}
function nbits(a) {
  var c = 1,
    b;
  if ((b = a >>> 16) != 0) {
    a = b;
    c += 16
  }
  if ((b = a >> 8) != 0) {
    a = b;
    c += 8
  }
  if ((b = a >> 4) != 0) {
    a = b;
    c += 4
  }
  if ((b = a >> 2) != 0) {
    a = b;
    c += 2
  }
  if ((b = a >> 1) != 0) {
    a = b;
    c += 1
  }
  return c
}
function bnBitLength() {
  if (this.t <= 0) {
    return 0
  }
  return this.DB * (this.t - 1) + nbits(this[this.t - 1] ^ (this.s & this.DM))
}
function bnpDLShiftTo(c, b) {
  var a;
  for (a = this.t - 1; a >= 0; --a) {
    b[a + c] = this[a]
  }
  for (a = c - 1; a >= 0; --a) {
    b[a] = 0
  }
  b.t = this.t + c;
  b.s = this.s
}
function bnpDRShiftTo(c, b) {
  for (var a = c; a < this.t; ++a) {
    b[a - c] = this[a]
  }
  b.t = Math.max(this.t - c, 0);
  b.s = this.s
}
function bnpLShiftTo(j, e) {
  var b = j % this.DB;
  var a = this.DB - b;
  var g = (1 << a) - 1;
  var f = Math.floor(j / this.DB),
    h = (this.s << b) & this.DM,
    d;
  for (d = this.t - 1; d >= 0; --d) {
    e[d + f + 1] = (this[d] >> a) | h;
    h = (this[d] & g) << b
  }
  for (d = f - 1; d >= 0; --d) {
    e[d] = 0
  }
  e[f] = h;
  e.t = this.t + f + 1;
  e.s = this.s;
  e.clamp()
}
function bnpRShiftTo(g, d) {
  d.s = this.s;
  var e = Math.floor(g / this.DB);
  if (e >= this.t) {
    d.t = 0;
    return
  }
  var b = g % this.DB;
  var a = this.DB - b;
  var f = (1 << b) - 1;
  d[0] = this[e] >> b;
  for (var c = e + 1; c < this.t; ++c) {
    d[c - e - 1] |= (this[c] & f) << a;
    d[c - e] = this[c] >> b
  }
  if (b > 0) {
    d[this.t - e - 1] |= (this.s & f) << a
  }
  d.t = this.t - e;
  d.clamp()
}
function bnpSubTo(d, f) {
  var e = 0,
    g = 0,
    b = Math.min(d.t, this.t);
  while (e < b) {
    g += this[e] - d[e];
    f[e++] = g & this.DM;
    g >>= this.DB
  }
  if (d.t < this.t) {
    g -= d.s;
    while (e < this.t) {
      g += this[e];
      f[e++] = g & this.DM;
      g >>= this.DB
    }
    g += this.s
  } else {
    g += this.s;
    while (e < d.t) {
      g -= d[e];
      f[e++] = g & this.DM;
      g >>= this.DB
    }
    g -= d.s
  }
  f.s = (g < 0) ? -1 : 0;
  if (g < -1) {
    f[e++] = this.DV + g
  } else {
    if (g > 0) {
      f[e++] = g
    }
  }
  f.t = e;
  f.clamp()
}
function bnpMultiplyTo(c, e) {
  var b = this.abs(),
    f = c.abs();
  var d = b.t;
  e.t = d + f.t;
  while (--d >= 0) {
    e[d] = 0
  }
  for (d = 0; d < f.t; ++d) {
    e[d + b.t] = b.am(0, f[d], e, d, 0, b.t)
  }
  e.s = 0;
  e.clamp();
  if (this.s != c.s) {
    BigInteger.ZERO.subTo(e, e)
  }
}
function bnpSquareTo(d) {
  var a = this.abs();
  var b = d.t = 2 * a.t;
  while (--b >= 0) {
    d[b] = 0
  }
  for (b = 0; b < a.t - 1; ++b) {
    var e = a.am(b, a[b], d, 2 * b, 0, 1);
    if ((d[b + a.t] += a.am(b + 1, 2 * a[b], d, 2 * b + 1, e, a.t - b - 1)) >= a.DV) {
      d[b + a.t] -= a.DV;
      d[b + a.t + 1] = 1
    }
  }
  if (d.t > 0) {
    d[d.t - 1] += a.am(b, a[b], d, 2 * b, 0, 1)
  }
  d.s = 0;
  d.clamp()
}
function bnpDivRemTo(n, h, g) {
  var w = n.abs();
  if (w.t <= 0) {
    return
  }
  var k = this.abs();
  if (k.t < w.t) {
    if (h != null) {
      h.fromInt(0)
    }
    if (g != null) {
      this.copyTo(g)
    }
    return
  }
  if (g == null) {
    g = nbi()
  }
  var d = nbi(),
    a = this.s,
    l = n.s;
  var v = this.DB - nbits(w[w.t - 1]);
  if (v > 0) {
    w.lShiftTo(v, d);
    k.lShiftTo(v, g)
  } else {
    w.copyTo(d);
    k.copyTo(g)
  }
  var p = d.t;
  var b = d[p - 1];
  if (b == 0) {
    return
  }
  var o = b * (1 << this.F1) + ((p > 1) ? d[p - 2] >> this.F2 : 0);
  var A = this.FV / o,
    z = (1 << this.F1) / o,
    x = 1 << this.F2;
  var u = g.t,
    s = u - p,
    f = (h == null) ? nbi() : h;
  d.dlShiftTo(s, f);
  if (g.compareTo(f) >= 0) {
    g[g.t++] = 1;
    g.subTo(f, g)
  }
  BigInteger.ONE.dlShiftTo(p, f);
  f.subTo(d, d);
  while (d.t < p) {
    d[d.t++] = 0
  }
  while (--s >= 0) {
    var c = (g[--u] == b) ? this.DM : Math.floor(g[u] * A + (g[u - 1] + x) * z);
    if ((g[u] += d.am(0, c, g, s, 0, p)) < c) {
      d.dlShiftTo(s, f);
      g.subTo(f, g);
      while (g[u] < --c) {
        g.subTo(f, g)
      }
    }
  }
  if (h != null) {
    g.drShiftTo(p, h);
    if (a != l) {
      BigInteger.ZERO.subTo(h, h)
    }
  }
  g.t = p;
  g.clamp();
  if (v > 0) {
    g.rShiftTo(v, g)
  }
  if (a < 0) {
    BigInteger.ZERO.subTo(g, g)
  }
}
function bnMod(b) {
  var c = nbi();
  this.abs().divRemTo(b, null, c);
  if (this.s < 0 && c.compareTo(BigInteger.ZERO) > 0) {
    b.subTo(c, c)
  }
  return c
}
function Classic(a) {
  this.m = a
}
function cConvert(a) {
  if (a.s < 0 || a.compareTo(this.m) >= 0) {
    return a.mod(this.m)
  } else {
    return a
  }
}
function cRevert(a) {
  return a
}
function cReduce(a) {
  a.divRemTo(this.m, null, a)
}
function cMulTo(a, c, b) {
  a.multiplyTo(c, b);
  this.reduce(b)
}
function cSqrTo(a, b) {
  a.squareTo(b);
  this.reduce(b)
}
Classic.prototype.convert = cConvert;
Classic.prototype.revert = cRevert;
Classic.prototype.reduce = cReduce;
Classic.prototype.mulTo = cMulTo;
Classic.prototype.sqrTo = cSqrTo;
function bnpInvDigit() {
  if (this.t < 1) {
    return 0
  }
  var a = this[0];
  if ((a & 1) == 0) {
    return 0
  }
  var b = a & 3;
  b = (b * (2 - (a & 15) * b)) & 15;
  b = (b * (2 - (a & 255) * b)) & 255;
  b = (b * (2 - (((a & 65535) * b) & 65535))) & 65535;
  b = (b * (2 - a * b % this.DV)) % this.DV;
  return (b > 0) ? this.DV - b : -b
}
function Montgomery(a) {
  this.m = a;
  this.mp = a.invDigit();
  this.mpl = this.mp & 32767;
  this.mph = this.mp >> 15;
  this.um = (1 << (a.DB - 15)) - 1;
  this.mt2 = 2 * a.t
}
function montConvert(a) {
  var b = nbi();
  a.abs().dlShiftTo(this.m.t, b);
  b.divRemTo(this.m, null, b);
  if (a.s < 0 && b.compareTo(BigInteger.ZERO) > 0) {
    this.m.subTo(b, b)
  }
  return b
}
function montRevert(a) {
  var b = nbi();
  a.copyTo(b);
  this.reduce(b);
  return b
}
function montReduce(a) {
  while (a.t <= this.mt2) {
    a[a.t++] = 0
  }
  for (var c = 0; c < this.m.t; ++c) {
    var b = a[c] & 32767;
    var d = (b * this.mpl + (((b * this.mph + (a[c] >> 15) * this.mpl) & this.um) << 15)) & a.DM;
    b = c + this.m.t;
    a[b] += this.m.am(0, d, a, c, 0, this.m.t);
    while (a[b] >= a.DV) {
      a[b] -= a.DV;
      a[++b]++
    }
  }
  a.clamp();
  a.drShiftTo(this.m.t, a);
  if (a.compareTo(this.m) >= 0) {
    a.subTo(this.m, a)
  }
}
function montSqrTo(a, b) {
  a.squareTo(b);
  this.reduce(b)
}
function montMulTo(a, c, b) {
  a.multiplyTo(c, b);
  this.reduce(b)
}
Montgomery.prototype.convert = montConvert;
Montgomery.prototype.revert = montRevert;
Montgomery.prototype.reduce = montReduce;
Montgomery.prototype.mulTo = montMulTo;
Montgomery.prototype.sqrTo = montSqrTo;
function bnpIsEven() {
  return ((this.t > 0) ? (this[0] & 1) : this.s) == 0
}
function bnpExp(h, j) {
  if (h > 4294967295 || h < 1) {
    return BigInteger.ONE
  }
  var f = nbi(),
    a = nbi(),
    d = j.convert(this),
    c = nbits(h) - 1;
  d.copyTo(f);
  while (--c >= 0) {
    j.sqrTo(f, a);
    if ((h & (1 << c)) > 0) {
      j.mulTo(a, d, f)
    } else {
      var b = f;
      f = a;
      a = b
    }
  }
  return j.revert(f)
}
function bnModPowInt(b, a) {
  var c;
  if (b < 256 || a.isEven()) {
    c = new Classic(a)
  } else {
    c = new Montgomery(a)
  }
  return this.exp(b, c)
}
BigInteger.prototype.copyTo = bnpCopyTo;
BigInteger.prototype.fromInt = bnpFromInt;
BigInteger.prototype.fromString = bnpFromString;
BigInteger.prototype.clamp = bnpClamp;
BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
BigInteger.prototype.drShiftTo = bnpDRShiftTo;
BigInteger.prototype.lShiftTo = bnpLShiftTo;
BigInteger.prototype.rShiftTo = bnpRShiftTo;
BigInteger.prototype.subTo = bnpSubTo;
BigInteger.prototype.multiplyTo = bnpMultiplyTo;
BigInteger.prototype.squareTo = bnpSquareTo;
BigInteger.prototype.divRemTo = bnpDivRemTo;
BigInteger.prototype.invDigit = bnpInvDigit;
BigInteger.prototype.isEven = bnpIsEven;
BigInteger.prototype.exp = bnpExp;
BigInteger.prototype.toString = bnToString;
BigInteger.prototype.negate = bnNegate;
BigInteger.prototype.abs = bnAbs;
BigInteger.prototype.compareTo = bnCompareTo;
BigInteger.prototype.bitLength = bnBitLength;
BigInteger.prototype.mod = bnMod;
BigInteger.prototype.modPowInt = bnModPowInt;
BigInteger.ZERO = nbv(0);
BigInteger.ONE = nbv(1);
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function bnClone() {
  var a = nbi();
  this.copyTo(a);
  return a
}
function bnIntValue() {
  if (this.s < 0) {
    if (this.t == 1) {
      return this[0] - this.DV
    } else {
      if (this.t == 0) {
        return - 1
      }
    }
  } else {
    if (this.t == 1) {
      return this[0]
    } else {
      if (this.t == 0) {
        return 0
      }
    }
  }
  return ((this[1] & ((1 << (32 - this.DB)) - 1)) << this.DB) | this[0]
}
function bnByteValue() {
  return (this.t == 0) ? this.s : (this[0] << 24) >> 24
}
function bnShortValue() {
  return (this.t == 0) ? this.s : (this[0] << 16) >> 16
}
function bnpChunkSize(a) {
  return Math.floor(Math.LN2 * this.DB / Math.log(a))
}
function bnSigNum() {
  if (this.s < 0) {
    return - 1
  } else {
    if (this.t <= 0 || (this.t == 1 && this[0] <= 0)) {
      return 0
    } else {
      return 1
    }
  }
}
function bnpToRadix(c) {
  if (c == null) {
    c = 10
  }
  if (this.signum() == 0 || c < 2 || c > 36) {
    return "0"
  }
  var f = this.chunkSize(c);
  var e = Math.pow(c, f);
  var i = nbv(e),
    j = nbi(),
    h = nbi(),
    g = "";
  this.divRemTo(i, j, h);
  while (j.signum() > 0) {
    g = (e + h.intValue()).toString(c).substr(1) + g;
    j.divRemTo(i, j, h)
  }
  return h.intValue().toString(c) + g
}
function bnpFromRadix(m, h) {
  this.fromInt(0);
  if (h == null) {
    h = 10
  }
  var f = this.chunkSize(h);
  var g = Math.pow(h, f),
    e = false,
    a = 0,
    l = 0;
  for (var c = 0; c < m.length; ++c) {
    var k = intAt(m, c);
    if (k < 0) {
      if (m.charAt(c) == "-" && this.signum() == 0) {
        e = true
      }
      continue
    }
    l = h * l + k;
    if (++a >= f) {
      this.dMultiply(g);
      this.dAddOffset(l, 0);
      a = 0;
      l = 0
    }
  }
  if (a > 0) {
    this.dMultiply(Math.pow(h, a));
    this.dAddOffset(l, 0)
  }
  if (e) {
    BigInteger.ZERO.subTo(this, this)
  }
}
function bnpFromNumber(f, e, h) {
  if ("number" == typeof e) {
    if (f < 2) {
      this.fromInt(1)
    } else {
      this.fromNumber(f, h);
      if (!this.testBit(f - 1)) {
        this.bitwiseTo(BigInteger.ONE.shiftLeft(f - 1), op_or, this)
      }
      if (this.isEven()) {
        this.dAddOffset(1, 0)
      }
      while (!this.isProbablePrime(e)) {
        this.dAddOffset(2, 0);
        if (this.bitLength() > f) {
          this.subTo(BigInteger.ONE.shiftLeft(f - 1), this)
        }
      }
    }
  } else {
    var d = new Array(),
      g = f & 7;
    d.length = (f >> 3) + 1;
    e.nextBytes(d);
    if (g > 0) {
      d[0] &= ((1 << g) - 1)
    } else {
      d[0] = 0
    }
    this.fromString(d, 256)
  }
}
function bnToByteArray() {
  var b = this.t,
    c = new Array();
  c[0] = this.s;
  var e = this.DB - (b * this.DB) % 8,
    f,
    a = 0;
  if (b-- > 0) {
    if (e < this.DB && (f = this[b] >> e) != (this.s & this.DM) >> e) {
      c[a++] = f | (this.s << (this.DB - e))
    }
    while (b >= 0) {
      if (e < 8) {
        f = (this[b] & ((1 << e) - 1)) << (8 - e);
        f |= this[--b] >> (e += this.DB - 8)
      } else {
        f = (this[b] >> (e -= 8)) & 255;
        if (e <= 0) {
          e += this.DB; --b
        }
      }
      if ((f & 128) != 0) {
        f |= -256
      }
      if (a == 0 && (this.s & 128) != (f & 128)) {
        ++a
      }
      if (a > 0 || f != this.s) {
        c[a++] = f
      }
    }
  }
  return c
}
function bnEquals(b) {
  return (this.compareTo(b) == 0)
}
function bnMin(b) {
  return (this.compareTo(b) < 0) ? this : b
}
function bnMax(b) {
  return (this.compareTo(b) > 0) ? this : b
}
function bnpBitwiseTo(c, h, e) {
  var d, g, b = Math.min(c.t, this.t);
  for (d = 0; d < b; ++d) {
    e[d] = h(this[d], c[d])
  }
  if (c.t < this.t) {
    g = c.s & this.DM;
    for (d = b; d < this.t; ++d) {
      e[d] = h(this[d], g)
    }
    e.t = this.t
  } else {
    g = this.s & this.DM;
    for (d = b; d < c.t; ++d) {
      e[d] = h(g, c[d])
    }
    e.t = c.t
  }
  e.s = h(this.s, c.s);
  e.clamp()
}
function op_and(a, b) {
  return a & b
}
function bnAnd(b) {
  var c = nbi();
  this.bitwiseTo(b, op_and, c);
  return c
}
function op_or(a, b) {
  return a | b
}
function bnOr(b) {
  var c = nbi();
  this.bitwiseTo(b, op_or, c);
  return c
}
function op_xor(a, b) {
  return a ^ b
}
function bnXor(b) {
  var c = nbi();
  this.bitwiseTo(b, op_xor, c);
  return c
}
function op_andnot(a, b) {
  return a & ~b
}
function bnAndNot(b) {
  var c = nbi();
  this.bitwiseTo(b, op_andnot, c);
  return c
}
function bnNot() {
  var b = nbi();
  for (var a = 0; a < this.t; ++a) {
    b[a] = this.DM & ~this[a]
  }
  b.t = this.t;
  b.s = ~this.s;
  return b
}
function bnShiftLeft(b) {
  var a = nbi();
  if (b < 0) {
    this.rShiftTo(- b, a)
  } else {
    this.lShiftTo(b, a)
  }
  return a
}
function bnShiftRight(b) {
  var a = nbi();
  if (b < 0) {
    this.lShiftTo(- b, a)
  } else {
    this.rShiftTo(b, a)
  }
  return a
}
function lbit(a) {
  if (a == 0) {
    return - 1
  }
  var b = 0;
  if ((a & 65535) == 0) {
    a >>= 16;
    b += 16
  }
  if ((a & 255) == 0) {
    a >>= 8;
    b += 8
  }
  if ((a & 15) == 0) {
    a >>= 4;
    b += 4
  }
  if ((a & 3) == 0) {
    a >>= 2;
    b += 2
  }
  if ((a & 1) == 0) {
    ++b
  }
  return b
}
function bnGetLowestSetBit() {
  for (var a = 0; a < this.t; ++a) {
    if (this[a] != 0) {
      return a * this.DB + lbit(this[a])
    }
  }
  if (this.s < 0) {
    return this.t * this.DB
  }
  return - 1
}
function cbit(a) {
  var b = 0;
  while (a != 0) {
    a &= a - 1; ++b
  }
  return b
}
function bnBitCount() {
  var c = 0,
    a = this.s & this.DM;
  for (var b = 0; b < this.t; ++b) {
    c += cbit(this[b] ^ a)
  }
  return c
}
function bnTestBit(b) {
  var a = Math.floor(b / this.DB);
  if (a >= this.t) {
    return (this.s != 0)
  }
  return ((this[a] & (1 << (b % this.DB))) != 0)
}
function bnpChangeBit(c, b) {
  var a = BigInteger.ONE.shiftLeft(c);
  this.bitwiseTo(a, b, a);
  return a
}
function bnSetBit(a) {
  return this.changeBit(a, op_or)
}
function bnClearBit(a) {
  return this.changeBit(a, op_andnot)
}
function bnFlipBit(a) {
  return this.changeBit(a, op_xor)
}
function bnpAddTo(d, f) {
  var e = 0,
    g = 0,
    b = Math.min(d.t, this.t);
  while (e < b) {
    g += this[e] + d[e];
    f[e++] = g & this.DM;
    g >>= this.DB
  }
  if (d.t < this.t) {
    g += d.s;
    while (e < this.t) {
      g += this[e];
      f[e++] = g & this.DM;
      g >>= this.DB
    }
    g += this.s
  } else {
    g += this.s;
    while (e < d.t) {
      g += d[e];
      f[e++] = g & this.DM;
      g >>= this.DB
    }
    g += d.s
  }
  f.s = (g < 0) ? -1 : 0;
  if (g > 0) {
    f[e++] = g
  } else {
    if (g < -1) {
      f[e++] = this.DV + g
    }
  }
  f.t = e;
  f.clamp()
}
function bnAdd(b) {
  var c = nbi();
  this.addTo(b, c);
  return c
}
function bnSubtract(b) {
  var c = nbi();
  this.subTo(b, c);
  return c
}
function bnMultiply(b) {
  var c = nbi();
  this.multiplyTo(b, c);
  return c
}
function bnSquare() {
  var a = nbi();
  this.squareTo(a);
  return a
}
function bnDivide(b) {
  var c = nbi();
  this.divRemTo(b, c, null);
  return c
}
function bnRemainder(b) {
  var c = nbi();
  this.divRemTo(b, null, c);
  return c
}
function bnDivideAndRemainder(b) {
  var d = nbi(),
    c = nbi();
  this.divRemTo(b, d, c);
  return new Array(d, c)
}
function bnpDMultiply(a) {
  this[this.t] = this.am(0, a - 1, this, 0, 0, this.t); ++this.t;
  this.clamp()
}
function bnpDAddOffset(b, a) {
  if (b == 0) {
    return
  }
  while (this.t <= a) {
    this[this.t++] = 0
  }
  this[a] += b;
  while (this[a] >= this.DV) {
    this[a] -= this.DV;
    if (++a >= this.t) {
      this[this.t++] = 0
    } ++this[a]
  }
}
function NullExp() { }
function nNop(a) {
  return a
}
function nMulTo(a, c, b) {
  a.multiplyTo(c, b)
}
function nSqrTo(a, b) {
  a.squareTo(b)
}
NullExp.prototype.convert = nNop;
NullExp.prototype.revert = nNop;
NullExp.prototype.mulTo = nMulTo;
NullExp.prototype.sqrTo = nSqrTo;
function bnPow(a) {
  return this.exp(a, new NullExp())
}
function bnpMultiplyLowerTo(b, f, e) {
  var d = Math.min(this.t + b.t, f);
  e.s = 0;
  e.t = d;
  while (d > 0) {
    e[--d] = 0
  }
  var c;
  for (c = e.t - this.t; d < c; ++d) {
    e[d + this.t] = this.am(0, b[d], e, d, 0, this.t)
  }
  for (c = Math.min(b.t, f); d < c; ++d) {
    this.am(0, b[d], e, d, 0, f - d)
  }
  e.clamp()
}
function bnpMultiplyUpperTo(b, e, d) {
  --e;
  var c = d.t = this.t + b.t - e;
  d.s = 0;
  while (--c >= 0) {
    d[c] = 0
  }
  for (c = Math.max(e - this.t, 0); c < b.t; ++c) {
    d[this.t + c - e] = this.am(e - c, b[c], d, 0, 0, this.t + c - e)
  }
  d.clamp();
  d.drShiftTo(1, d)
}
function Barrett(a) {
  this.r2 = nbi();
  this.q3 = nbi();
  BigInteger.ONE.dlShiftTo(2 * a.t, this.r2);
  this.mu = this.r2.divide(a);
  this.m = a
}
function barrettConvert(a) {
  if (a.s < 0 || a.t > 2 * this.m.t) {
    return a.mod(this.m)
  } else {
    if (a.compareTo(this.m) < 0) {
      return a
    } else {
      var b = nbi();
      a.copyTo(b);
      this.reduce(b);
      return b
    }
  }
}
function barrettRevert(a) {
  return a
}
function barrettReduce(a) {
  a.drShiftTo(this.m.t - 1, this.r2);
  if (a.t > this.m.t + 1) {
    a.t = this.m.t + 1;
    a.clamp()
  }
  this.mu.multiplyUpperTo(this.r2, this.m.t + 1, this.q3);
  this.m.multiplyLowerTo(this.q3, this.m.t + 1, this.r2);
  while (a.compareTo(this.r2) < 0) {
    a.dAddOffset(1, this.m.t + 1)
  }
  a.subTo(this.r2, a);
  while (a.compareTo(this.m) >= 0) {
    a.subTo(this.m, a)
  }
}
function barrettSqrTo(a, b) {
  a.squareTo(b);
  this.reduce(b)
}
function barrettMulTo(a, c, b) {
  a.multiplyTo(c, b);
  this.reduce(b)
}
Barrett.prototype.convert = barrettConvert;
Barrett.prototype.revert = barrettRevert;
Barrett.prototype.reduce = barrettReduce;
Barrett.prototype.mulTo = barrettMulTo;
Barrett.prototype.sqrTo = barrettSqrTo;
function bnModPow(q, f) {
  var o = q.bitLength(),
    h,
    b = nbv(1),
    v;
  if (o <= 0) {
    return b
  } else {
    if (o < 18) {
      h = 1
    } else {
      if (o < 48) {
        h = 3
      } else {
        if (o < 144) {
          h = 4
        } else {
          if (o < 768) {
            h = 5
          } else {
            h = 6
          }
        }
      }
    }
  }
  if (o < 8) {
    v = new Classic(f)
  } else {
    if (f.isEven()) {
      v = new Barrett(f)
    } else {
      v = new Montgomery(f)
    }
  }
  var p = new Array(),
    d = 3,
    s = h - 1,
    a = (1 << h) - 1;
  p[1] = v.convert(this);
  if (h > 1) {
    var A = nbi();
    v.sqrTo(p[1], A);
    while (d <= a) {
      p[d] = nbi();
      v.mulTo(A, p[d - 2], p[d]);
      d += 2
    }
  }
  var l = q.t - 1,
    x, u = true,
    c = nbi(),
    y;
  o = nbits(q[l]) - 1;
  while (l >= 0) {
    if (o >= s) {
      x = (q[l] >> (o - s)) & a
    } else {
      x = (q[l] & ((1 << (o + 1)) - 1)) << (s - o);
      if (l > 0) {
        x |= q[l - 1] >> (this.DB + o - s)
      }
    }
    d = h;
    while ((x & 1) == 0) {
      x >>= 1; --d
    }
    if ((o -= d) < 0) {
      o += this.DB; --l
    }
    if (u) {
      p[x].copyTo(b);
      u = false
    } else {
      while (d > 1) {
        v.sqrTo(b, c);
        v.sqrTo(c, b);
        d -= 2
      }
      if (d > 0) {
        v.sqrTo(b, c)
      } else {
        y = b;
        b = c;
        c = y
      }
      v.mulTo(c, p[x], b)
    }
    while (l >= 0 && (q[l] & (1 << o)) == 0) {
      v.sqrTo(b, c);
      y = b;
      b = c;
      c = y;
      if (--o < 0) {
        o = this.DB - 1; --l
      }
    }
  }
  return v.revert(b)
}
function bnGCD(c) {
  var b = (this.s < 0) ? this.negate() : this.clone();
  var h = (c.s < 0) ? c.negate() : c.clone();
  if (b.compareTo(h) < 0) {
    var e = b;
    b = h;
    h = e
  }
  var d = b.getLowestSetBit(),
    f = h.getLowestSetBit();
  if (f < 0) {
    return b
  }
  if (d < f) {
    f = d
  }
  if (f > 0) {
    b.rShiftTo(f, b);
    h.rShiftTo(f, h)
  }
  while (b.signum() > 0) {
    if ((d = b.getLowestSetBit()) > 0) {
      b.rShiftTo(d, b)
    }
    if ((d = h.getLowestSetBit()) > 0) {
      h.rShiftTo(d, h)
    }
    if (b.compareTo(h) >= 0) {
      b.subTo(h, b);
      b.rShiftTo(1, b)
    } else {
      h.subTo(b, h);
      h.rShiftTo(1, h)
    }
  }
  if (f > 0) {
    h.lShiftTo(f, h)
  }
  return h
}
function bnpModInt(e) {
  if (e <= 0) {
    return 0
  }
  var c = this.DV % e,
    b = (this.s < 0) ? e - 1 : 0;
  if (this.t > 0) {
    if (c == 0) {
      b = this[0] % e
    } else {
      for (var a = this.t - 1; a >= 0; --a) {
        b = (c * b + this[a]) % e
      }
    }
  }
  return b
}
function bnModInverse(f) {
  var j = f.isEven();
  if ((this.isEven() && j) || f.signum() == 0) {
    return BigInteger.ZERO
  }
  var i = f.clone(),
    h = this.clone();
  var g = nbv(1),
    e = nbv(0),
    l = nbv(0),
    k = nbv(1);
  while (i.signum() != 0) {
    while (i.isEven()) {
      i.rShiftTo(1, i);
      if (j) {
        if (!g.isEven() || !e.isEven()) {
          g.addTo(this, g);
          e.subTo(f, e)
        }
        g.rShiftTo(1, g)
      } else {
        if (!e.isEven()) {
          e.subTo(f, e)
        }
      }
      e.rShiftTo(1, e)
    }
    while (h.isEven()) {
      h.rShiftTo(1, h);
      if (j) {
        if (!l.isEven() || !k.isEven()) {
          l.addTo(this, l);
          k.subTo(f, k)
        }
        l.rShiftTo(1, l)
      } else {
        if (!k.isEven()) {
          k.subTo(f, k)
        }
      }
      k.rShiftTo(1, k)
    }
    if (i.compareTo(h) >= 0) {
      i.subTo(h, i);
      if (j) {
        g.subTo(l, g)
      }
      e.subTo(k, e)
    } else {
      h.subTo(i, h);
      if (j) {
        l.subTo(g, l)
      }
      k.subTo(e, k)
    }
  }
  if (h.compareTo(BigInteger.ONE) != 0) {
    return BigInteger.ZERO
  }
  if (k.compareTo(f) >= 0) {
    return k.subtract(f)
  }
  if (k.signum() < 0) {
    k.addTo(f, k)
  } else {
    return k
  }
  if (k.signum() < 0) {
    return k.add(f)
  } else {
    return k
  }
}
var lowprimes = [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, 997];
var lplim = (1 << 26) / lowprimes[lowprimes.length - 1];
function bnIsProbablePrime(e) {
  var d, b = this.abs();
  if (b.t == 1 && b[0] <= lowprimes[lowprimes.length - 1]) {
    for (d = 0; d < lowprimes.length; ++d) {
      if (b[0] == lowprimes[d]) {
        return true
      }
    }
    return false
  }
  if (b.isEven()) {
    return false
  }
  d = 1;
  while (d < lowprimes.length) {
    var a = lowprimes[d],
      c = d + 1;
    while (c < lowprimes.length && a < lplim) {
      a *= lowprimes[c++]
    }
    a = b.modInt(a);
    while (d < c) {
      if (a % lowprimes[d++] == 0) {
        return false
      }
    }
  }
  return b.millerRabin(e)
}
function bnpMillerRabin(f) {
  var g = this.subtract(BigInteger.ONE);
  var c = g.getLowestSetBit();
  if (c <= 0) {
    return false
  }
  var h = g.shiftRight(c);
  f = (f + 1) >> 1;
  if (f > lowprimes.length) {
    f = lowprimes.length
  }
  var b = nbi();
  for (var e = 0; e < f; ++e) {
    b.fromInt(lowprimes[Math.floor(Math.random() * lowprimes.length)]);
    var l = b.modPow(h, this);
    if (l.compareTo(BigInteger.ONE) != 0 && l.compareTo(g) != 0) {
      var d = 1;
      while (d++ < c && l.compareTo(g) != 0) {
        l = l.modPowInt(2, this);
        if (l.compareTo(BigInteger.ONE) == 0) {
          return false
        }
      }
      if (l.compareTo(g) != 0) {
        return false
      }
    }
  }
  return true
}
BigInteger.prototype.chunkSize = bnpChunkSize;
BigInteger.prototype.toRadix = bnpToRadix;
BigInteger.prototype.fromRadix = bnpFromRadix;
BigInteger.prototype.fromNumber = bnpFromNumber;
BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
BigInteger.prototype.changeBit = bnpChangeBit;
BigInteger.prototype.addTo = bnpAddTo;
BigInteger.prototype.dMultiply = bnpDMultiply;
BigInteger.prototype.dAddOffset = bnpDAddOffset;
BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
BigInteger.prototype.modInt = bnpModInt;
BigInteger.prototype.millerRabin = bnpMillerRabin;
BigInteger.prototype.clone = bnClone;
BigInteger.prototype.intValue = bnIntValue;
BigInteger.prototype.byteValue = bnByteValue;
BigInteger.prototype.shortValue = bnShortValue;
BigInteger.prototype.signum = bnSigNum;
BigInteger.prototype.toByteArray = bnToByteArray;
BigInteger.prototype.equals = bnEquals;
BigInteger.prototype.min = bnMin;
BigInteger.prototype.max = bnMax;
BigInteger.prototype.and = bnAnd;
BigInteger.prototype.or = bnOr;
BigInteger.prototype.xor = bnXor;
BigInteger.prototype.andNot = bnAndNot;
BigInteger.prototype.not = bnNot;
BigInteger.prototype.shiftLeft = bnShiftLeft;
BigInteger.prototype.shiftRight = bnShiftRight;
BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
BigInteger.prototype.bitCount = bnBitCount;
BigInteger.prototype.testBit = bnTestBit;
BigInteger.prototype.setBit = bnSetBit;
BigInteger.prototype.clearBit = bnClearBit;
BigInteger.prototype.flipBit = bnFlipBit;
BigInteger.prototype.add = bnAdd;
BigInteger.prototype.subtract = bnSubtract;
BigInteger.prototype.multiply = bnMultiply;
BigInteger.prototype.divide = bnDivide;
BigInteger.prototype.remainder = bnRemainder;
BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
BigInteger.prototype.modPow = bnModPow;
BigInteger.prototype.modInverse = bnModInverse;
BigInteger.prototype.pow = bnPow;
BigInteger.prototype.gcd = bnGCD;
BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
BigInteger.prototype.square = bnSquare;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function Arcfour() {
  this.i = 0;
  this.j = 0;
  this.S = new Array()
}
function ARC4init(d) {
  var c, a, b;
  for (c = 0; c < 256; ++c) {
    this.S[c] = c
  }
  a = 0;
  for (c = 0; c < 256; ++c) {
    a = (a + this.S[c] + d[c % d.length]) & 255;
    b = this.S[c];
    this.S[c] = this.S[a];
    this.S[a] = b
  }
  this.i = 0;
  this.j = 0
}
function ARC4next() {
  var a;
  this.i = (this.i + 1) & 255;
  this.j = (this.j + this.S[this.i]) & 255;
  a = this.S[this.i];
  this.S[this.i] = this.S[this.j];
  this.S[this.j] = a;
  return this.S[(a + this.S[this.i]) & 255]
}
Arcfour.prototype.init = ARC4init;
Arcfour.prototype.next = ARC4next;
function prng_newstate() {
  return new Arcfour()
}
var rng_psize = 256;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
var rng_state;
var rng_pool;
var rng_pptr;
function rng_seed_int(a) {
  rng_pool[rng_pptr++] ^= a & 255;
  rng_pool[rng_pptr++] ^= (a >> 8) & 255;
  rng_pool[rng_pptr++] ^= (a >> 16) & 255;
  rng_pool[rng_pptr++] ^= (a >> 24) & 255;
  if (rng_pptr >= rng_psize) {
    rng_pptr -= rng_psize
  }
}
function rng_seed_time() {
  rng_seed_int(new Date().getTime())
}
if (rng_pool == null) {
  rng_pool = new Array();
  rng_pptr = 0;
  var t;
  if (window2.crypto && window2.crypto.getRandomValues) {
    var ua = new Uint8Array(32);
    window2.crypto.getRandomValues(ua);
    for (t = 0; t < 32; ++t) {
      rng_pool[rng_pptr++] = ua[t]
    }
  }
  if (navigator2.appName == "Netscape" && navigator2.appVersion < "5" && window2.crypto && window2.crypto.random) {
    var z = window2.crypto.random(32);
    for (t = 0; t < z.length; ++t) {
      rng_pool[rng_pptr++] = z.charCodeAt(t) & 255
    }
  }
  while (rng_pptr < rng_psize) {
    t = Math.floor(65536 * Math.random());
    rng_pool[rng_pptr++] = t >>> 8;
    rng_pool[rng_pptr++] = t & 255
  }
  rng_pptr = 0;
  rng_seed_time()
}
function rng_get_byte() {
  if (rng_state == null) {
    rng_seed_time();
    rng_state = prng_newstate();
    rng_state.init(rng_pool);
    for (rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr) {
      rng_pool[rng_pptr] = 0
    }
    rng_pptr = 0
  }
  return rng_state.next()
}
function rng_get_bytes(b) {
  var a;
  for (a = 0; a < b.length; ++a) {
    b[a] = rng_get_byte()
  }
}
function SecureRandom() { }
SecureRandom.prototype.nextBytes = rng_get_bytes;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function parseBigInt(b, a) {
  return new BigInteger(b, a)
}
function linebrk(c, d) {
  var a = "";
  var b = 0;
  while (b + d < c.length) {
    a += c.substring(b, b + d) + "\n";
    b += d
  }
  return a + c.substring(b, c.length)
}
function byte2Hex(a) {
  if (a < 16) {
    return "0" + a.toString(16)
  } else {
    return a.toString(16)
  }
}
function pkcs1pad2(e, h) {
  if (h < e.length + 11) {
    console.log("Message too long for RSA")
    return null
  }
  var g = new Array();
  var d = e.length - 1;
  while (d >= 0 && h > 0) {
    var f = e.charCodeAt(d--);
    if (f < 128) {
      g[--h] = f
    } else {
      if ((f > 127) && (f < 2048)) {
        g[--h] = (f & 63) | 128;
        g[--h] = (f >> 6) | 192
      } else {
        g[--h] = (f & 63) | 128;
        g[--h] = ((f >> 6) & 63) | 128;
        g[--h] = (f >> 12) | 224
      }
    }
  }
  g[--h] = 0;
  var b = new SecureRandom();
  var a = new Array();
  while (h > 2) {
    a[0] = 0;
    while (a[0] == 0) {
      b.nextBytes(a)
    }
    g[--h] = a[0]
  }
  g[--h] = 2;
  g[--h] = 0;
  return new BigInteger(g)
}
function oaep_mgf1_arr(c, a, e) {
  var b = "",
    d = 0;
  while (b.length < a) {
    b += e(String.fromCharCode.apply(String, c.concat([(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255])));
    d += 1
  }
  return b
}
function oaep_pad(q, a, f, l) {
  var c = KJUR.crypto.MessageDigest;
  var o = KJUR.crypto.Util;
  var b = null;
  if (!f) {
    f = "sha1"
  }
  if (typeof f === "string") {
    b = c.getCanonicalAlgName(f);
    l = c.getHashLength(b);
    f = function (i) {
      return hextorstr(o.hashString(i, b))
    }
  }
  if (q.length + 2 * l + 2 > a) {
    throw "Message too long for RSA"
  }
  var k = "",
    e;
  for (e = 0; e < a - q.length - 2 * l - 2; e += 1) {
    k += "\x00"
  }
  var h = f("") + k + "\x01" + q;
  var g = new Array(l);
  new SecureRandom().nextBytes(g);
  var j = oaep_mgf1_arr(g, h.length, f);
  var p = [];
  for (e = 0; e < h.length; e += 1) {
    p[e] = h.charCodeAt(e) ^ j.charCodeAt(e)
  }
  var m = oaep_mgf1_arr(p, g.length, f);
  var d = [0];
  for (e = 0; e < g.length; e += 1) {
    d[e + 1] = g[e] ^ m.charCodeAt(e)
  }
  return new BigInteger(d.concat(p))
}
function RSAKey() {
  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 RSASetPublic(b, a) {
  this.isPublic = true;
  this.isPrivate = false;
  if (typeof b !== "string") {
    this.n = b;
    this.e = a
  } else {
    if (b != null && a != null && b.length > 0 && a.length > 0) {
      this.n = parseBigInt(b, 16);
      this.e = parseInt(a, 16)
    } else {
      throw "Invalid RSA public key"
    }
  }
}
function RSADoPublic(a) {
  return a.modPowInt(this.e, this.n)
}
function RSAEncrypt(d) {
  var a = pkcs1pad2(d, (this.n.bitLength() + 7) >> 3);
  if (a == null) {
    return null
  }
  var e = this.doPublic(a);
  if (e == null) {
    return null
  }
  var b = e.toString(16);
  if ((b.length & 1) == 0) {
    return b
  } else {
    return "0" + b
  }
}
function RSAEncryptOAEP(f, e, b) {
  var a = oaep_pad(f, (this.n.bitLength() + 7) >> 3, e, b);
  if (a == null) {
    return null
  }
  var g = this.doPublic(a);
  if (g == null) {
    return null
  }
  var d = g.toString(16);
  if ((d.length & 1) == 0) {
    return d
  } else {
    return "0" + d
  }
}
RSAKey.prototype.doPublic = RSADoPublic;
RSAKey.prototype.setPublic = RSASetPublic;
RSAKey.prototype.encrypt = RSAEncrypt;
RSAKey.prototype.encryptOAEP = RSAEncryptOAEP;
RSAKey.prototype.type = "RSA";
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function pkcs1unpad2(g, j) {
  var a = g.toByteArray();
  var f = 0;
  while (f < a.length && a[f] == 0) {
    ++f
  }
  if (a.length - f != j - 1 || a[f] != 2) {
    return null
  } ++f;
  while (a[f] != 0) {
    if (++f >= a.length) {
      return null
    }
  }
  var e = "";
  while (++f < a.length) {
    var h = a[f] & 255;
    if (h < 128) {
      e += String.fromCharCode(h)
    } else {
      if ((h > 191) && (h < 224)) {
        e += String.fromCharCode(((h & 31) << 6) | (a[f + 1] & 63)); ++f
      } else {
        e += String.fromCharCode(((h & 15) << 12) | ((a[f + 1] & 63) << 6) | (a[f + 2] & 63));
        f += 2
      }
    }
  }
  return e
}
function oaep_mgf1_str(c, a, e) {
  var b = "",
    d = 0;
  while (b.length < a) {
    b += e(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]));
    d += 1
  }
  return b
}
function oaep_unpad(o, b, g, p) {
  var e = KJUR.crypto.MessageDigest;
  var r = KJUR.crypto.Util;
  var c = null;
  if (!g) {
    g = "sha1"
  }
  if (typeof g === "string") {
    c = e.getCanonicalAlgName(g);
    p = e.getHashLength(c);
    g = function (d) {
      return hextorstr(r.hashString(d, c))
    }
  }
  o = o.toByteArray();
  var h;
  for (h = 0; h < o.length; h += 1) {
    o[h] &= 255
  }
  while (o.length < b) {
    o.unshift(0)
  }
  o = String.fromCharCode.apply(String, o);
  if (o.length < 2 * p + 2) {
    throw "Cipher too short"
  }
  var f = o.substr(1, p);
  var s = o.substr(p + 1);
  var q = oaep_mgf1_str(s, p, g);
  var k = [],
    h;
  for (h = 0; h < f.length; h += 1) {
    k[h] = f.charCodeAt(h) ^ q.charCodeAt(h)
  }
  var l = oaep_mgf1_str(String.fromCharCode.apply(String, k), o.length - p, g);
  var j = [];
  for (h = 0; h < s.length; h += 1) {
    j[h] = s.charCodeAt(h) ^ l.charCodeAt(h)
  }
  j = String.fromCharCode.apply(String, j);
  if (j.substr(0, p) !== g("")) {
    throw "Hash mismatch"
  }
  j = j.substr(p);
  var a = j.indexOf("\x01");
  var m = (a != -1) ? j.substr(0, a).lastIndexOf("\x00") : -1;
  if (m + 1 != a) {
    throw "Malformed data"
  }
  return j.substr(a + 1)
}
function RSASetPrivate(c, a, b) {
  this.isPrivate = true;
  if (typeof c !== "string") {
    this.n = c;
    this.e = a;
    this.d = b
  } else {
    if (c != null && a != null && c.length > 0 && a.length > 0) {
      this.n = parseBigInt(c, 16);
      this.e = parseInt(a, 16);
      this.d = parseBigInt(b, 16)
    } else {
      alert("Invalid RSA private key")
    }
  }
}
function RSASetPrivateEx(g, d, e, c, b, a, h, f) {
  this.isPrivate = true;
  this.isPublic = false;
  if (g == null) {
    throw "RSASetPrivateEx N == null"
  }
  if (d == null) {
    throw "RSASetPrivateEx E == null"
  }
  if (g.length == 0) {
    throw "RSASetPrivateEx N.length == 0"
  }
  if (d.length == 0) {
    throw "RSASetPrivateEx E.length == 0"
  }
  if (g != null && d != null && g.length > 0 && d.length > 0) {
    this.n = parseBigInt(g, 16);
    this.e = parseInt(d, 16);
    this.d = parseBigInt(e, 16);
    this.p = parseBigInt(c, 16);
    this.q = parseBigInt(b, 16);
    this.dmp1 = parseBigInt(a, 16);
    this.dmq1 = parseBigInt(h, 16);
    this.coeff = parseBigInt(f, 16)
  } else {
    alert("Invalid RSA private key in RSASetPrivateEx")
  }
}
function RSAGenerate(b, i) {
  var a = new SecureRandom();
  var f = b >> 1;
  this.e = parseInt(i, 16);
  var c = new BigInteger(i, 16);
  for (; ;) {
    for (; ;) {
      this.p = new BigInteger(b - f, 1, a);
      if (this.p.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) {
        break
      }
    }
    for (; ;) {
      this.q = new BigInteger(f, 1, a);
      if (this.q.subtract(BigInteger.ONE).gcd(c).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) {
        break
      }
    }
    if (this.p.compareTo(this.q) <= 0) {
      var h = this.p;
      this.p = this.q;
      this.q = h
    }
    var g = this.p.subtract(BigInteger.ONE);
    var d = this.q.subtract(BigInteger.ONE);
    var e = g.multiply(d);
    if (e.gcd(c).compareTo(BigInteger.ONE) == 0) {
      this.n = this.p.multiply(this.q);
      this.d = c.modInverse(e);
      this.dmp1 = this.d.mod(g);
      this.dmq1 = this.d.mod(d);
      this.coeff = this.q.modInverse(this.p);
      break
    }
  }
  this.isPrivate = true
}
function RSADoPrivate(a) {
  if (this.p == null || this.q == null) {
    return a.modPow(this.d, this.n)
  }
  var c = a.mod(this.p).modPow(this.dmp1, this.p);
  var b = a.mod(this.q).modPow(this.dmq1, this.q);
  while (c.compareTo(b) < 0) {
    c = c.add(this.p)
  }
  return c.subtract(b).multiply(this.coeff).mod(this.p).multiply(this.q).add(b)
}
function RSADecrypt(b) {
  var d = parseBigInt(b, 16);
  var a = this.doPrivate(d);
  if (a == null) {
    return null
  }
  return pkcs1unpad2(a, (this.n.bitLength() + 7) >> 3)
}
function RSADecryptOAEP(e, d, b) {
  var f = parseBigInt(e, 16);
  var a = this.doPrivate(f);
  if (a == null) {
    return null
  }
  return oaep_unpad(a, (this.n.bitLength() + 7) >> 3, d, b)
}
RSAKey.prototype.doPrivate = RSADoPrivate;
RSAKey.prototype.setPrivate = RSASetPrivate;
RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
RSAKey.prototype.generate = RSAGenerate;
RSAKey.prototype.decrypt = RSADecrypt;
RSAKey.prototype.decryptOAEP = RSADecryptOAEP;
/*! (c) Tom Wu | http://www-cs-students.stanford.edu/~tjw/jsbn/
 */
function ECFieldElementFp(b, a) {
  this.x = a;
  this.q = b
}
function feFpEquals(a) {
  if (a == this) {
    return true
  }
  return (this.q.equals(a.q) && this.x.equals(a.x))
}
function feFpToBigInteger() {
  return this.x
}
function feFpNegate() {
  return new ECFieldElementFp(this.q, this.x.negate().mod(this.q))
}
function feFpAdd(a) {
  return new ECFieldElementFp(this.q, this.x.add(a.toBigInteger()).mod(this.q))
}
function feFpSubtract(a) {
  return new ECFieldElementFp(this.q, this.x.subtract(a.toBigInteger()).mod(this.q))
}
function feFpMultiply(a) {
  return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger()).mod(this.q))
}
function feFpSquare() {
  return new ECFieldElementFp(this.q, this.x.square().mod(this.q))
}
function feFpDivide(a) {
  return new ECFieldElementFp(this.q, this.x.multiply(a.toBigInteger().modInverse(this.q)).mod(this.q))
}
ECFieldElementFp.prototype.equals = feFpEquals;
ECFieldElementFp.prototype.toBigInteger = feFpToBigInteger;
ECFieldElementFp.prototype.negate = feFpNegate;
ECFieldElementFp.prototype.add = feFpAdd;
ECFieldElementFp.prototype.subtract = feFpSubtract;
ECFieldElementFp.prototype.multiply = feFpMultiply;
ECFieldElementFp.prototype.square = feFpSquare;
ECFieldElementFp.prototype.divide = feFpDivide;
function ECPointFp(c, a, d, b) {
  this.curve = c;
  this.x = a;
  this.y = d;
  if (b == null) {
    this.z = BigInteger.ONE
  } else {
    this.z = b
  }
  this.zinv = null
}
function pointFpGetX() {
  if (this.zinv == null) {
    this.zinv = this.z.modInverse(this.curve.q)
  }
  return this.curve.fromBigInteger(this.x.toBigInteger().multiply(this.zinv).mod(this.curve.q))
}
function pointFpGetY() {
  if (this.zinv == null) {
    this.zinv = this.z.modInverse(this.curve.q)
  }
  return this.curve.fromBigInteger(this.y.toBigInteger().multiply(this.zinv).mod(this.curve.q))
}
function pointFpEquals(a) {
  if (a == this) {
    return true
  }
  if (this.isInfinity()) {
    return a.isInfinity()
  }
  if (a.isInfinity()) {
    return this.isInfinity()
  }
  var c, b;
  c = a.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(a.z)).mod(this.curve.q);
  if (!c.equals(BigInteger.ZERO)) {
    return false
  }
  b = a.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(a.z)).mod(this.curve.q);
  return b.equals(BigInteger.ZERO)
}
function pointFpIsInfinity() {
  if ((this.x == null) && (this.y == null)) {
    return true
  }
  return this.z.equals(BigInteger.ZERO) && !this.y.toBigInteger().equals(BigInteger.ZERO)
}
function pointFpNegate() {
  return new ECPointFp(this.curve, this.x, this.y.negate(), this.z)
}
function pointFpAdd(l) {
  if (this.isInfinity()) {
    return l
  }
  if (l.isInfinity()) {
    return this
  }
  var p = l.y.toBigInteger().multiply(this.z).subtract(this.y.toBigInteger().multiply(l.z)).mod(this.curve.q);
  var o = l.x.toBigInteger().multiply(this.z).subtract(this.x.toBigInteger().multiply(l.z)).mod(this.curve.q);
  if (BigInteger.ZERO.equals(o)) {
    if (BigInteger.ZERO.equals(p)) {
      return this.twice()
    }
    return this.curve.getInfinity()
  }
  var j = new BigInteger("3");
  var e = this.x.toBigInteger();
  var n = this.y.toBigInteger();
  var c = l.x.toBigInteger();
  var k = l.y.toBigInteger();
  var m = o.square();
  var i = m.multiply(o);
  var d = e.multiply(m);
  var g = p.square().multiply(this.z);
  var a = g.subtract(d.shiftLeft(1)).multiply(l.z).subtract(i).multiply(o).mod(this.curve.q);
  var h = d.multiply(j).multiply(p).subtract(n.multiply(i)).subtract(g.multiply(p)).multiply(l.z).add(p.multiply(i)).mod(this.curve.q);
  var f = i.multiply(this.z).multiply(l.z).mod(this.curve.q);
  return new ECPointFp(this.curve, this.curve.fromBigInteger(a), this.curve.fromBigInteger(h), f)
}
function pointFpTwice() {
  if (this.isInfinity()) {
    return this
  }
  if (this.y.toBigInteger().signum() == 0) {
    return this.curve.getInfinity()
  }
  var g = new BigInteger("3");
  var c = this.x.toBigInteger();
  var h = this.y.toBigInteger();
  var e = h.multiply(this.z);
  var j = e.multiply(h).mod(this.curve.q);
  var i = this.curve.a.toBigInteger();
  var k = c.square().multiply(g);
  if (!BigInteger.ZERO.equals(i)) {
    k = k.add(this.z.square().multiply(i))
  }
  k = k.mod(this.curve.q);
  var b = k.square().subtract(c.shiftLeft(3).multiply(j)).shiftLeft(1).multiply(e).mod(this.curve.q);
  var f = k.multiply(g).multiply(c).subtract(j.shiftLeft(1)).shiftLeft(2).multiply(j).subtract(k.square().multiply(k)).mod(this.curve.q);
  var d = e.square().multiply(e).shiftLeft(3).mod(this.curve.q);
  return new ECPointFp(this.curve, this.curve.fromBigInteger(b), this.curve.fromBigInteger(f), d)
}
function pointFpMultiply(b) {
  if (this.isInfinity()) {
    return this
  }
  if (b.signum() == 0) {
    return this.curve.getInfinity()
  }
  var g = b;
  var f = g.multiply(new BigInteger("3"));
  var l = this.negate();
  var d = this;
  var c;
  for (c = f.bitLength() - 2; c > 0; --c) {
    d = d.twice();
    var a = f.testBit(c);
    var j = g.testBit(c);
    if (a != j) {
      d = d.add(a ? this : l)
    }
  }
  return d
}
function pointFpMultiplyTwo(c, a, b) {
  var d;
  if (c.bitLength() > b.bitLength()) {
    d = c.bitLength() - 1
  } else {
    d = b.bitLength() - 1
  }
  var f = this.curve.getInfinity();
  var e = this.add(a);
  while (d >= 0) {
    f = f.twice();
    if (c.testBit(d)) {
      if (b.testBit(d)) {
        f = f.add(e)
      } else {
        f = f.add(this)
      }
    } else {
      if (b.testBit(d)) {
        f = f.add(a)
      }
    } --d
  }
  return f
}
ECPointFp.prototype.getX = pointFpGetX;
ECPointFp.prototype.getY = pointFpGetY;
ECPointFp.prototype.equals = pointFpEquals;
ECPointFp.prototype.isInfinity = pointFpIsInfinity;
ECPointFp.prototype.negate = pointFpNegate;
ECPointFp.prototype.add = pointFpAdd;
ECPointFp.prototype.twice = pointFpTwice;
ECPointFp.prototype.multiply = pointFpMultiply;
ECPointFp.prototype.multiplyTwo = pointFpMultiplyTwo;
function ECCurveFp(e, d, c) {
  this.q = e;
  this.a = this.fromBigInteger(d);
  this.b = this.fromBigInteger(c);
  this.infinity = new ECPointFp(this, null, null)
}
function curveFpGetQ() {
  return this.q
}
function curveFpGetA() {
  return this.a
}
function curveFpGetB() {
  return this.b
}
function curveFpEquals(a) {
  if (a == this) {
    return true
  }
  return (this.q.equals(a.q) && this.a.equals(a.a) && this.b.equals(a.b))
}
function curveFpGetInfinity() {
  return this.infinity
}
function curveFpFromBigInteger(a) {
  return new ECFieldElementFp(this.q, a)
}
function curveFpDecodePointHex(d) {
  switch (parseInt(d.substr(0, 2), 16)) {
    case 0:
      return this.infinity;
    case 2:
    case 3:
      return null;
    case 4:
    case 6:
    case 7:
      var a = (d.length - 2) / 2;
      var c = d.substr(2, a);
      var b = d.substr(a + 2, a);
      return new ECPointFp(this, this.fromBigInteger(new BigInteger(c, 16)), this.fromBigInteger(new BigInteger(b, 16)));
    default:
      return null
  }
}
ECCurveFp.prototype.getQ = curveFpGetQ;
ECCurveFp.prototype.getA = curveFpGetA;
ECCurveFp.prototype.getB = curveFpGetB;
ECCurveFp.prototype.equals = curveFpEquals;
ECCurveFp.prototype.getInfinity = curveFpGetInfinity;
ECCurveFp.prototype.fromBigInteger = curveFpFromBigInteger;
ECCurveFp.prototype.decodePointHex = curveFpDecodePointHex;
/*! (c) Stefan Thomas | https://github.com/bitcoinjs/bitcoinjs-lib
 */
ECFieldElementFp.prototype.getByteLength = function () {
  return Math.floor((this.toBigInteger().bitLength() + 7) / 8)
};
ECPointFp.prototype.getEncoded = function (c) {
  var d = function (h, f) {
    var g = h.toByteArrayUnsigned();
    if (f < g.length) {
      g = g.slice(g.length - f)
    } else {
      while (f > g.length) {
        g.unshift(0)
      }
    }
    return g
  };
  var a = this.getX().toBigInteger();
  var e = this.getY().toBigInteger();
  var b = d(a, 32);
  if (c) {
    if (e.isEven()) {
      b.unshift(2)
    } else {
      b.unshift(3)
    }
  } else {
    b.unshift(4);
    b = b.concat(d(e, 32))
  }
  return b
};
ECPointFp.decodeFrom = function (g, c) {
  var f = c[0];
  var e = c.length - 1;
  var d = c.slice(1, 1 + e / 2);
  var b = c.slice(1 + e / 2, 1 + e);
  d.unshift(0);
  b.unshift(0);
  var a = new BigInteger(d);
  var h = new BigInteger(b);
  return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h))
};
ECPointFp.decodeFromHex = function (g, c) {
  var f = c.substr(0, 2);
  var e = c.length - 2;
  var d = c.substr(2, e / 2);
  var b = c.substr(2 + e / 2, e / 2);
  var a = new BigInteger(d, 16);
  var h = new BigInteger(b, 16);
  return new ECPointFp(g, g.fromBigInteger(a), g.fromBigInteger(h))
};
ECPointFp.prototype.add2D = function (c) {
  if (this.isInfinity()) {
    return c
  }
  if (c.isInfinity()) {
    return this
  }
  if (this.x.equals(c.x)) {
    if (this.y.equals(c.y)) {
      return this.twice()
    }
    return this.curve.getInfinity()
  }
  var g = c.x.subtract(this.x);
  var e = c.y.subtract(this.y);
  var a = e.divide(g);
  var d = a.square().subtract(this.x).subtract(c.x);
  var f = a.multiply(this.x.subtract(d)).subtract(this.y);
  return new ECPointFp(this.curve, d, f)
};
ECPointFp.prototype.twice2D = function () {
  if (this.isInfinity()) {
    return this
  }
  if (this.y.toBigInteger().signum() == 0) {
    return this.curve.getInfinity()
  }
  var b = this.curve.fromBigInteger(BigInteger.valueOf(2));
  var e = this.curve.fromBigInteger(BigInteger.valueOf(3));
  var a = this.x.square().multiply(e).add(this.curve.a).divide(this.y.multiply(b));
  var c = a.square().subtract(this.x.multiply(b));
  var d = a.multiply(this.x.subtract(c)).subtract(this.y);
  return new ECPointFp(this.curve, c, d)
};
ECPointFp.prototype.multiply2D = function (b) {
  if (this.isInfinity()) {
    return this
  }
  if (b.signum() == 0) {
    return this.curve.getInfinity()
  }
  var g = b;
  var f = g.multiply(new BigInteger("3"));
  var l = this.negate();
  var d = this;
  var c;
  for (c = f.bitLength() - 2; c > 0; --c) {
    d = d.twice();
    var a = f.testBit(c);
    var j = g.testBit(c);
    if (a != j) {
      d = d.add2D(a ? this : l)
    }
  }
  return d
};
ECPointFp.prototype.isOnCurve = function () {
  var d = this.getX().toBigInteger();
  var i = this.getY().toBigInteger();
  var f = this.curve.getA().toBigInteger();
  var c = this.curve.getB().toBigInteger();
  var h = this.curve.getQ();
  var e = i.multiply(i).mod(h);
  var g = d.multiply(d).multiply(d).add(f.multiply(d)).add(c).mod(h);
  return e.equals(g)
};
ECPointFp.prototype.toString = function () {
  return "(" + this.getX().toBigInteger().toString() + "," + this.getY().toBigInteger().toString() + ")"
};
ECPointFp.prototype.validate = function () {
  var c = this.curve.getQ();
  if (this.isInfinity()) {
    throw new Error("Point is at infinity.")
  }
  var a = this.getX().toBigInteger();
  var b = this.getY().toBigInteger();
  if (a.compareTo(BigInteger.ONE) < 0 || a.compareTo(c.subtract(BigInteger.ONE)) > 0) {
    throw new Error("x coordinate out of bounds")
  }
  if (b.compareTo(BigInteger.ONE) < 0 || b.compareTo(c.subtract(BigInteger.ONE)) > 0) {
    throw new Error("y coordinate out of bounds")
  }
  if (!this.isOnCurve()) {
    throw new Error("Point is not on the curve.")
  }
  if (this.multiply(c).isInfinity()) {
    throw new Error("Point is not a scalar multiple of G.")
  }
  return true
};
/*! Mike Samuel (c) 2009 | code.google.com/p/json-sans-eval
 */
var jsonParse = (function () {
  var e = "(?:-?\\b(?:0|[1-9][0-9]*)(?:\\.[0-9]+)?(?:[eE][+-]?[0-9]+)?\\b)";
  var j = '(?:[^\\0-\\x08\\x0a-\\x1f"\\\\]|\\\\(?:["/\\\\bfnrt]|u[0-9A-Fa-f]{4}))';
  var i = '(?:"' + j + '*")';
  var d = new RegExp("(?:false|true|null|[\\{\\}\\[\\]]|" + e + "|" + i + ")", "g");
  var k = new RegExp("\\\\(?:([^u])|u(.{4}))", "g");
  var g = {
    '"': '"',
    "/": "/",
    "\\": "\\",
    b: "\b",
    f: "\f",
    n: "\n",
    r: "\r",
    t: "\t"
  };
  function h(l, m, n) {
    return m ? g[m] : String.fromCharCode(parseInt(n, 16))
  }
  var c = new String("");
  var a = "\\";
  var f = {
    "{": Object,
    "[": Array
  };
  var b = Object.hasOwnProperty;
  return function (u, q) {
    var p = u.match(d);
    var x;
    var v = p[0];
    var l = false;
    if ("{" === v) {
      x = {}
    } else {
      if ("[" === v) {
        x = []
      } else {
        x = [];
        l = true
      }
    }
    var t;
    var r = [x];
    for (var o = 1 - l,
      m = p.length; o < m; ++o) {
      v = p[o];
      var w;
      switch (v.charCodeAt(0)) {
        default:
          w = r[0];
          w[t || w.length] = +(v);
          t = void 0;
          break;
        case 34:
          v = v.substring(1, v.length - 1);
          if (v.indexOf(a) !== -1) {
            v = v.replace(k, h)
          }
          w = r[0];
          if (!t) {
            if (w instanceof Array) {
              t = w.length
            } else {
              t = v || c;
              break
            }
          }
          w[t] = v;
          t = void 0;
          break;
        case 91:
          w = r[0];
          r.unshift(w[t || w.length] = []);
          t = void 0;
          break;
        case 93:
          r.shift();
          break;
        case 102:
          w = r[0];
          w[t || w.length] = false;
          t = void 0;
          break;
        case 110:
          w = r[0];
          w[t || w.length] = null;
          t = void 0;
          break;
        case 116:
          w = r[0];
          w[t || w.length] = true;
          t = void 0;
          break;
        case 123:
          w = r[0];
          r.unshift(w[t || w.length] = {});
          t = void 0;
          break;
        case 125:
          r.shift();
          break
      }
    }
    if (l) {
      if (r.length !== 1) {
        throw new Error()
      }
      x = x[0]
    } else {
      if (r.length) {
        throw new Error()
      }
    }
    if (q) {
      var s = function (C, B) {
        var D = C[B];
        if (D && typeof D === "object") {
          var n = null;
          for (var z in D) {
            if (b.call(D, z) && D !== C) {
              var y = s(D, z);
              if (y !== void 0) {
                D[z] = y
              } else {
                if (!n) {
                  n = []
                }
                n.push(z)
              }
            }
          }
          if (n) {
            for (var A = n.length; --A >= 0;) {
              delete D[n[A]]
            }
          }
        }
        return q.call(C, B, D)
      };
      x = s({
        "": x
      },
        "")
    }
    return x
  }
})();
/*! asn1-1.0.12.js (c) 2013-2016 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {}
}
KJUR.asn1.ASN1Util = new
  function () {
    this.integerToByteHex = function (a) {
      var b = a.toString(16);
      if ((b.length % 2) == 1) {
        b = "0" + b
      }
      return b
    };
    this.bigIntToMinTwosComplementsHex = function (j) {
      var f = j.toString(16);
      if (f.substr(0, 1) != "-") {
        if (f.length % 2 == 1) {
          f = "0" + f
        } else {
          if (!f.match(/^[0-7]/)) {
            f = "00" + f
          }
        }
      } else {
        var a = f.substr(1);
        var e = a.length;
        if (e % 2 == 1) {
          e += 1
        } else {
          if (!f.match(/^[0-7]/)) {
            e += 2
          }
        }
        var g = "";
        for (var d = 0; d < e; d++) {
          g += "f"
        }
        var c = new BigInteger(g, 16);
        var b = c.xor(j).add(BigInteger.ONE);
        f = b.toString(16).replace(/^-/, "")
      }
      return f
    };
    this.getPEMStringFromHex = function (a, b) {
      var c = hextob64(a);
      var d = c.replace(/(.{64})/g, "$1\r\n");
      d = d.replace(/\r\n$/, "");
      return "-----BEGIN " + b + "-----\r\n" + d + "\r\n-----END " + b + "-----\r\n"
    };
    this.newObject = function (b) {
      var g = KJUR.asn1;
      var k = Object.keys(b);
      if (k.length != 1) {
        throw "key of param shall be only one."
      }
      var j = k[0];
      if (":bool:int:bitstr:octstr:null:oid:enum:utf8str:numstr:prnstr:telstr:ia5str:utctime:gentime:seq:set:tag:".indexOf(":" + j + ":") == -1) {
        throw "undefined key: " + j
      }
      if (j == "bool") {
        return new g.DERBoolean(b[j])
      }
      if (j == "int") {
        return new g.DERInteger(b[j])
      }
      if (j == "bitstr") {
        return new g.DERBitString(b[j])
      }
      if (j == "octstr") {
        return new g.DEROctetString(b[j])
      }
      if (j == "null") {
        return new g.DERNull(b[j])
      }
      if (j == "oid") {
        return new g.DERObjectIdentifier(b[j])
      }
      if (j == "enum") {
        return new g.DEREnumerated(b[j])
      }
      if (j == "utf8str") {
        return new g.DERUTF8String(b[j])
      }
      if (j == "numstr") {
        return new g.DERNumericString(b[j])
      }
      if (j == "prnstr") {
        return new g.DERPrintableString(b[j])
      }
      if (j == "telstr") {
        return new g.DERTeletexString(b[j])
      }
      if (j == "ia5str") {
        return new g.DERIA5String(b[j])
      }
      if (j == "utctime") {
        return new g.DERUTCTime(b[j])
      }
      if (j == "gentime") {
        return new g.DERGeneralizedTime(b[j])
      }
      if (j == "seq") {
        var m = b[j];
        var h = [];
        for (var e = 0; e < m.length; e++) {
          var l = g.ASN1Util.newObject(m[e]);
          h.push(l)
        }
        return new g.DERSequence({
          array: h
        })
      }
      if (j == "set") {
        var m = b[j];
        var h = [];
        for (var e = 0; e < m.length; e++) {
          var l = g.ASN1Util.newObject(m[e]);
          h.push(l)
        }
        return new g.DERSet({
          array: h
        })
      }
      if (j == "tag") {
        var c = b[j];
        if (Object.prototype.toString.call(c) === "[object Array]" && c.length == 3) {
          var d = g.ASN1Util.newObject(c[2]);
          return new g.DERTaggedObject({
            tag: c[0],
            explicit: c[1],
            obj: d
          })
        } else {
          var f = {};
          if (c.explicit !== undefined) {
            f.explicit = c.explicit
          }
          if (c.tag !== undefined) {
            f.tag = c.tag
          }
          if (c.obj === undefined) {
            throw "obj shall be specified for 'tag'."
          }
          f.obj = g.ASN1Util.newObject(c.obj);
          return new g.DERTaggedObject(f)
        }
      }
    };
    this.jsonToASN1HEX = function (b) {
      var a = this.newObject(b);
      return a.getEncodedHex()
    }
  };
KJUR.asn1.ASN1Util.oidHexToInt = function (a) {
  var j = "";
  var k = parseInt(a.substr(0, 2), 16);
  var d = Math.floor(k / 40);
  var c = k % 40;
  var j = d + "." + c;
  var e = "";
  for (var f = 2; f < a.length; f += 2) {
    var g = parseInt(a.substr(f, 2), 16);
    var h = ("00000000" + g.toString(2)).slice(- 8);
    e = e + h.substr(1, 7);
    if (h.substr(0, 1) == "0") {
      var b = new BigInteger(e, 2);
      j = j + "." + b.toString(10);
      e = ""
    }
  }
  return j
};
KJUR.asn1.ASN1Util.oidIntToHex = function (f) {
  var e = function (a) {
    var k = a.toString(16);
    if (k.length == 1) {
      k = "0" + k
    }
    return k
  };
  var d = function (o) {
    var n = "";
    var k = new BigInteger(o, 10);
    var a = k.toString(2);
    var l = 7 - a.length % 7;
    if (l == 7) {
      l = 0
    }
    var q = "";
    for (var m = 0; m < l; m++) {
      q += "0"
    }
    a = q + a;
    for (var m = 0; m < a.length - 1; m += 7) {
      var p = a.substr(m, 7);
      if (m != a.length - 7) {
        p = "1" + p
      }
      n += e(parseInt(p, 2))
    }
    return n
  };
  if (!f.match(/^[0-9.]+$/)) {
    throw "malformed oid string: " + f
  }
  var g = "";
  var b = f.split(".");
  var j = parseInt(b[0]) * 40 + parseInt(b[1]);
  g += e(j);
  b.splice(0, 2);
  for (var c = 0; c < b.length; c++) {
    g += d(b[c])
  }
  return g
};
KJUR.asn1.ASN1Object = function () {
  var c = true;
  var b = null;
  var d = "00";
  var e = "00";
  var a = "";
  this.getLengthHexFromValue = function () {
    if (typeof this.hV == "undefined" || this.hV == null) {
      throw "this.hV is null or undefined."
    }
    if (this.hV.length % 2 == 1) {
      throw "value hex must be even length: n=" + a.length + ",v=" + this.hV
    }
    var i = this.hV.length / 2;
    var h = i.toString(16);
    if (h.length % 2 == 1) {
      h = "0" + h
    }
    if (i < 128) {
      return h
    } else {
      var g = h.length / 2;
      if (g > 15) {
        throw "ASN.1 length too long to represent by 8x: n = " + i.toString(16)
      }
      var f = 128 + g;
      return f.toString(16) + h
    }
  };
  this.getEncodedHex = function () {
    if (this.hTLV == null || this.isModified) {
      this.hV = this.getFreshValueHex();
      this.hL = this.getLengthHexFromValue();
      this.hTLV = this.hT + this.hL + this.hV;
      this.isModified = false
    }
    return this.hTLV
  };
  this.getValueHex = function () {
    this.getEncodedHex();
    return this.hV
  };
  this.getFreshValueHex = function () {
    return ""
  }
};
KJUR.asn1.DERAbstractString = function (c) {
  KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
  var b = null;
  var a = null;
  this.getString = function () {
    return this.s
  };
  this.setString = function (d) {
    this.hTLV = null;
    this.isModified = true;
    this.s = d;
    this.hV = stohex(this.s)
  };
  this.setStringHex = function (d) {
    this.hTLV = null;
    this.isModified = true;
    this.s = null;
    this.hV = d
  };
  this.getFreshValueHex = function () {
    return this.hV
  };
  if (typeof c != "undefined") {
    if (typeof c == "string") {
      this.setString(c)
    } else {
      if (typeof c.str != "undefined") {
        this.setString(c.str)
      } else {
        if (typeof c.hex != "undefined") {
          this.setStringHex(c.hex)
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractString, KJUR.asn1.ASN1Object);
KJUR.asn1.DERAbstractTime = function (c) {
  KJUR.asn1.DERAbstractTime.superclass.constructor.call(this);
  var b = null;
  var a = null;
  this.localDateToUTC = function (f) {
    utc = f.getTime() + (f.getTimezoneOffset() * 60000);
    var e = new Date(utc);
    return e
  };
  this.formatDate = function (m, o, e) {
    var g = this.zeroPadding;
    var n = this.localDateToUTC(m);
    var p = String(n.getFullYear());
    if (o == "utc") {
      p = p.substr(2, 2)
    }
    var l = g(String(n.getMonth() + 1), 2);
    var q = g(String(n.getDate()), 2);
    var h = g(String(n.getHours()), 2);
    var i = g(String(n.getMinutes()), 2);
    var j = g(String(n.getSeconds()), 2);
    var r = p + l + q + h + i + j;
    if (e === true) {
      var f = n.getMilliseconds();
      if (f != 0) {
        var k = g(String(f), 3);
        k = k.replace(/[0]+$/, "");
        r = r + "." + k
      }
    }
    return r + "Z"
  };
  this.zeroPadding = function (e, d) {
    if (e.length >= d) {
      return e
    }
    return new Array(d - e.length + 1).join("0") + e
  };
  this.getString = function () {
    return this.s
  };
  this.setString = function (d) {
    this.hTLV = null;
    this.isModified = true;
    this.s = d;
    this.hV = stohex(d)
  };
  this.setByDateValue = function (h, j, e, d, f, g) {
    var i = new Date(Date.UTC(h, j - 1, e, d, f, g, 0));
    this.setByDate(i)
  };
  this.getFreshValueHex = function () {
    return this.hV
  }
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractTime, KJUR.asn1.ASN1Object);
KJUR.asn1.DERAbstractStructured = function (b) {
  KJUR.asn1.DERAbstractString.superclass.constructor.call(this);
  var a = null;
  this.setByASN1ObjectArray = function (c) {
    this.hTLV = null;
    this.isModified = true;
    this.asn1Array = c
  };
  this.appendASN1Object = function (c) {
    this.hTLV = null;
    this.isModified = true;
    this.asn1Array.push(c)
  };
  this.asn1Array = new Array();
  if (typeof b != "undefined") {
    if (typeof b.array != "undefined") {
      this.asn1Array = b.array
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERAbstractStructured, KJUR.asn1.ASN1Object);
KJUR.asn1.DERBoolean = function () {
  KJUR.asn1.DERBoolean.superclass.constructor.call(this);
  this.hT = "01";
  this.hTLV = "0101ff"
};
YAHOO.lang.extend(KJUR.asn1.DERBoolean, KJUR.asn1.ASN1Object);
KJUR.asn1.DERInteger = function (a) {
  KJUR.asn1.DERInteger.superclass.constructor.call(this);
  this.hT = "02";
  this.setByBigInteger = function (b) {
    this.hTLV = null;
    this.isModified = true;
    this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)
  };
  this.setByInteger = function (c) {
    var b = new BigInteger(String(c), 10);
    this.setByBigInteger(b)
  };
  this.setValueHex = function (b) {
    this.hV = b
  };
  this.getFreshValueHex = function () {
    return this.hV
  };
  if (typeof a != "undefined") {
    if (typeof a.bigint != "undefined") {
      this.setByBigInteger(a.bigint)
    } else {
      if (typeof a["int"] != "undefined") {
        this.setByInteger(a["int"])
      } else {
        if (typeof a == "number") {
          this.setByInteger(a)
        } else {
          if (typeof a.hex != "undefined") {
            this.setValueHex(a.hex)
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERInteger, KJUR.asn1.ASN1Object);
KJUR.asn1.DERBitString = function (b) {
  if (b !== undefined && typeof b.obj !== "undefined") {
    var a = KJUR.asn1.ASN1Util.newObject(b.obj);
    b.hex = "00" + a.getEncodedHex()
  }
  KJUR.asn1.DERBitString.superclass.constructor.call(this);
  this.hT = "03";
  this.setHexValueIncludingUnusedBits = function (c) {
    this.hTLV = null;
    this.isModified = true;
    this.hV = c
  };
  this.setUnusedBitsAndHexValue = function (c, e) {
    if (c < 0 || 7 < c) {
      throw "unused bits shall be from 0 to 7: u = " + c
    }
    var d = "0" + c;
    this.hTLV = null;
    this.isModified = true;
    this.hV = d + e
  };
  this.setByBinaryString = function (e) {
    e = e.replace(/0+$/, "");
    var f = 8 - e.length % 8;
    if (f == 8) {
      f = 0
    }
    for (var g = 0; g <= f; g++) {
      e += "0"
    }
    var j = "";
    for (var g = 0; g < e.length - 1; g += 8) {
      var d = e.substr(g, 8);
      var c = parseInt(d, 2).toString(16);
      if (c.length == 1) {
        c = "0" + c
      }
      j += c
    }
    this.hTLV = null;
    this.isModified = true;
    this.hV = "0" + f + j
  };
  this.setByBooleanArray = function (e) {
    var d = "";
    for (var c = 0; c < e.length; c++) {
      if (e[c] == true) {
        d += "1"
      } else {
        d += "0"
      }
    }
    this.setByBinaryString(d)
  };
  this.newFalseArray = function (e) {
    var c = new Array(e);
    for (var d = 0; d < e; d++) {
      c[d] = false
    }
    return c
  };
  this.getFreshValueHex = function () {
    return this.hV
  };
  if (typeof b != "undefined") {
    if (typeof b == "string" && b.toLowerCase().match(/^[0-9a-f]+$/)) {
      this.setHexValueIncludingUnusedBits(b)
    } else {
      if (typeof b.hex != "undefined") {
        this.setHexValueIncludingUnusedBits(b.hex)
      } else {
        if (typeof b.bin != "undefined") {
          this.setByBinaryString(b.bin)
        } else {
          if (typeof b.array != "undefined") {
            this.setByBooleanArray(b.array)
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERBitString, KJUR.asn1.ASN1Object);
KJUR.asn1.DEROctetString = function (b) {
  if (b !== undefined && typeof b.obj !== "undefined") {
    var a = KJUR.asn1.ASN1Util.newObject(b.obj);
    b.hex = a.getEncodedHex()
  }
  KJUR.asn1.DEROctetString.superclass.constructor.call(this, b);
  this.hT = "04"
};
YAHOO.lang.extend(KJUR.asn1.DEROctetString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERNull = function () {
  KJUR.asn1.DERNull.superclass.constructor.call(this);
  this.hT = "05";
  this.hTLV = "0500"
};
YAHOO.lang.extend(KJUR.asn1.DERNull, KJUR.asn1.ASN1Object);
KJUR.asn1.DERObjectIdentifier = function (c) {
  var b = function (d) {
    var e = d.toString(16);
    if (e.length == 1) {
      e = "0" + e
    }
    return e
  };
  var a = function (k) {
    var j = "";
    var e = new BigInteger(k, 10);
    var d = e.toString(2);
    var f = 7 - d.length % 7;
    if (f == 7) {
      f = 0
    }
    var m = "";
    for (var g = 0; g < f; g++) {
      m += "0"
    }
    d = m + d;
    for (var g = 0; g < d.length - 1; g += 7) {
      var l = d.substr(g, 7);
      if (g != d.length - 7) {
        l = "1" + l
      }
      j += b(parseInt(l, 2))
    }
    return j
  };
  KJUR.asn1.DERObjectIdentifier.superclass.constructor.call(this);
  this.hT = "06";
  this.setValueHex = function (d) {
    this.hTLV = null;
    this.isModified = true;
    this.s = null;
    this.hV = d
  };
  this.setValueOidString = function (f) {
    if (!f.match(/^[0-9.]+$/)) {
      throw "malformed oid string: " + f
    }
    var g = "";
    var d = f.split(".");
    var j = parseInt(d[0]) * 40 + parseInt(d[1]);
    g += b(j);
    d.splice(0, 2);
    for (var e = 0; e < d.length; e++) {
      g += a(d[e])
    }
    this.hTLV = null;
    this.isModified = true;
    this.s = null;
    this.hV = g
  };
  this.setValueName = function (e) {
    var d = KJUR.asn1.x509.OID.name2oid(e);
    if (d !== "") {
      this.setValueOidString(d)
    } else {
      throw "DERObjectIdentifier oidName undefined: " + e
    }
  };
  this.getFreshValueHex = function () {
    return this.hV
  };
  if (c !== undefined) {
    if (typeof c === "string") {
      if (c.match(/^[0-2].[0-9.]+$/)) {
        this.setValueOidString(c)
      } else {
        this.setValueName(c)
      }
    } else {
      if (c.oid !== undefined) {
        this.setValueOidString(c.oid)
      } else {
        if (c.hex !== undefined) {
          this.setValueHex(c.hex)
        } else {
          if (c.name !== undefined) {
            this.setValueName(c.name)
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERObjectIdentifier, KJUR.asn1.ASN1Object);
KJUR.asn1.DEREnumerated = function (a) {
  KJUR.asn1.DEREnumerated.superclass.constructor.call(this);
  this.hT = "0a";
  this.setByBigInteger = function (b) {
    this.hTLV = null;
    this.isModified = true;
    this.hV = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(b)
  };
  this.setByInteger = function (c) {
    var b = new BigInteger(String(c), 10);
    this.setByBigInteger(b)
  };
  this.setValueHex = function (b) {
    this.hV = b
  };
  this.getFreshValueHex = function () {
    return this.hV
  };
  if (typeof a != "undefined") {
    if (typeof a["int"] != "undefined") {
      this.setByInteger(a["int"])
    } else {
      if (typeof a == "number") {
        this.setByInteger(a)
      } else {
        if (typeof a.hex != "undefined") {
          this.setValueHex(a.hex)
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DEREnumerated, KJUR.asn1.ASN1Object);
KJUR.asn1.DERUTF8String = function (a) {
  KJUR.asn1.DERUTF8String.superclass.constructor.call(this, a);
  this.hT = "0c"
};
YAHOO.lang.extend(KJUR.asn1.DERUTF8String, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERNumericString = function (a) {
  KJUR.asn1.DERNumericString.superclass.constructor.call(this, a);
  this.hT = "12"
};
YAHOO.lang.extend(KJUR.asn1.DERNumericString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERPrintableString = function (a) {
  KJUR.asn1.DERPrintableString.superclass.constructor.call(this, a);
  this.hT = "13"
};
YAHOO.lang.extend(KJUR.asn1.DERPrintableString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERTeletexString = function (a) {
  KJUR.asn1.DERTeletexString.superclass.constructor.call(this, a);
  this.hT = "14"
};
YAHOO.lang.extend(KJUR.asn1.DERTeletexString, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERIA5String = function (a) {
  KJUR.asn1.DERIA5String.superclass.constructor.call(this, a);
  this.hT = "16"
};
YAHOO.lang.extend(KJUR.asn1.DERIA5String, KJUR.asn1.DERAbstractString);
KJUR.asn1.DERUTCTime = function (a) {
  KJUR.asn1.DERUTCTime.superclass.constructor.call(this, a);
  this.hT = "17";
  this.setByDate = function (b) {
    this.hTLV = null;
    this.isModified = true;
    this.date = b;
    this.s = this.formatDate(this.date, "utc");
    this.hV = stohex(this.s)
  };
  this.getFreshValueHex = function () {
    if (typeof this.date == "undefined" && typeof this.s == "undefined") {
      this.date = new Date();
      this.s = this.formatDate(this.date, "utc");
      this.hV = stohex(this.s)
    }
    return this.hV
  };
  if (a !== undefined) {
    if (a.str !== undefined) {
      this.setString(a.str)
    } else {
      if (typeof a == "string" && a.match(/^[0-9]{12}Z$/)) {
        this.setString(a)
      } else {
        if (a.hex !== undefined) {
          this.setStringHex(a.hex)
        } else {
          if (a.date !== undefined) {
            this.setByDate(a.date)
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERUTCTime, KJUR.asn1.DERAbstractTime);
KJUR.asn1.DERGeneralizedTime = function (a) {
  KJUR.asn1.DERGeneralizedTime.superclass.constructor.call(this, a);
  this.hT = "18";
  this.withMillis = false;
  this.setByDate = function (b) {
    this.hTLV = null;
    this.isModified = true;
    this.date = b;
    this.s = this.formatDate(this.date, "gen", this.withMillis);
    this.hV = stohex(this.s)
  };
  this.getFreshValueHex = function () {
    if (this.date === undefined && this.s === undefined) {
      this.date = new Date();
      this.s = this.formatDate(this.date, "gen", this.withMillis);
      this.hV = stohex(this.s)
    }
    return this.hV
  };
  if (a !== undefined) {
    if (a.str !== undefined) {
      this.setString(a.str)
    } else {
      if (typeof a == "string" && a.match(/^[0-9]{14}Z$/)) {
        this.setString(a)
      } else {
        if (a.hex !== undefined) {
          this.setStringHex(a.hex)
        } else {
          if (a.date !== undefined) {
            this.setByDate(a.date)
          }
        }
      }
    }
    if (a.millis === true) {
      this.withMillis = true
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERGeneralizedTime, KJUR.asn1.DERAbstractTime);
KJUR.asn1.DERSequence = function (a) {
  KJUR.asn1.DERSequence.superclass.constructor.call(this, a);
  this.hT = "30";
  this.getFreshValueHex = function () {
    var c = "";
    for (var b = 0; b < this.asn1Array.length; b++) {
      var d = this.asn1Array[b];
      c += d.getEncodedHex()
    }
    this.hV = c;
    return this.hV
  }
};
YAHOO.lang.extend(KJUR.asn1.DERSequence, KJUR.asn1.DERAbstractStructured);
KJUR.asn1.DERSet = function (a) {
  KJUR.asn1.DERSet.superclass.constructor.call(this, a);
  this.hT = "31";
  this.sortFlag = true;
  this.getFreshValueHex = function () {
    var b = new Array();
    for (var c = 0; c < this.asn1Array.length; c++) {
      var d = this.asn1Array[c];
      b.push(d.getEncodedHex())
    }
    if (this.sortFlag == true) {
      b.sort()
    }
    this.hV = b.join("");
    return this.hV
  };
  if (typeof a != "undefined") {
    if (typeof a.sortflag != "undefined" && a.sortflag == false) {
      this.sortFlag = false
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERSet, KJUR.asn1.DERAbstractStructured);
KJUR.asn1.DERTaggedObject = function (a) {
  KJUR.asn1.DERTaggedObject.superclass.constructor.call(this);
  this.hT = "a0";
  this.hV = "";
  this.isExplicit = true;
  this.asn1Object = null;
  this.setASN1Object = function (b, c, d) {
    this.hT = c;
    this.isExplicit = b;
    this.asn1Object = d;
    if (this.isExplicit) {
      this.hV = this.asn1Object.getEncodedHex();
      this.hTLV = null;
      this.isModified = true
    } else {
      this.hV = null;
      this.hTLV = d.getEncodedHex();
      this.hTLV = this.hTLV.replace(/^../, c);
      this.isModified = false
    }
  };
  this.getFreshValueHex = function () {
    return this.hV
  };
  if (typeof a != "undefined") {
    if (typeof a.tag != "undefined") {
      this.hT = a.tag
    }
    if (typeof a.explicit != "undefined") {
      this.isExplicit = a.explicit
    }
    if (typeof a.obj != "undefined") {
      this.asn1Object = a.obj;
      this.setASN1Object(this.isExplicit, this.hT, this.asn1Object)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.DERTaggedObject, KJUR.asn1.ASN1Object);
/*! asn1hex-1.1.9.js (c) 2012-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
var ASN1HEX = new
  function () { };
ASN1HEX.getByteLengthOfL_AtObj = function (b, c) {
  if (b.substring(c + 2, c + 3) != "8") {
    return 1
  }
  var a = parseInt(b.substring(c + 3, c + 4));
  if (a == 0) {
    return - 1
  }
  if (0 < a && a < 10) {
    return a + 1
  }
  return - 2
};
ASN1HEX.getHexOfL_AtObj = function (b, c) {
  var a = ASN1HEX.getByteLengthOfL_AtObj(b, c);
  if (a < 1) {
    return ""
  }
  return b.substring(c + 2, c + 2 + a * 2)
};
ASN1HEX.getIntOfL_AtObj = function (c, d) {
  var b = ASN1HEX.getHexOfL_AtObj(c, d);
  if (b == "") {
    return - 1
  }
  var a;
  if (parseInt(b.substring(0, 1)) < 8) {
    a = new BigInteger(b, 16)
  } else {
    a = new BigInteger(b.substring(2), 16)
  }
  return a.intValue()
};
ASN1HEX.getStartPosOfV_AtObj = function (b, c) {
  var a = ASN1HEX.getByteLengthOfL_AtObj(b, c);
  if (a < 0) {
    return a
  }
  return c + (a + 1) * 2
};
ASN1HEX.getHexOfV_AtObj = function (c, d) {
  var b = ASN1HEX.getStartPosOfV_AtObj(c, d);
  var a = ASN1HEX.getIntOfL_AtObj(c, d);
  return c.substring(b, b + a * 2)
};
ASN1HEX.getHexOfTLV_AtObj = function (c, e) {
  var b = c.substr(e, 2);
  var d = ASN1HEX.getHexOfL_AtObj(c, e);
  var a = ASN1HEX.getHexOfV_AtObj(c, e);
  return b + d + a
};
ASN1HEX.getPosOfNextSibling_AtObj = function (c, d) {
  var b = ASN1HEX.getStartPosOfV_AtObj(c, d);
  var a = ASN1HEX.getIntOfL_AtObj(c, d);
  return b + a * 2
};
ASN1HEX.getPosArrayOfChildren_AtObj = function (f, j) {
  var c = new Array();
  var i = ASN1HEX.getStartPosOfV_AtObj(f, j);
  if (f.substr(j, 2) == "03") {
    c.push(i + 2)
  } else {
    c.push(i)
  }
  var b = ASN1HEX.getIntOfL_AtObj(f, j);
  var g = i;
  var d = 0;
  while (1) {
    var e = ASN1HEX.getPosOfNextSibling_AtObj(f, g);
    if (e == null || (e - i >= (b * 2))) {
      break
    }
    if (d >= 200) {
      break
    }
    c.push(e);
    g = e;
    d++
  }
  return c
};
ASN1HEX.getNthChildIndex_AtObj = function (d, b, e) {
  var c = ASN1HEX.getPosArrayOfChildren_AtObj(d, b);
  return c[e]
};
ASN1HEX.getDecendantIndexByNthList = function (e, d, c) {
  if (c.length == 0) {
    return d
  }
  var f = c.shift();
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(e, d);
  return ASN1HEX.getDecendantIndexByNthList(e, b[f], c)
};
ASN1HEX.getDecendantHexTLVByNthList = function (d, c, b) {
  var a = ASN1HEX.getDecendantIndexByNthList(d, c, b);
  return ASN1HEX.getHexOfTLV_AtObj(d, a)
};
ASN1HEX.getDecendantHexVByNthList = function (d, c, b) {
  var a = ASN1HEX.getDecendantIndexByNthList(d, c, b);
  return ASN1HEX.getHexOfV_AtObj(d, a)
};
ASN1HEX.getVbyList = function (d, c, b, e) {
  var a = ASN1HEX.getDecendantIndexByNthList(d, c, b);
  if (a === undefined) {
    throw "can't find nthList object"
  }
  if (e !== undefined) {
    if (d.substr(a, 2) != e) {
      throw "checking tag doesn't match: " + d.substr(a, 2) + "!=" + e
    }
  }
  return ASN1HEX.getHexOfV_AtObj(d, a)
};
ASN1HEX.hextooidstr = function (e) {
  var h = function (b, a) {
    if (b.length >= a) {
      return b
    }
    return new Array(a - b.length + 1).join("0") + b
  };
  var l = [];
  var o = e.substr(0, 2);
  var f = parseInt(o, 16);
  l[0] = new String(Math.floor(f / 40));
  l[1] = new String(f % 40);
  var m = e.substr(2);
  var k = [];
  for (var g = 0; g < m.length / 2; g++) {
    k.push(parseInt(m.substr(g * 2, 2), 16))
  }
  var j = [];
  var d = "";
  for (var g = 0; g < k.length; g++) {
    if (k[g] & 128) {
      d = d + h((k[g] & 127).toString(2), 7)
    } else {
      d = d + h((k[g] & 127).toString(2), 7);
      j.push(new String(parseInt(d, 2)));
      d = ""
    }
  }
  var n = l.join(".");
  if (j.length > 0) {
    n = n + "." + j.join(".")
  }
  return n
};
ASN1HEX.dump = function (q, c, k, g) {
  var e = q;
  if (q instanceof KJUR.asn1.ASN1Object) {
    e = q.getEncodedHex()
  }
  var o = function (x, i) {
    if (x.length <= i * 2) {
      return x
    } else {
      var v = x.substr(0, i) + "..(total " + x.length / 2 + "bytes).." + x.substr(x.length - i, i);
      return v
    }
  };
  if (c === undefined) {
    c = {
      ommit_long_octet: 32
    }
  }
  if (k === undefined) {
    k = 0
  }
  if (g === undefined) {
    g = ""
  }
  var t = c.ommit_long_octet;
  if (e.substr(k, 2) == "01") {
    var h = ASN1HEX.getHexOfV_AtObj(e, k);
    if (h == "00") {
      return g + "BOOLEAN FALSE\n"
    } else {
      return g + "BOOLEAN TRUE\n"
    }
  }
  if (e.substr(k, 2) == "02") {
    var h = ASN1HEX.getHexOfV_AtObj(e, k);
    return g + "INTEGER " + o(h, t) + "\n"
  }
  if (e.substr(k, 2) == "03") {
    var h = ASN1HEX.getHexOfV_AtObj(e, k);
    return g + "BITSTRING " + o(h, t) + "\n"
  }
  if (e.substr(k, 2) == "04") {
    var h = ASN1HEX.getHexOfV_AtObj(e, k);
    if (ASN1HEX.isASN1HEX(h)) {
      var j = g + "OCTETSTRING, encapsulates\n";
      j = j + ASN1HEX.dump(h, c, 0, g + "  ");
      return j
    } else {
      return g + "OCTETSTRING " + o(h, t) + "\n"
    }
  }
  if (e.substr(k, 2) == "05") {
    return g + "NULL\n"
  }
  if (e.substr(k, 2) == "06") {
    var l = ASN1HEX.getHexOfV_AtObj(e, k);
    var a = KJUR.asn1.ASN1Util.oidHexToInt(l);
    var n = KJUR.asn1.x509.OID.oid2name(a);
    var b = a.replace(/\./g, " ");
    if (n != "") {
      return g + "ObjectIdentifier " + n + " (" + b + ")\n"
    } else {
      return g + "ObjectIdentifier (" + b + ")\n"
    }
  }
  if (e.substr(k, 2) == "0c") {
    return g + "UTF8String '" + hextoutf8(ASN1HEX.getHexOfV_AtObj(e, k)) + "'\n"
  }
  if (e.substr(k, 2) == "13") {
    return g + "PrintableString '" + hextoutf8(ASN1HEX.getHexOfV_AtObj(e, k)) + "'\n"
  }
  if (e.substr(k, 2) == "14") {
    return g + "TeletexString '" + hextoutf8(ASN1HEX.getHexOfV_AtObj(e, k)) + "'\n"
  }
  if (e.substr(k, 2) == "16") {
    return g + "IA5String '" + hextoutf8(ASN1HEX.getHexOfV_AtObj(e, k)) + "'\n"
  }
  if (e.substr(k, 2) == "17") {
    return g + "UTCTime " + hextoutf8(ASN1HEX.getHexOfV_AtObj(e, k)) + "\n"
  }
  if (e.substr(k, 2) == "18") {
    return g + "GeneralizedTime " + hextoutf8(ASN1HEX.getHexOfV_AtObj(e, k)) + "\n"
  }
  if (e.substr(k, 2) == "30") {
    if (e.substr(k, 4) == "3000") {
      return g + "SEQUENCE {}\n"
    }
    var j = g + "SEQUENCE\n";
    var d = ASN1HEX.getPosArrayOfChildren_AtObj(e, k);
    var f = c;
    if ((d.length == 2 || d.length == 3) && e.substr(d[0], 2) == "06" && e.substr(d[d.length - 1], 2) == "04") {
      var u = ASN1HEX.getHexOfV_AtObj(e, d[0]);
      var a = KJUR.asn1.ASN1Util.oidHexToInt(u);
      var n = KJUR.asn1.x509.OID.oid2name(a);
      var p = JSON.parse(JSON.stringify(c));
      p.x509ExtName = n;
      f = p
    }
    for (var r = 0; r < d.length; r++) {
      j = j + ASN1HEX.dump(e, f, d[r], g + "  ")
    }
    return j
  }
  if (e.substr(k, 2) == "31") {
    var j = g + "SET\n";
    var d = ASN1HEX.getPosArrayOfChildren_AtObj(e, k);
    for (var r = 0; r < d.length; r++) {
      j = j + ASN1HEX.dump(e, c, d[r], g + "  ")
    }
    return j
  }
  var w = parseInt(e.substr(k, 2), 16);
  if ((w & 128) != 0) {
    var m = w & 31;
    if ((w & 32) != 0) {
      var j = g + "[" + m + "]\n";
      var d = ASN1HEX.getPosArrayOfChildren_AtObj(e, k);
      for (var r = 0; r < d.length; r++) {
        j = j + ASN1HEX.dump(e, c, d[r], g + "  ")
      }
      return j
    } else {
      var h = ASN1HEX.getHexOfV_AtObj(e, k);
      if (h.substr(0, 8) == "68747470") {
        h = hextoutf8(h)
      }
      if (c.x509ExtName === "subjectAltName" && m == 2) {
        h = hextoutf8(h)
      }
      var j = g + "[" + m + "] " + h + "\n";
      return j
    }
  }
  return g + "UNKNOWN(" + e.substr(k, 2) + ") " + ASN1HEX.getHexOfV_AtObj(e, k) + "\n"
};
ASN1HEX.isASN1HEX = function (d) {
  if (d.length % 2 == 1) {
    return false
  }
  var c = ASN1HEX.getIntOfL_AtObj(d, 0);
  var b = d.substr(0, 2);
  var e = ASN1HEX.getHexOfL_AtObj(d, 0);
  var a = d.length - b.length - e.length;
  if (a == c * 2) {
    return true
  }
  return false
};
ASN1HEX.pemToHex = function (b, d) {
  if (b.indexOf("-----BEGIN ") == -1) {
    throw "can't find PEM header: " + d
  }
  if (d !== undefined) {
    b = b.replace("-----BEGIN " + d + "-----", "");
    b = b.replace("-----END " + d + "-----", "")
  } else {
    b = b.replace(/-----BEGIN [^-]+-----/, "");
    b = b.replace(/-----END [^-]+-----/, "")
  }
  var c = b.replace(/\s+/g, "");
  var a = b64tohex(c);
  return a
};
/*! asn1x509-1.0.22.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {}
}
if (typeof KJUR.asn1.x509 == "undefined" || !KJUR.asn1.x509) {
  KJUR.asn1.x509 = {}
}
KJUR.asn1.x509.Certificate = function (g) {
  KJUR.asn1.x509.Certificate.superclass.constructor.call(this);
  var b = null;
  var d = null;
  var f = null;
  var c = null;
  var a = null;
  var e = null;
  this.setRsaPrvKeyByPEMandPass = function (i, k) {
    var h = PKCS5PKEY.getDecryptedKeyHex(i, k);
    var j = new RSAKey();
    j.readPrivateKeyFromASN1HexString(h);
    this.prvKey = j
  };
  this.sign = function () {
    this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
    var i = new KJUR.crypto.Signature({
      alg: this.asn1SignatureAlg.nameAlg
    });
    i.init(this.prvKey);
    i.updateHex(this.asn1TBSCert.getEncodedHex());
    this.hexSig = i.sign();
    this.asn1Sig = new KJUR.asn1.DERBitString({
      hex: "00" + this.hexSig
    });
    var h = new KJUR.asn1.DERSequence({
      array: [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig]
    });
    this.hTLV = h.getEncodedHex();
    this.isModified = false
  };
  this.setSignatureHex = function (h) {
    this.asn1SignatureAlg = this.asn1TBSCert.asn1SignatureAlg;
    this.hexSig = h;
    this.asn1Sig = new KJUR.asn1.DERBitString({
      hex: "00" + this.hexSig
    });
    var i = new KJUR.asn1.DERSequence({
      array: [this.asn1TBSCert, this.asn1SignatureAlg, this.asn1Sig]
    });
    this.hTLV = i.getEncodedHex();
    this.isModified = false
  };
  this.getEncodedHex = function () {
    if (this.isModified == false && this.hTLV != null) {
      return this.hTLV
    }
    throw "not signed yet"
  };
  this.getPEMString = function () {
    var j = this.getEncodedHex();
    var h = CryptoJS.enc.Hex.parse(j);
    var i = CryptoJS.enc.Base64.stringify(h);
    var k = i.replace(/(.{64})/g, "$1\r\n");
    return "-----BEGIN CERTIFICATE-----\r\n" + k + "\r\n-----END CERTIFICATE-----\r\n"
  };
  if (g !== undefined) {
    if (g.tbscertobj !== undefined) {
      this.asn1TBSCert = g.tbscertobj
    }
    if (g.prvkeyobj !== undefined) {
      this.prvKey = g.prvkeyobj
    } else {
      if (g.rsaprvkey !== undefined) {
        this.prvKey = g.rsaprvkey
      } else {
        if ((g.rsaprvpem !== undefined) && (g.rsaprvpas !== undefined)) {
          this.setRsaPrvKeyByPEMandPass(g.rsaprvpem, g.rsaprvpas)
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.Certificate, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.TBSCertificate = function (a) {
  KJUR.asn1.x509.TBSCertificate.superclass.constructor.call(this);
  this._initialize = function () {
    this.asn1Array = new Array();
    this.asn1Version = new KJUR.asn1.DERTaggedObject({
      obj: new KJUR.asn1.DERInteger({
        "int": 2
      })
    });
    this.asn1SerialNumber = null;
    this.asn1SignatureAlg = null;
    this.asn1Issuer = null;
    this.asn1NotBefore = null;
    this.asn1NotAfter = null;
    this.asn1Subject = null;
    this.asn1SubjPKey = null;
    this.extensionsArray = new Array()
  };
  this.setSerialNumberByParam = function (b) {
    this.asn1SerialNumber = new KJUR.asn1.DERInteger(b)
  };
  this.setSignatureAlgByParam = function (b) {
    this.asn1SignatureAlg = new KJUR.asn1.x509.AlgorithmIdentifier(b)
  };
  this.setIssuerByParam = function (b) {
    this.asn1Issuer = new KJUR.asn1.x509.X500Name(b)
  };
  this.setNotBeforeByParam = function (b) {
    this.asn1NotBefore = new KJUR.asn1.x509.Time(b)
  };
  this.setNotAfterByParam = function (b) {
    this.asn1NotAfter = new KJUR.asn1.x509.Time(b)
  };
  this.setSubjectByParam = function (b) {
    this.asn1Subject = new KJUR.asn1.x509.X500Name(b)
  };
  this.setSubjectPublicKeyByParam = function (b) {
    this.asn1SubjPKey = new KJUR.asn1.x509.SubjectPublicKeyInfo(b)
  };
  this.setSubjectPublicKeyByGetKey = function (c) {
    var b = KEYUTIL.getKey(c);
    this.asn1SubjPKey = new KJUR.asn1.x509.SubjectPublicKeyInfo(b)
  };
  this.appendExtension = function (b) {
    this.extensionsArray.push(b)
  };
  this.appendExtensionByName = function (c, b) {
    KJUR.asn1.x509.Extension.appendByNameToArray(c, b, this.extensionsArray)
  };
  this.getEncodedHex = function () {
    if (this.asn1NotBefore == null || this.asn1NotAfter == null) {
      throw "notBefore and/or notAfter not set"
    }
    var c = new KJUR.asn1.DERSequence({
      array: [this.asn1NotBefore, this.asn1NotAfter]
    });
    this.asn1Array = new Array();
    this.asn1Array.push(this.asn1Version);
    this.asn1Array.push(this.asn1SerialNumber);
    this.asn1Array.push(this.asn1SignatureAlg);
    this.asn1Array.push(this.asn1Issuer);
    this.asn1Array.push(c);
    this.asn1Array.push(this.asn1Subject);
    this.asn1Array.push(this.asn1SubjPKey);
    if (this.extensionsArray.length > 0) {
      var d = new KJUR.asn1.DERSequence({
        array: this.extensionsArray
      });
      var b = new KJUR.asn1.DERTaggedObject({
        explicit: true,
        tag: "a3",
        obj: d
      });
      this.asn1Array.push(b)
    }
    var e = new KJUR.asn1.DERSequence({
      array: this.asn1Array
    });
    this.hTLV = e.getEncodedHex();
    this.isModified = false;
    return this.hTLV
  };
  this._initialize()
};
YAHOO.lang.extend(KJUR.asn1.x509.TBSCertificate, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Extension = function (b) {
  KJUR.asn1.x509.Extension.superclass.constructor.call(this);
  var a = null;
  this.getEncodedHex = function () {
    var f = new KJUR.asn1.DERObjectIdentifier({
      oid: this.oid
    });
    var e = new KJUR.asn1.DEROctetString({
      hex: this.getExtnValueHex()
    });
    var d = new Array();
    d.push(f);
    if (this.critical) {
      d.push(new KJUR.asn1.DERBoolean())
    }
    d.push(e);
    var c = new KJUR.asn1.DERSequence({
      array: d
    });
    return c.getEncodedHex()
  };
  this.critical = false;
  if (typeof b != "undefined") {
    if (typeof b.critical != "undefined") {
      this.critical = b.critical
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.Extension, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Extension.appendByNameToArray = function (e, c, b) {
  if (e.toLowerCase() == "basicconstraints") {
    var d = new KJUR.asn1.x509.BasicConstraints(c);
    b.push(d)
  } else {
    if (e.toLowerCase() == "keyusage") {
      var d = new KJUR.asn1.x509.KeyUsage(c);
      b.push(d)
    } else {
      if (e.toLowerCase() == "crldistributionpoints") {
        var d = new KJUR.asn1.x509.CRLDistributionPoints(c);
        b.push(d)
      } else {
        if (e.toLowerCase() == "extkeyusage") {
          var d = new KJUR.asn1.x509.ExtKeyUsage(c);
          b.push(d)
        } else {
          if (e.toLowerCase() == "authoritykeyidentifier") {
            var d = new KJUR.asn1.x509.AuthorityKeyIdentifier(c);
            b.push(d)
          } else {
            if (e.toLowerCase() == "authorityinfoaccess") {
              var d = new KJUR.asn1.x509.AuthorityInfoAccess(c);
              b.push(d)
            } else {
              if (e.toLowerCase() == "subjectaltname") {
                var d = new KJUR.asn1.x509.SubjectAltName(c);
                b.push(d)
              } else {
                if (e.toLowerCase() == "issueraltname") {
                  var d = new KJUR.asn1.x509.IssuerAltName(c);
                  b.push(d)
                } else {
                  throw "unsupported extension name: " + e
                }
              }
            }
          }
        }
      }
    }
  }
};
KJUR.asn1.x509.KeyUsage = function (a) {
  KJUR.asn1.x509.KeyUsage.superclass.constructor.call(this, a);
  this.getExtnValueHex = function () {
    return this.asn1ExtnValue.getEncodedHex()
  };
  this.oid = "2.5.29.15";
  if (typeof a != "undefined") {
    if (typeof a.bin != "undefined") {
      this.asn1ExtnValue = new KJUR.asn1.DERBitString(a)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.KeyUsage, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.BasicConstraints = function (c) {
  KJUR.asn1.x509.BasicConstraints.superclass.constructor.call(this, c);
  var a = false;
  var b = -1;
  this.getExtnValueHex = function () {
    var e = new Array();
    if (this.cA) {
      e.push(new KJUR.asn1.DERBoolean())
    }
    if (this.pathLen > -1) {
      e.push(new KJUR.asn1.DERInteger({
        "int": this.pathLen
      }))
    }
    var d = new KJUR.asn1.DERSequence({
      array: e
    });
    this.asn1ExtnValue = d;
    return this.asn1ExtnValue.getEncodedHex()
  };
  this.oid = "2.5.29.19";
  this.cA = false;
  this.pathLen = -1;
  if (typeof c != "undefined") {
    if (typeof c.cA != "undefined") {
      this.cA = c.cA
    }
    if (typeof c.pathLen != "undefined") {
      this.pathLen = c.pathLen
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.BasicConstraints, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.CRLDistributionPoints = function (a) {
  KJUR.asn1.x509.CRLDistributionPoints.superclass.constructor.call(this, a);
  this.getExtnValueHex = function () {
    return this.asn1ExtnValue.getEncodedHex()
  };
  this.setByDPArray = function (b) {
    this.asn1ExtnValue = new KJUR.asn1.DERSequence({
      array: b
    })
  };
  this.setByOneURI = function (e) {
    var b = new KJUR.asn1.x509.GeneralNames([{
      uri: e
    }]);
    var d = new KJUR.asn1.x509.DistributionPointName(b);
    var c = new KJUR.asn1.x509.DistributionPoint({
      dpobj: d
    });
    this.setByDPArray([c])
  };
  this.oid = "2.5.29.31";
  if (typeof a != "undefined") {
    if (typeof a.array != "undefined") {
      this.setByDPArray(a.array)
    } else {
      if (typeof a.uri != "undefined") {
        this.setByOneURI(a.uri)
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRLDistributionPoints, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.ExtKeyUsage = function (a) {
  KJUR.asn1.x509.ExtKeyUsage.superclass.constructor.call(this, a);
  this.setPurposeArray = function (b) {
    this.asn1ExtnValue = new KJUR.asn1.DERSequence();
    for (var c = 0; c < b.length; c++) {
      var d = new KJUR.asn1.DERObjectIdentifier(b[c]);
      this.asn1ExtnValue.appendASN1Object(d)
    }
  };
  this.getExtnValueHex = function () {
    return this.asn1ExtnValue.getEncodedHex()
  };
  this.oid = "2.5.29.37";
  if (typeof a != "undefined") {
    if (typeof a.array != "undefined") {
      this.setPurposeArray(a.array)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.ExtKeyUsage, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.AuthorityKeyIdentifier = function (a) {
  KJUR.asn1.x509.AuthorityKeyIdentifier.superclass.constructor.call(this, a);
  this.asn1KID = null;
  this.asn1CertIssuer = null;
  this.asn1CertSN = null;
  this.getExtnValueHex = function () {
    var c = new Array();
    if (this.asn1KID) {
      c.push(new KJUR.asn1.DERTaggedObject({
        explicit: false,
        tag: "80",
        obj: this.asn1KID
      }))
    }
    if (this.asn1CertIssuer) {
      c.push(new KJUR.asn1.DERTaggedObject({
        explicit: false,
        tag: "a1",
        obj: this.asn1CertIssuer
      }))
    }
    if (this.asn1CertSN) {
      c.push(new KJUR.asn1.DERTaggedObject({
        explicit: false,
        tag: "82",
        obj: this.asn1CertSN
      }))
    }
    var b = new KJUR.asn1.DERSequence({
      array: c
    });
    this.asn1ExtnValue = b;
    return this.asn1ExtnValue.getEncodedHex()
  };
  this.setKIDByParam = function (b) {
    this.asn1KID = new KJUR.asn1.DEROctetString(b)
  };
  this.setCertIssuerByParam = function (b) {
    this.asn1CertIssuer = new KJUR.asn1.x509.X500Name(b)
  };
  this.setCertSNByParam = function (b) {
    this.asn1CertSN = new KJUR.asn1.DERInteger(b)
  };
  this.oid = "2.5.29.35";
  if (typeof a != "undefined") {
    if (typeof a.kid != "undefined") {
      this.setKIDByParam(a.kid)
    }
    if (typeof a.issuer != "undefined") {
      this.setCertIssuerByParam(a.issuer)
    }
    if (typeof a.sn != "undefined") {
      this.setCertSNByParam(a.sn)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.AuthorityKeyIdentifier, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.AuthorityInfoAccess = function (a) {
  KJUR.asn1.x509.AuthorityInfoAccess.superclass.constructor.call(this, a);
  this.setAccessDescriptionArray = function (c) {
    var g = new Array();
    for (var b = 0; b < c.length; b++) {
      var e = new KJUR.asn1.DERObjectIdentifier(c[b].accessMethod);
      var d = new KJUR.asn1.x509.GeneralName(c[b].accessLocation);
      var f = new KJUR.asn1.DERSequence({
        array: [e, d]
      });
      g.push(f)
    }
    this.asn1ExtnValue = new KJUR.asn1.DERSequence({
      array: g
    })
  };
  this.getExtnValueHex = function () {
    return this.asn1ExtnValue.getEncodedHex()
  };
  this.oid = "1.3.6.1.5.5.7.1.1";
  if (typeof a != "undefined") {
    if (typeof a.array != "undefined") {
      this.setAccessDescriptionArray(a.array)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.AuthorityInfoAccess, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.SubjectAltName = function (a) {
  KJUR.asn1.x509.SubjectAltName.superclass.constructor.call(this, a);
  this.setNameArray = function (b) {
    this.asn1ExtnValue = new KJUR.asn1.x509.GeneralNames(b)
  };
  this.getExtnValueHex = function () {
    return this.asn1ExtnValue.getEncodedHex()
  };
  this.oid = "2.5.29.17";
  if (a !== undefined) {
    if (a.array !== undefined) {
      this.setNameArray(a.array)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.SubjectAltName, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.IssuerAltName = function (a) {
  KJUR.asn1.x509.IssuerAltName.superclass.constructor.call(this, a);
  this.setNameArray = function (b) {
    this.asn1ExtnValue = new KJUR.asn1.x509.GeneralNames(b)
  };
  this.getExtnValueHex = function () {
    return this.asn1ExtnValue.getEncodedHex()
  };
  this.oid = "2.5.29.18";
  if (a !== undefined) {
    if (a.array !== undefined) {
      this.setNameArray(a.array)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.IssuerAltName, KJUR.asn1.x509.Extension);
KJUR.asn1.x509.CRL = function (f) {
  KJUR.asn1.x509.CRL.superclass.constructor.call(this);
  var a = null;
  var c = null;
  var e = null;
  var b = null;
  var d = null;
  this.setRsaPrvKeyByPEMandPass = function (h, j) {
    var g = PKCS5PKEY.getDecryptedKeyHex(h, j);
    var i = new RSAKey();
    i.readPrivateKeyFromASN1HexString(g);
    this.rsaPrvKey = i
  };
  this.sign = function () {
    this.asn1SignatureAlg = this.asn1TBSCertList.asn1SignatureAlg;
    sig = new KJUR.crypto.Signature({
      alg: "SHA1withRSA",
      prov: "cryptojs/jsrsa"
    });
    sig.initSign(this.rsaPrvKey);
    sig.updateHex(this.asn1TBSCertList.getEncodedHex());
    this.hexSig = sig.sign();
    this.asn1Sig = new KJUR.asn1.DERBitString({
      hex: "00" + this.hexSig
    });
    var g = new KJUR.asn1.DERSequence({
      array: [this.asn1TBSCertList, this.asn1SignatureAlg, this.asn1Sig]
    });
    this.hTLV = g.getEncodedHex();
    this.isModified = false
  };
  this.getEncodedHex = function () {
    if (this.isModified == false && this.hTLV != null) {
      return this.hTLV
    }
    throw "not signed yet"
  };
  this.getPEMString = function () {
    var i = this.getEncodedHex();
    var g = CryptoJS.enc.Hex.parse(i);
    var h = CryptoJS.enc.Base64.stringify(g);
    var j = h.replace(/(.{64})/g, "$1\r\n");
    return "-----BEGIN X509 CRL-----\r\n" + j + "\r\n-----END X509 CRL-----\r\n"
  };
  if (typeof f != "undefined") {
    if (typeof f.tbsobj != "undefined") {
      this.asn1TBSCertList = f.tbsobj
    }
    if (typeof f.rsaprvkey != "undefined") {
      this.rsaPrvKey = f.rsaprvkey
    }
    if ((typeof f.rsaprvpem != "undefined") && (typeof f.rsaprvpas != "undefined")) {
      this.setRsaPrvKeyByPEMandPass(f.rsaprvpem, f.rsaprvpas)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRL, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.TBSCertList = function (b) {
  KJUR.asn1.x509.TBSCertList.superclass.constructor.call(this);
  var a = null;
  this.setSignatureAlgByParam = function (c) {
    this.asn1SignatureAlg = new KJUR.asn1.x509.AlgorithmIdentifier(c)
  };
  this.setIssuerByParam = function (c) {
    this.asn1Issuer = new KJUR.asn1.x509.X500Name(c)
  };
  this.setThisUpdateByParam = function (c) {
    this.asn1ThisUpdate = new KJUR.asn1.x509.Time(c)
  };
  this.setNextUpdateByParam = function (c) {
    this.asn1NextUpdate = new KJUR.asn1.x509.Time(c)
  };
  this.addRevokedCert = function (c, d) {
    var f = {};
    if (c != undefined && c != null) {
      f.sn = c
    }
    if (d != undefined && d != null) {
      f.time = d
    }
    var e = new KJUR.asn1.x509.CRLEntry(f);
    this.aRevokedCert.push(e)
  };
  this.getEncodedHex = function () {
    this.asn1Array = new Array();
    if (this.asn1Version != null) {
      this.asn1Array.push(this.asn1Version)
    }
    this.asn1Array.push(this.asn1SignatureAlg);
    this.asn1Array.push(this.asn1Issuer);
    this.asn1Array.push(this.asn1ThisUpdate);
    if (this.asn1NextUpdate != null) {
      this.asn1Array.push(this.asn1NextUpdate)
    }
    if (this.aRevokedCert.length > 0) {
      var c = new KJUR.asn1.DERSequence({
        array: this.aRevokedCert
      });
      this.asn1Array.push(c)
    }
    var d = new KJUR.asn1.DERSequence({
      array: this.asn1Array
    });
    this.hTLV = d.getEncodedHex();
    this.isModified = false;
    return this.hTLV
  };
  this._initialize = function () {
    this.asn1Version = null;
    this.asn1SignatureAlg = null;
    this.asn1Issuer = null;
    this.asn1ThisUpdate = null;
    this.asn1NextUpdate = null;
    this.aRevokedCert = new Array()
  };
  this._initialize()
};
YAHOO.lang.extend(KJUR.asn1.x509.TBSCertList, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.CRLEntry = function (c) {
  KJUR.asn1.x509.CRLEntry.superclass.constructor.call(this);
  var b = null;
  var a = null;
  this.setCertSerial = function (d) {
    this.sn = new KJUR.asn1.DERInteger(d)
  };
  this.setRevocationDate = function (d) {
    this.time = new KJUR.asn1.x509.Time(d)
  };
  this.getEncodedHex = function () {
    var d = new KJUR.asn1.DERSequence({
      array: [this.sn, this.time]
    });
    this.TLV = d.getEncodedHex();
    return this.TLV
  };
  if (typeof c != "undefined") {
    if (typeof c.time != "undefined") {
      this.setRevocationDate(c.time)
    }
    if (typeof c.sn != "undefined") {
      this.setCertSerial(c.sn)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.CRLEntry, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.X500Name = function (b) {
  KJUR.asn1.x509.X500Name.superclass.constructor.call(this);
  this.asn1Array = new Array();
  this.setByString = function (c) {
    var d = c.split("/");
    d.shift();
    for (var e = 0; e < d.length; e++) {
      this.asn1Array.push(new KJUR.asn1.x509.RDN({
        str: d[e]
      }))
    }
  };
  this.setByLdapString = function (c) {
    var d = KJUR.asn1.x509.X500Name.ldapToOneline(c);
    this.setByString(d)
  };
  this.setByObject = function (e) {
    for (var c in e) {
      if (e.hasOwnProperty(c)) {
        var d = new KJUR.asn1.x509.RDN({
          str: c + "=" + e[c]
        });
        this.asn1Array ? this.asn1Array.push(d) : this.asn1Array = [d]
      }
    }
  };
  this.getEncodedHex = function () {
    if (typeof this.hTLV == "string") {
      return this.hTLV
    }
    var c = new KJUR.asn1.DERSequence({
      array: this.asn1Array
    });
    this.hTLV = c.getEncodedHex();
    return this.hTLV
  };
  if (b !== undefined) {
    if (b.str !== undefined) {
      this.setByString(b.str)
    } else {
      if (b.ldapstr !== undefined) {
        this.setByLdapString(b.ldapstr)
      } else {
        if (typeof b === "object") {
          this.setByObject(b)
        }
      }
    }
    if (b.certissuer !== undefined) {
      var a = new X509();
      a.hex = ASN1HEX.pemToHex(b.certissuer);
      this.hTLV = a.getIssuerHex()
    }
    if (b.certsubject !== undefined) {
      var a = new X509();
      a.hex = ASN1HEX.pemToHex(b.certsubject);
      this.hTLV = a.getSubjectHex()
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.X500Name, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.X500Name.onelineToLDAP = function (d) {
  if (d.substr(0, 1) !== "/") {
    throw "malformed input"
  }
  var b = "";
  d = d.substr(1);
  var c = d.split("/");
  c.reverse();
  c = c.map(function (a) {
    return a.replace(/,/, "\\,")
  });
  return c.join(",")
};
KJUR.asn1.x509.X500Name.ldapToOneline = function (g) {
  var c = g.split(",");
  var e = false;
  var b = [];
  for (var f = 0; c.length > 0; f++) {
    var h = c.shift();
    if (e === true) {
      var d = b.pop();
      var j = (d + "," + h).replace(/\\,/g, ",");
      b.push(j);
      e = false
    } else {
      b.push(h)
    }
    if (h.substr(- 1, 1) === "\\") {
      e = true
    }
  }
  b = b.map(function (a) {
    return a.replace("/", "\\/")
  });
  b.reverse();
  return "/" + b.join("/")
};
KJUR.asn1.x509.RDN = function (a) {
  KJUR.asn1.x509.RDN.superclass.constructor.call(this);
  this.asn1Array = new Array();
  this.addByString = function (b) {
    this.asn1Array.push(new KJUR.asn1.x509.AttributeTypeAndValue({
      str: b
    }))
  };
  this.addByMultiValuedString = function (d) {
    var b = KJUR.asn1.x509.RDN.parseString(d);
    for (var c = 0; c < b.length; c++) {
      this.addByString(b[c])
    }
  };
  this.getEncodedHex = function () {
    var b = new KJUR.asn1.DERSet({
      array: this.asn1Array
    });
    this.TLV = b.getEncodedHex();
    return this.TLV
  };
  if (typeof a != "undefined") {
    if (typeof a.str != "undefined") {
      this.addByMultiValuedString(a.str)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.RDN, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.RDN.parseString = function (m) {
  var j = m.split(/\+/);
  var h = false;
  var c = [];
  for (var g = 0; j.length > 0; g++) {
    var k = j.shift();
    if (h === true) {
      var f = c.pop();
      var d = (f + "+" + k).replace(/\\\+/g, "+");
      c.push(d);
      h = false
    } else {
      c.push(k)
    }
    if (k.substr(- 1, 1) === "\\") {
      h = true
    }
  }
  var l = false;
  var b = [];
  for (var g = 0; c.length > 0; g++) {
    var k = c.shift();
    if (l === true) {
      var e = b.pop();
      if (k.match(/"$/)) {
        var d = (e + "+" + k).replace(/^([^=]+)="(.*)"$/, "$1=$2");
        b.push(d);
        l = false
      } else {
        b.push(e + "+" + k)
      }
    } else {
      b.push(k)
    }
    if (k.match(/^[^=]+="/)) {
      l = true
    }
  }
  return b
};
KJUR.asn1.x509.AttributeTypeAndValue = function (b) {
  KJUR.asn1.x509.AttributeTypeAndValue.superclass.constructor.call(this);
  var d = null;
  var c = null;
  var a = "utf8";
  this.setByString = function (f) {
    var e = f.match(/^([^=]+)=(.+)$/);
    if (e) {
      this.setByAttrTypeAndValueStr(e[1], e[2])
    } else {
      throw "malformed attrTypeAndValueStr: " + f
    }
  };
  this.setByAttrTypeAndValueStr = function (g, f) {
    this.typeObj = KJUR.asn1.x509.OID.atype2obj(g);
    var e = a;
    if (g == "C") {
      e = "prn"
    }
    this.valueObj = this.getValueObj(e, f)
  };
  this.getValueObj = function (f, e) {
    if (f == "utf8") {
      return new KJUR.asn1.DERUTF8String({
        str: e
      })
    }
    if (f == "prn") {
      return new KJUR.asn1.DERPrintableString({
        str: e
      })
    }
    if (f == "tel") {
      return new KJUR.asn1.DERTeletexString({
        str: e
      })
    }
    if (f == "ia5") {
      return new KJUR.asn1.DERIA5String({
        str: e
      })
    }
    throw "unsupported directory string type: type=" + f + " value=" + e
  };
  this.getEncodedHex = function () {
    var e = new KJUR.asn1.DERSequence({
      array: [this.typeObj, this.valueObj]
    });
    this.TLV = e.getEncodedHex();
    return this.TLV
  };
  if (typeof b != "undefined") {
    if (typeof b.str != "undefined") {
      this.setByString(b.str)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.AttributeTypeAndValue, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.SubjectPublicKeyInfo = function (d) {
  KJUR.asn1.x509.SubjectPublicKeyInfo.superclass.constructor.call(this);
  var b = null;
  var c = null;
  var a = null;
  this.setRSAKey = function (e) {
    if (!RSAKey.prototype.isPrototypeOf(e)) {
      throw "argument is not RSAKey instance"
    }
    this.rsaKey = e;
    var g = new KJUR.asn1.DERInteger({
      bigint: e.n
    });
    var f = new KJUR.asn1.DERInteger({
      "int": e.e
    });
    var i = new KJUR.asn1.DERSequence({
      array: [g, f]
    });
    var h = i.getEncodedHex();
    this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({
      name: "rsaEncryption"
    });
    this.asn1SubjPKey = new KJUR.asn1.DERBitString({
      hex: "00" + h
    })
  };
  this.setRSAPEM = function (g) {
    if (g.match(/-----BEGIN PUBLIC KEY-----/)) {
      var n = g;
      n = n.replace(/^-----[^-]+-----/, "");
      n = n.replace(/-----[^-]+-----\s*$/, "");
      var m = n.replace(/\s+/g, "");
      var f = CryptoJS.enc.Base64.parse(m);
      var i = CryptoJS.enc.Hex.stringify(f);
      var k = RSAKey.getHexValueArrayOfChildrenFromHex(i);
      var h = k[1];
      var l = h.substr(2);
      var e = RSAKey.getHexValueArrayOfChildrenFromHex(l);
      var j = new RSAKey();
      j.setPublic(e[0], e[1]);
      this.setRSAKey(j)
    } else {
      throw "key not supported"
    }
  };
  this.getASN1Object = function () {
    if (this.asn1AlgId == null || this.asn1SubjPKey == null) {
      throw "algId and/or subjPubKey not set"
    }
    var e = new KJUR.asn1.DERSequence({
      array: [this.asn1AlgId, this.asn1SubjPKey]
    });
    return e
  };
  this.getEncodedHex = function () {
    var e = this.getASN1Object();
    this.hTLV = e.getEncodedHex();
    return this.hTLV
  };
  this._setRSAKey = function (e) {
    var g = KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": {
          bigint: e.n
        }
      },
      {
        "int": {
          "int": e.e
        }
      }]
    });
    var f = g.getEncodedHex();
    this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({
      name: "rsaEncryption"
    });
    this.asn1SubjPKey = new KJUR.asn1.DERBitString({
      hex: "00" + f
    })
  };
  this._setEC = function (e) {
    var f = new KJUR.asn1.DERObjectIdentifier({
      name: e.curveName
    });
    this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({
      name: "ecPublicKey",
      asn1params: f
    });
    this.asn1SubjPKey = new KJUR.asn1.DERBitString({
      hex: "00" + e.pubKeyHex
    })
  };
  this._setDSA = function (e) {
    var f = new KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": {
          bigint: e.p
        }
      },
      {
        "int": {
          bigint: e.q
        }
      },
      {
        "int": {
          bigint: e.g
        }
      }]
    });
    this.asn1AlgId = new KJUR.asn1.x509.AlgorithmIdentifier({
      name: "dsa",
      asn1params: f
    });
    var g = new KJUR.asn1.DERInteger({
      bigint: e.y
    });
    this.asn1SubjPKey = new KJUR.asn1.DERBitString({
      hex: "00" + g.getEncodedHex()
    })
  };
  if (typeof d != "undefined") {
    if (typeof RSAKey != "undefined" && d instanceof RSAKey) {
      this._setRSAKey(d)
    } else {
      if (typeof KJUR.crypto.ECDSA != "undefined" && d instanceof KJUR.crypto.ECDSA) {
        this._setEC(d)
      } else {
        if (typeof KJUR.crypto.DSA != "undefined" && d instanceof KJUR.crypto.DSA) {
          this._setDSA(d)
        } else {
          if (typeof d.rsakey != "undefined") {
            this.setRSAKey(d.rsakey)
          } else {
            if (typeof d.rsapem != "undefined") {
              this.setRSAPEM(d.rsapem)
            }
          }
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.SubjectPublicKeyInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.Time = function (c) {
  KJUR.asn1.x509.Time.superclass.constructor.call(this);
  var b = null;
  var a = null;
  this.setTimeParams = function (d) {
    this.timeParams = d
  };
  this.getEncodedHex = function () {
    var d = null;
    if (this.timeParams != null) {
      if (this.type == "utc") {
        d = new KJUR.asn1.DERUTCTime(this.timeParams)
      } else {
        d = new KJUR.asn1.DERGeneralizedTime(this.timeParams)
      }
    } else {
      if (this.type == "utc") {
        d = new KJUR.asn1.DERUTCTime()
      } else {
        d = new KJUR.asn1.DERGeneralizedTime()
      }
    }
    this.TLV = d.getEncodedHex();
    return this.TLV
  };
  this.type = "utc";
  if (typeof c != "undefined") {
    if (typeof c.type != "undefined") {
      this.type = c.type
    } else {
      if (typeof c.str != "undefined") {
        if (c.str.match(/^[0-9]{12}Z$/)) {
          this.type = "utc"
        }
        if (c.str.match(/^[0-9]{14}Z$/)) {
          this.type = "gen"
        }
      }
    }
    this.timeParams = c
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.Time, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.AlgorithmIdentifier = function (b) {
  KJUR.asn1.x509.AlgorithmIdentifier.superclass.constructor.call(this);
  this.nameAlg = null;
  this.asn1Alg = null;
  this.asn1Params = null;
  this.paramEmpty = false;
  this.getEncodedHex = function () {
    if (this.nameAlg === null && this.asn1Alg === null) {
      throw "algorithm not specified"
    }
    if (this.nameAlg !== null && this.asn1Alg === null) {
      this.asn1Alg = KJUR.asn1.x509.OID.name2obj(this.nameAlg)
    }
    var c = [this.asn1Alg];
    if (this.asn1Params !== null) {
      c.push(this.asn1Params)
    }
    var d = new KJUR.asn1.DERSequence({
      array: c
    });
    this.hTLV = d.getEncodedHex();
    return this.hTLV
  };
  if (b !== undefined) {
    if (b.name !== undefined) {
      this.nameAlg = b.name
    }
    if (b.asn1params !== undefined) {
      this.asn1Params = b.asn1params
    }
    if (b.paramempty !== undefined) {
      this.paramEmpty = b.paramempty
    }
  }
  if (this.asn1Params === null && this.paramEmpty === false && this.nameAlg !== null) {
    var a = this.nameAlg.toLowerCase();
    if (a.substr(- 7, 7) !== "withdsa" && a.substr(- 9, 9) !== "withecdsa") {
      this.asn1Params = new KJUR.asn1.DERNull()
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.AlgorithmIdentifier, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.GeneralName = function (d) {
  KJUR.asn1.x509.GeneralName.superclass.constructor.call(this);
  var c = null;
  var b = null;
  var a = {
    rfc822: "81",
    dns: "82",
    dn: "a4",
    uri: "86"
  };
  this.explicit = false;
  this.setByParam = function (k) {
    var j = null;
    var g = null;
    if (k === undefined) {
      return
    }
    if (k.rfc822 !== undefined) {
      this.type = "rfc822";
      g = new KJUR.asn1.DERIA5String({
        str: k[this.type]
      })
    }
    if (k.dns !== undefined) {
      this.type = "dns";
      g = new KJUR.asn1.DERIA5String({
        str: k[this.type]
      })
    }
    if (k.uri !== undefined) {
      this.type = "uri";
      g = new KJUR.asn1.DERIA5String({
        str: k[this.type]
      })
    }
    if (k.dn !== undefined) {
      this.type = "dn";
      g = new KJUR.asn1.x509.X500Name({
        str: k.dn
      })
    }
    if (k.ldapdn !== undefined) {
      this.type = "dn";
      g = new KJUR.asn1.x509.X500Name({
        ldapstr: k.ldapdn
      })
    }
    if (k.certissuer !== undefined) {
      this.type = "dn";
      this.explicit = true;
      var h = k.certissuer;
      var f = null;
      if (h.match(/^[0-9A-Fa-f]+$/)) {
        f == h
      }
      if (h.indexOf("-----BEGIN ") != -1) {
        f = ASN1HEX.pemToHex(h)
      }
      if (f == null) {
        throw "certissuer param not cert"
      }
      var e = new X509();
      e.hex = f;
      var i = e.getIssuerHex();
      g = new KJUR.asn1.ASN1Object();
      g.hTLV = i
    }
    if (k.certsubj !== undefined) {
      this.type = "dn";
      this.explicit = true;
      var h = k.certsubj;
      var f = null;
      if (h.match(/^[0-9A-Fa-f]+$/)) {
        f == h
      }
      if (h.indexOf("-----BEGIN ") != -1) {
        f = ASN1HEX.pemToHex(h)
      }
      if (f == null) {
        throw "certsubj param not cert"
      }
      var e = new X509();
      e.hex = f;
      var i = e.getSubjectHex();
      g = new KJUR.asn1.ASN1Object();
      g.hTLV = i
    }
    if (this.type == null) {
      throw "unsupported type in params=" + k
    }
    this.asn1Obj = new KJUR.asn1.DERTaggedObject({
      explicit: this.explicit,
      tag: a[this.type],
      obj: g
    })
  };
  this.getEncodedHex = function () {
    return this.asn1Obj.getEncodedHex()
  };
  if (d !== undefined) {
    this.setByParam(d)
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.GeneralName, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.GeneralNames = function (b) {
  KJUR.asn1.x509.GeneralNames.superclass.constructor.call(this);
  var a = null;
  this.setByParamArray = function (e) {
    for (var c = 0; c < e.length; c++) {
      var d = new KJUR.asn1.x509.GeneralName(e[c]);
      this.asn1Array.push(d)
    }
  };
  this.getEncodedHex = function () {
    var c = new KJUR.asn1.DERSequence({
      array: this.asn1Array
    });
    return c.getEncodedHex()
  };
  this.asn1Array = new Array();
  if (typeof b != "undefined") {
    this.setByParamArray(b)
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.GeneralNames, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.DistributionPointName = function (b) {
  KJUR.asn1.x509.DistributionPointName.superclass.constructor.call(this);
  var e = null;
  var c = null;
  var a = null;
  var d = null;
  this.getEncodedHex = function () {
    if (this.type != "full") {
      throw "currently type shall be 'full': " + this.type
    }
    this.asn1Obj = new KJUR.asn1.DERTaggedObject({
      explicit: false,
      tag: this.tag,
      obj: this.asn1V
    });
    this.hTLV = this.asn1Obj.getEncodedHex();
    return this.hTLV
  };
  if (typeof b != "undefined") {
    if (KJUR.asn1.x509.GeneralNames.prototype.isPrototypeOf(b)) {
      this.type = "full";
      this.tag = "a0";
      this.asn1V = b
    } else {
      throw "This class supports GeneralNames only as argument"
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.DistributionPointName, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.DistributionPoint = function (b) {
  KJUR.asn1.x509.DistributionPoint.superclass.constructor.call(this);
  var a = null;
  this.getEncodedHex = function () {
    var c = new KJUR.asn1.DERSequence();
    if (this.asn1DP != null) {
      var d = new KJUR.asn1.DERTaggedObject({
        explicit: true,
        tag: "a0",
        obj: this.asn1DP
      });
      c.appendASN1Object(d)
    }
    this.hTLV = c.getEncodedHex();
    return this.hTLV
  };
  if (typeof b != "undefined") {
    if (typeof b.dpobj != "undefined") {
      this.asn1DP = b.dpobj
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.x509.DistributionPoint, KJUR.asn1.ASN1Object);
KJUR.asn1.x509.OID = new
  function (a) {
    this.atype2oidList = {
      CN: "2.5.4.3",
      L: "2.5.4.7",
      ST: "2.5.4.8",
      O: "2.5.4.10",
      OU: "2.5.4.11",
      C: "2.5.4.6",
      STREET: "2.5.4.9",
      DC: "0.9.2342.19200300.100.1.25",
      UID: "0.9.2342.19200300.100.1.1",
      SN: "2.5.4.4",
      DN: "2.5.4.49",
      E: "1.2.840.113549.1.9.1",
      businessCategory: "2.5.4.15",
      postalCode: "2.5.4.17",
      jurisdictionOfIncorporationL: "1.3.6.1.4.1.311.60.2.1.1",
      jurisdictionOfIncorporationSP: "1.3.6.1.4.1.311.60.2.1.2",
      jurisdictionOfIncorporationC: "1.3.6.1.4.1.311.60.2.1.3"
    };
    this.name2oidList = {
      sha1: "1.3.14.3.2.26",
      sha256: "2.16.840.1.101.3.4.2.1",
      sha384: "2.16.840.1.101.3.4.2.2",
      sha512: "2.16.840.1.101.3.4.2.3",
      sha224: "2.16.840.1.101.3.4.2.4",
      md5: "1.2.840.113549.2.5",
      md2: "1.3.14.7.2.2.1",
      ripemd160: "1.3.36.3.2.1",
      MD2withRSA: "1.2.840.113549.1.1.2",
      MD4withRSA: "1.2.840.113549.1.1.3",
      MD5withRSA: "1.2.840.113549.1.1.4",
      SHA1withRSA: "1.2.840.113549.1.1.5",
      SHA224withRSA: "1.2.840.113549.1.1.14",
      SHA256withRSA: "1.2.840.113549.1.1.11",
      SHA384withRSA: "1.2.840.113549.1.1.12",
      SHA512withRSA: "1.2.840.113549.1.1.13",
      SHA1withECDSA: "1.2.840.10045.4.1",
      SHA224withECDSA: "1.2.840.10045.4.3.1",
      SHA256withECDSA: "1.2.840.10045.4.3.2",
      SHA384withECDSA: "1.2.840.10045.4.3.3",
      SHA512withECDSA: "1.2.840.10045.4.3.4",
      dsa: "1.2.840.10040.4.1",
      SHA1withDSA: "1.2.840.10040.4.3",
      SHA224withDSA: "2.16.840.1.101.3.4.3.1",
      SHA256withDSA: "2.16.840.1.101.3.4.3.2",
      rsaEncryption: "1.2.840.113549.1.1.1",
      commonName: "2.5.4.3",
      localityName: "2.5.4.7",
      stateOrProvinceName: "2.5.4.8",
      organizationName: "2.5.4.10",
      organizationalUnitName: "2.5.4.11",
      countryName: "2.5.4.6",
      streetAddress: "2.5.4.9",
      domainComponent: "0.9.2342.19200300.100.1.25",
      userId: "0.9.2342.19200300.100.1.1",
      surname: "2.5.4.4",
      distinguishedName: "2.5.4.49",
      emailAddress: "1.2.840.113549.1.9.1",
      businessCategory: "2.5.4.15",
      postalCode: "2.5.4.17",
      jurisdictionOfIncorporationL: "1.3.6.1.4.1.311.60.2.1.1",
      jurisdictionOfIncorporationSP: "1.3.6.1.4.1.311.60.2.1.2",
      jurisdictionOfIncorporationC: "1.3.6.1.4.1.311.60.2.1.3",
      subjectKeyIdentifier: "2.5.29.14",
      keyUsage: "2.5.29.15",
      subjectAltName: "2.5.29.17",
      issuerAltName: "2.5.29.18",
      basicConstraints: "2.5.29.19",
      nameConstraints: "2.5.29.30",
      cRLDistributionPoints: "2.5.29.31",
      certificatePolicies: "2.5.29.32",
      authorityKeyIdentifier: "2.5.29.35",
      policyConstraints: "2.5.29.36",
      extKeyUsage: "2.5.29.37",
      authorityInfoAccess: "1.3.6.1.5.5.7.1.1",
      ocsp: "1.3.6.1.5.5.7.48.1",
      caIssuers: "1.3.6.1.5.5.7.48.2",
      anyExtendedKeyUsage: "2.5.29.37.0",
      serverAuth: "1.3.6.1.5.5.7.3.1",
      clientAuth: "1.3.6.1.5.5.7.3.2",
      codeSigning: "1.3.6.1.5.5.7.3.3",
      emailProtection: "1.3.6.1.5.5.7.3.4",
      timeStamping: "1.3.6.1.5.5.7.3.8",
      ocspSigning: "1.3.6.1.5.5.7.3.9",
      ecPublicKey: "1.2.840.10045.2.1",
      secp256r1: "1.2.840.10045.3.1.7",
      secp256k1: "1.3.132.0.10",
      secp384r1: "1.3.132.0.34",
      pkcs5PBES2: "1.2.840.113549.1.5.13",
      pkcs5PBKDF2: "1.2.840.113549.1.5.12",
      "des-EDE3-CBC": "1.2.840.113549.3.7",
      data: "1.2.840.113549.1.7.1",
      "signed-data": "1.2.840.113549.1.7.2",
      "enveloped-data": "1.2.840.113549.1.7.3",
      "digested-data": "1.2.840.113549.1.7.5",
      "encrypted-data": "1.2.840.113549.1.7.6",
      "authenticated-data": "1.2.840.113549.1.9.16.1.2",
      tstinfo: "1.2.840.113549.1.9.16.1.4",
      extensionRequest: "1.2.840.113549.1.9.14",
    };
    this.objCache = {};
    this.name2obj = function (b) {
      if (typeof this.objCache[b] != "undefined") {
        return this.objCache[b]
      }
      if (typeof this.name2oidList[b] == "undefined") {
        throw "Name of ObjectIdentifier not defined: " + b
      }
      var c = this.name2oidList[b];
      var d = new KJUR.asn1.DERObjectIdentifier({
        oid: c
      });
      this.objCache[b] = d;
      return d
    };
    this.atype2obj = function (b) {
      if (typeof this.objCache[b] != "undefined") {
        return this.objCache[b]
      }
      if (typeof this.atype2oidList[b] == "undefined") {
        throw "AttributeType name undefined: " + b
      }
      var c = this.atype2oidList[b];
      var d = new KJUR.asn1.DERObjectIdentifier({
        oid: c
      });
      this.objCache[b] = d;
      return d
    }
  };
KJUR.asn1.x509.OID.oid2name = function (b) {
  var c = KJUR.asn1.x509.OID.name2oidList;
  for (var a in c) {
    if (c[a] == b) {
      return a
    }
  }
  return ""
};
KJUR.asn1.x509.OID.oid2atype = function (b) {
  var c = KJUR.asn1.x509.OID.atype2oidList;
  for (var a in c) {
    if (c[a] == b) {
      return a
    }
  }
  return b
};
KJUR.asn1.x509.OID.name2oid = function (a) {
  var b = KJUR.asn1.x509.OID.name2oidList;
  if (b[a] === undefined) {
    return ""
  }
  return b[a]
};
KJUR.asn1.x509.X509Util = new
  function () {
    this.getPKCS8PubKeyPEMfromRSAKey = function (i) {
      var h = null;
      var f = KJUR.asn1.ASN1Util.bigIntToMinTwosComplementsHex(i.n);
      var j = KJUR.asn1.ASN1Util.integerToByteHex(i.e);
      var a = new KJUR.asn1.DERInteger({
        hex: f
      });
      var g = new KJUR.asn1.DERInteger({
        hex: j
      });
      var l = new KJUR.asn1.DERSequence({
        array: [a, g]
      });
      var c = l.getEncodedHex();
      var d = new KJUR.asn1.x509.AlgorithmIdentifier({
        name: "rsaEncryption"
      });
      var b = new KJUR.asn1.DERBitString({
        hex: "00" + c
      });
      var k = new KJUR.asn1.DERSequence({
        array: [d, b]
      });
      var e = k.getEncodedHex();
      var h = KJUR.asn1.ASN1Util.getPEMStringFromHex(e, "PUBLIC KEY");
      return h
    }
  };
KJUR.asn1.x509.X509Util.newCertPEM = function (f) {
  var c = KJUR.asn1.x509;
  var e = new c.TBSCertificate();
  if (f.serial !== undefined) {
    e.setSerialNumberByParam(f.serial)
  } else {
    throw "serial number undefined."
  }
  if (typeof f.sigalg.name === "string") {
    e.setSignatureAlgByParam(f.sigalg)
  } else {
    throw "unproper signature algorithm name"
  }
  if (f.issuer !== undefined) {
    e.setIssuerByParam(f.issuer)
  } else {
    throw "issuer name undefined."
  }
  if (f.notbefore !== undefined) {
    e.setNotBeforeByParam(f.notbefore)
  } else {
    throw "notbefore undefined."
  }
  if (f.notafter !== undefined) {
    e.setNotAfterByParam(f.notafter)
  } else {
    throw "notafter undefined."
  }
  if (f.subject !== undefined) {
    e.setSubjectByParam(f.subject)
  } else {
    throw "subject name undefined."
  }
  if (f.sbjpubkey !== undefined) {
    e.setSubjectPublicKeyByGetKey(f.sbjpubkey)
  } else {
    throw "subject public key undefined."
  }
  if (f.ext !== undefined && f.ext.length !== undefined) {
    for (var b = 0; b < f.ext.length; b++) {
      for (key in f.ext[b]) {
        e.appendExtensionByName(key, f.ext[b][key])
      }
    }
  }
  if (f.cakey === undefined && f.sighex === undefined) {
    throw "param cakey and sighex undefined."
  }
  var d = null;
  var a = null;
  if (f.cakey) {
    if (f.cakey.isPrivate === true) {
      d = f.cakey
    } else {
      d = KEYUTIL.getKey.apply(null, f.cakey)
    }
    a = new c.Certificate({
      tbscertobj: e,
      prvkeyobj: d
    });
    a.sign()
  }
  if (f.sighex) {
    a = new c.Certificate({
      tbscertobj: e
    });
    a.setSignatureHex(f.sighex)
  }
  return a.getPEMString()
};
/*! asn1cms-1.0.3.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {}
}
if (typeof KJUR.asn1.cms == "undefined" || !KJUR.asn1.cms) {
  KJUR.asn1.cms = {}
}
KJUR.asn1.cms.Attribute = function (b) {
  KJUR.asn1.cms.Attribute.superclass.constructor.call(this);
  var a = [];
  this.getEncodedHex = function () {
    var f, e, c;
    f = new KJUR.asn1.DERObjectIdentifier({
      oid: this.attrTypeOid
    });
    e = new KJUR.asn1.DERSet({
      array: this.valueList
    });
    try {
      e.getEncodedHex()
    } catch (d) {
      throw "fail valueSet.getEncodedHex in Attribute(1)/" + d
    }
    c = new KJUR.asn1.DERSequence({
      array: [f, e]
    });
    try {
      this.hTLV = c.getEncodedHex()
    } catch (d) {
      throw "failed seq.getEncodedHex in Attribute(2)/" + d
    }
    return this.hTLV
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.Attribute, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.ContentType = function (b) {
  KJUR.asn1.cms.ContentType.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.3";
  var a = null;
  if (typeof b != "undefined") {
    var a = new KJUR.asn1.DERObjectIdentifier(b);
    this.valueList = [a]
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.ContentType, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.MessageDigest = function (e) {
  KJUR.asn1.cms.MessageDigest.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.4";
  if (typeof e != "undefined") {
    if (e.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo && typeof e.hashAlg == "string") {
      var b = e.eciObj.eContentValueHex;
      var a = e.hashAlg;
      var c = KJUR.crypto.Util.hashHex(b, a);
      var d = new KJUR.asn1.DEROctetString({
        hex: c
      });
      d.getEncodedHex();
      this.valueList = [d]
    } else {
      var d = new KJUR.asn1.DEROctetString(e);
      d.getEncodedHex();
      this.valueList = [d]
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.MessageDigest, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningTime = function (c) {
  KJUR.asn1.cms.SigningTime.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.5";
  if (typeof c != "undefined") {
    var a = new KJUR.asn1.x509.Time(c);
    try {
      a.getEncodedHex()
    } catch (b) {
      throw "SigningTime.getEncodedHex() failed/" + b
    }
    this.valueList = [a]
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningTime, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningCertificate = function (d) {
  KJUR.asn1.cms.SigningCertificate.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.12";
  var a = KJUR.asn1;
  var c = KJUR.asn1.cms;
  var b = KJUR.crypto;
  this.setCerts = function (l) {
    var j = [];
    for (var h = 0; h < l.length; h++) {
      var f = ASN1HEX.pemToHex(l[h]);
      var e = b.Util.hashHex(f, "sha1");
      var m = new a.DEROctetString({
        hex: e
      });
      m.getEncodedHex();
      var k = new c.IssuerAndSerialNumber({
        cert: l[h]
      });
      k.getEncodedHex();
      var n = new a.DERSequence({
        array: [m, k]
      });
      n.getEncodedHex();
      j.push(n)
    }
    var g = new a.DERSequence({
      array: j
    });
    g.getEncodedHex();
    this.valueList = [g]
  };
  if (typeof d != "undefined") {
    if (typeof d.array == "object") {
      this.setCerts(d.array)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificate, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.SigningCertificateV2 = function (e) {
  KJUR.asn1.cms.SigningCertificateV2.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.47";
  var b = KJUR.asn1;
  var f = KJUR.asn1.x509;
  var d = KJUR.asn1.cms;
  var c = KJUR.crypto;
  this.setCerts = function (p, h) {
    var n = [];
    for (var l = 0; l < p.length; l++) {
      var j = ASN1HEX.pemToHex(p[l]);
      var r = [];
      if (h != "sha256") {
        r.push(new f.AlgorithmIdentifier({
          name: h
        }))
      }
      var g = c.Util.hashHex(j, h);
      var q = new b.DEROctetString({
        hex: g
      });
      q.getEncodedHex();
      r.push(q);
      var m = new d.IssuerAndSerialNumber({
        cert: p[l]
      });
      m.getEncodedHex();
      r.push(m);
      var o = new b.DERSequence({
        array: r
      });
      o.getEncodedHex();
      n.push(o)
    }
    var k = new b.DERSequence({
      array: n
    });
    k.getEncodedHex();
    this.valueList = [k]
  };
  if (typeof e != "undefined") {
    if (typeof e.array == "object") {
      var a = "sha256";
      if (typeof e.hashAlg == "string") {
        a = e.hashAlg
      }
      this.setCerts(e.array, a)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.SigningCertificateV2, KJUR.asn1.cms.Attribute);
KJUR.asn1.cms.IssuerAndSerialNumber = function (c) {
  KJUR.asn1.cms.IssuerAndSerialNumber.superclass.constructor.call(this);
  var e = null;
  var b = null;
  var a = KJUR.asn1;
  var d = a.x509;
  this.setByCertPEM = function (i) {
    var g = ASN1HEX.pemToHex(i);
    var f = new X509();
    f.hex = g;
    var j = f.getIssuerHex();
    this.dIssuer = new d.X500Name();
    this.dIssuer.hTLV = j;
    var h = f.getSerialNumberHex();
    this.dSerial = new a.DERInteger({
      hex: h
    })
  };
  this.getEncodedHex = function () {
    var f = new KJUR.asn1.DERSequence({
      array: [this.dIssuer, this.dSerial]
    });
    this.hTLV = f.getEncodedHex();
    return this.hTLV
  };
  if (typeof c != "undefined") {
    if (typeof c == "string" && c.indexOf("-----BEGIN ") != -1) {
      this.setByCertPEM(c)
    }
    if (c.issuer && c.serial) {
      if (c.issuer instanceof KJUR.asn1.x509.X500Name) {
        this.dIssuer = c.issuer
      } else {
        this.dIssuer = new KJUR.asn1.x509.X500Name(c.issuer)
      }
      if (c.serial instanceof KJUR.asn1.DERInteger) {
        this.dSerial = c.serial
      } else {
        this.dSerial = new KJUR.asn1.DERInteger(c.serial)
      }
    }
    if (typeof c.cert == "string") {
      this.setByCertPEM(c.cert)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.IssuerAndSerialNumber, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.AttributeList = function (a) {
  KJUR.asn1.cms.AttributeList.superclass.constructor.call(this);
  this.list = new Array();
  this.sortFlag = true;
  this.add = function (b) {
    if (b instanceof KJUR.asn1.cms.Attribute) {
      this.list.push(b)
    }
  };
  this.length = function () {
    return this.list.length
  };
  this.clear = function () {
    this.list = new Array();
    this.hTLV = null;
    this.hV = null
  };
  this.getEncodedHex = function () {
    if (typeof this.hTLV == "string") {
      return this.hTLV
    }
    var b = new KJUR.asn1.DERSet({
      array: this.list,
      sortflag: this.sortFlag
    });
    this.hTLV = b.getEncodedHex();
    return this.hTLV
  };
  if (typeof a != "undefined") {
    if (typeof a.sortflag != "undefined" && a.sortflag == false) {
      this.sortFlag = false
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.AttributeList, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.SignerInfo = function (c) {
  KJUR.asn1.cms.SignerInfo.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.cms;
  var d = KJUR.asn1.x509;
  this.dCMSVersion = new a.DERInteger({
    "int": 1
  });
  this.dSignerIdentifier = null;
  this.dDigestAlgorithm = null;
  this.dSignedAttrs = new b.AttributeList();
  this.dSigAlg = null;
  this.dSig = null;
  this.dUnsignedAttrs = new b.AttributeList();
  this.setSignerIdentifier = function (f) {
    if (typeof f == "string" && f.indexOf("CERTIFICATE") != -1 && f.indexOf("BEGIN") != -1 && f.indexOf("END") != -1) {
      var e = f;
      this.dSignerIdentifier = new b.IssuerAndSerialNumber({
        cert: f
      })
    }
  };
  this.setForContentAndHash = function (e) {
    if (typeof e != "undefined") {
      if (e.eciObj instanceof KJUR.asn1.cms.EncapsulatedContentInfo) {
        this.dSignedAttrs.add(new b.ContentType({
          oid: "1.2.840.113549.1.7.1"
        }));
        this.dSignedAttrs.add(new b.MessageDigest({
          eciObj: e.eciObj,
          hashAlg: e.hashAlg
        }))
      }
      if (typeof e.sdObj != "undefined" && e.sdObj instanceof KJUR.asn1.cms.SignedData) {
        if (e.sdObj.digestAlgNameList.join(":").indexOf(e.hashAlg) == -1) {
          e.sdObj.digestAlgNameList.push(e.hashAlg)
        }
      }
      if (typeof e.hashAlg == "string") {
        this.dDigestAlgorithm = new d.AlgorithmIdentifier({
          name: e.hashAlg
        })
      }
    }
  };
  this.sign = function (j, f) {
    this.dSigAlg = new d.AlgorithmIdentifier({
      name: f
    });
    var g = this.dSignedAttrs.getEncodedHex();
    var e = KEYUTIL.getKey(j);
    var i = new KJUR.crypto.Signature({
      alg: f
    });
    i.init(e);
    i.updateHex(g);
    var h = i.sign();
    this.dSig = new a.DEROctetString({
      hex: h
    })
  };
  this.addUnsigned = function (e) {
    this.hTLV = null;
    this.dUnsignedAttrs.hTLV = null;
    this.dUnsignedAttrs.add(e)
  };
  this.getEncodedHex = function () {
    if (this.dSignedAttrs instanceof KJUR.asn1.cms.AttributeList && this.dSignedAttrs.length() == 0) {
      throw "SignedAttrs length = 0 (empty)"
    }
    var e = new a.DERTaggedObject({
      obj: this.dSignedAttrs,
      tag: "a0",
      explicit: false
    });
    var h = null;
    if (this.dUnsignedAttrs.length() > 0) {
      h = new a.DERTaggedObject({
        obj: this.dUnsignedAttrs,
        tag: "a1",
        explicit: false
      })
    }
    var g = [this.dCMSVersion, this.dSignerIdentifier, this.dDigestAlgorithm, e, this.dSigAlg, this.dSig,];
    if (h != null) {
      g.push(h)
    }
    var f = new a.DERSequence({
      array: g
    });
    this.hTLV = f.getEncodedHex();
    return this.hTLV
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.SignerInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.EncapsulatedContentInfo = function (c) {
  KJUR.asn1.cms.EncapsulatedContentInfo.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.cms;
  var d = KJUR.asn1.x509;
  this.dEContentType = new a.DERObjectIdentifier({
    name: "data"
  });
  this.dEContent = null;
  this.isDetached = false;
  this.eContentValueHex = null;
  this.setContentType = function (e) {
    if (e.match(/^[0-2][.][0-9.]+$/)) {
      this.dEContentType = new a.DERObjectIdentifier({
        oid: e
      })
    } else {
      this.dEContentType = new a.DERObjectIdentifier({
        name: e
      })
    }
  };
  this.setContentValue = function (e) {
    if (typeof e != "undefined") {
      if (typeof e.hex == "string") {
        this.eContentValueHex = e.hex
      } else {
        if (typeof e.str == "string") {
          this.eContentValueHex = utf8tohex(e.str)
        }
      }
    }
  };
  this.setContentValueHex = function (e) {
    this.eContentValueHex = e
  };
  this.setContentValueStr = function (e) {
    this.eContentValueHex = utf8tohex(e)
  };
  this.getEncodedHex = function () {
    if (typeof this.eContentValueHex != "string") {
      throw "eContentValue not yet set"
    }
    var g = new a.DEROctetString({
      hex: this.eContentValueHex
    });
    this.dEContent = new a.DERTaggedObject({
      obj: g,
      tag: "a0",
      explicit: true
    });
    var e = [this.dEContentType];
    if (!this.isDetached) {
      e.push(this.dEContent)
    }
    var f = new a.DERSequence({
      array: e
    });
    this.hTLV = f.getEncodedHex();
    return this.hTLV
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.EncapsulatedContentInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.ContentInfo = function (c) {
  KJUR.asn1.cms.ContentInfo.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.cms;
  var d = KJUR.asn1.x509;
  this.dContentType = null;
  this.dContent = null;
  this.setContentType = function (e) {
    if (typeof e == "string") {
      this.dContentType = d.OID.name2obj(e)
    }
  };
  this.getEncodedHex = function () {
    var f = new a.DERTaggedObject({
      obj: this.dContent,
      tag: "a0",
      explicit: true
    });
    var e = new a.DERSequence({
      array: [this.dContentType, f]
    });
    this.hTLV = e.getEncodedHex();
    return this.hTLV
  };
  if (typeof c != "undefined") {
    if (c.type) {
      this.setContentType(c.type)
    }
    if (c.obj && c.obj instanceof a.ASN1Object) {
      this.dContent = c.obj
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.ContentInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.SignedData = function (c) {
  KJUR.asn1.cms.SignedData.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.cms;
  var d = KJUR.asn1.x509;
  this.dCMSVersion = new a.DERInteger({
    "int": 1
  });
  this.dDigestAlgs = null;
  this.digestAlgNameList = [];
  this.dEncapContentInfo = new b.EncapsulatedContentInfo();
  this.dCerts = null;
  this.certificateList = [];
  this.crlList = [];
  this.signerInfoList = [new b.SignerInfo()];
  this.addCertificatesByPEM = function (e) {
    var f = ASN1HEX.pemToHex(e);
    var g = new a.ASN1Object();
    g.hTLV = f;
    this.certificateList.push(g)
  };
  this.getEncodedHex = function () {
    if (typeof this.hTLV == "string") {
      return this.hTLV
    }
    if (this.dDigestAlgs == null) {
      var k = [];
      for (var j = 0; j < this.digestAlgNameList.length; j++) {
        var h = this.digestAlgNameList[j];
        var m = new d.AlgorithmIdentifier({
          name: h
        });
        k.push(m)
      }
      this.dDigestAlgs = new a.DERSet({
        array: k
      })
    }
    var e = [this.dCMSVersion, this.dDigestAlgs, this.dEncapContentInfo];
    if (this.dCerts == null) {
      if (this.certificateList.length > 0) {
        var l = new a.DERSet({
          array: this.certificateList
        });
        this.dCerts = new a.DERTaggedObject({
          obj: l,
          tag: "a0",
          explicit: false
        })
      }
    }
    if (this.dCerts != null) {
      e.push(this.dCerts)
    }
    var g = new a.DERSet({
      array: this.signerInfoList
    });
    e.push(g);
    var f = new a.DERSequence({
      array: e
    });
    this.hTLV = f.getEncodedHex();
    return this.hTLV
  };
  this.getContentInfo = function () {
    this.getEncodedHex();
    var e = new b.ContentInfo({
      type: "signed-data",
      obj: this
    });
    return e
  };
  this.getContentInfoEncodedHex = function () {
    var e = this.getContentInfo();
    var f = e.getEncodedHex();
    return f
  };
  this.getPEM = function () {
    var e = this.getContentInfoEncodedHex();
    var f = a.ASN1Util.getPEMStringFromHex(e, "CMS");
    return f
  }
};
YAHOO.lang.extend(KJUR.asn1.cms.SignedData, KJUR.asn1.ASN1Object);
KJUR.asn1.cms.CMSUtil = new
  function () { };
KJUR.asn1.cms.CMSUtil.newSignedData = function (a) {
  var h = KJUR.asn1.cms;
  var g = KJUR.asn1.cades;
  var f = new h.SignedData();
  f.dEncapContentInfo.setContentValue(a.content);
  if (typeof a.certs == "object") {
    for (var b = 0; b < a.certs.length; b++) {
      f.addCertificatesByPEM(a.certs[b])
    }
  }
  f.signerInfoList = [];
  for (var b = 0; b < a.signerInfos.length; b++) {
    var d = a.signerInfos[b];
    var c = new h.SignerInfo();
    c.setSignerIdentifier(d.signerCert);
    c.setForContentAndHash({
      sdObj: f,
      eciObj: f.dEncapContentInfo,
      hashAlg: d.hashAlg
    });
    for (attrName in d.sAttr) {
      var j = d.sAttr[attrName];
      if (attrName == "SigningTime") {
        var e = new h.SigningTime(j);
        c.dSignedAttrs.add(e)
      }
      if (attrName == "SigningCertificate") {
        var e = new h.SigningCertificate(j);
        c.dSignedAttrs.add(e)
      }
      if (attrName == "SigningCertificateV2") {
        var e = new h.SigningCertificateV2(j);
        c.dSignedAttrs.add(e)
      }
      if (attrName == "SignaturePolicyIdentifier") {
        var e = new g.SignaturePolicyIdentifier(j);
        c.dSignedAttrs.add(e)
      }
    }
    c.sign(d.signerPrvKey, d.sigAlg);
    f.signerInfoList.push(c)
  }
  return f
};
/*! asn1tsp-1.0.1.js (c) 2014 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {}
}
if (typeof KJUR.asn1.tsp == "undefined" || !KJUR.asn1.tsp) {
  KJUR.asn1.tsp = {}
}
KJUR.asn1.tsp.Accuracy = function (b) {
  KJUR.asn1.tsp.Accuracy.superclass.constructor.call(this);
  var a = KJUR.asn1;
  this.seconds = null;
  this.millis = null;
  this.micros = null;
  this.getEncodedHex = function () {
    var e = null;
    var g = null;
    var i = null;
    var c = [];
    if (this.seconds != null) {
      e = new a.DERInteger({
        "int": this.seconds
      });
      c.push(e)
    }
    if (this.millis != null) {
      var h = new a.DERInteger({
        "int": this.millis
      });
      g = new a.DERTaggedObject({
        obj: h,
        tag: "80",
        explicit: false
      });
      c.push(g)
    }
    if (this.micros != null) {
      var f = new a.DERInteger({
        "int": this.micros
      });
      i = new a.DERTaggedObject({
        obj: f,
        tag: "81",
        explicit: false
      });
      c.push(i)
    }
    var d = new a.DERSequence({
      array: c
    });
    this.hTLV = d.getEncodedHex();
    return this.hTLV
  };
  if (typeof b != "undefined") {
    if (typeof b.seconds == "number") {
      this.seconds = b.seconds
    }
    if (typeof b.millis == "number") {
      this.millis = b.millis
    }
    if (typeof b.micros == "number") {
      this.micros = b.micros
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.Accuracy, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.MessageImprint = function (b) {
  KJUR.asn1.tsp.MessageImprint.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var c = KJUR.asn1.x509;
  this.dHashAlg = null;
  this.dHashValue = null;
  this.getEncodedHex = function () {
    if (typeof this.hTLV == "string") {
      return this.hTLV
    }
    var d = new a.DERSequence({
      array: [this.dHashAlg, this.dHashValue]
    });
    return d.getEncodedHex()
  };
  if (typeof b != "undefined") {
    if (typeof b.hashAlg == "string") {
      this.dHashAlg = new c.AlgorithmIdentifier({
        name: b.hashAlg
      })
    }
    if (typeof b.hashValue == "string") {
      this.dHashValue = new a.DEROctetString({
        hex: b.hashValue
      })
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.MessageImprint, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TimeStampReq = function (c) {
  KJUR.asn1.tsp.TimeStampReq.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.tsp;
  this.dVersion = new a.DERInteger({
    "int": 1
  });
  this.dMessageImprint = null;
  this.dPolicy = null;
  this.dNonce = null;
  this.certReq = true;
  this.setMessageImprint = function (d) {
    if (d instanceof KJUR.asn1.tsp.MessageImprint) {
      this.dMessageImprint = d;
      return
    }
    if (typeof d == "object") {
      this.dMessageImprint = new b.MessageImprint(d)
    }
  };
  this.getEncodedHex = function () {
    if (this.dMessageImprint == null) {
      throw "messageImprint shall be specified"
    }
    var d = [this.dVersion, this.dMessageImprint];
    if (this.dPolicy != null) {
      d.push(this.dPolicy)
    }
    if (this.dNonce != null) {
      d.push(this.dNonce)
    }
    if (this.certReq) {
      d.push(new a.DERBoolean())
    }
    var e = new a.DERSequence({
      array: d
    });
    this.hTLV = e.getEncodedHex();
    return this.hTLV
  };
  if (typeof c != "undefined") {
    if (typeof c.mi == "object") {
      this.setMessageImprint(c.mi)
    }
    if (typeof c.policy == "object") {
      this.dPolicy = new a.DERObjectIdentifier(c.policy)
    }
    if (typeof c.nonce == "object") {
      this.dNonce = new a.DERInteger(c.nonce)
    }
    if (typeof c.certreq == "boolean") {
      this.certReq = c.certreq
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampReq, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TSTInfo = function (c) {
  KJUR.asn1.tsp.TSTInfo.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var d = KJUR.asn1.x509;
  var b = KJUR.asn1.tsp;
  this.dVersion = new a.DERInteger({
    "int": 1
  });
  this.dPolicy = null;
  this.dMessageImprint = null;
  this.dSerialNumber = null;
  this.dGenTime = null;
  this.dAccuracy = null;
  this.dOrdering = null;
  this.dNonce = null;
  this.dTsa = null;
  this.getEncodedHex = function () {
    var e = [this.dVersion];
    if (this.dPolicy == null) {
      throw "policy shall be specified."
    }
    e.push(this.dPolicy);
    if (this.dMessageImprint == null) {
      throw "messageImprint shall be specified."
    }
    e.push(this.dMessageImprint);
    if (this.dSerialNumber == null) {
      throw "serialNumber shall be specified."
    }
    e.push(this.dSerialNumber);
    if (this.dGenTime == null) {
      throw "genTime shall be specified."
    }
    e.push(this.dGenTime);
    if (this.dAccuracy != null) {
      e.push(this.dAccuracy)
    }
    if (this.dOrdering != null) {
      e.push(this.dOrdering)
    }
    if (this.dNonce != null) {
      e.push(this.dNonce)
    }
    if (this.dTsa != null) {
      e.push(this.dTsa)
    }
    var f = new a.DERSequence({
      array: e
    });
    this.hTLV = f.getEncodedHex();
    return this.hTLV
  };
  if (typeof c != "undefined") {
    if (typeof c.policy == "string") {
      if (!c.policy.match(/^[0-9.]+$/)) {
        throw "policy shall be oid like 0.1.4.134"
      }
      this.dPolicy = new a.DERObjectIdentifier({
        oid: c.policy
      })
    }
    if (typeof c.messageImprint != "undefined") {
      this.dMessageImprint = new b.MessageImprint(c.messageImprint)
    }
    if (typeof c.serialNumber != "undefined") {
      this.dSerialNumber = new a.DERInteger(c.serialNumber)
    }
    if (typeof c.genTime != "undefined") {
      this.dGenTime = new a.DERGeneralizedTime(c.genTime)
    }
    if (typeof c.accuracy != "undefind") {
      this.dAccuracy = new b.Accuracy(c.accuracy)
    }
    if (typeof c.ordering != "undefined" && c.ordering == true) {
      this.dOrdering = new a.DERBoolean()
    }
    if (typeof c.nonce != "undefined") {
      this.dNonce = new a.DERInteger(c.nonce)
    }
    if (typeof c.tsa != "undefined") {
      this.dTsa = new d.X500Name(c.tsa)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TSTInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.TimeStampResp = function (c) {
  KJUR.asn1.tsp.TimeStampResp.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.tsp;
  this.dStatus = null;
  this.dTST = null;
  this.getEncodedHex = function () {
    if (this.dStatus == null) {
      throw "status shall be specified"
    }
    var d = [this.dStatus];
    if (this.dTST != null) {
      d.push(this.dTST)
    }
    var e = new a.DERSequence({
      array: d
    });
    this.hTLV = e.getEncodedHex();
    return this.hTLV
  };
  if (typeof c != "undefined") {
    if (typeof c.status == "object") {
      this.dStatus = new b.PKIStatusInfo(c.status)
    }
    if (typeof c.tst != "undefined" && c.tst instanceof KJUR.asn1.ASN1Object) {
      this.dTST = c.tst.getContentInfo()
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.TimeStampResp, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatusInfo = function (c) {
  KJUR.asn1.tsp.PKIStatusInfo.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.tsp;
  this.dStatus = null;
  this.dStatusString = null;
  this.dFailureInfo = null;
  this.getEncodedHex = function () {
    if (this.dStatus == null) {
      throw "status shall be specified"
    }
    var d = [this.dStatus];
    if (this.dStatusString != null) {
      d.push(this.dStatusString)
    }
    if (this.dFailureInfo != null) {
      d.push(this.dFailureInfo)
    }
    var e = new a.DERSequence({
      array: d
    });
    this.hTLV = e.getEncodedHex();
    return this.hTLV
  };
  if (typeof c != "undefined") {
    if (typeof c.status == "object") {
      this.dStatus = new b.PKIStatus(c.status)
    }
    if (typeof c.statstr == "object") {
      this.dStatusString = new b.PKIFreeText({
        array: c.statstr
      })
    }
    if (typeof c.failinfo == "object") {
      this.dFailureInfo = new b.PKIFailureInfo(c.failinfo)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatusInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatus = function (e) {
  KJUR.asn1.tsp.PKIStatus.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.tsp;
  var d = null;
  this.getEncodedHex = function () {
    this.hTLV = this.dStatus.getEncodedHex();
    return this.hTLV
  };
  if (typeof e != "undefined") {
    if (typeof e.name != "undefined") {
      var c = b.PKIStatus.valueList;
      if (typeof c[e.name] == "undefined") {
        throw "name undefined: " + e.name
      }
      this.dStatus = new a.DERInteger({
        "int": c[e.name]
      })
    } else {
      this.dStatus = new a.DERInteger(e)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIStatus, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIStatus.valueList = {
  granted: 0,
  grantedWithMods: 1,
  rejection: 2,
  waiting: 3,
  revocationWarning: 4,
  revocationNotification: 5
};
KJUR.asn1.tsp.PKIFreeText = function (b) {
  KJUR.asn1.tsp.PKIFreeText.superclass.constructor.call(this);
  var a = KJUR.asn1;
  this.textList = [];
  this.getEncodedHex = function () {
    var c = [];
    for (var e = 0; e < this.textList.length; e++) {
      c.push(new a.DERUTF8String({
        str: this.textList[e]
      }))
    }
    var d = new a.DERSequence({
      array: c
    });
    this.hTLV = d.getEncodedHex();
    return this.hTLV
  };
  if (typeof b != "undefined") {
    if (typeof b.array == "object") {
      this.textList = b.array
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIFreeText, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIFailureInfo = function (d) {
  KJUR.asn1.tsp.PKIFailureInfo.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.tsp;
  this.value = null;
  this.getEncodedHex = function () {
    if (this.value == null) {
      throw "value shall be specified"
    }
    var e = new Number(this.value).toString(2);
    var f = new a.DERBitString();
    f.setByBinaryString(e);
    this.hTLV = f.getEncodedHex();
    return this.hTLV
  };
  if (typeof d != "undefined") {
    if (typeof d.name == "string") {
      var c = b.PKIFailureInfo.valueList;
      if (typeof c[d.name] == "undefined") {
        throw "name undefined: " + d.name
      }
      this.value = c[d.name]
    } else {
      if (typeof d["int"] == "number") {
        this.value = d["int"]
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.PKIFailureInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.tsp.PKIFailureInfo.valueList = {
  badAlg: 0,
  badRequest: 2,
  badDataFormat: 5,
  timeNotAvailable: 14,
  unacceptedPolicy: 15,
  unacceptedExtension: 16,
  addInfoNotAvailable: 17,
  systemFailure: 25
};
KJUR.asn1.tsp.AbstractTSAAdapter = function (a) {
  this.getTSTHex = function (c, b) {
    throw "not implemented yet"
  }
};
KJUR.asn1.tsp.SimpleTSAAdapter = function (a) {
  KJUR.asn1.tsp.SimpleTSAAdapter.superclass.constructor.call(this);
  this.params = null;
  this.serial = 0;
  this.getTSTHex = function (c, b) {
    var e = KJUR.crypto.Util.hashHex(c, b);
    this.params.tstInfo.messageImprint = {
      hashAlg: b,
      hashValue: e
    };
    this.params.tstInfo.serialNumber = {
      "int": this.serial++
    };
    var d = Math.floor(Math.random() * 1000000000);
    this.params.tstInfo.nonce = {
      "int": d
    };
    var f = KJUR.asn1.tsp.TSPUtil.newTimeStampToken(this.params);
    return f.getContentInfoEncodedHex()
  };
  if (typeof a != "undefined") {
    this.params = a
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.SimpleTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
KJUR.asn1.tsp.FixedTSAAdapter = function (a) {
  KJUR.asn1.tsp.FixedTSAAdapter.superclass.constructor.call(this);
  this.params = null;
  this.getTSTHex = function (c, b) {
    var d = KJUR.crypto.Util.hashHex(c, b);
    this.params.tstInfo.messageImprint = {
      hashAlg: b,
      hashValue: d
    };
    var e = KJUR.asn1.tsp.TSPUtil.newTimeStampToken(this.params);
    return e.getContentInfoEncodedHex()
  };
  if (typeof a != "undefined") {
    this.params = a
  }
};
YAHOO.lang.extend(KJUR.asn1.tsp.FixedTSAAdapter, KJUR.asn1.tsp.AbstractTSAAdapter);
KJUR.asn1.tsp.TSPUtil = new
  function () { };
KJUR.asn1.tsp.TSPUtil.newTimeStampToken = function (b) {
  var j = KJUR.asn1.cms;
  var a = KJUR.asn1.tsp;
  var g = new j.SignedData();
  var e = new a.TSTInfo(b.tstInfo);
  var f = e.getEncodedHex();
  g.dEncapContentInfo.setContentValue({
    hex: f
  });
  g.dEncapContentInfo.setContentType("tstinfo");
  if (typeof b.certs == "object") {
    for (var c = 0; c < b.certs.length; c++) {
      g.addCertificatesByPEM(b.certs[c])
    }
  }
  var d = g.signerInfoList[0];
  d.setSignerIdentifier(b.signerCert);
  d.setForContentAndHash({
    sdObj: g,
    eciObj: g.dEncapContentInfo,
    hashAlg: b.hashAlg
  });
  var h = new j.SigningCertificate({
    array: [b.signerCert]
  });
  d.dSignedAttrs.add(h);
  d.sign(b.signerPrvKey, b.sigAlg);
  return g
};
KJUR.asn1.tsp.TSPUtil.parseTimeStampReq = function (d) {
  var f = {};
  f.certreq = false;
  var h = ASN1HEX.getPosArrayOfChildren_AtObj(d, 0);
  if (h.length < 2) {
    throw "TimeStampReq must have at least 2 items"
  }
  var c = ASN1HEX.getHexOfTLV_AtObj(d, h[1]);
  f.mi = KJUR.asn1.tsp.TSPUtil.parseMessageImprint(c);
  for (var e = 2; e < h.length; e++) {
    var b = h[e];
    var a = d.substr(b, 2);
    if (a == "06") {
      var g = ASN1HEX.getHexOfV_AtObj(d, b);
      f.policy = ASN1HEX.hextooidstr(g)
    }
    if (a == "02") {
      f.nonce = ASN1HEX.getHexOfV_AtObj(d, b)
    }
    if (a == "01") {
      f.certreq = true
    }
  }
  return f
};
KJUR.asn1.tsp.TSPUtil.parseMessageImprint = function (c) {
  var h = {};
  if (c.substr(0, 2) != "30") {
    throw "head of messageImprint hex shall be '30'"
  }
  var a = ASN1HEX.getPosArrayOfChildren_AtObj(c, 0);
  var i = ASN1HEX.getDecendantIndexByNthList(c, 0, [0, 0]);
  var d = ASN1HEX.getHexOfV_AtObj(c, i);
  var e = ASN1HEX.hextooidstr(d);
  var g = KJUR.asn1.x509.OID.oid2name(e);
  if (g == "") {
    throw "hashAlg name undefined: " + e
  }
  var b = g;
  var f = ASN1HEX.getDecendantIndexByNthList(c, 0, [1]);
  h.hashAlg = b;
  h.hashValue = ASN1HEX.getHexOfV_AtObj(c, f);
  return h
};
/*! asn1cades-1.0.1.js (c) 2014-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {}
}
if (typeof KJUR.asn1.cades == "undefined" || !KJUR.asn1.cades) {
  KJUR.asn1.cades = {}
}
KJUR.asn1.cades.SignaturePolicyIdentifier = function (e) {
  KJUR.asn1.cades.SignaturePolicyIdentifier.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.15";
  var b = KJUR.asn1;
  var d = KJUR.asn1.cades;
  if (typeof e != "undefined") {
    if (typeof e.oid == "string" && typeof e.hash == "object") {
      var f = new b.DERObjectIdentifier({
        oid: e.oid
      });
      var a = new d.OtherHashAlgAndValue(e.hash);
      var c = new b.DERSequence({
        array: [f, a]
      });
      this.valueList = [c]
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.SignaturePolicyIdentifier, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.OtherHashAlgAndValue = function (b) {
  KJUR.asn1.cades.OtherHashAlgAndValue.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var c = KJUR.asn1.x509;
  this.dAlg = null;
  this.dHash = null;
  this.getEncodedHex = function () {
    var d = new a.DERSequence({
      array: [this.dAlg, this.dHash]
    });
    this.hTLV = d.getEncodedHex();
    return this.hTLV
  };
  if (typeof b != "undefined") {
    if (typeof b.alg == "string" && typeof b.hash == "string") {
      this.dAlg = new c.AlgorithmIdentifier({
        name: b.alg
      });
      this.dHash = new a.DEROctetString({
        hex: b.hash
      })
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherHashAlgAndValue, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.SignatureTimeStamp = function (c) {
  KJUR.asn1.cades.SignatureTimeStamp.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.14";
  this.tstHex = null;
  var a = KJUR.asn1;
  if (typeof c != "undefined") {
    if (typeof c.res != "undefined") {
      if (typeof c.res == "string" && c.res.match(/^[0-9A-Fa-f]+$/)) { } else {
        if (c.res instanceof KJUR.asn1.ASN1Object) { } else {
          throw "res param shall be ASN1Object or hex string"
        }
      }
    }
    if (typeof c.tst != "undefined") {
      if (typeof c.tst == "string" && c.tst.match(/^[0-9A-Fa-f]+$/)) {
        var b = new a.ASN1Object();
        this.tstHex = c.tst;
        b.hTLV = this.tstHex;
        b.getEncodedHex();
        this.valueList = [b]
      } else {
        if (c.tst instanceof KJUR.asn1.ASN1Object) { } else {
          throw "tst param shall be ASN1Object or hex string"
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.SignatureTimeStamp, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.CompleteCertificateRefs = function (c) {
  KJUR.asn1.cades.CompleteCertificateRefs.superclass.constructor.call(this);
  this.attrTypeOid = "1.2.840.113549.1.9.16.2.21";
  var a = KJUR.asn1;
  var b = KJUR.asn1.cades;
  this.setByArray = function (d) {
    this.valueList = [];
    for (var e = 0; e < d.length; e++) {
      var f = new b.OtherCertID(d[e]);
      this.valueList.push(f)
    }
  };
  if (typeof c != "undefined") {
    if (typeof c == "object" && typeof c.length == "number") {
      this.setByArray(c)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.CompleteCertificateRefs, KJUR.asn1.cms.Attribute);
KJUR.asn1.cades.OtherCertID = function (d) {
  KJUR.asn1.cades.OtherCertID.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var c = KJUR.asn1.cms;
  var b = KJUR.asn1.cades;
  this.hasIssuerSerial = true;
  this.dOtherCertHash = null;
  this.dIssuerSerial = null;
  this.setByCertPEM = function (e) {
    this.dOtherCertHash = new b.OtherHash(e);
    if (this.hasIssuerSerial) {
      this.dIssuerSerial = new c.IssuerAndSerialNumber(e)
    }
  };
  this.getEncodedHex = function () {
    if (this.hTLV != null) {
      return this.hTLV
    }
    if (this.dOtherCertHash == null) {
      throw "otherCertHash not set"
    }
    var e = [this.dOtherCertHash];
    if (this.dIssuerSerial != null) {
      e.push(this.dIssuerSerial)
    }
    var f = new a.DERSequence({
      array: e
    });
    this.hTLV = f.getEncodedHex();
    return this.hTLV
  };
  if (typeof d != "undefined") {
    if (typeof d == "string" && d.indexOf("-----BEGIN ") != -1) {
      this.setByCertPEM(d)
    }
    if (typeof d == "object") {
      if (d.hasis === false) {
        this.hasIssuerSerial = false
      }
      if (typeof d.cert == "string") {
        this.setByCertPEM(d.cert)
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherCertID, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.OtherHash = function (c) {
  KJUR.asn1.cades.OtherHash.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var b = KJUR.asn1.cades;
  this.alg = "sha256";
  this.dOtherHash = null;
  this.setByCertPEM = function (d) {
    if (d.indexOf("-----BEGIN ") == -1) {
      throw "certPEM not to seem PEM format"
    }
    var e = ASN1HEX.pemToHex(d);
    var f = KJUR.crypto.Util.hashHex(e, this.alg);
    this.dOtherHash = new b.OtherHashAlgAndValue({
      alg: this.alg,
      hash: f
    })
  };
  this.getEncodedHex = function () {
    if (this.dOtherHash == null) {
      throw "OtherHash not set"
    }
    return this.dOtherHash.getEncodedHex()
  };
  if (typeof c != "undefined") {
    if (typeof c == "string") {
      if (c.indexOf("-----BEGIN ") != -1) {
        this.setByCertPEM(c)
      } else {
        if (c.match(/^[0-9A-Fa-f]+$/)) {
          this.dOtherHash = new a.DEROctetString({
            hex: c
          })
        } else {
          throw "unsupported string value for params"
        }
      }
    } else {
      if (typeof c == "object") {
        if (typeof c.cert == "string") {
          if (typeof c.alg == "string") {
            this.alg = c.alg
          }
          this.setByCertPEM(c.cert)
        } else {
          this.dOtherHash = new b.OtherHashAlgAndValue(c)
        }
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.cades.OtherHash, KJUR.asn1.ASN1Object);
KJUR.asn1.cades.CAdESUtil = new
  function () { };
KJUR.asn1.cades.CAdESUtil.addSigTS = function (c, b, a) { };
KJUR.asn1.cades.CAdESUtil.parseSignedDataForAddingUnsigned = function (d) {
  var q = KJUR.asn1;
  var p = KJUR.asn1.cms;
  var c = KJUR.asn1.cades.CAdESUtil;
  var a = {};
  if (ASN1HEX.getDecendantHexTLVByNthList(d, 0, [0]) != "06092a864886f70d010702") {
    throw "hex is not CMS SignedData"
  }
  var s = ASN1HEX.getDecendantIndexByNthList(d, 0, [1, 0]);
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(d, s);
  if (b.length < 4) {
    throw "num of SignedData elem shall be 4 at least"
  }
  var f = b.shift();
  a.version = ASN1HEX.getHexOfTLV_AtObj(d, f);
  var l = b.shift();
  a.algs = ASN1HEX.getHexOfTLV_AtObj(d, l);
  var m = b.shift();
  a.encapcontent = ASN1HEX.getHexOfTLV_AtObj(d, m);
  a.certs = null;
  a.revs = null;
  a.si = [];
  var n = b.shift();
  if (d.substr(n, 2) == "a0") {
    a.certs = ASN1HEX.getHexOfTLV_AtObj(d, n);
    n = b.shift()
  }
  if (d.substr(n, 2) == "a1") {
    a.revs = ASN1HEX.getHexOfTLV_AtObj(d, n);
    n = b.shift()
  }
  var k = n;
  if (d.substr(k, 2) != "31") {
    throw "Can't find signerInfos"
  }
  var j = ASN1HEX.getPosArrayOfChildren_AtObj(d, k);
  for (var h = 0; h < j.length; h++) {
    var o = j[h];
    var e = c.parseSignerInfoForAddingUnsigned(d, o, h);
    a.si[h] = e
  }
  var g = null;
  a.obj = new p.SignedData();
  g = new q.ASN1Object();
  g.hTLV = a.version;
  a.obj.dCMSVersion = g;
  g = new q.ASN1Object();
  g.hTLV = a.algs;
  a.obj.dDigestAlgs = g;
  g = new q.ASN1Object();
  g.hTLV = a.encapcontent;
  a.obj.dEncapContentInfo = g;
  g = new q.ASN1Object();
  g.hTLV = a.certs;
  a.obj.dCerts = g;
  a.obj.signerInfoList = [];
  for (var h = 0; h < a.si.length; h++) {
    a.obj.signerInfoList.push(a.si[h].obj)
  }
  return a
};
KJUR.asn1.cades.CAdESUtil.parseSignerInfoForAddingUnsigned = function (d, k, a) {
  var m = KJUR.asn1;
  var l = KJUR.asn1.cms;
  var b = {};
  var e = ASN1HEX.getPosArrayOfChildren_AtObj(d, k);
  if (e.length != 6) {
    throw "not supported items for SignerInfo (!=6)"
  }
  var f = e.shift();
  b.version = ASN1HEX.getHexOfTLV_AtObj(d, f);
  var n = e.shift();
  b.si = ASN1HEX.getHexOfTLV_AtObj(d, n);
  var h = e.shift();
  b.digalg = ASN1HEX.getHexOfTLV_AtObj(d, h);
  var c = e.shift();
  b.sattrs = ASN1HEX.getHexOfTLV_AtObj(d, c);
  var i = e.shift();
  b.sigalg = ASN1HEX.getHexOfTLV_AtObj(d, i);
  var j = e.shift();
  b.sig = ASN1HEX.getHexOfTLV_AtObj(d, j);
  b.sigval = ASN1HEX.getHexOfV_AtObj(d, j);
  var g = null;
  b.obj = new l.SignerInfo();
  g = new m.ASN1Object();
  g.hTLV = b.version;
  b.obj.dCMSVersion = g;
  g = new m.ASN1Object();
  g.hTLV = b.si;
  b.obj.dSignerIdentifier = g;
  g = new m.ASN1Object();
  g.hTLV = b.digalg;
  b.obj.dDigestAlgorithm = g;
  g = new m.ASN1Object();
  g.hTLV = b.sattrs;
  b.obj.dSignedAttrs = g;
  g = new m.ASN1Object();
  g.hTLV = b.sigalg;
  b.obj.dSigAlg = g;
  g = new m.ASN1Object();
  g.hTLV = b.sig;
  b.obj.dSig = g;
  b.obj.dUnsignedAttrs = new l.AttributeList();
  return b
};
/*! asn1csr-1.0.3.js (c) 2015-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR.asn1.csr == "undefined" || !KJUR.asn1.csr) {
  KJUR.asn1.csr = {}
}
KJUR.asn1.csr.CertificationRequest = function (f) {
  KJUR.asn1.csr.CertificationRequest.superclass.constructor.call(this);
  var b = null;
  var d = null;
  var e = null;
  var c = null;
  var a = null;
  this.sign = function (i, h) {
    if (this.prvKey == null) {
      this.prvKey = h
    }
    this.asn1SignatureAlg = new KJUR.asn1.x509.AlgorithmIdentifier({
      name: i
    });
    sig = new KJUR.crypto.Signature({
      alg: i
    });
    sig.initSign(this.prvKey);
    sig.updateHex(this.asn1CSRInfo.getEncodedHex());
    this.hexSig = sig.sign();
    this.asn1Sig = new KJUR.asn1.DERBitString({
      hex: "00" + this.hexSig
    });
    var g = new KJUR.asn1.DERSequence({
      array: [this.asn1CSRInfo, this.asn1SignatureAlg, this.asn1Sig]
    });
    this.hTLV = g.getEncodedHex();
    this.isModified = false
  };
  this.getPEMString = function () {
    var g = KJUR.asn1.ASN1Util.getPEMStringFromHex(this.getEncodedHex(), "CERTIFICATE REQUEST");
    return g
  };
  this.getEncodedHex = function () {
    if (this.isModified == false && this.hTLV != null) {
      return this.hTLV
    }
    throw "not signed yet"
  };
  if (typeof f != "undefined") {
    if (typeof f.csrinfo != "undefined") {
      this.asn1CSRInfo = f.csrinfo
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.csr.CertificationRequestInfo = function (a) {
  KJUR.asn1.csr.CertificationRequestInfo.superclass.constructor.call(this);
  this._initialize = function () {
    this.asn1Array = new Array();
    this.asn1Version = new KJUR.asn1.DERInteger({
      "int": 0
    });
    this.asn1Subject = null;
    this.asn1SubjPKey = null;
    this.extensionsArray = new Array()
  };
  this.setSubjectByParam = function (b) {
    this.asn1Subject = new KJUR.asn1.x509.X500Name(b)
  };
  this.setSubjectPublicKeyByGetKey = function (c) {
    var b = KEYUTIL.getKey(c);
    this.asn1SubjPKey = new KJUR.asn1.x509.SubjectPublicKeyInfo(b)
  };
  this.appendExtensionByName = function (c, b) {
    KJUR.asn1.x509.Extension.appendByNameToArray(c, b, this.extensionsArray)
  };
  this.getEncodedHex = function () {
    this.asn1Array = new Array();
    this.asn1Array.push(this.asn1Version);
    this.asn1Array.push(this.asn1Subject);
    this.asn1Array.push(this.asn1SubjPKey);
    if (this.extensionsArray.length > 0) {
      var e = new KJUR.asn1.DERSequence({
        array: this.extensionsArray
      });
      var d = new KJUR.asn1.DERSet({
        array: [e]
      });
      var c = new KJUR.asn1.DERSequence({
        array: [new KJUR.asn1.DERObjectIdentifier({
          oid: "1.2.840.113549.1.9.14"
        }), d]
      });
      var b = new KJUR.asn1.DERTaggedObject({
        explicit: true,
        tag: "a0",
        obj: c
      });
      this.asn1Array.push(b)
    } else {
      var b = new KJUR.asn1.DERTaggedObject({
        explicit: false,
        tag: "a0",
        obj: new KJUR.asn1.DERNull()
      });
      this.asn1Array.push(b)
    }
    var f = new KJUR.asn1.DERSequence({
      array: this.asn1Array
    });
    this.hTLV = f.getEncodedHex();
    this.isModified = false;
    return this.hTLV
  };
  this._initialize()
};
YAHOO.lang.extend(KJUR.asn1.csr.CertificationRequestInfo, KJUR.asn1.ASN1Object);
KJUR.asn1.csr.CSRUtil = new
  function () { };
KJUR.asn1.csr.CSRUtil.newCSRPEM = function (g) {
  var d = KJUR.asn1.csr;
  if (g.subject === undefined) {
    throw "parameter subject undefined"
  }
  if (g.sbjpubkey === undefined) {
    throw "parameter sbjpubkey undefined"
  }
  if (g.sigalg === undefined) {
    throw "parameter sigalg undefined"
  }
  if (g.sbjprvkey === undefined) {
    throw "parameter sbjpubkey undefined"
  }
  var b = new d.CertificationRequestInfo();
  b.setSubjectByParam(g.subject);
  b.setSubjectPublicKeyByGetKey(g.sbjpubkey);
  if (g.ext !== undefined && g.ext.length !== undefined) {
    for (var c = 0; c < g.ext.length; c++) {
      for (key in g.ext[c]) {
        b.appendExtensionByName(key, g.ext[c][key])
      }
    }
  }
  var e = new d.CertificationRequest({
    csrinfo: b
  });
  var a = KEYUTIL.getKey(g.sbjprvkey);
  e.sign(g.sigalg, a);
  var f = e.getPEMString();
  return f
};
KJUR.asn1.csr.CSRUtil.getInfo = function (b) {
  var a = {};
  a.subject = {};
  a.pubkey = {};
  if (b.indexOf("-----BEGIN CERTIFICATE REQUEST") == -1) {
    throw "argument is not PEM file"
  }
  var c = ASN1HEX.pemToHex(b, "CERTIFICATE REQUEST");
  a.subject.hex = ASN1HEX.getDecendantHexTLVByNthList(c, 0, [0, 1]);
  a.subject.name = X509.hex2dn(a.subject.hex);
  a.pubkey.hex = ASN1HEX.getDecendantHexTLVByNthList(c, 0, [0, 2]);
  a.pubkey.obj = KEYUTIL.getKey(a.pubkey.hex, null, "pkcs8pub");
  return a
};
/*! asn1ocsp-1.0.1.js (c) 2016 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.asn1 == "undefined" || !KJUR.asn1) {
  KJUR.asn1 = {}
}
if (typeof KJUR.asn1.ocsp == "undefined" || !KJUR.asn1.ocsp) {
  KJUR.asn1.ocsp = {}
}
KJUR.asn1.ocsp.DEFAULT_HASH = "sha1";
KJUR.asn1.ocsp.CertID = function (c) {
  KJUR.asn1.ocsp.CertID.superclass.constructor.call(this);
  var a = KJUR.asn1;
  var e = KJUR.asn1.x509;
  this.dHashAlg = null;
  this.dIssuerNameHash = null;
  this.dIssuerKeyHash = null;
  this.dSerialNumber = null;
  this.setByValue = function (i, h, f, g) {
    if (g === undefined) {
      g = KJUR.asn1.ocsp.DEFAULT_HASH
    }
    this.dHashAlg = new e.AlgorithmIdentifier({
      name: g
    });
    this.dIssuerNameHash = new a.DEROctetString({
      hex: i
    });
    this.dIssuerKeyHash = new a.DEROctetString({
      hex: h
    });
    this.dSerialNumber = new a.DERInteger({
      hex: f
    })
  };
  this.setByCert = function (m, i, k) {
    if (k === undefined) {
      k = KJUR.asn1.ocsp.DEFAULT_HASH
    }
    var f = new X509();
    f.readCertPEM(i);
    var n = new X509();
    n.readCertPEM(m);
    var o = X509.getPublicKeyInfoPropOfCertPEM(m);
    var l = o.keyhex;
    var g = f.getSerialNumberHex();
    var h = KJUR.crypto.Util.hashHex(n.getSubjectHex(), k);
    var j = KJUR.crypto.Util.hashHex(l, k);
    this.setByValue(h, j, g, k);
    this.hoge = f.getSerialNumberHex()
  };
  this.getEncodedHex = function () {
    if (this.dHashAlg === null && this.dIssuerNameHash === null && this.dIssuerKeyHash === null && this.dSerialNumber === null) {
      throw "not yet set values"
    }
    var f = [this.dHashAlg, this.dIssuerNameHash, this.dIssuerKeyHash, this.dSerialNumber];
    var g = new a.DERSequence({
      array: f
    });
    this.hTLV = g.getEncodedHex();
    return this.hTLV
  };
  if (typeof c !== "undefined") {
    var b = c;
    if (typeof b.issuerCert !== "undefined" && typeof b.subjectCert !== "undefined") {
      var d = KJUR.asn1.ocsp.DEFAULT_HASH;
      if (typeof b.alg === "undefined") {
        d = undefined
      }
      this.setByCert(b.issuerCert, b.subjectCert, d)
    } else {
      if (typeof b.namehash !== "undefined" && typeof b.keyhash !== "undefined" && typeof b.serial !== "undefined") {
        var d = KJUR.asn1.ocsp.DEFAULT_HASH;
        if (typeof b.alg === "undefined") {
          d = undefined
        }
        this.setByValue(b.namehash, b.keyhash, b.serial, d)
      } else {
        throw "invalid constructor arguments"
      }
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.CertID, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.Request = function (b) {
  KJUR.asn1.ocsp.Request.superclass.constructor.call(this);
  this.dReqCert = null;
  this.dExt = null;
  this.getEncodedHex = function () {
    var c = [];
    if (this.dReqCert === null) {
      throw "reqCert not set"
    }
    c.push(this.dReqCert);
    var d = new KJUR.asn1.DERSequence({
      array: c
    });
    this.hTLV = d.getEncodedHex();
    return this.hTLV
  };
  if (typeof b !== "undefined") {
    var a = new KJUR.asn1.ocsp.CertID(b);
    this.dReqCert = a
  }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.Request, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.TBSRequest = function (a) {
  KJUR.asn1.ocsp.TBSRequest.superclass.constructor.call(this);
  this.version = 0;
  this.dRequestorName = null;
  this.dRequestList = [];
  this.dRequestExt = null;
  this.setRequestListByParam = function (d) {
    var b = [];
    for (var c = 0; c < d.length; c++) {
      var e = new KJUR.asn1.ocsp.Request(d[0]);
      b.push(e)
    }
    this.dRequestList = b
  };
  this.getEncodedHex = function () {
    var b = [];
    if (this.version !== 0) {
      throw "not supported version: " + this.version
    }
    if (this.dRequestorName !== null) {
      throw "requestorName not supported"
    }
    var d = new KJUR.asn1.DERSequence({
      array: this.dRequestList
    });
    b.push(d);
    if (this.dRequestExt !== null) {
      throw "requestExtensions not supported"
    }
    var c = new KJUR.asn1.DERSequence({
      array: b
    });
    this.hTLV = c.getEncodedHex();
    return this.hTLV
  };
  if (typeof a !== "undefined") {
    if (typeof a.reqList !== "undefined") {
      this.setRequestListByParam(a.reqList)
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.TBSRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.OCSPRequest = function (b) {
  KJUR.asn1.ocsp.OCSPRequest.superclass.constructor.call(this);
  this.dTbsRequest = null;
  this.dOptionalSignature = null;
  this.getEncodedHex = function () {
    var c = [];
    if (this.dTbsRequest !== null) {
      c.push(this.dTbsRequest)
    } else {
      throw "tbsRequest not set"
    }
    if (this.dOptionalSignature !== null) {
      throw "optionalSignature not supported"
    }
    var d = new KJUR.asn1.DERSequence({
      array: c
    });
    this.hTLV = d.getEncodedHex();
    return this.hTLV
  };
  if (typeof b !== "undefined") {
    if (typeof b.reqList !== "undefined") {
      var a = new KJUR.asn1.ocsp.TBSRequest(b);
      this.dTbsRequest = a
    }
  }
};
YAHOO.lang.extend(KJUR.asn1.ocsp.OCSPRequest, KJUR.asn1.ASN1Object);
KJUR.asn1.ocsp.OCSPUtil = {};
KJUR.asn1.ocsp.OCSPUtil.getRequestHex = function (a, b, e) {
  if (e === undefined) {
    e = KJUR.asn1.ocsp.DEFAULT_HASH
  }
  var d = {
    alg: e,
    issuerCert: a,
    subjectCert: b
  };
  var c = new KJUR.asn1.ocsp.OCSPRequest({
    reqList: [d]
  });
  return c.getEncodedHex()
};
KJUR.asn1.ocsp.OCSPUtil.getOCSPResponseInfo = function (f) {
  var a = {};
  try {
    var b = ASN1HEX.getVbyList(f, 0, [0], "0a");
    a.responseStatus = parseInt(b, 16)
  } catch (d) { }
  if (a.responseStatus !== 0) {
    return a
  }
  try {
    var e = ASN1HEX.getDecendantIndexByNthList(f, 0, [1, 0, 1, 0, 0, 2, 0, 1]);
    if (f.substr(e, 2) === "80") {
      a.certStatus = "good"
    } else {
      if (f.substr(e, 2) === "a1") {
        a.certStatus = "revoked";
        a.revocationTime = hextoutf8(ASN1HEX.getDecendantHexVByNthList(f, e, [0]))
      } else {
        if (f.substr(e, 2) === "82") {
          a.certStatus = "unknown"
        }
      }
    }
  } catch (d) { }
  try {
    var c = ASN1HEX.getDecendantIndexByNthList(f, 0, [1, 0, 1, 0, 0, 2, 0, 2]);
    a.thisUpdate = hextoutf8(ASN1HEX.getHexOfV_AtObj(f, c))
  } catch (d) { }
  try {
    var g = ASN1HEX.getDecendantIndexByNthList(f, 0, [1, 0, 1, 0, 0, 2, 0, 3]);
    if (f.substr(g, 2) === "a0") {
      a.nextUpdate = hextoutf8(ASN1HEX.getDecendantHexVByNthList(f, g, [0]))
    }
  } catch (d) { }
  return a
};
/*! base64x-1.1.8 (c) 2012-2016 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
var KJUR;
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.lang == "undefined" || !KJUR.lang) {
  KJUR.lang = {}
}
KJUR.lang.String = function () { };
function Base64x() { }
function stoBA(d) {
  var b = new Array();
  for (var c = 0; c < d.length; c++) {
    b[c] = d.charCodeAt(c)
  }
  return b
}
function BAtos(b) {
  var d = "";
  for (var c = 0; c < b.length; c++) {
    d = d + String.fromCharCode(b[c])
  }
  return d
}
function BAtohex(b) {
  var e = "";
  for (var d = 0; d < b.length; d++) {
    var c = b[d].toString(16);
    if (c.length == 1) {
      c = "0" + c
    }
    e = e + c
  }
  return e
}
function stohex(a) {
  return BAtohex(stoBA(a))
}
function stob64(a) {
  return hex2b64(stohex(a))
}
function stob64u(a) {
  return b64tob64u(hex2b64(stohex(a)))
}
function b64utos(a) {
  return BAtos(b64toBA(b64utob64(a)))
}
function b64tob64u(a) {
  a = a.replace(/\=/g, "");
  a = a.replace(/\+/g, "-");
  a = a.replace(/\//g, "_");
  return a
}
function b64utob64(a) {
  if (a.length % 4 == 2) {
    a = a + "=="
  } else {
    if (a.length % 4 == 3) {
      a = a + "="
    }
  }
  a = a.replace(/-/g, "+");
  a = a.replace(/_/g, "/");
  return a
}
function hextob64u(a) {
  if (a.length % 2 == 1) {
    a = "0" + a
  }
  return b64tob64u(hex2b64(a))
}
function b64utohex(a) {
  return b64tohex(b64utob64(a))
}
var utf8tob64u, b64utoutf8;
if (typeof Buffer === "function") {
  utf8tob64u = function (a) {
    return b64tob64u(new Buffer(a, "utf8").toString("base64"))
  };
  b64utoutf8 = function (a) {
    return new Buffer(b64utob64(a), "base64").toString("utf8")
  }
} else {
  utf8tob64u = function (a) {
    return hextob64u(uricmptohex(encodeURIComponentAll(a)))
  };
  b64utoutf8 = function (a) {
    return decodeURIComponent(hextouricmp(b64utohex(a)))
  }
}
function utf8tob64(a) {
  return hex2b64(uricmptohex(encodeURIComponentAll(a)))
}
function b64toutf8(a) {
  return decodeURIComponent(hextouricmp(b64tohex(a)))
}
function utf8tohex(a) {
  return uricmptohex(encodeURIComponentAll(a))
}
function hextoutf8(a) {
  return decodeURIComponent(hextouricmp(a))
}
function hextorstr(c) {
  var b = "";
  for (var a = 0; a < c.length - 1; a += 2) {
    b += String.fromCharCode(parseInt(c.substr(a, 2), 16))
  }
  return b
}
function rstrtohex(c) {
  var a = "";
  for (var b = 0; b < c.length; b++) {
    a += ("0" + c.charCodeAt(b).toString(16)).slice(- 2)
  }
  return a
}
function hextob64(a) {
  return hex2b64(a)
}
function hextob64nl(b) {
  var a = hextob64(b);
  var c = a.replace(/(.{64})/g, "$1\r\n");
  c = c.replace(/\r\n$/, "");
  return c
}
function b64nltohex(b) {
  var a = b.replace(/[^0-9A-Za-z\/+=]*/g, "");
  var c = b64tohex(a);
  return c
}
function hextoArrayBuffer(d) {
  if (d.length % 2 != 0) {
    throw "input is not even length"
  }
  if (d.match(/^[0-9A-Fa-f]+$/) == null) {
    throw "input is not hexadecimal"
  }
  var b = new ArrayBuffer(d.length / 2);
  var a = new DataView(b);
  for (var c = 0; c < d.length / 2; c++) {
    a.setUint8(c, parseInt(d.substr(c * 2, 2), 16))
  }
  return b
}
function ArrayBuffertohex(b) {
  var d = "";
  var a = new DataView(b);
  for (var c = 0; c < b.byteLength; c++) {
    d += ("00" + a.getUint8(c).toString(16)).slice(- 2)
  }
  return d
}
function uricmptohex(a) {
  return a.replace(/%/g, "")
}
function hextouricmp(a) {
  return a.replace(/(..)/g, "%$1")
}
function encodeURIComponentAll(a) {
  var d = encodeURIComponent(a);
  var b = "";
  for (var c = 0; c < d.length; c++) {
    if (d[c] == "%") {
      b = b + d.substr(c, 3);
      c = c + 2
    } else {
      b = b + "%" + stohex(d[c])
    }
  }
  return b
}
function newline_toUnix(a) {
  a = a.replace(/\r\n/mg, "\n");
  return a
}
function newline_toDos(a) {
  a = a.replace(/\r\n/mg, "\n");
  a = a.replace(/\n/mg, "\r\n");
  return a
}
KJUR.lang.String.isInteger = function (a) {
  if (a.match(/^[0-9]+$/)) {
    return true
  } else {
    if (a.match(/^-[0-9]+$/)) {
      return true
    } else {
      return false
    }
  }
};
KJUR.lang.String.isHex = function (a) {
  if (a.length % 2 == 0 && (a.match(/^[0-9a-f]+$/) || a.match(/^[0-9A-F]+$/))) {
    return true
  } else {
    return false
  }
};
KJUR.lang.String.isBase64 = function (a) {
  a = a.replace(/\s+/g, "");
  if (a.match(/^[0-9A-Za-z+\/]+={0,3}$/) && a.length % 4 == 0) {
    return true
  } else {
    return false
  }
};
KJUR.lang.String.isBase64URL = function (a) {
  if (a.match(/[+/ = ] /)) {
    return false
  }
  a = b64utob64(a);
  return KJUR.lang.String.isBase64(a)
};
KJUR.lang.String.isIntegerArray = function (a) {
  a = a.replace(/\s+/g, "");
  if (a.match(/^\[[0-9,]+\]$/)) {
    return true
  } else {
    return false
  }
};
function intarystrtohex(b) {
  b = b.replace(/^\s*\[\s*/, "");
  b = b.replace(/\s*\]\s*$/, "");
  b = b.replace(/\s*/g, "");
  try {
    var c = b.split(/,/).map(function (g, e, h) {
      var f = parseInt(g);
      if (f < 0 || 255 < f) {
        throw "integer not in range 0-255"
      }
      var d = ("00" + f.toString(16)).slice(- 2);
      return d
    }).join("");
    return c
  } catch (a) {
    throw "malformed integer array string: " + a
  }
}
var strdiffidx = function (c, a) {
  var d = c.length;
  if (c.length > a.length) {
    d = a.length
  }
  for (var b = 0; b < d; b++) {
    if (c.charCodeAt(b) != a.charCodeAt(b)) {
      return b
    }
  }
  if (c.length != a.length) {
    return d
  }
  return - 1
};
/*! crypto-1.1.12.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  KJUR.crypto = {}
}
KJUR.crypto.Util = new
  function () {
    this.DIGESTINFOHEAD = {
      sha1: "3021300906052b0e03021a05000414",
      sha224: "302d300d06096086480165030402040500041c",
      sha256: "3031300d060960864801650304020105000420",
      sha384: "3041300d060960864801650304020205000430",
      sha512: "3051300d060960864801650304020305000440",
      md2: "3020300c06082a864886f70d020205000410",
      md5: "3020300c06082a864886f70d020505000410",
      ripemd160: "3021300906052b2403020105000414",
    };
    this.DEFAULTPROVIDER = {
      md5: "cryptojs",
      sha1: "cryptojs",
      sha224: "cryptojs",
      sha256: "cryptojs",
      sha384: "cryptojs",
      sha512: "cryptojs",
      ripemd160: "cryptojs",
      hmacmd5: "cryptojs",
      hmacsha1: "cryptojs",
      hmacsha224: "cryptojs",
      hmacsha256: "cryptojs",
      hmacsha384: "cryptojs",
      hmacsha512: "cryptojs",
      hmacripemd160: "cryptojs",
      MD5withRSA: "cryptojs/jsrsa",
      SHA1withRSA: "cryptojs/jsrsa",
      SHA224withRSA: "cryptojs/jsrsa",
      SHA256withRSA: "cryptojs/jsrsa",
      SHA384withRSA: "cryptojs/jsrsa",
      SHA512withRSA: "cryptojs/jsrsa",
      RIPEMD160withRSA: "cryptojs/jsrsa",
      MD5withECDSA: "cryptojs/jsrsa",
      SHA1withECDSA: "cryptojs/jsrsa",
      SHA224withECDSA: "cryptojs/jsrsa",
      SHA256withECDSA: "cryptojs/jsrsa",
      SHA384withECDSA: "cryptojs/jsrsa",
      SHA512withECDSA: "cryptojs/jsrsa",
      RIPEMD160withECDSA: "cryptojs/jsrsa",
      SHA1withDSA: "cryptojs/jsrsa",
      SHA224withDSA: "cryptojs/jsrsa",
      SHA256withDSA: "cryptojs/jsrsa",
      MD5withRSAandMGF1: "cryptojs/jsrsa",
      SHA1withRSAandMGF1: "cryptojs/jsrsa",
      SHA224withRSAandMGF1: "cryptojs/jsrsa",
      SHA256withRSAandMGF1: "cryptojs/jsrsa",
      SHA384withRSAandMGF1: "cryptojs/jsrsa",
      SHA512withRSAandMGF1: "cryptojs/jsrsa",
      RIPEMD160withRSAandMGF1: "cryptojs/jsrsa",
    };
    this.CRYPTOJSMESSAGEDIGESTNAME = {
      md5: CryptoJS.algo.MD5,
      sha1: CryptoJS.algo.SHA1,
      sha224: CryptoJS.algo.SHA224,
      sha256: CryptoJS.algo.SHA256,
      sha384: CryptoJS.algo.SHA384,
      sha512: CryptoJS.algo.SHA512,
      ripemd160: CryptoJS.algo.RIPEMD160
    };
    this.getDigestInfoHex = function (a, b) {
      if (typeof this.DIGESTINFOHEAD[b] == "undefined") {
        throw "alg not supported in Util.DIGESTINFOHEAD: " + b
      }
      return this.DIGESTINFOHEAD[b] + a
    };
    this.getPaddedDigestInfoHex = function (h, a, j) {
      var c = this.getDigestInfoHex(h, a);
      var d = j / 4;
      if (c.length + 22 > d) {
        throw "key is too short for SigAlg: keylen=" + j + "," + a
      }
      var b = "0001";
      var k = "00" + c;
      var g = "";
      var l = d - b.length - k.length;
      for (var f = 0; f < l; f += 2) {
        g += "ff"
      }
      var e = b + g + k;
      return e
    };
    this.hashString = function (a, c) {
      var b = new KJUR.crypto.MessageDigest({
        alg: c
      });
      return b.digestString(a)
    };
    this.hashHex = function (b, c) {
      var a = new KJUR.crypto.MessageDigest({
        alg: c
      });
      return a.digestHex(b)
    };
    this.sha1 = function (a) {
      var b = new KJUR.crypto.MessageDigest({
        alg: "sha1",
        prov: "cryptojs"
      });
      return b.digestString(a)
    };
    this.sha256 = function (a) {
      var b = new KJUR.crypto.MessageDigest({
        alg: "sha256",
        prov: "cryptojs"
      });
      return b.digestString(a)
    };
    this.sha256Hex = function (a) {
      var b = new KJUR.crypto.MessageDigest({
        alg: "sha256",
        prov: "cryptojs"
      });
      return b.digestHex(a)
    };
    this.sha512 = function (a) {
      var b = new KJUR.crypto.MessageDigest({
        alg: "sha512",
        prov: "cryptojs"
      });
      return b.digestString(a)
    };
    this.sha512Hex = function (a) {
      var b = new KJUR.crypto.MessageDigest({
        alg: "sha512",
        prov: "cryptojs"
      });
      return b.digestHex(a)
    }
  };
KJUR.crypto.Util.md5 = function (a) {
  var b = new KJUR.crypto.MessageDigest({
    alg: "md5",
    prov: "cryptojs"
  });
  return b.digestString(a)
};
KJUR.crypto.Util.ripemd160 = function (a) {
  var b = new KJUR.crypto.MessageDigest({
    alg: "ripemd160",
    prov: "cryptojs"
  });
  return b.digestString(a)
};
KJUR.crypto.Util.SECURERANDOMGEN = new SecureRandom();
KJUR.crypto.Util.getRandomHexOfNbytes = function (b) {
  var a = new Array(b);
  KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(a);
  return BAtohex(a)
};
KJUR.crypto.Util.getRandomBigIntegerOfNbytes = function (a) {
  return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbytes(a), 16)
};
KJUR.crypto.Util.getRandomHexOfNbits = function (d) {
  var c = d % 8;
  var a = (d - c) / 8;
  var b = new Array(a + 1);
  KJUR.crypto.Util.SECURERANDOMGEN.nextBytes(b);
  b[0] = (((255 << c) & 255) ^ 255) & b[0];
  return BAtohex(b)
};
KJUR.crypto.Util.getRandomBigIntegerOfNbits = function (a) {
  return new BigInteger(KJUR.crypto.Util.getRandomHexOfNbits(a), 16)
};
KJUR.crypto.Util.getRandomBigIntegerZeroToMax = function (b) {
  var a = b.bitLength();
  while (1) {
    var c = KJUR.crypto.Util.getRandomBigIntegerOfNbits(a);
    if (b.compareTo(c) != -1) {
      return c
    }
  }
};
KJUR.crypto.Util.getRandomBigIntegerMinToMax = function (e, b) {
  var c = e.compareTo(b);
  if (c == 1) {
    throw "biMin is greater than biMax"
  }
  if (c == 0) {
    return e
  }
  var a = b.subtract(e);
  var d = KJUR.crypto.Util.getRandomBigIntegerZeroToMax(a);
  return d.add(e)
};
KJUR.crypto.MessageDigest = function (c) {
  var b = null;
  var a = null;
  var d = null;
  this.setAlgAndProvider = function (g, f) {
    g = KJUR.crypto.MessageDigest.getCanonicalAlgName(g);
    if (g !== null && f === undefined) {
      f = KJUR.crypto.Util.DEFAULTPROVIDER[g]
    }
    if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && f == "cryptojs") {
      try {
        this.md = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g].create()
      } catch (e) {
        throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e
      }
      this.updateString = function (h) {
        this.md.update(h)
      };
      this.updateHex = function (h) {
        var i = CryptoJS.enc.Hex.parse(h);
        this.md.update(i)
      };
      this.digest = function () {
        var h = this.md.finalize();
        return h.toString(CryptoJS.enc.Hex)
      };
      this.digestString = function (h) {
        this.updateString(h);
        return this.digest()
      };
      this.digestHex = function (h) {
        this.updateHex(h);
        return this.digest()
      }
    }
    if (":sha256:".indexOf(g) != -1 && f == "sjcl") {
      try {
        this.md = new sjcl.hash.sha256()
      } catch (e) {
        throw "setAlgAndProvider hash alg set fail alg=" + g + "/" + e
      }
      this.updateString = function (h) {
        this.md.update(h)
      };
      this.updateHex = function (i) {
        var h = sjcl.codec.hex.toBits(i);
        this.md.update(h)
      };
      this.digest = function () {
        var h = this.md.finalize();
        return sjcl.codec.hex.fromBits(h)
      };
      this.digestString = function (h) {
        this.updateString(h);
        return this.digest()
      };
      this.digestHex = function (h) {
        this.updateHex(h);
        return this.digest()
      }
    }
  };
  this.updateString = function (e) {
    throw "updateString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName
  };
  this.updateHex = function (e) {
    throw "updateHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName
  };
  this.digest = function () {
    throw "digest() not supported for this alg/prov: " + this.algName + "/" + this.provName
  };
  this.digestString = function (e) {
    throw "digestString(str) not supported for this alg/prov: " + this.algName + "/" + this.provName
  };
  this.digestHex = function (e) {
    throw "digestHex(hex) not supported for this alg/prov: " + this.algName + "/" + this.provName
  };
  if (c !== undefined) {
    if (c.alg !== undefined) {
      this.algName = c.alg;
      if (c.prov === undefined) {
        this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
      }
      this.setAlgAndProvider(this.algName, this.provName)
    }
  }
};
KJUR.crypto.MessageDigest.getCanonicalAlgName = function (a) {
  if (typeof a === "string") {
    a = a.toLowerCase();
    a = a.replace(/-/, "")
  }
  return a
};
KJUR.crypto.MessageDigest.getHashLength = function (c) {
  var b = KJUR.crypto.MessageDigest;
  var a = b.getCanonicalAlgName(c);
  if (b.HASHLENGTH[a] === undefined) {
    throw "not supported algorithm: " + c
  }
  return b.HASHLENGTH[a]
};
KJUR.crypto.MessageDigest.HASHLENGTH = {
  md5: 16,
  sha1: 20,
  sha224: 28,
  sha256: 32,
  sha384: 48,
  sha512: 64,
  ripemd160: 20
};
KJUR.crypto.Mac = function (d) {
  var f = null;
  var c = null;
  var a = null;
  var e = null;
  var b = null;
  this.setAlgAndProvider = function (k, i) {
    k = k.toLowerCase();
    if (k == null) {
      k = "hmacsha1"
    }
    k = k.toLowerCase();
    if (k.substr(0, 4) != "hmac") {
      throw "setAlgAndProvider unsupported HMAC alg: " + k
    }
    if (i === undefined) {
      i = KJUR.crypto.Util.DEFAULTPROVIDER[k]
    }
    this.algProv = k + "/" + i;
    var g = k.substr(4);
    if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(g) != -1 && i == "cryptojs") {
      try {
        var j = KJUR.crypto.Util.CRYPTOJSMESSAGEDIGESTNAME[g];
        this.mac = CryptoJS.algo.HMAC.create(j, this.pass)
      } catch (h) {
        throw "setAlgAndProvider hash alg set fail hashAlg=" + g + "/" + h
      }
      this.updateString = function (l) {
        this.mac.update(l)
      };
      this.updateHex = function (l) {
        var m = CryptoJS.enc.Hex.parse(l);
        this.mac.update(m)
      };
      this.doFinal = function () {
        var l = this.mac.finalize();
        return l.toString(CryptoJS.enc.Hex)
      };
      this.doFinalString = function (l) {
        this.updateString(l);
        return this.doFinal()
      };
      this.doFinalHex = function (l) {
        this.updateHex(l);
        return this.doFinal()
      }
    }
  };
  this.updateString = function (g) {
    throw "updateString(str) not supported for this alg/prov: " + this.algProv
  };
  this.updateHex = function (g) {
    throw "updateHex(hex) not supported for this alg/prov: " + this.algProv
  };
  this.doFinal = function () {
    throw "digest() not supported for this alg/prov: " + this.algProv
  };
  this.doFinalString = function (g) {
    throw "digestString(str) not supported for this alg/prov: " + this.algProv
  };
  this.doFinalHex = function (g) {
    throw "digestHex(hex) not supported for this alg/prov: " + this.algProv
  };
  this.setPassword = function (h) {
    if (typeof h == "string") {
      var g = h;
      if (h.length % 2 == 1 || !h.match(/^[0-9A-Fa-f]+$/)) {
        g = rstrtohex(h)
      }
      this.pass = CryptoJS.enc.Hex.parse(g);
      return
    }
    if (typeof h != "object") {
      throw "KJUR.crypto.Mac unsupported password type: " + h
    }
    var g = null;
    if (h.hex !== undefined) {
      if (h.hex.length % 2 != 0 || !h.hex.match(/^[0-9A-Fa-f]+$/)) {
        throw "Mac: wrong hex password: " + h.hex
      }
      g = h.hex
    }
    if (h.utf8 !== undefined) {
      g = utf8tohex(h.utf8)
    }
    if (h.rstr !== undefined) {
      g = rstrtohex(h.rstr)
    }
    if (h.b64 !== undefined) {
      g = b64tohex(h.b64)
    }
    if (h.b64u !== undefined) {
      g = b64utohex(h.b64u)
    }
    if (g == null) {
      throw "KJUR.crypto.Mac unsupported password type: " + h
    }
    this.pass = CryptoJS.enc.Hex.parse(g)
  };
  if (d !== undefined) {
    if (d.pass !== undefined) {
      this.setPassword(d.pass)
    }
    if (d.alg !== undefined) {
      this.algName = d.alg;
      if (d.prov === undefined) {
        this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
      }
      this.setAlgAndProvider(this.algName, this.provName)
    }
  }
};
KJUR.crypto.Signature = function (o) {
  var q = null;
  var n = null;
  var r = null;
  var c = null;
  var l = null;
  var d = null;
  var k = null;
  var h = null;
  var p = null;
  var e = null;
  var b = -1;
  var g = null;
  var j = null;
  var a = null;
  var i = null;
  var f = null;
  this._setAlgNames = function () {
    var s = this.algName.match(/^(.+)with(.+)$/);
    if (s) {
      this.mdAlgName = s[1].toLowerCase();
      this.pubkeyAlgName = s[2].toLowerCase()
    }
  };
  this._zeroPaddingOfSignature = function (x, w) {
    var v = "";
    var t = w / 4 - x.length;
    for (var u = 0; u < t; u++) {
      v = v + "0"
    }
    return v + x
  };
  this.setAlgAndProvider = function (u, t) {
    this._setAlgNames();
    if (t != "cryptojs/jsrsa") {
      throw "provider not supported: " + t
    }
    if (":md5:sha1:sha224:sha256:sha384:sha512:ripemd160:".indexOf(this.mdAlgName) != -1) {
      try {
        this.md = new KJUR.crypto.MessageDigest({
          alg: this.mdAlgName
        })
      } catch (s) {
        throw "setAlgAndProvider hash alg set fail alg=" + this.mdAlgName + "/" + s
      }
      this.init = function (w, x) {
        var y = null;
        try {
          if (x === undefined) {
            y = KEYUTIL.getKey(w)
          } else {
            y = KEYUTIL.getKey(w, x)
          }
        } catch (v) {
          throw "init failed:" + v
        }
        if (y.isPrivate === true) {
          this.prvKey = y;
          this.state = "SIGN"
        } else {
          if (y.isPublic === true) {
            this.pubKey = y;
            this.state = "VERIFY"
          } else {
            throw "init failed.:" + y
          }
        }
      };
      this.initSign = function (v) {
        if (typeof v.ecprvhex == "string" && typeof v.eccurvename == "string") {
          this.ecprvhex = v.ecprvhex;
          this.eccurvename = v.eccurvename
        } else {
          this.prvKey = v
        }
        this.state = "SIGN"
      };
      this.initVerifyByPublicKey = function (v) {
        if (typeof v.ecpubhex == "string" && typeof v.eccurvename == "string") {
          this.ecpubhex = v.ecpubhex;
          this.eccurvename = v.eccurvename
        } else {
          if (v instanceof KJUR.crypto.ECDSA) {
            this.pubKey = v
          } else {
            if (v instanceof RSAKey) {
              this.pubKey = v
            }
          }
        }
        this.state = "VERIFY"
      };
      this.initVerifyByCertificatePEM = function (v) {
        var w = new X509();
        w.readCertPEM(v);
        this.pubKey = w.subjectPublicKeyRSA;
        this.state = "VERIFY"
      };
      this.updateString = function (v) {
        this.md.updateString(v)
      };
      this.updateHex = function (v) {
        this.md.updateHex(v)
      };
      this.sign = function () {
        this.sHashHex = this.md.digest();
        if (typeof this.ecprvhex != "undefined" && typeof this.eccurvename != "undefined") {
          var v = new KJUR.crypto.ECDSA({
            curve: this.eccurvename
          });
          this.hSign = v.signHex(this.sHashHex, this.ecprvhex)
        } else {
          if (this.prvKey instanceof RSAKey && this.pubkeyAlgName == "rsaandmgf1") {
            this.hSign = this.prvKey.signWithMessageHashPSS(this.sHashHex, this.mdAlgName, this.pssSaltLen)
          } else {
            if (this.prvKey instanceof RSAKey && this.pubkeyAlgName == "rsa") {
              this.hSign = this.prvKey.signWithMessageHash(this.sHashHex, this.mdAlgName)
            } else {
              if (this.prvKey instanceof KJUR.crypto.ECDSA) {
                this.hSign = this.prvKey.signWithMessageHash(this.sHashHex)
              } else {
                if (this.prvKey instanceof KJUR.crypto.DSA) {
                  this.hSign = this.prvKey.signWithMessageHash(this.sHashHex)
                } else {
                  throw "Signature: unsupported public key alg: " + this.pubkeyAlgName
                }
              }
            }
          }
        }
        return this.hSign
      };
      this.signString = function (v) {
        this.updateString(v);
        return this.sign()
      };
      this.signHex = function (v) {
        this.updateHex(v);
        return this.sign()
      };
      this.verify = function (v) {
        this.sHashHex = this.md.digest();
        if (typeof this.ecpubhex != "undefined" && typeof this.eccurvename != "undefined") {
          var w = new KJUR.crypto.ECDSA({
            curve: this.eccurvename
          });
          return w.verifyHex(this.sHashHex, v, this.ecpubhex)
        } else {
          if (this.pubKey instanceof RSAKey && this.pubkeyAlgName == "rsaandmgf1") {
            return this.pubKey.verifyWithMessageHashPSS(this.sHashHex, v, this.mdAlgName, this.pssSaltLen)
          } else {
            if (this.pubKey instanceof RSAKey && this.pubkeyAlgName == "rsa") {
              return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
            } else {
              if (this.pubKey instanceof KJUR.crypto.ECDSA) {
                return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
              } else {
                if (this.pubKey instanceof KJUR.crypto.DSA) {
                  return this.pubKey.verifyWithMessageHash(this.sHashHex, v)
                } else {
                  throw "Signature: unsupported public key alg: " + this.pubkeyAlgName
                }
              }
            }
          }
        }
      }
    }
  };
  this.init = function (s, t) {
    throw "init(key, pass) not supported for this alg:prov=" + this.algProvName
  };
  this.initVerifyByPublicKey = function (s) {
    throw "initVerifyByPublicKey(rsaPubKeyy) not supported for this alg:prov=" + this.algProvName
  };
  this.initVerifyByCertificatePEM = function (s) {
    throw "initVerifyByCertificatePEM(certPEM) not supported for this alg:prov=" + this.algProvName
  };
  this.initSign = function (s) {
    throw "initSign(prvKey) not supported for this alg:prov=" + this.algProvName
  };
  this.updateString = function (s) {
    throw "updateString(str) not supported for this alg:prov=" + this.algProvName
  };
  this.updateHex = function (s) {
    throw "updateHex(hex) not supported for this alg:prov=" + this.algProvName
  };
  this.sign = function () {
    throw "sign() not supported for this alg:prov=" + this.algProvName
  };
  this.signString = function (s) {
    throw "digestString(str) not supported for this alg:prov=" + this.algProvName
  };
  this.signHex = function (s) {
    throw "digestHex(hex) not supported for this alg:prov=" + this.algProvName
  };
  this.verify = function (s) {
    throw "verify(hSigVal) not supported for this alg:prov=" + this.algProvName
  };
  this.initParams = o;
  if (o !== undefined) {
    if (o.alg !== undefined) {
      this.algName = o.alg;
      if (o.prov === undefined) {
        this.provName = KJUR.crypto.Util.DEFAULTPROVIDER[this.algName]
      } else {
        this.provName = o.prov
      }
      this.algProvName = this.algName + ":" + this.provName;
      this.setAlgAndProvider(this.algName, this.provName);
      this._setAlgNames()
    }
    if (o.psssaltlen !== undefined) {
      this.pssSaltLen = o.psssaltlen
    }
    if (o.prvkeypem !== undefined) {
      if (o.prvkeypas !== undefined) {
        throw "both prvkeypem and prvkeypas parameters not supported"
      } else {
        try {
          var q = new RSAKey();
          q.readPrivateKeyFromPEMString(o.prvkeypem);
          this.initSign(q)
        } catch (m) {
          throw "fatal error to load pem private key: " + m
        }
      }
    }
  }
};
KJUR.crypto.Cipher = function (a) { };
KJUR.crypto.Cipher.encrypt = function (e, f, d) {
  if (f instanceof RSAKey && f.isPublic) {
    var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);
    if (c === "RSA") {
      return f.encrypt(e)
    }
    if (c === "RSAOAEP") {
      return f.encryptOAEP(e, "sha1")
    }
    var b = c.match(/^RSAOAEP(\d+)$/);
    if (b !== null) {
      return f.encryptOAEP(e, "sha" + b[1])
    }
    throw "Cipher.encrypt: unsupported algorithm for RSAKey: " + d
  } else {
    throw "Cipher.encrypt: unsupported key or algorithm"
  }
};
KJUR.crypto.Cipher.decrypt = function (e, f, d) {
  if (f instanceof RSAKey && f.isPrivate) {
    var c = KJUR.crypto.Cipher.getAlgByKeyAndName(f, d);
    if (c === "RSA") {
      return f.decrypt(e)
    }
    if (c === "RSAOAEP") {
      return f.decryptOAEP(e, "sha1")
    }
    var b = c.match(/^RSAOAEP(\d+)$/);
    if (b !== null) {
      return f.decryptOAEP(e, "sha" + b[1])
    }
    throw "Cipher.decrypt: unsupported algorithm for RSAKey: " + d
  } else {
    throw "Cipher.decrypt: unsupported key or algorithm"
  }
};
KJUR.crypto.Cipher.getAlgByKeyAndName = function (b, a) {
  if (b instanceof RSAKey) {
    if (":RSA:RSAOAEP:RSAOAEP224:RSAOAEP256:RSAOAEP384:RSAOAEP512:".indexOf(a) != -1) {
      return a
    }
    if (a === null || a === undefined) {
      return "RSA"
    }
    throw "getAlgByKeyAndName: not supported algorithm name for RSAKey: " + a
  }
  throw "getAlgByKeyAndName: not supported algorithm name: " + a
};
KJUR.crypto.OID = new
  function () {
    this.oidhex2name = {
      "2a864886f70d010101": "rsaEncryption",
      "2a8648ce3d0201": "ecPublicKey",
      "2a8648ce380401": "dsa",
      "2a8648ce3d030107": "secp256r1",
      "2b8104001f": "secp192k1",
      "2b81040021": "secp224r1",
      "2b8104000a": "secp256k1",
      "2b81040023": "secp521r1",
      "2b81040022": "secp384r1",
      "2a8648ce380403": "SHA1withDSA",
      "608648016503040301": "SHA224withDSA",
      "608648016503040302": "SHA256withDSA",
    }
  };
/*! ecdsa-modified-1.1.0.js (c) Stephan Thomas, Kenji Urushima | github.com/bitcoinjs/bitcoinjs-lib/blob/master/LICENSE
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  KJUR.crypto = {}
}
KJUR.crypto.ECDSA = function (h) {
  var e = "secp256r1";
  var g = null;
  var b = null;
  var f = null;
  var a = new SecureRandom();
  var d = null;
  this.type = "EC";
  this.isPrivate = false;
  this.isPublic = false;
  function c(s, o, r, n) {
    var j = Math.max(o.bitLength(), n.bitLength());
    var t = s.add2D(r);
    var q = s.curve.getInfinity();
    for (var p = j - 1; p >= 0; --p) {
      q = q.twice2D();
      q.z = BigInteger.ONE;
      if (o.testBit(p)) {
        if (n.testBit(p)) {
          q = q.add2D(t)
        } else {
          q = q.add2D(s)
        }
      } else {
        if (n.testBit(p)) {
          q = q.add2D(r)
        }
      }
    }
    return q
  }
  this.getBigRandom = function (i) {
    return new BigInteger(i.bitLength(), a).mod(i.subtract(BigInteger.ONE)).add(BigInteger.ONE)
  };
  this.setNamedCurve = function (i) {
    this.ecparams = KJUR.crypto.ECParameterDB.getByName(i);
    this.prvKeyHex = null;
    this.pubKeyHex = null;
    this.curveName = i
  };
  this.setPrivateKeyHex = function (i) {
    this.isPrivate = true;
    this.prvKeyHex = i
  };
  this.setPublicKeyHex = function (i) {
    this.isPublic = true;
    this.pubKeyHex = i
  };
  this.getPublicKeyXYHex = function () {
    var k = this.pubKeyHex;
    if (k.substr(0, 2) !== "04") {
      throw "this method supports uncompressed format(04) only"
    }
    var j = this.ecparams.keylen / 4;
    if (k.length !== 2 + j * 2) {
      throw "malformed public key hex length"
    }
    var i = {};
    i.x = k.substr(2, j);
    i.y = k.substr(2 + j);
    return i
  };
  this.getShortNISTPCurveName = function () {
    var i = this.curveName;
    if (i === "secp256r1" || i === "NIST P-256" || i === "P-256" || i === "prime256v1") {
      return "P-256"
    }
    if (i === "secp384r1" || i === "NIST P-384" || i === "P-384") {
      return "P-384"
    }
    return null
  };
  this.generateKeyPairHex = function () {
    var k = this.ecparams.n;
    var n = this.getBigRandom(k);
    var l = this.ecparams.G.multiply(n);
    var q = l.getX().toBigInteger();
    var o = l.getY().toBigInteger();
    var i = this.ecparams.keylen / 4;
    var m = ("0000000000" + n.toString(16)).slice(- i);
    var r = ("0000000000" + q.toString(16)).slice(- i);
    var p = ("0000000000" + o.toString(16)).slice(- i);
    var j = "04" + r + p;
    this.setPrivateKeyHex(m);
    this.setPublicKeyHex(j);
    return {
      ecprvhex: m,
      ecpubhex: j
    }
  };
  this.signWithMessageHash = function (i) {
    return this.signHex(i, this.prvKeyHex)
  };
  this.signHex = function (o, j) {
    var t = new BigInteger(j, 16);
    var l = this.ecparams.n;
    var q = new BigInteger(o, 16);
    do {
      var m = this.getBigRandom(l);
      var u = this.ecparams.G;
      var p = u.multiply(m);
      var i = p.getX().toBigInteger().mod(l)
    } while (i.compareTo(BigInteger.ZERO) <= 0);
    var v = m.modInverse(l).multiply(q.add(t.multiply(i))).mod(l);
    return KJUR.crypto.ECDSA.biRSSigToASN1Sig(i, v)
  };
  this.sign = function (m, u) {
    var q = u;
    var j = this.ecparams.n;
    var p = BigInteger.fromByteArrayUnsigned(m);
    do {
      var l = this.getBigRandom(j);
      var t = this.ecparams.G;
      var o = t.multiply(l);
      var i = o.getX().toBigInteger().mod(j)
    } while (i.compareTo(BigInteger.ZERO) <= 0);
    var v = l.modInverse(j).multiply(p.add(q.multiply(i))).mod(j);
    return this.serializeSig(i, v)
  };
  this.verifyWithMessageHash = function (j, i) {
    return this.verifyHex(j, i, this.pubKeyHex)
  };
  this.verifyHex = function (m, i, p) {
    var l, j;
    var o = KJUR.crypto.ECDSA.parseSigHex(i);
    l = o.r;
    j = o.s;
    var k;
    k = ECPointFp.decodeFromHex(this.ecparams.curve, p);
    var n = new BigInteger(m, 16);
    return this.verifyRaw(n, l, j, k)
  };
  this.verify = function (o, p, j) {
    var l, i;
    if (Bitcoin.Util.isArray(p)) {
      var n = this.parseSig(p);
      l = n.r;
      i = n.s
    } else {
      if ("object" === typeof p && p.r && p.s) {
        l = p.r;
        i = p.s
      } else {
        throw "Invalid value for signature"
      }
    }
    var k;
    if (j instanceof ECPointFp) {
      k = j
    } else {
      if (Bitcoin.Util.isArray(j)) {
        k = ECPointFp.decodeFrom(this.ecparams.curve, j)
      } else {
        throw "Invalid format for pubkey value, must be byte array or ECPointFp"
      }
    }
    var m = BigInteger.fromByteArrayUnsigned(o);
    return this.verifyRaw(m, l, i, k)
  };
  this.verifyRaw = function (o, i, w, m) {
    var l = this.ecparams.n;
    var u = this.ecparams.G;
    if (i.compareTo(BigInteger.ONE) < 0 || i.compareTo(l) >= 0) {
      return false
    }
    if (w.compareTo(BigInteger.ONE) < 0 || w.compareTo(l) >= 0) {
      return false
    }
    var p = w.modInverse(l);
    var k = o.multiply(p).mod(l);
    var j = i.multiply(p).mod(l);
    var q = u.multiply(k).add(m.multiply(j));
    var t = q.getX().toBigInteger().mod(l);
    return t.equals(i)
  };
  this.serializeSig = function (k, j) {
    var l = k.toByteArraySigned();
    var i = j.toByteArraySigned();
    var m = [];
    m.push(2);
    m.push(l.length);
    m = m.concat(l);
    m.push(2);
    m.push(i.length);
    m = m.concat(i);
    m.unshift(m.length);
    m.unshift(48);
    return m
  };
  this.parseSig = function (n) {
    var m;
    if (n[0] != 48) {
      throw new Error("Signature not a valid DERSequence")
    }
    m = 2;
    if (n[m] != 2) {
      throw new Error("First element in signature must be a DERInteger")
    }
    var l = n.slice(m + 2, m + 2 + n[m + 1]);
    m += 2 + n[m + 1];
    if (n[m] != 2) {
      throw new Error("Second element in signature must be a DERInteger")
    }
    var i = n.slice(m + 2, m + 2 + n[m + 1]);
    m += 2 + n[m + 1];
    var k = BigInteger.fromByteArrayUnsigned(l);
    var j = BigInteger.fromByteArrayUnsigned(i);
    return {
      r: k,
      s: j
    }
  };
  this.parseSigCompact = function (m) {
    if (m.length !== 65) {
      throw "Signature has the wrong length"
    }
    var j = m[0] - 27;
    if (j < 0 || j > 7) {
      throw "Invalid signature type"
    }
    var o = this.ecparams.n;
    var l = BigInteger.fromByteArrayUnsigned(m.slice(1, 33)).mod(o);
    var k = BigInteger.fromByteArrayUnsigned(m.slice(33, 65)).mod(o);
    return {
      r: l,
      s: k,
      i: j
    }
  };
  this.readPKCS5PrvKeyHex = function (l) {
    var n = ASN1HEX;
    var m = KJUR.crypto.ECDSA.getName;
    var p = n.getVbyList;
    if (n.isASN1HEX(l) === false) {
      throw "not ASN.1 hex string"
    }
    var i, k, o;
    try {
      i = p(l, 0, [2, 0], "06");
      k = p(l, 0, [1], "04");
      try {
        o = p(l, 0, [3, 0], "03").substr(2)
      } catch (j) { }
    } catch (j) {
      throw "malformed PKCS#1/5 plain ECC private key"
    }
    this.curveName = m(i);
    if (this.curveName === undefined) {
      throw "unsupported curve name"
    }
    this.setNamedCurve(this.curveName);
    this.setPublicKeyHex(o);
    this.setPrivateKeyHex(k);
    this.isPublic = false
  };
  this.readPKCS8PrvKeyHex = function (l) {
    var q = ASN1HEX;
    var i = KJUR.crypto.ECDSA.getName;
    var n = q.getVbyList;
    if (q.isASN1HEX(l) === false) {
      throw "not ASN.1 hex string"
    }
    var j, p, m, k;
    try {
      j = n(l, 0, [1, 0], "06");
      p = n(l, 0, [1, 1], "06");
      m = n(l, 0, [2, 0, 1], "04");
      try {
        k = n(l, 0, [2, 0, 2, 0], "03").substr(2)
      } catch (o) { }
    } catch (o) {
      throw "malformed PKCS#8 plain ECC private key"
    }
    this.curveName = i(p);
    if (this.curveName === undefined) {
      throw "unsupported curve name"
    }
    this.setNamedCurve(this.curveName);
    this.setPublicKeyHex(k);
    this.setPrivateKeyHex(m);
    this.isPublic = false
  };
  this.readPKCS8PubKeyHex = function (l) {
    var n = ASN1HEX;
    var m = KJUR.crypto.ECDSA.getName;
    var p = n.getVbyList;
    if (n.isASN1HEX(l) === false) {
      throw "not ASN.1 hex string"
    }
    var k, i, o;
    try {
      k = p(l, 0, [0, 0], "06");
      i = p(l, 0, [0, 1], "06");
      o = p(l, 0, [1], "03").substr(2)
    } catch (j) {
      throw "malformed PKCS#8 ECC public key"
    }
    this.curveName = m(i);
    if (this.curveName === null) {
      throw "unsupported curve name"
    }
    this.setNamedCurve(this.curveName);
    this.setPublicKeyHex(o)
  };
  this.readCertPubKeyHex = function (k, p) {
    if (p !== 5) {
      p = 6
    }
    var m = ASN1HEX;
    var l = KJUR.crypto.ECDSA.getName;
    var o = m.getVbyList;
    if (m.isASN1HEX(k) === false) {
      throw "not ASN.1 hex string"
    }
    var i, n;
    try {
      i = o(k, 0, [0, p, 0, 1], "06");
      n = o(k, 0, [0, p, 1], "03").substr(2)
    } catch (j) {
      throw "malformed X.509 certificate ECC public key"
    }
    this.curveName = l(i);
    if (this.curveName === null) {
      throw "unsupported curve name"
    }
    this.setNamedCurve(this.curveName);
    this.setPublicKeyHex(n)
  };
  if (h !== undefined) {
    if (h.curve !== undefined) {
      this.curveName = h.curve
    }
  }
  if (this.curveName === undefined) {
    this.curveName = e
  }
  this.setNamedCurve(this.curveName);
  if (h !== undefined) {
    if (h.prv !== undefined) {
      this.setPrivateKeyHex(h.prv)
    }
    if (h.pub !== undefined) {
      this.setPublicKeyHex(h.pub)
    }
  }
};
KJUR.crypto.ECDSA.parseSigHex = function (a) {
  var b = KJUR.crypto.ECDSA.parseSigHexInHexRS(a);
  var d = new BigInteger(b.r, 16);
  var c = new BigInteger(b.s, 16);
  return {
    r: d,
    s: c
  }
};
KJUR.crypto.ECDSA.parseSigHexInHexRS = function (c) {
  if (c.substr(0, 2) != "30") {
    throw "signature is not a ASN.1 sequence"
  }
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(c, 0);
  if (b.length != 2) {
    throw "number of signature ASN.1 sequence elements seem wrong"
  }
  var g = b[0];
  var f = b[1];
  if (c.substr(g, 2) != "02") {
    throw "1st item of sequene of signature is not ASN.1 integer"
  }
  if (c.substr(f, 2) != "02") {
    throw "2nd item of sequene of signature is not ASN.1 integer"
  }
  var e = ASN1HEX.getHexOfV_AtObj(c, g);
  var d = ASN1HEX.getHexOfV_AtObj(c, f);
  return {
    r: e,
    s: d
  }
};
KJUR.crypto.ECDSA.asn1SigToConcatSig = function (c) {
  var d = KJUR.crypto.ECDSA.parseSigHexInHexRS(c);
  var b = d.r;
  var a = d.s;
  if (b.substr(0, 2) == "00" && (((b.length / 2) * 8) % (16 * 8)) == 8) {
    b = b.substr(2)
  }
  if (a.substr(0, 2) == "00" && (((a.length / 2) * 8) % (16 * 8)) == 8) {
    a = a.substr(2)
  }
  if ((((b.length / 2) * 8) % (16 * 8)) != 0) {
    throw "unknown ECDSA sig r length error"
  }
  if ((((a.length / 2) * 8) % (16 * 8)) != 0) {
    throw "unknown ECDSA sig s length error"
  }
  return b + a
};
KJUR.crypto.ECDSA.concatSigToASN1Sig = function (a) {
  if ((((a.length / 2) * 8) % (16 * 8)) != 0) {
    throw "unknown ECDSA concatinated r-s sig  length error"
  }
  var c = a.substr(0, a.length / 2);
  var b = a.substr(a.length / 2);
  return KJUR.crypto.ECDSA.hexRSSigToASN1Sig(c, b)
};
KJUR.crypto.ECDSA.hexRSSigToASN1Sig = function (b, a) {
  var d = new BigInteger(b, 16);
  var c = new BigInteger(a, 16);
  return KJUR.crypto.ECDSA.biRSSigToASN1Sig(d, c)
};
KJUR.crypto.ECDSA.biRSSigToASN1Sig = function (e, c) {
  var b = new KJUR.asn1.DERInteger({
    bigint: e
  });
  var a = new KJUR.asn1.DERInteger({
    bigint: c
  });
  var d = new KJUR.asn1.DERSequence({
    array: [b, a]
  });
  return d.getEncodedHex()
};
KJUR.crypto.ECDSA.getName = function (a) {
  if (a === "2a8648ce3d030107") {
    return "secp256r1"
  }
  if (a === "2b8104000a") {
    return "secp256k1"
  }
  if (a === "2b81040022") {
    return "secp384r1"
  }
  if ("|secp256r1|NIST P-256|P-256|prime256v1|".indexOf(a) !== -1) {
    return "secp256r1"
  }
  if ("|secp256k1|".indexOf(a) !== -1) {
    return "secp256k1"
  }
  if ("|secp384r1|NIST P-384|P-384|".indexOf(a) !== -1) {
    return "secp384r1"
  }
  return null
};
/*! ecparam-1.0.0.js (c) 2013 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  KJUR.crypto = {}
}
KJUR.crypto.ECParameterDB = new
  function () {
    var b = {};
    var c = {};
    function a(d) {
      return new BigInteger(d, 16)
    }
    this.getByName = function (e) {
      var d = e;
      if (typeof c[d] != "undefined") {
        d = c[e]
      }
      if (typeof b[d] != "undefined") {
        return b[d]
      }
      throw "unregistered EC curve name: " + d
    };
    this.regist = function (A, l, o, g, m, e, j, f, k, u, d, x) {
      b[A] = {};
      var s = a(o);
      var z = a(g);
      var y = a(m);
      var t = a(e);
      var w = a(j);
      var r = new ECCurveFp(s, z, y);
      var q = r.decodePointHex("04" + f + k);
      b[A]["name"] = A;
      b[A]["keylen"] = l;
      b[A]["curve"] = r;
      b[A]["G"] = q;
      b[A]["n"] = t;
      b[A]["h"] = w;
      b[A]["oid"] = d;
      b[A]["info"] = x;
      for (var v = 0; v < u.length; v++) {
        c[u[v]] = A
      }
    }
  };
KJUR.crypto.ECParameterDB.regist("secp128r1", 128, "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFC", "E87579C11079F43DD824993C2CEE5ED3", "FFFFFFFE0000000075A30D1B9038A115", "1", "161FF7528B899B2D0C28607CA52C5B86", "CF5AC8395BAFEB13C02DA292DDED7A83", [], "", "secp128r1 : SECG curve over a 128 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp160k1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFAC73", "0", "7", "0100000000000000000001B8FA16DFAB9ACA16B6B3", "1", "3B4C382CE37AA192A4019E763036F4F5DD4D7EBB", "938CF935318FDCED6BC28286531733C3F03C4FEE", [], "", "secp160k1 : SECG curve over a 160 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp160r1", 160, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF7FFFFFFC", "1C97BEFC54BD7A8B65ACF89F81D4D4ADC565FA45", "0100000000000000000001F4C8F927AED3CA752257", "1", "4A96B5688EF573284664698968C38BB913CBFC82", "23A628553168947D59DCC912042351377AC5FB32", [], "", "secp160r1 : SECG curve over a 160 bit prime field");
KJUR.crypto.ECParameterDB.regist("secp192k1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFEE37", "0", "3", "FFFFFFFFFFFFFFFFFFFFFFFE26F2FC170F69466A74DEFD8D", "1", "DB4FF10EC057E9AE26B07D0280B7F4341DA5D1B1EAE06C7D", "9B2F2F6D9C5628A7844163D015BE86344082AA88D95E2F9D", []);
KJUR.crypto.ECParameterDB.regist("secp192r1", 192, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFC", "64210519E59C80E70FA7E9AB72243049FEB8DEECC146B9B1", "FFFFFFFFFFFFFFFFFFFFFFFF99DEF836146BC9B1B4D22831", "1", "188DA80EB03090F67CBF20EB43A18800F4FF0AFD82FF1012", "07192B95FFC8DA78631011ED6B24CDD573F977A11E794811", []);
KJUR.crypto.ECParameterDB.regist("secp224r1", 224, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000001", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFE", "B4050A850C04B3ABF54132565044B0B7D7BFD8BA270B39432355FFB4", "FFFFFFFFFFFFFFFFFFFFFFFFFFFF16A2E0B8F03E13DD29455C5C2A3D", "1", "B70E0CBD6BB4BF7F321390B94A03C1D356C21122343280D6115C1D21", "BD376388B5F723FB4C22DFE6CD4375A05A07476444D5819985007E34", []);
KJUR.crypto.ECParameterDB.regist("secp256k1", 256, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F", "0", "7", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141", "1", "79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798", "483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8", []);
KJUR.crypto.ECParameterDB.regist("secp256r1", 256, "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFF", "FFFFFFFF00000001000000000000000000000000FFFFFFFFFFFFFFFFFFFFFFFC", "5AC635D8AA3A93E7B3EBBD55769886BC651D06B0CC53B0F63BCE3C3E27D2604B", "FFFFFFFF00000000FFFFFFFFFFFFFFFFBCE6FAADA7179E84F3B9CAC2FC632551", "1", "6B17D1F2E12C4247F8BCE6E563A440F277037D812DEB33A0F4A13945D898C296", "4FE342E2FE1A7F9B8EE7EB4A7C0F9E162BCE33576B315ECECBB6406837BF51F5", ["NIST P-256", "P-256", "prime256v1"]);
KJUR.crypto.ECParameterDB.regist("secp384r1", 384, "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFF0000000000000000FFFFFFFC", "B3312FA7E23EE7E4988E056BE3F82D19181D9C6EFE8141120314088F5013875AC656398D8A2ED19D2A85C8EDD3EC2AEF", "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC7634D81F4372DDF581A0DB248B0A77AECEC196ACCC52973", "1", "AA87CA22BE8B05378EB1C71EF320AD746E1D3B628BA79B9859F741E082542A385502F25DBF55296C3A545E3872760AB7", "3617de4a96262c6f5d9e98bf9292dc29f8f41dbd289a147ce9da3113b5f0b8c00a60b1ce1d7e819d7a431d7c90ea0e5f", ["NIST P-384", "P-384"]);
KJUR.crypto.ECParameterDB.regist("secp521r1", 521, "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFC", "051953EB9618E1C9A1F929A21A0B68540EEA2DA725B99B315F3B8B489918EF109E156193951EC7E937B1652C0BD3BB1BF073573DF883D2C34F1EF451FD46B503F00", "1FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFA51868783BF2F966B7FCC0148F709A5D03BB5C9B8899C47AEBB6FB71E91386409", "1", "C6858E06B70404E9CD9E3ECB662395B4429C648139053FB521F828AF606B4D3DBAA14B5E77EFE75928FE1DC127A2FFA8DE3348B3C1856A429BF97E7E31C2E5BD66", "011839296a789a3bc0045c8a5fb42c7d1bd998f54449579b446817afbd17273e662c97ee72995ef42640c550b9013fad0761353c7086a272c24088be94769fd16650", ["NIST P-521", "P-521"]);
/*! dsa-2.1.0.js (c) 2016-2017 Kenji Urushimma | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.crypto == "undefined" || !KJUR.crypto) {
  KJUR.crypto = {}
}
KJUR.crypto.DSA = function () {
  this.p = null;
  this.q = null;
  this.g = null;
  this.y = null;
  this.x = null;
  this.type = "DSA";
  this.isPrivate = false;
  this.isPublic = false;
  this.setPrivate = function (d, c, b, e, a) {
    this.isPrivate = true;
    this.p = d;
    this.q = c;
    this.g = b;
    this.y = e;
    this.x = a
  };
  this.setPrivateHex = function (d, b, f, i, j) {
    var c, a, e, g, h;
    c = new BigInteger(d, 16);
    a = new BigInteger(b, 16);
    e = new BigInteger(f, 16);
    if (typeof i === "string" && i.length > 1) {
      g = new BigInteger(i, 16)
    } else {
      g = null
    }
    h = new BigInteger(j, 16);
    this.setPrivate(c, a, e, g, h)
  };
  this.setPublic = function (c, b, a, d) {
    this.isPublic = true;
    this.p = c;
    this.q = b;
    this.g = a;
    this.y = d;
    this.x = null
  };
  this.setPublicHex = function (f, e, d, g) {
    var b, a, h, c;
    b = new BigInteger(f, 16);
    a = new BigInteger(e, 16);
    h = new BigInteger(d, 16);
    c = new BigInteger(g, 16);
    this.setPublic(b, a, h, c)
  };
  this.signWithMessageHash = function (d) {
    var c = this.p;
    var b = this.q;
    var f = this.g;
    var i = this.y;
    var j = this.x;
    var e = KJUR.crypto.Util.getRandomBigIntegerMinToMax(BigInteger.ONE.add(BigInteger.ONE), b.subtract(BigInteger.ONE));
    var l = d.substr(0, b.bitLength() / 4);
    var h = new BigInteger(l, 16);
    var a = (f.modPow(e, c)).mod(b);
    var n = (e.modInverse(b).multiply(h.add(j.multiply(a)))).mod(b);
    var m = KJUR.asn1.ASN1Util.jsonToASN1HEX({
      seq: [{
        "int": {
          bigint: a
        }
      },
      {
        "int": {
          bigint: n
        }
      }]
    });
    return m
  };
  this.verifyWithMessageHash = function (h, f) {
    var d = this.p;
    var b = this.q;
    var j = this.g;
    var l = this.y;
    var i = this.parseASN1Signature(f);
    var a = i[0];
    var t = i[1];
    var o = h.substr(0, b.bitLength() / 4);
    var k = new BigInteger(o, 16);
    if (BigInteger.ZERO.compareTo(a) > 0 || a.compareTo(b) > 0) {
      throw "invalid DSA signature"
    }
    if (BigInteger.ZERO.compareTo(t) > 0 || t.compareTo(b) > 0) {
      throw "invalid DSA signature"
    }
    var m = t.modInverse(b);
    var e = k.multiply(m).mod(b);
    var c = a.multiply(m).mod(b);
    var n = j.modPow(e, d).multiply(l.modPow(c, d)).mod(d).mod(b);
    return n.compareTo(a) == 0
  };
  this.parseASN1Signature = function (a) {
    try {
      var d = new BigInteger(ASN1HEX.getVbyList(a, 0, [0], "02"), 16);
      var c = new BigInteger(ASN1HEX.getVbyList(a, 0, [1], "02"), 16);
      return [d, c]
    } catch (b) {
      throw "malformed ASN.1 DSA signature"
    }
  };
  this.readPKCS5PrvKeyHex = function (c) {
    var b, a, f, g, i;
    var j = ASN1HEX;
    var d = j.getVbyList;
    if (j.isASN1HEX(c) === false) {
      throw "not ASN.1 hex string"
    }
    try {
      b = d(c, 0, [1], "02");
      a = d(c, 0, [2], "02");
      f = d(c, 0, [3], "02");
      g = d(c, 0, [4], "02");
      i = d(c, 0, [5], "02")
    } catch (e) {
      console.log("EXCEPTION:" + e);
      throw "malformed PKCS#1/5 plain DSA private key"
    }
    this.setPrivateHex(b, a, f, g, i)
  };
  this.readPKCS8PrvKeyHex = function (d) {
    var f, c, b, g;
    var e = ASN1HEX;
    var i = e.getVbyList;
    if (e.isASN1HEX(d) === false) {
      throw "not ASN.1 hex string"
    }
    try {
      f = i(d, 0, [1, 1, 0], "02");
      c = i(d, 0, [1, 1, 1], "02");
      b = i(d, 0, [1, 1, 2], "02");
      g = i(d, 0, [2, 0], "02")
    } catch (a) {
      console.log("EXCEPTION:" + a);
      throw "malformed PKCS#8 plain DSA private key"
    }
    this.setPrivateHex(f, c, b, null, g)
  };
  this.readPKCS8PubKeyHex = function (d) {
    var f, c, b, g;
    var e = ASN1HEX;
    var i = e.getVbyList;
    if (e.isASN1HEX(d) === false) {
      throw "not ASN.1 hex string"
    }
    try {
      f = i(d, 0, [0, 1, 0], "02");
      c = i(d, 0, [0, 1, 1], "02");
      b = i(d, 0, [0, 1, 2], "02");
      g = i(d, 0, [1, 0], "02")
    } catch (a) {
      console.log("EXCEPTION:" + a);
      throw "malformed PKCS#8 DSA public key"
    }
    this.setPublicHex(f, c, b, g)
  };
  this.readCertPubKeyHex = function (c, f) {
    if (f !== 5) {
      f = 6
    }
    var b, a, g, i;
    var j = ASN1HEX;
    var d = j.getVbyList;
    if (j.isASN1HEX(c) === false) {
      throw "not ASN.1 hex string"
    }
    try {
      b = d(c, 0, [0, f, 0, 1, 0], "02");
      a = d(c, 0, [0, f, 0, 1, 1], "02");
      g = d(c, 0, [0, f, 0, 1, 2], "02");
      i = d(c, 0, [0, f, 1, 0], "02")
    } catch (e) {
      console.log("EXCEPTION:" + e);
      throw "malformed X.509 certificate DSA public key"
    }
    this.setPublicHex(b, a, g, i)
  }
};
/*! pkcs5pkey-1.1.0.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
var PKCS5PKEY = function () {
  var c = function (o, q, p) {
    return j(CryptoJS.AES, o, q, p)
  };
  var d = function (o, q, p) {
    return j(CryptoJS.TripleDES, o, q, p)
  };
  var j = function (r, w, t, p) {
    var q = CryptoJS.enc.Hex.parse(w);
    var v = CryptoJS.enc.Hex.parse(t);
    var o = CryptoJS.enc.Hex.parse(p);
    var s = {};
    s.key = v;
    s.iv = o;
    s.ciphertext = q;
    var u = r.decrypt(s, v, {
      iv: o
    });
    return CryptoJS.enc.Hex.stringify(u)
  };
  var k = function (o, q, p) {
    return e(CryptoJS.AES, o, q, p)
  };
  var n = function (o, q, p) {
    return e(CryptoJS.TripleDES, o, q, p)
  };
  var e = function (t, y, w, q) {
    var s = CryptoJS.enc.Hex.parse(y);
    var x = CryptoJS.enc.Hex.parse(w);
    var p = CryptoJS.enc.Hex.parse(q);
    var o = {};
    var v = t.encrypt(s, x, {
      iv: p
    });
    var r = CryptoJS.enc.Hex.parse(v.toString());
    var u = CryptoJS.enc.Base64.stringify(r);
    return u
  };
  var g = {
    "AES-256-CBC": {
      proc: c,
      eproc: k,
      keylen: 32,
      ivlen: 16
    },
    "AES-192-CBC": {
      proc: c,
      eproc: k,
      keylen: 24,
      ivlen: 16
    },
    "AES-128-CBC": {
      proc: c,
      eproc: k,
      keylen: 16,
      ivlen: 16
    },
    "DES-EDE3-CBC": {
      proc: d,
      eproc: n,
      keylen: 24,
      ivlen: 8
    }
  };
  var b = function (o) {
    return g[o]["proc"]
  };
  var l = function (o) {
    var q = CryptoJS.lib.WordArray.random(o);
    var p = CryptoJS.enc.Hex.stringify(q);
    return p
  };
  var m = function (u) {
    var v = {};
    var p = u.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"));
    if (p) {
      v.cipher = p[1];
      v.ivsalt = p[2]
    }
    var o = u.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"));
    if (o) {
      v.type = o[1]
    }
    var t = -1;
    var w = 0;
    if (u.indexOf("\r\n\r\n") != -1) {
      t = u.indexOf("\r\n\r\n");
      w = 2
    }
    if (u.indexOf("\n\n") != -1) {
      t = u.indexOf("\n\n");
      w = 1
    }
    var r = u.indexOf("-----END");
    if (t != -1 && r != -1) {
      var q = u.substring(t + w * 2, r - w);
      q = q.replace(/\s+/g, "");
      v.data = q
    }
    return v
  };
  var i = function (p, x, o) {
    var u = o.substring(0, 16);
    var s = CryptoJS.enc.Hex.parse(u);
    var q = CryptoJS.enc.Utf8.parse(x);
    var t = g[p]["keylen"] + g[p]["ivlen"];
    var w = "";
    var v = null;
    for (; ;) {
      var r = CryptoJS.algo.MD5.create();
      if (v != null) {
        r.update(v)
      }
      r.update(q);
      r.update(s);
      v = r.finalize();
      w = w + CryptoJS.enc.Hex.stringify(v);
      if (w.length >= t * 2) {
        break
      }
    }
    var y = {};
    y.keyhex = w.substr(0, g[p]["keylen"] * 2);
    y.ivhex = w.substr(g[p]["keylen"] * 2, g[p]["ivlen"] * 2);
    return y
  };
  var a = function (o, u, q, v) {
    var r = CryptoJS.enc.Base64.parse(o);
    var p = CryptoJS.enc.Hex.stringify(r);
    var t = g[u]["proc"];
    var s = t(p, q, v);
    return s
  };
  var f = function (o, r, p, t) {
    var q = g[r]["eproc"];
    var s = q(o, p, t);
    return s
  };
  return {
    version: "1.0.5",
    getHexFromPEM: function (o, p) {
      return ASN1HEX.pemToHex(o, p)
    },
    getDecryptedKeyHexByKeyIV: function (p, s, r, q) {
      var o = b(s);
      return o(p, r, q)
    },
    parsePKCS5PEM: function (o) {
      return m(o)
    },
    getKeyAndUnusedIvByPasscodeAndIvsalt: function (p, o, q) {
      return i(p, o, q)
    },
    decryptKeyB64: function (o, q, p, r) {
      return a(o, q, p, r)
    },
    getDecryptedKeyHex: function (x, w) {
      var p = m(x);
      var s = p.type;
      var q = p.cipher;
      var o = p.ivsalt;
      var r = p.data;
      var v = i(q, w, o);
      var u = v.keyhex;
      var t = a(r, q, u, o);
      return t
    },
    getRSAKeyFromEncryptedPKCS5PEM: function (q, p) {
      var r = this.getDecryptedKeyHex(q, p);
      var o = new RSAKey();
      o.readPrivateKeyFromASN1HexString(r);
      return o
    },
    getEncryptedPKCS5PEMFromPrvKeyHex: function (r, y, s, q) {
      if (typeof s == "undefined" || s == null) {
        s = "AES-256-CBC"
      }
      if (typeof g[s] == "undefined") {
        throw "PKCS5PKEY unsupported algorithm: " + s
      }
      if (typeof q == "undefined" || q == null) {
        var u = g[s]["ivlen"];
        var t = l(u);
        q = t.toUpperCase()
      }
      var x = i(s, y, q);
      var w = x.keyhex;
      var v = f(r, s, w, q);
      var p = v.replace(/(.{64})/g, "$1\r\n");
      var o = "-----BEGIN RSA PRIVATE KEY-----\r\n";
      o += "Proc-Type: 4,ENCRYPTED\r\n";
      o += "DEK-Info: " + s + "," + q + "\r\n";
      o += "\r\n";
      o += p;
      o += "\r\n-----END RSA PRIVATE KEY-----\r\n";
      return o
    },
    getEncryptedPKCS5PEMFromRSAKey: function (C, D, o, s) {
      var A = new KJUR.asn1.DERInteger({
        "int": 0
      });
      var v = new KJUR.asn1.DERInteger({
        bigint: C.n
      });
      var z = new KJUR.asn1.DERInteger({
        "int": C.e
      });
      var B = new KJUR.asn1.DERInteger({
        bigint: C.d
      });
      var t = new KJUR.asn1.DERInteger({
        bigint: C.p
      });
      var r = new KJUR.asn1.DERInteger({
        bigint: C.q
      });
      var y = new KJUR.asn1.DERInteger({
        bigint: C.dmp1
      });
      var u = new KJUR.asn1.DERInteger({
        bigint: C.dmq1
      });
      var x = new KJUR.asn1.DERInteger({
        bigint: C.coeff
      });
      var E = new KJUR.asn1.DERSequence({
        array: [A, v, z, B, t, r, y, u, x]
      });
      var w = E.getEncodedHex();
      return this.getEncryptedPKCS5PEMFromPrvKeyHex(w, D, o, s)
    },
    newEncryptedPKCS5PEM: function (o, p, s, t) {
      if (typeof p == "undefined" || p == null) {
        p = 1024
      }
      if (typeof s == "undefined" || s == null) {
        s = "10001"
      }
      var q = new RSAKey();
      q.generate(p, s);
      var r = null;
      if (typeof t == "undefined" || t == null) {
        r = this.getEncryptedPKCS5PEMFromRSAKey(pkey, o)
      } else {
        r = this.getEncryptedPKCS5PEMFromRSAKey(pkey, o, t)
      }
      return r
    },
    getRSAKeyFromPlainPKCS8PEM: function (q) {
      if (q.match(/ENCRYPTED/)) {
        throw "pem shall be not ENCRYPTED"
      }
      var p = ASN1HEX.pemToHex(q, "PRIVATE KEY");
      var o = this.getRSAKeyFromPlainPKCS8Hex(p);
      return o
    },
    getRSAKeyFromPlainPKCS8Hex: function (p) {
      var o = new RSAKey();
      o.readPKCS8PrvKeyHex(p);
      return o
    },
    parseHexOfEncryptedPKCS8: function (v) {
      var r = {};
      var q = ASN1HEX.getPosArrayOfChildren_AtObj(v, 0);
      if (q.length != 2) {
        throw "malformed format: SEQUENCE(0).items != 2: " + q.length
      }
      r.ciphertext = ASN1HEX.getHexOfV_AtObj(v, q[1]);
      var x = ASN1HEX.getPosArrayOfChildren_AtObj(v, q[0]);
      if (x.length != 2) {
        throw "malformed format: SEQUENCE(0.0).items != 2: " + x.length
      }
      if (ASN1HEX.getHexOfV_AtObj(v, x[0]) != "2a864886f70d01050d") {
        throw "this only supports pkcs5PBES2"
      }
      var o = ASN1HEX.getPosArrayOfChildren_AtObj(v, x[1]);
      if (x.length != 2) {
        throw "malformed format: SEQUENCE(0.0.1).items != 2: " + o.length
      }
      var p = ASN1HEX.getPosArrayOfChildren_AtObj(v, o[1]);
      if (p.length != 2) {
        throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + p.length
      }
      if (ASN1HEX.getHexOfV_AtObj(v, p[0]) != "2a864886f70d0307") {
        throw "this only supports TripleDES"
      }
      r.encryptionSchemeAlg = "TripleDES";
      r.encryptionSchemeIV = ASN1HEX.getHexOfV_AtObj(v, p[1]);
      var s = ASN1HEX.getPosArrayOfChildren_AtObj(v, o[0]);
      if (s.length != 2) {
        throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + s.length
      }
      if (ASN1HEX.getHexOfV_AtObj(v, s[0]) != "2a864886f70d01050c") {
        throw "this only supports pkcs5PBKDF2"
      }
      var w = ASN1HEX.getPosArrayOfChildren_AtObj(v, s[1]);
      if (w.length < 2) {
        throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + w.length
      }
      r.pbkdf2Salt = ASN1HEX.getHexOfV_AtObj(v, w[0]);
      var t = ASN1HEX.getHexOfV_AtObj(v, w[1]);
      try {
        r.pbkdf2Iter = parseInt(t, 16)
      } catch (u) {
        throw "malformed format pbkdf2Iter: " + t
      }
      return r
    },
    getPBKDF2KeyHexFromParam: function (t, o) {
      var s = CryptoJS.enc.Hex.parse(t.pbkdf2Salt);
      var p = t.pbkdf2Iter;
      var r = CryptoJS.PBKDF2(o, s, {
        keySize: 192 / 32,
        iterations: p
      });
      var q = CryptoJS.enc.Hex.stringify(r);
      return q
    },
    getPlainPKCS8HexFromEncryptedPKCS8PEM: function (w, x) {
      var q = ASN1HEX.pemToHex(w, "ENCRYPTED PRIVATE KEY");
      var o = this.parseHexOfEncryptedPKCS8(q);
      var t = PKCS5PKEY.getPBKDF2KeyHexFromParam(o, x);
      var u = {};
      u.ciphertext = CryptoJS.enc.Hex.parse(o.ciphertext);
      var s = CryptoJS.enc.Hex.parse(t);
      var r = CryptoJS.enc.Hex.parse(o.encryptionSchemeIV);
      var v = CryptoJS.TripleDES.decrypt(u, s, {
        iv: r
      });
      var p = CryptoJS.enc.Hex.stringify(v);
      return p
    },
    getRSAKeyFromEncryptedPKCS8PEM: function (r, q) {
      var p = this.getPlainPKCS8HexFromEncryptedPKCS8PEM(r, q);
      var o = this.getRSAKeyFromPlainPKCS8Hex(p);
      return o
    },
    getKeyFromEncryptedPKCS8PEM: function (r, p) {
      var o = this.getPlainPKCS8HexFromEncryptedPKCS8PEM(r, p);
      var q = this.getKeyFromPlainPrivatePKCS8Hex(o);
      return q
    },
    parsePlainPrivatePKCS8Hex: function (r) {
      var p = {};
      p.algparam = null;
      if (r.substr(0, 2) != "30") {
        throw "malformed plain PKCS8 private key(code:001)"
      }
      var q = ASN1HEX.getPosArrayOfChildren_AtObj(r, 0);
      if (q.length != 3) {
        throw "malformed plain PKCS8 private key(code:002)"
      }
      if (r.substr(q[1], 2) != "30") {
        throw "malformed PKCS8 private key(code:003)"
      }
      var o = ASN1HEX.getPosArrayOfChildren_AtObj(r, q[1]);
      if (o.length != 2) {
        throw "malformed PKCS8 private key(code:004)"
      }
      if (r.substr(o[0], 2) != "06") {
        throw "malformed PKCS8 private key(code:005)"
      }
      p.algoid = ASN1HEX.getHexOfV_AtObj(r, o[0]);
      if (r.substr(o[1], 2) == "06") {
        p.algparam = ASN1HEX.getHexOfV_AtObj(r, o[1])
      }
      if (r.substr(q[2], 2) != "04") {
        throw "malformed PKCS8 private key(code:006)"
      }
      p.keyidx = ASN1HEX.getStartPosOfV_AtObj(r, q[2]);
      return p
    },
    getKeyFromPlainPrivatePKCS8PEM: function (p) {
      var o = ASN1HEX.pemToHex(p, "PRIVATE KEY");
      var q = this.getKeyFromPlainPrivatePKCS8Hex(o);
      return q
    },
    getKeyFromPlainPrivatePKCS8Hex: function (o) {
      var p = this.parsePlainPrivatePKCS8Hex(o);
      var q;
      if (p.algoid == "2a864886f70d010101") {
        q = new RSAKey()
      } else {
        if (p.algoid == "2a8648ce380401") {
          q = new KJUR.crypto.DSA()
        } else {
          if (p.algoid == "2a8648ce3d0201") {
            q = new KJUR.crypto.ECDSA()
          } else {
            throw "unsupported private key algorithm"
          }
        }
      }
      q.readPKCS8PrvKeyHex(o);
      return q
    },
    getRSAKeyFromPublicPKCS8PEM: function (p) {
      var q = ASN1HEX.pemToHex(p, "PUBLIC KEY");
      var o = this.getRSAKeyFromPublicPKCS8Hex(q);
      return o
    },
    getKeyFromPublicPKCS8PEM: function (p) {
      var q = ASN1HEX.pemToHex(p, "PUBLIC KEY");
      var o = this.getKeyFromPublicPKCS8Hex(q);
      return o
    },
    getKeyFromPublicPKCS8Hex: function (o) {
      var p;
      var q = ASN1HEX.getVbyList(h, 0, [0, 0], "06");
      if (q === "2a864886f70d010101") {
        p = new RSAKey()
      } else {
        if (q === "2a8648ce380401") {
          p = new KJUR.crypto.DSA()
        } else {
          if (q === "2a8648ce3d0201") {
            p = new KJUR.crypto.ECDSA()
          } else {
            throw "unsupported PKCS#8 public key hex"
          }
        }
      }
      p.readPKCS8PubKeyHex(h);
      return p
    },
    parsePublicRawRSAKeyHex: function (q) {
      var o = {};
      if (q.substr(0, 2) != "30") {
        throw "malformed RSA key(code:001)"
      }
      var p = ASN1HEX.getPosArrayOfChildren_AtObj(q, 0);
      if (p.length != 2) {
        throw "malformed RSA key(code:002)"
      }
      if (q.substr(p[0], 2) != "02") {
        throw "malformed RSA key(code:003)"
      }
      o.n = ASN1HEX.getHexOfV_AtObj(q, p[0]);
      if (q.substr(p[1], 2) != "02") {
        throw "malformed RSA key(code:004)"
      }
      o.e = ASN1HEX.getHexOfV_AtObj(q, p[1]);
      return o
    },
    parsePrivateRawRSAKeyHexAtObj: function (p, r) {
      var q = r.keyidx;
      if (p.substr(q, 2) != "30") {
        throw "malformed RSA private key(code:001)"
      }
      var o = ASN1HEX.getPosArrayOfChildren_AtObj(p, q);
      if (o.length != 9) {
        throw "malformed RSA private key(code:002)"
      }
      r.key = {};
      r.key.n = ASN1HEX.getHexOfV_AtObj(p, o[1]);
      r.key.e = ASN1HEX.getHexOfV_AtObj(p, o[2]);
      r.key.d = ASN1HEX.getHexOfV_AtObj(p, o[3]);
      r.key.p = ASN1HEX.getHexOfV_AtObj(p, o[4]);
      r.key.q = ASN1HEX.getHexOfV_AtObj(p, o[5]);
      r.key.dp = ASN1HEX.getHexOfV_AtObj(p, o[6]);
      r.key.dq = ASN1HEX.getHexOfV_AtObj(p, o[7]);
      r.key.co = ASN1HEX.getHexOfV_AtObj(p, o[8])
    },
    parsePrivateRawECKeyHexAtObj: function (p, r) {
      var q = r.keyidx;
      if (p.substr(q, 2) != "30") {
        throw "malformed ECC private key(code:001)"
      }
      var o = ASN1HEX.getPosArrayOfChildren_AtObj(p, q);
      if (o.length != 3) {
        throw "malformed ECC private key(code:002)"
      }
      if (p.substr(o[1], 2) != "04") {
        throw "malformed ECC private key(code:003)"
      }
      r.key = ASN1HEX.getHexOfV_AtObj(p, o[1])
    },
    parsePublicPKCS8Hex: function (r) {
      var p = {};
      p.algparam = null;
      var q = ASN1HEX.getPosArrayOfChildren_AtObj(r, 0);
      if (q.length != 2) {
        throw "outer DERSequence shall have 2 elements: " + q.length
      }
      var s = q[0];
      if (r.substr(s, 2) != "30") {
        throw "malformed PKCS8 public key(code:001)"
      }
      var o = ASN1HEX.getPosArrayOfChildren_AtObj(r, s);
      if (o.length != 2) {
        throw "malformed PKCS8 public key(code:002)"
      }
      if (r.substr(o[0], 2) != "06") {
        throw "malformed PKCS8 public key(code:003)"
      }
      p.algoid = ASN1HEX.getHexOfV_AtObj(r, o[0]);
      if (r.substr(o[1], 2) == "06") {
        p.algparam = ASN1HEX.getHexOfV_AtObj(r, o[1])
      }
      if (r.substr(q[1], 2) != "03") {
        throw "malformed PKCS8 public key(code:004)"
      }
      p.key = ASN1HEX.getHexOfV_AtObj(r, q[1]).substr(2);
      return p
    },
    getRSAKeyFromPublicPKCS8Hex: function (o) {
      var p = new RSAKey();
      p.readPKCS8PubKeyHex(o);
      return p
    },
  }
}();
/*! keyutil-1.0.15.js (c) 2013-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
var KEYUTIL = function () {
  var d = function (p, r, q) {
    return k(CryptoJS.AES, p, r, q)
  };
  var e = function (p, r, q) {
    return k(CryptoJS.TripleDES, p, r, q)
  };
  var a = function (p, r, q) {
    return k(CryptoJS.DES, p, r, q)
  };
  var k = function (s, x, u, q) {
    var r = CryptoJS.enc.Hex.parse(x);
    var w = CryptoJS.enc.Hex.parse(u);
    var p = CryptoJS.enc.Hex.parse(q);
    var t = {};
    t.key = w;
    t.iv = p;
    t.ciphertext = r;
    var v = s.decrypt(t, w, {
      iv: p
    });
    return CryptoJS.enc.Hex.stringify(v)
  };
  var l = function (p, r, q) {
    return g(CryptoJS.AES, p, r, q)
  };
  var o = function (p, r, q) {
    return g(CryptoJS.TripleDES, p, r, q)
  };
  var f = function (p, r, q) {
    return g(CryptoJS.DES, p, r, q)
  };
  var g = function (t, y, v, q) {
    var s = CryptoJS.enc.Hex.parse(y);
    var x = CryptoJS.enc.Hex.parse(v);
    var p = CryptoJS.enc.Hex.parse(q);
    var w = t.encrypt(s, x, {
      iv: p
    });
    var r = CryptoJS.enc.Hex.parse(w.toString());
    var u = CryptoJS.enc.Base64.stringify(r);
    return u
  };
  var i = {
    "AES-256-CBC": {
      proc: d,
      eproc: l,
      keylen: 32,
      ivlen: 16
    },
    "AES-192-CBC": {
      proc: d,
      eproc: l,
      keylen: 24,
      ivlen: 16
    },
    "AES-128-CBC": {
      proc: d,
      eproc: l,
      keylen: 16,
      ivlen: 16
    },
    "DES-EDE3-CBC": {
      proc: e,
      eproc: o,
      keylen: 24,
      ivlen: 8
    },
    "DES-CBC": {
      proc: a,
      eproc: f,
      keylen: 8,
      ivlen: 8
    }
  };
  var c = function (p) {
    return i[p]["proc"]
  };
  var m = function (p) {
    var r = CryptoJS.lib.WordArray.random(p);
    var q = CryptoJS.enc.Hex.stringify(r);
    return q
  };
  var n = function (v) {
    var w = {};
    var q = v.match(new RegExp("DEK-Info: ([^,]+),([0-9A-Fa-f]+)", "m"));
    if (q) {
      w.cipher = q[1];
      w.ivsalt = q[2]
    }
    var p = v.match(new RegExp("-----BEGIN ([A-Z]+) PRIVATE KEY-----"));
    if (p) {
      w.type = p[1]
    }
    var u = -1;
    var x = 0;
    if (v.indexOf("\r\n\r\n") != -1) {
      u = v.indexOf("\r\n\r\n");
      x = 2
    }
    if (v.indexOf("\n\n") != -1) {
      u = v.indexOf("\n\n");
      x = 1
    }
    var t = v.indexOf("-----END");
    if (u != -1 && t != -1) {
      var r = v.substring(u + x * 2, t - x);
      r = r.replace(/\s+/g, "");
      w.data = r
    }
    return w
  };
  var j = function (q, y, p) {
    var v = p.substring(0, 16);
    var t = CryptoJS.enc.Hex.parse(v);
    var r = CryptoJS.enc.Utf8.parse(y);
    var u = i[q]["keylen"] + i[q]["ivlen"];
    var x = "";
    var w = null;
    for (; ;) {
      var s = CryptoJS.algo.MD5.create();
      if (w != null) {
        s.update(w)
      }
      s.update(r);
      s.update(t);
      w = s.finalize();
      x = x + CryptoJS.enc.Hex.stringify(w);
      if (x.length >= u * 2) {
        break
      }
    }
    var z = {};
    z.keyhex = x.substr(0, i[q]["keylen"] * 2);
    z.ivhex = x.substr(i[q]["keylen"] * 2, i[q]["ivlen"] * 2);
    return z
  };
  var b = function (p, v, r, w) {
    var s = CryptoJS.enc.Base64.parse(p);
    var q = CryptoJS.enc.Hex.stringify(s);
    var u = i[v]["proc"];
    var t = u(q, r, w);
    return t
  };
  var h = function (p, s, q, u) {
    var r = i[s]["eproc"];
    var t = r(p, q, u);
    return t
  };
  return {
    version: "1.0.0",
    getHexFromPEM: function (p, q) {
      return ASN1HEX.pemToHex(p, q)
    },
    getDecryptedKeyHexByKeyIV: function (q, t, s, r) {
      var p = c(t);
      return p(q, s, r)
    },
    parsePKCS5PEM: function (p) {
      return n(p)
    },
    getKeyAndUnusedIvByPasscodeAndIvsalt: function (q, p, r) {
      return j(q, p, r)
    },
    decryptKeyB64: function (p, r, q, s) {
      return b(p, r, q, s)
    },
    getDecryptedKeyHex: function (y, x) {
      var q = n(y);
      var t = q.type;
      var r = q.cipher;
      var p = q.ivsalt;
      var s = q.data;
      var w = j(r, x, p);
      var v = w.keyhex;
      var u = b(s, r, v, p);
      return u
    },
    getRSAKeyFromEncryptedPKCS5PEM: function (r, q) {
      var s = this.getDecryptedKeyHex(r, q);
      var p = new RSAKey();
      p.readPrivateKeyFromASN1HexString(s);
      return p
    },
    getEncryptedPKCS5PEMFromPrvKeyHex: function (x, s, A, t, r) {
      var p = "";
      if (typeof t == "undefined" || t == null) {
        t = "AES-256-CBC"
      }
      if (typeof i[t] == "undefined") {
        throw "KEYUTIL unsupported algorithm: " + t
      }
      if (typeof r == "undefined" || r == null) {
        var v = i[t]["ivlen"];
        var u = m(v);
        r = u.toUpperCase()
      }
      var z = j(t, A, r);
      var y = z.keyhex;
      var w = h(s, t, y, r);
      var q = w.replace(/(.{64})/g, "$1\r\n");
      var p = "-----BEGIN " + x + " PRIVATE KEY-----\r\n";
      p += "Proc-Type: 4,ENCRYPTED\r\n";
      p += "DEK-Info: " + t + "," + r + "\r\n";
      p += "\r\n";
      p += q;
      p += "\r\n-----END " + x + " PRIVATE KEY-----\r\n";
      return p
    },
    getEncryptedPKCS5PEMFromRSAKey: function (D, E, r, t) {
      var B = new KJUR.asn1.DERInteger({
        "int": 0
      });
      var w = new KJUR.asn1.DERInteger({
        bigint: D.n
      });
      var A = new KJUR.asn1.DERInteger({
        "int": D.e
      });
      var C = new KJUR.asn1.DERInteger({
        bigint: D.d
      });
      var u = new KJUR.asn1.DERInteger({
        bigint: D.p
      });
      var s = new KJUR.asn1.DERInteger({
        bigint: D.q
      });
      var z = new KJUR.asn1.DERInteger({
        bigint: D.dmp1
      });
      var v = new KJUR.asn1.DERInteger({
        bigint: D.dmq1
      });
      var y = new KJUR.asn1.DERInteger({
        bigint: D.coeff
      });
      var F = new KJUR.asn1.DERSequence({
        array: [B, w, A, C, u, s, z, v, y]
      });
      var x = F.getEncodedHex();
      return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", x, E, r, t)
    },
    newEncryptedPKCS5PEM: function (p, q, t, u) {
      if (typeof q == "undefined" || q == null) {
        q = 1024
      }
      if (typeof t == "undefined" || t == null) {
        t = "10001"
      }
      var r = new RSAKey();
      r.generate(q, t);
      var s = null;
      if (typeof u == "undefined" || u == null) {
        s = this.getEncryptedPKCS5PEMFromRSAKey(r, p)
      } else {
        s = this.getEncryptedPKCS5PEMFromRSAKey(r, p, u)
      }
      return s
    },
    getRSAKeyFromPlainPKCS8PEM: function (r) {
      if (r.match(/ENCRYPTED/)) {
        throw "pem shall be not ENCRYPTED"
      }
      var q = ASN1HEX.pemToHex(r, "PRIVATE KEY");
      var p = this.getRSAKeyFromPlainPKCS8Hex(q);
      return p
    },
    getRSAKeyFromPlainPKCS8Hex: function (q) {
      var p = new RSAKey();
      p.readPKCS8PrvKeyHex(q);
      return p
    },
    parseHexOfEncryptedPKCS8: function (w) {
      var s = {};
      var r = ASN1HEX.getPosArrayOfChildren_AtObj(w, 0);
      if (r.length != 2) {
        throw "malformed format: SEQUENCE(0).items != 2: " + r.length
      }
      s.ciphertext = ASN1HEX.getHexOfV_AtObj(w, r[1]);
      var y = ASN1HEX.getPosArrayOfChildren_AtObj(w, r[0]);
      if (y.length != 2) {
        throw "malformed format: SEQUENCE(0.0).items != 2: " + y.length
      }
      if (ASN1HEX.getHexOfV_AtObj(w, y[0]) != "2a864886f70d01050d") {
        throw "this only supports pkcs5PBES2"
      }
      var p = ASN1HEX.getPosArrayOfChildren_AtObj(w, y[1]);
      if (y.length != 2) {
        throw "malformed format: SEQUENCE(0.0.1).items != 2: " + p.length
      }
      var q = ASN1HEX.getPosArrayOfChildren_AtObj(w, p[1]);
      if (q.length != 2) {
        throw "malformed format: SEQUENCE(0.0.1.1).items != 2: " + q.length
      }
      if (ASN1HEX.getHexOfV_AtObj(w, q[0]) != "2a864886f70d0307") {
        throw "this only supports TripleDES"
      }
      s.encryptionSchemeAlg = "TripleDES";
      s.encryptionSchemeIV = ASN1HEX.getHexOfV_AtObj(w, q[1]);
      var t = ASN1HEX.getPosArrayOfChildren_AtObj(w, p[0]);
      if (t.length != 2) {
        throw "malformed format: SEQUENCE(0.0.1.0).items != 2: " + t.length
      }
      if (ASN1HEX.getHexOfV_AtObj(w, t[0]) != "2a864886f70d01050c") {
        throw "this only supports pkcs5PBKDF2"
      }
      var x = ASN1HEX.getPosArrayOfChildren_AtObj(w, t[1]);
      if (x.length < 2) {
        throw "malformed format: SEQUENCE(0.0.1.0.1).items < 2: " + x.length
      }
      s.pbkdf2Salt = ASN1HEX.getHexOfV_AtObj(w, x[0]);
      var u = ASN1HEX.getHexOfV_AtObj(w, x[1]);
      try {
        s.pbkdf2Iter = parseInt(u, 16)
      } catch (v) {
        throw "malformed format pbkdf2Iter: " + u
      }
      return s
    },
    getPBKDF2KeyHexFromParam: function (u, p) {
      var t = CryptoJS.enc.Hex.parse(u.pbkdf2Salt);
      var q = u.pbkdf2Iter;
      var s = CryptoJS.PBKDF2(p, t, {
        keySize: 192 / 32,
        iterations: q
      });
      var r = CryptoJS.enc.Hex.stringify(s);
      return r
    },
    getPlainPKCS8HexFromEncryptedPKCS8PEM: function (x, y) {
      var r = ASN1HEX.pemToHex(x, "ENCRYPTED PRIVATE KEY");
      var p = this.parseHexOfEncryptedPKCS8(r);
      var u = KEYUTIL.getPBKDF2KeyHexFromParam(p, y);
      var v = {};
      v.ciphertext = CryptoJS.enc.Hex.parse(p.ciphertext);
      var t = CryptoJS.enc.Hex.parse(u);
      var s = CryptoJS.enc.Hex.parse(p.encryptionSchemeIV);
      var w = CryptoJS.TripleDES.decrypt(v, t, {
        iv: s
      });
      var q = CryptoJS.enc.Hex.stringify(w);
      return q
    },
    getRSAKeyFromEncryptedPKCS8PEM: function (s, r) {
      var q = this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s, r);
      var p = this.getRSAKeyFromPlainPKCS8Hex(q);
      return p
    },
    getKeyFromEncryptedPKCS8PEM: function (s, q) {
      var p = this.getPlainPKCS8HexFromEncryptedPKCS8PEM(s, q);
      var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
      return r
    },
    parsePlainPrivatePKCS8Hex: function (s) {
      var q = {};
      q.algparam = null;
      if (s.substr(0, 2) != "30") {
        throw "malformed plain PKCS8 private key(code:001)"
      }
      var r = ASN1HEX.getPosArrayOfChildren_AtObj(s, 0);
      if (r.length != 3) {
        throw "malformed plain PKCS8 private key(code:002)"
      }
      if (s.substr(r[1], 2) != "30") {
        throw "malformed PKCS8 private key(code:003)"
      }
      var p = ASN1HEX.getPosArrayOfChildren_AtObj(s, r[1]);
      if (p.length != 2) {
        throw "malformed PKCS8 private key(code:004)"
      }
      if (s.substr(p[0], 2) != "06") {
        throw "malformed PKCS8 private key(code:005)"
      }
      q.algoid = ASN1HEX.getHexOfV_AtObj(s, p[0]);
      if (s.substr(p[1], 2) == "06") {
        q.algparam = ASN1HEX.getHexOfV_AtObj(s, p[1])
      }
      if (s.substr(r[2], 2) != "04") {
        throw "malformed PKCS8 private key(code:006)"
      }
      q.keyidx = ASN1HEX.getStartPosOfV_AtObj(s, r[2]);
      return q
    },
    getKeyFromPlainPrivatePKCS8PEM: function (q) {
      var p = ASN1HEX.pemToHex(q, "PRIVATE KEY");
      var r = this.getKeyFromPlainPrivatePKCS8Hex(p);
      return r
    },
    getKeyFromPlainPrivatePKCS8Hex: function (p) {
      var q = this.parsePlainPrivatePKCS8Hex(p);
      var r;
      if (q.algoid == "2a864886f70d010101") {
        r = new RSAKey()
      } else {
        if (q.algoid == "2a8648ce380401") {
          r = new KJUR.crypto.DSA()
        } else {
          if (q.algoid == "2a8648ce3d0201") {
            r = new KJUR.crypto.ECDSA()
          } else {
            throw "unsupported private key algorithm"
          }
        }
      }
      r.readPKCS8PrvKeyHex(p);
      return r
    },
    getRSAKeyFromPublicPKCS8PEM: function (q) {
      var r = ASN1HEX.pemToHex(q, "PUBLIC KEY");
      var p = this.getRSAKeyFromPublicPKCS8Hex(r);
      return p
    },
    getKeyFromPublicPKCS8PEM: function (q) {
      var r = ASN1HEX.pemToHex(q, "PUBLIC KEY");
      var p = this.getKeyFromPublicPKCS8Hex(r);
      return p
    },
    getKeyFromPublicPKCS8Hex: function (q) {
      var p;
      var r = ASN1HEX.getVbyList(q, 0, [0, 0], "06");
      if (r === "2a864886f70d010101") {
        p = new RSAKey()
      } else {
        if (r === "2a8648ce380401") {
          p = new KJUR.crypto.DSA()
        } else {
          if (r === "2a8648ce3d0201") {
            p = new KJUR.crypto.ECDSA()
          } else {
            throw "unsupported PKCS#8 public key hex"
          }
        }
      }
      p.readPKCS8PubKeyHex(q);
      return p
    },
    parsePublicRawRSAKeyHex: function (r) {
      var p = {};
      if (r.substr(0, 2) != "30") {
        throw "malformed RSA key(code:001)"
      }
      var q = ASN1HEX.getPosArrayOfChildren_AtObj(r, 0);
      if (q.length != 2) {
        throw "malformed RSA key(code:002)"
      }
      if (r.substr(q[0], 2) != "02") {
        throw "malformed RSA key(code:003)"
      }
      p.n = ASN1HEX.getHexOfV_AtObj(r, q[0]);
      if (r.substr(q[1], 2) != "02") {
        throw "malformed RSA key(code:004)"
      }
      p.e = ASN1HEX.getHexOfV_AtObj(r, q[1]);
      return p
    },
    parsePrivateRawRSAKeyHexAtObj: function (q, u) {
      var t = ASN1HEX;
      var r = t.getHexOfV_AtObj;
      var s = t.getDecendantIndexByNthList(q, 0, [2, 0]);
      var p = t.getPosArrayOfChildren_AtObj(q, s);
      if (p.length !== 9) {
        throw "malformed PKCS#8 plain RSA private key"
      }
      u.key = {};
      u.key.n = r(q, p[1]);
      u.key.e = r(q, p[2]);
      u.key.d = r(q, p[3]);
      u.key.p = r(q, p[4]);
      u.key.q = r(q, p[5]);
      u.key.dp = r(q, p[6]);
      u.key.dq = r(q, p[7]);
      u.key.co = r(q, p[8])
    },
    parsePrivateRawECKeyHexAtObj: function (p, t) {
      var s = ASN1HEX;
      var q = t.keyidx;
      var r = new KJUR.crypto.ECDSA();
      r.readPKCS8PrvKeyHex(p);
      t.key = r.prvKeyHex;
      t.pubkey = r.pubKeyHex
    },
    parsePublicPKCS8Hex: function (s) {
      var q = {};
      q.algparam = null;
      var r = ASN1HEX.getPosArrayOfChildren_AtObj(s, 0);
      if (r.length != 2) {
        throw "outer DERSequence shall have 2 elements: " + r.length
      }
      var t = r[0];
      if (s.substr(t, 2) != "30") {
        throw "malformed PKCS8 public key(code:001)"
      }
      var p = ASN1HEX.getPosArrayOfChildren_AtObj(s, t);
      if (p.length != 2) {
        throw "malformed PKCS8 public key(code:002)"
      }
      if (s.substr(p[0], 2) != "06") {
        throw "malformed PKCS8 public key(code:003)"
      }
      q.algoid = ASN1HEX.getHexOfV_AtObj(s, p[0]);
      if (s.substr(p[1], 2) == "06") {
        q.algparam = ASN1HEX.getHexOfV_AtObj(s, p[1])
      } else {
        if (s.substr(p[1], 2) == "30") {
          q.algparam = {};
          q.algparam.p = ASN1HEX.getVbyList(s, p[1], [0], "02");
          q.algparam.q = ASN1HEX.getVbyList(s, p[1], [1], "02");
          q.algparam.g = ASN1HEX.getVbyList(s, p[1], [2], "02")
        }
      }
      if (s.substr(r[1], 2) != "03") {
        throw "malformed PKCS8 public key(code:004)"
      }
      q.key = ASN1HEX.getHexOfV_AtObj(s, r[1]).substr(2);
      return q
    },
    getRSAKeyFromPublicPKCS8Hex: function (p) {
      var q = new RSAKey();
      q.readPKCS8PubKeyHex(p);
      return q
    },
  }
}();
KEYUTIL.getKey = function (i, f, j) {
  if (typeof RSAKey != "undefined" && i instanceof RSAKey) {
    return i
  }
  if (typeof KJUR.crypto.ECDSA != "undefined" && i instanceof KJUR.crypto.ECDSA) {
    return i
  }
  if (typeof KJUR.crypto.DSA != "undefined" && i instanceof KJUR.crypto.DSA) {
    return i
  }
  if (i.curve !== undefined && i.xy !== undefined && i.d === undefined) {
    return new KJUR.crypto.ECDSA({
      pub: i.xy,
      curve: i.curve
    })
  }
  if (i.curve !== undefined && i.d !== undefined) {
    return new KJUR.crypto.ECDSA({
      prv: i.d,
      curve: i.curve
    })
  }
  if (i.kty === undefined && i.n !== undefined && i.e !== undefined && i.d === undefined) {
    var D = new RSAKey();
    D.setPublic(i.n, i.e);
    return D
  }
  if (i.kty === undefined && i.n !== undefined && i.e !== undefined && i.d !== undefined && i.p !== undefined && i.q !== undefined && i.dp !== undefined && i.dq !== undefined && i.co !== undefined && i.qi === undefined) {
    var D = new RSAKey();
    D.setPrivateEx(i.n, i.e, i.d, i.p, i.q, i.dp, i.dq, i.co);
    return D
  }
  if (i.kty === undefined && i.n !== undefined && i.e !== undefined && i.d !== undefined && i.p === undefined) {
    var D = new RSAKey();
    D.setPrivate(i.n, i.e, i.d);
    return D
  }
  if (i.p !== undefined && i.q !== undefined && i.g !== undefined && i.y !== undefined && i.x === undefined) {
    var D = new KJUR.crypto.DSA();
    D.setPublic(i.p, i.q, i.g, i.y);
    return D
  }
  if (i.p !== undefined && i.q !== undefined && i.g !== undefined && i.y !== undefined && i.x !== undefined) {
    var D = new KJUR.crypto.DSA();
    D.setPrivate(i.p, i.q, i.g, i.y, i.x);
    return D
  }
  if (i.kty === "RSA" && i.n !== undefined && i.e !== undefined && i.d === undefined) {
    var D = new RSAKey();
    D.setPublic(b64utohex(i.n), b64utohex(i.e));
    return D
  }
  if (i.kty === "RSA" && i.n !== undefined && i.e !== undefined && i.d !== undefined && i.p !== undefined && i.q !== undefined && i.dp !== undefined && i.dq !== undefined && i.qi !== undefined) {

    var D = new RSAKey();
    D.setPrivateEx(b64utohex(i.n), b64utohex(i.e), b64utohex(i.d), b64utohex(i.p), b64utohex(i.q), b64utohex(i.dp), b64utohex(i.dq), b64utohex(i.qi));
    return D
  }
  if (i.kty === "RSA" && i.n !== undefined && i.e !== undefined && i.d !== undefined) {

    var D = new RSAKey();
    D.setPrivate(b64utohex(i.n), b64utohex(i.e), b64utohex(i.d));
    return D
  }
  if (i.kty === "EC" && i.crv !== undefined && i.x !== undefined && i.y !== undefined && i.d === undefined) {
    var e = new KJUR.crypto.ECDSA({
      curve: i.crv
    });
    var n = e.ecparams.keylen / 4;
    var t = ("0000000000" + b64utohex(i.x)).slice(- n);
    var r = ("0000000000" + b64utohex(i.y)).slice(- n);
    var o = "04" + t + r;
    e.setPublicKeyHex(o);
    return e
  }
  if (i.kty === "EC" && i.crv !== undefined && i.x !== undefined && i.y !== undefined && i.d !== undefined) {
    var e = new KJUR.crypto.ECDSA({
      curve: i.crv
    });
    var n = e.ecparams.keylen / 4;
    var t = ("0000000000" + b64utohex(i.x)).slice(- n);
    var r = ("0000000000" + b64utohex(i.y)).slice(- n);
    var o = "04" + t + r;
    var b = ("0000000000" + b64utohex(i.d)).slice(- n);
    e.setPublicKeyHex(o);
    e.setPrivateKeyHex(b);
    return e
  }
  if (j === "pkcs5prv") {

    var A = i,
      w = ASN1HEX,
      C, D;
    C = w.getPosArrayOfChildren_AtObj(A, 0);

    if (C.length === 9) {
      D = new RSAKey();
      D.readPrivateKeyFromASN1HexString(i)
    } else {
      if (C.length === 6) {
        D = new KJUR.crypto.DSA();
        D.readPKCS5PrvKeyHex(A)
      } else {
        if (C.length > 2 && A.substr(C[1], 2) === "04") {
          D = new KJUR.crypto.ECDSA();
          D.readPKCS5PrvKeyHex(A)
        } else {
          throw "unsupported PKCS#1/5 hexadecimal key"
        }
      }
    }

    return D
  }
  if (j === "pkcs8prv") {
    var D = KEYUTIL.getKeyFromPlainPrivatePKCS8Hex(i);
    return D
  }
  if (j === "pkcs8pub") {
    return KEYUTIL.getKeyFromPublicPKCS8Hex(i)
  }
  if (j === "x509pub") {
    return X509.getPublicKeyFromCertHex(i)
  }
  if (i.indexOf("-END CERTIFICATE-", 0) != -1 || i.indexOf("-END X509 CERTIFICATE-", 0) != -1 || i.indexOf("-END TRUSTED CERTIFICATE-", 0) != -1) {
    return X509.getPublicKeyFromCertPEM(i)
  }
  if (i.indexOf("-END PUBLIC KEY-") != -1) {
    return KEYUTIL.getKeyFromPublicPKCS8PEM(i)
  }
  if (i.indexOf("-END RSA PRIVATE KEY-") != -1 && i.indexOf("4,ENCRYPTED") == -1) {
    var k = ASN1HEX.pemToHex(i, "RSA PRIVATE KEY");
    return KEYUTIL.getKey(k, null, "pkcs5prv")
  }
  if (i.indexOf("-END DSA PRIVATE KEY-") != -1 && i.indexOf("4,ENCRYPTED") == -1) {
    var z = ASN1HEX.pemToHex(i, "DSA PRIVATE KEY");
    var v = ASN1HEX.getVbyList(z, 0, [1], "02");
    var u = ASN1HEX.getVbyList(z, 0, [2], "02");
    var B = ASN1HEX.getVbyList(z, 0, [3], "02");
    var l = ASN1HEX.getVbyList(z, 0, [4], "02");
    var m = ASN1HEX.getVbyList(z, 0, [5], "02");
    var D = new KJUR.crypto.DSA();
    D.setPrivate(new BigInteger(v, 16), new BigInteger(u, 16), new BigInteger(B, 16), new BigInteger(l, 16), new BigInteger(m, 16));
    return D
  }
  if (i.indexOf("-END PRIVATE KEY-") != -1) {
    return KEYUTIL.getKeyFromPlainPrivatePKCS8PEM(i)
  }
  if (i.indexOf("-END RSA PRIVATE KEY-") != -1 && i.indexOf("4,ENCRYPTED") != -1) {
    return KEYUTIL.getRSAKeyFromEncryptedPKCS5PEM(i, f)
  }
  if (i.indexOf("-END EC PRIVATE KEY-") != -1 && i.indexOf("4,ENCRYPTED") != -1) {
    var z = KEYUTIL.getDecryptedKeyHex(i, f);
    var D = ASN1HEX.getVbyList(z, 0, [1], "04");
    var d = ASN1HEX.getVbyList(z, 0, [2, 0], "06");
    var s = ASN1HEX.getVbyList(z, 0, [3, 0], "03").substr(2);
    var c = "";
    if (KJUR.crypto.OID.oidhex2name[d] !== undefined) {
      c = KJUR.crypto.OID.oidhex2name[d]
    } else {
      throw "undefined OID(hex) in KJUR.crypto.OID: " + d
    }
    var e = new KJUR.crypto.ECDSA({
      curve: c
    });
    e.setPublicKeyHex(s);
    e.setPrivateKeyHex(D);
    e.isPublic = false;
    return e
  }
  if (i.indexOf("-END DSA PRIVATE KEY-") != -1 && i.indexOf("4,ENCRYPTED") != -1) {
    var z = KEYUTIL.getDecryptedKeyHex(i, f);
    var v = ASN1HEX.getVbyList(z, 0, [1], "02");
    var u = ASN1HEX.getVbyList(z, 0, [2], "02");
    var B = ASN1HEX.getVbyList(z, 0, [3], "02");
    var l = ASN1HEX.getVbyList(z, 0, [4], "02");
    var m = ASN1HEX.getVbyList(z, 0, [5], "02");
    var D = new KJUR.crypto.DSA();
    D.setPrivate(new BigInteger(v, 16), new BigInteger(u, 16), new BigInteger(B, 16), new BigInteger(l, 16), new BigInteger(m, 16));
    return D
  }
  if (i.indexOf("-END ENCRYPTED PRIVATE KEY-") != -1) {
    return KEYUTIL.getKeyFromEncryptedPKCS8PEM(i, f)
  }
  throw "not supported argument"
};
KEYUTIL.generateKeypair = function (a, c) {
  if (a == "RSA") {
    var b = c;
    var h = new RSAKey();
    h.generate(b, "10001");
    h.isPrivate = true;
    h.isPublic = true;
    var f = new RSAKey();
    var e = h.n.toString(16);
    var i = h.e.toString(16);
    f.setPublic(e, i);
    f.isPrivate = false;
    f.isPublic = true;
    var k = {};
    k.prvKeyObj = h;
    k.pubKeyObj = f;
    return k
  } else {
    if (a == "EC") {
      var d = c;
      var g = new KJUR.crypto.ECDSA({
        curve: d
      });
      var j = g.generateKeyPairHex();
      var h = new KJUR.crypto.ECDSA({
        curve: d
      });
      h.setPublicKeyHex(j.ecpubhex);
      h.setPrivateKeyHex(j.ecprvhex);
      h.isPrivate = true;
      h.isPublic = false;
      var f = new KJUR.crypto.ECDSA({
        curve: d
      });
      f.setPublicKeyHex(j.ecpubhex);
      f.isPrivate = false;
      f.isPublic = true;
      var k = {};
      k.prvKeyObj = h;
      k.pubKeyObj = f;
      return k
    } else {
      throw "unknown algorithm: " + a
    }
  }
};
KEYUTIL.getPEM = function (a, r, o, g, j) {
  var v = KJUR.asn1;
  var u = KJUR.crypto;
  function p(s) {
    var w = KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": 0
      },
      {
        "int": {
          bigint: s.n
        }
      },
      {
        "int": s.e
      },
      {
        "int": {
          bigint: s.d
        }
      },
      {
        "int": {
          bigint: s.p
        }
      },
      {
        "int": {
          bigint: s.q
        }
      },
      {
        "int": {
          bigint: s.dmp1
        }
      },
      {
        "int": {
          bigint: s.dmq1
        }
      },
      {
        "int": {
          bigint: s.coeff
        }
      }]
    });
    return w
  }
  function q(w) {
    var s = KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": 1
      },
      {
        octstr: {
          hex: w.prvKeyHex
        }
      },
      {
        tag: ["a0", true, {
          oid: {
            name: w.curveName
          }
        }]
      },
      {
        tag: ["a1", true, {
          bitstr: {
            hex: "00" + w.pubKeyHex
          }
        }]
      }]
    });
    return s
  }
  function n(s) {
    var w = KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": 0
      },
      {
        "int": {
          bigint: s.p
        }
      },
      {
        "int": {
          bigint: s.q
        }
      },
      {
        "int": {
          bigint: s.g
        }
      },
      {
        "int": {
          bigint: s.y
        }
      },
      {
        "int": {
          bigint: s.x
        }
      }]
    });
    return w
  }
  if (((typeof RSAKey != "undefined" && a instanceof RSAKey) || (typeof u.DSA != "undefined" && a instanceof u.DSA) || (typeof u.ECDSA != "undefined" && a instanceof u.ECDSA)) && a.isPublic == true && (r === undefined || r == "PKCS8PUB")) {
    var t = new KJUR.asn1.x509.SubjectPublicKeyInfo(a);
    var m = t.getEncodedHex();
    return v.ASN1Util.getPEMStringFromHex(m, "PUBLIC KEY")
  }
  if (r == "PKCS1PRV" && typeof RSAKey != "undefined" && a instanceof RSAKey && (o === undefined || o == null) && a.isPrivate == true) {
    var t = p(a);
    var m = t.getEncodedHex();
    return v.ASN1Util.getPEMStringFromHex(m, "RSA PRIVATE KEY")
  }
  if (r == "PKCS1PRV" && typeof RSAKey != "undefined" && a instanceof KJUR.crypto.ECDSA && (o === undefined || o == null) && a.isPrivate == true) {
    var f = new KJUR.asn1.DERObjectIdentifier({
      name: a.curveName
    });
    var l = f.getEncodedHex();
    var e = q(a);
    var k = e.getEncodedHex();
    var i = "";
    i += v.ASN1Util.getPEMStringFromHex(l, "EC PARAMETERS");
    i += v.ASN1Util.getPEMStringFromHex(k, "EC PRIVATE KEY");
    return i
  }
  if (r == "PKCS1PRV" && typeof KJUR.crypto.DSA != "undefined" && a instanceof KJUR.crypto.DSA && (o === undefined || o == null) && a.isPrivate == true) {
    var t = n(a);
    var m = t.getEncodedHex();
    return v.ASN1Util.getPEMStringFromHex(m, "DSA PRIVATE KEY")
  }
  if (r == "PKCS5PRV" && typeof RSAKey != "undefined" && a instanceof RSAKey && (o !== undefined && o != null) && a.isPrivate == true) {
    var t = p(a);
    var m = t.getEncodedHex();
    if (g === undefined) {
      g = "DES-EDE3-CBC"
    }
    return this.getEncryptedPKCS5PEMFromPrvKeyHex("RSA", m, o, g)
  }
  if (r == "PKCS5PRV" && typeof KJUR.crypto.ECDSA != "undefined" && a instanceof KJUR.crypto.ECDSA && (o !== undefined && o != null) && a.isPrivate == true) {
    var t = q(a);
    var m = t.getEncodedHex();
    if (g === undefined) {
      g = "DES-EDE3-CBC"
    }
    return this.getEncryptedPKCS5PEMFromPrvKeyHex("EC", m, o, g)
  }
  if (r == "PKCS5PRV" && typeof KJUR.crypto.DSA != "undefined" && a instanceof KJUR.crypto.DSA && (o !== undefined && o != null) && a.isPrivate == true) {
    var t = n(a);
    var m = t.getEncodedHex();
    if (g === undefined) {
      g = "DES-EDE3-CBC"
    }
    return this.getEncryptedPKCS5PEMFromPrvKeyHex("DSA", m, o, g)
  }
  var h = function (w, s) {
    var y = b(w, s);
    var x = new KJUR.asn1.ASN1Util.newObject({
      seq: [{
        seq: [{
          oid: {
            name: "pkcs5PBES2"
          }
        },
        {
          seq: [{
            seq: [{
              oid: {
                name: "pkcs5PBKDF2"
              }
            },
            {
              seq: [{
                octstr: {
                  hex: y.pbkdf2Salt
                }
              },
              {
                "int": y.pbkdf2Iter
              }]
            }]
          },
          {
            seq: [{
              oid: {
                name: "des-EDE3-CBC"
              }
            },
            {
              octstr: {
                hex: y.encryptionSchemeIV
              }
            }]
          }]
        }]
      },
      {
        octstr: {
          hex: y.ciphertext
        }
      }]
    });
    return x.getEncodedHex()
  };
  var b = function (D, E) {
    var x = 100;
    var C = CryptoJS.lib.WordArray.random(8);
    var B = "DES-EDE3-CBC";
    var s = CryptoJS.lib.WordArray.random(8);
    var y = CryptoJS.PBKDF2(E, C, {
      keySize: 192 / 32,
      iterations: x
    });
    var z = CryptoJS.enc.Hex.parse(D);
    var A = CryptoJS.TripleDES.encrypt(z, y, {
      iv: s
    }) + "";
    var w = {};
    w.ciphertext = A;
    w.pbkdf2Salt = CryptoJS.enc.Hex.stringify(C);
    w.pbkdf2Iter = x;
    w.encryptionSchemeAlg = B;
    w.encryptionSchemeIV = CryptoJS.enc.Hex.stringify(s);
    return w
  };
  if (r == "PKCS8PRV" && typeof RSAKey != "undefined" && a instanceof RSAKey && a.isPrivate == true) {
    var d = p(a);
    var c = d.getEncodedHex();
    var t = KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": 0
      },
      {
        seq: [{
          oid: {
            name: "rsaEncryption"
          }
        },
        {
          "null": true
        }]
      },
      {
        octstr: {
          hex: c
        }
      }]
    });
    var m = t.getEncodedHex();
    if (o === undefined || o == null) {
      return v.ASN1Util.getPEMStringFromHex(m, "PRIVATE KEY")
    } else {
      var k = h(m, o);
      return v.ASN1Util.getPEMStringFromHex(k, "ENCRYPTED PRIVATE KEY")
    }
  }
  if (r == "PKCS8PRV" && typeof KJUR.crypto.ECDSA != "undefined" && a instanceof KJUR.crypto.ECDSA && a.isPrivate == true) {
    var d = new KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": 1
      },
      {
        octstr: {
          hex: a.prvKeyHex
        }
      },
      {
        tag: ["a1", true, {
          bitstr: {
            hex: "00" + a.pubKeyHex
          }
        }]
      }]
    });
    var c = d.getEncodedHex();
    var t = KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": 0
      },
      {
        seq: [{
          oid: {
            name: "ecPublicKey"
          }
        },
        {
          oid: {
            name: a.curveName
          }
        }]
      },
      {
        octstr: {
          hex: c
        }
      }]
    });
    var m = t.getEncodedHex();
    if (o === undefined || o == null) {
      return v.ASN1Util.getPEMStringFromHex(m, "PRIVATE KEY")
    } else {
      var k = h(m, o);
      return v.ASN1Util.getPEMStringFromHex(k, "ENCRYPTED PRIVATE KEY")
    }
  }
  if (r == "PKCS8PRV" && typeof KJUR.crypto.DSA != "undefined" && a instanceof KJUR.crypto.DSA && a.isPrivate == true) {
    var d = new KJUR.asn1.DERInteger({
      bigint: a.x
    });
    var c = d.getEncodedHex();
    var t = KJUR.asn1.ASN1Util.newObject({
      seq: [{
        "int": 0
      },
      {
        seq: [{
          oid: {
            name: "dsa"
          }
        },
        {
          seq: [{
            "int": {
              bigint: a.p
            }
          },
          {
            "int": {
              bigint: a.q
            }
          },
          {
            "int": {
              bigint: a.g
            }
          }]
        }]
      },
      {
        octstr: {
          hex: c
        }
      }]
    });
    var m = t.getEncodedHex();
    if (o === undefined || o == null) {
      return v.ASN1Util.getPEMStringFromHex(m, "PRIVATE KEY")
    } else {
      var k = h(m, o);
      return v.ASN1Util.getPEMStringFromHex(k, "ENCRYPTED PRIVATE KEY")
    }
  }
  throw "unsupported object nor format"
};
KEYUTIL.getKeyFromCSRPEM = function (b) {
  var a = ASN1HEX.pemToHex(b, "CERTIFICATE REQUEST");
  var c = KEYUTIL.getKeyFromCSRHex(a);
  return c
};
KEYUTIL.getKeyFromCSRHex = function (a) {
  var c = KEYUTIL.parseCSRHex(a);
  var b = KEYUTIL.getKey(c.p8pubkeyhex, null, "pkcs8pub");
  return b
};
KEYUTIL.parseCSRHex = function (c) {
  var b = {};
  var e = c;
  if (e.substr(0, 2) != "30") {
    throw "malformed CSR(code:001)"
  }
  var d = ASN1HEX.getPosArrayOfChildren_AtObj(e, 0);
  if (d.length < 1) {
    throw "malformed CSR(code:002)"
  }
  if (e.substr(d[0], 2) != "30") {
    throw "malformed CSR(code:003)"
  }
  var a = ASN1HEX.getPosArrayOfChildren_AtObj(e, d[0]);
  if (a.length < 3) {
    throw "malformed CSR(code:004)"
  }
  b.p8pubkeyhex = ASN1HEX.getHexOfTLV_AtObj(e, a[2]);
  return b
};
KEYUTIL.getJWKFromKey = function (d) {
  var b = {};
  if (d instanceof RSAKey && d.isPrivate) {
    b.kty = "RSA";
    b.n = hextob64u(d.n.toString(16));
    b.e = hextob64u(d.e.toString(16));
    b.d = hextob64u(d.d.toString(16));
    b.p = hextob64u(d.p.toString(16));
    b.q = hextob64u(d.q.toString(16));
    b.dp = hextob64u(d.dmp1.toString(16));
    b.dq = hextob64u(d.dmq1.toString(16));
    b.qi = hextob64u(d.coeff.toString(16));
    return b
  } else {
    if (d instanceof RSAKey && d.isPublic) {
      b.kty = "RSA";
      b.n = hextob64u(d.n.toString(16));
      b.e = hextob64u(d.e.toString(16));
      return b
    } else {
      if (d instanceof KJUR.crypto.ECDSA && d.isPrivate) {
        var a = d.getShortNISTPCurveName();
        if (a !== "P-256" && a !== "P-384") {
          throw "unsupported curve name for JWT: " + a
        }
        var c = d.getPublicKeyXYHex();
        b.kty = "EC";
        b.crv = a;
        b.x = hextob64u(c.x);
        b.y = hextob64u(c.y);
        b.d = hextob64u(d.prvKeyHex);
        return b
      } else {
        if (d instanceof KJUR.crypto.ECDSA && d.isPublic) {
          var a = d.getShortNISTPCurveName();
          if (a !== "P-256" && a !== "P-384") {
            throw "unsupported curve name for JWT: " + a
          }
          var c = d.getPublicKeyXYHex();
          b.kty = "EC";
          b.crv = a;
          b.x = hextob64u(c.x);
          b.y = hextob64u(c.y);
          return b
        }
      }
    }
  }
  throw "not supported key object"
};
/*! rsapem-1.2.0.js (c) 2012-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
RSAKey.pemToBase64 = function (b) {
  var a = b;
  a = a.replace("-----BEGIN RSA PRIVATE KEY-----", "");
  a = a.replace("-----END RSA PRIVATE KEY-----", "");
  a = a.replace(/[ \n]+/g, "");
  return a
};
RSAKey.getPosArrayOfChildrenFromHex = function (g) {
  var j = new Array();
  var i = ASN1HEX.getStartPosOfV_AtObj(g, 0);
  var b = ASN1HEX.getPosOfNextSibling_AtObj(g, i);
  var e = ASN1HEX.getPosOfNextSibling_AtObj(g, b);
  var f = ASN1HEX.getPosOfNextSibling_AtObj(g, e);
  var l = ASN1HEX.getPosOfNextSibling_AtObj(g, f);
  var k = ASN1HEX.getPosOfNextSibling_AtObj(g, l);
  var d = ASN1HEX.getPosOfNextSibling_AtObj(g, k);
  var c = ASN1HEX.getPosOfNextSibling_AtObj(g, d);
  var h = ASN1HEX.getPosOfNextSibling_AtObj(g, c);
  j.push(i, b, e, f, l, k, d, c, h);
  return j
};
RSAKey.getHexValueArrayOfChildrenFromHex = function (f) {
  var l = RSAKey.getPosArrayOfChildrenFromHex(f);
  var e = ASN1HEX.getHexOfV_AtObj(f, l[0]);
  var j = ASN1HEX.getHexOfV_AtObj(f, l[1]);
  var b = ASN1HEX.getHexOfV_AtObj(f, l[2]);
  var c = ASN1HEX.getHexOfV_AtObj(f, l[3]);
  var h = ASN1HEX.getHexOfV_AtObj(f, l[4]);
  var g = ASN1HEX.getHexOfV_AtObj(f, l[5]);
  var m = ASN1HEX.getHexOfV_AtObj(f, l[6]);
  var k = ASN1HEX.getHexOfV_AtObj(f, l[7]);
  var d = ASN1HEX.getHexOfV_AtObj(f, l[8]);
  var i = new Array();
  i.push(e, j, b, c, h, g, m, k, d);
  return i
};
RSAKey.prototype.readPrivateKeyFromPEMString = function (e) {
  var c = RSAKey.pemToBase64(e);
  var d = b64tohex(c);
  var b = RSAKey.getHexValueArrayOfChildrenFromHex(d);
  this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
};
RSAKey.prototype.readPrivateKeyFromASN1HexString = function (a) {
  this.readPKCS5PrvKeyHex(a)
};
RSAKey.prototype.readPKCS5PrvKeyHex = function (c) {
  var b = RSAKey.getHexValueArrayOfChildrenFromHex(c);
  this.setPrivateEx(b[1], b[2], b[3], b[4], b[5], b[6], b[7], b[8])
};
RSAKey.prototype.readPKCS8PrvKeyHex = function (e) {
  var c, j, l, b, a, f, d, k;
  var m = ASN1HEX;
  var g = m.getVbyList;
  if (m.isASN1HEX(e) === false) {
    throw "not ASN.1 hex string"
  }
  try {
    c = g(e, 0, [2, 0, 1], "02");
    j = g(e, 0, [2, 0, 2], "02");
    l = g(e, 0, [2, 0, 3], "02");
    b = g(e, 0, [2, 0, 4], "02");
    a = g(e, 0, [2, 0, 5], "02");
    f = g(e, 0, [2, 0, 6], "02");
    d = g(e, 0, [2, 0, 7], "02");
    k = g(e, 0, [2, 0, 8], "02")
  } catch (i) {
    throw "malformed PKCS#8 plain RSA private key"
  }
  this.setPrivateEx(c, j, l, b, a, f, d, k)
};
RSAKey.prototype.readPKCS5PubKeyHex = function (b) {
  if (ASN1HEX.isASN1HEX(b) === false) {
    throw "keyHex is not ASN.1 hex string"
  }
  var a = ASN1HEX.getPosArrayOfChildren_AtObj(b, 0);
  if (a.length !== 2 || b.substr(a[0], 2) !== "02" || b.substr(a[1], 2) !== "02") {
    throw "wrong hex for PKCS#5 public key"
  }
  var d = ASN1HEX.getHexOfV_AtObj(b, a[0]);
  var c = ASN1HEX.getHexOfV_AtObj(b, a[1]);
  this.setPublic(d, c)
};
RSAKey.prototype.readPKCS8PubKeyHex = function (b) {
  if (ASN1HEX.isASN1HEX(b) === false) {
    throw "not ASN.1 hex string"
  }
  if (ASN1HEX.getDecendantHexTLVByNthList(b, 0, [0, 0]) !== "06092a864886f70d010101") {
    throw "not PKCS8 RSA public key"
  }
  var a = ASN1HEX.getDecendantHexTLVByNthList(b, 0, [1, 0]);
  this.readPKCS5PubKeyHex(a)
};
RSAKey.prototype.readCertPubKeyHex = function (b, c) {
  if (c !== 5) {
    c = 6
  }
  if (ASN1HEX.isASN1HEX(b) === false) {
    throw "not ASN.1 hex string"
  }
  var a = ASN1HEX.getDecendantHexTLVByNthList(b, 0, [0, c]);
  this.readPKCS8PubKeyHex(a)
};
/*! rsasign-1.2.7.js (c) 2012 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
var _RE_HEXDECONLY = new RegExp("");
_RE_HEXDECONLY.compile("[^0-9a-f]", "gi");
function _rsasign_getHexPaddedDigestInfoForString(d, e, a) {
  var b = function (f) {
    return KJUR.crypto.Util.hashString(f, a)
  };
  var c = b(d);
  return KJUR.crypto.Util.getPaddedDigestInfoHex(c, a, e)
}
function _zeroPaddingOfSignature(e, d) {
  var c = "";
  var a = d / 4 - e.length;
  for (var b = 0; b < a; b++) {
    c = c + "0"
  }
  return c + e
}
function _rsasign_signString(d, a) {

  var b = function (e) {
    return KJUR.crypto.Util.hashString(e, a)
  };
  var c = b(d);
  return this.signWithMessageHash(c, a)
}
function _rsasign_signWithMessageHash(e, c) {
  var f = KJUR.crypto.Util.getPaddedDigestInfoHex(e, c, this.n.bitLength());
  var b = parseBigInt(f, 16);
  var d = this.doPrivate(b);
  var a = d.toString(16);
  return _zeroPaddingOfSignature(a, this.n.bitLength())
}
function _rsasign_signStringWithSHA1(a) {
  return _rsasign_signString.call(this, a, "sha1")
}
function _rsasign_signStringWithSHA256(a) {
  return _rsasign_signString.call(this, a, "sha256")
}
function pss_mgf1_str(c, a, e) {
  var b = "",
    d = 0;
  while (b.length < a) {
    b += hextorstr(e(rstrtohex(c + String.fromCharCode.apply(String, [(d & 4278190080) >> 24, (d & 16711680) >> 16, (d & 65280) >> 8, d & 255]))));
    d += 1
  }
  return b
}
function _rsasign_signStringPSS(e, a, d) {
  var c = function (f) {
    return KJUR.crypto.Util.hashHex(f, a)
  };
  var b = c(rstrtohex(e));
  if (d === undefined) {
    d = -1
  }
  return this.signWithMessageHashPSS(b, a, d)
}
function _rsasign_signWithMessageHashPSS(l, a, k) {
  var b = hextorstr(l);
  var g = b.length;
  var m = this.n.bitLength() - 1;
  var c = Math.ceil(m / 8);
  var d;
  var o = function (i) {
    return KJUR.crypto.Util.hashHex(i, a)
  };
  if (k === -1 || k === undefined) {
    k = g
  } else {
    if (k === -2) {
      k = c - g - 2
    } else {
      if (k < -2) {
        throw "invalid salt length"
      }
    }
  }
  if (c < (g + k + 2)) {
    throw "data too long"
  }
  var f = "";
  if (k > 0) {
    f = new Array(k);
    new SecureRandom().nextBytes(f);
    f = String.fromCharCode.apply(String, f)
  }
  var n = hextorstr(o(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + b + f)));
  var j = [];
  for (d = 0; d < c - k - g - 2; d += 1) {
    j[d] = 0
  }
  var e = String.fromCharCode.apply(String, j) + "\x01" + f;
  var h = pss_mgf1_str(n, e.length, o);
  var q = [];
  for (d = 0; d < e.length; d += 1) {
    q[d] = e.charCodeAt(d) ^ h.charCodeAt(d)
  }
  var p = (65280 >> (8 * c - m)) & 255;
  q[0] &= ~p;
  for (d = 0; d < g; d++) {
    q.push(n.charCodeAt(d))
  }
  q.push(188);
  return _zeroPaddingOfSignature(this.doPrivate(new BigInteger(q)).toString(16), this.n.bitLength())
}
function _rsasign_getDecryptSignatureBI(a, d, c) {
  var b = new RSAKey();
  b.setPublic(d, c);
  var e = b.doPublic(a);
  return e
}
function _rsasign_getHexDigestInfoFromSig(a, c, b) {
  var e = _rsasign_getDecryptSignatureBI(a, c, b);
  var d = e.toString(16).replace(/^1f+00/, "");
  return d
}
function _rsasign_getAlgNameAndHashFromHexDisgestInfo(f) {
  for (var e in KJUR.crypto.Util.DIGESTINFOHEAD) {
    var d = KJUR.crypto.Util.DIGESTINFOHEAD[e];
    var b = d.length;
    if (f.substring(0, b) == d) {
      var c = [e, f.substring(b)];
      return c
    }
  }
  return []
}
function _rsasign_verifySignatureWithArgs(f, b, g, j) {
  var e = _rsasign_getHexDigestInfoFromSig(b, g, j);
  var h = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);
  if (h.length == 0) {
    return false
  }
  var d = h[0];
  var i = h[1];
  var a = function (k) {
    return KJUR.crypto.Util.hashString(k, d)
  };
  var c = a(f);
  return (i == c)
}
function _rsasign_verifyHexSignatureForMessage(c, b) {
  var d = parseBigInt(c, 16);
  var a = _rsasign_verifySignatureWithArgs(b, d, this.n.toString(16), this.e.toString(16));
  return a
}
function _rsasign_verifyString(f, j) {
  j = j.replace(_RE_HEXDECONLY, "");
  j = j.replace(/[ \n]+/g, "");
  var b = parseBigInt(j, 16);
  if (b.bitLength() > this.n.bitLength()) {
    return 0
  }
  var i = this.doPublic(b);
  var e = i.toString(16).replace(/^1f+00/, "");
  var g = _rsasign_getAlgNameAndHashFromHexDisgestInfo(e);
  if (g.length == 0) {
    return false
  }
  var d = g[0];
  var h = g[1];
  var a = function (k) {
    return KJUR.crypto.Util.hashString(k, d)
  };
  var c = a(f);
  return (h == c)
}
function _rsasign_verifyWithMessageHash(e, a) {
  a = a.replace(_RE_HEXDECONLY, "");
  a = a.replace(/[ \n]+/g, "");
  var b = parseBigInt(a, 16);
  if (b.bitLength() > this.n.bitLength()) {
    return 0
  }
  var h = this.doPublic(b);
  var g = h.toString(16).replace(/^1f+00/, "");
  var c = _rsasign_getAlgNameAndHashFromHexDisgestInfo(g);
  if (c.length == 0) {
    return false
  }
  var d = c[0];
  var f = c[1];
  return (f == e)
}
function _rsasign_verifyStringPSS(c, b, a, f) {
  var e = function (g) {
    return KJUR.crypto.Util.hashHex(g, a)
  };
  var d = e(rstrtohex(c));
  if (f === undefined) {
    f = -1
  }
  return this.verifyWithMessageHashPSS(d, b, a, f)
}
function _rsasign_verifyWithMessageHashPSS(f, s, l, c) {
  var k = new BigInteger(s, 16);
  if (k.bitLength() > this.n.bitLength()) {
    return false
  }
  var r = function (i) {
    return KJUR.crypto.Util.hashHex(i, l)
  };
  var j = hextorstr(f);
  var h = j.length;
  var g = this.n.bitLength() - 1;
  var m = Math.ceil(g / 8);
  var q;
  if (c === -1 || c === undefined) {
    c = h
  } else {
    if (c === -2) {
      c = m - h - 2
    } else {
      if (c < -2) {
        throw "invalid salt length"
      }
    }
  }
  if (m < (h + c + 2)) {
    throw "data too long"
  }
  var a = this.doPublic(k).toByteArray();
  for (q = 0; q < a.length; q += 1) {
    a[q] &= 255
  }
  while (a.length < m) {
    a.unshift(0)
  }
  if (a[m - 1] !== 188) {
    throw "encoded message does not end in 0xbc"
  }
  a = String.fromCharCode.apply(String, a);
  var d = a.substr(0, m - h - 1);
  var e = a.substr(d.length, h);
  var p = (65280 >> (8 * m - g)) & 255;
  if ((d.charCodeAt(0) & p) !== 0) {
    throw "bits beyond keysize not zero"
  }
  var n = pss_mgf1_str(e, d.length, r);
  var o = [];
  for (q = 0; q < d.length; q += 1) {
    o[q] = d.charCodeAt(q) ^ n.charCodeAt(q)
  }
  o[0] &= ~p;
  var b = m - h - c - 2;
  for (q = 0; q < b; q += 1) {
    if (o[q] !== 0) {
      throw "leftmost octets not zero"
    }
  }
  if (o[b] !== 1) {
    throw "0x01 marker not found"
  }
  return e === hextorstr(r(rstrtohex("\x00\x00\x00\x00\x00\x00\x00\x00" + j + String.fromCharCode.apply(String, o.slice(- c)))))
}
RSAKey.prototype.signWithMessageHash = _rsasign_signWithMessageHash;
RSAKey.prototype.signString = _rsasign_signString;
RSAKey.prototype.signStringWithSHA1 = _rsasign_signStringWithSHA1;
RSAKey.prototype.signStringWithSHA256 = _rsasign_signStringWithSHA256;
RSAKey.prototype.sign = _rsasign_signString;
RSAKey.prototype.signWithSHA1 = _rsasign_signStringWithSHA1;
RSAKey.prototype.signWithSHA256 = _rsasign_signStringWithSHA256;
RSAKey.prototype.signWithMessageHashPSS = _rsasign_signWithMessageHashPSS;
RSAKey.prototype.signStringPSS = _rsasign_signStringPSS;
RSAKey.prototype.signPSS = _rsasign_signStringPSS;
RSAKey.SALT_LEN_HLEN = -1;
RSAKey.SALT_LEN_MAX = -2;
RSAKey.prototype.verifyWithMessageHash = _rsasign_verifyWithMessageHash;
RSAKey.prototype.verifyString = _rsasign_verifyString;
RSAKey.prototype.verifyHexSignatureForMessage = _rsasign_verifyHexSignatureForMessage;
RSAKey.prototype.verify = _rsasign_verifyString;
RSAKey.prototype.verifyHexSignatureForByteArrayMessage = _rsasign_verifyHexSignatureForMessage;
RSAKey.prototype.verifyWithMessageHashPSS = _rsasign_verifyWithMessageHashPSS;
RSAKey.prototype.verifyStringPSS = _rsasign_verifyStringPSS;
RSAKey.prototype.verifyPSS = _rsasign_verifyStringPSS;
RSAKey.SALT_LEN_RECOVER = -2;
/*! x509-1.1.12.js (c) 2012-2017 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
function X509() {
  this.subjectPublicKeyRSA = null;
  this.subjectPublicKeyRSA_hN = null;
  this.subjectPublicKeyRSA_hE = null;
  this.hex = null;
  this.getSerialNumberHex = function () {
    return ASN1HEX.getDecendantHexVByNthList(this.hex, 0, [0, 1])
  };
  this.getSignatureAlgorithmField = function () {
    var b = ASN1HEX.getDecendantHexVByNthList(this.hex, 0, [0, 2, 0]);
    var a = KJUR.asn1.ASN1Util.oidHexToInt(b);
    var c = KJUR.asn1.x509.OID.oid2name(a);
    return c
  };
  this.getIssuerHex = function () {
    return ASN1HEX.getDecendantHexTLVByNthList(this.hex, 0, [0, 3])
  };
  this.getIssuerString = function () {
    return X509.hex2dn(ASN1HEX.getDecendantHexTLVByNthList(this.hex, 0, [0, 3]))
  };
  this.getSubjectHex = function () {
    return ASN1HEX.getDecendantHexTLVByNthList(this.hex, 0, [0, 5])
  };
  this.getSubjectString = function () {
    return X509.hex2dn(ASN1HEX.getDecendantHexTLVByNthList(this.hex, 0, [0, 5]))
  };
  this.getNotBefore = function () {
    var a = ASN1HEX.getDecendantHexVByNthList(this.hex, 0, [0, 4, 0]);
    a = a.replace(/(..)/g, "%$1");
    a = decodeURIComponent(a);
    return a
  };
  this.getNotAfter = function () {
    var a = ASN1HEX.getDecendantHexVByNthList(this.hex, 0, [0, 4, 1]);
    a = a.replace(/(..)/g, "%$1");
    a = decodeURIComponent(a);
    return a
  };
  this.readCertPEM = function (c) {
    var e = ASN1HEX.pemToHex(c);
    var b = X509.getPublicKeyHexArrayFromCertHex(e);
    var d = new RSAKey();
    d.setPublic(b[0], b[1]);
    this.subjectPublicKeyRSA = d;
    this.subjectPublicKeyRSA_hN = b[0];
    this.subjectPublicKeyRSA_hE = b[1];
    this.hex = e
  };
  this.readCertPEMWithoutRSAInit = function (c) {
    var d = ASN1HEX.pemToHex(c);
    var b = X509.getPublicKeyHexArrayFromCertHex(d);
    if (typeof this.subjectPublicKeyRSA.setPublic === "function") {
      this.subjectPublicKeyRSA.setPublic(b[0], b[1])
    }
    this.subjectPublicKeyRSA_hN = b[0];
    this.subjectPublicKeyRSA_hE = b[1];
    this.hex = d
  };
  this.getInfo = function () {
    var p = "Basic Fields\n";
    p += "  serial number: " + this.getSerialNumberHex() + "\n";
    p += "  signature algorithm: " + this.getSignatureAlgorithmField() + "\n";
    p += "  issuer: " + this.getIssuerString() + "\n";
    p += "  notBefore: " + this.getNotBefore() + "\n";
    p += "  notAfter: " + this.getNotAfter() + "\n";
    p += "  subject: " + this.getSubjectString() + "\n";
    p += "  subject public key info: \n";
    var j = X509.getSubjectPublicKeyInfoPosFromCertHex(this.hex);
    var d = ASN1HEX.getHexOfTLV_AtObj(this.hex, j);
    var n = KEYUTIL.getKey(d, null, "pkcs8pub");
    if (n instanceof RSAKey) {
      p += "    key algorithm: RSA\n";
      p += "    n=" + n.n.toString(16).substr(0, 16) + "...\n";
      p += "    e=" + n.e.toString(16) + "\n"
    }
    p += "X509v3 Extensions:\n";
    var m = X509.getV3ExtInfoListOfCertHex(this.hex);
    for (var e = 0; e < m.length; e++) {
      var b = m[e];
      var o = KJUR.asn1.x509.OID.oid2name(b.oid);
      if (o === "") {
        o = b.oid
      }
      var k = "";
      if (b.critical === true) {
        k = "CRITICAL"
      }
      p += "  " + o + " " + k + ":\n";
      if (o === "basicConstraints") {
        var g = X509.getExtBasicConstraints(this.hex);
        if (g.cA === undefined) {
          p += "    {}\n"
        } else {
          p += "    cA=true";
          if (g.pathLen !== undefined) {
            p += ", pathLen=" + g.pathLen
          }
          p += "\n"
        }
      } else {
        if (o === "keyUsage") {
          p += "    " + X509.getExtKeyUsageString(this.hex) + "\n"
        } else {
          if (o === "subjectKeyIdentifier") {
            p += "    " + X509.getExtSubjectKeyIdentifier(this.hex) + "\n"
          } else {
            if (o === "authorityKeyIdentifier") {
              var a = X509.getExtAuthorityKeyIdentifier(this.hex);
              if (a.kid !== undefined) {
                p += "    kid=" + a.kid + "\n"
              }
            } else {
              if (o === "extKeyUsage") {
                var h = X509.getExtExtKeyUsageName(this.hex);
                p += "    " + h.join(", ") + "\n"
              } else {
                if (o === "subjectAltName") {
                  var f = X509.getExtSubjectAltName(this.hex);
                  p += "    " + f.join(", ") + "\n"
                } else {
                  if (o === "cRLDistributionPoints") {
                    var l = X509.getExtCRLDistributionPointsURI(this.hex);
                    p += "    " + l + "\n"
                  } else {
                    if (o === "authorityInfoAccess") {
                      var c = X509.getExtAIAInfo(this.hex);
                      if (c.ocsp !== undefined) {
                        p += "    ocsp: " + c.ocsp.join(",") + "\n"
                      }
                      if (c.caissuer !== undefined) {
                        p += "    caissuer: " + c.caissuer.join(",") + "\n"
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    p += "signature algorithm: " + X509.getSignatureAlgorithmName(this.hex) + "\n";
    p += "signature: " + X509.getSignatureValueHex(this.hex).substr(0, 16) + "...\n";
    return p
  }
}
X509.pemToBase64 = function (a) {
  var b = a;
  b = b.replace("-----BEGIN CERTIFICATE-----", "");
  b = b.replace("-----END CERTIFICATE-----", "");
  b = b.replace(/[ \n]+/g, "");
  return b
};
X509.pemToHex = function (a) {
  return ASN1HEX.pemToHex(a)
};
X509.getSubjectPublicKeyPosFromCertHex = function (f) {
  var e = X509.getSubjectPublicKeyInfoPosFromCertHex(f);
  if (e == -1) {
    return - 1
  }
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(f, e);
  if (b.length != 2) {
    return - 1
  }
  var d = b[1];
  if (f.substring(d, d + 2) != "03") {
    return - 1
  }
  var c = ASN1HEX.getStartPosOfV_AtObj(f, d);
  if (f.substring(c, c + 2) != "00") {
    return - 1
  }
  return c + 2
};
X509.getSubjectPublicKeyInfoPosFromCertHex = function (d) {
  var c = ASN1HEX.getStartPosOfV_AtObj(d, 0);
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(d, c);
  if (b.length < 1) {
    return - 1
  }
  if (d.substring(b[0], b[0] + 10) == "a003020102") {
    if (b.length < 6) {
      return - 1
    }
    return b[6]
  } else {
    if (b.length < 5) {
      return - 1
    }
    return b[5]
  }
};
X509.getPublicKeyHexArrayFromCertHex = function (f) {
  var e = X509.getSubjectPublicKeyPosFromCertHex(f);
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(f, e);
  if (b.length != 2) {
    return []
  }
  var d = ASN1HEX.getHexOfV_AtObj(f, b[0]);
  var c = ASN1HEX.getHexOfV_AtObj(f, b[1]);
  if (d != null && c != null) {
    return [d, c]
  } else {
    return []
  }
};
X509.getHexTbsCertificateFromCert = function (b) {
  var a = ASN1HEX.getStartPosOfV_AtObj(b, 0);
  return a
};
X509.getPublicKeyHexArrayFromCertPEM = function (c) {
  var d = ASN1HEX.pemToHex(c);
  var b = X509.getPublicKeyHexArrayFromCertHex(d);
  return b
};
X509.hex2dn = function (f, b) {
  if (b === undefined) {
    b = 0
  }
  if (f.substr(b, 2) !== "30") {
    throw "malformed DN"
  }
  var c = new Array();
  var d = ASN1HEX.getPosArrayOfChildren_AtObj(f, b);
  for (var e = 0; e < d.length; e++) {
    c.push(X509.hex2rdn(f, d[e]))
  }
  c = c.map(function (a) {
    return a.replace("/", "\\/")
  });
  return "/" + c.join("/")
};
X509.hex2rdn = function (f, b) {
  if (b === undefined) {
    b = 0
  }
  if (f.substr(b, 2) !== "31") {
    throw "malformed RDN"
  }
  var c = new Array();
  var d = ASN1HEX.getPosArrayOfChildren_AtObj(f, b);
  for (var e = 0; e < d.length; e++) {
    c.push(X509.hex2attrTypeValue(f, d[e]))
  }
  c = c.map(function (a) {
    return a.replace("+", "\\+")
  });
  return c.join("+")
};
X509.hex2attrTypeValue = function (g, b) {
  if (b === undefined) {
    b = 0
  }
  if (g.substr(b, 2) !== "30") {
    throw "malformed attribute type and value"
  }
  var c = ASN1HEX.getPosArrayOfChildren_AtObj(g, b);
  if (c.length !== 2 || g.substr(c[0], 2) !== "06") {
    "malformed attribute type and value"
  }
  var d = ASN1HEX.getHexOfV_AtObj(g, c[0]);
  var h = KJUR.asn1.ASN1Util.oidHexToInt(d);
  var f = KJUR.asn1.x509.OID.oid2atype(h);
  var a = ASN1HEX.getHexOfV_AtObj(g, c[1]);
  var e = hextorstr(a);
  return f + "=" + e
};
X509.getPublicKeyFromCertHex = function (c) {
  var a, e, b;
  var g = 6;
  var d = ASN1HEX;
  var f = d.getVbyList;
  b = d.getDecendantHexTLVByNthList(c, 0, [0, 0]);
  if (b !== "a003020102") {
    g = 5
  }
  e = f(c, 0, [0, g, 0, 0], "06");
  if (e === "2a864886f70d010101") {
    a = new RSAKey()
  } else {
    if (e === "2a8648ce380401") {
      a = new KJUR.crypto.DSA()
    } else {
      if (e === "2a8648ce3d0201") {
        a = new KJUR.crypto.ECDSA()
      } else {
        throw "unsupported public key in X.509 cert"
      }
    }
  }
  a.readCertPubKeyHex(c, g);
  return a
};
X509.getPublicKeyFromCertPEM = function (a) {
  var c = ASN1HEX;
  var b = c.pemToHex(a);
  return X509.getPublicKeyFromCertHex(b)
};
X509.getPublicKeyInfoPropOfCertPEM = function (e) {
  var i = {};
  i.algparam = null;
  var f = ASN1HEX.pemToHex(e);
  var d = ASN1HEX.getPosArrayOfChildren_AtObj(f, 0);
  if (d.length != 3) {
    throw "malformed X.509 certificate PEM (code:001)"
  }
  if (f.substr(d[0], 2) != "30") {
    throw "malformed X.509 certificate PEM (code:002)"
  }
  var c = ASN1HEX.getPosArrayOfChildren_AtObj(f, d[0]);
  var g = 6;
  if (f.substr(c[0], 2) !== "a0") {
    g = 5
  }
  if (c.length < g + 1) {
    throw "malformed X.509 certificate PEM (code:003)"
  }
  var a = ASN1HEX.getPosArrayOfChildren_AtObj(f, c[g]);
  if (a.length != 2) {
    throw "malformed X.509 certificate PEM (code:004)"
  }
  var h = ASN1HEX.getPosArrayOfChildren_AtObj(f, a[0]);
  if (h.length != 2) {
    throw "malformed X.509 certificate PEM (code:005)"
  }
  i.algoid = ASN1HEX.getHexOfV_AtObj(f, h[0]);
  if (f.substr(h[1], 2) == "06") {
    i.algparam = ASN1HEX.getHexOfV_AtObj(f, h[1])
  } else {
    if (f.substr(h[1], 2) == "30") {
      i.algparam = ASN1HEX.getHexOfTLV_AtObj(f, h[1])
    }
  }
  if (f.substr(a[1], 2) != "03") {
    throw "malformed X.509 certificate PEM (code:006)"
  }
  var b = ASN1HEX.getHexOfV_AtObj(f, a[1]);
  i.keyhex = b.substr(2);
  return i
};
X509.getPublicKeyInfoPosOfCertHEX = function (c) {
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(c, 0);
  if (b.length != 3) {
    throw "malformed X.509 certificate PEM (code:001)"
  }
  if (c.substr(b[0], 2) != "30") {
    throw "malformed X.509 certificate PEM (code:002)"
  }
  var a = ASN1HEX.getPosArrayOfChildren_AtObj(c, b[0]);
  if (a.length < 7) {
    throw "malformed X.509 certificate PEM (code:003)"
  }
  return a[6]
};
X509.getV3ExtInfoListOfCertHex = function (g) {
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(g, 0);
  if (b.length != 3) {
    throw "malformed X.509 certificate PEM (code:001)"
  }
  if (g.substr(b[0], 2) != "30") {
    throw "malformed X.509 certificate PEM (code:002)"
  }
  var a = ASN1HEX.getPosArrayOfChildren_AtObj(g, b[0]);
  if (a.length < 8) {
    throw "malformed X.509 certificate PEM (code:003)"
  }
  if (g.substr(a[7], 2) != "a3") {
    throw "malformed X.509 certificate PEM (code:004)"
  }
  var h = ASN1HEX.getPosArrayOfChildren_AtObj(g, a[7]);
  if (h.length != 1) {
    throw "malformed X.509 certificate PEM (code:005)"
  }
  if (g.substr(h[0], 2) != "30") {
    throw "malformed X.509 certificate PEM (code:006)"
  }
  var f = ASN1HEX.getPosArrayOfChildren_AtObj(g, h[0]);
  var e = f.length;
  var d = new Array(e);
  for (var c = 0; c < e; c++) {
    d[c] = X509.getV3ExtItemInfo_AtObj(g, f[c])
  }
  return d
};
X509.getV3ExtItemInfo_AtObj = function (f, g) {
  var e = {};
  e.posTLV = g;
  var b = ASN1HEX.getPosArrayOfChildren_AtObj(f, g);
  if (b.length != 2 && b.length != 3) {
    throw "malformed X.509v3 Ext (code:001)"
  }
  if (f.substr(b[0], 2) != "06") {
    throw "malformed X.509v3 Ext (code:002)"
  }
  var d = ASN1HEX.getHexOfV_AtObj(f, b[0]);
  e.oid = ASN1HEX.hextooidstr(d);
  e.critical = false;
  if (b.length == 3) {
    e.critical = true
  }
  var c = b[b.length - 1];
  if (f.substr(c, 2) != "04") {
    throw "malformed X.509v3 Ext (code:003)"
  }
  e.posV = ASN1HEX.getStartPosOfV_AtObj(f, c);
  return e
};
X509.getHexOfTLV_V3ExtValue = function (b, a) {
  var c = X509.getPosOfTLV_V3ExtValue(b, a);
  if (c == -1) {
    return null
  }
  return ASN1HEX.getHexOfTLV_AtObj(b, c)
};
X509.getHexOfV_V3ExtValue = function (b, a) {
  var c = X509.getPosOfTLV_V3ExtValue(b, a);
  if (c == -1) {
    return null
  }
  return ASN1HEX.getHexOfV_AtObj(b, c)
};
X509.getPosOfTLV_V3ExtValue = function (f, b) {
  var d = b;
  if (!b.match(/^[0-9.]+$/)) {
    d = KJUR.asn1.x509.OID.name2oid(b)
  }
  if (d == "") {
    return - 1
  }
  var c = X509.getV3ExtInfoListOfCertHex(f);
  for (var a = 0; a < c.length; a++) {
    var e = c[a];
    if (e.oid == d) {
      return e.posV
    }
  }
  return - 1
};
X509.getExtBasicConstraints = function (d) {
  var a = X509.getHexOfV_V3ExtValue(d, "basicConstraints");
  if (a === null) {
    return null
  }
  if (a === "") {
    return {}
  }
  if (a === "0101ff") {
    return {
      cA: true
    }
  }
  if (a.substr(0, 8) === "0101ff02") {
    var c = ASN1HEX.getHexOfV_AtObj(a, 6);
    var b = parseInt(c, 16);
    return {
      cA: true,
      pathLen: b
    }
  }
  throw "unknown error"
};
X509.KEYUSAGE_NAME = ["digitalSignature", "nonRepudiation", "keyEncipherment", "dataEncipherment", "keyAgreement", "keyCertSign", "cRLSign", "encipherOnly", "decipherOnly"];
X509.getExtKeyUsageBin = function (d) {
  var b = X509.getHexOfV_V3ExtValue(d, "keyUsage");
  if (b == "") {
    return ""
  }
  if (b.length % 2 != 0 || b.length <= 2) {
    throw "malformed key usage value"
  }
  var a = parseInt(b.substr(0, 2));
  var c = parseInt(b.substr(2), 16).toString(2);
  return c.substr(0, c.length - a)
};
X509.getExtKeyUsageString = function (e) {
  var d = X509.getExtKeyUsageBin(e);
  var b = new Array();
  for (var c = 0; c < d.length; c++) {
    if (d.substr(c, 1) == "1") {
      b.push(X509.KEYUSAGE_NAME[c])
    }
  }
  return b.join(",")
};
X509.getExtSubjectKeyIdentifier = function (b) {
  var a = X509.getHexOfV_V3ExtValue(b, "subjectKeyIdentifier");
  return a
};
X509.getExtAuthorityKeyIdentifier = function (f) {
  var b = {};
  var e = X509.getHexOfTLV_V3ExtValue(f, "authorityKeyIdentifier");
  if (e === null) {
    return null
  }
  var c = ASN1HEX.getPosArrayOfChildren_AtObj(e, 0);
  for (var d = 0; d < c.length; d++) {
    if (e.substr(c[d], 2) === "80") {
      b.kid = ASN1HEX.getHexOfV_AtObj(e, c[d])
    }
  }
  return b
};
X509.getExtExtKeyUsageName = function (k) {
  var b = new Array();
  var f = X509.getHexOfTLV_V3ExtValue(k, "extKeyUsage");
  if (f === null) {
    return null
  }
  var c = ASN1HEX.getPosArrayOfChildren_AtObj(f, 0);
  for (var e = 0; e < c.length; e++) {
    var j = ASN1HEX.getHexOfV_AtObj(f, c[e]);
    var g = KJUR.asn1.ASN1Util.oidHexToInt(j);
    var d = KJUR.asn1.x509.OID.oid2name(g);
    b.push(d)
  }
  return b
};
X509.getExtSubjectAltName = function (g) {
  var b = new Array();
  var f = X509.getHexOfTLV_V3ExtValue(g, "subjectAltName");
  var c = ASN1HEX.getPosArrayOfChildren_AtObj(f, 0);
  for (var e = 0; e < c.length; e++) {
    if (f.substr(c[e], 2) === "82") {
      var d = hextoutf8(ASN1HEX.getHexOfV_AtObj(f, c[e]));
      b.push(d)
    }
  }
  return b
};
X509.getExtCRLDistributionPointsURI = function (n) {
  var p = new Array();
  var k = X509.getHexOfTLV_V3ExtValue(n, "cRLDistributionPoints");
  var o = ASN1HEX.getPosArrayOfChildren_AtObj(k, 0);
  for (var g = 0; g < o.length; g++) {
    var l = ASN1HEX.getHexOfTLV_AtObj(k, o[g]);
    var b = ASN1HEX.getPosArrayOfChildren_AtObj(l, 0);
    for (var e = 0; e < b.length; e++) {
      if (l.substr(b[e], 2) === "a0") {
        var f = ASN1HEX.getHexOfV_AtObj(l, b[e]);
        if (f.substr(0, 2) === "a0") {
          var c = ASN1HEX.getHexOfV_AtObj(f, 0);
          if (c.substr(0, 2) === "86") {
            var m = ASN1HEX.getHexOfV_AtObj(c, 0);
            var d = hextoutf8(m);
            p.push(d)
          }
        }
      }
    }
  }
  return p
};
X509.getExtAIAInfo = function (g) {
  var j = {};
  j.ocsp = [];
  j.caissuer = [];
  var h = X509.getPosOfTLV_V3ExtValue(g, "authorityInfoAccess");
  if (h == -1) {
    return null
  }
  if (g.substr(h, 2) != "30") {
    throw "malformed AIA Extn Value"
  }
  var d = ASN1HEX.getPosArrayOfChildren_AtObj(g, h);
  for (var c = 0; c < d.length; c++) {
    var a = d[c];
    var b = ASN1HEX.getPosArrayOfChildren_AtObj(g, a);
    if (b.length != 2) {
      throw "malformed AccessDescription of AIA Extn"
    }
    var e = b[0];
    var f = b[1];
    if (ASN1HEX.getHexOfV_AtObj(g, e) == "2b06010505073001") {
      if (g.substr(f, 2) == "86") {
        j.ocsp.push(hextoutf8(ASN1HEX.getHexOfV_AtObj(g, f)))
      }
    }
    if (ASN1HEX.getHexOfV_AtObj(g, e) == "2b06010505073002") {
      if (g.substr(f, 2) == "86") {
        j.caissuer.push(hextoutf8(ASN1HEX.getHexOfV_AtObj(g, f)))
      }
    }
  }
  return j
};
X509.getSignatureAlgorithmName = function (d) {
  var b = ASN1HEX.getDecendantHexVByNthList(d, 0, [1, 0]);
  var a = KJUR.asn1.ASN1Util.oidHexToInt(b);
  var c = KJUR.asn1.x509.OID.oid2name(a);
  return c
};
X509.getSignatureValueHex = function (b) {
  var a = ASN1HEX.getDecendantHexVByNthList(b, 0, [2]);
  if (a.substr(0, 2) !== "00") {
    throw "can't get signature value"
  }
  return a.substr(2)
};
X509.getSerialNumberHex = function (a) {
  return ASN1HEX.getDecendantHexVByNthList(a, 0, [0, 1])
};
X509.verifySignature = function (f, c) {
  var d = X509.getSignatureAlgorithmName(f);
  var a = X509.getSignatureValueHex(f);
  var b = ASN1HEX.getDecendantHexTLVByNthList(f, 0, [0]);
  var e = new KJUR.crypto.Signature({
    alg: d
  });
  e.init(c);
  e.updateHex(b);
  return e.verify(a)
};
/*! jws-3.3.5 (c) 2013-2016 Kenji Urushima | kjur.github.com/jsrsasign/license
 */
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
  KJUR.jws = {}
}
KJUR.jws.JWS = function () {
  var a = KJUR.jws.JWS;
  this.parseJWS = function (e, h) {
    if ((this.parsedJWS !== undefined) && (h || (this.parsedJWS.sigvalH !== undefined))) {
      return
    }
    var g = e.match(/^([^.]+)\.([^.]+)\.([^.]+)$/);
    if (g == null) {
      throw "JWS signature is not a form of 'Head.Payload.SigValue'."
    }
    var i = g[1];
    var c = g[2];
    var j = g[3];
    var l = i + "." + c;
    this.parsedJWS = {};
    this.parsedJWS.headB64U = i;
    this.parsedJWS.payloadB64U = c;
    this.parsedJWS.sigvalB64U = j;
    this.parsedJWS.si = l;
    if (!h) {
      var f = b64utohex(j);
      var d = parseBigInt(f, 16);
      this.parsedJWS.sigvalH = f;
      this.parsedJWS.sigvalBI = d
    }
    var b = b64utoutf8(i);
    var k = b64utoutf8(c);
    this.parsedJWS.headS = b;
    this.parsedJWS.payloadS = k;
    if (!a.isSafeJSONString(b, this.parsedJWS, "headP")) {
      throw "malformed JSON string for JWS Head: " + b
    }
  }
};
KJUR.jws.JWS.sign = function (a, i, c, m, l) {
  var k = KJUR.jws.JWS;
  var q, e, j;
  if (typeof i != "string" && typeof i != "object") {
    throw "spHeader must be JSON string or object: " + i
  }
  if (typeof i == "object") {
    e = i;
    q = JSON.stringify(e)
  }
  if (typeof i == "string") {
    q = i;
    if (!k.isSafeJSONString(q)) {
      throw "JWS Head is not safe JSON string: " + q
    }
    e = k.readSafeJSONString(q)
  }
  j = c;
  if (typeof c == "object") {
    j = JSON.stringify(c)
  }
  if ((a == "" || a == null) && e.alg !== undefined) {
    a = e.alg
  }
  if ((a != "" && a != null) && e.alg === undefined) {
    e.alg = a;
    q = JSON.stringify(e)
  }
  if (a !== e.alg) {
    throw "alg and sHeader.alg doesn't match: " + a + "!=" + e.alg
  }
  var d = null;
  if (k.jwsalg2sigalg[a] === undefined) {
    throw "unsupported alg name: " + a
  } else {
    d = k.jwsalg2sigalg[a]
  }
  var b = utf8tob64u(q);
  var g = utf8tob64u(j);
  var o = b + "." + g;
  var n = "";
  if (d.substr(0, 4) == "Hmac") {
    if (m === undefined) {
      throw "mac key shall be specified for HS* alg"
    }
    var h = new KJUR.crypto.Mac({
      alg: d,
      prov: "cryptojs",
      pass: m
    });
    h.updateString(o);
    n = h.doFinal()
  } else {
    if (d.indexOf("withECDSA") != -1) {
      var p = new KJUR.crypto.Signature({
        alg: d
      });
      p.init(m, l);
      p.updateString(o);
      hASN1Sig = p.sign();
      n = KJUR.crypto.ECDSA.asn1SigToConcatSig(hASN1Sig)
    } else {
      if (d != "none") {
        var p = new KJUR.crypto.Signature({
          alg: d
        });
        p.init(m, l);
        p.updateString(o);
        n = p.sign()
      }
    }
  }
  var f = hextob64u(n);
  return o + "." + f
};
KJUR.jws.JWS.verify = function (p, t, j) {
  var m = KJUR.jws.JWS;
  var q = p.split(".");
  var d = q[0];
  var l = q[1];
  var b = d + "." + l;
  var r = b64utohex(q[2]);
  var i = m.readSafeJSONString(b64utoutf8(q[0]));
  var h = null;
  var s = null;
  if (i.alg === undefined) {
    throw "algorithm not specified in header"
  } else {
    h = i.alg;
    s = h.substr(0, 2)
  }
  if (j != null && Object.prototype.toString.call(j) === "[object Array]" && j.length > 0) {
    var c = ":" + j.join(":") + ":";
    if (c.indexOf(":" + h + ":") == -1) {
      throw "algorithm '" + h + "' not accepted in the list"
    }
  }
  if (h != "none" && t === null) {
    throw "key shall be specified to verify."
  }
  if (typeof t == "string" && t.indexOf("-----BEGIN ") != -1) {
    t = KEYUTIL.getKey(t)
  }
  if (s == "RS" || s == "PS") {
    if (!(t instanceof RSAKey)) {
      throw "key shall be a RSAKey obj for RS* and PS* algs"
    }
  }
  if (s == "ES") {
    if (!(t instanceof KJUR.crypto.ECDSA)) {
      throw "key shall be a ECDSA obj for ES* algs"
    }
  }
  if (h == "none") { }
  var n = null;
  if (m.jwsalg2sigalg[i.alg] === undefined) {
    throw "unsupported alg name: " + h
  } else {
    n = m.jwsalg2sigalg[h]
  }
  if (n == "none") {
    throw "not supported"
  } else {
    if (n.substr(0, 4) == "Hmac") {
      var k = null;
      if (t === undefined) {
        throw "hexadecimal key shall be specified for HMAC"
      }
      var g = new KJUR.crypto.Mac({
        alg: n,
        pass: t
      });
      g.updateString(b);
      k = g.doFinal();
      return r == k
    } else {
      if (n.indexOf("withECDSA") != -1) {
        var f = null;
        try {
          f = KJUR.crypto.ECDSA.concatSigToASN1Sig(r)
        } catch (o) {
          return false
        }
        var e = new KJUR.crypto.Signature({
          alg: n
        });
        e.init(t);
        e.updateString(b);
        return e.verify(f)
      } else {
        var e = new KJUR.crypto.Signature({
          alg: n
        });
        e.init(t);
        e.updateString(b);
        return e.verify(r)
      }
    }
  }
};
KJUR.jws.JWS.parse = function (g) {
  var c = g.split(".");
  var b = {};
  var f, e, d;
  if (c.length != 2 && c.length != 3) {
    throw "malformed sJWS: wrong number of '.' splitted elements"
  }
  f = c[0];
  e = c[1];
  if (c.length == 3) {
    d = c[2]
  }
  b.headerObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(f));
  b.payloadObj = KJUR.jws.JWS.readSafeJSONString(b64utoutf8(e));
  b.headerPP = JSON.stringify(b.headerObj, null, "  ");
  if (b.payloadObj == null) {
    b.payloadPP = b64utoutf8(e)
  } else {
    b.payloadPP = JSON.stringify(b.payloadObj, null, "  ")
  }
  if (d !== undefined) {
    b.sigHex = b64utohex(d)
  }
  return b
};
KJUR.jws.JWS.verifyJWT = function (d, j, l) {
  var h = KJUR.jws.JWS;
  var i = d.split(".");
  var c = i[0];
  var g = i[1];
  var m = c + "." + g;
  var k = b64utohex(i[2]);
  var f = h.readSafeJSONString(b64utoutf8(c));
  var e = h.readSafeJSONString(b64utoutf8(g));
  if (f.alg === undefined) {
    return false
  }
  if (l.alg === undefined) {
    throw "acceptField.alg shall be specified"
  }
  if (!h.inArray(f.alg, l.alg)) {
    return false
  }
  if (e.iss !== undefined && typeof l.iss === "object") {
    if (!h.inArray(e.iss, l.iss)) {
      return false
    }
  }
  if (e.sub !== undefined && typeof l.sub === "object") {
    if (!h.inArray(e.sub, l.sub)) {
      return false
    }
  }
  if (e.aud !== undefined && typeof l.aud === "object") {
    if (typeof e.aud == "string") {
      if (!h.inArray(e.aud, l.aud)) {
        return false
      }
    } else {
      if (typeof e.aud == "object") {
        if (!h.includedArray(e.aud, l.aud)) {
          return false
        }
      }
    }
  }
  var b = KJUR.jws.IntDate.getNow();
  if (l.verifyAt !== undefined && typeof l.verifyAt === "number") {
    b = l.verifyAt
  }
  if (l.gracePeriod === undefined || typeof l.gracePeriod !== "number") {
    l.gracePeriod = 0
  }
  if (e.exp !== undefined && typeof e.exp == "number") {
    if (e.exp + l.gracePeriod < b) {
      return false
    }
  }
  if (e.nbf !== undefined && typeof e.nbf == "number") {
    if (b < e.nbf - l.gracePeriod) {
      return false
    }
  }
  if (e.iat !== undefined && typeof e.iat == "number") {
    if (b < e.iat - l.gracePeriod) {
      return false
    }
  }
  if (e.jti !== undefined && l.jti !== undefined) {
    if (e.jti !== l.jti) {
      return false
    }
  }
  if (!KJUR.jws.JWS.verify(d, j, l.alg)) {
    return false
  }
  return true
};
KJUR.jws.JWS.includedArray = function (b, a) {
  var d = KJUR.jws.JWS.inArray;
  if (b === null) {
    return false
  }
  if (typeof b !== "object") {
    return false
  }
  if (typeof b.length !== "number") {
    return false
  }
  for (var c = 0; c < b.length; c++) {
    if (!d(b[c], a)) {
      return false
    }
  }
  return true
};
KJUR.jws.JWS.inArray = function (d, b) {
  if (b === null) {
    return false
  }
  if (typeof b !== "object") {
    return false
  }
  if (typeof b.length !== "number") {
    return false
  }
  for (var c = 0; c < b.length; c++) {
    if (b[c] == d) {
      return true
    }
  }
  return false
};
KJUR.jws.JWS.jwsalg2sigalg = {
  HS256: "HmacSHA256",
  HS384: "HmacSHA384",
  HS512: "HmacSHA512",
  RS256: "SHA256withRSA",
  RS384: "SHA384withRSA",
  RS512: "SHA512withRSA",
  ES256: "SHA256withECDSA",
  ES384: "SHA384withECDSA",
  PS256: "SHA256withRSAandMGF1",
  PS384: "SHA384withRSAandMGF1",
  PS512: "SHA512withRSAandMGF1",
  none: "none",
};
KJUR.jws.JWS.isSafeJSONString = function (c, b, d) {
  var e = null;
  try {
    e = jsonParse(c);
    if (typeof e != "object") {
      return 0
    }
    if (e.constructor === Array) {
      return 0
    }
    if (b) {
      b[d] = e
    }
    return 1
  } catch (a) {
    return 0
  }
};
KJUR.jws.JWS.readSafeJSONString = function (b) {
  var c = null;
  try {
    c = jsonParse(b);
    if (typeof c != "object") {
      return null
    }
    if (c.constructor === Array) {
      return null
    }
    return c
  } catch (a) {
    return null
  }
};
KJUR.jws.JWS.getEncodedSignatureValueFromJWS = function (b) {
  var a = b.match(/^[^.]+\.[^.]+\.([^.]+)$/);
  if (a == null) {
    throw "JWS signature is not a form of 'Head.Payload.SigValue'."
  }
  return a[1]
};
KJUR.jws.JWS.getJWKthumbprint = function (d) {
  if (d.kty !== "RSA" && d.kty !== "EC" && d.kty !== "oct") {
    throw "unsupported algorithm for JWK Thumprint"
  }
  var a = "{";
  if (d.kty === "RSA") {
    if (typeof d.n != "string" || typeof d.e != "string") {
      throw "wrong n and e value for RSA key"
    }
    a += '"e":"' + d.e + '",';
    a += '"kty":"' + d.kty + '",';
    a += '"n":"' + d.n + '"}'
  } else {
    if (d.kty === "EC") {
      if (typeof d.crv != "string" || typeof d.x != "string" || typeof d.y != "string") {
        throw "wrong crv, x and y value for EC key"
      }
      a += '"crv":"' + d.crv + '",';
      a += '"kty":"' + d.kty + '",';
      a += '"x":"' + d.x + '",';
      a += '"y":"' + d.y + '"}'
    } else {
      if (d.kty === "oct") {
        if (typeof d.k != "string") {
          throw "wrong k value for oct(symmetric) key"
        }
        a += '"kty":"' + d.kty + '",';
        a += '"k":"' + d.k + '"}'
      }
    }
  }
  var b = rstrtohex(a);
  var c = KJUR.crypto.Util.hashHex(b, "sha256");
  var e = hextob64u(c);
  return e
};
KJUR.jws.IntDate = {};
KJUR.jws.IntDate.get = function (a) {
  if (a == "now") {
    return KJUR.jws.IntDate.getNow()
  } else {
    if (a == "now + 1hour") {
      return KJUR.jws.IntDate.getNow() + 60 * 60
    } else {
      if (a == "now + 1day") {
        return KJUR.jws.IntDate.getNow() + 60 * 60 * 24
      } else {
        if (a == "now + 1month") {
          return KJUR.jws.IntDate.getNow() + 60 * 60 * 24 * 30
        } else {
          if (a == "now + 1year") {
            return KJUR.jws.IntDate.getNow() + 60 * 60 * 24 * 365
          } else {
            if (a.match(/Z$/)) {
              return KJUR.jws.IntDate.getZulu(a)
            } else {
              if (a.match(/^[0-9]+$/)) {
                return parseInt(a)
              }
            }
          }
        }
      }
    }
  }
  throw "unsupported format: " + a
};
KJUR.jws.IntDate.getZulu = function (k) {
  var b = k.match(/(\d+)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)Z/);
  if (b) {
    var a = b[1];
    var i = parseInt(a);
    if (a.length == 4) { } else {
      if (a.length == 2) {
        if (50 <= i && i < 100) {
          i = 1900 + i
        } else {
          if (0 <= i && i < 50) {
            i = 2000 + i
          } else {
            throw "malformed year string for UTCTime"
          }
        }
      } else {
        throw "malformed year string"
      }
    }
    var g = parseInt(b[2]) - 1;
    var j = parseInt(b[3]);
    var c = parseInt(b[4]);
    var e = parseInt(b[5]);
    var f = parseInt(b[6]);
    var h = new Date(Date.UTC(i, g, j, c, e, f));
    return ~~(h / 1000)
  }
  throw "unsupported format: " + k
};
KJUR.jws.IntDate.getNow = function () {
  var a = ~~(new Date() / 1000);
  return a
};
KJUR.jws.IntDate.intDate2UTCString = function (a) {
  var b = new Date(a * 1000);
  return b.toUTCString()
};
KJUR.jws.IntDate.intDate2Zulu = function (e) {
  var i = new Date(e * 1000);
  var h = ("0000" + i.getUTCFullYear()).slice(- 4);
  var g = ("00" + (i.getUTCMonth() + 1)).slice(- 2);
  var b = ("00" + i.getUTCDate()).slice(- 2);
  var a = ("00" + i.getUTCHours()).slice(- 2);
  var c = ("00" + i.getUTCMinutes()).slice(- 2);
  var f = ("00" + i.getUTCSeconds()).slice(- 2);
  return h + g + b + a + c + f + "Z"
};
if (typeof KJUR == "undefined" || !KJUR) {
  KJUR = {}
}
if (typeof KJUR.jws == "undefined" || !KJUR.jws) {
  KJUR.jws = {}
}
KJUR.jws.JWSJS = function () {
  var b = KJUR.jws.JWS;
  var a = KJUR.jws.JWS;
  this.aHeader = [];
  this.sPayload = "";
  this.aSignature = [];
  this.init = function () {
    this.aHeader = [];
    this.sPayload = undefined;
    this.aSignature = []
  };
  this.initWithJWS = function (d) {
    this.init();
    var c = d.split(".");
    if (c.length != 3) {
      throw "malformed input JWS"
    }
    this.aHeader.push(c[0]);
    this.sPayload = c[1];
    this.aSignature.push(c[2])
  };
  this.addSignature = function (c, f, k, i) {
    if (this.sPayload === undefined || this.sPayload === null) {
      throw "there's no JSON-JS signature to add."
    }
    var j = this.aHeader.length;
    if (this.aHeader.length != this.aSignature.length) {
      throw "aHeader.length != aSignature.length"
    }
    try {
      var d = KJUR.jws.JWS.sign(c, f, this.sPayload, k, i);
      var h = d.split(".");
      var l = h[0];
      var e = h[2];
      this.aHeader.push(h[0]);
      this.aSignature.push(h[2])
    } catch (g) {
      if (this.aHeader.length > j) {
        this.aHeader.pop()
      }
      if (this.aSignature.length > j) {
        this.aSignature.pop()
      }
      throw "addSignature failed: " + g
    }
  };
  this.addSignatureByHeaderKey = function (f, c) {
    var e = b64utoutf8(this.sPayload);
    var d = new KJUR.jws.JWS();
    var g = d.generateJWSByP1PrvKey(f, e, c);
    this.aHeader.push(d.parsedJWS.headB64U);
    this.aSignature.push(d.parsedJWS.sigvalB64U)
  };
  this.addSignatureByHeaderPayloadKey = function (f, e, c) {
    var d = new KJUR.jws.JWS();
    var g = d.generateJWSByP1PrvKey(f, e, c);
    this.aHeader.push(d.parsedJWS.headB64U);
    this.sPayload = d.parsedJWS.payloadB64U;
    this.aSignature.push(d.parsedJWS.sigvalB64U)
  };
  this.verifyAll = function (f) {
    if (this.aHeader.length !== f.length || this.aSignature.length !== f.length) {
      return false
    }
    for (var e = 0; e < f.length; e++) {
      var d = f[e];
      if (d.length !== 2) {
        return false
      }
      var c = this.verifyNth(e, d[0], d[1]);
      if (c === false) {
        return false
      }
    }
    return true
  };
  this.verifyNth = function (d, h, e) {
    if (this.aHeader.length <= d || this.aSignature.length <= d) {
      return false
    }
    var f = this.aHeader[d];
    var i = this.aSignature[d];
    var j = f + "." + this.sPayload + "." + i;
    var c = false;
    try {
      c = a.verify(j, h, e)
    } catch (g) {
      return false
    }
    return c
  };
  this.verifyWithCerts = function (d) {
    if (this.aHeader.length != d.length) {
      throw "num headers does not match with num certs"
    }
    if (this.aSignature.length != d.length) {
      throw "num signatures does not match with num certs"
    }
    var l = this.sPayload;
    var h = "";
    for (var e = 0; e < d.length; e++) {
      var f = d[e];
      var g = this.aHeader[e];
      var n = this.aSignature[e];
      var c = g + "." + l + "." + n;
      var k = new KJUR.jws.JWS();
      try {
        var m = k.verifyJWSByPemX509Cert(c, f);
        if (m != 1) {
          h += (e + 1) + "th signature unmatch. "
        }
      } catch (j) {
        h += (e + 1) + "th signature fail(" + j + "). "
      }
    }
    if (h == "") {
      return 1
    } else {
      throw h
    }
  };
  this.readJWSJS = function (e) {
    if (typeof e === "string") {
      var d = b.readSafeJSONString(e);
      if (d == null) {
        throw "argument is not safe JSON object string"
      }
      this.aHeader = d.headers;
      this.sPayload = d.payload;
      this.aSignature = d.signatures
    } else {
      try {
        if (e.headers.length > 0) {
          this.aHeader = e.headers
        } else {
          throw "malformed header"
        }
        if (typeof e.payload === "string") {
          this.sPayload = e.payload
        } else {
          throw "malformed signatures"
        }
        if (e.signatures.length > 0) {
          this.signatures = e.signatures
        } else {
          throw "malformed signatures"
        }
      } catch (c) {
        throw "malformed JWS-JS JSON object: " + c
      }
    }
  };
  this.getJSON = function () {
    return {
      headers: this.aHeader,
      payload: this.sPayload,
      signatures: this.aSignature
    }
  };
  this.isEmpty = function () {
    if (this.aHeader.length == 0) {
      return 1
    }
    return 0
  }
};
module.exports = {
  RSAKey: RSAKey,
  KEYUTIL: KEYUTIL,
  hex2b64: hex2b64,
  b64tohex: b64tohex
}

猜你喜欢

转载自blog.csdn.net/weixin_38252138/article/details/80020479
今日推荐