johnson 1.2.0 → 2.0.0.pre0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (782) hide show
  1. data/CHANGELOG.rdoc +8 -0
  2. data/Manifest.txt +762 -48
  3. data/README.rdoc +2 -1
  4. data/Rakefile +90 -18
  5. data/ext/spidermonkey/conversions.c +9 -2
  6. data/ext/spidermonkey/ruby_land_proxy.c +1 -1
  7. data/ext/spidermonkey/runtime.h +1 -1
  8. data/ext/tracemonkey/context.cc +125 -0
  9. data/ext/tracemonkey/context.h +19 -0
  10. data/ext/tracemonkey/conversions.cc +365 -0
  11. data/ext/tracemonkey/conversions.h +32 -0
  12. data/ext/tracemonkey/debugger.cc +234 -0
  13. data/ext/tracemonkey/debugger.h +10 -0
  14. data/ext/tracemonkey/extconf.rb +37 -0
  15. data/ext/tracemonkey/extensions.cc +37 -0
  16. data/ext/tracemonkey/extensions.h +12 -0
  17. data/ext/tracemonkey/global.cc +40 -0
  18. data/ext/tracemonkey/global.h +11 -0
  19. data/ext/tracemonkey/idhash.cc +16 -0
  20. data/ext/tracemonkey/idhash.h +8 -0
  21. data/ext/tracemonkey/immutable_node.cc +1199 -0
  22. data/ext/tracemonkey/immutable_node.cc.erb +559 -0
  23. data/ext/tracemonkey/immutable_node.h +22 -0
  24. data/ext/tracemonkey/jroot.h +215 -0
  25. data/ext/tracemonkey/js_land_proxy.cc +620 -0
  26. data/ext/tracemonkey/js_land_proxy.h +20 -0
  27. data/ext/tracemonkey/ruby_land_proxy.cc +618 -0
  28. data/ext/tracemonkey/ruby_land_proxy.h +38 -0
  29. data/ext/tracemonkey/runtime.cc +454 -0
  30. data/ext/tracemonkey/runtime.h +27 -0
  31. data/ext/tracemonkey/split_global.cc +392 -0
  32. data/ext/tracemonkey/split_global.h +11 -0
  33. data/ext/tracemonkey/tracemonkey.cc +23 -0
  34. data/ext/tracemonkey/tracemonkey.h +32 -0
  35. data/lib/johnson.rb +12 -4
  36. data/lib/johnson/error.rb +5 -0
  37. data/lib/johnson/js/prelude.js +16 -1
  38. data/lib/johnson/parser.rb +2 -1
  39. data/lib/johnson/runtime.rb +87 -26
  40. data/lib/johnson/spidermonkey/runtime.rb +7 -16
  41. data/lib/johnson/tracemonkey.rb +13 -0
  42. data/lib/johnson/tracemonkey/context.rb +10 -0
  43. data/lib/johnson/tracemonkey/debugger.rb +67 -0
  44. data/lib/johnson/tracemonkey/immutable_node.rb +282 -0
  45. data/lib/johnson/tracemonkey/js_land_proxy.rb +64 -0
  46. data/lib/johnson/tracemonkey/mutable_tree_visitor.rb +242 -0
  47. data/lib/johnson/tracemonkey/ruby_land_proxy.rb +17 -0
  48. data/lib/johnson/tracemonkey/runtime.rb +80 -0
  49. data/test/{johnson_test.rb → generic/johnson_test.rb} +1 -1
  50. data/test/{parser_test.rb → generic/parser_test.rb} +1 -1
  51. data/test/helper.rb +23 -4
  52. data/test/johnson/{browser_test.rb → generic/browser_test.rb} +1 -1
  53. data/test/johnson/{conversions → generic/conversions}/array_test.rb +1 -1
  54. data/test/johnson/{conversions → generic/conversions}/boolean_test.rb +1 -1
  55. data/test/johnson/{conversions → generic/conversions}/callable_test.rb +1 -1
  56. data/test/johnson/{conversions → generic/conversions}/file_test.rb +1 -1
  57. data/test/johnson/generic/conversions/helper.rb +1 -0
  58. data/test/johnson/{conversions → generic/conversions}/nil_test.rb +1 -1
  59. data/test/johnson/{conversions → generic/conversions}/number_test.rb +1 -1
  60. data/test/johnson/{conversions → generic/conversions}/regexp_test.rb +1 -1
  61. data/test/johnson/{conversions → generic/conversions}/string_test.rb +1 -1
  62. data/test/johnson/{conversions → generic/conversions}/struct_test.rb +1 -1
  63. data/test/johnson/{conversions → generic/conversions}/symbol_test.rb +1 -1
  64. data/test/johnson/{conversions → generic/conversions}/thread_test.rb +1 -1
  65. data/test/johnson/{custom_conversions_test.rb → generic/custom_conversions_test.rb} +1 -1
  66. data/test/johnson/generic/default_test.rb +12 -0
  67. data/test/johnson/{error_test.rb → generic/error_test.rb} +1 -1
  68. data/test/johnson/{extensions_test.rb → generic/extensions_test.rb} +1 -1
  69. data/test/johnson/generic/helper.rb +1 -0
  70. data/test/johnson/{nodes → generic/nodes}/array_literal_test.rb +1 -1
  71. data/test/johnson/{nodes → generic/nodes}/array_node_test.rb +1 -1
  72. data/test/johnson/{nodes → generic/nodes}/binary_node_test.rb +1 -1
  73. data/test/johnson/{nodes → generic/nodes}/bracket_access_test.rb +1 -1
  74. data/test/johnson/{nodes → generic/nodes}/delete_test.rb +1 -1
  75. data/test/johnson/{nodes → generic/nodes}/do_while_test.rb +1 -1
  76. data/test/johnson/{nodes → generic/nodes}/dot_accessor_test.rb +1 -1
  77. data/test/johnson/generic/nodes/export_test.rb +11 -0
  78. data/test/johnson/{nodes → generic/nodes}/for_test.rb +1 -1
  79. data/test/johnson/{nodes → generic/nodes}/function_test.rb +1 -1
  80. data/test/johnson/generic/nodes/helper.rb +1 -0
  81. data/test/johnson/{nodes → generic/nodes}/if_test.rb +16 -6
  82. data/test/johnson/generic/nodes/import_test.rb +15 -0
  83. data/test/johnson/{nodes → generic/nodes}/label_test.rb +1 -1
  84. data/test/johnson/{nodes → generic/nodes}/let_test.rb +1 -1
  85. data/test/johnson/{nodes → generic/nodes}/object_literal_test.rb +1 -1
  86. data/test/johnson/{nodes → generic/nodes}/return_test.rb +1 -1
  87. data/test/johnson/{nodes → generic/nodes}/semi_test.rb +1 -1
  88. data/test/johnson/{nodes → generic/nodes}/switch_test.rb +1 -1
  89. data/test/johnson/{nodes → generic/nodes}/ternary_test.rb +1 -1
  90. data/test/johnson/{nodes → generic/nodes}/throw_test.rb +1 -1
  91. data/test/johnson/{nodes → generic/nodes}/try_node_test.rb +36 -6
  92. data/test/johnson/{nodes → generic/nodes}/typeof_test.rb +1 -1
  93. data/test/johnson/{nodes → generic/nodes}/unary_node_test.rb +1 -1
  94. data/test/johnson/{nodes → generic/nodes}/void_test.rb +1 -1
  95. data/test/johnson/{nodes → generic/nodes}/while_test.rb +1 -1
  96. data/test/johnson/{nodes → generic/nodes}/with_test.rb +1 -1
  97. data/test/johnson/{prelude_test.rb → generic/prelude_test.rb} +1 -1
  98. data/test/johnson/{runtime_test.rb → generic/runtime_test.rb} +3 -6
  99. data/test/johnson/generic/version_test.rb +13 -0
  100. data/test/johnson/{visitors → generic/visitors}/dot_visitor_test.rb +1 -1
  101. data/test/johnson/{visitors → generic/visitors}/enumerating_visitor_test.rb +1 -1
  102. data/test/johnson/generic/visitors/helper.rb +1 -0
  103. data/test/johnson/spidermonkey/js_land_proxy_test.rb +1 -5
  104. data/test/johnson/spidermonkey/ruby_land_proxy_test.rb +11 -7
  105. data/test/johnson/tracemonkey/context_test.rb +21 -0
  106. data/test/johnson/tracemonkey/immutable_node_test.rb +34 -0
  107. data/test/johnson/tracemonkey/js_land_proxy_test.rb +273 -0
  108. data/test/johnson/tracemonkey/ruby_land_proxy_test.rb +274 -0
  109. data/test/johnson/tracemonkey/runtime_test.rb +41 -0
  110. data/test/johnson/tracemonkey/split_global_test.rb +32 -0
  111. data/vendor/spidermonkey/js.pkg +2 -0
  112. data/vendor/tracemonkey/Makefile.in +668 -0
  113. data/vendor/tracemonkey/Makefile.ref +483 -0
  114. data/vendor/tracemonkey/README.html +54 -0
  115. data/vendor/tracemonkey/SpiderMonkey.rsp +11 -0
  116. data/vendor/tracemonkey/Y.js +19 -0
  117. data/vendor/tracemonkey/aclocal.m4 +9 -0
  118. data/vendor/tracemonkey/bench.sh +5 -0
  119. data/vendor/tracemonkey/build/autoconf/acoutput-fast.pl +202 -0
  120. data/vendor/tracemonkey/build/autoconf/altoptions.m4 +154 -0
  121. data/vendor/tracemonkey/build/autoconf/config.guess +1537 -0
  122. data/vendor/tracemonkey/build/autoconf/config.sub +1595 -0
  123. data/vendor/tracemonkey/build/autoconf/install-sh +119 -0
  124. data/vendor/tracemonkey/build/autoconf/make-makefile +315 -0
  125. data/vendor/tracemonkey/build/autoconf/match-dir.sh +101 -0
  126. data/vendor/tracemonkey/build/autoconf/moznbytetype.m4 +136 -0
  127. data/vendor/tracemonkey/build/autoconf/nspr.m4 +82 -0
  128. data/vendor/tracemonkey/build/autoconf/pkg.m4 +59 -0
  129. data/vendor/tracemonkey/build/autoconf/update-makefile.sh +118 -0
  130. data/vendor/tracemonkey/build/cygwin-wrapper +75 -0
  131. data/vendor/tracemonkey/build/hcc +111 -0
  132. data/vendor/tracemonkey/build/hcpp +155 -0
  133. data/vendor/tracemonkey/build/unix/mddepend.pl +165 -0
  134. data/vendor/tracemonkey/build/unix/uniq.pl +63 -0
  135. data/vendor/tracemonkey/build/win32/pgomerge.py +40 -0
  136. data/vendor/tracemonkey/builtins.tbl +91 -0
  137. data/vendor/tracemonkey/call.js +13 -0
  138. data/vendor/tracemonkey/config.mk +206 -0
  139. data/vendor/tracemonkey/config/Makefile.in +106 -0
  140. data/vendor/tracemonkey/config/Moz/Milestone.pm +232 -0
  141. data/vendor/tracemonkey/config/autoconf.mk.in +362 -0
  142. data/vendor/tracemonkey/config/check-sync-dirs.py +103 -0
  143. data/vendor/tracemonkey/config/check-sync-exceptions +7 -0
  144. data/vendor/tracemonkey/config/config.mk +881 -0
  145. data/vendor/tracemonkey/config/fastcwd.pl +66 -0
  146. data/vendor/tracemonkey/config/gcc_hidden.h +2 -0
  147. data/vendor/tracemonkey/config/insure.mk +53 -0
  148. data/vendor/tracemonkey/config/make-system-wrappers.pl +59 -0
  149. data/vendor/tracemonkey/config/milestone.pl +112 -0
  150. data/vendor/tracemonkey/config/milestone.txt +13 -0
  151. data/vendor/tracemonkey/config/mkdepend/Makefile.in +84 -0
  152. data/vendor/tracemonkey/config/mkdepend/cppsetup.c +233 -0
  153. data/vendor/tracemonkey/config/mkdepend/def.h +184 -0
  154. data/vendor/tracemonkey/config/mkdepend/ifparser.c +551 -0
  155. data/vendor/tracemonkey/config/mkdepend/ifparser.h +83 -0
  156. data/vendor/tracemonkey/config/mkdepend/imakemdep.h +733 -0
  157. data/vendor/tracemonkey/config/mkdepend/include.c +337 -0
  158. data/vendor/tracemonkey/config/mkdepend/main.c +860 -0
  159. data/vendor/tracemonkey/config/mkdepend/mkdepend.man +382 -0
  160. data/vendor/tracemonkey/config/mkdepend/parse.c +686 -0
  161. data/vendor/tracemonkey/config/mkdepend/pr.c +124 -0
  162. data/vendor/tracemonkey/config/nfspwd.pl +50 -0
  163. data/vendor/tracemonkey/config/nsinstall.c +481 -0
  164. data/vendor/tracemonkey/config/nsinstall.py +155 -0
  165. data/vendor/tracemonkey/config/pathsub.c +247 -0
  166. data/vendor/tracemonkey/config/pathsub.h +74 -0
  167. data/vendor/tracemonkey/config/preprocessor.pl +671 -0
  168. data/vendor/tracemonkey/config/revdepth-nt.pl +48 -0
  169. data/vendor/tracemonkey/config/revdepth.pl +51 -0
  170. data/vendor/tracemonkey/config/rules.mk +2310 -0
  171. data/vendor/tracemonkey/config/static-checking-config.mk +21 -0
  172. data/vendor/tracemonkey/config/static-checking.js +92 -0
  173. data/vendor/tracemonkey/config/string-format.js +61 -0
  174. data/vendor/tracemonkey/config/system-headers +1035 -0
  175. data/vendor/tracemonkey/config/version.mk +85 -0
  176. data/vendor/tracemonkey/config/version_win.pl +442 -0
  177. data/vendor/tracemonkey/configure +14183 -0
  178. data/vendor/tracemonkey/configure.in +5363 -0
  179. data/vendor/tracemonkey/correct.sh +23 -0
  180. data/vendor/tracemonkey/correct/check-3d-morph.js +55 -0
  181. data/vendor/tracemonkey/correct/check-3d-raytrace.js +445 -0
  182. data/vendor/tracemonkey/correct/check-access-binary-trees.js +52 -0
  183. data/vendor/tracemonkey/correct/check-access-fannkuch.js +66 -0
  184. data/vendor/tracemonkey/correct/check-access-nbody.js +171 -0
  185. data/vendor/tracemonkey/correct/check-access-nsieve.js +40 -0
  186. data/vendor/tracemonkey/correct/check-bitops-3bit-bits-in-byte.js +35 -0
  187. data/vendor/tracemonkey/correct/check-bitops-bits-in-byte.js +24 -0
  188. data/vendor/tracemonkey/correct/check-bitops-bitwise-and.js +29 -0
  189. data/vendor/tracemonkey/correct/check-bitops-nsieve-bits.js +40 -0
  190. data/vendor/tracemonkey/correct/check-controlflow-recursive.js +27 -0
  191. data/vendor/tracemonkey/correct/check-date-format-tofte.js +302 -0
  192. data/vendor/tracemonkey/correct/check-date-format-xparb.js +421 -0
  193. data/vendor/tracemonkey/correct/check-mont.js +119 -0
  194. data/vendor/tracemonkey/dtoa.c +3335 -0
  195. data/vendor/tracemonkey/editline/Makefile.in +55 -0
  196. data/vendor/tracemonkey/editline/Makefile.ref +143 -0
  197. data/vendor/tracemonkey/editline/README +83 -0
  198. data/vendor/tracemonkey/editline/editline.3 +175 -0
  199. data/vendor/tracemonkey/editline/editline.c +1371 -0
  200. data/vendor/tracemonkey/editline/editline.h +135 -0
  201. data/vendor/tracemonkey/editline/sysunix.c +182 -0
  202. data/vendor/tracemonkey/editline/unix.h +82 -0
  203. data/vendor/tracemonkey/if.js +13 -0
  204. data/vendor/tracemonkey/imacro_asm.js.in +396 -0
  205. data/vendor/tracemonkey/imacros.c.out +1034 -0
  206. data/vendor/tracemonkey/imacros.jsasm +770 -0
  207. data/vendor/tracemonkey/javascript-trace.d +73 -0
  208. data/vendor/tracemonkey/jitstats.tbl +55 -0
  209. data/vendor/tracemonkey/js-config.h.in +82 -0
  210. data/vendor/tracemonkey/js-config.in +111 -0
  211. data/vendor/tracemonkey/js.mdp +0 -0
  212. data/vendor/tracemonkey/js.msg +312 -0
  213. data/vendor/tracemonkey/js3240.rc +79 -0
  214. data/vendor/tracemonkey/jsOS240.def +654 -0
  215. data/vendor/tracemonkey/jsapi.cpp +6005 -0
  216. data/vendor/tracemonkey/jsapi.h +2727 -0
  217. data/vendor/tracemonkey/jsarena.cpp +450 -0
  218. data/vendor/tracemonkey/jsarena.h +318 -0
  219. data/vendor/tracemonkey/jsarray.cpp +3664 -0
  220. data/vendor/tracemonkey/jsarray.h +238 -0
  221. data/vendor/tracemonkey/jsatom.cpp +1244 -0
  222. data/vendor/tracemonkey/jsatom.h +493 -0
  223. data/vendor/tracemonkey/jsbit.h +249 -0
  224. data/vendor/tracemonkey/jsbool.cpp +184 -0
  225. data/vendor/tracemonkey/jsbool.h +88 -0
  226. data/vendor/tracemonkey/jsbuiltins.cpp +415 -0
  227. data/vendor/tracemonkey/jsbuiltins.h +456 -0
  228. data/vendor/tracemonkey/jsclist.h +139 -0
  229. data/vendor/tracemonkey/jscntxt.cpp +1816 -0
  230. data/vendor/tracemonkey/jscntxt.h +1541 -0
  231. data/vendor/tracemonkey/jscompat.h +57 -0
  232. data/vendor/tracemonkey/jsconfig.mk +181 -0
  233. data/vendor/tracemonkey/jscpucfg.cpp +194 -0
  234. data/vendor/tracemonkey/jscpucfg.h +91 -0
  235. data/vendor/tracemonkey/jsdate.cpp +2465 -0
  236. data/vendor/tracemonkey/jsdate.h +129 -0
  237. data/vendor/tracemonkey/jsdbgapi.cpp +2017 -0
  238. data/vendor/tracemonkey/jsdbgapi.h +500 -0
  239. data/vendor/tracemonkey/jsdhash.cpp +876 -0
  240. data/vendor/tracemonkey/jsdhash.h +588 -0
  241. data/vendor/tracemonkey/jsdtoa.cpp +572 -0
  242. data/vendor/tracemonkey/jsdtoa.h +131 -0
  243. data/vendor/tracemonkey/jsdtracef.c +318 -0
  244. data/vendor/tracemonkey/jsdtracef.h +81 -0
  245. data/vendor/tracemonkey/jsemit.cpp +7292 -0
  246. data/vendor/tracemonkey/jsemit.h +802 -0
  247. data/vendor/tracemonkey/jsexn.cpp +1337 -0
  248. data/vendor/tracemonkey/jsexn.h +96 -0
  249. data/vendor/tracemonkey/jsfile.cpp +2747 -0
  250. data/vendor/tracemonkey/jsfile.h +56 -0
  251. data/vendor/tracemonkey/jsfile.msg +90 -0
  252. data/vendor/tracemonkey/jsfun.cpp +3089 -0
  253. data/vendor/tracemonkey/jsfun.h +366 -0
  254. data/vendor/tracemonkey/jsgc.cpp +3816 -0
  255. data/vendor/tracemonkey/jsgc.h +429 -0
  256. data/vendor/tracemonkey/jshash.cpp +477 -0
  257. data/vendor/tracemonkey/jshash.h +151 -0
  258. data/vendor/tracemonkey/jsify.pl +483 -0
  259. data/vendor/tracemonkey/jsinterp.cpp +7441 -0
  260. data/vendor/tracemonkey/jsinterp.h +666 -0
  261. data/vendor/tracemonkey/jsinvoke.cpp +42 -0
  262. data/vendor/tracemonkey/jsiter.cpp +1040 -0
  263. data/vendor/tracemonkey/jsiter.h +140 -0
  264. data/vendor/tracemonkey/jskeyword.tbl +124 -0
  265. data/vendor/tracemonkey/jskwgen.cpp +460 -0
  266. data/vendor/tracemonkey/jslibmath.h +69 -0
  267. data/vendor/tracemonkey/jslock.cpp +1512 -0
  268. data/vendor/tracemonkey/jslock.h +325 -0
  269. data/vendor/tracemonkey/jslocko.asm +60 -0
  270. data/vendor/tracemonkey/jslog2.cpp +111 -0
  271. data/vendor/tracemonkey/jslong.h +167 -0
  272. data/vendor/tracemonkey/jsmath.cpp +806 -0
  273. data/vendor/tracemonkey/jsmath.h +63 -0
  274. data/vendor/tracemonkey/jsnum.cpp +1374 -0
  275. data/vendor/tracemonkey/jsnum.h +280 -0
  276. data/vendor/tracemonkey/jsobj.cpp +6165 -0
  277. data/vendor/tracemonkey/jsobj.h +870 -0
  278. data/vendor/tracemonkey/json.cpp +1338 -0
  279. data/vendor/tracemonkey/json.h +108 -0
  280. data/vendor/tracemonkey/jsopcode.cpp +5484 -0
  281. data/vendor/tracemonkey/jsopcode.h +434 -0
  282. data/vendor/tracemonkey/jsopcode.tbl +591 -0
  283. data/vendor/tracemonkey/jsoplengen.cpp +121 -0
  284. data/vendor/tracemonkey/jsotypes.h +202 -0
  285. data/vendor/tracemonkey/jsparse.cpp +9257 -0
  286. data/vendor/tracemonkey/jsparse.h +900 -0
  287. data/vendor/tracemonkey/jsprf.cpp +1262 -0
  288. data/vendor/tracemonkey/jsprf.h +150 -0
  289. data/vendor/tracemonkey/jsproto.tbl +117 -0
  290. data/vendor/tracemonkey/jsprvtd.h +366 -0
  291. data/vendor/tracemonkey/jspubtd.h +585 -0
  292. data/vendor/tracemonkey/jsregexp.cpp +5051 -0
  293. data/vendor/tracemonkey/jsregexp.h +199 -0
  294. data/vendor/tracemonkey/jsreops.tbl +145 -0
  295. data/vendor/tracemonkey/jsscan.cpp +2040 -0
  296. data/vendor/tracemonkey/jsscan.h +467 -0
  297. data/vendor/tracemonkey/jsscope.cpp +1966 -0
  298. data/vendor/tracemonkey/jsscope.h +487 -0
  299. data/vendor/tracemonkey/jsscript.cpp +1932 -0
  300. data/vendor/tracemonkey/jsscript.h +345 -0
  301. data/vendor/tracemonkey/jsshell.msg +54 -0
  302. data/vendor/tracemonkey/jsstack.js +167 -0
  303. data/vendor/tracemonkey/jsstaticcheck.h +69 -0
  304. data/vendor/tracemonkey/jsstddef.h +87 -0
  305. data/vendor/tracemonkey/jsstdint.h +96 -0
  306. data/vendor/tracemonkey/jsstr.cpp +5277 -0
  307. data/vendor/tracemonkey/jsstr.h +702 -0
  308. data/vendor/tracemonkey/jstracer.cpp +10991 -0
  309. data/vendor/tracemonkey/jstracer.h +794 -0
  310. data/vendor/tracemonkey/jstypes.h +481 -0
  311. data/vendor/tracemonkey/jsutil.cpp +361 -0
  312. data/vendor/tracemonkey/jsutil.h +178 -0
  313. data/vendor/tracemonkey/jsversion.h +243 -0
  314. data/vendor/tracemonkey/jswince.asm +44 -0
  315. data/vendor/tracemonkey/jsxdrapi.cpp +800 -0
  316. data/vendor/tracemonkey/jsxdrapi.h +220 -0
  317. data/vendor/tracemonkey/jsxml.cpp +8327 -0
  318. data/vendor/tracemonkey/jsxml.h +305 -0
  319. data/vendor/tracemonkey/liveconnect/LiveConnect.dsp +157 -0
  320. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsp +120 -0
  321. data/vendor/tracemonkey/liveconnect/LiveConnectShell.dsw +44 -0
  322. data/vendor/tracemonkey/liveconnect/Makefile.in +105 -0
  323. data/vendor/tracemonkey/liveconnect/Makefile.ref +169 -0
  324. data/vendor/tracemonkey/liveconnect/README.html +712 -0
  325. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSException.h +14 -0
  326. data/vendor/tracemonkey/liveconnect/_jni/netscape_javascript_JSObject.h +155 -0
  327. data/vendor/tracemonkey/liveconnect/classes/Makefile.in +89 -0
  328. data/vendor/tracemonkey/liveconnect/classes/Makefile.ref +57 -0
  329. data/vendor/tracemonkey/liveconnect/classes/netscape/Makefile.ref +47 -0
  330. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSException.java +140 -0
  331. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSObject.java +183 -0
  332. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSProxy.java +58 -0
  333. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSRunnable.java +70 -0
  334. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/JSUtil.java +59 -0
  335. data/vendor/tracemonkey/liveconnect/classes/netscape/javascript/Makefile.ref +53 -0
  336. data/vendor/tracemonkey/liveconnect/config/AIX4.1.mk +45 -0
  337. data/vendor/tracemonkey/liveconnect/config/AIX4.2.mk +45 -0
  338. data/vendor/tracemonkey/liveconnect/config/AIX4.3.mk +50 -0
  339. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.10.mk +43 -0
  340. data/vendor/tracemonkey/liveconnect/config/HP-UXB.10.20.mk +43 -0
  341. data/vendor/tracemonkey/liveconnect/config/HP-UXB.11.00.mk +43 -0
  342. data/vendor/tracemonkey/liveconnect/config/IRIX6.2.mk +43 -0
  343. data/vendor/tracemonkey/liveconnect/config/IRIX6.3.mk +43 -0
  344. data/vendor/tracemonkey/liveconnect/config/IRIX6.5.mk +43 -0
  345. data/vendor/tracemonkey/liveconnect/config/Linux_All.mk +73 -0
  346. data/vendor/tracemonkey/liveconnect/config/OSF1V4.0.mk +65 -0
  347. data/vendor/tracemonkey/liveconnect/config/OSF1V5.0.mk +62 -0
  348. data/vendor/tracemonkey/liveconnect/config/SunOS5.5.1.mk +55 -0
  349. data/vendor/tracemonkey/liveconnect/config/SunOS5.6.mk +39 -0
  350. data/vendor/tracemonkey/liveconnect/config/SunOS5.7.mk +39 -0
  351. data/vendor/tracemonkey/liveconnect/config/SunOS5.8.mk +39 -0
  352. data/vendor/tracemonkey/liveconnect/config/WINNT4.0.mk +53 -0
  353. data/vendor/tracemonkey/liveconnect/jsj.c +886 -0
  354. data/vendor/tracemonkey/liveconnect/jsj.msg +98 -0
  355. data/vendor/tracemonkey/liveconnect/jsj_JSObject.c +1377 -0
  356. data/vendor/tracemonkey/liveconnect/jsj_JavaArray.c +474 -0
  357. data/vendor/tracemonkey/liveconnect/jsj_JavaClass.c +737 -0
  358. data/vendor/tracemonkey/liveconnect/jsj_JavaMember.c +191 -0
  359. data/vendor/tracemonkey/liveconnect/jsj_JavaObject.c +1079 -0
  360. data/vendor/tracemonkey/liveconnect/jsj_JavaPackage.c +569 -0
  361. data/vendor/tracemonkey/liveconnect/jsj_array.c +207 -0
  362. data/vendor/tracemonkey/liveconnect/jsj_class.c +770 -0
  363. data/vendor/tracemonkey/liveconnect/jsj_convert.c +902 -0
  364. data/vendor/tracemonkey/liveconnect/jsj_field.c +421 -0
  365. data/vendor/tracemonkey/liveconnect/jsj_hash.c +488 -0
  366. data/vendor/tracemonkey/liveconnect/jsj_hash.h +161 -0
  367. data/vendor/tracemonkey/liveconnect/jsj_method.c +1825 -0
  368. data/vendor/tracemonkey/liveconnect/jsj_nodl.c +1 -0
  369. data/vendor/tracemonkey/liveconnect/jsj_private.h +677 -0
  370. data/vendor/tracemonkey/liveconnect/jsj_simpleapi.c +219 -0
  371. data/vendor/tracemonkey/liveconnect/jsj_utils.c +513 -0
  372. data/vendor/tracemonkey/liveconnect/jsjava.h +316 -0
  373. data/vendor/tracemonkey/liveconnect/netscape_javascript_JSObject.h +155 -0
  374. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.cpp +785 -0
  375. data/vendor/tracemonkey/liveconnect/nsCLiveconnect.h +197 -0
  376. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.cpp +118 -0
  377. data/vendor/tracemonkey/liveconnect/nsCLiveconnectFactory.h +76 -0
  378. data/vendor/tracemonkey/liveconnect/nsILiveconnect.h +197 -0
  379. data/vendor/tracemonkey/liveconnect/nsISecureLiveconnect.h +94 -0
  380. data/vendor/tracemonkey/liveconnect/nsISecurityContext.h +136 -0
  381. data/vendor/tracemonkey/lock_SunOS.s +119 -0
  382. data/vendor/tracemonkey/mandelbrot-results.js +3 -0
  383. data/vendor/tracemonkey/math-partial-sums.js +32 -0
  384. data/vendor/tracemonkey/math-trace-tests.js +507 -0
  385. data/vendor/tracemonkey/md5.js +289 -0
  386. data/vendor/tracemonkey/nanojit/Assembler.cpp +1984 -0
  387. data/vendor/tracemonkey/nanojit/Assembler.h +375 -0
  388. data/vendor/tracemonkey/nanojit/Fragmento.cpp +651 -0
  389. data/vendor/tracemonkey/nanojit/Fragmento.h +237 -0
  390. data/vendor/tracemonkey/nanojit/LIR.cpp +2314 -0
  391. data/vendor/tracemonkey/nanojit/LIR.h +879 -0
  392. data/vendor/tracemonkey/nanojit/LIRopcode.tbl +252 -0
  393. data/vendor/tracemonkey/nanojit/Native.h +127 -0
  394. data/vendor/tracemonkey/nanojit/NativeARM.cpp +1742 -0
  395. data/vendor/tracemonkey/nanojit/NativeARM.h +844 -0
  396. data/vendor/tracemonkey/nanojit/NativeSparc.cpp +1130 -0
  397. data/vendor/tracemonkey/nanojit/NativeSparc.h +948 -0
  398. data/vendor/tracemonkey/nanojit/NativeThumb.cpp +1322 -0
  399. data/vendor/tracemonkey/nanojit/NativeThumb.h +525 -0
  400. data/vendor/tracemonkey/nanojit/Nativei386.cpp +1748 -0
  401. data/vendor/tracemonkey/nanojit/Nativei386.h +857 -0
  402. data/vendor/tracemonkey/nanojit/RegAlloc.cpp +183 -0
  403. data/vendor/tracemonkey/nanojit/RegAlloc.h +95 -0
  404. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.cpp +306 -0
  405. data/vendor/tracemonkey/nanojit/TraceTreeDrawer.h +88 -0
  406. data/vendor/tracemonkey/nanojit/avmplus.cpp +56 -0
  407. data/vendor/tracemonkey/nanojit/avmplus.h +1016 -0
  408. data/vendor/tracemonkey/nanojit/nanojit.h +253 -0
  409. data/vendor/tracemonkey/perfect.js +39 -0
  410. data/vendor/tracemonkey/plify_jsdhash.sed +35 -0
  411. data/vendor/tracemonkey/prmjtime.cpp +869 -0
  412. data/vendor/tracemonkey/prmjtime.h +103 -0
  413. data/vendor/tracemonkey/ref-config/AIX4.1.mk +65 -0
  414. data/vendor/tracemonkey/ref-config/AIX4.2.mk +64 -0
  415. data/vendor/tracemonkey/ref-config/AIX4.3.mk +65 -0
  416. data/vendor/tracemonkey/ref-config/Darwin.mk +85 -0
  417. data/vendor/tracemonkey/ref-config/Darwin1.3.mk +81 -0
  418. data/vendor/tracemonkey/ref-config/Darwin1.4.mk +41 -0
  419. data/vendor/tracemonkey/ref-config/Darwin5.2.mk +81 -0
  420. data/vendor/tracemonkey/ref-config/Darwin5.3.mk +81 -0
  421. data/vendor/tracemonkey/ref-config/Darwin64.mk +72 -0
  422. data/vendor/tracemonkey/ref-config/HP-UXB.10.10.mk +77 -0
  423. data/vendor/tracemonkey/ref-config/HP-UXB.10.20.mk +77 -0
  424. data/vendor/tracemonkey/ref-config/HP-UXB.11.00.mk +80 -0
  425. data/vendor/tracemonkey/ref-config/IRIX.mk +87 -0
  426. data/vendor/tracemonkey/ref-config/IRIX5.3.mk +44 -0
  427. data/vendor/tracemonkey/ref-config/IRIX6.1.mk +44 -0
  428. data/vendor/tracemonkey/ref-config/IRIX6.2.mk +44 -0
  429. data/vendor/tracemonkey/ref-config/IRIX6.3.mk +44 -0
  430. data/vendor/tracemonkey/ref-config/IRIX6.5.mk +44 -0
  431. data/vendor/tracemonkey/ref-config/Linux_All.mk +105 -0
  432. data/vendor/tracemonkey/ref-config/Mac_OS10.0.mk +82 -0
  433. data/vendor/tracemonkey/ref-config/OSF1V4.0.mk +72 -0
  434. data/vendor/tracemonkey/ref-config/OSF1V5.0.mk +69 -0
  435. data/vendor/tracemonkey/ref-config/SunOS4.1.4.mk +101 -0
  436. data/vendor/tracemonkey/ref-config/SunOS5.10.mk +50 -0
  437. data/vendor/tracemonkey/ref-config/SunOS5.3.mk +91 -0
  438. data/vendor/tracemonkey/ref-config/SunOS5.4.mk +92 -0
  439. data/vendor/tracemonkey/ref-config/SunOS5.5.1.mk +44 -0
  440. data/vendor/tracemonkey/ref-config/SunOS5.5.mk +87 -0
  441. data/vendor/tracemonkey/ref-config/SunOS5.6.mk +89 -0
  442. data/vendor/tracemonkey/ref-config/SunOS5.7.mk +44 -0
  443. data/vendor/tracemonkey/ref-config/SunOS5.8.mk +44 -0
  444. data/vendor/tracemonkey/ref-config/SunOS5.9.mk +44 -0
  445. data/vendor/tracemonkey/ref-config/WINNT4.0.mk +118 -0
  446. data/vendor/tracemonkey/ref-config/WINNT5.0.mk +118 -0
  447. data/vendor/tracemonkey/ref-config/WINNT5.1.mk +118 -0
  448. data/vendor/tracemonkey/ref-config/WINNT5.2.mk +118 -0
  449. data/vendor/tracemonkey/ref-config/WINNT6.0.mk +118 -0
  450. data/vendor/tracemonkey/ref-config/dgux.mk +64 -0
  451. data/vendor/tracemonkey/resource.h +15 -0
  452. data/vendor/tracemonkey/rules.mk +206 -0
  453. data/vendor/tracemonkey/shell/Makefile.in +72 -0
  454. data/vendor/tracemonkey/shell/js.cpp +4719 -0
  455. data/vendor/tracemonkey/t/3d-cube.js +337 -0
  456. data/vendor/tracemonkey/t/3d-morph.js +54 -0
  457. data/vendor/tracemonkey/t/3d-raytrace.js +441 -0
  458. data/vendor/tracemonkey/t/access-binary-trees.js +50 -0
  459. data/vendor/tracemonkey/t/access-fannkuch.js +66 -0
  460. data/vendor/tracemonkey/t/access-nbody.js +169 -0
  461. data/vendor/tracemonkey/t/access-nsieve.js +38 -0
  462. data/vendor/tracemonkey/t/bitops-3bit-bits-in-byte.js +32 -0
  463. data/vendor/tracemonkey/t/bitops-bits-in-byte.js +21 -0
  464. data/vendor/tracemonkey/t/bitops-bitwise-and.js +28 -0
  465. data/vendor/tracemonkey/t/bitops-nsieve-bits.js +32 -0
  466. data/vendor/tracemonkey/t/controlflow-recursive.js +25 -0
  467. data/vendor/tracemonkey/t/crypto-aes.js +422 -0
  468. data/vendor/tracemonkey/t/crypto-md5.js +286 -0
  469. data/vendor/tracemonkey/t/crypto-sha1.js +224 -0
  470. data/vendor/tracemonkey/t/date-format-tofte.js +299 -0
  471. data/vendor/tracemonkey/t/date-format-xparb.js +417 -0
  472. data/vendor/tracemonkey/t/math-cordic.js +95 -0
  473. data/vendor/tracemonkey/t/math-partial-sums.js +33 -0
  474. data/vendor/tracemonkey/t/math-spectral-norm.js +51 -0
  475. data/vendor/tracemonkey/t/regexp-dna.js +1712 -0
  476. data/vendor/tracemonkey/t/string-base64.js +135 -0
  477. data/vendor/tracemonkey/t/string-fasta.js +85 -0
  478. data/vendor/tracemonkey/t/string-tagcloud.js +265 -0
  479. data/vendor/tracemonkey/t/string-unpack-code.js +68 -0
  480. data/vendor/tracemonkey/t/string-validate-input.js +89 -0
  481. data/vendor/tracemonkey/time.sh +13 -0
  482. data/vendor/tracemonkey/trace-test.js +5564 -0
  483. data/vendor/tracemonkey/v8/base.js +187 -0
  484. data/vendor/tracemonkey/v8/crypto.js +1689 -0
  485. data/vendor/tracemonkey/v8/deltablue.js +880 -0
  486. data/vendor/tracemonkey/v8/earley-boyer.js +4682 -0
  487. data/vendor/tracemonkey/v8/raytrace.js +3418 -0
  488. data/vendor/tracemonkey/v8/richards.js +539 -0
  489. data/vendor/tracemonkey/v8/run-crypto.js +44 -0
  490. data/vendor/tracemonkey/v8/run-deltablue.js +44 -0
  491. data/vendor/tracemonkey/v8/run-earley-boyer.js +44 -0
  492. data/vendor/tracemonkey/v8/run-raytrace.js +44 -0
  493. data/vendor/tracemonkey/v8/run-richards.js +44 -0
  494. data/vendor/tracemonkey/v8/run.js +49 -0
  495. data/vendor/tracemonkey/vprof/readme.txt +93 -0
  496. data/vendor/tracemonkey/vprof/vprof.cpp +360 -0
  497. data/vendor/tracemonkey/vprof/vprof.h +245 -0
  498. data/vendor/tracemonkey/xpconnect/Makefile.in +67 -0
  499. data/vendor/tracemonkey/xpconnect/crashtests/117307-1.html +20 -0
  500. data/vendor/tracemonkey/xpconnect/crashtests/193710.html +11 -0
  501. data/vendor/tracemonkey/xpconnect/crashtests/290162-1.html +5 -0
  502. data/vendor/tracemonkey/xpconnect/crashtests/326615-1.html +16 -0
  503. data/vendor/tracemonkey/xpconnect/crashtests/328553-1.html +13 -0
  504. data/vendor/tracemonkey/xpconnect/crashtests/346258-1.html +12 -0
  505. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame1.xhtml +16 -0
  506. data/vendor/tracemonkey/xpconnect/crashtests/346512-1-frame2.xhtml +15 -0
  507. data/vendor/tracemonkey/xpconnect/crashtests/346512-1.xhtml +30 -0
  508. data/vendor/tracemonkey/xpconnect/crashtests/382133-1.html +3 -0
  509. data/vendor/tracemonkey/xpconnect/crashtests/386680-1.html +22 -0
  510. data/vendor/tracemonkey/xpconnect/crashtests/394810-1.html +4 -0
  511. data/vendor/tracemonkey/xpconnect/crashtests/400349-1.html +20 -0
  512. data/vendor/tracemonkey/xpconnect/crashtests/403356-1.html +13 -0
  513. data/vendor/tracemonkey/xpconnect/crashtests/418139-1.svg +22 -0
  514. data/vendor/tracemonkey/xpconnect/crashtests/420513-1.html +11 -0
  515. data/vendor/tracemonkey/xpconnect/crashtests/453935-1.html +37 -0
  516. data/vendor/tracemonkey/xpconnect/crashtests/462926.html +12 -0
  517. data/vendor/tracemonkey/xpconnect/crashtests/468552-1.html +18 -0
  518. data/vendor/tracemonkey/xpconnect/crashtests/471366-1.html +12 -0
  519. data/vendor/tracemonkey/xpconnect/crashtests/475185-1.html +13 -0
  520. data/vendor/tracemonkey/xpconnect/crashtests/475291-1.html +14 -0
  521. data/vendor/tracemonkey/xpconnect/crashtests/503286-1.html +23 -0
  522. data/vendor/tracemonkey/xpconnect/crashtests/crashtests.list +21 -0
  523. data/vendor/tracemonkey/xpconnect/idl/Makefile.in +78 -0
  524. data/vendor/tracemonkey/xpconnect/idl/XPCIDispatch.idl +51 -0
  525. data/vendor/tracemonkey/xpconnect/idl/mozIJSSubScriptLoader.idl +64 -0
  526. data/vendor/tracemonkey/xpconnect/idl/nsIActiveXSecurityPolicy.idl +67 -0
  527. data/vendor/tracemonkey/xpconnect/idl/nsIDispatchSupport.idl +119 -0
  528. data/vendor/tracemonkey/xpconnect/idl/nsIJSContextStack.idl +85 -0
  529. data/vendor/tracemonkey/xpconnect/idl/nsIJSRuntimeService.idl +51 -0
  530. data/vendor/tracemonkey/xpconnect/idl/nsIScriptError.idl +102 -0
  531. data/vendor/tracemonkey/xpconnect/idl/nsIScriptableInterfaces.idl +67 -0
  532. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptNotify.idl +66 -0
  533. data/vendor/tracemonkey/xpconnect/idl/nsIXPCScriptable.idl +183 -0
  534. data/vendor/tracemonkey/xpconnect/idl/nsIXPCSecurityManager.idl +114 -0
  535. data/vendor/tracemonkey/xpconnect/idl/nsIXPConnect.idl +819 -0
  536. data/vendor/tracemonkey/xpconnect/idl/xpcIJSModuleLoader.idl +95 -0
  537. data/vendor/tracemonkey/xpconnect/idl/xpcIJSWeakReference.idl +49 -0
  538. data/vendor/tracemonkey/xpconnect/idl/xpccomponents.idl +254 -0
  539. data/vendor/tracemonkey/xpconnect/idl/xpcexception.idl +66 -0
  540. data/vendor/tracemonkey/xpconnect/idl/xpcjsid.idl +83 -0
  541. data/vendor/tracemonkey/xpconnect/loader/ISO8601DateUtils.jsm +176 -0
  542. data/vendor/tracemonkey/xpconnect/loader/Makefile.in +63 -0
  543. data/vendor/tracemonkey/xpconnect/loader/XPCOMUtils.jsm +267 -0
  544. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.cpp +1717 -0
  545. data/vendor/tracemonkey/xpconnect/loader/mozJSComponentLoader.h +172 -0
  546. data/vendor/tracemonkey/xpconnect/loader/mozJSLoaderConstructors.h +101 -0
  547. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.cpp +360 -0
  548. data/vendor/tracemonkey/xpconnect/loader/mozJSSubScriptLoader.h +66 -0
  549. data/vendor/tracemonkey/xpconnect/public/Makefile.in +54 -0
  550. data/vendor/tracemonkey/xpconnect/public/nsAXPCNativeCallContext.h +89 -0
  551. data/vendor/tracemonkey/xpconnect/public/nsAutoJSValHolder.h +168 -0
  552. data/vendor/tracemonkey/xpconnect/public/xpc_map_end.h +327 -0
  553. data/vendor/tracemonkey/xpconnect/sample/Makefile.in +71 -0
  554. data/vendor/tracemonkey/xpconnect/sample/README +39 -0
  555. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.cpp +337 -0
  556. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.idl +82 -0
  557. data/vendor/tracemonkey/xpconnect/sample/xpcsample1.js +21 -0
  558. data/vendor/tracemonkey/xpconnect/shell/Makefile.in +106 -0
  559. data/vendor/tracemonkey/xpconnect/shell/jsshell.msg +50 -0
  560. data/vendor/tracemonkey/xpconnect/shell/xpcshell.cpp +1817 -0
  561. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.h +43 -0
  562. data/vendor/tracemonkey/xpconnect/shell/xpcshellMacUtils.mm +54 -0
  563. data/vendor/tracemonkey/xpconnect/src/Makefile.in +228 -0
  564. data/vendor/tracemonkey/xpconnect/src/README +3 -0
  565. data/vendor/tracemonkey/xpconnect/src/XPCCrossOriginWrapper.cpp +1186 -0
  566. data/vendor/tracemonkey/xpconnect/src/XPCDispConvert.cpp +593 -0
  567. data/vendor/tracemonkey/xpconnect/src/XPCDispInlines.h +667 -0
  568. data/vendor/tracemonkey/xpconnect/src/XPCDispInterface.cpp +383 -0
  569. data/vendor/tracemonkey/xpconnect/src/XPCDispObject.cpp +516 -0
  570. data/vendor/tracemonkey/xpconnect/src/XPCDispParamPropJSClass.cpp +223 -0
  571. data/vendor/tracemonkey/xpconnect/src/XPCDispParams.cpp +103 -0
  572. data/vendor/tracemonkey/xpconnect/src/XPCDispPrivate.h +1401 -0
  573. data/vendor/tracemonkey/xpconnect/src/XPCDispTearOff.cpp +547 -0
  574. data/vendor/tracemonkey/xpconnect/src/XPCDispTypeInfo.cpp +471 -0
  575. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchClassInfo.cpp +139 -0
  576. data/vendor/tracemonkey/xpconnect/src/XPCIDispatchExtension.cpp +362 -0
  577. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.cpp +1350 -0
  578. data/vendor/tracemonkey/xpconnect/src/XPCNativeWrapper.h +88 -0
  579. data/vendor/tracemonkey/xpconnect/src/XPCSafeJSObjectWrapper.cpp +1148 -0
  580. data/vendor/tracemonkey/xpconnect/src/XPCSystemOnlyWrapper.cpp +718 -0
  581. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.cpp +850 -0
  582. data/vendor/tracemonkey/xpconnect/src/XPCWrapper.h +394 -0
  583. data/vendor/tracemonkey/xpconnect/src/dom_quickstubs.qsconf +568 -0
  584. data/vendor/tracemonkey/xpconnect/src/nsDispatchSupport.cpp +348 -0
  585. data/vendor/tracemonkey/xpconnect/src/nsScriptError.cpp +201 -0
  586. data/vendor/tracemonkey/xpconnect/src/nsXPConnect.cpp +2609 -0
  587. data/vendor/tracemonkey/xpconnect/src/qsgen.py +1487 -0
  588. data/vendor/tracemonkey/xpconnect/src/xpc.msg +217 -0
  589. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.cpp +148 -0
  590. data/vendor/tracemonkey/xpconnect/src/xpcJSWeakReference.h +56 -0
  591. data/vendor/tracemonkey/xpconnect/src/xpccallcontext.cpp +579 -0
  592. data/vendor/tracemonkey/xpconnect/src/xpccomponents.cpp +4144 -0
  593. data/vendor/tracemonkey/xpconnect/src/xpccontext.cpp +115 -0
  594. data/vendor/tracemonkey/xpconnect/src/xpcconvert.cpp +2298 -0
  595. data/vendor/tracemonkey/xpconnect/src/xpcdebug.cpp +481 -0
  596. data/vendor/tracemonkey/xpconnect/src/xpcexception.cpp +502 -0
  597. data/vendor/tracemonkey/xpconnect/src/xpcforwards.h +114 -0
  598. data/vendor/tracemonkey/xpconnect/src/xpcinlines.h +772 -0
  599. data/vendor/tracemonkey/xpconnect/src/xpcjsid.cpp +1025 -0
  600. data/vendor/tracemonkey/xpconnect/src/xpcjsruntime.cpp +1342 -0
  601. data/vendor/tracemonkey/xpconnect/src/xpclog.cpp +128 -0
  602. data/vendor/tracemonkey/xpconnect/src/xpclog.h +101 -0
  603. data/vendor/tracemonkey/xpconnect/src/xpcmaps.cpp +761 -0
  604. data/vendor/tracemonkey/xpconnect/src/xpcmaps.h +713 -0
  605. data/vendor/tracemonkey/xpconnect/src/xpcmodule.cpp +136 -0
  606. data/vendor/tracemonkey/xpconnect/src/xpcprivate.h +4138 -0
  607. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.cpp +1128 -0
  608. data/vendor/tracemonkey/xpconnect/src/xpcquickstubs.h +480 -0
  609. data/vendor/tracemonkey/xpconnect/src/xpcruntimesvc.cpp +179 -0
  610. data/vendor/tracemonkey/xpconnect/src/xpcstack.cpp +342 -0
  611. data/vendor/tracemonkey/xpconnect/src/xpcstring.cpp +139 -0
  612. data/vendor/tracemonkey/xpconnect/src/xpcthreadcontext.cpp +599 -0
  613. data/vendor/tracemonkey/xpconnect/src/xpcthrower.cpp +399 -0
  614. data/vendor/tracemonkey/xpconnect/src/xpcvariant.cpp +850 -0
  615. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjs.cpp +670 -0
  616. data/vendor/tracemonkey/xpconnect/src/xpcwrappedjsclass.cpp +2015 -0
  617. data/vendor/tracemonkey/xpconnect/src/xpcwrappednative.cpp +3482 -0
  618. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeinfo.cpp +945 -0
  619. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativejsops.cpp +2003 -0
  620. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativeproto.cpp +302 -0
  621. data/vendor/tracemonkey/xpconnect/src/xpcwrappednativescope.cpp +991 -0
  622. data/vendor/tracemonkey/xpconnect/tests/Makefile.in +75 -0
  623. data/vendor/tracemonkey/xpconnect/tests/TestXPC.cpp +785 -0
  624. data/vendor/tracemonkey/xpconnect/tests/chrome/Makefile.in +51 -0
  625. data/vendor/tracemonkey/xpconnect/tests/chrome/test_bug500931.xul +43 -0
  626. data/vendor/tracemonkey/xpconnect/tests/components/Makefile.in +85 -0
  627. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_array.cpp +388 -0
  628. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_attributes.cpp +305 -0
  629. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_calljs.cpp +135 -0
  630. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_child.cpp +225 -0
  631. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_const.cpp +76 -0
  632. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_domstring.cpp +118 -0
  633. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_echo.cpp +616 -0
  634. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_in.cpp +204 -0
  635. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_inout.cpp +171 -0
  636. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_module.cpp +77 -0
  637. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_multiple.cpp +554 -0
  638. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_noisy.cpp +154 -0
  639. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_out.cpp +335 -0
  640. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_overloaded.cpp +250 -0
  641. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_private.h +192 -0
  642. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_string.cpp +185 -0
  643. data/vendor/tracemonkey/xpconnect/tests/components/xpctest_variant.cpp +355 -0
  644. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.cpp +12 -0
  645. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/StdAfx.h +28 -0
  646. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCDispUtilities.h +28 -0
  647. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.cpp +86 -0
  648. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.def +9 -0
  649. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsp +318 -0
  650. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.dsw +29 -0
  651. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.idl +454 -0
  652. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/XPCIDispatchTest.rc +145 -0
  653. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.cpp +44 -0
  654. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.h +56 -0
  655. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispSimple.rgs +23 -0
  656. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.cpp +221 -0
  657. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.h +53 -0
  658. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestArrays.rgs +23 -0
  659. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.cpp +699 -0
  660. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.h +138 -0
  661. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestMethods.rgs +23 -0
  662. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.cpp +23 -0
  663. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.h +41 -0
  664. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestNoIDispatch.rgs +23 -0
  665. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.cpp +256 -0
  666. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.h +88 -0
  667. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestProperties.rgs +23 -0
  668. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.cpp +23 -0
  669. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.h +43 -0
  670. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOff.rgs +23 -0
  671. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.cpp +29 -0
  672. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.h +45 -0
  673. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestScriptOn.rgs +23 -0
  674. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.cpp +177 -0
  675. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.h +50 -0
  676. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/nsXPCDispTestWrappedJS.rgs +23 -0
  677. data/vendor/tracemonkey/xpconnect/tests/idispatch/COM/resource.h +36 -0
  678. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Arrays/XPCIDispatchArrayTests.js +54 -0
  679. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Attributes/XPCIDispatchAttributeTests.js +150 -0
  680. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCIDispatchInstantiations.js +122 -0
  681. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/General/XPCStress.js +58 -0
  682. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/Methods/XPCIDispatchMethodTests.js +376 -0
  683. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedCOM/shell.js +377 -0
  684. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/General/XPCIDispatchTestWrappedJS.js +76 -0
  685. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/WrappedJS/shell.js +377 -0
  686. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/exectests.cmd +1 -0
  687. data/vendor/tracemonkey/xpconnect/tests/idispatch/Tests/jsDriver.pl +1288 -0
  688. data/vendor/tracemonkey/xpconnect/tests/idl/Makefile.in +61 -0
  689. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest.idl +312 -0
  690. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest2.idl +51 -0
  691. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_attributes.idl +67 -0
  692. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_calljs.idl +59 -0
  693. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_const.idl +61 -0
  694. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_domstring.idl +59 -0
  695. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_in.idl +88 -0
  696. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_inout.idl +86 -0
  697. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_multiple.idl +77 -0
  698. data/vendor/tracemonkey/xpconnect/tests/idl/xpctest_out.idl +142 -0
  699. data/vendor/tracemonkey/xpconnect/tests/js/checkid.js +82 -0
  700. data/vendor/tracemonkey/xpconnect/tests/js/evaluate.js +311 -0
  701. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-2.js +153 -0
  702. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-3.js +194 -0
  703. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-4.js +297 -0
  704. data/vendor/tracemonkey/xpconnect/tests/js/exceptions-5.js +343 -0
  705. data/vendor/tracemonkey/xpconnect/tests/js/exceptions.js +230 -0
  706. data/vendor/tracemonkey/xpconnect/tests/js/javascript.js +96 -0
  707. data/vendor/tracemonkey/xpconnect/tests/js/multiple-2.js +151 -0
  708. data/vendor/tracemonkey/xpconnect/tests/js/multiple-3.js +148 -0
  709. data/vendor/tracemonkey/xpconnect/tests/js/multiple-4.js +152 -0
  710. data/vendor/tracemonkey/xpconnect/tests/js/multiple.js +137 -0
  711. data/vendor/tracemonkey/xpconnect/tests/js/notscriptable.js +104 -0
  712. data/vendor/tracemonkey/xpconnect/tests/js/old/simpletest.js +36 -0
  713. data/vendor/tracemonkey/xpconnect/tests/js/old/speed.js +60 -0
  714. data/vendor/tracemonkey/xpconnect/tests/js/old/testxpc.js +464 -0
  715. data/vendor/tracemonkey/xpconnect/tests/js/old/threads.js +74 -0
  716. data/vendor/tracemonkey/xpconnect/tests/js/old/try.js +27 -0
  717. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_array.js +308 -0
  718. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_callcontext.js +68 -0
  719. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_echo.js +636 -0
  720. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_and_sort.js +28 -0
  721. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_constants.js +15 -0
  722. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_enum_create.js +200 -0
  723. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_exceptions.js +167 -0
  724. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_ids.js +135 -0
  725. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_observer.js +36 -0
  726. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_overloaded.js +14 -0
  727. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_primitives.js +141 -0
  728. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_propertybag.js +36 -0
  729. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant.js +339 -0
  730. data/vendor/tracemonkey/xpconnect/tests/js/old/xpctest_variant_array.js +30 -0
  731. data/vendor/tracemonkey/xpconnect/tests/js/readonlyattributes.js +74 -0
  732. data/vendor/tracemonkey/xpconnect/tests/js/readwriteattributes.js +101 -0
  733. data/vendor/tracemonkey/xpconnect/tests/js/scriptable.js +120 -0
  734. data/vendor/tracemonkey/xpconnect/tests/js/testin.js +203 -0
  735. data/vendor/tracemonkey/xpconnect/tests/js/xpcfun.js +234 -0
  736. data/vendor/tracemonkey/xpconnect/tests/js/xpctest_primitives.js +200 -0
  737. data/vendor/tracemonkey/xpconnect/tests/mochitest/Makefile.in +66 -0
  738. data/vendor/tracemonkey/xpconnect/tests/mochitest/bug500931_helper.html +7 -0
  739. data/vendor/tracemonkey/xpconnect/tests/mochitest/inner.html +7 -0
  740. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug361111.xul +29 -0
  741. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug384632.html +32 -0
  742. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug390488.html +65 -0
  743. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug393269.html +46 -0
  744. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug396851.html +43 -0
  745. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug428021.html +41 -0
  746. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug446584.html +49 -0
  747. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug448587.html +31 -0
  748. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug462428.html +42 -0
  749. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug478438.html +66 -0
  750. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484107.html +100 -0
  751. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug484459.html +36 -0
  752. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_bug500691.html +28 -0
  753. data/vendor/tracemonkey/xpconnect/tests/mochitest/test_wrappers.html +116 -0
  754. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_element_type.jsm +1 -0
  755. data/vendor/tracemonkey/xpconnect/tests/unit/bogus_exports_type.jsm +1 -0
  756. data/vendor/tracemonkey/xpconnect/tests/unit/bug451678_subscript.js +2 -0
  757. data/vendor/tracemonkey/xpconnect/tests/unit/component_import.js +144 -0
  758. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importA.jsm +44 -0
  759. data/vendor/tracemonkey/xpconnect/tests/unit/recursive_importB.jsm +45 -0
  760. data/vendor/tracemonkey/xpconnect/tests/unit/syntax_error.jsm +1 -0
  761. data/vendor/tracemonkey/xpconnect/tests/unit/test_bogus_files.js +88 -0
  762. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug408412.js +51 -0
  763. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug451678.js +52 -0
  764. data/vendor/tracemonkey/xpconnect/tests/unit/test_bug_442086.js +68 -0
  765. data/vendor/tracemonkey/xpconnect/tests/unit/test_import.js +127 -0
  766. data/vendor/tracemonkey/xpconnect/tests/unit/test_js_weak_references.js +63 -0
  767. data/vendor/tracemonkey/xpconnect/tests/unit/test_recursive_import.js +62 -0
  768. data/vendor/tracemonkey/xpconnect/tools/Makefile.in +49 -0
  769. data/vendor/tracemonkey/xpconnect/tools/idl/Makefile.in +53 -0
  770. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsCompiler.idl +60 -0
  771. data/vendor/tracemonkey/xpconnect/tools/idl/nsIXPCToolsProfiler.idl +57 -0
  772. data/vendor/tracemonkey/xpconnect/tools/js/CompileJSFiles.js +28 -0
  773. data/vendor/tracemonkey/xpconnect/tools/js/ListJSFiles.js +18 -0
  774. data/vendor/tracemonkey/xpconnect/tools/src/Makefile.in +76 -0
  775. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsCompiler.cpp +161 -0
  776. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsModule.cpp +65 -0
  777. data/vendor/tracemonkey/xpconnect/tools/src/nsXPCToolsProfiler.cpp +370 -0
  778. data/vendor/tracemonkey/xpconnect/tools/src/xpctools_private.h +236 -0
  779. metadata +782 -107
  780. data/test/johnson/nodes/export_test.rb +0 -9
  781. data/test/johnson/nodes/import_test.rb +0 -13
  782. data/test/johnson/version_test.rb +0 -13
@@ -0,0 +1,187 @@
1
+ // Copyright 2008 Google Inc. All Rights Reserved.
2
+ // Redistribution and use in source and binary forms, with or without
3
+ // modification, are permitted provided that the following conditions are
4
+ // met:
5
+ //
6
+ // * Redistributions of source code must retain the above copyright
7
+ // notice, this list of conditions and the following disclaimer.
8
+ // * Redistributions in binary form must reproduce the above
9
+ // copyright notice, this list of conditions and the following
10
+ // disclaimer in the documentation and/or other materials provided
11
+ // with the distribution.
12
+ // * Neither the name of Google Inc. nor the names of its
13
+ // contributors may be used to endorse or promote products derived
14
+ // from this software without specific prior written permission.
15
+ //
16
+ // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
+ // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
+ // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
+ // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
+ // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
+ // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
+ // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
+ // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
+ // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
+ // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
+ // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
+
28
+
29
+ // Simple framework for running the benchmark suites and
30
+ // computing a score based on the timing measurements.
31
+
32
+
33
+ // A benchmark has a name (string) and a function that will be run to
34
+ // do the performance measurement.
35
+ function Benchmark(name, run) {
36
+ this.name = name;
37
+ this.run = run;
38
+ }
39
+
40
+
41
+ // Benchmark results hold the benchmark and the measured time used to
42
+ // run the benchmark. The benchmark score is computed later once a
43
+ // full benchmark suite has run to completion.
44
+ function BenchmarkResult(benchmark, time) {
45
+ this.benchmark = benchmark;
46
+ this.time = time;
47
+ }
48
+
49
+
50
+ // Automatically convert results to numbers. Used by the geometric
51
+ // mean computation.
52
+ BenchmarkResult.prototype.valueOf = function() {
53
+ return this.time;
54
+ }
55
+
56
+
57
+ // Suites of benchmarks consist of a name and the set of benchmarks in
58
+ // addition to the reference timing that the final score will be based
59
+ // on. This way, all scores are relative to a reference run and higher
60
+ // scores implies better performance.
61
+ function BenchmarkSuite(name, reference, benchmarks) {
62
+ this.name = name;
63
+ this.reference = reference;
64
+ this.benchmarks = benchmarks;
65
+ BenchmarkSuite.suites.push(this);
66
+ }
67
+
68
+
69
+ // Keep track of all declared benchmark suites.
70
+ BenchmarkSuite.suites = [];
71
+
72
+
73
+ // Scores are not comparable across versions. Bump the version if
74
+ // you're making changes that will affect that scores, e.g. if you add
75
+ // a new benchmark or change an existing one.
76
+ BenchmarkSuite.version = '1';
77
+
78
+
79
+ // Runs all registered benchmark suites and optionally yields between
80
+ // each individual benchmark to avoid running for too long in the
81
+ // context of browsers. Once done, the final score is reported to the
82
+ // runner.
83
+ BenchmarkSuite.RunSuites = function(runner) {
84
+ var continuation = null;
85
+ var suites = BenchmarkSuite.suites;
86
+ var length = suites.length;
87
+ BenchmarkSuite.scores = [];
88
+ var index = 0;
89
+ function RunStep() {
90
+ while (continuation || index < length) {
91
+ if (continuation) {
92
+ continuation = continuation();
93
+ } else {
94
+ var suite = suites[index++];
95
+ if (runner.NotifyStart) runner.NotifyStart(suite.name);
96
+ continuation = suite.RunStep(runner);
97
+ }
98
+ if (continuation && typeof window != 'undefined' && window.setTimeout) {
99
+ window.setTimeout(RunStep, 100);
100
+ return;
101
+ }
102
+ }
103
+ if (runner.NotifyScore) {
104
+ var score = BenchmarkSuite.GeometricMean(BenchmarkSuite.scores);
105
+ runner.NotifyScore(Math.round(100 * score));
106
+ }
107
+ }
108
+ RunStep();
109
+ }
110
+
111
+
112
+ // Counts the total number of registered benchmarks. Useful for
113
+ // showing progress as a percentage.
114
+ BenchmarkSuite.CountBenchmarks = function() {
115
+ var result = 0;
116
+ var suites = BenchmarkSuite.suites;
117
+ for (var i = 0; i < suites.length; i++) {
118
+ result += suites[i].benchmarks.length;
119
+ }
120
+ return result;
121
+ }
122
+
123
+
124
+ // Computes the geometric mean of a set of numbers.
125
+ BenchmarkSuite.GeometricMean = function(numbers) {
126
+ var log = 0;
127
+ for (var i = 0; i < numbers.length; i++) {
128
+ log += Math.log(numbers[i]);
129
+ }
130
+ return Math.pow(Math.E, log / numbers.length);
131
+ }
132
+
133
+
134
+ // Notifies the runner that we're done running a single benchmark in
135
+ // the benchmark suite. This can be useful to report progress.
136
+ BenchmarkSuite.prototype.NotifyStep = function(result) {
137
+ this.results.push(result);
138
+ if (this.runner.NotifyStep) this.runner.NotifyStep(result.benchmark.name);
139
+ }
140
+
141
+
142
+ // Notifies the runner that we're done with running a suite and that
143
+ // we have a result which can be reported to the user if needed.
144
+ BenchmarkSuite.prototype.NotifyResult = function() {
145
+ var mean = BenchmarkSuite.GeometricMean(this.results);
146
+ var score = this.reference / mean;
147
+ BenchmarkSuite.scores.push(score);
148
+ if (this.runner.NotifyResult) {
149
+ this.runner.NotifyResult(this.name, Math.round(100 * score));
150
+ }
151
+ }
152
+
153
+
154
+ // Runs a single benchmark for at least a second and computes the
155
+ // average time it takes to run a single iteration.
156
+ BenchmarkSuite.prototype.RunSingle = function(benchmark) {
157
+ var elapsed = 0;
158
+ var start = new Date();
159
+ for (var n = 0; elapsed < 1000; n++) {
160
+ benchmark.run();
161
+ elapsed = new Date() - start;
162
+ }
163
+ var usec = (elapsed * 1000) / n;
164
+ this.NotifyStep(new BenchmarkResult(benchmark, usec));
165
+ }
166
+
167
+
168
+ // This function starts running a suite, but stops between each
169
+ // individual benchmark in the suite and returns a continuation
170
+ // function which can be invoked to run the next benchmark. Once the
171
+ // last benchmark has been executed, null is returned.
172
+ BenchmarkSuite.prototype.RunStep = function(runner) {
173
+ this.results = [];
174
+ this.runner = runner;
175
+ var length = this.benchmarks.length;
176
+ var index = 0;
177
+ var suite = this;
178
+ function RunNext() {
179
+ if (index < length) {
180
+ suite.RunSingle(suite.benchmarks[index++]);
181
+ return RunNext;
182
+ }
183
+ suite.NotifyResult();
184
+ return null;
185
+ }
186
+ return RunNext();
187
+ }
@@ -0,0 +1,1689 @@
1
+ /*
2
+ * Copyright (c) 2003-2005 Tom Wu
3
+ * All Rights Reserved.
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining
6
+ * a copy of this software and associated documentation files (the
7
+ * "Software"), to deal in the Software without restriction, including
8
+ * without limitation the rights to use, copy, modify, merge, publish,
9
+ * distribute, sublicense, and/or sell copies of the Software, and to
10
+ * permit persons to whom the Software is furnished to do so, subject to
11
+ * the following conditions:
12
+ *
13
+ * The above copyright notice and this permission notice shall be
14
+ * included in all copies or substantial portions of the Software.
15
+ *
16
+ * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
17
+ * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
18
+ * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
19
+ *
20
+ * IN NO EVENT SHALL TOM WU BE LIABLE FOR ANY SPECIAL, INCIDENTAL,
21
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY DAMAGES WHATSOEVER
22
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR NOT ADVISED OF
23
+ * THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY, ARISING OUT
24
+ * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25
+ *
26
+ * In addition, the following condition applies:
27
+ *
28
+ * All redistributions must retain an intact copy of this copyright notice
29
+ * and disclaimer.
30
+ */
31
+
32
+
33
+ // The code has been adapted for use as a benchmark by Google.
34
+ var Crypto = new BenchmarkSuite('Crypto', 203037, [
35
+ new Benchmark("Encrypt", encrypt),
36
+ new Benchmark("Decrypt", decrypt)
37
+ ]);
38
+
39
+
40
+ // Basic JavaScript BN library - subset useful for RSA encryption.
41
+
42
+ // Bits per digit
43
+ var dbits;
44
+ var BI_DB;
45
+ var BI_DM;
46
+ var BI_DV;
47
+
48
+ var BI_FP;
49
+ var BI_FV;
50
+ var BI_F1;
51
+ var BI_F2;
52
+
53
+ // JavaScript engine analysis
54
+ var canary = 0xdeadbeefcafe;
55
+ var j_lm = ((canary&0xffffff)==0xefcafe);
56
+
57
+ // (public) Constructor
58
+ function BigInteger(a,b,c) {
59
+ this.array = new Array();
60
+ if(a != null)
61
+ if("number" == typeof a) this.fromNumber(a,b,c);
62
+ else if(b == null && "string" != typeof a) this.fromString(a,256);
63
+ else this.fromString(a,b);
64
+ }
65
+
66
+ // return new, unset BigInteger
67
+ function nbi() { return new BigInteger(null); }
68
+
69
+ // am: Compute w_j += (x*this_i), propagate carries,
70
+ // c is initial carry, returns final carry.
71
+ // c < 3*dvalue, x < 2*dvalue, this_i < dvalue
72
+ // We need to select the fastest one that works in this environment.
73
+
74
+ // am1: use a single mult and divide to get the high bits,
75
+ // max digit bits should be 26 because
76
+ // max internal value = 2*dvalue^2-2*dvalue (< 2^53)
77
+ function am1(i,x,w,j,c,n) {
78
+ var this_array = this.array;
79
+ var w_array = w.array;
80
+ while(--n >= 0) {
81
+ var v = x*this_array[i++]+w_array[j]+c;
82
+ c = Math.floor(v/0x4000000);
83
+ w_array[j++] = v&0x3ffffff;
84
+ }
85
+ return c;
86
+ }
87
+
88
+ // am2 avoids a big mult-and-extract completely.
89
+ // Max digit bits should be <= 30 because we do bitwise ops
90
+ // on values up to 2*hdvalue^2-hdvalue-1 (< 2^31)
91
+ function am2(i,x,w,j,c,n) {
92
+ var this_array = this.array;
93
+ var w_array = w.array;
94
+ var xl = x&0x7fff, xh = x>>15;
95
+ while(--n >= 0) {
96
+ var l = this_array[i]&0x7fff;
97
+ var h = this_array[i++]>>15;
98
+ var m = xh*l+h*xl;
99
+ l = xl*l+((m&0x7fff)<<15)+w_array[j]+(c&0x3fffffff);
100
+ c = (l>>>30)+(m>>>15)+xh*h+(c>>>30);
101
+ w_array[j++] = l&0x3fffffff;
102
+ }
103
+ return c;
104
+ }
105
+
106
+ // Alternately, set max digit bits to 28 since some
107
+ // browsers slow down when dealing with 32-bit numbers.
108
+ function am3(i,x,w,j,c,n) {
109
+ var this_array = this.array;
110
+ var w_array = w.array;
111
+
112
+ var xl = x&0x3fff, xh = x>>14;
113
+ while(--n >= 0) {
114
+ var l = this_array[i]&0x3fff;
115
+ var h = this_array[i++]>>14;
116
+ var m = xh*l+h*xl;
117
+ l = xl*l+((m&0x3fff)<<14)+w_array[j]+c;
118
+ c = (l>>28)+(m>>14)+xh*h;
119
+ w_array[j++] = l&0xfffffff;
120
+ }
121
+ return c;
122
+ }
123
+
124
+ // This is tailored to VMs with 2-bit tagging. It makes sure
125
+ // that all the computations stay within the 29 bits available.
126
+ function am4(i,x,w,j,c,n) {
127
+ var this_array = this.array;
128
+ var w_array = w.array;
129
+
130
+ var xl = x&0x1fff, xh = x>>13;
131
+ while(--n >= 0) {
132
+ var l = this_array[i]&0x1fff;
133
+ var h = this_array[i++]>>13;
134
+ var m = xh*l+h*xl;
135
+ l = xl*l+((m&0x1fff)<<13)+w_array[j]+c;
136
+ c = (l>>26)+(m>>13)+xh*h;
137
+ w_array[j++] = l&0x3ffffff;
138
+ }
139
+ return c;
140
+ }
141
+
142
+ // am3/28 is best for SM, Rhino, but am4/26 is best for v8.
143
+ // Kestrel (Opera 9.5) gets its best result with am4/26.
144
+ // IE7 does 9% better with am3/28 than with am4/26.
145
+ // Firefox (SM) gets 10% faster with am3/28 than with am4/26.
146
+
147
+ setupEngine = function(fn, bits) {
148
+ BigInteger.prototype.am = fn;
149
+ dbits = bits;
150
+
151
+ BI_DB = dbits;
152
+ BI_DM = ((1<<dbits)-1);
153
+ BI_DV = (1<<dbits);
154
+
155
+ BI_FP = 52;
156
+ BI_FV = Math.pow(2,BI_FP);
157
+ BI_F1 = BI_FP-dbits;
158
+ BI_F2 = 2*dbits-BI_FP;
159
+ }
160
+
161
+
162
+ // Digit conversions
163
+ var BI_RM = "0123456789abcdefghijklmnopqrstuvwxyz";
164
+ var BI_RC = new Array();
165
+ var rr,vv;
166
+ rr = "0".charCodeAt(0);
167
+ for(vv = 0; vv <= 9; ++vv) BI_RC[rr++] = vv;
168
+ rr = "a".charCodeAt(0);
169
+ for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
170
+ rr = "A".charCodeAt(0);
171
+ for(vv = 10; vv < 36; ++vv) BI_RC[rr++] = vv;
172
+
173
+ function int2char(n) { return BI_RM.charAt(n); }
174
+ function intAt(s,i) {
175
+ var c = BI_RC[s.charCodeAt(i)];
176
+ return (c==null)?-1:c;
177
+ }
178
+
179
+ // (protected) copy this to r
180
+ function bnpCopyTo(r) {
181
+ var this_array = this.array;
182
+ var r_array = r.array;
183
+
184
+ for(var i = this.t-1; i >= 0; --i) r_array[i] = this_array[i];
185
+ r.t = this.t;
186
+ r.s = this.s;
187
+ }
188
+
189
+ // (protected) set from integer value x, -DV <= x < DV
190
+ function bnpFromInt(x) {
191
+ var this_array = this.array;
192
+ this.t = 1;
193
+ this.s = (x<0)?-1:0;
194
+ if(x > 0) this_array[0] = x;
195
+ else if(x < -1) this_array[0] = x+DV;
196
+ else this.t = 0;
197
+ }
198
+
199
+ // return bigint initialized to value
200
+ function nbv(i) { var r = nbi(); r.fromInt(i); return r; }
201
+
202
+ // (protected) set from string and radix
203
+ function bnpFromString(s,b) {
204
+ var this_array = this.array;
205
+ var k;
206
+ if(b == 16) k = 4;
207
+ else if(b == 8) k = 3;
208
+ else if(b == 256) k = 8; // byte array
209
+ else if(b == 2) k = 1;
210
+ else if(b == 32) k = 5;
211
+ else if(b == 4) k = 2;
212
+ else { this.fromRadix(s,b); return; }
213
+ this.t = 0;
214
+ this.s = 0;
215
+ var i = s.length, mi = false, sh = 0;
216
+ while(--i >= 0) {
217
+ var x = (k==8)?s[i]&0xff:intAt(s,i);
218
+ if(x < 0) {
219
+ if(s.charAt(i) == "-") mi = true;
220
+ continue;
221
+ }
222
+ mi = false;
223
+ if(sh == 0)
224
+ this_array[this.t++] = x;
225
+ else if(sh+k > BI_DB) {
226
+ this_array[this.t-1] |= (x&((1<<(BI_DB-sh))-1))<<sh;
227
+ this_array[this.t++] = (x>>(BI_DB-sh));
228
+ }
229
+ else
230
+ this_array[this.t-1] |= x<<sh;
231
+ sh += k;
232
+ if(sh >= BI_DB) sh -= BI_DB;
233
+ }
234
+ if(k == 8 && (s[0]&0x80) != 0) {
235
+ this.s = -1;
236
+ if(sh > 0) this_array[this.t-1] |= ((1<<(BI_DB-sh))-1)<<sh;
237
+ }
238
+ this.clamp();
239
+ if(mi) BigInteger.ZERO.subTo(this,this);
240
+ }
241
+
242
+ // (protected) clamp off excess high words
243
+ function bnpClamp() {
244
+ var this_array = this.array;
245
+ var c = this.s&BI_DM;
246
+ while(this.t > 0 && this_array[this.t-1] == c) --this.t;
247
+ }
248
+
249
+ // (public) return string representation in given radix
250
+ function bnToString(b) {
251
+ var this_array = this.array;
252
+ if(this.s < 0) return "-"+this.negate().toString(b);
253
+ var k;
254
+ if(b == 16) k = 4;
255
+ else if(b == 8) k = 3;
256
+ else if(b == 2) k = 1;
257
+ else if(b == 32) k = 5;
258
+ else if(b == 4) k = 2;
259
+ else return this.toRadix(b);
260
+ var km = (1<<k)-1, d, m = false, r = "", i = this.t;
261
+ var p = BI_DB-(i*BI_DB)%k;
262
+ if(i-- > 0) {
263
+ if(p < BI_DB && (d = this_array[i]>>p) > 0) { m = true; r = int2char(d); }
264
+ while(i >= 0) {
265
+ if(p < k) {
266
+ d = (this_array[i]&((1<<p)-1))<<(k-p);
267
+ d |= this_array[--i]>>(p+=BI_DB-k);
268
+ }
269
+ else {
270
+ d = (this_array[i]>>(p-=k))&km;
271
+ if(p <= 0) { p += BI_DB; --i; }
272
+ }
273
+ if(d > 0) m = true;
274
+ if(m) r += int2char(d);
275
+ }
276
+ }
277
+ return m?r:"0";
278
+ }
279
+
280
+ // (public) -this
281
+ function bnNegate() { var r = nbi(); BigInteger.ZERO.subTo(this,r); return r; }
282
+
283
+ // (public) |this|
284
+ function bnAbs() { return (this.s<0)?this.negate():this; }
285
+
286
+ // (public) return + if this > a, - if this < a, 0 if equal
287
+ function bnCompareTo(a) {
288
+ var this_array = this.array;
289
+ var a_array = a.array;
290
+
291
+ var r = this.s-a.s;
292
+ if(r != 0) return r;
293
+ var i = this.t;
294
+ r = i-a.t;
295
+ if(r != 0) return r;
296
+ while(--i >= 0) if((r=this_array[i]-a_array[i]) != 0) return r;
297
+ return 0;
298
+ }
299
+
300
+ // returns bit length of the integer x
301
+ function nbits(x) {
302
+ var r = 1, t;
303
+ if((t=x>>>16) != 0) { x = t; r += 16; }
304
+ if((t=x>>8) != 0) { x = t; r += 8; }
305
+ if((t=x>>4) != 0) { x = t; r += 4; }
306
+ if((t=x>>2) != 0) { x = t; r += 2; }
307
+ if((t=x>>1) != 0) { x = t; r += 1; }
308
+ return r;
309
+ }
310
+
311
+ // (public) return the number of bits in "this"
312
+ function bnBitLength() {
313
+ var this_array = this.array;
314
+ if(this.t <= 0) return 0;
315
+ return BI_DB*(this.t-1)+nbits(this_array[this.t-1]^(this.s&BI_DM));
316
+ }
317
+
318
+ // (protected) r = this << n*DB
319
+ function bnpDLShiftTo(n,r) {
320
+ var this_array = this.array;
321
+ var r_array = r.array;
322
+ var i;
323
+ for(i = this.t-1; i >= 0; --i) r_array[i+n] = this_array[i];
324
+ for(i = n-1; i >= 0; --i) r_array[i] = 0;
325
+ r.t = this.t+n;
326
+ r.s = this.s;
327
+ }
328
+
329
+ // (protected) r = this >> n*DB
330
+ function bnpDRShiftTo(n,r) {
331
+ var this_array = this.array;
332
+ var r_array = r.array;
333
+ for(var i = n; i < this.t; ++i) r_array[i-n] = this_array[i];
334
+ r.t = Math.max(this.t-n,0);
335
+ r.s = this.s;
336
+ }
337
+
338
+ // (protected) r = this << n
339
+ function bnpLShiftTo(n,r) {
340
+ var this_array = this.array;
341
+ var r_array = r.array;
342
+ var bs = n%BI_DB;
343
+ var cbs = BI_DB-bs;
344
+ var bm = (1<<cbs)-1;
345
+ var ds = Math.floor(n/BI_DB), c = (this.s<<bs)&BI_DM, i;
346
+ for(i = this.t-1; i >= 0; --i) {
347
+ r_array[i+ds+1] = (this_array[i]>>cbs)|c;
348
+ c = (this_array[i]&bm)<<bs;
349
+ }
350
+ for(i = ds-1; i >= 0; --i) r_array[i] = 0;
351
+ r_array[ds] = c;
352
+ r.t = this.t+ds+1;
353
+ r.s = this.s;
354
+ r.clamp();
355
+ }
356
+
357
+ // (protected) r = this >> n
358
+ function bnpRShiftTo(n,r) {
359
+ var this_array = this.array;
360
+ var r_array = r.array;
361
+ r.s = this.s;
362
+ var ds = Math.floor(n/BI_DB);
363
+ if(ds >= this.t) { r.t = 0; return; }
364
+ var bs = n%BI_DB;
365
+ var cbs = BI_DB-bs;
366
+ var bm = (1<<bs)-1;
367
+ r_array[0] = this_array[ds]>>bs;
368
+ for(var i = ds+1; i < this.t; ++i) {
369
+ r_array[i-ds-1] |= (this_array[i]&bm)<<cbs;
370
+ r_array[i-ds] = this_array[i]>>bs;
371
+ }
372
+ if(bs > 0) r_array[this.t-ds-1] |= (this.s&bm)<<cbs;
373
+ r.t = this.t-ds;
374
+ r.clamp();
375
+ }
376
+
377
+ // (protected) r = this - a
378
+ function bnpSubTo(a,r) {
379
+ var this_array = this.array;
380
+ var r_array = r.array;
381
+ var a_array = a.array;
382
+ var i = 0, c = 0, m = Math.min(a.t,this.t);
383
+ while(i < m) {
384
+ c += this_array[i]-a_array[i];
385
+ r_array[i++] = c&BI_DM;
386
+ c >>= BI_DB;
387
+ }
388
+ if(a.t < this.t) {
389
+ c -= a.s;
390
+ while(i < this.t) {
391
+ c += this_array[i];
392
+ r_array[i++] = c&BI_DM;
393
+ c >>= BI_DB;
394
+ }
395
+ c += this.s;
396
+ }
397
+ else {
398
+ c += this.s;
399
+ while(i < a.t) {
400
+ c -= a_array[i];
401
+ r_array[i++] = c&BI_DM;
402
+ c >>= BI_DB;
403
+ }
404
+ c -= a.s;
405
+ }
406
+ r.s = (c<0)?-1:0;
407
+ if(c < -1) r_array[i++] = BI_DV+c;
408
+ else if(c > 0) r_array[i++] = c;
409
+ r.t = i;
410
+ r.clamp();
411
+ }
412
+
413
+ // (protected) r = this * a, r != this,a (HAC 14.12)
414
+ // "this" should be the larger one if appropriate.
415
+ function bnpMultiplyTo(a,r) {
416
+ var this_array = this.array;
417
+ var r_array = r.array;
418
+ var x = this.abs(), y = a.abs();
419
+ var y_array = y.array;
420
+
421
+ var i = x.t;
422
+ r.t = i+y.t;
423
+ while(--i >= 0) r_array[i] = 0;
424
+ for(i = 0; i < y.t; ++i) r_array[i+x.t] = x.am(0,y_array[i],r,i,0,x.t);
425
+ r.s = 0;
426
+ r.clamp();
427
+ if(this.s != a.s) BigInteger.ZERO.subTo(r,r);
428
+ }
429
+
430
+ // (protected) r = this^2, r != this (HAC 14.16)
431
+ function bnpSquareTo(r) {
432
+ var x = this.abs();
433
+ var x_array = x.array;
434
+ var r_array = r.array;
435
+
436
+ var i = r.t = 2*x.t;
437
+ while(--i >= 0) r_array[i] = 0;
438
+ for(i = 0; i < x.t-1; ++i) {
439
+ var c = x.am(i,x_array[i],r,2*i,0,1);
440
+ if((r_array[i+x.t]+=x.am(i+1,2*x_array[i],r,2*i+1,c,x.t-i-1)) >= BI_DV) {
441
+ r_array[i+x.t] -= BI_DV;
442
+ r_array[i+x.t+1] = 1;
443
+ }
444
+ }
445
+ if(r.t > 0) r_array[r.t-1] += x.am(i,x_array[i],r,2*i,0,1);
446
+ r.s = 0;
447
+ r.clamp();
448
+ }
449
+
450
+ // (protected) divide this by m, quotient and remainder to q, r (HAC 14.20)
451
+ // r != q, this != m. q or r may be null.
452
+ function bnpDivRemTo(m,q,r) {
453
+ var pm = m.abs();
454
+ if(pm.t <= 0) return;
455
+ var pt = this.abs();
456
+ if(pt.t < pm.t) {
457
+ if(q != null) q.fromInt(0);
458
+ if(r != null) this.copyTo(r);
459
+ return;
460
+ }
461
+ if(r == null) r = nbi();
462
+ var y = nbi(), ts = this.s, ms = m.s;
463
+ var pm_array = pm.array;
464
+ var nsh = BI_DB-nbits(pm_array[pm.t-1]); // normalize modulus
465
+ if(nsh > 0) { pm.lShiftTo(nsh,y); pt.lShiftTo(nsh,r); }
466
+ else { pm.copyTo(y); pt.copyTo(r); }
467
+ var ys = y.t;
468
+
469
+ var y_array = y.array;
470
+ var y0 = y_array[ys-1];
471
+ if(y0 == 0) return;
472
+ var yt = y0*(1<<BI_F1)+((ys>1)?y_array[ys-2]>>BI_F2:0);
473
+ var d1 = BI_FV/yt, d2 = (1<<BI_F1)/yt, e = 1<<BI_F2;
474
+ var i = r.t, j = i-ys, t = (q==null)?nbi():q;
475
+ y.dlShiftTo(j,t);
476
+
477
+ var r_array = r.array;
478
+ if(r.compareTo(t) >= 0) {
479
+ r_array[r.t++] = 1;
480
+ r.subTo(t,r);
481
+ }
482
+ BigInteger.ONE.dlShiftTo(ys,t);
483
+ t.subTo(y,y); // "negative" y so we can replace sub with am later
484
+ while(y.t < ys) y_array[y.t++] = 0;
485
+ while(--j >= 0) {
486
+ // Estimate quotient digit
487
+ var qd = (r_array[--i]==y0)?BI_DM:Math.floor(r_array[i]*d1+(r_array[i-1]+e)*d2);
488
+ if((r_array[i]+=y.am(0,qd,r,j,0,ys)) < qd) { // Try it out
489
+ y.dlShiftTo(j,t);
490
+ r.subTo(t,r);
491
+ while(r_array[i] < --qd) r.subTo(t,r);
492
+ }
493
+ }
494
+ if(q != null) {
495
+ r.drShiftTo(ys,q);
496
+ if(ts != ms) BigInteger.ZERO.subTo(q,q);
497
+ }
498
+ r.t = ys;
499
+ r.clamp();
500
+ if(nsh > 0) r.rShiftTo(nsh,r); // Denormalize remainder
501
+ if(ts < 0) BigInteger.ZERO.subTo(r,r);
502
+ }
503
+
504
+ // (public) this mod a
505
+ function bnMod(a) {
506
+ var r = nbi();
507
+ this.abs().divRemTo(a,null,r);
508
+ if(this.s < 0 && r.compareTo(BigInteger.ZERO) > 0) a.subTo(r,r);
509
+ return r;
510
+ }
511
+
512
+ // Modular reduction using "classic" algorithm
513
+ function Classic(m) { this.m = m; }
514
+ function cConvert(x) {
515
+ if(x.s < 0 || x.compareTo(this.m) >= 0) return x.mod(this.m);
516
+ else return x;
517
+ }
518
+ function cRevert(x) { return x; }
519
+ function cReduce(x) { x.divRemTo(this.m,null,x); }
520
+ function cMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
521
+ function cSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
522
+
523
+ Classic.prototype.convert = cConvert;
524
+ Classic.prototype.revert = cRevert;
525
+ Classic.prototype.reduce = cReduce;
526
+ Classic.prototype.mulTo = cMulTo;
527
+ Classic.prototype.sqrTo = cSqrTo;
528
+
529
+ // (protected) return "-1/this % 2^DB"; useful for Mont. reduction
530
+ // justification:
531
+ // xy == 1 (mod m)
532
+ // xy = 1+km
533
+ // xy(2-xy) = (1+km)(1-km)
534
+ // x[y(2-xy)] = 1-k^2m^2
535
+ // x[y(2-xy)] == 1 (mod m^2)
536
+ // if y is 1/x mod m, then y(2-xy) is 1/x mod m^2
537
+ // should reduce x and y(2-xy) by m^2 at each step to keep size bounded.
538
+ // JS multiply "overflows" differently from C/C++, so care is needed here.
539
+ function bnpInvDigit() {
540
+ var this_array = this.array;
541
+ if(this.t < 1) return 0;
542
+ var x = this_array[0];
543
+ if((x&1) == 0) return 0;
544
+ var y = x&3; // y == 1/x mod 2^2
545
+ y = (y*(2-(x&0xf)*y))&0xf; // y == 1/x mod 2^4
546
+ y = (y*(2-(x&0xff)*y))&0xff; // y == 1/x mod 2^8
547
+ y = (y*(2-(((x&0xffff)*y)&0xffff)))&0xffff; // y == 1/x mod 2^16
548
+ // last step - calculate inverse mod DV directly;
549
+ // assumes 16 < DB <= 32 and assumes ability to handle 48-bit ints
550
+ y = (y*(2-x*y%BI_DV))%BI_DV; // y == 1/x mod 2^dbits
551
+ // we really want the negative inverse, and -DV < y < DV
552
+ return (y>0)?BI_DV-y:-y;
553
+ }
554
+
555
+ // Montgomery reduction
556
+ function Montgomery(m) {
557
+ this.m = m;
558
+ this.mp = m.invDigit();
559
+ this.mpl = this.mp&0x7fff;
560
+ this.mph = this.mp>>15;
561
+ this.um = (1<<(BI_DB-15))-1;
562
+ this.mt2 = 2*m.t;
563
+ }
564
+
565
+ // xR mod m
566
+ function montConvert(x) {
567
+ var r = nbi();
568
+ x.abs().dlShiftTo(this.m.t,r);
569
+ r.divRemTo(this.m,null,r);
570
+ if(x.s < 0 && r.compareTo(BigInteger.ZERO) > 0) this.m.subTo(r,r);
571
+ return r;
572
+ }
573
+
574
+ // x/R mod m
575
+ function montRevert(x) {
576
+ var r = nbi();
577
+ x.copyTo(r);
578
+ this.reduce(r);
579
+ return r;
580
+ }
581
+
582
+ // x = x/R mod m (HAC 14.32)
583
+ function montReduce(x) {
584
+ var x_array = x.array;
585
+ while(x.t <= this.mt2) // pad x so am has enough room later
586
+ x_array[x.t++] = 0;
587
+ for(var i = 0; i < this.m.t; ++i) {
588
+ // faster way of calculating u0 = x[i]*mp mod DV
589
+ var j = x_array[i]&0x7fff;
590
+ var u0 = (j*this.mpl+(((j*this.mph+(x_array[i]>>15)*this.mpl)&this.um)<<15))&BI_DM;
591
+ // use am to combine the multiply-shift-add into one call
592
+ j = i+this.m.t;
593
+ x_array[j] += this.m.am(0,u0,x,i,0,this.m.t);
594
+ // propagate carry
595
+ while(x_array[j] >= BI_DV) { x_array[j] -= BI_DV; x_array[++j]++; }
596
+ }
597
+ x.clamp();
598
+ x.drShiftTo(this.m.t,x);
599
+ if(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
600
+ }
601
+
602
+ // r = "x^2/R mod m"; x != r
603
+ function montSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
604
+
605
+ // r = "xy/R mod m"; x,y != r
606
+ function montMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
607
+
608
+ Montgomery.prototype.convert = montConvert;
609
+ Montgomery.prototype.revert = montRevert;
610
+ Montgomery.prototype.reduce = montReduce;
611
+ Montgomery.prototype.mulTo = montMulTo;
612
+ Montgomery.prototype.sqrTo = montSqrTo;
613
+
614
+ // (protected) true iff this is even
615
+ function bnpIsEven() {
616
+ var this_array = this.array;
617
+ return ((this.t>0)?(this_array[0]&1):this.s) == 0;
618
+ }
619
+
620
+ // (protected) this^e, e < 2^32, doing sqr and mul with "r" (HAC 14.79)
621
+ function bnpExp(e,z) {
622
+ if(e > 0xffffffff || e < 1) return BigInteger.ONE;
623
+ var r = nbi(), r2 = nbi(), g = z.convert(this), i = nbits(e)-1;
624
+ g.copyTo(r);
625
+ while(--i >= 0) {
626
+ z.sqrTo(r,r2);
627
+ if((e&(1<<i)) > 0) z.mulTo(r2,g,r);
628
+ else { var t = r; r = r2; r2 = t; }
629
+ }
630
+ return z.revert(r);
631
+ }
632
+
633
+ // (public) this^e % m, 0 <= e < 2^32
634
+ function bnModPowInt(e,m) {
635
+ var z;
636
+ if(e < 256 || m.isEven()) z = new Classic(m); else z = new Montgomery(m);
637
+ return this.exp(e,z);
638
+ }
639
+
640
+ // protected
641
+ BigInteger.prototype.copyTo = bnpCopyTo;
642
+ BigInteger.prototype.fromInt = bnpFromInt;
643
+ BigInteger.prototype.fromString = bnpFromString;
644
+ BigInteger.prototype.clamp = bnpClamp;
645
+ BigInteger.prototype.dlShiftTo = bnpDLShiftTo;
646
+ BigInteger.prototype.drShiftTo = bnpDRShiftTo;
647
+ BigInteger.prototype.lShiftTo = bnpLShiftTo;
648
+ BigInteger.prototype.rShiftTo = bnpRShiftTo;
649
+ BigInteger.prototype.subTo = bnpSubTo;
650
+ BigInteger.prototype.multiplyTo = bnpMultiplyTo;
651
+ BigInteger.prototype.squareTo = bnpSquareTo;
652
+ BigInteger.prototype.divRemTo = bnpDivRemTo;
653
+ BigInteger.prototype.invDigit = bnpInvDigit;
654
+ BigInteger.prototype.isEven = bnpIsEven;
655
+ BigInteger.prototype.exp = bnpExp;
656
+
657
+ // public
658
+ BigInteger.prototype.toString = bnToString;
659
+ BigInteger.prototype.negate = bnNegate;
660
+ BigInteger.prototype.abs = bnAbs;
661
+ BigInteger.prototype.compareTo = bnCompareTo;
662
+ BigInteger.prototype.bitLength = bnBitLength;
663
+ BigInteger.prototype.mod = bnMod;
664
+ BigInteger.prototype.modPowInt = bnModPowInt;
665
+
666
+ // "constants"
667
+ BigInteger.ZERO = nbv(0);
668
+ BigInteger.ONE = nbv(1);
669
+ // Copyright (c) 2005 Tom Wu
670
+ // All Rights Reserved.
671
+ // See "LICENSE" for details.
672
+
673
+ // Extended JavaScript BN functions, required for RSA private ops.
674
+
675
+ // (public)
676
+ function bnClone() { var r = nbi(); this.copyTo(r); return r; }
677
+
678
+ // (public) return value as integer
679
+ function bnIntValue() {
680
+ var this_array = this.array;
681
+ if(this.s < 0) {
682
+ if(this.t == 1) return this_array[0]-BI_DV;
683
+ else if(this.t == 0) return -1;
684
+ }
685
+ else if(this.t == 1) return this_array[0];
686
+ else if(this.t == 0) return 0;
687
+ // assumes 16 < DB < 32
688
+ return ((this_array[1]&((1<<(32-BI_DB))-1))<<BI_DB)|this_array[0];
689
+ }
690
+
691
+ // (public) return value as byte
692
+ function bnByteValue() {
693
+ var this_array = this.array;
694
+ return (this.t==0)?this.s:(this_array[0]<<24)>>24;
695
+ }
696
+
697
+ // (public) return value as short (assumes DB>=16)
698
+ function bnShortValue() {
699
+ var this_array = this.array;
700
+ return (this.t==0)?this.s:(this_array[0]<<16)>>16;
701
+ }
702
+
703
+ // (protected) return x s.t. r^x < DV
704
+ function bnpChunkSize(r) { return Math.floor(Math.LN2*BI_DB/Math.log(r)); }
705
+
706
+ // (public) 0 if this == 0, 1 if this > 0
707
+ function bnSigNum() {
708
+ var this_array = this.array;
709
+ if(this.s < 0) return -1;
710
+ else if(this.t <= 0 || (this.t == 1 && this_array[0] <= 0)) return 0;
711
+ else return 1;
712
+ }
713
+
714
+ // (protected) convert to radix string
715
+ function bnpToRadix(b) {
716
+ if(b == null) b = 10;
717
+ if(this.signum() == 0 || b < 2 || b > 36) return "0";
718
+ var cs = this.chunkSize(b);
719
+ var a = Math.pow(b,cs);
720
+ var d = nbv(a), y = nbi(), z = nbi(), r = "";
721
+ this.divRemTo(d,y,z);
722
+ while(y.signum() > 0) {
723
+ r = (a+z.intValue()).toString(b).substr(1) + r;
724
+ y.divRemTo(d,y,z);
725
+ }
726
+ return z.intValue().toString(b) + r;
727
+ }
728
+
729
+ // (protected) convert from radix string
730
+ function bnpFromRadix(s,b) {
731
+ this.fromInt(0);
732
+ if(b == null) b = 10;
733
+ var cs = this.chunkSize(b);
734
+ var d = Math.pow(b,cs), mi = false, j = 0, w = 0;
735
+ for(var i = 0; i < s.length; ++i) {
736
+ var x = intAt(s,i);
737
+ if(x < 0) {
738
+ if(s.charAt(i) == "-" && this.signum() == 0) mi = true;
739
+ continue;
740
+ }
741
+ w = b*w+x;
742
+ if(++j >= cs) {
743
+ this.dMultiply(d);
744
+ this.dAddOffset(w,0);
745
+ j = 0;
746
+ w = 0;
747
+ }
748
+ }
749
+ if(j > 0) {
750
+ this.dMultiply(Math.pow(b,j));
751
+ this.dAddOffset(w,0);
752
+ }
753
+ if(mi) BigInteger.ZERO.subTo(this,this);
754
+ }
755
+
756
+ // (protected) alternate constructor
757
+ function bnpFromNumber(a,b,c) {
758
+ if("number" == typeof b) {
759
+ // new BigInteger(int,int,RNG)
760
+ if(a < 2) this.fromInt(1);
761
+ else {
762
+ this.fromNumber(a,c);
763
+ if(!this.testBit(a-1)) // force MSB set
764
+ this.bitwiseTo(BigInteger.ONE.shiftLeft(a-1),op_or,this);
765
+ if(this.isEven()) this.dAddOffset(1,0); // force odd
766
+ while(!this.isProbablePrime(b)) {
767
+ this.dAddOffset(2,0);
768
+ if(this.bitLength() > a) this.subTo(BigInteger.ONE.shiftLeft(a-1),this);
769
+ }
770
+ }
771
+ }
772
+ else {
773
+ // new BigInteger(int,RNG)
774
+ var x = new Array(), t = a&7;
775
+ x.length = (a>>3)+1;
776
+ b.nextBytes(x);
777
+ if(t > 0) x[0] &= ((1<<t)-1); else x[0] = 0;
778
+ this.fromString(x,256);
779
+ }
780
+ }
781
+
782
+ // (public) convert to bigendian byte array
783
+ function bnToByteArray() {
784
+ var this_array = this.array;
785
+ var i = this.t, r = new Array();
786
+ r[0] = this.s;
787
+ var p = BI_DB-(i*BI_DB)%8, d, k = 0;
788
+ if(i-- > 0) {
789
+ if(p < BI_DB && (d = this_array[i]>>p) != (this.s&BI_DM)>>p)
790
+ r[k++] = d|(this.s<<(BI_DB-p));
791
+ while(i >= 0) {
792
+ if(p < 8) {
793
+ d = (this_array[i]&((1<<p)-1))<<(8-p);
794
+ d |= this_array[--i]>>(p+=BI_DB-8);
795
+ }
796
+ else {
797
+ d = (this_array[i]>>(p-=8))&0xff;
798
+ if(p <= 0) { p += BI_DB; --i; }
799
+ }
800
+ if((d&0x80) != 0) d |= -256;
801
+ if(k == 0 && (this.s&0x80) != (d&0x80)) ++k;
802
+ if(k > 0 || d != this.s) r[k++] = d;
803
+ }
804
+ }
805
+ return r;
806
+ }
807
+
808
+ function bnEquals(a) { return(this.compareTo(a)==0); }
809
+ function bnMin(a) { return(this.compareTo(a)<0)?this:a; }
810
+ function bnMax(a) { return(this.compareTo(a)>0)?this:a; }
811
+
812
+ // (protected) r = this op a (bitwise)
813
+ function bnpBitwiseTo(a,op,r) {
814
+ var this_array = this.array;
815
+ var a_array = a.array;
816
+ var r_array = r.array;
817
+ var i, f, m = Math.min(a.t,this.t);
818
+ for(i = 0; i < m; ++i) r_array[i] = op(this_array[i],a_array[i]);
819
+ if(a.t < this.t) {
820
+ f = a.s&BI_DM;
821
+ for(i = m; i < this.t; ++i) r_array[i] = op(this_array[i],f);
822
+ r.t = this.t;
823
+ }
824
+ else {
825
+ f = this.s&BI_DM;
826
+ for(i = m; i < a.t; ++i) r_array[i] = op(f,a_array[i]);
827
+ r.t = a.t;
828
+ }
829
+ r.s = op(this.s,a.s);
830
+ r.clamp();
831
+ }
832
+
833
+ // (public) this & a
834
+ function op_and(x,y) { return x&y; }
835
+ function bnAnd(a) { var r = nbi(); this.bitwiseTo(a,op_and,r); return r; }
836
+
837
+ // (public) this | a
838
+ function op_or(x,y) { return x|y; }
839
+ function bnOr(a) { var r = nbi(); this.bitwiseTo(a,op_or,r); return r; }
840
+
841
+ // (public) this ^ a
842
+ function op_xor(x,y) { return x^y; }
843
+ function bnXor(a) { var r = nbi(); this.bitwiseTo(a,op_xor,r); return r; }
844
+
845
+ // (public) this & ~a
846
+ function op_andnot(x,y) { return x&~y; }
847
+ function bnAndNot(a) { var r = nbi(); this.bitwiseTo(a,op_andnot,r); return r; }
848
+
849
+ // (public) ~this
850
+ function bnNot() {
851
+ var this_array = this.array;
852
+ var r = nbi();
853
+ var r_array = r.array;
854
+
855
+ for(var i = 0; i < this.t; ++i) r_array[i] = BI_DM&~this_array[i];
856
+ r.t = this.t;
857
+ r.s = ~this.s;
858
+ return r;
859
+ }
860
+
861
+ // (public) this << n
862
+ function bnShiftLeft(n) {
863
+ var r = nbi();
864
+ if(n < 0) this.rShiftTo(-n,r); else this.lShiftTo(n,r);
865
+ return r;
866
+ }
867
+
868
+ // (public) this >> n
869
+ function bnShiftRight(n) {
870
+ var r = nbi();
871
+ if(n < 0) this.lShiftTo(-n,r); else this.rShiftTo(n,r);
872
+ return r;
873
+ }
874
+
875
+ // return index of lowest 1-bit in x, x < 2^31
876
+ function lbit(x) {
877
+ if(x == 0) return -1;
878
+ var r = 0;
879
+ if((x&0xffff) == 0) { x >>= 16; r += 16; }
880
+ if((x&0xff) == 0) { x >>= 8; r += 8; }
881
+ if((x&0xf) == 0) { x >>= 4; r += 4; }
882
+ if((x&3) == 0) { x >>= 2; r += 2; }
883
+ if((x&1) == 0) ++r;
884
+ return r;
885
+ }
886
+
887
+ // (public) returns index of lowest 1-bit (or -1 if none)
888
+ function bnGetLowestSetBit() {
889
+ var this_array = this.array;
890
+ for(var i = 0; i < this.t; ++i)
891
+ if(this_array[i] != 0) return i*BI_DB+lbit(this_array[i]);
892
+ if(this.s < 0) return this.t*BI_DB;
893
+ return -1;
894
+ }
895
+
896
+ // return number of 1 bits in x
897
+ function cbit(x) {
898
+ var r = 0;
899
+ while(x != 0) { x &= x-1; ++r; }
900
+ return r;
901
+ }
902
+
903
+ // (public) return number of set bits
904
+ function bnBitCount() {
905
+ var r = 0, x = this.s&BI_DM;
906
+ for(var i = 0; i < this.t; ++i) r += cbit(this_array[i]^x);
907
+ return r;
908
+ }
909
+
910
+ // (public) true iff nth bit is set
911
+ function bnTestBit(n) {
912
+ var this_array = this.array;
913
+ var j = Math.floor(n/BI_DB);
914
+ if(j >= this.t) return(this.s!=0);
915
+ return((this_array[j]&(1<<(n%BI_DB)))!=0);
916
+ }
917
+
918
+ // (protected) this op (1<<n)
919
+ function bnpChangeBit(n,op) {
920
+ var r = BigInteger.ONE.shiftLeft(n);
921
+ this.bitwiseTo(r,op,r);
922
+ return r;
923
+ }
924
+
925
+ // (public) this | (1<<n)
926
+ function bnSetBit(n) { return this.changeBit(n,op_or); }
927
+
928
+ // (public) this & ~(1<<n)
929
+ function bnClearBit(n) { return this.changeBit(n,op_andnot); }
930
+
931
+ // (public) this ^ (1<<n)
932
+ function bnFlipBit(n) { return this.changeBit(n,op_xor); }
933
+
934
+ // (protected) r = this + a
935
+ function bnpAddTo(a,r) {
936
+ var this_array = this.array;
937
+ var a_array = a.array;
938
+ var r_array = r.array;
939
+ var i = 0, c = 0, m = Math.min(a.t,this.t);
940
+ while(i < m) {
941
+ c += this_array[i]+a_array[i];
942
+ r_array[i++] = c&BI_DM;
943
+ c >>= BI_DB;
944
+ }
945
+ if(a.t < this.t) {
946
+ c += a.s;
947
+ while(i < this.t) {
948
+ c += this_array[i];
949
+ r_array[i++] = c&BI_DM;
950
+ c >>= BI_DB;
951
+ }
952
+ c += this.s;
953
+ }
954
+ else {
955
+ c += this.s;
956
+ while(i < a.t) {
957
+ c += a_array[i];
958
+ r_array[i++] = c&BI_DM;
959
+ c >>= BI_DB;
960
+ }
961
+ c += a.s;
962
+ }
963
+ r.s = (c<0)?-1:0;
964
+ if(c > 0) r_array[i++] = c;
965
+ else if(c < -1) r_array[i++] = BI_DV+c;
966
+ r.t = i;
967
+ r.clamp();
968
+ }
969
+
970
+ // (public) this + a
971
+ function bnAdd(a) { var r = nbi(); this.addTo(a,r); return r; }
972
+
973
+ // (public) this - a
974
+ function bnSubtract(a) { var r = nbi(); this.subTo(a,r); return r; }
975
+
976
+ // (public) this * a
977
+ function bnMultiply(a) { var r = nbi(); this.multiplyTo(a,r); return r; }
978
+
979
+ // (public) this / a
980
+ function bnDivide(a) { var r = nbi(); this.divRemTo(a,r,null); return r; }
981
+
982
+ // (public) this % a
983
+ function bnRemainder(a) { var r = nbi(); this.divRemTo(a,null,r); return r; }
984
+
985
+ // (public) [this/a,this%a]
986
+ function bnDivideAndRemainder(a) {
987
+ var q = nbi(), r = nbi();
988
+ this.divRemTo(a,q,r);
989
+ return new Array(q,r);
990
+ }
991
+
992
+ // (protected) this *= n, this >= 0, 1 < n < DV
993
+ function bnpDMultiply(n) {
994
+ var this_array = this.array;
995
+ this_array[this.t] = this.am(0,n-1,this,0,0,this.t);
996
+ ++this.t;
997
+ this.clamp();
998
+ }
999
+
1000
+ // (protected) this += n << w words, this >= 0
1001
+ function bnpDAddOffset(n,w) {
1002
+ var this_array = this.array;
1003
+ while(this.t <= w) this_array[this.t++] = 0;
1004
+ this_array[w] += n;
1005
+ while(this_array[w] >= BI_DV) {
1006
+ this_array[w] -= BI_DV;
1007
+ if(++w >= this.t) this_array[this.t++] = 0;
1008
+ ++this_array[w];
1009
+ }
1010
+ }
1011
+
1012
+ // A "null" reducer
1013
+ function NullExp() {}
1014
+ function nNop(x) { return x; }
1015
+ function nMulTo(x,y,r) { x.multiplyTo(y,r); }
1016
+ function nSqrTo(x,r) { x.squareTo(r); }
1017
+
1018
+ NullExp.prototype.convert = nNop;
1019
+ NullExp.prototype.revert = nNop;
1020
+ NullExp.prototype.mulTo = nMulTo;
1021
+ NullExp.prototype.sqrTo = nSqrTo;
1022
+
1023
+ // (public) this^e
1024
+ function bnPow(e) { return this.exp(e,new NullExp()); }
1025
+
1026
+ // (protected) r = lower n words of "this * a", a.t <= n
1027
+ // "this" should be the larger one if appropriate.
1028
+ function bnpMultiplyLowerTo(a,n,r) {
1029
+ var r_array = r.array;
1030
+ var a_array = a.array;
1031
+ var i = Math.min(this.t+a.t,n);
1032
+ r.s = 0; // assumes a,this >= 0
1033
+ r.t = i;
1034
+ while(i > 0) r_array[--i] = 0;
1035
+ var j;
1036
+ for(j = r.t-this.t; i < j; ++i) r_array[i+this.t] = this.am(0,a_array[i],r,i,0,this.t);
1037
+ for(j = Math.min(a.t,n); i < j; ++i) this.am(0,a_array[i],r,i,0,n-i);
1038
+ r.clamp();
1039
+ }
1040
+
1041
+ // (protected) r = "this * a" without lower n words, n > 0
1042
+ // "this" should be the larger one if appropriate.
1043
+ function bnpMultiplyUpperTo(a,n,r) {
1044
+ var r_array = r.array;
1045
+ var a_array = a.array;
1046
+ --n;
1047
+ var i = r.t = this.t+a.t-n;
1048
+ r.s = 0; // assumes a,this >= 0
1049
+ while(--i >= 0) r_array[i] = 0;
1050
+ for(i = Math.max(n-this.t,0); i < a.t; ++i)
1051
+ r_array[this.t+i-n] = this.am(n-i,a_array[i],r,0,0,this.t+i-n);
1052
+ r.clamp();
1053
+ r.drShiftTo(1,r);
1054
+ }
1055
+
1056
+ // Barrett modular reduction
1057
+ function Barrett(m) {
1058
+ // setup Barrett
1059
+ this.r2 = nbi();
1060
+ this.q3 = nbi();
1061
+ BigInteger.ONE.dlShiftTo(2*m.t,this.r2);
1062
+ this.mu = this.r2.divide(m);
1063
+ this.m = m;
1064
+ }
1065
+
1066
+ function barrettConvert(x) {
1067
+ if(x.s < 0 || x.t > 2*this.m.t) return x.mod(this.m);
1068
+ else if(x.compareTo(this.m) < 0) return x;
1069
+ else { var r = nbi(); x.copyTo(r); this.reduce(r); return r; }
1070
+ }
1071
+
1072
+ function barrettRevert(x) { return x; }
1073
+
1074
+ // x = x mod m (HAC 14.42)
1075
+ function barrettReduce(x) {
1076
+ x.drShiftTo(this.m.t-1,this.r2);
1077
+ if(x.t > this.m.t+1) { x.t = this.m.t+1; x.clamp(); }
1078
+ this.mu.multiplyUpperTo(this.r2,this.m.t+1,this.q3);
1079
+ this.m.multiplyLowerTo(this.q3,this.m.t+1,this.r2);
1080
+ while(x.compareTo(this.r2) < 0) x.dAddOffset(1,this.m.t+1);
1081
+ x.subTo(this.r2,x);
1082
+ while(x.compareTo(this.m) >= 0) x.subTo(this.m,x);
1083
+ }
1084
+
1085
+ // r = x^2 mod m; x != r
1086
+ function barrettSqrTo(x,r) { x.squareTo(r); this.reduce(r); }
1087
+
1088
+ // r = x*y mod m; x,y != r
1089
+ function barrettMulTo(x,y,r) { x.multiplyTo(y,r); this.reduce(r); }
1090
+
1091
+ Barrett.prototype.convert = barrettConvert;
1092
+ Barrett.prototype.revert = barrettRevert;
1093
+ Barrett.prototype.reduce = barrettReduce;
1094
+ Barrett.prototype.mulTo = barrettMulTo;
1095
+ Barrett.prototype.sqrTo = barrettSqrTo;
1096
+
1097
+ // (public) this^e % m (HAC 14.85)
1098
+ function bnModPow(e,m) {
1099
+ var e_array = e.array;
1100
+ var i = e.bitLength(), k, r = nbv(1), z;
1101
+ if(i <= 0) return r;
1102
+ else if(i < 18) k = 1;
1103
+ else if(i < 48) k = 3;
1104
+ else if(i < 144) k = 4;
1105
+ else if(i < 768) k = 5;
1106
+ else k = 6;
1107
+ if(i < 8)
1108
+ z = new Classic(m);
1109
+ else if(m.isEven())
1110
+ z = new Barrett(m);
1111
+ else
1112
+ z = new Montgomery(m);
1113
+
1114
+ // precomputation
1115
+ var g = new Array(), n = 3, k1 = k-1, km = (1<<k)-1;
1116
+ g[1] = z.convert(this);
1117
+ if(k > 1) {
1118
+ var g2 = nbi();
1119
+ z.sqrTo(g[1],g2);
1120
+ while(n <= km) {
1121
+ g[n] = nbi();
1122
+ z.mulTo(g2,g[n-2],g[n]);
1123
+ n += 2;
1124
+ }
1125
+ }
1126
+
1127
+ var j = e.t-1, w, is1 = true, r2 = nbi(), t;
1128
+ i = nbits(e_array[j])-1;
1129
+ while(j >= 0) {
1130
+ if(i >= k1) w = (e_array[j]>>(i-k1))&km;
1131
+ else {
1132
+ w = (e_array[j]&((1<<(i+1))-1))<<(k1-i);
1133
+ if(j > 0) w |= e_array[j-1]>>(BI_DB+i-k1);
1134
+ }
1135
+
1136
+ n = k;
1137
+ while((w&1) == 0) { w >>= 1; --n; }
1138
+ if((i -= n) < 0) { i += BI_DB; --j; }
1139
+ if(is1) { // ret == 1, don't bother squaring or multiplying it
1140
+ g[w].copyTo(r);
1141
+ is1 = false;
1142
+ }
1143
+ else {
1144
+ while(n > 1) { z.sqrTo(r,r2); z.sqrTo(r2,r); n -= 2; }
1145
+ if(n > 0) z.sqrTo(r,r2); else { t = r; r = r2; r2 = t; }
1146
+ z.mulTo(r2,g[w],r);
1147
+ }
1148
+
1149
+ while(j >= 0 && (e_array[j]&(1<<i)) == 0) {
1150
+ z.sqrTo(r,r2); t = r; r = r2; r2 = t;
1151
+ if(--i < 0) { i = BI_DB-1; --j; }
1152
+ }
1153
+ }
1154
+ return z.revert(r);
1155
+ }
1156
+
1157
+ // (public) gcd(this,a) (HAC 14.54)
1158
+ function bnGCD(a) {
1159
+ var x = (this.s<0)?this.negate():this.clone();
1160
+ var y = (a.s<0)?a.negate():a.clone();
1161
+ if(x.compareTo(y) < 0) { var t = x; x = y; y = t; }
1162
+ var i = x.getLowestSetBit(), g = y.getLowestSetBit();
1163
+ if(g < 0) return x;
1164
+ if(i < g) g = i;
1165
+ if(g > 0) {
1166
+ x.rShiftTo(g,x);
1167
+ y.rShiftTo(g,y);
1168
+ }
1169
+ while(x.signum() > 0) {
1170
+ if((i = x.getLowestSetBit()) > 0) x.rShiftTo(i,x);
1171
+ if((i = y.getLowestSetBit()) > 0) y.rShiftTo(i,y);
1172
+ if(x.compareTo(y) >= 0) {
1173
+ x.subTo(y,x);
1174
+ x.rShiftTo(1,x);
1175
+ }
1176
+ else {
1177
+ y.subTo(x,y);
1178
+ y.rShiftTo(1,y);
1179
+ }
1180
+ }
1181
+ if(g > 0) y.lShiftTo(g,y);
1182
+ return y;
1183
+ }
1184
+
1185
+ // (protected) this % n, n < 2^26
1186
+ function bnpModInt(n) {
1187
+ var this_array = this.array;
1188
+ if(n <= 0) return 0;
1189
+ var d = BI_DV%n, r = (this.s<0)?n-1:0;
1190
+ if(this.t > 0)
1191
+ if(d == 0) r = this_array[0]%n;
1192
+ else for(var i = this.t-1; i >= 0; --i) r = (d*r+this_array[i])%n;
1193
+ return r;
1194
+ }
1195
+
1196
+ // (public) 1/this % m (HAC 14.61)
1197
+ function bnModInverse(m) {
1198
+ var ac = m.isEven();
1199
+ if((this.isEven() && ac) || m.signum() == 0) return BigInteger.ZERO;
1200
+ var u = m.clone(), v = this.clone();
1201
+ var a = nbv(1), b = nbv(0), c = nbv(0), d = nbv(1);
1202
+ while(u.signum() != 0) {
1203
+ while(u.isEven()) {
1204
+ u.rShiftTo(1,u);
1205
+ if(ac) {
1206
+ if(!a.isEven() || !b.isEven()) { a.addTo(this,a); b.subTo(m,b); }
1207
+ a.rShiftTo(1,a);
1208
+ }
1209
+ else if(!b.isEven()) b.subTo(m,b);
1210
+ b.rShiftTo(1,b);
1211
+ }
1212
+ while(v.isEven()) {
1213
+ v.rShiftTo(1,v);
1214
+ if(ac) {
1215
+ if(!c.isEven() || !d.isEven()) { c.addTo(this,c); d.subTo(m,d); }
1216
+ c.rShiftTo(1,c);
1217
+ }
1218
+ else if(!d.isEven()) d.subTo(m,d);
1219
+ d.rShiftTo(1,d);
1220
+ }
1221
+ if(u.compareTo(v) >= 0) {
1222
+ u.subTo(v,u);
1223
+ if(ac) a.subTo(c,a);
1224
+ b.subTo(d,b);
1225
+ }
1226
+ else {
1227
+ v.subTo(u,v);
1228
+ if(ac) c.subTo(a,c);
1229
+ d.subTo(b,d);
1230
+ }
1231
+ }
1232
+ if(v.compareTo(BigInteger.ONE) != 0) return BigInteger.ZERO;
1233
+ if(d.compareTo(m) >= 0) return d.subtract(m);
1234
+ if(d.signum() < 0) d.addTo(m,d); else return d;
1235
+ if(d.signum() < 0) return d.add(m); else return d;
1236
+ }
1237
+
1238
+ 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];
1239
+ var lplim = (1<<26)/lowprimes[lowprimes.length-1];
1240
+
1241
+ // (public) test primality with certainty >= 1-.5^t
1242
+ function bnIsProbablePrime(t) {
1243
+ var i, x = this.abs();
1244
+ var x_array = x.array;
1245
+ if(x.t == 1 && x_array[0] <= lowprimes[lowprimes.length-1]) {
1246
+ for(i = 0; i < lowprimes.length; ++i)
1247
+ if(x_array[0] == lowprimes[i]) return true;
1248
+ return false;
1249
+ }
1250
+ if(x.isEven()) return false;
1251
+ i = 1;
1252
+ while(i < lowprimes.length) {
1253
+ var m = lowprimes[i], j = i+1;
1254
+ while(j < lowprimes.length && m < lplim) m *= lowprimes[j++];
1255
+ m = x.modInt(m);
1256
+ while(i < j) if(m%lowprimes[i++] == 0) return false;
1257
+ }
1258
+ return x.millerRabin(t);
1259
+ }
1260
+
1261
+ // (protected) true if probably prime (HAC 4.24, Miller-Rabin)
1262
+ function bnpMillerRabin(t) {
1263
+ var n1 = this.subtract(BigInteger.ONE);
1264
+ var k = n1.getLowestSetBit();
1265
+ if(k <= 0) return false;
1266
+ var r = n1.shiftRight(k);
1267
+ t = (t+1)>>1;
1268
+ if(t > lowprimes.length) t = lowprimes.length;
1269
+ var a = nbi();
1270
+ for(var i = 0; i < t; ++i) {
1271
+ a.fromInt(lowprimes[i]);
1272
+ var y = a.modPow(r,this);
1273
+ if(y.compareTo(BigInteger.ONE) != 0 && y.compareTo(n1) != 0) {
1274
+ var j = 1;
1275
+ while(j++ < k && y.compareTo(n1) != 0) {
1276
+ y = y.modPowInt(2,this);
1277
+ if(y.compareTo(BigInteger.ONE) == 0) return false;
1278
+ }
1279
+ if(y.compareTo(n1) != 0) return false;
1280
+ }
1281
+ }
1282
+ return true;
1283
+ }
1284
+
1285
+ // protected
1286
+ BigInteger.prototype.chunkSize = bnpChunkSize;
1287
+ BigInteger.prototype.toRadix = bnpToRadix;
1288
+ BigInteger.prototype.fromRadix = bnpFromRadix;
1289
+ BigInteger.prototype.fromNumber = bnpFromNumber;
1290
+ BigInteger.prototype.bitwiseTo = bnpBitwiseTo;
1291
+ BigInteger.prototype.changeBit = bnpChangeBit;
1292
+ BigInteger.prototype.addTo = bnpAddTo;
1293
+ BigInteger.prototype.dMultiply = bnpDMultiply;
1294
+ BigInteger.prototype.dAddOffset = bnpDAddOffset;
1295
+ BigInteger.prototype.multiplyLowerTo = bnpMultiplyLowerTo;
1296
+ BigInteger.prototype.multiplyUpperTo = bnpMultiplyUpperTo;
1297
+ BigInteger.prototype.modInt = bnpModInt;
1298
+ BigInteger.prototype.millerRabin = bnpMillerRabin;
1299
+
1300
+ // public
1301
+ BigInteger.prototype.clone = bnClone;
1302
+ BigInteger.prototype.intValue = bnIntValue;
1303
+ BigInteger.prototype.byteValue = bnByteValue;
1304
+ BigInteger.prototype.shortValue = bnShortValue;
1305
+ BigInteger.prototype.signum = bnSigNum;
1306
+ BigInteger.prototype.toByteArray = bnToByteArray;
1307
+ BigInteger.prototype.equals = bnEquals;
1308
+ BigInteger.prototype.min = bnMin;
1309
+ BigInteger.prototype.max = bnMax;
1310
+ BigInteger.prototype.and = bnAnd;
1311
+ BigInteger.prototype.or = bnOr;
1312
+ BigInteger.prototype.xor = bnXor;
1313
+ BigInteger.prototype.andNot = bnAndNot;
1314
+ BigInteger.prototype.not = bnNot;
1315
+ BigInteger.prototype.shiftLeft = bnShiftLeft;
1316
+ BigInteger.prototype.shiftRight = bnShiftRight;
1317
+ BigInteger.prototype.getLowestSetBit = bnGetLowestSetBit;
1318
+ BigInteger.prototype.bitCount = bnBitCount;
1319
+ BigInteger.prototype.testBit = bnTestBit;
1320
+ BigInteger.prototype.setBit = bnSetBit;
1321
+ BigInteger.prototype.clearBit = bnClearBit;
1322
+ BigInteger.prototype.flipBit = bnFlipBit;
1323
+ BigInteger.prototype.add = bnAdd;
1324
+ BigInteger.prototype.subtract = bnSubtract;
1325
+ BigInteger.prototype.multiply = bnMultiply;
1326
+ BigInteger.prototype.divide = bnDivide;
1327
+ BigInteger.prototype.remainder = bnRemainder;
1328
+ BigInteger.prototype.divideAndRemainder = bnDivideAndRemainder;
1329
+ BigInteger.prototype.modPow = bnModPow;
1330
+ BigInteger.prototype.modInverse = bnModInverse;
1331
+ BigInteger.prototype.pow = bnPow;
1332
+ BigInteger.prototype.gcd = bnGCD;
1333
+ BigInteger.prototype.isProbablePrime = bnIsProbablePrime;
1334
+
1335
+ // BigInteger interfaces not implemented in jsbn:
1336
+
1337
+ // BigInteger(int signum, byte[] magnitude)
1338
+ // double doubleValue()
1339
+ // float floatValue()
1340
+ // int hashCode()
1341
+ // long longValue()
1342
+ // static BigInteger valueOf(long val)
1343
+ // prng4.js - uses Arcfour as a PRNG
1344
+
1345
+ function Arcfour() {
1346
+ this.i = 0;
1347
+ this.j = 0;
1348
+ this.S = new Array();
1349
+ }
1350
+
1351
+ // Initialize arcfour context from key, an array of ints, each from [0..255]
1352
+ function ARC4init(key) {
1353
+ var i, j, t;
1354
+ for(i = 0; i < 256; ++i)
1355
+ this.S[i] = i;
1356
+ j = 0;
1357
+ for(i = 0; i < 256; ++i) {
1358
+ j = (j + this.S[i] + key[i % key.length]) & 255;
1359
+ t = this.S[i];
1360
+ this.S[i] = this.S[j];
1361
+ this.S[j] = t;
1362
+ }
1363
+ this.i = 0;
1364
+ this.j = 0;
1365
+ }
1366
+
1367
+ function ARC4next() {
1368
+ var t;
1369
+ this.i = (this.i + 1) & 255;
1370
+ this.j = (this.j + this.S[this.i]) & 255;
1371
+ t = this.S[this.i];
1372
+ this.S[this.i] = this.S[this.j];
1373
+ this.S[this.j] = t;
1374
+ return this.S[(t + this.S[this.i]) & 255];
1375
+ }
1376
+
1377
+ Arcfour.prototype.init = ARC4init;
1378
+ Arcfour.prototype.next = ARC4next;
1379
+
1380
+ // Plug in your RNG constructor here
1381
+ function prng_newstate() {
1382
+ return new Arcfour();
1383
+ }
1384
+
1385
+ // Pool size must be a multiple of 4 and greater than 32.
1386
+ // An array of bytes the size of the pool will be passed to init()
1387
+ var rng_psize = 256;
1388
+ // Random number generator - requires a PRNG backend, e.g. prng4.js
1389
+
1390
+ // For best results, put code like
1391
+ // <body onClick='rng_seed_time();' onKeyPress='rng_seed_time();'>
1392
+ // in your main HTML document.
1393
+
1394
+ var rng_state;
1395
+ var rng_pool;
1396
+ var rng_pptr;
1397
+
1398
+ // Mix in a 32-bit integer into the pool
1399
+ function rng_seed_int(x) {
1400
+ rng_pool[rng_pptr++] ^= x & 255;
1401
+ rng_pool[rng_pptr++] ^= (x >> 8) & 255;
1402
+ rng_pool[rng_pptr++] ^= (x >> 16) & 255;
1403
+ rng_pool[rng_pptr++] ^= (x >> 24) & 255;
1404
+ if(rng_pptr >= rng_psize) rng_pptr -= rng_psize;
1405
+ }
1406
+
1407
+ // Mix in the current time (w/milliseconds) into the pool
1408
+ function rng_seed_time() {
1409
+ rng_seed_int(new Date().getTime());
1410
+ }
1411
+
1412
+ // Initialize the pool with junk if needed.
1413
+ if(rng_pool == null) {
1414
+ rng_pool = new Array();
1415
+ rng_pptr = 0;
1416
+ var t;
1417
+ while(rng_pptr < rng_psize) { // extract some randomness from Math.random()
1418
+ t = Math.floor(65536 * Math.random());
1419
+ rng_pool[rng_pptr++] = t >>> 8;
1420
+ rng_pool[rng_pptr++] = t & 255;
1421
+ }
1422
+ rng_pptr = 0;
1423
+ rng_seed_time();
1424
+ //rng_seed_int(window.screenX);
1425
+ //rng_seed_int(window.screenY);
1426
+ }
1427
+
1428
+ function rng_get_byte() {
1429
+ if(rng_state == null) {
1430
+ rng_seed_time();
1431
+ rng_state = prng_newstate();
1432
+ rng_state.init(rng_pool);
1433
+ for(rng_pptr = 0; rng_pptr < rng_pool.length; ++rng_pptr)
1434
+ rng_pool[rng_pptr] = 0;
1435
+ rng_pptr = 0;
1436
+ //rng_pool = null;
1437
+ }
1438
+ // TODO: allow reseeding after first request
1439
+ return rng_state.next();
1440
+ }
1441
+
1442
+ function rng_get_bytes(ba) {
1443
+ var i;
1444
+ for(i = 0; i < ba.length; ++i) ba[i] = rng_get_byte();
1445
+ }
1446
+
1447
+ function SecureRandom() {}
1448
+
1449
+ SecureRandom.prototype.nextBytes = rng_get_bytes;
1450
+ // Depends on jsbn.js and rng.js
1451
+
1452
+ // convert a (hex) string to a bignum object
1453
+ function parseBigInt(str,r) {
1454
+ return new BigInteger(str,r);
1455
+ }
1456
+
1457
+ function linebrk(s,n) {
1458
+ var ret = "";
1459
+ var i = 0;
1460
+ while(i + n < s.length) {
1461
+ ret += s.substring(i,i+n) + "\n";
1462
+ i += n;
1463
+ }
1464
+ return ret + s.substring(i,s.length);
1465
+ }
1466
+
1467
+ function byte2Hex(b) {
1468
+ if(b < 0x10)
1469
+ return "0" + b.toString(16);
1470
+ else
1471
+ return b.toString(16);
1472
+ }
1473
+
1474
+ // PKCS#1 (type 2, random) pad input string s to n bytes, and return a bigint
1475
+ function pkcs1pad2(s,n) {
1476
+ if(n < s.length + 11) {
1477
+ alert("Message too long for RSA");
1478
+ return null;
1479
+ }
1480
+ var ba = new Array();
1481
+ var i = s.length - 1;
1482
+ while(i >= 0 && n > 0) ba[--n] = s.charCodeAt(i--);
1483
+ ba[--n] = 0;
1484
+ var rng = new SecureRandom();
1485
+ var x = new Array();
1486
+ while(n > 2) { // random non-zero pad
1487
+ x[0] = 0;
1488
+ while(x[0] == 0) rng.nextBytes(x);
1489
+ ba[--n] = x[0];
1490
+ }
1491
+ ba[--n] = 2;
1492
+ ba[--n] = 0;
1493
+ return new BigInteger(ba);
1494
+ }
1495
+
1496
+ // "empty" RSA key constructor
1497
+ function RSAKey() {
1498
+ this.n = null;
1499
+ this.e = 0;
1500
+ this.d = null;
1501
+ this.p = null;
1502
+ this.q = null;
1503
+ this.dmp1 = null;
1504
+ this.dmq1 = null;
1505
+ this.coeff = null;
1506
+ }
1507
+
1508
+ // Set the public key fields N and e from hex strings
1509
+ function RSASetPublic(N,E) {
1510
+ if(N != null && E != null && N.length > 0 && E.length > 0) {
1511
+ this.n = parseBigInt(N,16);
1512
+ this.e = parseInt(E,16);
1513
+ }
1514
+ else
1515
+ alert("Invalid RSA public key");
1516
+ }
1517
+
1518
+ // Perform raw public operation on "x": return x^e (mod n)
1519
+ function RSADoPublic(x) {
1520
+ return x.modPowInt(this.e, this.n);
1521
+ }
1522
+
1523
+ // Return the PKCS#1 RSA encryption of "text" as an even-length hex string
1524
+ function RSAEncrypt(text) {
1525
+ var m = pkcs1pad2(text,(this.n.bitLength()+7)>>3);
1526
+ if(m == null) return null;
1527
+ var c = this.doPublic(m);
1528
+ if(c == null) return null;
1529
+ var h = c.toString(16);
1530
+ if((h.length & 1) == 0) return h; else return "0" + h;
1531
+ }
1532
+
1533
+ // Return the PKCS#1 RSA encryption of "text" as a Base64-encoded string
1534
+ //function RSAEncryptB64(text) {
1535
+ // var h = this.encrypt(text);
1536
+ // if(h) return hex2b64(h); else return null;
1537
+ //}
1538
+
1539
+ // protected
1540
+ RSAKey.prototype.doPublic = RSADoPublic;
1541
+
1542
+ // public
1543
+ RSAKey.prototype.setPublic = RSASetPublic;
1544
+ RSAKey.prototype.encrypt = RSAEncrypt;
1545
+ //RSAKey.prototype.encrypt_b64 = RSAEncryptB64;
1546
+ // Depends on rsa.js and jsbn2.js
1547
+
1548
+ // Undo PKCS#1 (type 2, random) padding and, if valid, return the plaintext
1549
+ function pkcs1unpad2(d,n) {
1550
+ var b = d.toByteArray();
1551
+ var i = 0;
1552
+ while(i < b.length && b[i] == 0) ++i;
1553
+ if(b.length-i != n-1 || b[i] != 2)
1554
+ return null;
1555
+ ++i;
1556
+ while(b[i] != 0)
1557
+ if(++i >= b.length) return null;
1558
+ var ret = "";
1559
+ while(++i < b.length)
1560
+ ret += String.fromCharCode(b[i]);
1561
+ return ret;
1562
+ }
1563
+
1564
+ // Set the private key fields N, e, and d from hex strings
1565
+ function RSASetPrivate(N,E,D) {
1566
+ if(N != null && E != null && N.length > 0 && E.length > 0) {
1567
+ this.n = parseBigInt(N,16);
1568
+ this.e = parseInt(E,16);
1569
+ this.d = parseBigInt(D,16);
1570
+ }
1571
+ else
1572
+ alert("Invalid RSA private key");
1573
+ }
1574
+
1575
+ // Set the private key fields N, e, d and CRT params from hex strings
1576
+ function RSASetPrivateEx(N,E,D,P,Q,DP,DQ,C) {
1577
+ if(N != null && E != null && N.length > 0 && E.length > 0) {
1578
+ this.n = parseBigInt(N,16);
1579
+ this.e = parseInt(E,16);
1580
+ this.d = parseBigInt(D,16);
1581
+ this.p = parseBigInt(P,16);
1582
+ this.q = parseBigInt(Q,16);
1583
+ this.dmp1 = parseBigInt(DP,16);
1584
+ this.dmq1 = parseBigInt(DQ,16);
1585
+ this.coeff = parseBigInt(C,16);
1586
+ }
1587
+ else
1588
+ alert("Invalid RSA private key");
1589
+ }
1590
+
1591
+ // Generate a new random private key B bits long, using public expt E
1592
+ function RSAGenerate(B,E) {
1593
+ var rng = new SecureRandom();
1594
+ var qs = B>>1;
1595
+ this.e = parseInt(E,16);
1596
+ var ee = new BigInteger(E,16);
1597
+ for(;;) {
1598
+ for(;;) {
1599
+ this.p = new BigInteger(B-qs,1,rng);
1600
+ if(this.p.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.p.isProbablePrime(10)) break;
1601
+ }
1602
+ for(;;) {
1603
+ this.q = new BigInteger(qs,1,rng);
1604
+ if(this.q.subtract(BigInteger.ONE).gcd(ee).compareTo(BigInteger.ONE) == 0 && this.q.isProbablePrime(10)) break;
1605
+ }
1606
+ if(this.p.compareTo(this.q) <= 0) {
1607
+ var t = this.p;
1608
+ this.p = this.q;
1609
+ this.q = t;
1610
+ }
1611
+ var p1 = this.p.subtract(BigInteger.ONE);
1612
+ var q1 = this.q.subtract(BigInteger.ONE);
1613
+ var phi = p1.multiply(q1);
1614
+ if(phi.gcd(ee).compareTo(BigInteger.ONE) == 0) {
1615
+ this.n = this.p.multiply(this.q);
1616
+ this.d = ee.modInverse(phi);
1617
+ this.dmp1 = this.d.mod(p1);
1618
+ this.dmq1 = this.d.mod(q1);
1619
+ this.coeff = this.q.modInverse(this.p);
1620
+ break;
1621
+ }
1622
+ }
1623
+ }
1624
+
1625
+ // Perform raw private operation on "x": return x^d (mod n)
1626
+ function RSADoPrivate(x) {
1627
+ if(this.p == null || this.q == null)
1628
+ return x.modPow(this.d, this.n);
1629
+
1630
+ // TODO: re-calculate any missing CRT params
1631
+ var xp = x.mod(this.p).modPow(this.dmp1, this.p);
1632
+ var xq = x.mod(this.q).modPow(this.dmq1, this.q);
1633
+
1634
+ while(xp.compareTo(xq) < 0)
1635
+ xp = xp.add(this.p);
1636
+ return xp.subtract(xq).multiply(this.coeff).mod(this.p).multiply(this.q).add(xq);
1637
+ }
1638
+
1639
+ // Return the PKCS#1 RSA decryption of "ctext".
1640
+ // "ctext" is an even-length hex string and the output is a plain string.
1641
+ function RSADecrypt(ctext) {
1642
+ var c = parseBigInt(ctext, 16);
1643
+ var m = this.doPrivate(c);
1644
+ if(m == null) return null;
1645
+ return pkcs1unpad2(m, (this.n.bitLength()+7)>>3);
1646
+ }
1647
+
1648
+ // Return the PKCS#1 RSA decryption of "ctext".
1649
+ // "ctext" is a Base64-encoded string and the output is a plain string.
1650
+ //function RSAB64Decrypt(ctext) {
1651
+ // var h = b64tohex(ctext);
1652
+ // if(h) return this.decrypt(h); else return null;
1653
+ //}
1654
+
1655
+ // protected
1656
+ RSAKey.prototype.doPrivate = RSADoPrivate;
1657
+
1658
+ // public
1659
+ RSAKey.prototype.setPrivate = RSASetPrivate;
1660
+ RSAKey.prototype.setPrivateEx = RSASetPrivateEx;
1661
+ RSAKey.prototype.generate = RSAGenerate;
1662
+ RSAKey.prototype.decrypt = RSADecrypt;
1663
+ //RSAKey.prototype.b64_decrypt = RSAB64Decrypt;
1664
+
1665
+
1666
+ nValue="a5261939975948bb7a58dffe5ff54e65f0498f9175f5a09288810b8975871e99af3b5dd94057b0fc07535f5f97444504fa35169d461d0d30cf0192e307727c065168c788771c561a9400fb49175e9e6aa4e23fe11af69e9412dd23b0cb6684c4c2429bce139e848ab26d0829073351f4acd36074eafd036a5eb83359d2a698d3";
1667
+ eValue="10001";
1668
+ dValue="8e9912f6d3645894e8d38cb58c0db81ff516cf4c7e5a14c7f1eddb1459d2cded4d8d293fc97aee6aefb861859c8b6a3d1dfe710463e1f9ddc72048c09751971c4a580aa51eb523357a3cc48d31cfad1d4a165066ed92d4748fb6571211da5cb14bc11b6e2df7c1a559e6d5ac1cd5c94703a22891464fba23d0d965086277a161";
1669
+ pValue="d090ce58a92c75233a6486cb0a9209bf3583b64f540c76f5294bb97d285eed33aec220bde14b2417951178ac152ceab6da7090905b478195498b352048f15e7d";
1670
+ qValue="cab575dc652bb66df15a0359609d51d1db184750c00c6698b90ef3465c99655103edbf0d54c56aec0ce3c4d22592338092a126a0cc49f65a4a30d222b411e58f";
1671
+ dmp1Value="1a24bca8e273df2f0e47c199bbf678604e7df7215480c77c8db39f49b000ce2cf7500038acfff5433b7d582a01f1826e6f4d42e1c57f5e1fef7b12aabc59fd25";
1672
+ dmq1Value="3d06982efbbe47339e1f6d36b1216b8a741d410b0c662f54f7118b27b9a4ec9d914337eb39841d8666f3034408cf94f5b62f11c402fc994fe15a05493150d9fd";
1673
+ coeffValue="3a3e731acd8960b7ff9eb81a7ff93bd1cfa74cbd56987db58b4594fb09c09084db1734c8143f98b602b981aaa9243ca28deb69b5b280ee8dcee0fd2625e53250";
1674
+
1675
+ setupEngine(am3, 28);
1676
+
1677
+ var RSA = new RSAKey();
1678
+ var TEXT = "The quick brown fox jumped over the extremely lazy frogs!";
1679
+
1680
+ RSA.setPublic(nValue, eValue);
1681
+ RSA.setPrivateEx(nValue, eValue, dValue, pValue, qValue, dmp1Value, dmq1Value, coeffValue);
1682
+
1683
+ function encrypt() {
1684
+ return RSA.encrypt(TEXT);
1685
+ }
1686
+
1687
+ function decrypt() {
1688
+ return RSA.decrypt(TEXT);
1689
+ }