/* --------------------------------------------------------------------------- */
String.prototype.toCharArray=function(){
  var arr = new Array(this.length);
  for(var i = 0; i < this.length; i++){ arr[i] = this.charAt(i); };
  return arr;
};
/* --------------------------------------------------------------------------- */
function add(strnum1, strnum2){
  var arr1 = strnum1.toCharArray().reverse();
  var arr2 = strnum2.toCharArray().reverse();
  var max = (arr1.length > arr2.length ? arr1.length : arr2.length) - 1;
  var strsum = "";
  for(var i = 0, up = 0; i <= max; i++){
    var c1 = i < arr1.length ? parseInt(arr1[i],10) : 0;
    var c2 = i < arr2.length ? parseInt(arr2[i],10) : 0;
    c1 += up;
    c1 += c2;
    up = Math.floor(c1/10);
    c1 %= 10;
    strsum = c1 + strsum;
    if(i == max) strsum = up+strsum;
  }
  return strsum;
};
/* --------------------------------------------------------------------------- */
function sum(arr){
  var strsum = "";
  for(var i = 0; i < arr.length; i++){
    strsum = add(strsum, arr[i]);
  }
  return strsum.replace(/^0*/,"");
};
/* --------------------------------------------------------------------------- */
function multiple(a, b){
  var arr_a = a.toCharArray().reverse();
  var arr_b = b.toCharArray().reverse();
  var arr_c = new Array(arr_b.length);
  var max = arr_a.length-1;
  for(var i = 0, zeropad=""; i < arr_b.length; i++,zeropad+="0"){
    var str_c = "";
    for(var j = 0, up=0; j<arr_a.length; j++){
      var c = (parseInt(arr_a[j], 10) * parseInt(arr_b[i],10));
      c+=up;
      up = Math.floor(c/10);
      c %= 10;
      str_c = c+str_c;
      if(j==max && up>0) str_c=up+str_c;
    }
    str_c+=zeropad;
    arr_c[i] = str_c;
  }
  return sum(arr_c);
};
/* --------------------------------------------------------------------------- */
function hex2decimal(hexstr){
  var template = "0123456789ABCDEF";
  var arr = hexstr.toUpperCase().substring(2).toCharArray().reverse();
  for(var i = 0, hex="1"; i < arr.length; i++, hex=multiple(hex,"16")){
    var numc = "" + template.indexOf(arr[i]);
    var mult = multiple(numc, hex);
    arr[i] = mult;
  }
  var decstr=sum(arr);
  if(decstr.length==0) desctr="0";
  return decstr;
};