Bug 1437004 - Tests for BinAST v3 (data);r?arai
authorDavid Teller <dteller@mozilla.com>
Wed, 21 Feb 2018 16:24:33 +0100
changeset 770034 1ba2940a7fe4b5b373297ec1a8853ecfa78bedb2
parent 767919 fcb11e93adf57210167de0b27b15433e9c3f45e4
child 770035 235a5b9b02efefb00a294e286655baee4220ff62
child 777270 e14daee564de680251d7d33f30ab2c0d73c57aec
push id103291
push userdteller@mozilla.com
push dateTue, 20 Mar 2018 15:29:40 +0000
reviewersarai
bugs1437004
milestone61.0a1
Bug 1437004 - Tests for BinAST v3 (data);r?arai This patch ports the existing data files for testing BinAST to the WIP 3rd version of the specifications. Also: - data files have been reorganized in subdirectories; - adding data files for hand-crafted tests; - adding data files for a few existing frameworks. MozReview-Commit-ID: JlABWNkRZFY
js/src/jsapi-tests/binast/parser/tester/StrictEquality-001.binjs
js/src/jsapi-tests/binast/parser/tester/StrictEquality-001.js
js/src/jsapi-tests/binast/parser/tester/apply-001-n.binjs
js/src/jsapi-tests/binast/parser/tester/apply-001-n.js
js/src/jsapi-tests/binast/parser/tester/boolean-001.binjs
js/src/jsapi-tests/binast/parser/tester/boolean-001.js
js/src/jsapi-tests/binast/parser/tester/boolean-002.binjs
js/src/jsapi-tests/binast/parser/tester/boolean-002.js
js/src/jsapi-tests/binast/parser/tester/call-1.binjs
js/src/jsapi-tests/binast/parser/tester/call-1.js
js/src/jsapi-tests/binast/parser/tester/constructor-001.binjs
js/src/jsapi-tests/binast/parser/tester/constructor-001.js
js/src/jsapi-tests/binast/parser/tester/date-002.binjs
js/src/jsapi-tests/binast/parser/tester/date-002.js
js/src/jsapi-tests/binast/parser/tester/date-003.binjs
js/src/jsapi-tests/binast/parser/tester/date-003.js
js/src/jsapi-tests/binast/parser/tester/date-004.binjs
js/src/jsapi-tests/binast/parser/tester/date-004.js
js/src/jsapi-tests/binast/parser/tester/dowhile-001.binjs
js/src/jsapi-tests/binast/parser/tester/dowhile-001.js
js/src/jsapi-tests/binast/parser/tester/dowhile-002.binjs
js/src/jsapi-tests/binast/parser/tester/dowhile-002.js
js/src/jsapi-tests/binast/parser/tester/dowhile-003.binjs
js/src/jsapi-tests/binast/parser/tester/dowhile-003.js
js/src/jsapi-tests/binast/parser/tester/dowhile-004.binjs
js/src/jsapi-tests/binast/parser/tester/dowhile-004.js
js/src/jsapi-tests/binast/parser/tester/dowhile-005.binjs
js/src/jsapi-tests/binast/parser/tester/dowhile-005.js
js/src/jsapi-tests/binast/parser/tester/dowhile-006.binjs
js/src/jsapi-tests/binast/parser/tester/dowhile-006.js
js/src/jsapi-tests/binast/parser/tester/dowhile-007.binjs
js/src/jsapi-tests/binast/parser/tester/dowhile-007.js
js/src/jsapi-tests/binast/parser/tester/exception-001.binjs
js/src/jsapi-tests/binast/parser/tester/exception-001.js
js/src/jsapi-tests/binast/parser/tester/exception-002.binjs
js/src/jsapi-tests/binast/parser/tester/exception-002.js
js/src/jsapi-tests/binast/parser/tester/exception-003.binjs
js/src/jsapi-tests/binast/parser/tester/exception-003.js
js/src/jsapi-tests/binast/parser/tester/exception-004.binjs
js/src/jsapi-tests/binast/parser/tester/exception-004.js
js/src/jsapi-tests/binast/parser/tester/exception-005.binjs
js/src/jsapi-tests/binast/parser/tester/exception-005.js
js/src/jsapi-tests/binast/parser/tester/exception-006.binjs
js/src/jsapi-tests/binast/parser/tester/exception-006.js
js/src/jsapi-tests/binast/parser/tester/exception-007.binjs
js/src/jsapi-tests/binast/parser/tester/exception-007.js
js/src/jsapi-tests/binast/parser/tester/exception-008.binjs
js/src/jsapi-tests/binast/parser/tester/exception-008.js
js/src/jsapi-tests/binast/parser/tester/exception-009.binjs
js/src/jsapi-tests/binast/parser/tester/exception-009.js
js/src/jsapi-tests/binast/parser/tester/exception-010-n.binjs
js/src/jsapi-tests/binast/parser/tester/exception-010-n.js
js/src/jsapi-tests/binast/parser/tester/exception-011-n.binjs
js/src/jsapi-tests/binast/parser/tester/exception-011-n.js
js/src/jsapi-tests/binast/parser/tester/exec-002.binjs
js/src/jsapi-tests/binast/parser/tester/exec-002.js
js/src/jsapi-tests/binast/parser/tester/expression-001.binjs
js/src/jsapi-tests/binast/parser/tester/expression-001.js
js/src/jsapi-tests/binast/parser/tester/expression-002.binjs
js/src/jsapi-tests/binast/parser/tester/expression-002.js
js/src/jsapi-tests/binast/parser/tester/expression-003.binjs
js/src/jsapi-tests/binast/parser/tester/expression-003.js
js/src/jsapi-tests/binast/parser/tester/expression-004.binjs
js/src/jsapi-tests/binast/parser/tester/expression-004.js
js/src/jsapi-tests/binast/parser/tester/expression-005.binjs
js/src/jsapi-tests/binast/parser/tester/expression-005.js
js/src/jsapi-tests/binast/parser/tester/expression-006.binjs
js/src/jsapi-tests/binast/parser/tester/expression-006.js
js/src/jsapi-tests/binast/parser/tester/expression-007.binjs
js/src/jsapi-tests/binast/parser/tester/expression-007.js
js/src/jsapi-tests/binast/parser/tester/expression-008.binjs
js/src/jsapi-tests/binast/parser/tester/expression-008.js
js/src/jsapi-tests/binast/parser/tester/expression-009.binjs
js/src/jsapi-tests/binast/parser/tester/expression-009.js
js/src/jsapi-tests/binast/parser/tester/expression-010.binjs
js/src/jsapi-tests/binast/parser/tester/expression-010.js
js/src/jsapi-tests/binast/parser/tester/expression-011.binjs
js/src/jsapi-tests/binast/parser/tester/expression-011.js
js/src/jsapi-tests/binast/parser/tester/expression-012.binjs
js/src/jsapi-tests/binast/parser/tester/expression-012.js
js/src/jsapi-tests/binast/parser/tester/expression-013.binjs
js/src/jsapi-tests/binast/parser/tester/expression-013.js
js/src/jsapi-tests/binast/parser/tester/expression-014.binjs
js/src/jsapi-tests/binast/parser/tester/expression-014.js
js/src/jsapi-tests/binast/parser/tester/expression-015.binjs
js/src/jsapi-tests/binast/parser/tester/expression-015.js
js/src/jsapi-tests/binast/parser/tester/expression-016.binjs
js/src/jsapi-tests/binast/parser/tester/expression-016.js
js/src/jsapi-tests/binast/parser/tester/expression-017.binjs
js/src/jsapi-tests/binast/parser/tester/expression-017.js
js/src/jsapi-tests/binast/parser/tester/expression-019.binjs
js/src/jsapi-tests/binast/parser/tester/expression-019.js
js/src/jsapi-tests/binast/parser/tester/forin-001.binjs
js/src/jsapi-tests/binast/parser/tester/forin-001.js
js/src/jsapi-tests/binast/parser/tester/forin-002.binjs
js/src/jsapi-tests/binast/parser/tester/forin-002.js
js/src/jsapi-tests/binast/parser/tester/frameworks/angular-1.2.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/angular-1.2.js
js/src/jsapi-tests/binast/parser/tester/frameworks/backbone-1.1.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/backbone-1.1.js
js/src/jsapi-tests/binast/parser/tester/frameworks/benchmark.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/benchmark.js
js/src/jsapi-tests/binast/parser/tester/frameworks/jquery-1.9.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/jquery-1.9.js
js/src/jsapi-tests/binast/parser/tester/frameworks/jquery.mobile-1.4.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/jquery.mobile-1.4.js
js/src/jsapi-tests/binast/parser/tester/frameworks/mootools-1.4.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/mootools-1.4.js
js/src/jsapi-tests/binast/parser/tester/frameworks/underscore-1.5.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/underscore-1.5.js
js/src/jsapi-tests/binast/parser/tester/frameworks/yui-3.12.binjs
js/src/jsapi-tests/binast/parser/tester/frameworks/yui-3.12.js
js/src/jsapi-tests/binast/parser/tester/function-001.binjs
js/src/jsapi-tests/binast/parser/tester/function-001.js
js/src/jsapi-tests/binast/parser/tester/global-001.binjs
js/src/jsapi-tests/binast/parser/tester/global-001.js
js/src/jsapi-tests/binast/parser/tester/global-002.binjs
js/src/jsapi-tests/binast/parser/tester/global-002.js
js/src/jsapi-tests/binast/parser/tester/hex-001.binjs
js/src/jsapi-tests/binast/parser/tester/hex-001.js
js/src/jsapi-tests/binast/parser/tester/if-001.binjs
js/src/jsapi-tests/binast/parser/tester/if-001.js
js/src/jsapi-tests/binast/parser/tester/instanceof-001.binjs
js/src/jsapi-tests/binast/parser/tester/instanceof-001.js
js/src/jsapi-tests/binast/parser/tester/instanceof-002.binjs
js/src/jsapi-tests/binast/parser/tester/instanceof-002.js
js/src/jsapi-tests/binast/parser/tester/instanceof-003-n.binjs
js/src/jsapi-tests/binast/parser/tester/instanceof-003-n.js
js/src/jsapi-tests/binast/parser/tester/instanceof-003.binjs
js/src/jsapi-tests/binast/parser/tester/instanceof-003.js
js/src/jsapi-tests/binast/parser/tester/instanceof-004-n.binjs
js/src/jsapi-tests/binast/parser/tester/instanceof-004-n.js
js/src/jsapi-tests/binast/parser/tester/instanceof-005-n.binjs
js/src/jsapi-tests/binast/parser/tester/instanceof-005-n.js
js/src/jsapi-tests/binast/parser/tester/instanceof-006.binjs
js/src/jsapi-tests/binast/parser/tester/instanceof-006.js
js/src/jsapi-tests/binast/parser/tester/keywords-001.binjs
js/src/jsapi-tests/binast/parser/tester/keywords-001.js
js/src/jsapi-tests/binast/parser/tester/label-001.binjs
js/src/jsapi-tests/binast/parser/tester/label-001.js
js/src/jsapi-tests/binast/parser/tester/label-002.binjs
js/src/jsapi-tests/binast/parser/tester/label-002.js
js/src/jsapi-tests/binast/parser/tester/label-003.binjs
js/src/jsapi-tests/binast/parser/tester/label-003.js
js/src/jsapi-tests/binast/parser/tester/lexical-001.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-001.js
js/src/jsapi-tests/binast/parser/tester/lexical-002.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-002.js
js/src/jsapi-tests/binast/parser/tester/lexical-003.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-003.js
js/src/jsapi-tests/binast/parser/tester/lexical-004.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-004.js
js/src/jsapi-tests/binast/parser/tester/lexical-005.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-005.js
js/src/jsapi-tests/binast/parser/tester/lexical-006.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-006.js
js/src/jsapi-tests/binast/parser/tester/lexical-007.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-007.js
js/src/jsapi-tests/binast/parser/tester/lexical-008.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-008.js
js/src/jsapi-tests/binast/parser/tester/lexical-009.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-009.js
js/src/jsapi-tests/binast/parser/tester/lexical-011.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-011.js
js/src/jsapi-tests/binast/parser/tester/lexical-012.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-012.js
js/src/jsapi-tests/binast/parser/tester/lexical-013.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-013.js
js/src/jsapi-tests/binast/parser/tester/lexical-014.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-014.js
js/src/jsapi-tests/binast/parser/tester/lexical-015.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-015.js
js/src/jsapi-tests/binast/parser/tester/lexical-016.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-016.js
js/src/jsapi-tests/binast/parser/tester/lexical-017.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-017.js
js/src/jsapi-tests/binast/parser/tester/lexical-018.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-018.js
js/src/jsapi-tests/binast/parser/tester/lexical-019.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-019.js
js/src/jsapi-tests/binast/parser/tester/lexical-020.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-020.js
js/src/jsapi-tests/binast/parser/tester/lexical-021.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-021.js
js/src/jsapi-tests/binast/parser/tester/lexical-023.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-023.js
js/src/jsapi-tests/binast/parser/tester/lexical-024.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-024.js
js/src/jsapi-tests/binast/parser/tester/lexical-025.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-025.js
js/src/jsapi-tests/binast/parser/tester/lexical-026.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-026.js
js/src/jsapi-tests/binast/parser/tester/lexical-027.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-027.js
js/src/jsapi-tests/binast/parser/tester/lexical-028.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-028.js
js/src/jsapi-tests/binast/parser/tester/lexical-029.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-029.js
js/src/jsapi-tests/binast/parser/tester/lexical-030.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-030.js
js/src/jsapi-tests/binast/parser/tester/lexical-031.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-031.js
js/src/jsapi-tests/binast/parser/tester/lexical-032.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-032.js
js/src/jsapi-tests/binast/parser/tester/lexical-033.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-033.js
js/src/jsapi-tests/binast/parser/tester/lexical-034.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-034.js
js/src/jsapi-tests/binast/parser/tester/lexical-035.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-035.js
js/src/jsapi-tests/binast/parser/tester/lexical-036.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-036.js
js/src/jsapi-tests/binast/parser/tester/lexical-037.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-037.js
js/src/jsapi-tests/binast/parser/tester/lexical-038.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-038.js
js/src/jsapi-tests/binast/parser/tester/lexical-039.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-039.js
js/src/jsapi-tests/binast/parser/tester/lexical-040.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-040.js
js/src/jsapi-tests/binast/parser/tester/lexical-041.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-041.js
js/src/jsapi-tests/binast/parser/tester/lexical-042.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-042.js
js/src/jsapi-tests/binast/parser/tester/lexical-047.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-047.js
js/src/jsapi-tests/binast/parser/tester/lexical-048.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-048.js
js/src/jsapi-tests/binast/parser/tester/lexical-049.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-049.js
js/src/jsapi-tests/binast/parser/tester/lexical-050.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-050.js
js/src/jsapi-tests/binast/parser/tester/lexical-051.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-051.js
js/src/jsapi-tests/binast/parser/tester/lexical-052.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-052.js
js/src/jsapi-tests/binast/parser/tester/lexical-053.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-053.js
js/src/jsapi-tests/binast/parser/tester/lexical-054.binjs
js/src/jsapi-tests/binast/parser/tester/lexical-054.js
js/src/jsapi-tests/binast/parser/tester/match-001.binjs
js/src/jsapi-tests/binast/parser/tester/match-001.js
js/src/jsapi-tests/binast/parser/tester/match-002.binjs
js/src/jsapi-tests/binast/parser/tester/match-002.js
js/src/jsapi-tests/binast/parser/tester/match-003.binjs
js/src/jsapi-tests/binast/parser/tester/match-003.js
js/src/jsapi-tests/binast/parser/tester/match-004.binjs
js/src/jsapi-tests/binast/parser/tester/match-004.js
js/src/jsapi-tests/binast/parser/tester/multiline-001.binjs
js/src/jsapi-tests/binast/parser/tester/multiline-001.js
js/src/jsapi-tests/binast/parser/tester/number-001.binjs
js/src/jsapi-tests/binast/parser/tester/number-001.js
js/src/jsapi-tests/binast/parser/tester/number-002.binjs
js/src/jsapi-tests/binast/parser/tester/number-002.js
js/src/jsapi-tests/binast/parser/tester/number-003.binjs
js/src/jsapi-tests/binast/parser/tester/number-003.js
js/src/jsapi-tests/binast/parser/tester/octal-001.binjs
js/src/jsapi-tests/binast/parser/tester/octal-001.js
js/src/jsapi-tests/binast/parser/tester/octal-002.binjs
js/src/jsapi-tests/binast/parser/tester/octal-002.js
js/src/jsapi-tests/binast/parser/tester/octal-003.binjs
js/src/jsapi-tests/binast/parser/tester/octal-003.js
js/src/jsapi-tests/binast/parser/tester/properties-001.binjs
js/src/jsapi-tests/binast/parser/tester/properties-001.js
js/src/jsapi-tests/binast/parser/tester/properties-002.binjs
js/src/jsapi-tests/binast/parser/tester/properties-002.js
js/src/jsapi-tests/binast/parser/tester/regexp-enumerate-001.binjs
js/src/jsapi-tests/binast/parser/tester/regexp-enumerate-001.js
js/src/jsapi-tests/binast/parser/tester/regexp-literals-001.binjs
js/src/jsapi-tests/binast/parser/tester/regexp-literals-001.js
js/src/jsapi-tests/binast/parser/tester/regexp-literals-002.binjs
js/src/jsapi-tests/binast/parser/tester/regexp-literals-002.js
js/src/jsapi-tests/binast/parser/tester/regress-001.binjs
js/src/jsapi-tests/binast/parser/tester/regress-001.js
js/src/jsapi-tests/binast/parser/tester/regress-7635.binjs
js/src/jsapi-tests/binast/parser/tester/regress-7635.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/boolean-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/boolean-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/boolean-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/boolean-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-005.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-006.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-007.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-008.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-009.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-010-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-010-n.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-011-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-011-n.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-005.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-006.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-007.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-008.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-009.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-010.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-010.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-011.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-011.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-012.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-012.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-013.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-013.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-014.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-014.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-015.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-015.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-016.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-016.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-017.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-017.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-019.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-019.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/function-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/function-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/global-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/global-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/global-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/global-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-005.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-006.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-007.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-008.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-009.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-011.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-011.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-012.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-012.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-013.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-013.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-014.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-014.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-015.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-015.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-016.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-016.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-017.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-017.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-018.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-018.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-019.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-019.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-020.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-020.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-021.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-021.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-023.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-023.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-024.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-024.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-025.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-025.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-026.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-026.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-027.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-027.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-028.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-028.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-029.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-029.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-030.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-030.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-031.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-031.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-032.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-032.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-033.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-033.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-034.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-034.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-035.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-035.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-036.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-036.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-037.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-037.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-038.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-038.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-039.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-039.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-040.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-040.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-041.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-041.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-042.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-042.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-047.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-047.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-048.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-048.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-049.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-049.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-050.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-050.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-051.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-051.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-052.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-052.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-053.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-053.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-054.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-054.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-005.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-006.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-007.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-008.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-009.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/string-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/string-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/string-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/string-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/StrictEquality-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/StrictEquality-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/apply-001-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/apply-001-n.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/call-1.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/call-1.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/keywords-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/keywords-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/regexp-literals-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/regexp-literals-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/regexp-literals-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/regexp-literals-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/constructor-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/constructor-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/exec-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/exec-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/hex-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/hex-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/multiline-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/multiline-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/properties-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/properties-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/properties-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/properties-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/regexp-enumerate-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/regexp-enumerate-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/regress-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/regress-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/unicode-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/unicode-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-005.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-006.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-007.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/forin-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/forin-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/forin-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/forin-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/if-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/if-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-005.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-005.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-006.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-007.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-007.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-008.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-008.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-009.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-009.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-010.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-010.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-012.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-012.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-004.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-004.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/constructor-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/constructor-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/function-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/function-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-003-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-003-n.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-004-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-004-n.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-005-n.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-005-n.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-006.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-006.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/browser.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/browser.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-001.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-001.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-002.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-002.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-003.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-003.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/regress-7635.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/regress-7635.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/shell.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/shell.js
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/template.binjs
js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/template.js
js/src/jsapi-tests/binast/parser/tester/split-001.binjs
js/src/jsapi-tests/binast/parser/tester/split-001.js
js/src/jsapi-tests/binast/parser/tester/split-002.binjs
js/src/jsapi-tests/binast/parser/tester/split-002.js
js/src/jsapi-tests/binast/parser/tester/split-003.binjs
js/src/jsapi-tests/binast/parser/tester/split-003.js
js/src/jsapi-tests/binast/parser/tester/statement-001.binjs
js/src/jsapi-tests/binast/parser/tester/statement-001.js
js/src/jsapi-tests/binast/parser/tester/statement-002.binjs
js/src/jsapi-tests/binast/parser/tester/statement-002.js
js/src/jsapi-tests/binast/parser/tester/statement-003.binjs
js/src/jsapi-tests/binast/parser/tester/statement-003.js
js/src/jsapi-tests/binast/parser/tester/statement-004.binjs
js/src/jsapi-tests/binast/parser/tester/statement-004.js
js/src/jsapi-tests/binast/parser/tester/statement-005.binjs
js/src/jsapi-tests/binast/parser/tester/statement-005.js
js/src/jsapi-tests/binast/parser/tester/statement-006.binjs
js/src/jsapi-tests/binast/parser/tester/statement-006.js
js/src/jsapi-tests/binast/parser/tester/statement-007.binjs
js/src/jsapi-tests/binast/parser/tester/statement-007.js
js/src/jsapi-tests/binast/parser/tester/statement-008.binjs
js/src/jsapi-tests/binast/parser/tester/statement-008.js
js/src/jsapi-tests/binast/parser/tester/statement-009.binjs
js/src/jsapi-tests/binast/parser/tester/statement-009.js
js/src/jsapi-tests/binast/parser/tester/string-001.binjs
js/src/jsapi-tests/binast/parser/tester/string-001.js
js/src/jsapi-tests/binast/parser/tester/string-002.binjs
js/src/jsapi-tests/binast/parser/tester/string-002.js
js/src/jsapi-tests/binast/parser/tester/switch-001.binjs
js/src/jsapi-tests/binast/parser/tester/switch-001.js
js/src/jsapi-tests/binast/parser/tester/switch-002.binjs
js/src/jsapi-tests/binast/parser/tester/switch-002.js
js/src/jsapi-tests/binast/parser/tester/switch-003.binjs
js/src/jsapi-tests/binast/parser/tester/switch-003.js
js/src/jsapi-tests/binast/parser/tester/switch-004.binjs
js/src/jsapi-tests/binast/parser/tester/switch-004.js
js/src/jsapi-tests/binast/parser/tester/try-001.binjs
js/src/jsapi-tests/binast/parser/tester/try-001.js
js/src/jsapi-tests/binast/parser/tester/try-003.binjs
js/src/jsapi-tests/binast/parser/tester/try-003.js
js/src/jsapi-tests/binast/parser/tester/try-004.binjs
js/src/jsapi-tests/binast/parser/tester/try-004.js
js/src/jsapi-tests/binast/parser/tester/try-005.binjs
js/src/jsapi-tests/binast/parser/tester/try-005.js
js/src/jsapi-tests/binast/parser/tester/try-006.binjs
js/src/jsapi-tests/binast/parser/tester/try-006.js
js/src/jsapi-tests/binast/parser/tester/try-007.binjs
js/src/jsapi-tests/binast/parser/tester/try-007.js
js/src/jsapi-tests/binast/parser/tester/try-008.binjs
js/src/jsapi-tests/binast/parser/tester/try-008.js
js/src/jsapi-tests/binast/parser/tester/try-009.binjs
js/src/jsapi-tests/binast/parser/tester/try-009.js
js/src/jsapi-tests/binast/parser/tester/try-010.binjs
js/src/jsapi-tests/binast/parser/tester/try-010.js
js/src/jsapi-tests/binast/parser/tester/try-012.binjs
js/src/jsapi-tests/binast/parser/tester/try-012.js
js/src/jsapi-tests/binast/parser/tester/unicode-001.binjs
js/src/jsapi-tests/binast/parser/tester/unicode-001.js
js/src/jsapi-tests/binast/parser/tester/while-001.binjs
js/src/jsapi-tests/binast/parser/tester/while-001.js
js/src/jsapi-tests/binast/parser/tester/while-002.binjs
js/src/jsapi-tests/binast/parser/tester/while-002.js
js/src/jsapi-tests/binast/parser/tester/while-003.binjs
js/src/jsapi-tests/binast/parser/tester/while-003.js
js/src/jsapi-tests/binast/parser/tester/while-004.binjs
js/src/jsapi-tests/binast/parser/tester/while-004.js
js/src/jsapi-tests/binast/parser/unit/catch_explicit.binjs
js/src/jsapi-tests/binast/parser/unit/catch_explicit.js
js/src/jsapi-tests/binast/parser/unit/catch_implicit.binjs
js/src/jsapi-tests/binast/parser/unit/catch_implicit.js
js/src/jsapi-tests/binast/parser/unit/let_in_fun.binjs
js/src/jsapi-tests/binast/parser/unit/let_in_fun.js
js/src/jsapi-tests/binast/parser/unit/toplevel_var.binjs
js/src/jsapi-tests/binast/parser/unit/toplevel_var.js
js/src/jsapi-tests/binast/parser/unit/var_in_fun.binjs
js/src/jsapi-tests/binast/parser/unit/var_in_fun.js
js/src/jsapi-tests/binast/parser/unit/var_in_fun_plus_arg.binjs
js/src/jsapi-tests/binast/parser/unit/var_in_fun_plus_arg.js
js/src/jsapi-tests/testBinASTReader.cpp
deleted file mode 100644
index 925b6d52d433c088dc5154744a079d04e936aeef..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/StrictEquality-001.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          StrictEquality-001.js
- *  ECMA Section:       11.9.6.js
- *  Description:
- *
- *  Author:             christine@netscape.com
- *  Date:               4 september 1998
- */
-var SECTION = "StrictEquality-001 - 11.9.6";
-var VERSION = "ECMA_2";
-var TITLE   =  "The strict equality operator ( === )";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-
-// 1. If Type(x) is different from Type(y) return false
-
-StrictEquality( true, new Boolean(true), false );
-StrictEquality( new Boolean(), false, false );
-StrictEquality( "", new String(),    false );
-StrictEquality( new String("hi"), "hi", false );
-
-// 2. If Type(x) is not Number go to step 9.
-
-// 3. If x is NaN, return false
-StrictEquality( NaN, NaN,   false );
-StrictEquality( NaN, 0,     false );
-
-// 4. If y is NaN, return false.
-StrictEquality( 0,  NaN,    false );
-
-// 5. if x is the same number value as y, return true
-
-// 6. If x is +0 and y is -0, return true
-
-// 7. If x is -0 and y is +0, return true
-
-// 8. Return false.
-
-
-// 9.  If Type(x) is String, then return true if x and y are exactly
-//  the same sequence of characters ( same length and same characters
-//  in corresponding positions.) Otherwise return false.
-
-//  10. If Type(x) is Boolean, return true if x and y are both true or
-//  both false. otherwise return false.
-
-
-//  Return true if x and y refer to the same object.  Otherwise return
-//  false.
-
-// Return false.
-
-
-test();
-
-function StrictEquality( x, y, expect ) {
-  result = ( x === y );
-
-  new TestCase(
-    SECTION,
-    x +" === " + y,
-    expect,
-    result );
-}
-
deleted file mode 100644
index f94932cbb4a44f278460e80be0fb269addbe2dff..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/apply-001-n.js
+++ /dev/null
@@ -1,29 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-print("STATUS: f.apply crash test.");
-
-print("BUGNUMBER: 21836");
-
-function f ()
-{
-}
-
-var SECTION = "apply-001-n";
-var VERSION = "ECMA_1";
-startTest();
-var TITLE   = "f.apply(2,2) doesn't crash";
-
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DESCRIPTION = "f.apply(2,2) doesn't crash";
-EXPECTED = "error";
-
-new TestCase( SECTION,  "f.apply(2,2) doesn't crash",     "error",    eval("f.apply(2,2)") );
-
-test();
-
-
deleted file mode 100644
index a724010a7b3799aefaa8ad782dab6ceca9bd139e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/boolean-001.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          boolean-001.js
-   Description:        Corresponds to ecma/Boolean/15.6.4.2-4-n.js
-
-   The toString function is not generic; it generates
-   a runtime error if its this value is not a Boolean
-   object.  Therefore it cannot be transferred to other
-   kinds of objects for use as a method.
-
-   Author:             christine@netscape.com
-   Date:               june 27, 1997
-*/
-var SECTION = "boolean-001.js";
-var VERSION = "JS1_4";
-var TITLE   = "Boolean.prototype.toString()";
-startTest();
-writeHeaderToLog( SECTION +" "+ TITLE );
-
-var exception = "No exception thrown";
-var result = "Failed";
-
-var TO_STRING = Boolean.prototype.toString;
-
-try {
-  var s = new String("Not a Boolean");
-  s.toString = TO_STRING;
-  s.toString();
-} catch ( e ) {
-  result = "Passed!";
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "Assigning Boolean.prototype.toString to a String object "+
-  "(threw " +exception +")",
-  "Passed!",
-  result );
-
-test();
-
deleted file mode 100644
index a52b8a39dfdd3439994c3e4fee0861d161194ac1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/boolean-002.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          boolean-001.js
-   Description:        Corresponds to ecma/Boolean/15.6.4.3-4-n.js
-
-   15.6.4.3 Boolean.prototype.valueOf()
-   Returns this boolean value.
-
-   The valueOf function is not generic; it generates
-   a runtime error if its this value is not a Boolean
-   object.  Therefore it cannot be transferred to other
-   kinds of objects for use as a method.
-
-   Author:             christine@netscape.com
-   Date:               09 september 1998
-*/
-var SECTION = "boolean-002.js";
-var VERSION = "JS1_4";
-var TITLE   = "Boolean.prototype.valueOf()";
-startTest();
-writeHeaderToLog( SECTION +" "+ TITLE );
-
-
-var exception = "No exception thrown";
-var result = "Failed";
-
-var VALUE_OF = Boolean.prototype.valueOf;
-
-try {
-  var s = new String("Not a Boolean");
-  s.valueOf = VALUE_0F;
-  s.valueOf();
-} catch ( e ) {
-  result = "Passed!";
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "Assigning Boolean.prototype.valueOf to a String object "+
-  "(threw " +exception +")",
-  "Passed!",
-  result );
-
-test();
-
deleted file mode 100644
index c695c8be4ef547bd7005592da25172bb4ad5f837..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/call-1.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          call-1.js
-   Section:            Function.prototype.call
-   Description:
-
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "call-1";
-var VERSION = "ECMA_2";
-var TITLE   = "Function.prototype.call";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-new TestCase( SECTION,
-	      "ConvertToString.call(this, this)",
-	      GLOBAL,
-	      ConvertToString.call(this, this));
-
-new TestCase( SECTION,
-	      "ConvertToString.call(Boolean, Boolean.prototype)",
-	      "false",
-	      ConvertToString.call(Boolean, Boolean.prototype));
-
-new TestCase( SECTION,
-	      "ConvertToString.call(Boolean, Boolean.prototype.valueOf())",
-	      "false",
-	      ConvertToString.call(Boolean, Boolean.prototype.valueOf()));
-
-test();
-
-function ConvertToString(obj) {
-  return obj +"";
-}
deleted file mode 100644
index 0fb83e3759f878f95966ec2a96c440197bd6bf63..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/constructor-001.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/constructor-001.js
- *  ECMA Section:       15.7.3.3
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/constructor-001";
-var VERSION = "ECMA_2";
-var TITLE   = "new RegExp()";
-
-startTest();
-
-/*
- * for each test case, verify:
- * - verify that [[Class]] property is RegExp
- * - prototype property should be set to RegExp.prototype
- * - source is set to the empty string
- * - global property is set to false
- * - ignoreCase property is set to false
- * - multiline property is set to false
- * - lastIndex property is set to 0
- */
-
-RegExp.prototype.getClassProperty = Object.prototype.toString;
-var re = new RegExp();
-
-AddTestCase(
-  "RegExp.prototype.getClassProperty = Object.prototype.toString; " +
-  "(new RegExp()).getClassProperty()",
-  "[object RegExp]",
-  re.getClassProperty() );
-
-AddTestCase(
-  "(new RegExp()).source",
-  "(?:)",
-  re.source );
-
-AddTestCase(
-  "(new RegExp()).global",
-  false,
-  re.global );
-
-AddTestCase(
-  "(new RegExp()).ignoreCase",
-  false,
-  re.ignoreCase );
-
-AddTestCase(
-  "(new RegExp()).multiline",
-  false,
-  re.multiline );
-
-AddTestCase(
-  "(new RegExp()).lastIndex",
-  0,
-  re.lastIndex );
-
-test()
deleted file mode 100644
index f79e4756def10a0baceafd9b732d10b198773592..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/date-002.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          date-002.js
-   Corresponds To:     15.9.5.23-3-n.js
-   ECMA Section:       15.9.5.23
-   Description:        Date.prototype.setTime
-
-   1.  If the this value is not a Date object, generate a runtime error.
-   2.  Call ToNumber(time).
-   3.  Call TimeClip(Result(1)).
-   4.  Set the [[Value]] property of the this value to Result(2).
-   5.  Return the value of the [[Value]] property of the this value.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "date-002";
-var VERSION = "JS1_4";
-var TITLE   = "Date.prototype.setTime()";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var MYDATE = new MyDate();
-  result = MYDATE.setTime(0);
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "MYDATE = new MyDate(); MYDATE.setTime(0)" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function MyDate(value) {
-  this.value = value;
-  this.setTime = Date.prototype.setTime;
-  return this;
-}
deleted file mode 100644
index 206cfa318f41de9cc31b42acb195b2a1bb5ff0f6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/date-003.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          date-003.js
-   Corresponds To      15.9.5.3-1.js
-   ECMA Section:       15.9.5.3-1 Date.prototype.valueOf
-   Description:
-
-   The valueOf function returns a number, which is this time value.
-
-   The valueOf function is not generic; it generates a runtime error if
-   its this value is not a Date object.  Therefore it cannot be transferred
-   to other kinds of objects for use as a method.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "date-003";
-var VERSION = "JS1_4";
-var TITLE   = "Date.prototype.valueOf";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var OBJ = new MyObject( new Date(0) );
-  result = OBJ.valueOf();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "OBJ = new MyObject( new Date(0)); OBJ.valueOf()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function MyObject( value ) {
-  this.value = value;
-  this.valueOf = Date.prototype.valueOf;
-//  The following line causes an infinte loop
-//    this.toString = new Function( "return this+\"\";");
-  return this;
-}
deleted file mode 100644
index 75e32116f50ba886aaca695cd325485fd07f71c1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/date-004.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          date-004.js
-   Corresponds To:     15.9.5.4-2-n.js
-   ECMA Section:       15.9.5.4-1 Date.prototype.getTime
-   Description:
-
-   1.  If the this value is not an object whose [[Class]] property is "Date",
-   generate a runtime error.
-   2.  Return this time value.
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "date-004";
-var VERSION = "JS1_4";
-var TITLE   = "Date.prototype.getTime";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var MYDATE = new MyDate();
-  result = MYDATE.getTime();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "MYDATE = new MyDate(); MYDATE.getTime()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function MyDate( value ) {
-  this.value = value;
-  this.getTime = Date.prototype.getTime;
-}
deleted file mode 100644
index c606d8345fbfeb7256a42cccf4d6285fda744ecb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/dowhile-001.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          dowhile-001
- *  ECMA Section:
- *  Description:        do...while statements
- *
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "dowhile-002";
-var VERSION = "ECMA_2";
-var TITLE   = "do...while with a labeled continue statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-LabeledContinue( 0, 1 );
-LabeledContinue( 1, 1 );
-LabeledContinue( -1, 1 );
-LabeledContinue( 5, 5 );
-
-test();
-
-function LabeledContinue( limit, expect ) {
-  i = 0;
-woohoo:
-  do {
-    i++;
-    continue woohoo;
-  } while ( i < limit );
-
-  new TestCase(
-    SECTION,
-    "do while ( " + i +" < " + limit +" )",
-    expect,
-    i );
-}
deleted file mode 100644
index 9b80e1fcd76b00b0e9aae05ef5531336982e6ed0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/dowhile-002.js
+++ /dev/null
@@ -1,71 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          dowhile-002
- *  ECMA Section:
- *  Description:        do...while statements
- *
- *  Verify that code after a labeled break is not executed.  Verify that
- *  a labeled break breaks you out of the whole labeled block, and not
- *  just the current iteration statement.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "dowhile-002";
-var VERSION = "ECMA_2";
-var TITLE   = "do...while with a labeled continue statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-LabeledContinue( 0, 1 );
-LabeledContinue( 1, 1 );
-LabeledContinue( -1, 1 );
-LabeledContinue( 5, 5 );
-
-test();
-
-// The labeled statement contains statements after the labeled break.
-// Verify that the statements after the break are not executed.
-
-function LabeledContinue( limit, expect ) {
-  i = 0;
-  result1 = "pass";
-  result2 = "pass";
-
-woohoo: {
-    do {
-      i++;
-      if ( ! (i < limit) ) {
-	break woohoo;
-	result1 = "fail: evaluated statement after a labeled break";
-      }
-    } while ( true );
-
-    result2 = "failed:  broke out of loop, but not out of labeled block";
-  }
-
-  new TestCase(
-    SECTION,
-    "do while ( " + i +" < " + limit +" )",
-    expect,
-    i );
-
-  new TestCase(
-    SECTION,
-    "breaking out of a do... while loop",
-    "pass",
-    result1 );
-
-
-  new TestCase(
-    SECTION,
-    "breaking out of a labeled do...while loop",
-    "pass",
-    result2 );
-}
deleted file mode 100644
index 57436770bd007f90b3e4420eb03ed8e7257e2be7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/dowhile-003.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          dowhile-003
- *  ECMA Section:
- *  Description:        do...while statements
- *
- *  Test do while, when the while expression is a JavaScript Number object.
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "dowhile-003";
-var VERSION = "ECMA_2";
-var TITLE   = "do...while with a labeled continue statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DoWhile( new DoWhileObject( 1, 1, 0 ));
-DoWhile( new DoWhileObject( 1000, 1000, 0 ));
-DoWhile( new DoWhileObject( 1001, 1001, 0 ));
-DoWhile( new DoWhileObject( 1002, 1001, 1 ));
-DoWhile( new DoWhileObject( -1, 1001, -1002 ));
-
-test();
-
-function DoWhileObject( value, iterations, endvalue ) {
-  this.value = value;
-  this.iterations = iterations;
-  this.endvalue = endvalue;
-}
-
-function DoWhile( object ) {
-  var i = 0;
-
-  do {
-    object.value =  --object.value;
-    i++;
-    if ( i > 1000 )
-      break;
-  } while( object.value );
-
-  new TestCase(
-    SECTION,
-    "loop iterations",
-    object.iterations,
-    i
-    );
-
-  new TestCase(
-    SECTION,
-    "object.value",
-    object.endvalue,
-    Number( object.value )
-    );
-
-}
deleted file mode 100644
index e2b7f4de99b53c54df059a4e92ca524cd9878d59..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/dowhile-004.js
+++ /dev/null
@@ -1,67 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          dowhile-004
- *  ECMA Section:
- *  Description:        do...while statements
- *
- *  Test a labeled do...while.  Break out of the loop with no label
- *  should break out of the loop, but not out of the label.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "dowhile-004";
-var VERSION = "ECMA_2";
-var TITLE   = "do...while with a labeled continue statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DoWhile( 0, 1 );
-DoWhile( 1, 1 );
-DoWhile( -1, 1 );
-DoWhile( 5, 5 );
-
-test();
-
-function DoWhile( limit, expect ) {
-  i = 0;
-  result1 = "pass";
-  result2 = "failed: broke out of labeled statement unexpectedly";
-
-foo: {
-    do {
-      i++;
-      if ( ! (i < limit) ) {
-	break;
-	result1 = "fail: evaluated statement after a labeled break";
-      }
-    } while ( true );
-
-    result2 = "pass";
-  }
-
-  new TestCase(
-    SECTION,
-    "do while ( " + i +" < " + limit +" )",
-    expect,
-    i );
-
-  new TestCase(
-    SECTION,
-    "breaking out of a do... while loop",
-    "pass",
-    result1 );
-
-
-  new TestCase(
-    SECTION,
-    "breaking out of a labeled do...while loop",
-    "pass",
-    result2 );
-}
deleted file mode 100644
index 3e1e3c360f294c87ce6f2ddd74357e174153ce5f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/dowhile-005.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          dowhile-005
- *  ECMA Section:
- *  Description:        do...while statements
- *
- *  Test a labeled do...while.  Break out of the loop with no label
- *  should break out of the loop, but not out of the label.
- *
- *  Currently causes an infinite loop in the monkey.  Uncomment the
- *  print statement below and it works OK.
- *
- *  Author:             christine@netscape.com
- *  Date:               26 August 1998
- */
-var SECTION = "dowhile-005";
-var VERSION = "ECMA_2";
-var TITLE   = "do...while with a labeled continue statement";
-var BUGNUMBER = "316293";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-NestedLabel();
-
-
-test();
-
-function NestedLabel() {
-  i = 0;
-  result1 = "pass";
-  result2 = "fail: did not hit code after inner loop";
-  result3 = "pass";
-
-outer: {
-    do {
-    inner: {
-//                    print( i );
-	break inner;
-	result1 = "fail: did break out of inner label";
-      }
-      result2 = "pass";
-      break outer;
-      print(i);
-    } while ( i++ < 100 );
-
-  }
-
-  result3 = "fail: did not break out of outer label";
-
-  new TestCase(
-    SECTION,
-    "number of loop iterations",
-    0,
-    i );
-
-  new TestCase(
-    SECTION,
-    "break out of inner loop",
-    "pass",
-    result1 );
-
-  new TestCase(
-    SECTION,
-    "break out of outer loop",
-    "pass",
-    result2 );
-}
deleted file mode 100644
index 7ab5fde070571e7caa03a24269f94f48da7076e1..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/dowhile-006.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          dowhile-006
- *  ECMA Section:
- *  Description:        do...while statements
- *
- *  A general do...while test.
- *
- *  Author:             christine@netscape.com
- *  Date:               26 August 1998
- */
-var SECTION = "dowhile-006";
-var VERSION = "ECMA_2";
-var TITLE   = "do...while";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DoWhile( new DoWhileObject( false, false, 10 ) );
-DoWhile( new DoWhileObject( true, false, 2 ) );
-DoWhile( new DoWhileObject( false, true, 3 ) );
-DoWhile( new DoWhileObject( true, true, 4 ) );
-
-test();
-
-function looping( object ) {
-  object.iterations--;
-
-  if ( object.iterations <= 0 ) {
-    return false;
-  } else {
-    return true;
-  }
-}
-function DoWhileObject( breakOut, breakIn, iterations, loops ) {
-  this.iterations = iterations;
-  this.loops = loops;
-  this.breakOut = breakOut;
-  this.breakIn  = breakIn;
-  this.looping  = looping;
-}
-function DoWhile( object ) {
-  var result1 = false;
-  var result2 = false;
-
-outie: {
-  innie: {
-      do {
-	if ( object.breakOut )
-	  break outie;
-
-	if ( object.breakIn )
-	  break innie;
-
-      } while ( looping(object) );
-
-      //  statements should be executed if:
-      //  do...while exits normally
-      //  do...while exits abruptly with no label
-
-      result1 = true;
-
-    }
-
-//  statements should be executed if:
-//  do...while breaks out with label "innie"
-//  do...while exits normally
-//  do...while does not break out with "outie"
-
-    result2 = true;
-  }
-
-  new TestCase(
-    SECTION,
-    "hit code after loop in inner loop",
-    ( object.breakIn || object.breakOut ) ? false : true ,
-    result1 );
-
-  new TestCase(
-    SECTION,
-    "hit code after loop in outer loop",
-    ( object.breakOut ) ? false : true,
-    result2 );
-}
deleted file mode 100644
index 6e4eae5cd16fa481ce41886a094ae1193b2930f3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/dowhile-007.js
+++ /dev/null
@@ -1,97 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          dowhile-007
- *  ECMA Section:
- *  Description:        do...while statements
- *
- *  A general do...while test.
- *
- *  Author:             christine@netscape.com
- *  Date:               26 August 1998
- */
-var SECTION = "dowhile-007";
-var VERSION = "ECMA_2";
-var TITLE   = "do...while";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DoWhile( new DoWhileObject( false, false, false, false ));
-DoWhile( new DoWhileObject( true, false, false, false ));
-DoWhile( new DoWhileObject( true, true, false, false ));
-DoWhile( new DoWhileObject( true, true, true, false ));
-DoWhile( new DoWhileObject( true, true, true, true ));
-DoWhile( new DoWhileObject( false, false, false, true ));
-DoWhile( new DoWhileObject( false, false, true, true ));
-DoWhile( new DoWhileObject( false, true, true, true ));
-DoWhile( new DoWhileObject( false, false, true, false ));
-
-test();
-
-function DoWhileObject( out1, out2, out3, in1 ) {
-  this.breakOutOne = out1;
-  this.breakOutTwo = out2;
-  this.breakOutThree = out3;
-  this.breakIn = in1;
-}
-function DoWhile( object ) {
-  result1 = false;
-  result2 = false;
-  result3 = false;
-  result4 = false;
-
-outie:
-  do {
-    if ( object.breakOutOne ) {
-      break outie;
-    }
-    result1 = true;
-
-  innie:
-    do {
-      if ( object.breakOutTwo ) {
-	break outie;
-      }
-      result2 = true;
-
-      if ( object.breakIn ) {
-	break innie;
-      }
-      result3 = true;
-
-    } while ( false );
-    if ( object.breakOutThree ) {
-      break outie;
-    }
-    result4 = true;
-  } while ( false );
-
-  new TestCase(
-    SECTION,
-    "break one: ",
-    (object.breakOutOne) ? false : true,
-    result1 );
-
-  new TestCase(
-    SECTION,
-    "break two: ",
-    (object.breakOutOne||object.breakOutTwo) ? false : true,
-    result2 );
-
-  new TestCase(
-    SECTION,
-    "break three: ",
-    (object.breakOutOne||object.breakOutTwo||object.breakIn) ? false : true,
-    result3 );
-
-  new TestCase(
-    SECTION,
-    "break four: ",
-    (object.breakOutOne||object.breakOutTwo||object.breakOutThree) ? false: true,
-    result4 );
-}
deleted file mode 100644
index 8ab757348fe2a72cf382c4fdf4aaffb7d1fbe7af..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-001.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-001
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  Call error.
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-001";
-var VERSION = "js1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions:  CallError";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-Call_1();
-
-test();
-
-function Call_1() {
-  result = "failed: no exception thrown";
-  exception = null;
-
-  try {
-    Math();
-  } catch ( e ) {
-    result = "passed:  threw exception",
-      exception = e.toString();
-  } finally {
-    new TestCase(
-      SECTION,
-      "Math() [ exception is " + exception +" ]",
-      "passed:  threw exception",
-      result );
-  }
-}
-
deleted file mode 100644
index 2a03114aa34971b4bab34be4985c222a69e171fa..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-002.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-002
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  Construct error.
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-002";
-var VERSION = "js1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions: ConstructError";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-Construct_1();
-
-test();
-
-function Construct_1() {
-  result = "failed: no exception thrown";
-  exception = null;
-
-  try {
-    result = new Math();
-  } catch ( e ) {
-    result = "passed:  threw exception",
-      exception = e.toString();
-  } finally {
-    new TestCase(
-      SECTION,
-      "new Math() [ exception is " + exception +" ]",
-      "passed:  threw exception",
-      result );
-  }
-}
-
deleted file mode 100644
index f7fe5ad49b047e9d21df6a68485602b5fa80e5fc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-003.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-003
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  Target error.
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-003";
-var VERSION = "js1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions: TargetError";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-Target_1();
-
-test();
-
-function Target_1() {
-  result = "failed: no exception thrown";
-  exception = null;
-
-  try {
-    string = new String("hi");
-    string.toString = Boolean.prototype.toString;
-    string.toString();
-  } catch ( e ) {
-    result = "passed:  threw exception",
-      exception = e.toString();
-  } finally {
-    new TestCase(
-      SECTION,
-      "string = new String(\"hi\");"+
-      "string.toString = Boolean.prototype.toString" +
-      "string.toString() [ exception is " + exception +" ]",
-      "passed:  threw exception",
-      result );
-  }
-}
-
deleted file mode 100644
index c8b2db4aad276c6a2ce96e58306b214ca8c2a35a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-004.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-004
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  ToObject error.
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-004";
-var VERSION = "js1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions: ToObjectError";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-ToObject_1();
-
-test();
-
-function ToObject_1() {
-  result = "failed: no exception thrown";
-  exception = null;
-
-  try {
-    result = foo["bar"];
-  } catch ( e ) {
-    result = "passed:  threw exception",
-      exception = e.toString();
-  } finally {
-    new TestCase(
-      SECTION,
-      "foo[\"bar\"] [ exception is " + exception +" ]",
-      "passed:  threw exception",
-      result );
-  }
-}
-
deleted file mode 100644
index 7bb22fc467a9c75fc8dcdcef3e7ce6f17305f212..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-005.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-005
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  ToObject error.
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-005";
-var VERSION = "js1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions: ToObjectError";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-ToObject_1();
-
-test();
-
-function ToObject_1() {
-  result = "failed: no exception thrown";
-  exception = null;
-
-  try {
-    result = foo["bar"];
-  } catch ( e ) {
-    result = "passed:  threw exception",
-      exception = e.toString();
-  } finally {
-    new TestCase(
-      SECTION,
-      "foo[\"bar\"] [ exception is " + exception +" ]",
-      "passed:  threw exception",
-      result );
-  }
-}
-
deleted file mode 100644
index 6413d212c5b6e39c3a490590cb5c06cfdad69b46..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-006.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-006
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  ToPrimitive error.
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-006";
-var VERSION = "js1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions: TypeError";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-ToPrimitive_1();
-
-test();
-
-
-/**
- * Getting the [[DefaultValue]] of any instances of MyObject
- * should result in a runtime error in ToPrimitive.
- */
-
-function MyObject() {
-  this.toString = void 0;
-  this.valueOf = void 0;
-}
-
-function ToPrimitive_1() {
-  result = "failed: no exception thrown";
-  exception = null;
-
-  try {
-    result = new MyObject() + new MyObject();
-  } catch ( e ) {
-    result = "passed:  threw exception",
-      exception = e.toString();
-  } finally {
-    new TestCase(
-      SECTION,
-      "new MyObject() + new MyObject() [ exception is " + exception +" ]",
-      "passed:  threw exception",
-      result );
-  }
-}
-
deleted file mode 100644
index 163354107106e1edded8bcad68be50472d9f090d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-007.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-007
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  DefaultValue error.
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-007";
-var VERSION = "js1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions:  TypeError";
-var BUGNUMBER="318250";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DefaultValue_1();
-
-test();
-
-
-/**
- * Getting the [[DefaultValue]] of any instances of MyObject
- * should result in a runtime error in ToPrimitive.
- */
-
-function MyObject() {
-  this.toString = void 0;
-  this.valueOf = new Object();
-}
-
-function DefaultValue_1() {
-  result = "failed: no exception thrown";
-  exception = null;
-
-  try {
-    result = new MyObject() + new MyObject();
-  } catch ( e ) {
-    result = "passed:  threw exception",
-      exception = e.toString();
-  } finally {
-    new TestCase(
-      SECTION,
-      "new MyObject() + new MyObject() [ exception is " + exception +" ]",
-      "passed:  threw exception",
-      result );
-  }
-}
-
deleted file mode 100644
index 9e6209ca559176801ced6461aa9b9f0e425e4bce..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-008.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-008
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  SyntaxError.
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-008";
-var VERSION = "js1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions: SyntaxError";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-Syntax_1();
-
-test();
-
-function Syntax_1() {
-  result = "failed: no exception thrown";
-  exception = null;
-
-  try {
-    result = eval("continue;");
-  } catch ( e ) {
-    result = "passed:  threw exception",
-      exception = e.toString();
-  } finally {
-    new TestCase(
-      SECTION,
-      "eval(\"continue\") [ exception is " + exception +" ]",
-      "passed:  threw exception",
-      result );
-  }
-}
deleted file mode 100644
index d53a931f8fb59f88eca6725b946088ccb6b25fbd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-009.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          exception-009
- *  ECMA Section:
- *  Description:        Tests for JavaScript Standard Exceptions
- *
- *  Regression test for nested try blocks.
- *
- *  http://scopus.mcom.com/bugsplat/show_bug.cgi?id=312964
- *
- *  Author:             christine@netscape.com
- *  Date:               31 August 1998
- */
-var SECTION = "exception-009";
-var VERSION = "JS1_4";
-var TITLE   = "Tests for JavaScript Standard Exceptions: SyntaxError";
-var BUGNUMBER= "312964";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-try {
-  expect = "passed:  no exception thrown";
-  result = expect;
-  Nested_1();
-} catch ( e ) {
-  result = "failed: threw " + e;
-} finally {
-  new TestCase(
-    SECTION,
-    "nested try",
-    expect,
-    result );
-}
-
-
-test();
-
-function Nested_1() {
-  try {
-    try {
-    } catch (a) {
-    } finally {
-    }
-  } catch (b) {
-  } finally {
-  }
-}
deleted file mode 100644
index d6bb139bdc18614dd026a7afe89baec814b4d603..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-010-n.js
+++ /dev/null
@@ -1,25 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-var SECTION = "exception-010";
-var VERSION = "ECMA_2";
-startTest();
-var TITLE   = "Don't Crash throwing null";
-
-writeHeaderToLog( SECTION + " "+ TITLE);
-print("Null throw test.");
-print("BUGNUMBER: 21799");
-
-DESCRIPTION = "throw null";
-EXPECTED = "error";
-
-new TestCase( SECTION,  "throw null",     "error",    eval("throw null" ));
-
-test();
-
-print("FAILED!: Should have exited with uncaught exception.");
-
-
deleted file mode 100644
index 8397356dc8f41ffc250635ba4bddcfc1ea417b31..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exception-011-n.js
+++ /dev/null
@@ -1,26 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-var SECTION = "exception-011";
-var VERSION = "ECMA_2";
-startTest();
-var TITLE   = "Don't Crash throwing undefined";
-
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-print("Undefined throw test.");
-
-DESCRIPTION = "throw undefined";
-EXPECTED = "error";
-
-new TestCase( SECTION,  "throw undefined",  "error", eval("throw (void 0)") );
-
-test();
-
-print("FAILED!: Should have exited with uncaught exception.");
-
-
-
deleted file mode 100644
index bb8d1ab9678f78bbefa6ea0bc9ce0e749117b10a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/exec-002.js
+++ /dev/null
@@ -1,188 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/exec-002.js
- *  ECMA Section:       15.7.5.3
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Test cases provided by rogerl@netscape.com
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/exec-002";
-var VERSION = "ECMA_2";
-var TITLE   = "RegExp.prototype.exec(string)";
-
-startTest();
-
-/*
- * for each test case, verify:
- * - type of object returned
- * - length of the returned array
- * - value of lastIndex
- * - value of index
- * - value of input
- * - value of the array indices
- */
-
-AddRegExpCases(
-  /(a|d|q|)x/i,
-  "bcaDxqy",
-  3,
-  ["Dx", "D"] );
-
-AddRegExpCases(
-  /(a|(e|q))(x|y)/,
-  "bcaddxqy",
-  6,
-  ["qy","q","q","y"] );
-
-
-AddRegExpCases(
-  /a+b+d/,
-  "aabbeeaabbs",
-  0,
-  null );
-
-AddRegExpCases(
-  /a*b/,
-  "aaadaabaaa",
-  4,
-  ["aab"] );
-
-AddRegExpCases(
-  /a*b/,
-  "dddb",
-  3,
-  ["b"] );
-
-AddRegExpCases(
-  /a*b/,
-  "xxx",
-  0,
-  null );
-
-AddRegExpCases(
-  /x\d\dy/,
-  "abcx45ysss235",
-  3,
-  ["x45y"] );
-
-AddRegExpCases(
-  /[^abc]def[abc]+/,
-  "abxdefbb",
-  2,
-  ["xdefbb"] );
-
-AddRegExpCases(
-  /(a*)baa/,
-  "ccdaaabaxaabaa",
-  9,
-  ["aabaa", "aa"] );
-
-AddRegExpCases(
-  /(a*)baa/,
-  "aabaa",
-  0,
-  ["aabaa", "aa"] );
-
-AddRegExpCases(
-  /q(a|b)*q/,
-  "xxqababqyy",
-  2,
-  ["qababq", "b"] );
-
-AddRegExpCases(
-  /(a(.|[^d])c)*/,
-  "adcaxc",
-  0,
-  ["adcaxc", "axc", "x"] );
-
-AddRegExpCases(
-  /(a*)b\1/,
-  "abaaaxaabaayy",
-  0,
-  ["aba", "a"] );
-
-AddRegExpCases(
-  /(a*)b\1/,
-  "abaaaxaabaayy",
-  0,
-  ["aba", "a"] );
-
-AddRegExpCases(
-  /(a*)b\1/,
-  "cccdaaabaxaabaayy",
-  6,
-  ["aba", "a"] );
-
-AddRegExpCases(
-  /(a*)b\1/,
-  "cccdaaabqxaabaayy",
-  7,
-  ["b", ""] );
-
-AddRegExpCases(
-  /"(.|[^"\\\\])*"/,
-        'xx\"makudonarudo\"yy',
-        2,
-        ["\"makudonarudo\"", "o"] );
-
-    AddRegExpCases(
-        /"(.|[^"\\\\])*"/,
-	      "xx\"ma\"yy",
-	      2,
-	      ["\"ma\"", "a"] );
-
-	   test();
-
-	   function AddRegExpCases(
-	     regexp, pattern, index, matches_array ) {
-
-// prevent a runtime error
-
-	     if ( regexp.exec(pattern) == null || matches_array == null ) {
-	       AddTestCase(
-		 regexp + ".exec(" + pattern +")",
-		 matches_array,
-		 regexp.exec(pattern) );
-
-	       return;
-	     }
-	     AddTestCase(
-	       regexp + ".exec(" + pattern +").length",
-	       matches_array.length,
-	       regexp.exec(pattern).length );
-
-	     AddTestCase(
-	       regexp + ".exec(" + pattern +").index",
-	       index,
-	       regexp.exec(pattern).index );
-
-	     AddTestCase(
-	       regexp + ".exec(" + pattern +").input",
-	       pattern,
-	       regexp.exec(pattern).input );
-
-	     AddTestCase(
-	       regexp + ".exec(" + pattern +").toString()",
-	       matches_array.toString(),
-	       regexp.exec(pattern).toString() );
-/*
-  var limit = matches_array.length > regexp.exec(pattern).length
-  ? matches_array.length
-  : regexp.exec(pattern).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-  AddTestCase(
-  regexp + ".exec(" + pattern +")[" + matches +"]",
-  matches_array[matches],
-  regexp.exec(pattern)[matches] );
-  }
-*/
-	   }
deleted file mode 100644
index bbc38b49e83cc5ec1f2c0641e99f6be1bf4db9a8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-001.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-001.js
-   Corresponds to:     ecma/Expressions/11.12-2-n.js
-   ECMA Section:       11.12
-   Description:
-
-   The grammar for a ConditionalExpression in ECMAScript is a little bit
-   different from that in C and Java, which each allow the second
-   subexpression to be an Expression but restrict the third expression to
-   be a ConditionalExpression.  The motivation for this difference in
-   ECMAScript is to allow an assignment expression to be governed by either
-   arm of a conditional and to eliminate the confusing and fairly useless
-   case of a comma expression as the center expression.
-
-   Author:             christine@netscape.com
-   Date:               09 september 1998
-*/
-var SECTION = "expression-001";
-var VERSION = "JS1_4";
-var TITLE   = "Conditional operator ( ? : )"
-  startTest();
-writeHeaderToLog( SECTION + " " + TITLE );
-
-// the following expression should be an error in JS.
-
-var result = "Failed"
-  var exception = "No exception was thrown";
-
-try {
-  eval("var MY_VAR = true ? \"EXPR1\", \"EXPR2\" : \"EXPR3\"");
-} catch ( e ) {
-  result = "Passed";
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "comma expression in a conditional statement "+
-  "(threw "+ exception +")",
-  "Passed",
-  result );
-
-
-test();
deleted file mode 100644
index a4cf82517a8870c0e15aefd19ea5d46a4e8b34bf..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-002.js
+++ /dev/null
@@ -1,60 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expressions-002.js
-   Corresponds to:     ecma/Expressions/11.2.1-3-n.js
-   ECMA Section:       11.2.1 Property Accessors
-   Description:
-
-   Try to access properties of an object whose value is undefined.
-
-   Author:             christine@netscape.com
-   Date:               09 september 1998
-*/
-var SECTION = "expressions-002.js";
-var VERSION = "JS1_4";
-var TITLE   = "Property Accessors";
-writeHeaderToLog( SECTION + " "+TITLE );
-
-startTest();
-
-// go through all Native Function objects, methods, and properties and get their typeof.
-
-var PROPERTY = new Array();
-var p = 0;
-
-// try to access properties of primitive types
-
-OBJECT = new Property(  "undefined",    void 0,   "undefined",   NaN );
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = OBJECT.value.valueOf();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-
-new TestCase(
-  SECTION,
-  "Get the value of an object whose value is undefined "+
-  "(threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function Property( object, value, string, number ) {
-  this.object = object;
-  this.string = String(value);
-  this.number = Number(value);
-  this.valueOf = value;
-}
deleted file mode 100644
index dc2656b14bf3bc14b01d1945d35c943063c2e4d6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-003.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expressions-003.js
-   Corresponds to:     ecma/Expressions/11.2.1-3-n.js
-   ECMA Section:       11.2.1 Property Accessors
-   Description:
-
-   Try to access properties of an object whose value is undefined.
-
-   Author:             christine@netscape.com
-   Date:               09 september 1998
-*/
-var SECTION = "expressions-003.js";
-var VERSION = "JS1_4";
-var TITLE   = "Property Accessors";
-writeHeaderToLog( SECTION + " "+TITLE );
-
-startTest();
-
-// try to access properties of primitive types
-
-OBJECT = new Property(  "undefined",    void 0,   "undefined",   NaN );
-
-var result    = "Failed";
-var exception = "No exception thrown";
-var expect    = "Passed";
-
-try {
-  result = OBJECT.value.toString();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-
-new TestCase(
-  SECTION,
-  "Get the toString value of an object whose value is undefined "+
-  "(threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function Property( object, value, string, number ) {
-  this.object = object;
-  this.string = String(value);
-  this.number = Number(value);
-  this.value = value;
-}
deleted file mode 100644
index 2a5ba62ca9bb7bbb0d238ede3f9f18bfde38c89b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-004.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-004.js
-   Corresponds To:     11.2.1-4-n.js
-   ECMA Section:       11.2.1 Property Accessors
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               09 september 1998
-*/
-var SECTION = "expression-004";
-var VERSION = "JS1_4";
-var TITLE   = "Property Accessors";
-writeHeaderToLog( SECTION + " "+TITLE );
-startTest();
-
-var OBJECT = new Property( "null", null, "null", 0 );
-
-var result    = "Failed";
-var exception = "No exception thrown";
-var expect    = "Passed";
-
-try {
-  result = OBJECT.value.toString();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "Get the toString value of an object whose value is null "+
-  "(threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function Property( object, value, string, number ) {
-  this.object = object;
-  this.string = String(value);
-  this.number = Number(value);
-  this.value = value;
-}
deleted file mode 100644
index 16c76c4bf70218318d8e3d56d62a1f949fb366c2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-005.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-005.js
-   Corresponds To:     11.2.2-10-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-
-var SECTION = "expression-005";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var expect = "Passed";
-var exception = "No exception thrown";
-
-try {
-  result = new Math();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "result= new Math() (threw " + exception + ")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index d19dd551a8d26becf3efb5d3867e9dc4cc9e56c6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-006.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-006.js
-   Corresponds to:     11.2.2-1-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-
-   http://scopus/bugsplat/show_bug.cgi?id=327765
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-006.js";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-var BUGNUMBER="327765";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var OBJECT = new Object();
-  result = new OBJECT();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "OBJECT = new Object; result = new OBJECT()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 39c1bbdedc646eceaf3a19d9e7b7ec56770932c7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-007.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-007.js
-   Corresponds To:     11.2.2-2-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-007";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  UNDEFINED = void 0;
-  result = new UNDEFINED();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "UNDEFINED = void 0; result = new UNDEFINED()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index f09c68a792ac9181f4be0977fd7a753f1c417fe0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-008.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-008
-   Corresponds To:     11.2.2-3-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-008";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var NULL = null;
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = new NULL();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "NULL = null; result = new NULL()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 392209cb016b9160ae3878ab88d350a07f9f1307..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-009.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-009
-   Corresponds to:     ecma/Expressions/11.2.2-4-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-009";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var STRING = "";
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = new STRING();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "STRING = ''; result = new STRING()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 988918403d223d43870d24304b8f5479ef43e1c4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-010.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-010.js
-   Corresponds To:     11.2.2-5-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-010";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var NUMBER = 0;
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = new NUMBER();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "NUMBER=0, result = new NUMBER()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index b61edd52d2096810afab769b198edb0674802dc6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-011.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-011.js
-   Corresponds To:     ecma/Expressions/11.2.2-6-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-011";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var BOOLEAN  = true;
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var OBJECT = new BOOLEAN();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "BOOLEAN = true; result = new BOOLEAN()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index b2a72d1f0a67f74ca7dc745720b85d5d532efbd4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-012.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-012.js
-   Corresponds To:     ecma/Expressions/11.2.2-6-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-   http://scopus/bugsplat/show_bug.cgi?id=327765
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-012";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-var BUGNUMBER= "327765";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var STRING = new String("hi");
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = new STRING();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "STRING = new String(\"hi\"); result = new STRING()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 2c33b5a9c52282454cac85de0787e40eaa58d4d7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-013.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-013.js
-   Corresponds To:     ecma/Expressions/11.2.2-8-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-013";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-var BUGNUMBER= "327765";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var NUMBER = new Number(1);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = new NUMBER();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "NUMBER = new Number(1); result = new NUMBER()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 80dbbd50cb112fdf4c2be739841958a57df43fc4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-014.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-014.js
-   Corresponds To:     ecma/Expressions/11.2.2-9-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-014.js";
-var VERSION = "ECMA_1";
-var TITLE   = "The new operator";
-var BUGNUMBER= "327765";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var BOOLEAN = new Boolean();
-
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = new BOOLEAN();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "BOOLEAN = new Boolean(); result = new BOOLEAN()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 87a6c892fbb55b76dcf2f4d93e8f614801940a1d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-015.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-015.js
-   Corresponds To:     ecma/Expressions/11.2.3-2-n.js
-   ECMA Section:       11.2.3. Function Calls
-   Description:
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-015";
-var VERSION = "JS1_4";
-var TITLE   = "Function Calls";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("result = 3.valueOf();");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "3.valueOf()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 0632656da96188c756632a945ea6330a1f3d6f31..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-016.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-016.js
-   Corresponds To:     ecma/Expressions/11.2.3-3-n.js
-   ECMA Section:       11.2.3. Function Calls
-   Description:
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-016";
-var VERSION = "JS1_4";
-var TITLE   = "Function Calls";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = (void 0).valueOf();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "(void 0).valueOf()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index afd2dc722533a71d2c89709da600c796a7ff2e15..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-017.js
+++ /dev/null
@@ -1,40 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-07.js
-   Corresponds To:     ecma/Expressions/11.2.3-4-n.js
-   ECMA Section:       11.2.3. Function Calls
-   Description:
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-017";
-var VERSION = "JS1_4";
-var TITLE   = "Function Calls";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = nullvalueOf();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "null.valueOf()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index ffa699e488bb803d2ad72111d117148a4f1de846..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/expression-019.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          expression-019.js
-   Corresponds To:     11.2.2-7-n.js
-   ECMA Section:       11.2.2. The new operator
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "expression-019";
-var VERSION = "JS1_4";
-var TITLE   = "The new operator";
-var BUGNUMBER= "327765";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var STRING = new String("hi");
-  result = new STRING();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var STRING = new String(\"hi\"); result = new STRING();" +
-  " (threw " + exception + ")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index b7b533165315ef7ab7dde0445a9d1f5f0d98cf16..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/forin-001.js
+++ /dev/null
@@ -1,297 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          forin-001.js
- *  ECMA Section:
- *  Description:        The forin-001 statement
- *
- *  Verify that the property name is assigned to the property on the left
- *  hand side of the for...in expression.
- *
- *  Author:             christine@netscape.com
- *  Date:               28 August 1998
- */
-var SECTION = "forin-001";
-var VERSION = "ECMA_2";
-var TITLE   = "The for...in  statement";
-var BUGNUMBER="330890";
-var BUGNUMBER="http://scopus.mcom.com/bugsplat/show_bug.cgi?id=344855";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-ForIn_1( { length:4, company:"netscape", year:2000, 0:"zero" } );
-ForIn_2( { length:4, company:"netscape", year:2000, 0:"zero" } );
-ForIn_3( { length:4, company:"netscape", year:2000, 0:"zero" } );
-
-//    ForIn_6({ length:4, company:"netscape", year:2000, 0:"zero" });
-//    ForIn_7({ length:4, company:"netscape", year:2000, 0:"zero" });
-ForIn_8({ length:4, company:"netscape", year:2000, 0:"zero" });
-
-test();
-
-/**
- *  Verify that the left side argument is evaluated with every iteration.
- *  Verify that the name of each property of the object is assigned to a
- *  a property.
- *
- */
-function ForIn_1( object ) {
-  PropertyArray = new Array();
-  ValueArray = new Array();
-
-  for ( PropertyArray[PropertyArray.length] in object ) {
-    ValueArray[ValueArray.length] =
-      object[PropertyArray[PropertyArray.length-1]];
-  }
-
-  for ( var i = 0; i < PropertyArray.length; i++ ) {
-    new TestCase(
-      SECTION,
-      "object[" + PropertyArray[i] +"]",
-      object[PropertyArray[i]],
-      ValueArray[i]
-      );
-  }
-
-  new TestCase(
-    SECTION,
-    "object.length",
-    PropertyArray.length,
-    object.length );
-}
-
-/**
- *  Similar to ForIn_1, except it should increment the counter variable
- *  every time the left hand expression is evaluated.
- */
-function ForIn_2( object ) {
-  PropertyArray = new Array();
-  ValueArray = new Array();
-  var i = 0;
-
-  for ( PropertyArray[i++] in object ) {
-    ValueArray[ValueArray.length] =
-      object[PropertyArray[PropertyArray.length-1]];
-  }
-
-  for ( i = 0; i < PropertyArray.length; i++ ) {
-    new TestCase(
-      SECTION,
-      "object[" + PropertyArray[i] +"]",
-      object[PropertyArray[i]],
-      ValueArray[i]
-      );
-  }
-
-  new TestCase(
-    SECTION,
-    "object.length",
-    PropertyArray.length,
-    object.length );
-}
-
-/**
- *  Break out of a for...in loop
- *
- *
- */
-function ForIn_3( object ) {
-  var checkBreak = "pass";
-  var properties = new Array();
-  var values = new Array();
-
-  for ( properties[properties.length] in object ) {
-    values[values.length] = object[properties[properties.length-1]];
-    break;
-    checkBreak = "fail";
-  }
-
-  new TestCase(
-    SECTION,
-    "check break out of for...in",
-    "pass",
-    checkBreak );
-
-  new TestCase(
-    SECTION,
-    "properties.length",
-    1,
-    properties.length );
-
-  new TestCase(
-    SECTION,
-    "object["+properties[0]+"]",
-    values[0],
-    object[properties[0]] );
-}
-
-/**
- *  Break out of a labeled for...in loop.
- */
-function ForIn_4( object ) {
-  var result1 = 0;
-  var result2 = 0;
-  var result3 = 0;
-  var result4 = 0;
-  var i = 0;
-  var property = new Array();
-
-butterbean: {
-    result1++;
-
-    for ( property[i++] in object ) {
-      result2++;
-      break;
-      result4++;
-    }
-    result3++;
-  }
-
-  new TestCase(
-    SECTION,
-    "verify labeled statement is only executed once",
-    true,
-    result1 == 1 );
-
-  new TestCase(
-    SECTION,
-    "verify statements in for loop are evaluated",
-    true,
-    result2 == i );
-
-  new TestCase(
-    SECTION,
-    "verify break out of labeled for...in loop",
-    true,
-    result4 == 0 );
-
-  new TestCase(
-    SECTION,
-    "verify break out of labeled block",
-    true,
-    result3 == 0 );
-}
-
-/**
- *  Labeled break out of a labeled for...in loop.
- */
-function ForIn_5 (object) {
-  var result1 = 0;
-  var result2 = 0;
-  var result3 = 0;
-  var result4 = 0;
-  var i = 0;
-  var property = new Array();
-
-bigredbird: {
-    result1++;
-    for ( property[i++] in object ) {
-      result2++;
-      break bigredbird;
-      result4++;
-    }
-    result3++;
-  }
-
-  new TestCase(
-    SECTION,
-    "verify labeled statement is only executed once",
-    true,
-    result1 == 1 );
-
-  new TestCase(
-    SECTION,
-    "verify statements in for loop are evaluated",
-    true,
-    result2 == i );
-
-  new TestCase(
-    SECTION,
-    "verify break out of labeled for...in loop",
-    true,
-    result4 == 0 );
-
-  new TestCase(
-    SECTION,
-    "verify break out of labeled block",
-    true,
-    result3 == 0 );
-}
-
-/**
- *  Labeled continue from a labeled for...in loop
- */
-function ForIn_7( object ) {
-  var result1 = 0;
-  var result2 = 0;
-  var result3 = 0;
-  var result4 = 0;
-  var i = 0;
-  var property = new Array();
-
-bigredbird:
-  for ( property[i++] in object ) {
-    result2++;
-    continue bigredbird;
-    result4++;
-  }
-
-  new TestCase(
-    SECTION,
-    "verify statements in for loop are evaluated",
-    true,
-    result2 == i );
-
-  new TestCase(
-    SECTION,
-    "verify break out of labeled for...in loop",
-    true,
-    result4 == 0 );
-
-  new TestCase(
-    SECTION,
-    "verify break out of labeled block",
-    true,
-    result3 == 1 );
-}
-
-
-/**
- *  continue in a for...in loop
- *
- */
-function ForIn_8( object ) {
-  var checkBreak = "pass";
-  var properties = new Array();
-  var values = new Array();
-
-  for ( properties[properties.length] in object ) {
-    values[values.length] = object[properties[properties.length-1]];
-    break;
-    checkBreak = "fail";
-  }
-
-  new TestCase(
-    SECTION,
-    "check break out of for...in",
-    "pass",
-    checkBreak );
-
-  new TestCase(
-    SECTION,
-    "properties.length",
-    1,
-    properties.length );
-
-  new TestCase(
-    SECTION,
-    "object["+properties[0]+"]",
-    values[0],
-    object[properties[0]] );
-}
-
deleted file mode 100644
index 3c83f781854050e9d1bac3b4068ee9f62065e5de..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/forin-002.js
+++ /dev/null
@@ -1,77 +0,0 @@
-// |reftest| skip-if(Android) -- bug - nsIDOMWindow.crypto throws NS_ERROR_NOT_IMPLEMENTED on Android
-/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          forin-002.js
- *  ECMA Section:
- *  Description:        The forin-001 statement
- *
- *  Verify that the property name is assigned to the property on the left
- *  hand side of the for...in expression.
- *
- *  Author:             christine@netscape.com
- *  Date:               28 August 1998
- */
-var SECTION = "forin-002";
-var VERSION = "ECMA_2";
-var TITLE   = "The for...in  statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-function MyObject( value ) {
-  this.value = value;
-  this.valueOf = new Function ( "return this.value" );
-  this.toString = new Function ( "return this.value + \"\"" );
-  this.toNumber = new Function ( "return this.value + 0" );
-  this.toBoolean = new Function ( "return Boolean( this.value )" );
-}
-
-ForIn_1(this);
-ForIn_2(this);
-
-ForIn_1(new MyObject(true));
-ForIn_2(new MyObject(new Boolean(true)));
-
-ForIn_2(3);
-
-test();
-
-/**
- *  For ... In in a With Block
- *
- */
-function ForIn_1( object) {
-  with ( object ) {
-    for ( property in object ) {
-      new TestCase(
-	SECTION,
-	"with loop in a for...in loop.  ("+object+")["+property +"] == "+
-	"eval ( " + property +" )",
-	true,
-	object[property] == eval(property) );
-    }
-  }
-}
-
-/**
- *  With block in a For...In loop
- *
- */
-function ForIn_2(object) {
-  for ( property in object ) {
-    with ( object ) {
-      new TestCase(
-	SECTION,
-	"with loop in a for...in loop.  ("+object+")["+property +"] == "+
-	"eval ( " + property +" )",
-	true,
-	object[property] == eval(property) );
-    }
-  }
-}
-
new file mode 100644
index 0000000000000000000000000000000000000000..575fe6b7a6599f26fb3f5705dda41afa18b2ceea
GIT binary patch
literal 3462063
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/frameworks/angular-1.2.js
@@ -0,0 +1,20369 @@
+/**
+ * @license AngularJS v1.2.5
+ * (c) 2010-2014 Google, Inc. http://angularjs.org
+ * License: MIT
+ */
+(function(window, document, undefined) {'use strict';
+
+/**
+ * @description
+ *
+ * This object provides a utility for producing rich Error messages within
+ * Angular. It can be called as follows:
+ *
+ * var exampleMinErr = minErr('example');
+ * throw exampleMinErr('one', 'This {0} is {1}', foo, bar);
+ *
+ * The above creates an instance of minErr in the example namespace. The
+ * resulting error will have a namespaced error code of example.one.  The
+ * resulting error will replace {0} with the value of foo, and {1} with the
+ * value of bar. The object is not restricted in the number of arguments it can
+ * take.
+ *
+ * If fewer arguments are specified than necessary for interpolation, the extra
+ * interpolation markers will be preserved in the final string.
+ *
+ * Since data will be parsed statically during a build step, some restrictions
+ * are applied with respect to how minErr instances are created and called.
+ * Instances should have names of the form namespaceMinErr for a minErr created
+ * using minErr('namespace') . Error codes, namespaces and template strings
+ * should all be static strings, not variables or general expressions.
+ *
+ * @param {string} module The namespace to use for the new minErr instance.
+ * @returns {function(string, string, ...): Error} instance
+ */
+
+function minErr(module) {
+  return function () {
+    var code = arguments[0],
+      prefix = '[' + (module ? module + ':' : '') + code + '] ',
+      template = arguments[1],
+      templateArgs = arguments,
+      stringify = function (obj) {
+        if (typeof obj === 'function') {
+          return obj.toString().replace(/ \{[\s\S]*$/, '');
+        } else if (typeof obj === 'undefined') {
+          return 'undefined';
+        } else if (typeof obj !== 'string') {
+          return JSON.stringify(obj);
+        }
+        return obj;
+      },
+      message, i;
+
+    message = prefix + template.replace(/\{\d+\}/g, function (match) {
+      var index = +match.slice(1, -1), arg;
+
+      if (index + 2 < templateArgs.length) {
+        arg = templateArgs[index + 2];
+        if (typeof arg === 'function') {
+          return arg.toString().replace(/ ?\{[\s\S]*$/, '');
+        } else if (typeof arg === 'undefined') {
+          return 'undefined';
+        } else if (typeof arg !== 'string') {
+          return toJson(arg);
+        }
+        return arg;
+      }
+      return match;
+    });
+
+    message = message + '\nhttp://errors.angularjs.org/1.2.5/' +
+      (module ? module + '/' : '') + code;
+    for (i = 2; i < arguments.length; i++) {
+      message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
+        encodeURIComponent(stringify(arguments[i]));
+    }
+
+    return new Error(message);
+  };
+}
+
+/* We need to tell jshint what variables are being exported */
+/* global
+    -angular,
+    -msie,
+    -jqLite,
+    -jQuery,
+    -slice,
+    -push,
+    -toString,
+    -ngMinErr,
+    -_angular,
+    -angularModule,
+    -nodeName_,
+    -uid,
+
+    -lowercase,
+    -uppercase,
+    -manualLowercase,
+    -manualUppercase,
+    -nodeName_,
+    -isArrayLike,
+    -forEach,
+    -sortedKeys,
+    -forEachSorted,
+    -reverseParams,
+    -nextUid,
+    -setHashKey,
+    -extend,
+    -int,
+    -inherit,
+    -noop,
+    -identity,
+    -valueFn,
+    -isUndefined,
+    -isDefined,
+    -isObject,
+    -isString,
+    -isNumber,
+    -isDate,
+    -isArray,
+    -isFunction,
+    -isRegExp,
+    -isWindow,
+    -isScope,
+    -isFile,
+    -isBoolean,
+    -trim,
+    -isElement,
+    -makeMap,
+    -map,
+    -size,
+    -includes,
+    -indexOf,
+    -arrayRemove,
+    -isLeafNode,
+    -copy,
+    -shallowCopy,
+    -equals,
+    -csp,
+    -concat,
+    -sliceArgs,
+    -bind,
+    -toJsonReplacer,
+    -toJson,
+    -fromJson,
+    -toBoolean,
+    -startingTag,
+    -tryDecodeURIComponent,
+    -parseKeyValue,
+    -toKeyValue,
+    -encodeUriSegment,
+    -encodeUriQuery,
+    -angularInit,
+    -bootstrap,
+    -snake_case,
+    -bindJQuery,
+    -assertArg,
+    -assertArgFn,
+    -assertNotHasOwnProperty,
+    -getter,
+    -getBlockElements,
+
+*/
+
+////////////////////////////////////
+
+/**
+ * @ngdoc function
+ * @name angular.lowercase
+ * @function
+ *
+ * @description Converts the specified string to lowercase.
+ * @param {string} string String to be converted to lowercase.
+ * @returns {string} Lowercased string.
+ */
+var lowercase = function(string){return isString(string) ? string.toLowerCase() : string;};
+
+
+/**
+ * @ngdoc function
+ * @name angular.uppercase
+ * @function
+ *
+ * @description Converts the specified string to uppercase.
+ * @param {string} string String to be converted to uppercase.
+ * @returns {string} Uppercased string.
+ */
+var uppercase = function(string){return isString(string) ? string.toUpperCase() : string;};
+
+
+var manualLowercase = function(s) {
+  /* jshint bitwise: false */
+  return isString(s)
+      ? s.replace(/[A-Z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) | 32);})
+      : s;
+};
+var manualUppercase = function(s) {
+  /* jshint bitwise: false */
+  return isString(s)
+      ? s.replace(/[a-z]/g, function(ch) {return String.fromCharCode(ch.charCodeAt(0) & ~32);})
+      : s;
+};
+
+
+// String#toLowerCase and String#toUpperCase don't produce correct results in browsers with Turkish
+// locale, for this reason we need to detect this case and redefine lowercase/uppercase methods
+// with correct but slower alternatives.
+if ('i' !== 'I'.toLowerCase()) {
+  lowercase = manualLowercase;
+  uppercase = manualUppercase;
+}
+
+
+var /** holds major version number for IE or NaN for real browsers */
+    msie,
+    jqLite,           // delay binding since jQuery could be loaded after us.
+    jQuery,           // delay binding
+    slice             = [].slice,
+    push              = [].push,
+    toString          = Object.prototype.toString,
+    ngMinErr          = minErr('ng'),
+
+
+    _angular          = window.angular,
+    /** @name angular */
+    angular           = window.angular || (window.angular = {}),
+    angularModule,
+    nodeName_,
+    uid               = ['0', '0', '0'];
+
+/**
+ * IE 11 changed the format of the UserAgent string.
+ * See http://msdn.microsoft.com/en-us/library/ms537503.aspx
+ */
+msie = int((/msie (\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);
+if (isNaN(msie)) {
+  msie = int((/trident\/.*; rv:(\d+)/.exec(lowercase(navigator.userAgent)) || [])[1]);
+}
+
+
+/**
+ * @private
+ * @param {*} obj
+ * @return {boolean} Returns true if `obj` is an array or array-like object (NodeList, Arguments,
+ *                   String ...)
+ */
+function isArrayLike(obj) {
+  if (obj == null || isWindow(obj)) {
+    return false;
+  }
+
+  var length = obj.length;
+
+  if (obj.nodeType === 1 && length) {
+    return true;
+  }
+
+  return isString(obj) || isArray(obj) || length === 0 ||
+         typeof length === 'number' && length > 0 && (length - 1) in obj;
+}
+
+/**
+ * @ngdoc function
+ * @name angular.forEach
+ * @function
+ *
+ * @description
+ * Invokes the `iterator` function once for each item in `obj` collection, which can be either an
+ * object or an array. The `iterator` function is invoked with `iterator(value, key)`, where `value`
+ * is the value of an object property or an array element and `key` is the object property key or
+ * array element index. Specifying a `context` for the function is optional.
+ *
+ * Note: this function was previously known as `angular.foreach`.
+ *
+   <pre>
+     var values = {name: 'misko', gender: 'male'};
+     var log = [];
+     angular.forEach(values, function(value, key){
+       this.push(key + ': ' + value);
+     }, log);
+     expect(log).toEqual(['name: misko', 'gender:male']);
+   </pre>
+ *
+ * @param {Object|Array} obj Object to iterate over.
+ * @param {Function} iterator Iterator function.
+ * @param {Object=} context Object to become context (`this`) for the iterator function.
+ * @returns {Object|Array} Reference to `obj`.
+ */
+function forEach(obj, iterator, context) {
+  var key;
+  if (obj) {
+    if (isFunction(obj)){
+      for (key in obj) {
+        if (key != 'prototype' && key != 'length' && key != 'name' && obj.hasOwnProperty(key)) {
+          iterator.call(context, obj[key], key);
+        }
+      }
+    } else if (obj.forEach && obj.forEach !== forEach) {
+      obj.forEach(iterator, context);
+    } else if (isArrayLike(obj)) {
+      for (key = 0; key < obj.length; key++)
+        iterator.call(context, obj[key], key);
+    } else {
+      for (key in obj) {
+        if (obj.hasOwnProperty(key)) {
+          iterator.call(context, obj[key], key);
+        }
+      }
+    }
+  }
+  return obj;
+}
+
+function sortedKeys(obj) {
+  var keys = [];
+  for (var key_1 in obj) {
+    if (obj.hasOwnProperty(key_1)) {
+      keys.push(key_1);
+    }
+  }
+  return keys.sort();
+}
+
+function forEachSorted(obj, iterator, context) {
+  var keys = sortedKeys(obj);
+  for ( var i = 0; i < keys.length; i++) {
+    iterator.call(context, obj[keys[i]], keys[i]);
+  }
+  return keys;
+}
+
+
+/**
+ * when using forEach the params are value, key, but it is often useful to have key, value.
+ * @param {function(string, *)} iteratorFn
+ * @returns {function(*, string)}
+ */
+function reverseParams(iteratorFn) {
+  return function(value, key) { iteratorFn(key, value); };
+}
+
+/**
+ * A consistent way of creating unique IDs in angular. The ID is a sequence of alpha numeric
+ * characters such as '012ABC'. The reason why we are not using simply a number counter is that
+ * the number string gets longer over time, and it can also overflow, where as the nextId
+ * will grow much slower, it is a string, and it will never overflow.
+ *
+ * @returns an unique alpha-numeric string
+ */
+function nextUid() {
+  var index = uid.length;
+  var digit;
+
+  while(index) {
+    index--;
+    digit = uid[index].charCodeAt(0);
+    if (digit == 57 /*'9'*/) {
+      uid[index] = 'A';
+      return uid.join('');
+    }
+    if (digit == 90  /*'Z'*/) {
+      uid[index] = '0';
+    } else {
+      uid[index] = String.fromCharCode(digit + 1);
+      return uid.join('');
+    }
+  }
+  uid.unshift('0');
+  return uid.join('');
+}
+
+
+/**
+ * Set or clear the hashkey for an object.
+ * @param obj object
+ * @param h the hashkey (!truthy to delete the hashkey)
+ */
+function setHashKey(obj, h) {
+  if (h) {
+    obj.$$hashKey = h;
+  }
+  else {
+    delete obj.$$hashKey;
+  }
+}
+
+/**
+ * @ngdoc function
+ * @name angular.extend
+ * @function
+ *
+ * @description
+ * Extends the destination object `dst` by copying all of the properties from the `src` object(s)
+ * to `dst`. You can specify multiple `src` objects.
+ *
+ * @param {Object} dst Destination object.
+ * @param {...Object} src Source object(s).
+ * @returns {Object} Reference to `dst`.
+ */
+function extend(dst) {
+  var h = dst.$$hashKey;
+  forEach(arguments, function(obj){
+    if (obj !== dst) {
+      forEach(obj, function(value, key){
+        dst[key] = value;
+      });
+    }
+  });
+
+  setHashKey(dst,h);
+  return dst;
+}
+
+function int(str) {
+  return parseInt(str, 10);
+}
+
+
+function inherit(parent, extra) {
+  return extend(new (extend(function() {}, {prototype:parent}))(), extra);
+}
+
+/**
+ * @ngdoc function
+ * @name angular.noop
+ * @function
+ *
+ * @description
+ * A function that performs no operations. This function can be useful when writing code in the
+ * functional style.
+   <pre>
+     function foo(callback) {
+       var result = calculateResult();
+       (callback || angular.noop)(result);
+     }
+   </pre>
+ */
+function noop() {}
+noop.$inject = [];
+
+
+/**
+ * @ngdoc function
+ * @name angular.identity
+ * @function
+ *
+ * @description
+ * A function that returns its first argument. This function is useful when writing code in the
+ * functional style.
+ *
+   <pre>
+     function transformer(transformationFn, value) {
+       return (transformationFn || angular.identity)(value);
+     };
+   </pre>
+ */
+function identity($) {return $;}
+identity.$inject = [];
+
+
+function valueFn(value) {return function() {return value;};}
+
+/**
+ * @ngdoc function
+ * @name angular.isUndefined
+ * @function
+ *
+ * @description
+ * Determines if a reference is undefined.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is undefined.
+ */
+function isUndefined(value){return typeof value === 'undefined';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isDefined
+ * @function
+ *
+ * @description
+ * Determines if a reference is defined.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is defined.
+ */
+function isDefined(value){return typeof value !== 'undefined';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isObject
+ * @function
+ *
+ * @description
+ * Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not
+ * considered to be objects.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is an `Object` but not `null`.
+ */
+function isObject(value){return value != null && typeof value === 'object';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isString
+ * @function
+ *
+ * @description
+ * Determines if a reference is a `String`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `String`.
+ */
+function isString(value){return typeof value === 'string';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isNumber
+ * @function
+ *
+ * @description
+ * Determines if a reference is a `Number`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Number`.
+ */
+function isNumber(value){return typeof value === 'number';}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isDate
+ * @function
+ *
+ * @description
+ * Determines if a value is a date.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Date`.
+ */
+function isDate(value){
+  return toString.call(value) === '[object Date]';
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isArray
+ * @function
+ *
+ * @description
+ * Determines if a reference is an `Array`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is an `Array`.
+ */
+function isArray(value) {
+  return toString.call(value) === '[object Array]';
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.isFunction
+ * @function
+ *
+ * @description
+ * Determines if a reference is a `Function`.
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `Function`.
+ */
+function isFunction(value){return typeof value === 'function';}
+
+
+/**
+ * Determines if a value is a regular expression object.
+ *
+ * @private
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a `RegExp`.
+ */
+function isRegExp(value) {
+  return toString.call(value) === '[object RegExp]';
+}
+
+
+/**
+ * Checks if `obj` is a window object.
+ *
+ * @private
+ * @param {*} obj Object to check
+ * @returns {boolean} True if `obj` is a window obj.
+ */
+function isWindow(obj) {
+  return obj && obj.document && obj.location && obj.alert && obj.setInterval;
+}
+
+
+function isScope(obj) {
+  return obj && obj.$evalAsync && obj.$watch;
+}
+
+
+function isFile(obj) {
+  return toString.call(obj) === '[object File]';
+}
+
+
+function isBoolean(value) {
+  return typeof value === 'boolean';
+}
+
+
+var trim = (function() {
+  // native trim is way faster: http://jsperf.com/angular-trim-test
+  // but IE doesn't have it... :-(
+  // TODO: we should move this into IE/ES5 polyfill
+  if (!String.prototype.trim) {
+    return function(value) {
+      return isString(value) ? value.replace(/^\s\s*/, '').replace(/\s\s*$/, '') : value;
+    };
+  }
+  return function(value) {
+    return isString(value) ? value.trim() : value;
+  };
+})();
+
+
+/**
+ * @ngdoc function
+ * @name angular.isElement
+ * @function
+ *
+ * @description
+ * Determines if a reference is a DOM element (or wrapped jQuery element).
+ *
+ * @param {*} value Reference to check.
+ * @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).
+ */
+function isElement(node) {
+  return !!(node &&
+    (node.nodeName  // we are a direct element
+    || (node.on && node.find)));  // we have an on and find method part of jQuery API
+}
+
+/**
+ * @param str 'key1,key2,...'
+ * @returns {object} in the form of {key1:true, key2:true, ...}
+ */
+function makeMap(str){
+  var obj = {}, items = str.split(","), i;
+  for ( i = 0; i < items.length; i++ )
+    obj[ items[i] ] = true;
+  return obj;
+}
+
+
+if (msie < 9) {
+  nodeName_ = function(element) {
+    element = element.nodeName ? element : element[0];
+    return (element.scopeName && element.scopeName != 'HTML')
+      ? uppercase(element.scopeName + ':' + element.nodeName) : element.nodeName;
+  };
+} else {
+  nodeName_ = function(element) {
+    return element.nodeName ? element.nodeName : element[0].nodeName;
+  };
+}
+
+
+function map(obj, iterator, context) {
+  var results = [];
+  forEach(obj, function(value, index, list) {
+    results.push(iterator.call(context, value, index, list));
+  });
+  return results;
+}
+
+
+/**
+ * @description
+ * Determines the number of elements in an array, the number of properties an object has, or
+ * the length of a string.
+ *
+ * Note: This function is used to augment the Object type in Angular expressions. See
+ * {@link angular.Object} for more information about Angular arrays.
+ *
+ * @param {Object|Array|string} obj Object, array, or string to inspect.
+ * @param {boolean} [ownPropsOnly=false] Count only "own" properties in an object
+ * @returns {number} The size of `obj` or `0` if `obj` is neither an object nor an array.
+ */
+function size(obj, ownPropsOnly) {
+  var count = 0, key;
+
+  if (isArray(obj) || isString(obj)) {
+    return obj.length;
+  } else if (isObject(obj)){
+    for (key in obj)
+      if (!ownPropsOnly || obj.hasOwnProperty(key))
+        count++;
+  }
+
+  return count;
+}
+
+
+function includes(array, obj) {
+  return indexOf(array, obj) != -1;
+}
+
+function indexOf(array, obj) {
+  if (array.indexOf) return array.indexOf(obj);
+
+  for (var i = 0; i < array.length; i++) {
+    if (obj === array[i]) return i;
+  }
+  return -1;
+}
+
+function arrayRemove(array, value) {
+  var index = indexOf(array, value);
+  if (index >=0)
+    array.splice(index, 1);
+  return value;
+}
+
+function isLeafNode (node) {
+  if (node) {
+    switch (node.nodeName) {
+    case "OPTION":
+    case "PRE":
+    case "TITLE":
+      return true;
+    }
+  }
+  return false;
+}
+
+/**
+ * @ngdoc function
+ * @name angular.copy
+ * @function
+ *
+ * @description
+ * Creates a deep copy of `source`, which should be an object or an array.
+ *
+ * * If no destination is supplied, a copy of the object or array is created.
+ * * If a destination is provided, all of its elements (for array) or properties (for objects)
+ *   are deleted and then all elements/properties from the source are copied to it.
+ * * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.
+ * * If `source` is identical to 'destination' an exception will be thrown.
+ *
+ * @param {*} source The source that will be used to make a copy.
+ *                   Can be any type, including primitives, `null`, and `undefined`.
+ * @param {(Object|Array)=} destination Destination into which the source is copied. If
+ *     provided, must be of the same type as `source`.
+ * @returns {*} The copy or updated `destination`, if `destination` was specified.
+ *
+ * @example
+ <doc:example>
+ <doc:source>
+ <div ng-controller="Controller">
+ <form novalidate class="simple-form">
+ Name: <input type="text" ng-model="user.name" /><br />
+ E-mail: <input type="email" ng-model="user.email" /><br />
+ Gender: <input type="radio" ng-model="user.gender" value="male" />male
+ <input type="radio" ng-model="user.gender" value="female" />female<br />
+ <button ng-click="reset()">RESET</button>
+ <button ng-click="update(user)">SAVE</button>
+ </form>
+ <pre>form = {{user | json}}</pre>
+ <pre>master = {{master | json}}</pre>
+ </div>
+
+ <script>
+ function Controller($scope) {
+    $scope.master= {};
+
+    $scope.update = function(user) {
+      // Example with 1 argument
+      $scope.master= angular.copy(user);
+    };
+
+    $scope.reset = function() {
+      // Example with 2 arguments
+      angular.copy($scope.master, $scope.user);
+    };
+
+    $scope.reset();
+  }
+ </script>
+ </doc:source>
+ </doc:example>
+ */
+function copy(source, destination){
+  if (isWindow(source) || isScope(source)) {
+    throw ngMinErr('cpws',
+      "Can't copy! Making copies of Window or Scope instances is not supported.");
+  }
+
+  if (!destination) {
+    destination = source;
+    if (source) {
+      if (isArray(source)) {
+        destination = copy(source, []);
+      } else if (isDate(source)) {
+        destination = new Date(source.getTime());
+      } else if (isRegExp(source)) {
+        destination = new RegExp(source.source);
+      } else if (isObject(source)) {
+        destination = copy(source, {});
+      }
+    }
+  } else {
+    if (source === destination) throw ngMinErr('cpi',
+      "Can't copy! Source and destination are identical.");
+    if (isArray(source)) {
+      destination.length = 0;
+      for ( var i = 0; i < source.length; i++) {
+        destination.push(copy(source[i]));
+      }
+    } else {
+      var h = destination.$$hashKey;
+      forEach(destination, function(value, key){
+        delete destination[key];
+      });
+      for ( var key_2 in source) {
+        destination[key_2] = copy(source[key_2]);
+      }
+      setHashKey(destination,h);
+    }
+  }
+  return destination;
+}
+
+/**
+ * Create a shallow copy of an object
+ */
+function shallowCopy(src, dst) {
+  dst = dst || {};
+
+  for(var key_3 in src) {
+    // shallowCopy is only ever called by $compile nodeLinkFn, which has control over src
+    // so we don't need to worry about using our custom hasOwnProperty here
+    if (src.hasOwnProperty(key_3) && key_3.substr(0, 2) !== '$$') {
+      dst[key_3] = src[key_3];
+    }
+  }
+
+  return dst;
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.equals
+ * @function
+ *
+ * @description
+ * Determines if two objects or two values are equivalent. Supports value types, regular
+ * expressions, arrays and objects.
+ *
+ * Two objects or values are considered equivalent if at least one of the following is true:
+ *
+ * * Both objects or values pass `===` comparison.
+ * * Both objects or values are of the same type and all of their properties are equal by
+ *   comparing them with `angular.equals`.
+ * * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)
+ * * Both values represent the same regular expression (In JavasScript,
+ *   /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual
+ *   representation matches).
+ *
+ * During a property comparison, properties of `function` type and properties with names
+ * that begin with `$` are ignored.
+ *
+ * Scope and DOMWindow objects are being compared only by identify (`===`).
+ *
+ * @param {*} o1 Object or value to compare.
+ * @param {*} o2 Object or value to compare.
+ * @returns {boolean} True if arguments are equal.
+ */
+function equals(o1, o2) {
+  if (o1 === o2) return true;
+  if (o1 === null || o2 === null) return false;
+  if (o1 !== o1 && o2 !== o2) return true; // NaN === NaN
+  var t1 = typeof o1, t2 = typeof o2, length, key, keySet;
+  if (t1 == t2) {
+    if (t1 == 'object') {
+      if (isArray(o1)) {
+        if (!isArray(o2)) return false;
+        if ((length = o1.length) == o2.length) {
+          for(key=0; key<length; key++) {
+            if (!equals(o1[key], o2[key])) return false;
+          }
+          return true;
+        }
+      } else if (isDate(o1)) {
+        return isDate(o2) && o1.getTime() == o2.getTime();
+      } else if (isRegExp(o1) && isRegExp(o2)) {
+        return o1.toString() == o2.toString();
+      } else {
+        if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) || isArray(o2)) return false;
+        keySet = {};
+        for(key in o1) {
+          if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
+          if (!equals(o1[key], o2[key])) return false;
+          keySet[key] = true;
+        }
+        for(key in o2) {
+          if (!keySet.hasOwnProperty(key) &&
+              key.charAt(0) !== '$' &&
+              o2[key] !== undefined &&
+              !isFunction(o2[key])) return false;
+        }
+        return true;
+      }
+    }
+  }
+  return false;
+}
+
+
+function csp() {
+  return (document.securityPolicy && document.securityPolicy.isActive) ||
+      (document.querySelector &&
+      !!(document.querySelector('[ng-csp]') || document.querySelector('[data-ng-csp]')));
+}
+
+
+function concat(array1, array2, index) {
+  return array1.concat(slice.call(array2, index));
+}
+
+function sliceArgs(args, startIndex) {
+  return slice.call(args, startIndex || 0);
+}
+
+
+/* jshint -W101 */
+/**
+ * @ngdoc function
+ * @name angular.bind
+ * @function
+ *
+ * @description
+ * Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for
+ * `fn`). You can supply optional `args` that are prebound to the function. This feature is also
+ * known as [partial application](http://en.wikipedia.org/wiki/Partial_application), as
+ * distinguished from [function currying](http://en.wikipedia.org/wiki/Currying#Contrast_with_partial_function_application).
+ *
+ * @param {Object} self Context which `fn` should be evaluated in.
+ * @param {function()} fn Function to be bound.
+ * @param {...*} args Optional arguments to be prebound to the `fn` function call.
+ * @returns {function()} Function that wraps the `fn` with all the specified bindings.
+ */
+/* jshint +W101 */
+function bind(self, fn) {
+  var curryArgs = arguments.length > 2 ? sliceArgs(arguments, 2) : [];
+  if (isFunction(fn) && !(fn instanceof RegExp)) {
+    return curryArgs.length
+      ? function() {
+          return arguments.length
+            ? fn.apply(self, curryArgs.concat(slice.call(arguments, 0)))
+            : fn.apply(self, curryArgs);
+        }
+      : function() {
+          return arguments.length
+            ? fn.apply(self, arguments)
+            : fn.call(self);
+        };
+  } else {
+    // in IE, native methods are not functions so they cannot be bound (note: they don't need to be)
+    return fn;
+  }
+}
+
+
+function toJsonReplacer(key, value) {
+  var val = value;
+
+  if (typeof key === 'string' && key.charAt(0) === '$') {
+    val = undefined;
+  } else if (isWindow(value)) {
+    val = '$WINDOW';
+  } else if (value &&  document === value) {
+    val = '$DOCUMENT';
+  } else if (isScope(value)) {
+    val = '$SCOPE';
+  }
+
+  return val;
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.toJson
+ * @function
+ *
+ * @description
+ * Serializes input into a JSON-formatted string. Properties with leading $ characters will be
+ * stripped since angular uses this notation internally.
+ *
+ * @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
+ * @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.
+ * @returns {string|undefined} JSON-ified string representing `obj`.
+ */
+function toJson(obj, pretty) {
+  if (typeof obj === 'undefined') return undefined;
+  return JSON.stringify(obj, toJsonReplacer, pretty ? '  ' : null);
+}
+
+
+/**
+ * @ngdoc function
+ * @name angular.fromJson
+ * @function
+ *
+ * @description
+ * Deserializes a JSON string.
+ *
+ * @param {string} json JSON string to deserialize.
+ * @returns {Object|Array|Date|string|number} Deserialized thingy.
+ */
+function fromJson(json) {
+  return isString(json)
+      ? JSON.parse(json)
+      : json;
+}
+
+
+function toBoolean(value) {
+  if (value && value.length !== 0) {
+    var v = lowercase("" + value);
+    value = !(v == 'f' || v == '0' || v == 'false' || v == 'no' || v == 'n' || v == '[]');
+  } else {
+    value = false;
+  }
+  return value;
+}
+
+/**
+ * @returns {string} Returns the string representation of the element.
+ */
+function startingTag(element) {
+  element = jqLite(element).clone();
+  try {
+    // turns out IE does not let you set .html() on elements which
+    // are not allowed to have children. So we just ignore it.
+    element.empty();
+  } catch(e) {}
+  // As Per DOM Standards
+  var TEXT_NODE = 3;
+  var elemHtml = jqLite('<div>').append(element).html();
+  try {
+    return element[0].nodeType === TEXT_NODE ? lowercase(elemHtml) :
+        elemHtml.
+          match(/^(<[^>]+>)/)[1].
+          replace(/^<([\w\-]+)/, function(match, nodeName) { return '<' + lowercase(nodeName); });
+  } catch(e) {
+    return lowercase(elemHtml);
+  }
+
+}
+
+
+/////////////////////////////////////////////////
+
+/**
+ * Tries to decode the URI component without throwing an exception.
+ *
+ * @private
+ * @param str value potential URI component to check.
+ * @returns {boolean} True if `value` can be decoded
+ * with the decodeURIComponent function.
+ */
+function tryDecodeURIComponent(value) {
+  try {
+    return decodeURIComponent(value);
+  } catch(e) {
+    // Ignore any invalid uri component
+  }
+}
+
+
+/**
+ * Parses an escaped url query string into key-value pairs.
+ * @returns Object.<(string|boolean)>
+ */
+function parseKeyValue(/**string*/keyValue) {
+  var obj = {}, key_value, key;
+  forEach((keyValue || "").split('&'), function(keyValue){
+    if ( keyValue ) {
+      key_value = keyValue.split('=');
+      key = tryDecodeURIComponent(key_value[0]);
+      if ( isDefined(key) ) {
+        var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
+        if (!obj[key]) {
+          obj[key] = val;
+        } else if(isArray(obj[key])) {
+          obj[key].push(val);
+        } else {
+          obj[key] = [obj[key],val];
+        }
+      }
+    }
+  });
+  return obj;
+}
+
+function toKeyValue(obj) {
+  var parts = [];
+  forEach(obj, function(value, key) {
+    if (isArray(value)) {
+      forEach(value, function(arrayValue) {
+        parts.push(encodeUriQuery(key, true) +
+                   (arrayValue === true ? '' : '=' + encodeUriQuery(arrayValue, true)));
+      });
+    } else {
+    parts.push(encodeUriQuery(key, true) +
+               (value === true ? '' : '=' + encodeUriQuery(value, true)));
+    }
+  });
+  return parts.length ? parts.join('&') : '';
+}
+
+
+/**
+ * We need our custom method because encodeURIComponent is too aggressive and doesn't follow
+ * http://www.ietf.org/rfc/rfc3986.txt with regards to the character set (pchar) allowed in path
+ * segments:
+ *    segment       = *pchar
+ *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+ *    pct-encoded   = "%" HEXDIG HEXDIG
+ *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
+ *                     / "*" / "+" / "," / ";" / "="
+ */
+function encodeUriSegment(val) {
+  return encodeUriQuery(val, true).
+             replace(/%26/gi, '&').
+             replace(/%3D/gi, '=').
+             replace(/%2B/gi, '+');
+}
+
+
+/**
+ * This method is intended for encoding *key* or *value* parts of query component. We need a custom
+ * method because encodeURIComponent is too aggressive and encodes stuff that doesn't have to be
+ * encoded per http://tools.ietf.org/html/rfc3986:
+ *    query       = *( pchar / "/" / "?" )
+ *    pchar         = unreserved / pct-encoded / sub-delims / ":" / "@"
+ *    unreserved    = ALPHA / DIGIT / "-" / "." / "_" / "~"
+ *    pct-encoded   = "%" HEXDIG HEXDIG
+ *    sub-delims    = "!" / "$" / "&" / "'" / "(" / ")"
+ *                     / "*" / "+" / "," / ";" / "="
+ */
+function encodeUriQuery(val, pctEncodeSpaces) {
+  return encodeURIComponent(val).
+             replace(/%40/gi, '@').
+             replace(/%3A/gi, ':').
+             replace(/%24/g, '$').
+             replace(/%2C/gi, ',').
+             replace(/%20/g, (pctEncodeSpaces ? '%20' : '+'));
+}
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngApp
+ *
+ * @element ANY
+ * @param {angular.Module} ngApp an optional application
+ *   {@link angular.module module} name to load.
+ *
+ * @description
+ *
+ * Use this directive to **auto-bootstrap** an AngularJS application. The `ngApp` directive
+ * designates the **root element** of the application and is typically placed near the root element
+ * of the page - e.g. on the `<body>` or `<html>` tags.
+ *
+ * Only one AngularJS application can be auto-bootstrapped per HTML document. The first `ngApp`
+ * found in the document will be used to define the root element to auto-bootstrap as an
+ * application. To run multiple applications in an HTML document you must manually bootstrap them using
+ * {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.
+ *
+ * You can specify an **AngularJS module** to be used as the root module for the application.  This
+ * module will be loaded into the {@link AUTO.$injector} when the application is bootstrapped and
+ * should contain the application code needed or have dependencies on other modules that will
+ * contain the code. See {@link angular.module} for more information.
+ *
+ * In the example below if the `ngApp` directive were not placed on the `html` element then the
+ * document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`
+ * would not be resolved to `3`.
+ *
+ * `ngApp` is the easiest, and most common, way to bootstrap an application.
+ *
+ <example module="ngAppDemo">
+   <file name="index.html">
+   <div ng-controller="ngAppDemoController">
+     I can add: {{a}} + {{b}} =  {{ a+b }}
+   </file>
+   <file name="script.js">
+   angular.module('ngAppDemo', []).controller('ngAppDemoController', function($scope) {
+     $scope.a = 1;
+     $scope.b = 2;
+   });
+   </file>
+ </example>
+ *
+ */
+function angularInit(element, bootstrap) {
+  var elements = [element],
+      appElement,
+      module,
+      names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],
+      NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;
+
+  function append(element) {
+    element && elements.push(element);
+  }
+
+  forEach(names, function(name) {
+    names[name] = true;
+    append(document.getElementById(name));
+    name = name.replace(':', '\\:');
+    if (element.querySelectorAll) {
+      forEach(element.querySelectorAll('.' + name), append);
+      forEach(element.querySelectorAll('.' + name + '\\:'), append);
+      forEach(element.querySelectorAll('[' + name + ']'), append);
+    }
+  });
+
+  forEach(elements, function(element) {
+    if (!appElement) {
+      var className = ' ' + element.className + ' ';
+      var match = NG_APP_CLASS_REGEXP.exec(className);
+      if (match) {
+        appElement = element;
+        module = (match[2] || '').replace(/\s+/g, ',');
+      } else {
+        forEach(element.attributes, function(attr) {
+          if (!appElement && names[attr.name]) {
+            appElement = element;
+            module = attr.value;
+          }
+        });
+      }
+    }
+  });
+  if (appElement) {
+    bootstrap(appElement, module ? [module] : []);
+  }
+}
+
+/**
+ * @ngdoc function
+ * @name angular.bootstrap
+ * @description
+ * Use this function to manually start up angular application.
+ *
+ * See: {@link guide/bootstrap Bootstrap}
+ *
+ * Note that ngScenario-based end-to-end tests cannot use this function to bootstrap manually.
+ * They must use {@link api/ng.directive:ngApp ngApp}.
+ *
+ * @param {Element} element DOM element which is the root of angular application.
+ * @param {Array<String|Function|Array>=} modules an array of modules to load into the application.
+ *     Each item in the array should be the name of a predefined module or a (DI annotated)
+ *     function that will be invoked by the injector as a run block.
+ *     See: {@link angular.module modules}
+ * @returns {AUTO.$injector} Returns the newly created injector for this app.
+ */
+function bootstrap(element, modules) {
+  var doBootstrap = function() {
+    element = jqLite(element);
+
+    if (element.injector()) {
+      var tag = (element[0] === document) ? 'document' : startingTag(element);
+      throw ngMinErr('btstrpd', "App Already Bootstrapped with this Element '{0}'", tag);
+    }
+
+    modules = modules || [];
+    modules.unshift(['$provide', function($provide) {
+      $provide.value('$rootElement', element);
+    }]);
+    modules.unshift('ng');
+    var injector = createInjector(modules);
+    injector.invoke(['$rootScope', '$rootElement', '$compile', '$injector', '$animate',
+       function(scope, element, compile, injector, animate) {
+        scope.$apply(function() {
+          element.data('$injector', injector);
+          compile(element)(scope);
+        });
+      }]
+    );
+    return injector;
+  };
+
+  var NG_DEFER_BOOTSTRAP = /^NG_DEFER_BOOTSTRAP!/;
+
+  if (window && !NG_DEFER_BOOTSTRAP.test(window.name)) {
+    return doBootstrap();
+  }
+
+  window.name = window.name.replace(NG_DEFER_BOOTSTRAP, '');
+  angular.resumeBootstrap = function(extraModules) {
+    forEach(extraModules, function(module) {
+      modules.push(module);
+    });
+    doBootstrap();
+  };
+}
+
+var SNAKE_CASE_REGEXP = /[A-Z]/g;
+function snake_case(name, separator){
+  separator = separator || '_';
+  return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
+    return (pos ? separator : '') + letter.toLowerCase();
+  });
+}
+
+function bindJQuery() {
+  // bind to jQuery if present;
+  jQuery = window.jQuery;
+  // reset to jQuery or default to us.
+  if (jQuery) {
+    jqLite = jQuery;
+    extend(jQuery.fn, {
+      scope: JQLitePrototype.scope,
+      isolateScope: JQLitePrototype.isolateScope,
+      controller: JQLitePrototype.controller,
+      injector: JQLitePrototype.injector,
+      inheritedData: JQLitePrototype.inheritedData
+    });
+    // Method signature:
+    //     jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments)
+    jqLitePatchJQueryRemove('remove', true, true, false);
+    jqLitePatchJQueryRemove('empty', false, false, false);
+    jqLitePatchJQueryRemove('html', false, false, true);
+  } else {
+    jqLite = JQLite;
+  }
+  angular.element = jqLite;
+}
+
+/**
+ * throw error if the argument is falsy.
+ */
+function assertArg(arg, name, reason) {
+  if (!arg) {
+    throw ngMinErr('areq', "Argument '{0}' is {1}", (name || '?'), (reason || "required"));
+  }
+  return arg;
+}
+
+function assertArgFn(arg, name, acceptArrayAnnotation) {
+  if (acceptArrayAnnotation && isArray(arg)) {
+      arg = arg[arg.length - 1];
+  }
+
+  assertArg(isFunction(arg), name, 'not a function, got ' +
+      (arg && typeof arg == 'object' ? arg.constructor.name || 'Object' : typeof arg));
+  return arg;
+}
+
+/**
+ * throw error if the name given is hasOwnProperty
+ * @param  {String} name    the name to test
+ * @param  {String} context the context in which the name is used, such as module or directive
+ */
+function assertNotHasOwnProperty(name, context) {
+  if (name === 'hasOwnProperty') {
+    throw ngMinErr('badname', "hasOwnProperty is not a valid {0} name", context);
+  }
+}
+
+/**
+ * Return the value accessible from the object by path. Any undefined traversals are ignored
+ * @param {Object} obj starting object
+ * @param {string} path path to traverse
+ * @param {boolean=true} bindFnToScope
+ * @returns value as accessible by path
+ */
+//TODO(misko): this function needs to be removed
+function getter(obj, path, bindFnToScope) {
+  if (!path) return obj;
+  var keys = path.split('.');
+  var key;
+  var lastInstance = obj;
+  var len = keys.length;
+
+  for (var i = 0; i < len; i++) {
+    key = keys[i];
+    if (obj) {
+      obj = (lastInstance = obj)[key];
+    }
+  }
+  if (!bindFnToScope && isFunction(obj)) {
+    return bind(lastInstance, obj);
+  }
+  return obj;
+}
+
+/**
+ * Return the DOM siblings between the first and last node in the given array.
+ * @param {Array} array like object
+ * @returns jQlite object containing the elements
+ */
+function getBlockElements(nodes) {
+  var startNode = nodes[0],
+      endNode = nodes[nodes.length - 1];
+  if (startNode === endNode) {
+    return jqLite(startNode);
+  }
+
+  var element = startNode;
+  var elements = [element];
+
+  do {
+    element = element.nextSibling;
+    if (!element) break;
+    elements.push(element);
+  } while (element !== endNode);
+
+  return jqLite(elements);
+}
+
+/**
+ * @ngdoc interface
+ * @name angular.Module
+ * @description
+ *
+ * Interface for configuring angular {@link angular.module modules}.
+ */
+
+function setupModuleLoader(window) {
+
+  var $injectorMinErr = minErr('$injector');
+  var ngMinErr = minErr('ng');
+
+  function ensure(obj, name, factory) {
+    return obj[name] || (obj[name] = factory());
+  }
+
+  var angular = ensure(window, 'angular', Object);
+
+  // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap
+  angular.$$minErr = angular.$$minErr || minErr;
+
+  return ensure(angular, 'module', function() {
+    /** @type {Object.<string, angular.Module>} */
+    var modules = {};
+
+    /**
+     * @ngdoc function
+     * @name angular.module
+     * @description
+     *
+     * The `angular.module` is a global place for creating, registering and retrieving Angular
+     * modules.
+     * All modules (angular core or 3rd party) that should be available to an application must be
+     * registered using this mechanism.
+     *
+     * When passed two or more arguments, a new module is created.  If passed only one argument, an
+     * existing module (the name passed as the first argument to `module`) is retrieved.
+     *
+     *
+     * # Module
+     *
+     * A module is a collection of services, directives, filters, and configuration information.
+     * `angular.module` is used to configure the {@link AUTO.$injector $injector}.
+     *
+     * <pre>
+     * // Create a new module
+     * var myModule = angular.module('myModule', []);
+     *
+     * // register a new service
+     * myModule.value('appName', 'MyCoolApp');
+     *
+     * // configure existing services inside initialization blocks.
+     * myModule.config(function($locationProvider) {
+     *   // Configure existing providers
+     *   $locationProvider.hashPrefix('!');
+     * });
+     * </pre>
+     *
+     * Then you can create an injector and load your modules like this:
+     *
+     * <pre>
+     * var injector = angular.injector(['ng', 'MyModule'])
+     * </pre>
+     *
+     * However it's more likely that you'll just use
+     * {@link ng.directive:ngApp ngApp} or
+     * {@link angular.bootstrap} to simplify this process for you.
+     *
+     * @param {!string} name The name of the module to create or retrieve.
+     * @param {Array.<string>=} requires If specified then new module is being created. If
+     *        unspecified then the the module is being retrieved for further configuration.
+     * @param {Function} configFn Optional configuration function for the module. Same as
+     *        {@link angular.Module#methods_config Module#config()}.
+     * @returns {module} new module with the {@link angular.Module} api.
+     */
+    return function module(name, requires, configFn) {
+      var assertNotHasOwnProperty = function(name, context) {
+        if (name === 'hasOwnProperty') {
+          throw ngMinErr('badname', 'hasOwnProperty is not a valid {0} name', context);
+        }
+      };
+
+      assertNotHasOwnProperty(name, 'module');
+      if (requires && modules.hasOwnProperty(name)) {
+        modules[name] = null;
+      }
+      return ensure(modules, name, function() {
+        if (!requires) {
+          throw $injectorMinErr('nomod', "Module '{0}' is not available! You either misspelled " +
+             "the module name or forgot to load it. If registering a module ensure that you " +
+             "specify the dependencies as the second argument.", name);
+        }
+
+        /** @type {!Array.<Array.<*>>} */
+        var invokeQueue = [];
+
+        /** @type {!Array.<Function>} */
+        var runBlocks = [];
+
+        var config = invokeLater('$injector', 'invoke');
+
+        /** @type {angular.Module} */
+        var moduleInstance = {
+          // Private state
+          _invokeQueue: invokeQueue,
+          _runBlocks: runBlocks,
+
+          /**
+           * @ngdoc property
+           * @name angular.Module#requires
+           * @propertyOf angular.Module
+           * @returns {Array.<string>} List of module names which must be loaded before this module.
+           * @description
+           * Holds the list of modules which the injector will load before the current module is
+           * loaded.
+           */
+          requires: requires,
+
+          /**
+           * @ngdoc property
+           * @name angular.Module#name
+           * @propertyOf angular.Module
+           * @returns {string} Name of the module.
+           * @description
+           */
+          name: name,
+
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#provider
+           * @methodOf angular.Module
+           * @param {string} name service name
+           * @param {Function} providerType Construction function for creating new instance of the
+           *                                service.
+           * @description
+           * See {@link AUTO.$provide#provider $provide.provider()}.
+           */
+          provider: invokeLater('$provide', 'provider'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#factory
+           * @methodOf angular.Module
+           * @param {string} name service name
+           * @param {Function} providerFunction Function for creating new instance of the service.
+           * @description
+           * See {@link AUTO.$provide#factory $provide.factory()}.
+           */
+          factory: invokeLater('$provide', 'factory'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#service
+           * @methodOf angular.Module
+           * @param {string} name service name
+           * @param {Function} constructor A constructor function that will be instantiated.
+           * @description
+           * See {@link AUTO.$provide#service $provide.service()}.
+           */
+          service: invokeLater('$provide', 'service'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#value
+           * @methodOf angular.Module
+           * @param {string} name service name
+           * @param {*} object Service instance object.
+           * @description
+           * See {@link AUTO.$provide#value $provide.value()}.
+           */
+          value: invokeLater('$provide', 'value'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#constant
+           * @methodOf angular.Module
+           * @param {string} name constant name
+           * @param {*} object Constant value.
+           * @description
+           * Because the constant are fixed, they get applied before other provide methods.
+           * See {@link AUTO.$provide#constant $provide.constant()}.
+           */
+          constant: invokeLater('$provide', 'constant', 'unshift'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#animation
+           * @methodOf angular.Module
+           * @param {string} name animation name
+           * @param {Function} animationFactory Factory function for creating new instance of an
+           *                                    animation.
+           * @description
+           *
+           * **NOTE**: animations take effect only if the **ngAnimate** module is loaded.
+           *
+           *
+           * Defines an animation hook that can be later used with
+           * {@link ngAnimate.$animate $animate} service and directives that use this service.
+           *
+           * <pre>
+           * module.animation('.animation-name', function($inject1, $inject2) {
+           *   return {
+           *     eventName : function(element, done) {
+           *       //code to run the animation
+           *       //once complete, then run done()
+           *       return function cancellationFunction(element) {
+           *         //code to cancel the animation
+           *       }
+           *     }
+           *   }
+           * })
+           * </pre>
+           *
+           * See {@link ngAnimate.$animateProvider#register $animateProvider.register()} and
+           * {@link ngAnimate ngAnimate module} for more information.
+           */
+          animation: invokeLater('$animateProvider', 'register'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#filter
+           * @methodOf angular.Module
+           * @param {string} name Filter name.
+           * @param {Function} filterFactory Factory function for creating new instance of filter.
+           * @description
+           * See {@link ng.$filterProvider#register $filterProvider.register()}.
+           */
+          filter: invokeLater('$filterProvider', 'register'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#controller
+           * @methodOf angular.Module
+           * @param {string|Object} name Controller name, or an object map of controllers where the
+           *    keys are the names and the values are the constructors.
+           * @param {Function} constructor Controller constructor function.
+           * @description
+           * See {@link ng.$controllerProvider#register $controllerProvider.register()}.
+           */
+          controller: invokeLater('$controllerProvider', 'register'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#directive
+           * @methodOf angular.Module
+           * @param {string|Object} name Directive name, or an object map of directives where the
+           *    keys are the names and the values are the factories.
+           * @param {Function} directiveFactory Factory function for creating new instance of
+           * directives.
+           * @description
+           * See {@link ng.$compileProvider#methods_directive $compileProvider.directive()}.
+           */
+          directive: invokeLater('$compileProvider', 'directive'),
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#config
+           * @methodOf angular.Module
+           * @param {Function} configFn Execute this function on module load. Useful for service
+           *    configuration.
+           * @description
+           * Use this method to register work which needs to be performed on module loading.
+           */
+          config: config,
+
+          /**
+           * @ngdoc method
+           * @name angular.Module#run
+           * @methodOf angular.Module
+           * @param {Function} initializationFn Execute this function after injector creation.
+           *    Useful for application initialization.
+           * @description
+           * Use this method to register work which should be performed when the injector is done
+           * loading all modules.
+           */
+          run: function(block) {
+            runBlocks.push(block);
+            return this;
+          }
+        };
+
+        if (configFn) {
+          config(configFn);
+        }
+
+        return  moduleInstance;
+
+        /**
+         * @param {string} provider
+         * @param {string} method
+         * @param {String=} insertMethod
+         * @returns {angular.Module}
+         */
+        function invokeLater(provider, method, insertMethod) {
+          return function() {
+            invokeQueue[insertMethod || 'push']([provider, method, arguments]);
+            return moduleInstance;
+          };
+        }
+      });
+    };
+  });
+
+}
+
+/* global
+    angularModule: true,
+    version: true,
+    
+    $LocaleProvider,
+    $CompileProvider,
+    
+    htmlAnchorDirective,
+    inputDirective,
+    inputDirective,
+    formDirective,
+    scriptDirective,
+    selectDirective,
+    styleDirective,
+    optionDirective,
+    ngBindDirective,
+    ngBindHtmlDirective,
+    ngBindTemplateDirective,
+    ngClassDirective,
+    ngClassEvenDirective,
+    ngClassOddDirective,
+    ngCspDirective,
+    ngCloakDirective,
+    ngControllerDirective,
+    ngFormDirective,
+    ngHideDirective,
+    ngIfDirective,
+    ngIncludeDirective,
+    ngIncludeFillContentDirective,
+    ngInitDirective,
+    ngNonBindableDirective,
+    ngPluralizeDirective,
+    ngRepeatDirective,
+    ngShowDirective,
+    ngStyleDirective,
+    ngSwitchDirective,
+    ngSwitchWhenDirective,
+    ngSwitchDefaultDirective,
+    ngOptionsDirective,
+    ngTranscludeDirective,
+    ngModelDirective,
+    ngListDirective,
+    ngChangeDirective,
+    requiredDirective,
+    requiredDirective,
+    ngValueDirective,
+    ngAttributeAliasDirectives,
+    ngEventDirectives,
+
+    $AnchorScrollProvider,
+    $AnimateProvider,
+    $BrowserProvider,
+    $CacheFactoryProvider,
+    $ControllerProvider,
+    $DocumentProvider,
+    $ExceptionHandlerProvider,
+    $FilterProvider,
+    $InterpolateProvider,
+    $IntervalProvider,
+    $HttpProvider,
+    $HttpBackendProvider,
+    $LocationProvider,
+    $LogProvider,
+    $ParseProvider,
+    $RootScopeProvider,
+    $QProvider,
+    $$SanitizeUriProvider,
+    $SceProvider,
+    $SceDelegateProvider,
+    $SnifferProvider,
+    $TemplateCacheProvider,
+    $TimeoutProvider,
+    $WindowProvider
+*/
+
+
+/**
+ * @ngdoc property
+ * @name angular.version
+ * @description
+ * An object that contains information about the current AngularJS version. This object has the
+ * following properties:
+ *
+ * - `full` – `{string}` – Full version string, such as "0.9.18".
+ * - `major` – `{number}` – Major version number, such as "0".
+ * - `minor` – `{number}` – Minor version number, such as "9".
+ * - `dot` – `{number}` – Dot version number, such as "18".
+ * - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
+ */
+var version = {
+  full: '1.2.5',    // all of these placeholder strings will be replaced by grunt's
+  major: 1,    // package task
+  minor: 2,
+  dot: 5,
+  codeName: 'singularity-expansion'
+};
+
+
+function publishExternalAPI(angular){
+  extend(angular, {
+    'bootstrap': bootstrap,
+    'copy': copy,
+    'extend': extend,
+    'equals': equals,
+    'element': jqLite,
+    'forEach': forEach,
+    'injector': createInjector,
+    'noop':noop,
+    'bind':bind,
+    'toJson': toJson,
+    'fromJson': fromJson,
+    'identity':identity,
+    'isUndefined': isUndefined,
+    'isDefined': isDefined,
+    'isString': isString,
+    'isFunction': isFunction,
+    'isObject': isObject,
+    'isNumber': isNumber,
+    'isElement': isElement,
+    'isArray': isArray,
+    'version': version,
+    'isDate': isDate,
+    'lowercase': lowercase,
+    'uppercase': uppercase,
+    'callbacks': {counter: 0},
+    '$$minErr': minErr,
+    '$$csp': csp
+  });
+
+  angularModule = setupModuleLoader(window);
+  try {
+    angularModule('ngLocale');
+  } catch (e) {
+    angularModule('ngLocale', []).provider('$locale', $LocaleProvider);
+  }
+
+  angularModule('ng', ['ngLocale'], ['$provide',
+    function ngModule($provide) {
+      // $$sanitizeUriProvider needs to be before $compileProvider as it is used by it.
+      $provide.provider({
+        $$sanitizeUri: $$SanitizeUriProvider
+      });
+      $provide.provider('$compile', $CompileProvider).
+        directive({
+            a: htmlAnchorDirective,
+            input: inputDirective,
+            textarea: inputDirective,
+            form: formDirective,
+            script: scriptDirective,
+            select: selectDirective,
+            style: styleDirective,
+            option: optionDirective,
+            ngBind: ngBindDirective,
+            ngBindHtml: ngBindHtmlDirective,
+            ngBindTemplate: ngBindTemplateDirective,
+            ngClass: ngClassDirective,
+            ngClassEven: ngClassEvenDirective,
+            ngClassOdd: ngClassOddDirective,
+            ngCloak: ngCloakDirective,
+            ngController: ngControllerDirective,
+            ngForm: ngFormDirective,
+            ngHide: ngHideDirective,
+            ngIf: ngIfDirective,
+            ngInclude: ngIncludeDirective,
+            ngInit: ngInitDirective,
+            ngNonBindable: ngNonBindableDirective,
+            ngPluralize: ngPluralizeDirective,
+            ngRepeat: ngRepeatDirective,
+            ngShow: ngShowDirective,
+            ngStyle: ngStyleDirective,
+            ngSwitch: ngSwitchDirective,
+            ngSwitchWhen: ngSwitchWhenDirective,
+            ngSwitchDefault: ngSwitchDefaultDirective,
+            ngOptions: ngOptionsDirective,
+            ngTransclude: ngTranscludeDirective,
+            ngModel: ngModelDirective,
+            ngList: ngListDirective,
+            ngChange: ngChangeDirective,
+            required: requiredDirective,
+            ngRequired: requiredDirective,
+            ngValue: ngValueDirective
+        }).
+        directive({
+          ngInclude: ngIncludeFillContentDirective
+        }).
+        directive(ngAttributeAliasDirectives).
+        directive(ngEventDirectives);
+      $provide.provider({
+        $anchorScroll: $AnchorScrollProvider,
+        $animate: $AnimateProvider,
+        $browser: $BrowserProvider,
+        $cacheFactory: $CacheFactoryProvider,
+        $controller: $ControllerProvider,
+        $document: $DocumentProvider,
+        $exceptionHandler: $ExceptionHandlerProvider,
+        $filter: $FilterProvider,
+        $interpolate: $InterpolateProvider,
+        $interval: $IntervalProvider,
+        $http: $HttpProvider,
+        $httpBackend: $HttpBackendProvider,
+        $location: $LocationProvider,
+        $log: $LogProvider,
+        $parse: $ParseProvider,
+        $rootScope: $RootScopeProvider,
+        $q: $QProvider,
+        $sce: $SceProvider,
+        $sceDelegate: $SceDelegateProvider,
+        $sniffer: $SnifferProvider,
+        $templateCache: $TemplateCacheProvider,
+        $timeout: $TimeoutProvider,
+        $window: $WindowProvider
+      });
+    }
+  ]);
+}
+
+/* global
+
+  -JQLitePrototype,
+  -addEventListenerFn,
+  -removeEventListenerFn,
+  -BOOLEAN_ATTR
+*/
+
+//////////////////////////////////
+//JQLite
+//////////////////////////////////
+
+/**
+ * @ngdoc function
+ * @name angular.element
+ * @function
+ *
+ * @description
+ * Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.
+ *
+ * If jQuery is available, `angular.element` is an alias for the
+ * [jQuery](http://api.jquery.com/jQuery/) function. If jQuery is not available, `angular.element`
+ * delegates to Angular's built-in subset of jQuery, called "jQuery lite" or "jqLite."
+ *
+ * <div class="alert alert-success">jqLite is a tiny, API-compatible subset of jQuery that allows
+ * Angular to manipulate the DOM in a cross-browser compatible way. **jqLite** implements only the most
+ * commonly needed functionality with the goal of having a very small footprint.</div>
+ *
+ * To use jQuery, simply load it before `DOMContentLoaded` event fired.
+ *
+ * <div class="alert">**Note:** all element references in Angular are always wrapped with jQuery or
+ * jqLite; they are never raw DOM references.</div>
+ *
+ * ## Angular's jqLite
+ * jqLite provides only the following jQuery methods:
+ *
+ * - [`addClass()`](http://api.jquery.com/addClass/)
+ * - [`after()`](http://api.jquery.com/after/)
+ * - [`append()`](http://api.jquery.com/append/)
+ * - [`attr()`](http://api.jquery.com/attr/)
+ * - [`bind()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData
+ * - [`children()`](http://api.jquery.com/children/) - Does not support selectors
+ * - [`clone()`](http://api.jquery.com/clone/)
+ * - [`contents()`](http://api.jquery.com/contents/)
+ * - [`css()`](http://api.jquery.com/css/)
+ * - [`data()`](http://api.jquery.com/data/)
+ * - [`empty()`](http://api.jquery.com/empty/)
+ * - [`eq()`](http://api.jquery.com/eq/)
+ * - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name
+ * - [`hasClass()`](http://api.jquery.com/hasClass/)
+ * - [`html()`](http://api.jquery.com/html/)
+ * - [`next()`](http://api.jquery.com/next/) - Does not support selectors
+ * - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData
+ * - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or selectors
+ * - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors
+ * - [`prepend()`](http://api.jquery.com/prepend/)
+ * - [`prop()`](http://api.jquery.com/prop/)
+ * - [`ready()`](http://api.jquery.com/ready/)
+ * - [`remove()`](http://api.jquery.com/remove/)
+ * - [`removeAttr()`](http://api.jquery.com/removeAttr/)
+ * - [`removeClass()`](http://api.jquery.com/removeClass/)
+ * - [`removeData()`](http://api.jquery.com/removeData/)
+ * - [`replaceWith()`](http://api.jquery.com/replaceWith/)
+ * - [`text()`](http://api.jquery.com/text/)
+ * - [`toggleClass()`](http://api.jquery.com/toggleClass/)
+ * - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.
+ * - [`unbind()`](http://api.jquery.com/off/) - Does not support namespaces
+ * - [`val()`](http://api.jquery.com/val/)
+ * - [`wrap()`](http://api.jquery.com/wrap/)
+ *
+ * ## jQuery/jqLite Extras
+ * Angular also provides the following additional methods and events to both jQuery and jqLite:
+ *
+ * ### Events
+ * - `$destroy` - AngularJS intercepts all jqLite/jQuery's DOM destruction apis and fires this event
+ *    on all DOM nodes being removed.  This can be used to clean up any 3rd party bindings to the DOM
+ *    element before it is removed.
+ *
+ * ### Methods
+ * - `controller(name)` - retrieves the controller of the current element or its parent. By default
+ *   retrieves controller associated with the `ngController` directive. If `name` is provided as
+ *   camelCase directive name, then the controller for this directive will be retrieved (e.g.
+ *   `'ngModel'`).
+ * - `injector()` - retrieves the injector of the current element or its parent.
+ * - `scope()` - retrieves the {@link api/ng.$rootScope.Scope scope} of the current
+ *   element or its parent.
+ * - `isolateScope()` - retrieves an isolate {@link api/ng.$rootScope.Scope scope} if one is attached directly to the
+ *   current element. This getter should be used only on elements that contain a directive which starts a new isolate
+ *   scope. Calling `scope()` on this element always returns the original non-isolate scope.
+ * - `inheritedData()` - same as `data()`, but walks up the DOM until a value is found or the top
+ *   parent element is reached.
+ *
+ * @param {string|DOMElement} element HTML string or DOMElement to be wrapped into jQuery.
+ * @returns {Object} jQuery object.
+ */
+
+var jqCache = JQLite.cache = {},
+    jqName = JQLite.expando = 'ng-' + new Date().getTime(),
+    jqId = 1,
+    addEventListenerFn = (window.document.addEventListener
+      ? function(element, type, fn) {element.addEventListener(type, fn, false);}
+      : function(element, type, fn) {element.attachEvent('on' + type, fn);}),
+    removeEventListenerFn = (window.document.removeEventListener
+      ? function(element, type, fn) {element.removeEventListener(type, fn, false); }
+      : function(element, type, fn) {element.detachEvent('on' + type, fn); });
+
+function jqNextId() { return ++jqId; }
+
+
+var SPECIAL_CHARS_REGEXP = /([\:\-\_]+(.))/g;
+var MOZ_HACK_REGEXP = /^moz([A-Z])/;
+var jqLiteMinErr = minErr('jqLite');
+
+/**
+ * Converts snake_case to camelCase.
+ * Also there is special case for Moz prefix starting with upper case letter.
+ * @param name Name to normalize
+ */
+function camelCase(name) {
+  return name.
+    replace(SPECIAL_CHARS_REGEXP, function(_, separator, letter, offset) {
+      return offset ? letter.toUpperCase() : letter;
+    }).
+    replace(MOZ_HACK_REGEXP, 'Moz$1');
+}
+
+/////////////////////////////////////////////
+// jQuery mutation patch
+//
+// In conjunction with bindJQuery intercepts all jQuery's DOM destruction apis and fires a
+// $destroy event on all DOM nodes being removed.
+//
+/////////////////////////////////////////////
+
+function jqLitePatchJQueryRemove(name, dispatchThis, filterElems, getterIfNoArguments) {
+  var originalJqFn = jQuery.fn[name];
+  originalJqFn = originalJqFn.$original || originalJqFn;
+  removePatch.$original = originalJqFn;
+  jQuery.fn[name] = removePatch;
+
+  function removePatch(param) {
+    // jshint -W040
+    var list = filterElems && param ? [this.filter(param)] : [this],
+        fireEvent = dispatchThis,
+        set, setIndex, setLength,
+        element, childIndex, childLength, children;
+
+    if (!getterIfNoArguments || param != null) {
+      while(list.length) {
+        set = list.shift();
+        for(setIndex = 0, setLength = set.length; setIndex < setLength; setIndex++) {
+          element = jqLite(set[setIndex]);
+          if (fireEvent) {
+            element.triggerHandler('$destroy');
+          } else {
+            fireEvent = !fireEvent;
+          }
+          for(childIndex = 0, childLength = (children = element.children()).length;
+              childIndex < childLength;
+              childIndex++) {
+            list.push(jQuery(children[childIndex]));
+          }
+        }
+      }
+    }
+    return originalJqFn.apply(this, arguments);
+  }
+}
+
+/////////////////////////////////////////////
+function JQLite(element) {
+  if (element instanceof JQLite) {
+    return element;
+  }
+  if (!(this instanceof JQLite)) {
+    if (isString(element) && element.charAt(0) != '<') {
+      throw jqLiteMinErr('nosel', 'Looking up elements via selectors is not supported by jqLite! See: http://docs.angularjs.org/api/angular.element');
+    }
+    return new JQLite(element);
+  }
+
+  if (isString(element)) {
+    var div = document.createElement('div');
+    // Read about the NoScope elements here:
+    // http://msdn.microsoft.com/en-us/library/ms533897(VS.85).aspx
+    div.innerHTML = '<div>&#160;</div>' + element; // IE insanity to make NoScope elements work!
+    div.removeChild(div.firstChild); // remove the superfluous div
+    jqLiteAddNodes(this, div.childNodes);
+    var fragment = jqLite(document.createDocumentFragment());
+    fragment.append(this); // detach the elements from the temporary DOM div.
+  } else {
+    jqLiteAddNodes(this, element);
+  }
+}
+
+function jqLiteClone(element) {
+  return element.cloneNode(true);
+}
+
+function jqLiteDealoc(element){
+  jqLiteRemoveData(element);
+  for ( var i = 0, children = element.childNodes || []; i < children.length; i++) {
+    jqLiteDealoc(children[i]);
+  }
+}
+
+function jqLiteOff(element, type, fn, unsupported) {
+  if (isDefined(unsupported)) throw jqLiteMinErr('offargs', 'jqLite#off() does not support the `selector` argument');
+
+  var events = jqLiteExpandoStore(element, 'events'),
+      handle = jqLiteExpandoStore(element, 'handle');
+
+  if (!handle) return; //no listeners registered
+
+  if (isUndefined(type)) {
+    forEach(events, function(eventHandler, type) {
+      removeEventListenerFn(element, type, eventHandler);
+      delete events[type];
+    });
+  } else {
+    forEach(type.split(' '), function(type) {
+      if (isUndefined(fn)) {
+        removeEventListenerFn(element, type, events[type]);
+        delete events[type];
+      } else {
+        arrayRemove(events[type] || [], fn);
+      }
+    });
+  }
+}
+
+function jqLiteRemoveData(element, name) {
+  var expandoId = element[jqName],
+      expandoStore = jqCache[expandoId];
+
+  if (expandoStore) {
+    if (name) {
+      delete jqCache[expandoId].data[name];
+      return;
+    }
+
+    if (expandoStore.handle) {
+      expandoStore.events.$destroy && expandoStore.handle({}, '$destroy');
+      jqLiteOff(element);
+    }
+    delete jqCache[expandoId];
+    element[jqName] = undefined; // ie does not allow deletion of attributes on elements.
+  }
+}
+
+function jqLiteExpandoStore(element, key, value) {
+  var expandoId = element[jqName],
+      expandoStore = jqCache[expandoId || -1];
+
+  if (isDefined(value)) {
+    if (!expandoStore) {
+      element[jqName] = expandoId = jqNextId();
+      expandoStore = jqCache[expandoId] = {};
+    }
+    expandoStore[key] = value;
+  } else {
+    return expandoStore && expandoStore[key];
+  }
+}
+
+function jqLiteData(element, key, value) {
+  var data = jqLiteExpandoStore(element, 'data'),
+      isSetter = isDefined(value),
+      keyDefined = !isSetter && isDefined(key),
+      isSimpleGetter = keyDefined && !isObject(key);
+
+  if (!data && !isSimpleGetter) {
+    jqLiteExpandoStore(element, 'data', data = {});
+  }
+
+  if (isSetter) {
+    data[key] = value;
+  } else {
+    if (keyDefined) {
+      if (isSimpleGetter) {
+        // don't create data in this case.
+        return data && data[key];
+      } else {
+        extend(data, key);
+      }
+    } else {
+      return data;
+    }
+  }
+}
+
+function jqLiteHasClass(element, selector) {
+  if (!element.getAttribute) return false;
+  return ((" " + (element.getAttribute('class') || '') + " ").replace(/[\n\t]/g, " ").
+      indexOf( " " + selector + " " ) > -1);
+}
+
+function jqLiteRemoveClass(element, cssClasses) {
+  if (cssClasses && element.setAttribute) {
+    forEach(cssClasses.split(' '), function(cssClass) {
+      element.setAttribute('class', trim(
+          (" " + (element.getAttribute('class') || '') + " ")
+          .replace(/[\n\t]/g, " ")
+          .replace(" " + trim(cssClass) + " ", " "))
+      );
+    });
+  }
+}
+
+function jqLiteAddClass(element, cssClasses) {
+  if (cssClasses && element.setAttribute) {
+    var existingClasses = (' ' + (element.getAttribute('class') || '') + ' ')
+                            .replace(/[\n\t]/g, " ");
+
+    forEach(cssClasses.split(' '), function(cssClass) {
+      cssClass = trim(cssClass);
+      if (existingClasses.indexOf(' ' + cssClass + ' ') === -1) {
+        existingClasses += cssClass + ' ';
+      }
+    });
+
+    element.setAttribute('class', trim(existingClasses));
+  }
+}
+
+function jqLiteAddNodes(root, elements) {
+  if (elements) {
+    elements = (!elements.nodeName && isDefined(elements.length) && !isWindow(elements))
+      ? elements
+      : [ elements ];
+    for(var i=0; i < elements.length; i++) {
+      root.push(elements[i]);
+    }
+  }
+}
+
+function jqLiteController(element, name) {
+  return jqLiteInheritedData(element, '$' + (name || 'ngController' ) + 'Controller');
+}
+
+function jqLiteInheritedData(element, name, value) {
+  element = jqLite(element);
+
+  // if element is the document object work with the html element instead
+  // this makes $(document).scope() possible
+  if(element[0].nodeType == 9) {
+    element = element.find('html');
+  }
+  var names = isArray(name) ? name : [name];
+
+  while (element.length) {
+
+    for (var i = 0, ii = names.length; i < ii; i++) {
+      if ((value = element.data(names[i])) !== undefined) return value;
+    }
+    element = element.parent();
+  }
+}
+
+function jqLiteEmpty(element) {
+  for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
+    jqLiteDealoc(childNodes[i]);
+  }
+  while (element.firstChild) {
+    element.removeChild(element.firstChild);
+  }
+}
+
+//////////////////////////////////////////
+// Functions which are declared directly.
+//////////////////////////////////////////
+var JQLitePrototype = JQLite.prototype = {
+  ready: function(fn) {
+    var fired = false;
+
+    function trigger() {
+      if (fired) return;
+      fired = true;
+      fn();
+    }
+
+    // check if document already is loaded
+    if (document.readyState === 'complete'){
+      setTimeout(trigger);
+    } else {
+      this.on('DOMContentLoaded', trigger); // works for modern browsers and IE9
+      // we can not use jqLite since we are not done loading and jQuery could be loaded later.
+      // jshint -W064
+      JQLite(window).on('load', trigger); // fallback to window.onload for others
+      // jshint +W064
+    }
+  },
+  toString: function() {
+    var value = [];
+    forEach(this, function(e){ value.push('' + e);});
+    return '[' + value.join(', ') + ']';
+  },
+
+  eq: function(index) {
+      return (index >= 0) ? jqLite(this[index]) : jqLite(this[this.length + index]);
+  },
+
+  length: 0,
+  push: push,
+  sort: [].sort,
+  splice: [].splice
+};
+
+//////////////////////////////////////////
+// Functions iterating getter/setters.
+// these functions return self on setter and
+// value on get.
+//////////////////////////////////////////
+var BOOLEAN_ATTR = {};
+forEach('multiple,selected,checked,disabled,readOnly,required,open'.split(','), function(value) {
+  BOOLEAN_ATTR[lowercase(value)] = value;
+});
+var BOOLEAN_ELEMENTS = {};
+forEach('input,select,option,textarea,button,form,details'.split(','), function(value) {
+  BOOLEAN_ELEMENTS[uppercase(value)] = true;
+});
+
+function getBooleanAttrName(element, name) {
+  // check dom last since we will most likely fail on name
+  var booleanAttr = BOOLEAN_ATTR[name.toLowerCase()];
+
+  // booleanAttr is here twice to minimize DOM access
+  return booleanAttr && BOOLEAN_ELEMENTS[element.nodeName] && booleanAttr;
+}
+
+forEach({
+  data: jqLiteData,
+  inheritedData: jqLiteInheritedData,
+
+  scope: function(element) {
+    // Can't use jqLiteData here directly so we stay compatible with jQuery!
+    return jqLite(element).data('$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);
+  },
+
+  isolateScope: function(element) {
+    // Can't use jqLiteData here directly so we stay compatible with jQuery!
+    return jqLite(element).data('$isolateScope') || jqLite(element).data('$isolateScopeNoTemplate');
+  },
+
+  controller: jqLiteController ,
+
+  injector: function(element) {
+    return jqLiteInheritedData(element, '$injector');
+  },
+
+  removeAttr: function(element,name) {
+    element.removeAttribute(name);
+  },
+
+  hasClass: jqLiteHasClass,
+
+  css: function(element, name, value) {
+    name = camelCase(name);
+
+    if (isDefined(value)) {
+      element.style[name] = value;
+    } else {
+      var val;
+
+      if (msie <= 8) {
+        // this is some IE specific weirdness that jQuery 1.6.4 does not sure why
+        val = element.currentStyle && element.currentStyle[name];
+        if (val === '') val = 'auto';
+      }
+
+      val = val || element.style[name];
+
+      if (msie <= 8) {
+        // jquery weirdness :-/
+        val = (val === '') ? undefined : val;
+      }
+
+      return  val;
+    }
+  },
+
+  attr: function(element, name, value){
+    var lowercasedName = lowercase(name);
+    if (BOOLEAN_ATTR[lowercasedName]) {
+      if (isDefined(value)) {
+        if (!!value) {
+          element[name] = true;
+          element.setAttribute(name, lowercasedName);
+        } else {
+          element[name] = false;
+          element.removeAttribute(lowercasedName);
+        }
+      } else {
+        return (element[name] ||
+                 (element.attributes.getNamedItem(name)|| noop).specified)
+               ? lowercasedName
+               : undefined;
+      }
+    } else if (isDefined(value)) {
+      element.setAttribute(name, value);
+    } else if (element.getAttribute) {
+      // the extra argument "2" is to get the right thing for a.href in IE, see jQuery code
+      // some elements (e.g. Document) don't have get attribute, so return undefined
+      var ret = element.getAttribute(name, 2);
+      // normalize non-existing attributes to undefined (as jQuery)
+      return ret === null ? undefined : ret;
+    }
+  },
+
+  prop: function(element, name, value) {
+    if (isDefined(value)) {
+      element[name] = value;
+    } else {
+      return element[name];
+    }
+  },
+
+  text: (function() {
+    var NODE_TYPE_TEXT_PROPERTY = [];
+    if (msie < 9) {
+      NODE_TYPE_TEXT_PROPERTY[1] = 'innerText';    /** Element **/
+      NODE_TYPE_TEXT_PROPERTY[3] = 'nodeValue';    /** Text **/
+    } else {
+      NODE_TYPE_TEXT_PROPERTY[1] =                 /** Element **/
+      NODE_TYPE_TEXT_PROPERTY[3] = 'textContent';  /** Text **/
+    }
+    getText.$dv = '';
+    return getText;
+
+    function getText(element, value) {
+      var textProp = NODE_TYPE_TEXT_PROPERTY[element.nodeType];
+      if (isUndefined(value)) {
+        return textProp ? element[textProp] : '';
+      }
+      element[textProp] = value;
+    }
+  })(),
+
+  val: function(element, value) {
+    if (isUndefined(value)) {
+      if (nodeName_(element) === 'SELECT' && element.multiple) {
+        var result = [];
+        forEach(element.options, function (option) {
+          if (option.selected) {
+            result.push(option.value || option.text);
+          }
+        });
+        return result.length === 0 ? null : result;
+      }
+      return element.value;
+    }
+    element.value = value;
+  },
+
+  html: function(element, value) {
+    if (isUndefined(value)) {
+      return element.innerHTML;
+    }
+    for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
+      jqLiteDealoc(childNodes[i]);
+    }
+    element.innerHTML = value;
+  },
+
+  empty: jqLiteEmpty
+}, function(fn, name){
+  /**
+   * Properties: writes return selection, reads return first value
+   */
+  JQLite.prototype[name] = function(arg1, arg2) {
+    var i, key;
+
+    // jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it
+    // in a way that survives minification.
+    // jqLiteEmpty takes no arguments but is a setter.
+    if (fn !== jqLiteEmpty &&
+        (((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {
+      if (isObject(arg1)) {
+
+        // we are a write, but the object properties are the key/values
+        for (i = 0; i < this.length; i++) {
+          if (fn === jqLiteData) {
+            // data() takes the whole object in jQuery
+            fn(this[i], arg1);
+          } else {
+            for (key in arg1) {
+              fn(this[i], key, arg1[key]);
+            }
+          }
+        }
+        // return self for chaining
+        return this;
+      } else {
+        // we are a read, so read the first child.
+        var value = fn.$dv;
+        // Only if we have $dv do we iterate over all, otherwise it is just the first element.
+        var jj = (value === undefined) ? Math.min(this.length, 1) : this.length;
+        for (var j = 0; j < jj; j++) {
+          var nodeValue = fn(this[j], arg1, arg2);
+          value = value ? value + nodeValue : nodeValue;
+        }
+        return value;
+      }
+    } else {
+      // we are a write, so apply to all children
+      for (i = 0; i < this.length; i++) {
+        fn(this[i], arg1, arg2);
+      }
+      // return self for chaining
+      return this;
+    }
+  };
+});
+
+function createEventHandler(element, events) {
+  var eventHandler = function (event, type) {
+    if (!event.preventDefault) {
+      event.preventDefault = function() {
+        event.returnValue = false; //ie
+      };
+    }
+
+    if (!event.stopPropagation) {
+      event.stopPropagation = function() {
+        event.cancelBubble = true; //ie
+      };
+    }
+
+    if (!event.target) {
+      event.target = event.srcElement || document;
+    }
+
+    if (isUndefined(event.defaultPrevented)) {
+      var prevent = event.preventDefault;
+      event.preventDefault = function() {
+        event.defaultPrevented = true;
+        prevent.call(event);
+      };
+      event.defaultPrevented = false;
+    }
+
+    event.isDefaultPrevented = function() {
+      return event.defaultPrevented || event.returnValue === false;
+    };
+
+    forEach(events[type || event.type], function(fn) {
+      fn.call(element, event);
+    });
+
+    // Remove monkey-patched methods (IE),
+    // as they would cause memory leaks in IE8.
+    if (msie <= 8) {
+      // IE7/8 does not allow to delete property on native object
+      event.preventDefault = null;
+      event.stopPropagation = null;
+      event.isDefaultPrevented = null;
+    } else {
+      // It shouldn't affect normal browsers (native methods are defined on prototype).
+      delete event.preventDefault;
+      delete event.stopPropagation;
+      delete event.isDefaultPrevented;
+    }
+  };
+  eventHandler.elem = element;
+  return eventHandler;
+}
+
+//////////////////////////////////////////
+// Functions iterating traversal.
+// These functions chain results into a single
+// selector.
+//////////////////////////////////////////
+forEach({
+  removeData: jqLiteRemoveData,
+
+  dealoc: jqLiteDealoc,
+
+  on: function onFn(element, type, fn, unsupported){
+    if (isDefined(unsupported)) throw jqLiteMinErr('onargs', 'jqLite#on() does not support the `selector` or `eventData` parameters');
+
+    var events = jqLiteExpandoStore(element, 'events'),
+        handle = jqLiteExpandoStore(element, 'handle');
+
+    if (!events) jqLiteExpandoStore(element, 'events', events = {});
+    if (!handle) jqLiteExpandoStore(element, 'handle', handle = createEventHandler(element, events));
+
+    forEach(type.split(' '), function(type){
+      var eventFns = events[type];
+
+      if (!eventFns) {
+        if (type == 'mouseenter' || type == 'mouseleave') {
+          var contains = document.body.contains || document.body.compareDocumentPosition ?
+          function( a, b ) {
+            // jshint bitwise: false
+            var adown = a.nodeType === 9 ? a.documentElement : a,
+            bup = b && b.parentNode;
+            return a === bup || !!( bup && bup.nodeType === 1 && (
+              adown.contains ?
+              adown.contains( bup ) :
+              a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+              ));
+            } :
+            function( a, b ) {
+              if ( b ) {
+                while ( (b = b.parentNode) ) {
+                  if ( b === a ) {
+                    return true;
+                  }
+                }
+              }
+              return false;
+            };
+
+          events[type] = [];
+
+          // Refer to jQuery's implementation of mouseenter & mouseleave
+          // Read about mouseenter and mouseleave:
+          // http://www.quirksmode.org/js/events_mouse.html#link8
+          var eventmap = { mouseleave : "mouseout", mouseenter : "mouseover"};
+
+          onFn(element, eventmap[type], function(event) {
+            var target = this, related = event.relatedTarget;
+            // For mousenter/leave call the handler if related is outside the target.
+            // NB: No relatedTarget if the mouse left/entered the browser window
+            if ( !related || (related !== target && !contains(target, related)) ){
+              handle(event, type);
+            }
+          });
+
+        } else {
+          addEventListenerFn(element, type, handle);
+          events[type] = [];
+        }
+        eventFns = events[type];
+      }
+      eventFns.push(fn);
+    });
+  },
+
+  off: jqLiteOff,
+
+  replaceWith: function(element, replaceNode) {
+    var index, parent = element.parentNode;
+    jqLiteDealoc(element);
+    forEach(new JQLite(replaceNode), function(node){
+      if (index) {
+        parent.insertBefore(node, index.nextSibling);
+      } else {
+        parent.replaceChild(node, element);
+      }
+      index = node;
+    });
+  },
+
+  children: function(element) {
+    var children = [];
+    forEach(element.childNodes, function(element){
+      if (element.nodeType === 1)
+        children.push(element);
+    });
+    return children;
+  },
+
+  contents: function(element) {
+    return element.childNodes || [];
+  },
+
+  append: function(element, node) {
+    forEach(new JQLite(node), function(child){
+      if (element.nodeType === 1 || element.nodeType === 11) {
+        element.appendChild(child);
+      }
+    });
+  },
+
+  prepend: function(element, node) {
+    if (element.nodeType === 1) {
+      var index = element.firstChild;
+      forEach(new JQLite(node), function(child){
+        element.insertBefore(child, index);
+      });
+    }
+  },
+
+  wrap: function(element, wrapNode) {
+    wrapNode = jqLite(wrapNode)[0];
+    var parent = element.parentNode;
+    if (parent) {
+      parent.replaceChild(wrapNode, element);
+    }
+    wrapNode.appendChild(element);
+  },
+
+  remove: function(element) {
+    jqLiteDealoc(element);
+    var parent = element.parentNode;
+    if (parent) parent.removeChild(element);
+  },
+
+  after: function(element, newElement) {
+    var index = element, parent = element.parentNode;
+    forEach(new JQLite(newElement), function(node){
+      parent.insertBefore(node, index.nextSibling);
+      index = node;
+    });
+  },
+
+  addClass: jqLiteAddClass,
+  removeClass: jqLiteRemoveClass,
+
+  toggleClass: function(element, selector, condition) {
+    if (isUndefined(condition)) {
+      condition = !jqLiteHasClass(element, selector);
+    }
+    (condition ? jqLiteAddClass : jqLiteRemoveClass)(element, selector);
+  },
+
+  parent: function(element) {
+    var parent = element.parentNode;
+    return parent && parent.nodeType !== 11 ? parent : null;
+  },
+
+  next: function(element) {
+    if (element.nextElementSibling) {
+      return element.nextElementSibling;
+    }
+
+    // IE8 doesn't have nextElementSibling
+    var elm = element.nextSibling;
+    while (elm != null && elm.nodeType !== 1) {
+      elm = elm.nextSibling;
+    }
+    return elm;
+  },
+
+  find: function(element, selector) {
+    if (element.getElementsByTagName) {
+      return element.getElementsByTagName(selector);
+    } else {
+      return [];
+    }
+  },
+
+  clone: jqLiteClone,
+
+  triggerHandler: function(element, eventName, eventData) {
+    var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName];
+
+    eventData = eventData || [];
+
+    var event = [{
+      preventDefault: noop,
+      stopPropagation: noop
+    }];
+
+    forEach(eventFns, function(fn) {
+      fn.apply(element, event.concat(eventData));
+    });
+  }
+}, function(fn, name){
+  /**
+   * chaining functions
+   */
+  JQLite.prototype[name] = function(arg1, arg2, arg3) {
+    var value;
+    for(var i=0; i < this.length; i++) {
+      if (isUndefined(value)) {
+        value = fn(this[i], arg1, arg2, arg3);
+        if (isDefined(value)) {
+          // any function which returns a value needs to be wrapped
+          value = jqLite(value);
+        }
+      } else {
+        jqLiteAddNodes(value, fn(this[i], arg1, arg2, arg3));
+      }
+    }
+    return isDefined(value) ? value : this;
+  };
+
+  // bind legacy bind/unbind to on/off
+  JQLite.prototype.bind = JQLite.prototype.on;
+  JQLite.prototype.unbind = JQLite.prototype.off;
+});
+
+/**
+ * Computes a hash of an 'obj'.
+ * Hash of a:
+ *  string is string
+ *  number is number as string
+ *  object is either result of calling $$hashKey function on the object or uniquely generated id,
+ *         that is also assigned to the $$hashKey property of the object.
+ *
+ * @param obj
+ * @returns {string} hash string such that the same input will have the same hash string.
+ *         The resulting string key is in 'type:hashKey' format.
+ */
+function hashKey(obj) {
+  var objType = typeof obj,
+      key;
+
+  if (objType == 'object' && obj !== null) {
+    if (typeof (key = obj.$$hashKey) == 'function') {
+      // must invoke on object to keep the right this
+      key = obj.$$hashKey();
+    } else if (key === undefined) {
+      key = obj.$$hashKey = nextUid();
+    }
+  } else {
+    key = obj;
+  }
+
+  return objType + ':' + key;
+}
+
+/**
+ * HashMap which can use objects as keys
+ */
+function HashMap(array){
+  forEach(array, this.put, this);
+}
+HashMap.prototype = {
+  /**
+   * Store key value pair
+   * @param key key to store can be any type
+   * @param value value to store can be any type
+   */
+  put: function(key, value) {
+    this[hashKey(key)] = value;
+  },
+
+  /**
+   * @param key
+   * @returns the value for the key
+   */
+  get: function(key) {
+    return this[hashKey(key)];
+  },
+
+  /**
+   * Remove the key/value pair
+   * @param key
+   */
+  remove: function(key) {
+    var value = this[key = hashKey(key)];
+    delete this[key];
+    return value;
+  }
+};
+
+/**
+ * @ngdoc function
+ * @name angular.injector
+ * @function
+ *
+ * @description
+ * Creates an injector function that can be used for retrieving services as well as for
+ * dependency injection (see {@link guide/di dependency injection}).
+ *
+
+ * @param {Array.<string|Function>} modules A list of module functions or their aliases. See
+ *        {@link angular.module}. The `ng` module must be explicitly added.
+ * @returns {function()} Injector function. See {@link AUTO.$injector $injector}.
+ *
+ * @example
+ * Typical usage
+ * <pre>
+ *   // create an injector
+ *   var $injector = angular.injector(['ng']);
+ *
+ *   // use the injector to kick off your application
+ *   // use the type inference to auto inject arguments, or use implicit injection
+ *   $injector.invoke(function($rootScope, $compile, $document){
+ *     $compile($document)($rootScope);
+ *     $rootScope.$digest();
+ *   });
+ * </pre>
+ *
+ * Sometimes you want to get access to the injector of a currently running Angular app
+ * from outside Angular. Perhaps, you want to inject and compile some markup after the
+ * application has been bootstrapped. You can do this using extra `injector()` added
+ * to JQuery/jqLite elements. See {@link angular.element}.
+ *
+ * *This is fairly rare but could be the case if a third party library is injecting the
+ * markup.*
+ *
+ * In the following example a new block of HTML containing a `ng-controller`
+ * directive is added to the end of the document body by JQuery. We then compile and link
+ * it into the current AngularJS scope.
+ *
+ * <pre>
+ * var $div = $('<div ng-controller="MyCtrl">{{content.label}}</div>');
+ * $(document.body).append($div);
+ *
+ * angular.element(document).injector().invoke(function($compile) {
+ *   var scope = angular.element($div).scope();
+ *   $compile($div)(scope);
+ * });
+ * </pre>
+ */
+
+
+/**
+ * @ngdoc overview
+ * @name AUTO
+ * @description
+ *
+ * Implicit module which gets automatically added to each {@link AUTO.$injector $injector}.
+ */
+
+var FN_ARGS = /^function\s*[^\(]*\(\s*([^\)]*)\)/m;
+var FN_ARG_SPLIT = /,/;
+var FN_ARG = /^\s*(_?)(\S+?)\1\s*$/;
+var STRIP_COMMENTS = /((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg;
+var $injectorMinErr = minErr('$injector');
+function annotate(fn) {
+  var $inject,
+      fnText,
+      argDecl,
+      last;
+
+  if (typeof fn == 'function') {
+    if (!($inject = fn.$inject)) {
+      $inject = [];
+      if (fn.length) {
+        fnText = fn.toString().replace(STRIP_COMMENTS, '');
+        argDecl = fnText.match(FN_ARGS);
+        forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
+          arg.replace(FN_ARG, function(all, underscore, name){
+            $inject.push(name);
+          });
+        });
+      }
+      fn.$inject = $inject;
+    }
+  } else if (isArray(fn)) {
+    last = fn.length - 1;
+    assertArgFn(fn[last], 'fn');
+    $inject = fn.slice(0, last);
+  } else {
+    assertArgFn(fn, 'fn', true);
+  }
+  return $inject;
+}
+
+///////////////////////////////////////
+
+/**
+ * @ngdoc object
+ * @name AUTO.$injector
+ * @function
+ *
+ * @description
+ *
+ * `$injector` is used to retrieve object instances as defined by
+ * {@link AUTO.$provide provider}, instantiate types, invoke methods,
+ * and load modules.
+ *
+ * The following always holds true:
+ *
+ * <pre>
+ *   var $injector = angular.injector();
+ *   expect($injector.get('$injector')).toBe($injector);
+ *   expect($injector.invoke(function($injector){
+ *     return $injector;
+ *   }).toBe($injector);
+ * </pre>
+ *
+ * # Injection Function Annotation
+ *
+ * JavaScript does not have annotations, and annotations are needed for dependency injection. The
+ * following are all valid ways of annotating function with injection arguments and are equivalent.
+ *
+ * <pre>
+ *   // inferred (only works if code not minified/obfuscated)
+ *   $injector.invoke(function(serviceA){});
+ *
+ *   // annotated
+ *   function explicit(serviceA) {};
+ *   explicit.$inject = ['serviceA'];
+ *   $injector.invoke(explicit);
+ *
+ *   // inline
+ *   $injector.invoke(['serviceA', function(serviceA){}]);
+ * </pre>
+ *
+ * ## Inference
+ *
+ * In JavaScript calling `toString()` on a function returns the function definition. The definition
+ * can then be parsed and the function arguments can be extracted. *NOTE:* This does not work with
+ * minification, and obfuscation tools since these tools change the argument names.
+ *
+ * ## `$inject` Annotation
+ * By adding a `$inject` property onto a function the injection parameters can be specified.
+ *
+ * ## Inline
+ * As an array of injection names, where the last item in the array is the function to call.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#get
+ * @methodOf AUTO.$injector
+ *
+ * @description
+ * Return an instance of the service.
+ *
+ * @param {string} name The name of the instance to retrieve.
+ * @return {*} The instance.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#invoke
+ * @methodOf AUTO.$injector
+ *
+ * @description
+ * Invoke the method and supply the method arguments from the `$injector`.
+ *
+ * @param {!function} fn The function to invoke. Function parameters are injected according to the
+ *   {@link guide/di $inject Annotation} rules.
+ * @param {Object=} self The `this` for the invoked method.
+ * @param {Object=} locals Optional object. If preset then any argument names are read from this
+ *                         object first, before the `$injector` is consulted.
+ * @returns {*} the value returned by the invoked `fn` function.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#has
+ * @methodOf AUTO.$injector
+ *
+ * @description
+ * Allows the user to query if the particular service exist.
+ *
+ * @param {string} Name of the service to query.
+ * @returns {boolean} returns true if injector has given service.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#instantiate
+ * @methodOf AUTO.$injector
+ * @description
+ * Create a new instance of JS type. The method takes a constructor function invokes the new
+ * operator and supplies all of the arguments to the constructor function as specified by the
+ * constructor annotation.
+ *
+ * @param {function} Type Annotated constructor function.
+ * @param {Object=} locals Optional object. If preset then any argument names are read from this
+ * object first, before the `$injector` is consulted.
+ * @returns {Object} new instance of `Type`.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$injector#annotate
+ * @methodOf AUTO.$injector
+ *
+ * @description
+ * Returns an array of service names which the function is requesting for injection. This API is
+ * used by the injector to determine which services need to be injected into the function when the
+ * function is invoked. There are three ways in which the function can be annotated with the needed
+ * dependencies.
+ *
+ * # Argument names
+ *
+ * The simplest form is to extract the dependencies from the arguments of the function. This is done
+ * by converting the function into a string using `toString()` method and extracting the argument
+ * names.
+ * <pre>
+ *   // Given
+ *   function MyController($scope, $route) {
+ *     // ...
+ *   }
+ *
+ *   // Then
+ *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
+ * </pre>
+ *
+ * This method does not work with code minification / obfuscation. For this reason the following
+ * annotation strategies are supported.
+ *
+ * # The `$inject` property
+ *
+ * If a function has an `$inject` property and its value is an array of strings, then the strings
+ * represent names of services to be injected into the function.
+ * <pre>
+ *   // Given
+ *   var MyController = function(obfuscatedScope, obfuscatedRoute) {
+ *     // ...
+ *   }
+ *   // Define function dependencies
+ *   MyController['$inject'] = ['$scope', '$route'];
+ *
+ *   // Then
+ *   expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
+ * </pre>
+ *
+ * # The array notation
+ *
+ * It is often desirable to inline Injected functions and that's when setting the `$inject` property
+ * is very inconvenient. In these situations using the array notation to specify the dependencies in
+ * a way that survives minification is a better choice:
+ *
+ * <pre>
+ *   // We wish to write this (not minification / obfuscation safe)
+ *   injector.invoke(function($compile, $rootScope) {
+ *     // ...
+ *   });
+ *
+ *   // We are forced to write break inlining
+ *   var tmpFn = function(obfuscatedCompile, obfuscatedRootScope) {
+ *     // ...
+ *   };
+ *   tmpFn.$inject = ['$compile', '$rootScope'];
+ *   injector.invoke(tmpFn);
+ *
+ *   // To better support inline function the inline annotation is supported
+ *   injector.invoke(['$compile', '$rootScope', function(obfCompile, obfRootScope) {
+ *     // ...
+ *   }]);
+ *
+ *   // Therefore
+ *   expect(injector.annotate(
+ *      ['$compile', '$rootScope', function(obfus_$compile, obfus_$rootScope) {}])
+ *    ).toEqual(['$compile', '$rootScope']);
+ * </pre>
+ *
+ * @param {function|Array.<string|Function>} fn Function for which dependent service names need to
+ * be retrieved as described above.
+ *
+ * @returns {Array.<string>} The names of the services which the function requires.
+ */
+
+
+
+
+/**
+ * @ngdoc object
+ * @name AUTO.$provide
+ *
+ * @description
+ *
+ * The {@link AUTO.$provide $provide} service has a number of methods for registering components
+ * with the {@link AUTO.$injector $injector}. Many of these functions are also exposed on
+ * {@link angular.Module}.
+ *
+ * An Angular **service** is a singleton object created by a **service factory**.  These **service
+ * factories** are functions which, in turn, are created by a **service provider**.
+ * The **service providers** are constructor functions. When instantiated they must contain a
+ * property called `$get`, which holds the **service factory** function.
+ *
+ * When you request a service, the {@link AUTO.$injector $injector} is responsible for finding the
+ * correct **service provider**, instantiating it and then calling its `$get` **service factory**
+ * function to get the instance of the **service**.
+ *
+ * Often services have no configuration options and there is no need to add methods to the service
+ * provider.  The provider will be no more than a constructor function with a `$get` property. For
+ * these cases the {@link AUTO.$provide $provide} service has additional helper methods to register
+ * services without specifying a provider.
+ *
+ * * {@link AUTO.$provide#methods_provider provider(provider)} - registers a **service provider** with the
+ *     {@link AUTO.$injector $injector}
+ * * {@link AUTO.$provide#methods_constant constant(obj)} - registers a value/object that can be accessed by
+ *     providers and services.
+ * * {@link AUTO.$provide#methods_value value(obj)} - registers a value/object that can only be accessed by
+ *     services, not providers.
+ * * {@link AUTO.$provide#methods_factory factory(fn)} - registers a service **factory function**, `fn`,
+ *     that will be wrapped in a **service provider** object, whose `$get` property will contain the
+ *     given factory function.
+ * * {@link AUTO.$provide#methods_service service(class)} - registers a **constructor function**, `class` that
+ *     that will be wrapped in a **service provider** object, whose `$get` property will instantiate
+ *      a new object using the given constructor function.
+ *
+ * See the individual methods for more information and examples.
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#provider
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * Register a **provider function** with the {@link AUTO.$injector $injector}. Provider functions
+ * are constructor functions, whose instances are responsible for "providing" a factory for a
+ * service.
+ *
+ * Service provider names start with the name of the service they provide followed by `Provider`.
+ * For example, the {@link ng.$log $log} service has a provider called
+ * {@link ng.$logProvider $logProvider}.
+ *
+ * Service provider objects can have additional methods which allow configuration of the provider
+ * and its service. Importantly, you can configure what kind of service is created by the `$get`
+ * method, or how that service will act. For example, the {@link ng.$logProvider $logProvider} has a
+ * method {@link ng.$logProvider#debugEnabled debugEnabled}
+ * which lets you specify whether the {@link ng.$log $log} service will log debug messages to the
+ * console or not.
+ *
+ * @param {string} name The name of the instance. NOTE: the provider will be available under `name +
+                        'Provider'` key.
+ * @param {(Object|function())} provider If the provider is:
+ *
+ *   - `Object`: then it should have a `$get` method. The `$get` method will be invoked using
+ *               {@link AUTO.$injector#invoke $injector.invoke()} when an instance needs to be
+ *               created.
+ *   - `Constructor`: a new instance of the provider will be created using
+ *               {@link AUTO.$injector#instantiate $injector.instantiate()}, then treated as
+ *               `object`.
+ *
+ * @returns {Object} registered provider instance
+
+ * @example
+ *
+ * The following example shows how to create a simple event tracking service and register it using
+ * {@link AUTO.$provide#methods_provider $provide.provider()}.
+ *
+ * <pre>
+ *  // Define the eventTracker provider
+ *  function EventTrackerProvider() {
+ *    var trackingUrl = '/track';
+ *
+ *    // A provider method for configuring where the tracked events should been saved
+ *    this.setTrackingUrl = function(url) {
+ *      trackingUrl = url;
+ *    };
+ *
+ *    // The service factory function
+ *    this.$get = ['$http', function($http) {
+ *      var trackedEvents = {};
+ *      return {
+ *        // Call this to track an event
+ *        event: function(event) {
+ *          var count = trackedEvents[event] || 0;
+ *          count += 1;
+ *          trackedEvents[event] = count;
+ *          return count;
+ *        },
+ *        // Call this to save the tracked events to the trackingUrl
+ *        save: function() {
+ *          $http.post(trackingUrl, trackedEvents);
+ *        }
+ *      };
+ *    }];
+ *  }
+ *
+ *  describe('eventTracker', function() {
+ *    var postSpy;
+ *
+ *    beforeEach(module(function($provide) {
+ *      // Register the eventTracker provider
+ *      $provide.provider('eventTracker', EventTrackerProvider);
+ *    }));
+ *
+ *    beforeEach(module(function(eventTrackerProvider) {
+ *      // Configure eventTracker provider
+ *      eventTrackerProvider.setTrackingUrl('/custom-track');
+ *    }));
+ *
+ *    it('tracks events', inject(function(eventTracker) {
+ *      expect(eventTracker.event('login')).toEqual(1);
+ *      expect(eventTracker.event('login')).toEqual(2);
+ *    }));
+ *
+ *    it('saves to the tracking url', inject(function(eventTracker, $http) {
+ *      postSpy = spyOn($http, 'post');
+ *      eventTracker.event('login');
+ *      eventTracker.save();
+ *      expect(postSpy).toHaveBeenCalled();
+ *      expect(postSpy.mostRecentCall.args[0]).not.toEqual('/track');
+ *      expect(postSpy.mostRecentCall.args[0]).toEqual('/custom-track');
+ *      expect(postSpy.mostRecentCall.args[1]).toEqual({ 'login': 1 });
+ *    }));
+ *  });
+ * </pre>
+ */
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#factory
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * Register a **service factory**, which will be called to return the service instance.
+ * This is short for registering a service where its provider consists of only a `$get` property,
+ * which is the given service factory function.
+ * You should use {@link AUTO.$provide#factory $provide.factory(getFn)} if you do not need to
+ * configure your service in a provider.
+ *
+ * @param {string} name The name of the instance.
+ * @param {function()} $getFn The $getFn for the instance creation. Internally this is a short hand
+ *                            for `$provide.provider(name, {$get: $getFn})`.
+ * @returns {Object} registered provider instance
+ *
+ * @example
+ * Here is an example of registering a service
+ * <pre>
+ *   $provide.factory('ping', ['$http', function($http) {
+ *     return function ping() {
+ *       return $http.send('/ping');
+ *     };
+ *   }]);
+ * </pre>
+ * You would then inject and use this service like this:
+ * <pre>
+ *   someModule.controller('Ctrl', ['ping', function(ping) {
+ *     ping();
+ *   }]);
+ * </pre>
+ */
+
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#service
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * Register a **service constructor**, which will be invoked with `new` to create the service
+ * instance.
+ * This is short for registering a service where its provider's `$get` property is the service
+ * constructor function that will be used to instantiate the service instance.
+ *
+ * You should use {@link AUTO.$provide#methods_service $provide.service(class)} if you define your service
+ * as a type/class. This is common when using {@link http://coffeescript.org CoffeeScript}.
+ *
+ * @param {string} name The name of the instance.
+ * @param {Function} constructor A class (constructor function) that will be instantiated.
+ * @returns {Object} registered provider instance
+ *
+ * @example
+ * Here is an example of registering a service using
+ * {@link AUTO.$provide#methods_service $provide.service(class)} that is defined as a CoffeeScript class.
+ * <pre>
+ *   class Ping
+ *     constructor: (@$http)->
+ *     send: ()=>
+ *       @$http.get('/ping')
+ *
+ *   $provide.service('ping', ['$http', Ping])
+ * </pre>
+ * You would then inject and use this service like this:
+ * <pre>
+ *   someModule.controller 'Ctrl', ['ping', (ping)->
+ *     ping.send()
+ *   ]
+ * </pre>
+ */
+
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#value
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * Register a **value service** with the {@link AUTO.$injector $injector}, such as a string, a
+ * number, an array, an object or a function.  This is short for registering a service where its
+ * provider's `$get` property is a factory function that takes no arguments and returns the **value
+ * service**.
+ *
+ * Value services are similar to constant services, except that they cannot be injected into a
+ * module configuration function (see {@link angular.Module#config}) but they can be overridden by
+ * an Angular
+ * {@link AUTO.$provide#decorator decorator}.
+ *
+ * @param {string} name The name of the instance.
+ * @param {*} value The value.
+ * @returns {Object} registered provider instance
+ *
+ * @example
+ * Here are some examples of creating value services.
+ * <pre>
+ *   $provide.value('ADMIN_USER', 'admin');
+ *
+ *   $provide.value('RoleLookup', { admin: 0, writer: 1, reader: 2 });
+ *
+ *   $provide.value('halfOf', function(value) {
+ *     return value / 2;
+ *   });
+ * </pre>
+ */
+
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#constant
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * Register a **constant service**, such as a string, a number, an array, an object or a function,
+ * with the {@link AUTO.$injector $injector}. Unlike {@link AUTO.$provide#value value} it can be
+ * injected into a module configuration function (see {@link angular.Module#config}) and it cannot
+ * be overridden by an Angular {@link AUTO.$provide#decorator decorator}.
+ *
+ * @param {string} name The name of the constant.
+ * @param {*} value The constant value.
+ * @returns {Object} registered instance
+ *
+ * @example
+ * Here a some examples of creating constants:
+ * <pre>
+ *   $provide.constant('SHARD_HEIGHT', 306);
+ *
+ *   $provide.constant('MY_COLOURS', ['red', 'blue', 'grey']);
+ *
+ *   $provide.constant('double', function(value) {
+ *     return value * 2;
+ *   });
+ * </pre>
+ */
+
+
+/**
+ * @ngdoc method
+ * @name AUTO.$provide#decorator
+ * @methodOf AUTO.$provide
+ * @description
+ *
+ * Register a **service decorator** with the {@link AUTO.$injector $injector}. A service decorator
+ * intercepts the creation of a service, allowing it to override or modify the behaviour of the
+ * service. The object returned by the decorator may be the original service, or a new service
+ * object which replaces or wraps and delegates to the original service.
+ *
+ * @param {string} name The name of the service to decorate.
+ * @param {function()} decorator This function will be invoked when the service needs to be
+ *    instantiated and should return the decorated service instance. The function is called using
+ *    the {@link AUTO.$injector#invoke injector.invoke} method and is therefore fully injectable.
+ *    Local injection arguments:
+ *
+ *    * `$delegate` - The original service instance, which can be monkey patched, configured,
+ *      decorated or delegated to.
+ *
+ * @example
+ * Here we decorate the {@link ng.$log $log} service to convert warnings to errors by intercepting
+ * calls to {@link ng.$log#error $log.warn()}.
+ * <pre>
+ *   $provider.decorator('$log', ['$delegate', function($delegate) {
+ *     $delegate.warn = $delegate.error;
+ *     return $delegate;
+ *   }]);
+ * </pre>
+ */
+
+
+function createInjector(modulesToLoad) {
+  var INSTANTIATING = {},
+      providerSuffix = 'Provider',
+      path = [],
+      loadedModules = new HashMap(),
+      providerCache = {
+        $provide: {
+            provider: supportObject(provider),
+            factory: supportObject(factory),
+            service: supportObject(service),
+            value: supportObject(value),
+            constant: supportObject(constant),
+            decorator: decorator
+          }
+      },
+      providerInjector = (providerCache.$injector =
+          createInternalInjector(providerCache, function() {
+            throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- '));
+          })),
+      instanceCache = {},
+      instanceInjector = (instanceCache.$injector =
+          createInternalInjector(instanceCache, function(servicename) {
+            var provider = providerInjector.get(servicename + providerSuffix);
+            return instanceInjector.invoke(provider.$get, provider);
+          }));
+
+
+  forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn || noop); });
+
+  return instanceInjector;
+
+  ////////////////////////////////////
+  // $provider
+  ////////////////////////////////////
+
+  function supportObject(delegate) {
+    return function(key, value) {
+      if (isObject(key)) {
+        forEach(key, reverseParams(delegate));
+      } else {
+        return delegate(key, value);
+      }
+    };
+  }
+
+  function provider(name, provider_) {
+    assertNotHasOwnProperty(name, 'service');
+    if (isFunction(provider_) || isArray(provider_)) {
+      provider_ = providerInjector.instantiate(provider_);
+    }
+    if (!provider_.$get) {
+      throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name);
+    }
+    return providerCache[name + providerSuffix] = provider_;
+  }
+
+  function factory(name, factoryFn) { return provider(name, { $get: factoryFn }); }
+
+  function service(name, constructor) {
+    return factory(name, ['$injector', function($injector) {
+      return $injector.instantiate(constructor);
+    }]);
+  }
+
+  function value(name, val) { return factory(name, valueFn(val)); }
+
+  function constant(name, value) {
+    assertNotHasOwnProperty(name, 'constant');
+    providerCache[name] = value;
+    instanceCache[name] = value;
+  }
+
+  function decorator(serviceName, decorFn) {
+    var origProvider = providerInjector.get(serviceName + providerSuffix),
+        orig$get = origProvider.$get;
+
+    origProvider.$get = function() {
+      var origInstance = instanceInjector.invoke(orig$get, origProvider);
+      return instanceInjector.invoke(decorFn, null, {$delegate: origInstance});
+    };
+  }
+
+  ////////////////////////////////////
+  // Module Loading
+  ////////////////////////////////////
+  function loadModules(modulesToLoad){
+    var runBlocks = [], moduleFn, invokeQueue, i, ii;
+    forEach(modulesToLoad, function(module) {
+      if (loadedModules.get(module)) return;
+      loadedModules.put(module, true);
+
+      try {
+        if (isString(module)) {
+          moduleFn = angularModule(module);
+          runBlocks = runBlocks.concat(loadModules(moduleFn.requires)).concat(moduleFn._runBlocks);
+
+          for(invokeQueue = moduleFn._invokeQueue, i = 0, ii = invokeQueue.length; i < ii; i++) {
+            var invokeArgs = invokeQueue[i],
+                provider = providerInjector.get(invokeArgs[0]);
+
+            provider[invokeArgs[1]].apply(provider, invokeArgs[2]);
+          }
+        } else if (isFunction(module)) {
+            runBlocks.push(providerInjector.invoke(module));
+        } else if (isArray(module)) {
+            runBlocks.push(providerInjector.invoke(module));
+        } else {
+          assertArgFn(module, 'module');
+        }
+      } catch (e) {
+        if (isArray(module)) {
+          module = module[module.length - 1];
+        }
+        if (e.message && e.stack && e.stack.indexOf(e.message) == -1) {
+          // Safari & FF's stack traces don't contain error.message content
+          // unlike those of Chrome and IE
+          // So if stack doesn't contain message, we create a new string that contains both.
+          // Since error.stack is read-only in Safari, I'm overriding e and not e.stack here.
+          /* jshint -W022 */
+          e = e.message + '\n' + e.stack;
+        }
+        throw $injectorMinErr('modulerr', "Failed to instantiate module {0} due to:\n{1}",
+                  module, e.stack || e.message || e);
+      }
+    });
+    return runBlocks;
+  }
+
+  ////////////////////////////////////
+  // internal Injector
+  ////////////////////////////////////
+
+  function createInternalInjector(cache, factory) {
+
+    function getService(serviceName) {
+      if (cache.hasOwnProperty(serviceName)) {
+        if (cache[serviceName] === INSTANTIATING) {
+          throw $injectorMinErr('cdep', 'Circular dependency found: {0}', path.join(' <- '));
+        }
+        return cache[serviceName];
+      } else {
+        try {
+          path.unshift(serviceName);
+          cache[serviceName] = INSTANTIATING;
+          return cache[serviceName] = factory(serviceName);
+        } finally {
+          path.shift();
+        }
+      }
+    }
+
+    function invoke(fn, self, locals){
+      var args = [],
+          $inject = annotate(fn),
+          length, i,
+          key;
+
+      for(i = 0, length = $inject.length; i < length; i++) {
+        key = $inject[i];
+        if (typeof key !== 'string') {
+          throw $injectorMinErr('itkn',
+                  'Incorrect injection token! Expected service name as string, got {0}', key);
+        }
+        args.push(
+          locals && locals.hasOwnProperty(key)
+          ? locals[key]
+          : getService(key)
+        );
+      }
+      if (!fn.$inject) {
+        // this means that we must be an array.
+        fn = fn[length];
+      }
+
+      // http://jsperf.com/angularjs-invoke-apply-vs-switch
+      // #5388
+      return fn.apply(self, args);
+    }
+
+    function instantiate(Type, locals) {
+      var Constructor = function() {},
+          instance, returnedValue;
+
+      // Check if Type is annotated and use just the given function at n-1 as parameter
+      // e.g. someModule.factory('greeter', ['$window', function(renamed$window) {}]);
+      Constructor.prototype = (isArray(Type) ? Type[Type.length - 1] : Type).prototype;
+      instance = new Constructor();
+      returnedValue = invoke(Type, instance, locals);
+
+      return isObject(returnedValue) || isFunction(returnedValue) ? returnedValue : instance;
+    }
+
+    return {
+      invoke: invoke,
+      instantiate: instantiate,
+      get: getService,
+      annotate: annotate,
+      has: function(name) {
+        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
+      }
+    };
+  }
+}
+
+/**
+ * @ngdoc function
+ * @name ng.$anchorScroll
+ * @requires $window
+ * @requires $location
+ * @requires $rootScope
+ *
+ * @description
+ * When called, it checks current value of `$location.hash()` and scroll to related element,
+ * according to rules specified in
+ * {@link http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document Html5 spec}.
+ *
+ * It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor.
+ * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.
+ * 
+ * @example
+   <example>
+     <file name="index.html">
+       <div id="scrollArea" ng-controller="ScrollCtrl">
+         <a ng-click="gotoBottom()">Go to bottom</a>
+         <a id="bottom"></a> You're at the bottom!
+       </div>
+     </file>
+     <file name="script.js">
+       function ScrollCtrl($scope, $location, $anchorScroll) {
+         $scope.gotoBottom = function (){
+           // set the location.hash to the id of
+           // the element you wish to scroll to.
+           $location.hash('bottom');
+           
+           // call $anchorScroll()
+           $anchorScroll();
+         }
+       }
+     </file>
+     <file name="style.css">
+       #scrollArea {
+         height: 350px;
+         overflow: auto;
+       }
+
+       #bottom {
+         display: block;
+         margin-top: 2000px;
+       }
+     </file>
+   </example>
+ */
+function $AnchorScrollProvider() {
+
+  var autoScrollingEnabled = true;
+
+  this.disableAutoScrolling = function() {
+    autoScrollingEnabled = false;
+  };
+
+  this.$get = ['$window', '$location', '$rootScope', function($window, $location, $rootScope) {
+    var document = $window.document;
+
+    // helper function to get first anchor from a NodeList
+    // can't use filter.filter, as it accepts only instances of Array
+    // and IE can't convert NodeList to an array using [].slice
+    // TODO(vojta): use filter if we change it to accept lists as well
+    function getFirstAnchor(list) {
+      var result = null;
+      forEach(list, function(element) {
+        if (!result && lowercase(element.nodeName) === 'a') result = element;
+      });
+      return result;
+    }
+
+    function scroll() {
+      var hash = $location.hash(), elm;
+
+      // empty hash, scroll to the top of the page
+      if (!hash) $window.scrollTo(0, 0);
+
+      // element with given id
+      else if ((elm = document.getElementById(hash))) elm.scrollIntoView();
+
+      // first anchor with given name :-D
+      else if ((elm = getFirstAnchor(document.getElementsByName(hash)))) elm.scrollIntoView();
+
+      // no element and hash == 'top', scroll to the top of the page
+      else if (hash === 'top') $window.scrollTo(0, 0);
+    }
+
+    // does not scroll when user clicks on anchor link that is currently on
+    // (no url change, no $location.hash() change), browser native does scroll
+    if (autoScrollingEnabled) {
+      $rootScope.$watch(function autoScrollWatch() {return $location.hash();},
+        function autoScrollWatchAction() {
+          $rootScope.$evalAsync(scroll);
+        });
+    }
+
+    return scroll;
+  }];
+}
+
+var $animateMinErr = minErr('$animate');
+
+/**
+ * @ngdoc object
+ * @name ng.$animateProvider
+ *
+ * @description
+ * Default implementation of $animate that doesn't perform any animations, instead just
+ * synchronously performs DOM
+ * updates and calls done() callbacks.
+ *
+ * In order to enable animations the ngAnimate module has to be loaded.
+ *
+ * To see the functional implementation check out src/ngAnimate/animate.js
+ */
+var $AnimateProvider = ['$provide', function($provide) {
+
+  
+  this.$$selectors = {};
+
+
+  /**
+   * @ngdoc function
+   * @name ng.$animateProvider#register
+   * @methodOf ng.$animateProvider
+   *
+   * @description
+   * Registers a new injectable animation factory function. The factory function produces the
+   * animation object which contains callback functions for each event that is expected to be
+   * animated.
+   *
+   *   * `eventFn`: `function(Element, doneFunction)` The element to animate, the `doneFunction`
+   *   must be called once the element animation is complete. If a function is returned then the
+   *   animation service will use this function to cancel the animation whenever a cancel event is
+   *   triggered.
+   *
+   *
+   *<pre>
+   *   return {
+     *     eventFn : function(element, done) {
+     *       //code to run the animation
+     *       //once complete, then run done()
+     *       return function cancellationFunction() {
+     *         //code to cancel the animation
+     *       }
+     *     }
+     *   }
+   *</pre>
+   *
+   * @param {string} name The name of the animation.
+   * @param {function} factory The factory function that will be executed to return the animation
+   *                           object.
+   */
+  this.register = function(name, factory) {
+    var key = name + '-animation';
+    if (name && name.charAt(0) != '.') throw $animateMinErr('notcsel',
+        "Expecting class selector starting with '.' got '{0}'.", name);
+    this.$$selectors[name.substr(1)] = key;
+    $provide.factory(key, factory);
+  };
+
+  this.$get = ['$timeout', function($timeout) {
+
+    /**
+     *
+     * @ngdoc object
+     * @name ng.$animate
+     * @description The $animate service provides rudimentary DOM manipulation functions to
+     * insert, remove and move elements within the DOM, as well as adding and removing classes.
+     * This service is the core service used by the ngAnimate $animator service which provides
+     * high-level animation hooks for CSS and JavaScript.
+     *
+     * $animate is available in the AngularJS core, however, the ngAnimate module must be included
+     * to enable full out animation support. Otherwise, $animate will only perform simple DOM
+     * manipulation operations.
+     *
+     * To learn more about enabling animation support, click here to visit the {@link ngAnimate
+     * ngAnimate module page} as well as the {@link ngAnimate.$animate ngAnimate $animate service
+     * page}.
+     */
+    return {
+
+      /**
+       *
+       * @ngdoc function
+       * @name ng.$animate#enter
+       * @methodOf ng.$animate
+       * @function
+       * @description Inserts the element into the DOM either after the `after` element or within
+       *   the `parent` element. Once complete, the done() callback will be fired (if provided).
+       * @param {jQuery/jqLite element} element the element which will be inserted into the DOM
+       * @param {jQuery/jqLite element} parent the parent element which will append the element as
+       *   a child (if the after element is not present)
+       * @param {jQuery/jqLite element} after the sibling element which will append the element
+       *   after itself
+       * @param {function=} done callback function that will be called after the element has been
+       *   inserted into the DOM
+       */
+      enter : function(element, parent, after, done) {
+        if (after) {
+          after.after(element);
+        } else {
+          if (!parent || !parent[0]) {
+            parent = after.parent();
+          }
+          parent.append(element);
+        }
+        done && $timeout(done, 0, false);
+      },
+
+      /**
+       *
+       * @ngdoc function
+       * @name ng.$animate#leave
+       * @methodOf ng.$animate
+       * @function
+       * @description Removes the element from the DOM. Once complete, the done() callback will be
+       *   fired (if provided).
+       * @param {jQuery/jqLite element} element the element which will be removed from the DOM
+       * @param {function=} done callback function that will be called after the element has been
+       *   removed from the DOM
+       */
+      leave : function(element, done) {
+        element.remove();
+        done && $timeout(done, 0, false);
+      },
+
+      /**
+       *
+       * @ngdoc function
+       * @name ng.$animate#move
+       * @methodOf ng.$animate
+       * @function
+       * @description Moves the position of the provided element within the DOM to be placed
+       * either after the `after` element or inside of the `parent` element. Once complete, the
+       * done() callback will be fired (if provided).
+       * 
+       * @param {jQuery/jqLite element} element the element which will be moved around within the
+       *   DOM
+       * @param {jQuery/jqLite element} parent the parent element where the element will be
+       *   inserted into (if the after element is not present)
+       * @param {jQuery/jqLite element} after the sibling element where the element will be
+       *   positioned next to
+       * @param {function=} done the callback function (if provided) that will be fired after the
+       *   element has been moved to its new position
+       */
+      move : function(element, parent, after, done) {
+        // Do not remove element before insert. Removing will cause data associated with the
+        // element to be dropped. Insert will implicitly do the remove.
+        this.enter(element, parent, after, done);
+      },
+
+      /**
+       *
+       * @ngdoc function
+       * @name ng.$animate#addClass
+       * @methodOf ng.$animate
+       * @function
+       * @description Adds the provided className CSS class value to the provided element. Once
+       * complete, the done() callback will be fired (if provided).
+       * @param {jQuery/jqLite element} element the element which will have the className value
+       *   added to it
+       * @param {string} className the CSS class which will be added to the element
+       * @param {function=} done the callback function (if provided) that will be fired after the
+       *   className value has been added to the element
+       */
+      addClass : function(element, className, done) {
+        className = isString(className) ?
+                      className :
+                      isArray(className) ? className.join(' ') : '';
+        forEach(element, function (element) {
+          jqLiteAddClass(element, className);
+        });
+        done && $timeout(done, 0, false);
+      },
+
+      /**
+       *
+       * @ngdoc function
+       * @name ng.$animate#removeClass
+       * @methodOf ng.$animate
+       * @function
+       * @description Removes the provided className CSS class value from the provided element.
+       * Once complete, the done() callback will be fired (if provided).
+       * @param {jQuery/jqLite element} element the element which will have the className value
+       *   removed from it
+       * @param {string} className the CSS class which will be removed from the element
+       * @param {function=} done the callback function (if provided) that will be fired after the
+       *   className value has been removed from the element
+       */
+      removeClass : function(element, className, done) {
+        className = isString(className) ?
+                      className :
+                      isArray(className) ? className.join(' ') : '';
+        forEach(element, function (element) {
+          jqLiteRemoveClass(element, className);
+        });
+        done && $timeout(done, 0, false);
+      },
+
+      enabled : noop
+    };
+  }];
+}];
+
+/**
+ * ! This is a private undocumented service !
+ *
+ * @name ng.$browser
+ * @requires $log
+ * @description
+ * This object has two goals:
+ *
+ * - hide all the global state in the browser caused by the window object
+ * - abstract away all the browser specific features and inconsistencies
+ *
+ * For tests we provide {@link ngMock.$browser mock implementation} of the `$browser`
+ * service, which can be used for convenient testing of the application without the interaction with
+ * the real browser apis.
+ */
+/**
+ * @param {object} window The global window object.
+ * @param {object} document jQuery wrapped document.
+ * @param {function()} XHR XMLHttpRequest constructor.
+ * @param {object} $log console.log or an object with the same interface.
+ * @param {object} $sniffer $sniffer service
+ */
+function Browser(window, document, $log, $sniffer) {
+  var self = this,
+      rawDocument = document[0],
+      location = window.location,
+      history = window.history,
+      setTimeout = window.setTimeout,
+      clearTimeout = window.clearTimeout,
+      pendingDeferIds = {};
+
+  self.isMock = false;
+
+  var outstandingRequestCount = 0;
+  var outstandingRequestCallbacks = [];
+
+  // TODO(vojta): remove this temporary api
+  self.$$completeOutstandingRequest = completeOutstandingRequest;
+  self.$$incOutstandingRequestCount = function() { outstandingRequestCount++; };
+
+  /**
+   * Executes the `fn` function(supports currying) and decrements the `outstandingRequestCallbacks`
+   * counter. If the counter reaches 0, all the `outstandingRequestCallbacks` are executed.
+   */
+  function completeOutstandingRequest(fn) {
+    try {
+      fn.apply(null, sliceArgs(arguments, 1));
+    } finally {
+      outstandingRequestCount--;
+      if (outstandingRequestCount === 0) {
+        while(outstandingRequestCallbacks.length) {
+          try {
+            outstandingRequestCallbacks.pop()();
+          } catch (e) {
+            $log.error(e);
+          }
+        }
+      }
+    }
+  }
+
+  /**
+   * @private
+   * Note: this method is used only by scenario runner
+   * TODO(vojta): prefix this method with $$ ?
+   * @param {function()} callback Function that will be called when no outstanding request
+   */
+  self.notifyWhenNoOutstandingRequests = function(callback) {
+    // force browser to execute all pollFns - this is needed so that cookies and other pollers fire
+    // at some deterministic time in respect to the test runner's actions. Leaving things up to the
+    // regular poller would result in flaky tests.
+    forEach(pollFns, function(pollFn){ pollFn(); });
+
+    if (outstandingRequestCount === 0) {
+      callback();
+    } else {
+      outstandingRequestCallbacks.push(callback);
+    }
+  };
+
+  //////////////////////////////////////////////////////////////
+  // Poll Watcher API
+  //////////////////////////////////////////////////////////////
+  var pollFns = [],
+      pollTimeout;
+
+  /**
+   * @name ng.$browser#addPollFn
+   * @methodOf ng.$browser
+   *
+   * @param {function()} fn Poll function to add
+   *
+   * @description
+   * Adds a function to the list of functions that poller periodically executes,
+   * and starts polling if not started yet.
+   *
+   * @returns {function()} the added function
+   */
+  self.addPollFn = function(fn) {
+    if (isUndefined(pollTimeout)) startPoller(100, setTimeout);
+    pollFns.push(fn);
+    return fn;
+  };
+
+  /**
+   * @param {number} interval How often should browser call poll functions (ms)
+   * @param {function()} setTimeout Reference to a real or fake `setTimeout` function.
+   *
+   * @description
+   * Configures the poller to run in the specified intervals, using the specified
+   * setTimeout fn and kicks it off.
+   */
+  function startPoller(interval, setTimeout) {
+    (function check() {
+      forEach(pollFns, function(pollFn){ pollFn(); });
+      pollTimeout = setTimeout(check, interval);
+    })();
+  }
+
+  //////////////////////////////////////////////////////////////
+  // URL API
+  //////////////////////////////////////////////////////////////
+
+  var lastBrowserUrl = location.href,
+      baseElement = document.find('base'),
+      newLocation = null;
+
+  /**
+   * @name ng.$browser#url
+   * @methodOf ng.$browser
+   *
+   * @description
+   * GETTER:
+   * Without any argument, this method just returns current value of location.href.
+   *
+   * SETTER:
+   * With at least one argument, this method sets url to new value.
+   * If html5 history api supported, pushState/replaceState is used, otherwise
+   * location.href/location.replace is used.
+   * Returns its own instance to allow chaining
+   *
+   * NOTE: this api is intended for use only by the $location service. Please use the
+   * {@link ng.$location $location service} to change url.
+   *
+   * @param {string} url New url (when used as setter)
+   * @param {boolean=} replace Should new url replace current history record ?
+   */
+  self.url = function(url, replace) {
+    // Android Browser BFCache causes location reference to become stale.
+    if (location !== window.location) location = window.location;
+
+    // setter
+    if (url) {
+      if (lastBrowserUrl == url) return;
+      lastBrowserUrl = url;
+      if ($sniffer.history) {
+        if (replace) history.replaceState(null, '', url);
+        else {
+          history.pushState(null, '', url);
+          // Crazy Opera Bug: http://my.opera.com/community/forums/topic.dml?id=1185462
+          baseElement.attr('href', baseElement.attr('href'));
+        }
+      } else {
+        newLocation = url;
+        if (replace) {
+          location.replace(url);
+        } else {
+          location.href = url;
+        }
+      }
+      return self;
+    // getter
+    } else {
+      // - newLocation is a workaround for an IE7-9 issue with location.replace and location.href
+      //   methods not updating location.href synchronously.
+      // - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
+      return newLocation || location.href.replace(/%27/g,"'");
+    }
+  };
+
+  var urlChangeListeners = [],
+      urlChangeInit = false;
+
+  function fireUrlChange() {
+    newLocation = null;
+    if (lastBrowserUrl == self.url()) return;
+
+    lastBrowserUrl = self.url();
+    forEach(urlChangeListeners, function(listener) {
+      listener(self.url());
+    });
+  }
+
+  /**
+   * @name ng.$browser#onUrlChange
+   * @methodOf ng.$browser
+   * @TODO(vojta): refactor to use node's syntax for events
+   *
+   * @description
+   * Register callback function that will be called, when url changes.
+   *
+   * It's only called when the url is changed by outside of angular:
+   * - user types different url into address bar
+   * - user clicks on history (forward/back) button
+   * - user clicks on a link
+   *
+   * It's not called when url is changed by $browser.url() method
+   *
+   * The listener gets called with new url as parameter.
+   *
+   * NOTE: this api is intended for use only by the $location service. Please use the
+   * {@link ng.$location $location service} to monitor url changes in angular apps.
+   *
+   * @param {function(string)} listener Listener function to be called when url changes.
+   * @return {function(string)} Returns the registered listener fn - handy if the fn is anonymous.
+   */
+  self.onUrlChange = function(callback) {
+    if (!urlChangeInit) {
+      // We listen on both (hashchange/popstate) when available, as some browsers (e.g. Opera)
+      // don't fire popstate when user change the address bar and don't fire hashchange when url
+      // changed by push/replaceState
+
+      // html5 history api - popstate event
+      if ($sniffer.history) jqLite(window).on('popstate', fireUrlChange);
+      // hashchange event
+      if ($sniffer.hashchange) jqLite(window).on('hashchange', fireUrlChange);
+      // polling
+      else self.addPollFn(fireUrlChange);
+
+      urlChangeInit = true;
+    }
+
+    urlChangeListeners.push(callback);
+    return callback;
+  };
+
+  //////////////////////////////////////////////////////////////
+  // Misc API
+  //////////////////////////////////////////////////////////////
+
+  /**
+   * @name ng.$browser#baseHref
+   * @methodOf ng.$browser
+   * 
+   * @description
+   * Returns current <base href>
+   * (always relative - without domain)
+   *
+   * @returns {string=} current <base href>
+   */
+  self.baseHref = function() {
+    var href = baseElement.attr('href');
+    return href ? href.replace(/^https?\:\/\/[^\/]*/, '') : '';
+  };
+
+  //////////////////////////////////////////////////////////////
+  // Cookies API
+  //////////////////////////////////////////////////////////////
+  var lastCookies = {};
+  var lastCookieString = '';
+  var cookiePath = self.baseHref();
+
+  /**
+   * @name ng.$browser#cookies
+   * @methodOf ng.$browser
+   *
+   * @param {string=} name Cookie name
+   * @param {string=} value Cookie value
+   *
+   * @description
+   * The cookies method provides a 'private' low level access to browser cookies.
+   * It is not meant to be used directly, use the $cookie service instead.
+   *
+   * The return values vary depending on the arguments that the method was called with as follows:
+   * 
+   * - cookies() -> hash of all cookies, this is NOT a copy of the internal state, so do not modify
+   *   it
+   * - cookies(name, value) -> set name to value, if value is undefined delete the cookie
+   * - cookies(name) -> the same as (name, undefined) == DELETES (no one calls it right now that
+   *   way)
+   * 
+   * @returns {Object} Hash of all cookies (if called without any parameter)
+   */
+  self.cookies = function(name, value) {
+    /* global escape: false, unescape: false */
+    var cookieLength, cookieArray, cookie, i, index;
+
+    if (name) {
+      if (value === undefined) {
+        rawDocument.cookie = escape(name) + "=;path=" + cookiePath +
+                                ";expires=Thu, 01 Jan 1970 00:00:00 GMT";
+      } else {
+        if (isString(value)) {
+          cookieLength = (rawDocument.cookie = escape(name) + '=' + escape(value) +
+                                ';path=' + cookiePath).length + 1;
+
+          // per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
+          // - 300 cookies
+          // - 20 cookies per unique domain
+          // - 4096 bytes per cookie
+          if (cookieLength > 4096) {
+            $log.warn("Cookie '"+ name +
+              "' possibly not set or overflowed because it was too large ("+
+              cookieLength + " > 4096 bytes)!");
+          }
+        }
+      }
+    } else {
+      if (rawDocument.cookie !== lastCookieString) {
+        lastCookieString = rawDocument.cookie;
+        cookieArray = lastCookieString.split("; ");
+        lastCookies = {};
+
+        for (i = 0; i < cookieArray.length; i++) {
+          cookie = cookieArray[i];
+          index = cookie.indexOf('=');
+          if (index > 0) { //ignore nameless cookies
+            name = unescape(cookie.substring(0, index));
+            // the first value that is seen for a cookie is the most
+            // specific one.  values for the same cookie name that
+            // follow are for less specific paths.
+            if (lastCookies[name] === undefined) {
+              lastCookies[name] = unescape(cookie.substring(index + 1));
+            }
+          }
+        }
+      }
+      return lastCookies;
+    }
+  };
+
+
+  /**
+   * @name ng.$browser#defer
+   * @methodOf ng.$browser
+   * @param {function()} fn A function, who's execution should be deferred.
+   * @param {number=} [delay=0] of milliseconds to defer the function execution.
+   * @returns {*} DeferId that can be used to cancel the task via `$browser.defer.cancel()`.
+   *
+   * @description
+   * Executes a fn asynchronously via `setTimeout(fn, delay)`.
+   *
+   * Unlike when calling `setTimeout` directly, in test this function is mocked and instead of using
+   * `setTimeout` in tests, the fns are queued in an array, which can be programmatically flushed
+   * via `$browser.defer.flush()`.
+   *
+   */
+  self.defer = function(fn, delay) {
+    var timeoutId;
+    outstandingRequestCount++;
+    timeoutId = setTimeout(function() {
+      delete pendingDeferIds[timeoutId];
+      completeOutstandingRequest(fn);
+    }, delay || 0);
+    pendingDeferIds[timeoutId] = true;
+    return timeoutId;
+  };
+
+
+  /**
+   * @name ng.$browser#defer.cancel
+   * @methodOf ng.$browser.defer
+   *
+   * @description
+   * Cancels a deferred task identified with `deferId`.
+   *
+   * @param {*} deferId Token returned by the `$browser.defer` function.
+   * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
+   *                    canceled.
+   */
+  self.defer.cancel = function(deferId) {
+    if (pendingDeferIds[deferId]) {
+      delete pendingDeferIds[deferId];
+      clearTimeout(deferId);
+      completeOutstandingRequest(noop);
+      return true;
+    }
+    return false;
+  };
+
+}
+
+function $BrowserProvider(){
+  this.$get = ['$window', '$log', '$sniffer', '$document',
+      function( $window,   $log,   $sniffer,   $document){
+        return new Browser($window, $document, $log, $sniffer);
+      }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$cacheFactory
+ *
+ * @description
+ * Factory that constructs cache objects and gives access to them.
+ * 
+ * <pre>
+ * 
+ *  var cache = $cacheFactory('cacheId');
+ *  expect($cacheFactory.get('cacheId')).toBe(cache);
+ *  expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
+ *
+ *  cache.put("key", "value");
+ *  cache.put("another key", "another value");
+ *
+ *  // We've specified no options on creation
+ *  expect(cache.info()).toEqual({id: 'cacheId', size: 2}); 
+ * 
+ * </pre>
+ *
+ *
+ * @param {string} cacheId Name or id of the newly created cache.
+ * @param {object=} options Options object that specifies the cache behavior. Properties:
+ *
+ *   - `{number=}` `capacity` — turns the cache into LRU cache.
+ *
+ * @returns {object} Newly created cache object with the following set of methods:
+ *
+ * - `{object}` `info()` — Returns id, size, and options of cache.
+ * - `{{*}}` `put({string} key, {*} value)` — Puts a new key-value pair into the cache and returns
+ *   it.
+ * - `{{*}}` `get({string} key)` — Returns cached value for `key` or undefined for cache miss.
+ * - `{void}` `remove({string} key)` — Removes a key-value pair from the cache.
+ * - `{void}` `removeAll()` — Removes all cached values.
+ * - `{void}` `destroy()` — Removes references to this cache from $cacheFactory.
+ *
+ */
+function $CacheFactoryProvider() {
+
+  this.$get = function() {
+    var caches = {};
+
+    function cacheFactory(cacheId, options) {
+      if (cacheId in caches) {
+        throw minErr('$cacheFactory')('iid', "CacheId '{0}' is already taken!", cacheId);
+      }
+
+      var size = 0,
+          stats = extend({}, options, {id: cacheId}),
+          data = {},
+          capacity = (options && options.capacity) || Number.MAX_VALUE,
+          lruHash = {},
+          freshEnd = null,
+          staleEnd = null;
+
+      return caches[cacheId] = {
+
+        put: function(key, value) {
+          var lruEntry = lruHash[key] || (lruHash[key] = {key: key});
+
+          refresh(lruEntry);
+
+          if (isUndefined(value)) return;
+          if (!(key in data)) size++;
+          data[key] = value;
+
+          if (size > capacity) {
+            this.remove(staleEnd.key);
+          }
+
+          return value;
+        },
+
+
+        get: function(key) {
+          var lruEntry = lruHash[key];
+
+          if (!lruEntry) return;
+
+          refresh(lruEntry);
+
+          return data[key];
+        },
+
+
+        remove: function(key) {
+          var lruEntry = lruHash[key];
+
+          if (!lruEntry) return;
+
+          if (lruEntry == freshEnd) freshEnd = lruEntry.p;
+          if (lruEntry == staleEnd) staleEnd = lruEntry.n;
+          link(lruEntry.n,lruEntry.p);
+
+          delete lruHash[key];
+          delete data[key];
+          size--;
+        },
+
+
+        removeAll: function() {
+          data = {};
+          size = 0;
+          lruHash = {};
+          freshEnd = staleEnd = null;
+        },
+
+
+        destroy: function() {
+          data = null;
+          stats = null;
+          lruHash = null;
+          delete caches[cacheId];
+        },
+
+
+        info: function() {
+          return extend({}, stats, {size: size});
+        }
+      };
+
+
+      /**
+       * makes the `entry` the freshEnd of the LRU linked list
+       */
+      function refresh(entry) {
+        if (entry != freshEnd) {
+          if (!staleEnd) {
+            staleEnd = entry;
+          } else if (staleEnd == entry) {
+            staleEnd = entry.n;
+          }
+
+          link(entry.n, entry.p);
+          link(entry, freshEnd);
+          freshEnd = entry;
+          freshEnd.n = null;
+        }
+      }
+
+
+      /**
+       * bidirectionally links two entries of the LRU linked list
+       */
+      function link(nextEntry, prevEntry) {
+        if (nextEntry != prevEntry) {
+          if (nextEntry) nextEntry.p = prevEntry; //p stands for previous, 'prev' didn't minify
+          if (prevEntry) prevEntry.n = nextEntry; //n stands for next, 'next' didn't minify
+        }
+      }
+    }
+
+
+  /**
+   * @ngdoc method
+   * @name ng.$cacheFactory#info
+   * @methodOf ng.$cacheFactory
+   *
+   * @description
+   * Get information about all the of the caches that have been created
+   *
+   * @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`
+   */
+    cacheFactory.info = function() {
+      var info = {};
+      forEach(caches, function(cache, cacheId) {
+        info[cacheId] = cache.info();
+      });
+      return info;
+    };
+
+
+  /**
+   * @ngdoc method
+   * @name ng.$cacheFactory#get
+   * @methodOf ng.$cacheFactory
+   *
+   * @description
+   * Get access to a cache object by the `cacheId` used when it was created.
+   *
+   * @param {string} cacheId Name or id of a cache to access.
+   * @returns {object} Cache object identified by the cacheId or undefined if no such cache.
+   */
+    cacheFactory.get = function(cacheId) {
+      return caches[cacheId];
+    };
+
+
+    return cacheFactory;
+  };
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$templateCache
+ *
+ * @description
+ * The first time a template is used, it is loaded in the template cache for quick retrieval. You
+ * can load templates directly into the cache in a `script` tag, or by consuming the
+ * `$templateCache` service directly.
+ * 
+ * Adding via the `script` tag:
+ * <pre>
+ * <html ng-app>
+ * <head>
+ * <script type="text/ng-template" id="templateId.html">
+ *   This is the content of the template
+ * </script>
+ * </head>
+ *   ...
+ * </html>
+ * </pre>
+ * 
+ * **Note:** the `script` tag containing the template does not need to be included in the `head` of
+ * the document, but it must be below the `ng-app` definition.
+ * 
+ * Adding via the $templateCache service:
+ * 
+ * <pre>
+ * var myApp = angular.module('myApp', []);
+ * myApp.run(function($templateCache) {
+ *   $templateCache.put('templateId.html', 'This is the content of the template');
+ * });
+ * </pre>
+ * 
+ * To retrieve the template later, simply use it in your HTML:
+ * <pre>
+ * <div ng-include=" 'templateId.html' "></div>
+ * </pre>
+ * 
+ * or get it via Javascript:
+ * <pre>
+ * $templateCache.get('templateId.html')
+ * </pre>
+ * 
+ * See {@link ng.$cacheFactory $cacheFactory}.
+ *
+ */
+function $TemplateCacheProvider() {
+  this.$get = ['$cacheFactory', function($cacheFactory) {
+    return $cacheFactory('templates');
+  }];
+}
+
+/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!
+ *
+ * DOM-related variables:
+ *
+ * - "node" - DOM Node
+ * - "element" - DOM Element or Node
+ * - "$node" or "$element" - jqLite-wrapped node or element
+ *
+ *
+ * Compiler related stuff:
+ *
+ * - "linkFn" - linking fn of a single directive
+ * - "nodeLinkFn" - function that aggregates all linking fns for a particular node
+ * - "childLinkFn" -  function that aggregates all linking fns for child nodes of a particular node
+ * - "compositeLinkFn" - function that aggregates all linking fns for a compilation root (nodeList)
+ */
+
+
+/**
+ * @ngdoc function
+ * @name ng.$compile
+ * @function
+ *
+ * @description
+ * Compiles a piece of HTML string or DOM into a template and produces a template function, which
+ * can then be used to link {@link ng.$rootScope.Scope `scope`} and the template together.
+ *
+ * The compilation is a process of walking the DOM tree and matching DOM elements to
+ * {@link ng.$compileProvider#methods_directive directives}.
+ *
+ * <div class="alert alert-warning">
+ * **Note:** This document is an in-depth reference of all directive options.
+ * For a gentle introduction to directives with examples of common use cases,
+ * see the {@link guide/directive directive guide}.
+ * </div>
+ *
+ * ## Comprehensive Directive API
+ *
+ * There are many different options for a directive.
+ *
+ * The difference resides in the return value of the factory function.
+ * You can either return a "Directive Definition Object" (see below) that defines the directive properties,
+ * or just the `postLink` function (all other properties will have the default values).
+ *
+ * <div class="alert alert-success">
+ * **Best Practice:** It's recommended to use the "directive definition object" form.
+ * </div>
+ *
+ * Here's an example directive declared with a Directive Definition Object:
+ *
+ * <pre>
+ *   var myModule = angular.module(...);
+ *
+ *   myModule.directive('directiveName', function factory(injectables) {
+ *     var directiveDefinitionObject = {
+ *       priority: 0,
+ *       template: '<div></div>', // or // function(tElement, tAttrs) { ... },
+ *       // or
+ *       // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },
+ *       replace: false,
+ *       transclude: false,
+ *       restrict: 'A',
+ *       scope: false,
+ *       controller: function($scope, $element, $attrs, $transclude, otherInjectables) { ... },
+ *       require: 'siblingDirectiveName', // or // ['^parentDirectiveName', '?optionalDirectiveName', '?^optionalParent'],
+ *       compile: function compile(tElement, tAttrs, transclude) {
+ *         return {
+ *           pre: function preLink(scope, iElement, iAttrs, controller) { ... },
+ *           post: function postLink(scope, iElement, iAttrs, controller) { ... }
+ *         }
+ *         // or
+ *         // return function postLink( ... ) { ... }
+ *       },
+ *       // or
+ *       // link: {
+ *       //  pre: function preLink(scope, iElement, iAttrs, controller) { ... },
+ *       //  post: function postLink(scope, iElement, iAttrs, controller) { ... }
+ *       // }
+ *       // or
+ *       // link: function postLink( ... ) { ... }
+ *     };
+ *     return directiveDefinitionObject;
+ *   });
+ * </pre>
+ *
+ * <div class="alert alert-warning">
+ * **Note:** Any unspecified options will use the default value. You can see the default values below.
+ * </div>
+ *
+ * Therefore the above can be simplified as:
+ *
+ * <pre>
+ *   var myModule = angular.module(...);
+ *
+ *   myModule.directive('directiveName', function factory(injectables) {
+ *     var directiveDefinitionObject = {
+ *       link: function postLink(scope, iElement, iAttrs) { ... }
+ *     };
+ *     return directiveDefinitionObject;
+ *     // or
+ *     // return function postLink(scope, iElement, iAttrs) { ... }
+ *   });
+ * </pre>
+ *
+ *
+ *
+ * ### Directive Definition Object
+ *
+ * The directive definition object provides instructions to the {@link api/ng.$compile
+ * compiler}. The attributes are:
+ *
+ * #### `priority`
+ * When there are multiple directives defined on a single DOM element, sometimes it
+ * is necessary to specify the order in which the directives are applied. The `priority` is used
+ * to sort the directives before their `compile` functions get called. Priority is defined as a
+ * number. Directives with greater numerical `priority` are compiled first. Pre-link functions
+ * are also run in priority order, but post-link functions are run in reverse order. The order
+ * of directives with the same priority is undefined. The default priority is `0`.
+ *
+ * #### `terminal`
+ * If set to true then the current `priority` will be the last set of directives
+ * which will execute (any directives at the current priority will still execute
+ * as the order of execution on same `priority` is undefined).
+ *
+ * #### `scope`
+ * **If set to `true`,** then a new scope will be created for this directive. If multiple directives on the
+ * same element request a new scope, only one new scope is created. The new scope rule does not
+ * apply for the root of the template since the root of the template always gets a new scope.
+ *
+ * **If set to `{}` (object hash),** then a new "isolate" scope is created. The 'isolate' scope differs from
+ * normal scope in that it does not prototypically inherit from the parent scope. This is useful
+ * when creating reusable components, which should not accidentally read or modify data in the
+ * parent scope.
+ *
+ * The 'isolate' scope takes an object hash which defines a set of local scope properties
+ * derived from the parent scope. These local properties are useful for aliasing values for
+ * templates. Locals definition is a hash of local scope property to its source:
+ *
+ * * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is
+ *   always a string since DOM attributes are strings. If no `attr` name is specified  then the
+ *   attribute name is assumed to be the same as the local name.
+ *   Given `<widget my-attr="hello {{name}}">` and widget definition
+ *   of `scope: { localName:'@myAttr' }`, then widget scope property `localName` will reflect
+ *   the interpolated value of `hello {{name}}`. As the `name` attribute changes so will the
+ *   `localName` property on the widget scope. The `name` is read from the parent scope (not
+ *   component scope).
+ *
+ * * `=` or `=attr` - set up bi-directional binding between a local scope property and the
+ *   parent scope property of name defined via the value of the `attr` attribute. If no `attr`
+ *   name is specified then the attribute name is assumed to be the same as the local name.
+ *   Given `<widget my-attr="parentModel">` and widget definition of
+ *   `scope: { localModel:'=myAttr' }`, then widget scope property `localModel` will reflect the
+ *   value of `parentModel` on the parent scope. Any changes to `parentModel` will be reflected
+ *   in `localModel` and any changes in `localModel` will reflect in `parentModel`. If the parent
+ *   scope property doesn't exist, it will throw a NON_ASSIGNABLE_MODEL_EXPRESSION exception. You
+ *   can avoid this behavior using `=?` or `=?attr` in order to flag the property as optional.
+ *
+ * * `&` or `&attr` - provides a way to execute an expression in the context of the parent scope.
+ *   If no `attr` name is specified then the attribute name is assumed to be the same as the
+ *   local name. Given `<widget my-attr="count = count + value">` and widget definition of
+ *   `scope: { localFn:'&myAttr' }`, then isolate scope property `localFn` will point to
+ *   a function wrapper for the `count = count + value` expression. Often it's desirable to
+ *   pass data from the isolated scope via an expression and to the parent scope, this can be
+ *   done by passing a map of local variable names and values into the expression wrapper fn.
+ *   For example, if the expression is `increment(amount)` then we can specify the amount value
+ *   by calling the `localFn` as `localFn({amount: 22})`.
+ *
+ *
+ *
+ * #### `controller`
+ * Controller constructor function. The controller is instantiated before the
+ * pre-linking phase and it is shared with other directives (see
+ * `require` attribute). This allows the directives to communicate with each other and augment
+ * each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:
+ *
+ * * `$scope` - Current scope associated with the element
+ * * `$element` - Current element
+ * * `$attrs` - Current attributes object for the element
+ * * `$transclude` - A transclude linking function pre-bound to the correct transclusion scope.
+ *    The scope can be overridden by an optional first argument.
+ *   `function([scope], cloneLinkingFn)`.
+ *
+ *
+ * #### `require`
+ * Require another directive and inject its controller as the fourth argument to the linking function. The
+ * `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the
+ * injected argument will be an array in corresponding order. If no such directive can be
+ * found, or if the directive does not have a controller, then an error is raised. The name can be prefixed with:
+ *
+ * * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
+ * * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
+ * * `^` - Locate the required controller by searching the element's parents. Throw an error if not found.
+ * * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the
+ *   `link` fn if not found.
+ *
+ *
+ * #### `controllerAs`
+ * Controller alias at the directive scope. An alias for the controller so it
+ * can be referenced at the directive template. The directive needs to define a scope for this
+ * configuration to be used. Useful in the case when directive is used as component.
+ *
+ *
+ * #### `restrict`
+ * String of subset of `EACM` which restricts the directive to a specific directive
+ * declaration style. If omitted, the default (attributes only) is used.
+ *
+ * * `E` - Element name: `<my-directive></my-directive>`
+ * * `A` - Attribute (default): `<div my-directive="exp"></div>`
+ * * `C` - Class: `<div class="my-directive: exp;"></div>`
+ * * `M` - Comment: `<!-- directive: my-directive exp -->`
+ *
+ *
+ * #### `template`
+ * replace the current element with the contents of the HTML. The replacement process
+ * migrates all of the attributes / classes from the old element to the new one. See the
+ * {@link guide/directive#creating-custom-directives_creating-directives_template-expanding-directive
+ * Directives Guide} for an example.
+ *
+ * You can specify `template` as a string representing the template or as a function which takes
+ * two arguments `tElement` and `tAttrs` (described in the `compile` function api below) and
+ * returns a string value representing the template.
+ *
+ *
+ * #### `templateUrl`
+ * Same as `template` but the template is loaded from the specified URL. Because
+ * the template loading is asynchronous the compilation/linking is suspended until the template
+ * is loaded.
+ *
+ * You can specify `templateUrl` as a string representing the URL or as a function which takes two
+ * arguments `tElement` and `tAttrs` (described in the `compile` function api below) and returns
+ * a string value representing the url.  In either case, the template URL is passed through {@link
+ * api/ng.$sce#methods_getTrustedResourceUrl $sce.getTrustedResourceUrl}.
+ *
+ *
+ * #### `replace`
+ * specify where the template should be inserted. Defaults to `false`.
+ *
+ * * `true` - the template will replace the current element.
+ * * `false` - the template will replace the contents of the current element.
+ *
+ *
+ * #### `transclude`
+ * compile the content of the element and make it available to the directive.
+ * Typically used with {@link api/ng.directive:ngTransclude
+ * ngTransclude}. The advantage of transclusion is that the linking function receives a
+ * transclusion function which is pre-bound to the correct scope. In a typical setup the widget
+ * creates an `isolate` scope, but the transclusion is not a child, but a sibling of the `isolate`
+ * scope. This makes it possible for the widget to have private state, and the transclusion to
+ * be bound to the parent (pre-`isolate`) scope.
+ *
+ * * `true` - transclude the content of the directive.
+ * * `'element'` - transclude the whole element including any directives defined at lower priority.
+ *
+ *
+ * #### `compile`
+ *
+ * <pre>
+ *   function compile(tElement, tAttrs, transclude) { ... }
+ * </pre>
+ *
+ * The compile function deals with transforming the template DOM. Since most directives do not do
+ * template transformation, it is not used often. Examples that require compile functions are
+ * directives that transform template DOM, such as {@link
+ * api/ng.directive:ngRepeat ngRepeat}, or load the contents
+ * asynchronously, such as {@link api/ngRoute.directive:ngView ngView}. The
+ * compile function takes the following arguments.
+ *
+ *   * `tElement` - template element - The element where the directive has been declared. It is
+ *     safe to do template transformation on the element and child elements only.
+ *
+ *   * `tAttrs` - template attributes - Normalized list of attributes declared on this element shared
+ *     between all directive compile functions.
+ *
+ *   * `transclude` -  [*DEPRECATED*!] A transclude linking function: `function(scope, cloneLinkingFn)`
+ *
+ * <div class="alert alert-warning">
+ * **Note:** The template instance and the link instance may be different objects if the template has
+ * been cloned. For this reason it is **not** safe to do anything other than DOM transformations that
+ * apply to all cloned DOM nodes within the compile function. Specifically, DOM listener registration
+ * should be done in a linking function rather than in a compile function.
+ * </div>
+ *
+ * <div class="alert alert-error">
+ * **Note:** The `transclude` function that is passed to the compile function is deprecated, as it
+ *   e.g. does not know about the right outer scope. Please use the transclude function that is passed
+ *   to the link function instead.
+ * </div>
+
+ * A compile function can have a return value which can be either a function or an object.
+ *
+ * * returning a (post-link) function - is equivalent to registering the linking function via the
+ *   `link` property of the config object when the compile function is empty.
+ *
+ * * returning an object with function(s) registered via `pre` and `post` properties - allows you to
+ *   control when a linking function should be called during the linking phase. See info about
+ *   pre-linking and post-linking functions below.
+ *
+ *
+ * #### `link`
+ * This property is used only if the `compile` property is not defined.
+ *
+ * <pre>
+ *   function link(scope, iElement, iAttrs, controller, transcludeFn) { ... }
+ * </pre>
+ *
+ * The link function is responsible for registering DOM listeners as well as updating the DOM. It is
+ * executed after the template has been cloned. This is where most of the directive logic will be
+ * put.
+ *
+ *   * `scope` - {@link api/ng.$rootScope.Scope Scope} - The scope to be used by the
+ *     directive for registering {@link api/ng.$rootScope.Scope#methods_$watch watches}.
+ *
+ *   * `iElement` - instance element - The element where the directive is to be used. It is safe to
+ *     manipulate the children of the element only in `postLink` function since the children have
+ *     already been linked.
+ *
+ *   * `iAttrs` - instance attributes - Normalized list of attributes declared on this element shared
+ *     between all directive linking functions.
+ *
+ *   * `controller` - a controller instance - A controller instance if at least one directive on the
+ *     element defines a controller. The controller is shared among all the directives, which allows
+ *     the directives to use the controllers as a communication channel.
+ *
+ *   * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.
+ *     The scope can be overridden by an optional first argument. This is the same as the `$transclude`
+ *     parameter of directive controllers.
+ *     `function([scope], cloneLinkingFn)`.
+ *
+ *
+ * #### Pre-linking function
+ *
+ * Executed before the child elements are linked. Not safe to do DOM transformation since the
+ * compiler linking function will fail to locate the correct elements for linking.
+ *
+ * #### Post-linking function
+ *
+ * Executed after the child elements are linked. It is safe to do DOM transformation in the post-linking function.
+ *
+ * <a name="Attributes"></a>
+ * ### Attributes
+ *
+ * The {@link api/ng.$compile.directive.Attributes Attributes} object - passed as a parameter in the
+ * `link()` or `compile()` functions. It has a variety of uses.
+ *
+ * accessing *Normalized attribute names:*
+ * Directives like 'ngBind' can be expressed in many ways: 'ng:bind', `data-ng-bind`, or 'x-ng-bind'.
+ * the attributes object allows for normalized access to
+ *   the attributes.
+ *
+ * * *Directive inter-communication:* All directives share the same instance of the attributes
+ *   object which allows the directives to use the attributes object as inter directive
+ *   communication.
+ *
+ * * *Supports interpolation:* Interpolation attributes are assigned to the attribute object
+ *   allowing other directives to read the interpolated value.
+ *
+ * * *Observing interpolated attributes:* Use `$observe` to observe the value changes of attributes
+ *   that contain interpolation (e.g. `src="{{bar}}"`). Not only is this very efficient but it's also
+ *   the only way to easily get the actual value because during the linking phase the interpolation
+ *   hasn't been evaluated yet and so the value is at this time set to `undefined`.
+ *
+ * <pre>
+ * function linkingFn(scope, elm, attrs, ctrl) {
+ *   // get the attribute value
+ *   console.log(attrs.ngModel);
+ *
+ *   // change the attribute
+ *   attrs.$set('ngModel', 'new value');
+ *
+ *   // observe changes to interpolated attribute
+ *   attrs.$observe('ngModel', function(value) {
+ *     console.log('ngModel has changed value to ' + value);
+ *   });
+ * }
+ * </pre>
+ *
+ * Below is an example using `$compileProvider`.
+ *
+ * <div class="alert alert-warning">
+ * **Note**: Typically directives are registered with `module.directive`. The example below is
+ * to illustrate how `$compile` works.
+ * </div>
+ *
+ <doc:example module="compile">
+   <doc:source>
+    <script>
+      angular.module('compile', [], function($compileProvider) {
+        // configure new 'compile' directive by passing a directive
+        // factory function. The factory function injects the '$compile'
+        $compileProvider.directive('compile', function($compile) {
+          // directive factory creates a link function
+          return function(scope, element, attrs) {
+            scope.$watch(
+              function(scope) {
+                 // watch the 'compile' expression for changes
+                return scope.$eval(attrs.compile);
+              },
+              function(value) {
+                // when the 'compile' expression changes
+                // assign it into the current DOM
+                element.html(value);
+
+                // compile the new DOM and link it to the current
+                // scope.
+                // NOTE: we only compile .childNodes so that
+                // we don't get into infinite loop compiling ourselves
+                $compile(element.contents())(scope);
+              }
+            );
+          };
+        })
+      });
+
+      function Ctrl($scope) {
+        $scope.name = 'Angular';
+        $scope.html = 'Hello {{name}}';
+      }
+    </script>
+    <div ng-controller="Ctrl">
+      <input ng-model="name"> <br>
+      <textarea ng-model="html"></textarea> <br>
+      <div compile="html"></div>
+    </div>
+   </doc:source>
+   <doc:scenario>
+     it('should auto compile', function() {
+       expect(element('div[compile]').text()).toBe('Hello Angular');
+       input('html').enter('{{name}}!');
+       expect(element('div[compile]').text()).toBe('Angular!');
+     });
+   </doc:scenario>
+ </doc:example>
+
+ *
+ *
+ * @param {string|DOMElement} element Element or HTML string to compile into a template function.
+ * @param {function(angular.Scope[, cloneAttachFn]} transclude function available to directives.
+ * @param {number} maxPriority only apply directives lower then given priority (Only effects the
+ *                 root element(s), not their children)
+ * @returns {function(scope[, cloneAttachFn])} a link function which is used to bind template
+ * (a DOM element/tree) to a scope. Where:
+ *
+ *  * `scope` - A {@link ng.$rootScope.Scope Scope} to bind to.
+ *  * `cloneAttachFn` - If `cloneAttachFn` is provided, then the link function will clone the
+ *  `template` and call the `cloneAttachFn` function allowing the caller to attach the
+ *  cloned elements to the DOM document at the appropriate place. The `cloneAttachFn` is
+ *  called as: <br> `cloneAttachFn(clonedElement, scope)` where:
+ *
+ *      * `clonedElement` - is a clone of the original `element` passed into the compiler.
+ *      * `scope` - is the current scope with which the linking function is working with.
+ *
+ * Calling the linking function returns the element of the template. It is either the original
+ * element passed in, or the clone of the element if the `cloneAttachFn` is provided.
+ *
+ * After linking the view is not updated until after a call to $digest which typically is done by
+ * Angular automatically.
+ *
+ * If you need access to the bound view, there are two ways to do it:
+ *
+ * - If you are not asking the linking function to clone the template, create the DOM element(s)
+ *   before you send them to the compiler and keep this reference around.
+ *   <pre>
+ *     var element = $compile('<p>{{total}}</p>')(scope);
+ *   </pre>
+ *
+ * - if on the other hand, you need the element to be cloned, the view reference from the original
+ *   example would not point to the clone, but rather to the original template that was cloned. In
+ *   this case, you can access the clone via the cloneAttachFn:
+ *   <pre>
+ *     var templateHTML = angular.element('<p>{{total}}</p>'),
+ *         scope = ....;
+ *
+ *     var clonedElement = $compile(templateHTML)(scope, function(clonedElement, scope) {
+ *       //attach the clone to DOM document at the right place
+ *     });
+ *
+ *     //now we have reference to the cloned DOM via `clone`
+ *   </pre>
+ *
+ *
+ * For information on how the compiler works, see the
+ * {@link guide/compiler Angular HTML Compiler} section of the Developer Guide.
+ */
+
+var $compileMinErr = minErr('$compile');
+
+/**
+ * @ngdoc service
+ * @name ng.$compileProvider
+ * @function
+ *
+ * @description
+ */
+$CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];
+function $CompileProvider($provide, $$sanitizeUriProvider) {
+  var hasDirectives = {},
+      Suffix = 'Directive',
+      COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w\-_]+)\s+(.*)$/,
+      CLASS_DIRECTIVE_REGEXP = /(([\d\w\-_]+)(?:\:([^;]+))?;?)/;
+
+  // Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes
+  // The assumption is that future DOM event attribute names will begin with
+  // 'on' and be composed of only English letters.
+  var EVENT_HANDLER_ATTR_REGEXP = /^(on[a-z]+|formaction)$/;
+
+  /**
+   * @ngdoc function
+   * @name ng.$compileProvider#directive
+   * @methodOf ng.$compileProvider
+   * @function
+   *
+   * @description
+   * Register a new directive with the compiler.
+   *
+   * @param {string|Object} name Name of the directive in camel-case (i.e. <code>ngBind</code> which
+   *    will match as <code>ng-bind</code>), or an object map of directives where the keys are the
+   *    names and the values are the factories.
+   * @param {function|Array} directiveFactory An injectable directive factory function. See
+   *    {@link guide/directive} for more info.
+   * @returns {ng.$compileProvider} Self for chaining.
+   */
+   this.directive = function registerDirective(name, directiveFactory) {
+    assertNotHasOwnProperty(name, 'directive');
+    if (isString(name)) {
+      assertArg(directiveFactory, 'directiveFactory');
+      if (!hasDirectives.hasOwnProperty(name)) {
+        hasDirectives[name] = [];
+        $provide.factory(name + Suffix, ['$injector', '$exceptionHandler',
+          function($injector, $exceptionHandler) {
+            var directives = [];
+            forEach(hasDirectives[name], function(directiveFactory, index) {
+              try {
+                var directive = $injector.invoke(directiveFactory);
+                if (isFunction(directive)) {
+                  directive = { compile: valueFn(directive) };
+                } else if (!directive.compile && directive.link) {
+                  directive.compile = valueFn(directive.link);
+                }
+                directive.priority = directive.priority || 0;
+                directive.index = index;
+                directive.name = directive.name || name;
+                directive.require = directive.require || (directive.controller && directive.name);
+                directive.restrict = directive.restrict || 'A';
+                directives.push(directive);
+              } catch (e) {
+                $exceptionHandler(e);
+              }
+            });
+            return directives;
+          }]);
+      }
+      hasDirectives[name].push(directiveFactory);
+    } else {
+      forEach(name, reverseParams(registerDirective));
+    }
+    return this;
+  };
+
+
+  /**
+   * @ngdoc function
+   * @name ng.$compileProvider#aHrefSanitizationWhitelist
+   * @methodOf ng.$compileProvider
+   * @function
+   *
+   * @description
+   * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+   * urls during a[href] sanitization.
+   *
+   * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+   *
+   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into
+   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`
+   * regular expression. If a match is found, the original url is written into the dom. Otherwise,
+   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+   *
+   * @param {RegExp=} regexp New regexp to whitelist urls with.
+   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+   *    chaining otherwise.
+   */
+  this.aHrefSanitizationWhitelist = function(regexp) {
+    if (isDefined(regexp)) {
+      $$sanitizeUriProvider.aHrefSanitizationWhitelist(regexp);
+      return this;
+    } else {
+      return $$sanitizeUriProvider.aHrefSanitizationWhitelist();
+    }
+  };
+
+
+  /**
+   * @ngdoc function
+   * @name ng.$compileProvider#imgSrcSanitizationWhitelist
+   * @methodOf ng.$compileProvider
+   * @function
+   *
+   * @description
+   * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+   * urls during img[src] sanitization.
+   *
+   * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+   *
+   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into
+   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`
+   * regular expression. If a match is found, the original url is written into the dom. Otherwise,
+   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+   *
+   * @param {RegExp=} regexp New regexp to whitelist urls with.
+   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+   *    chaining otherwise.
+   */
+  this.imgSrcSanitizationWhitelist = function(regexp) {
+    if (isDefined(regexp)) {
+      $$sanitizeUriProvider.imgSrcSanitizationWhitelist(regexp);
+      return this;
+    } else {
+      return $$sanitizeUriProvider.imgSrcSanitizationWhitelist();
+    }
+  };
+
+  this.$get = [
+            '$injector', '$interpolate', '$exceptionHandler', '$http', '$templateCache', '$parse',
+            '$controller', '$rootScope', '$document', '$sce', '$animate', '$$sanitizeUri',
+    function($injector,   $interpolate,   $exceptionHandler,   $http,   $templateCache,   $parse,
+             $controller,   $rootScope,   $document,   $sce,   $animate,   $$sanitizeUri) {
+
+    var Attributes = function(element, attr) {
+      this.$$element = element;
+      this.$attr = attr || {};
+    };
+
+    Attributes.prototype = {
+      $normalize: directiveNormalize,
+
+
+      /**
+       * @ngdoc function
+       * @name ng.$compile.directive.Attributes#$addClass
+       * @methodOf ng.$compile.directive.Attributes
+       * @function
+       *
+       * @description
+       * Adds the CSS class value specified by the classVal parameter to the element. If animations
+       * are enabled then an animation will be triggered for the class addition.
+       *
+       * @param {string} classVal The className value that will be added to the element
+       */
+      $addClass : function(classVal) {
+        if(classVal && classVal.length > 0) {
+          $animate.addClass(this.$$element, classVal);
+        }
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$compile.directive.Attributes#$removeClass
+       * @methodOf ng.$compile.directive.Attributes
+       * @function
+       *
+       * @description
+       * Removes the CSS class value specified by the classVal parameter from the element. If
+       * animations are enabled then an animation will be triggered for the class removal.
+       *
+       * @param {string} classVal The className value that will be removed from the element
+       */
+      $removeClass : function(classVal) {
+        if(classVal && classVal.length > 0) {
+          $animate.removeClass(this.$$element, classVal);
+        }
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$compile.directive.Attributes#$updateClass
+       * @methodOf ng.$compile.directive.Attributes
+       * @function
+       *
+       * @description
+       * Adds and removes the appropriate CSS class values to the element based on the difference
+       * between the new and old CSS class values (specified as newClasses and oldClasses).
+       *
+       * @param {string} newClasses The current CSS className value
+       * @param {string} oldClasses The former CSS className value
+       */
+      $updateClass : function(newClasses, oldClasses) {
+        this.$removeClass(tokenDifference(oldClasses, newClasses));
+        this.$addClass(tokenDifference(newClasses, oldClasses));
+      },
+
+      /**
+       * Set a normalized attribute on the element in a way such that all directives
+       * can share the attribute. This function properly handles boolean attributes.
+       * @param {string} key Normalized key. (ie ngAttribute)
+       * @param {string|boolean} value The value to set. If `null` attribute will be deleted.
+       * @param {boolean=} writeAttr If false, does not write the value to DOM element attribute.
+       *     Defaults to true.
+       * @param {string=} attrName Optional none normalized name. Defaults to key.
+       */
+      $set: function(key, value, writeAttr, attrName) {
+        // TODO: decide whether or not to throw an error if "class"
+        //is set through this function since it may cause $updateClass to
+        //become unstable.
+
+        var booleanKey = getBooleanAttrName(this.$$element[0], key),
+            normalizedVal,
+            nodeName;
+
+        if (booleanKey) {
+          this.$$element.prop(key, value);
+          attrName = booleanKey;
+        }
+
+        this[key] = value;
+
+        // translate normalized key to actual key
+        if (attrName) {
+          this.$attr[key] = attrName;
+        } else {
+          attrName = this.$attr[key];
+          if (!attrName) {
+            this.$attr[key] = attrName = snake_case(key, '-');
+          }
+        }
+
+        nodeName = nodeName_(this.$$element);
+
+        // sanitize a[href] and img[src] values
+        if ((nodeName === 'A' && key === 'href') ||
+            (nodeName === 'IMG' && key === 'src')) {
+          this[key] = value = $$sanitizeUri(value, key === 'src');
+        }
+
+        if (writeAttr !== false) {
+          if (value === null || value === undefined) {
+            this.$$element.removeAttr(attrName);
+          } else {
+            this.$$element.attr(attrName, value);
+          }
+        }
+
+        // fire observers
+        var $$observers = this.$$observers;
+        $$observers && forEach($$observers[key], function(fn) {
+          try {
+            fn(value);
+          } catch (e) {
+            $exceptionHandler(e);
+          }
+        });
+      },
+
+
+      /**
+       * @ngdoc function
+       * @name ng.$compile.directive.Attributes#$observe
+       * @methodOf ng.$compile.directive.Attributes
+       * @function
+       *
+       * @description
+       * Observes an interpolated attribute.
+       *
+       * The observer function will be invoked once during the next `$digest` following
+       * compilation. The observer is then invoked whenever the interpolated value
+       * changes.
+       *
+       * @param {string} key Normalized key. (ie ngAttribute) .
+       * @param {function(interpolatedValue)} fn Function that will be called whenever
+                the interpolated value of the attribute changes.
+       *        See the {@link guide/directive#Attributes Directives} guide for more info.
+       * @returns {function()} the `fn` parameter.
+       */
+      $observe: function(key, fn) {
+        var attrs = this,
+            $$observers = (attrs.$$observers || (attrs.$$observers = {})),
+            listeners = ($$observers[key] || ($$observers[key] = []));
+
+        listeners.push(fn);
+        $rootScope.$evalAsync(function() {
+          if (!listeners.$$inter) {
+            // no one registered attribute interpolation function, so lets call it manually
+            fn(attrs[key]);
+          }
+        });
+        return fn;
+      }
+    };
+
+    var startSymbol = $interpolate.startSymbol(),
+        endSymbol = $interpolate.endSymbol(),
+        denormalizeTemplate = (startSymbol == '{{' || endSymbol  == '}}')
+            ? identity
+            : function denormalizeTemplate(template) {
+              return template.replace(/\{\{/g, startSymbol).replace(/}}/g, endSymbol);
+        },
+        NG_ATTR_BINDING = /^ngAttr[A-Z]/;
+
+
+    return compile;
+
+    //================================
+
+    function compile($compileNodes, transcludeFn, maxPriority, ignoreDirective,
+                        previousCompileContext) {
+      if (!($compileNodes instanceof jqLite)) {
+        // jquery always rewraps, whereas we need to preserve the original selector so that we can
+        // modify it.
+        $compileNodes = jqLite($compileNodes);
+      }
+      // We can not compile top level text elements since text nodes can be merged and we will
+      // not be able to attach scope data to them, so we will wrap them in <span>
+      forEach($compileNodes, function(node, index){
+        if (node.nodeType == 3 /* text node */ && node.nodeValue.match(/\S+/) /* non-empty */ ) {
+          $compileNodes[index] = node = jqLite(node).wrap('<span></span>').parent()[0];
+        }
+      });
+      var compositeLinkFn =
+              compileNodes($compileNodes, transcludeFn, $compileNodes,
+                           maxPriority, ignoreDirective, previousCompileContext);
+      return function publicLinkFn(scope, cloneConnectFn, transcludeControllers){
+        assertArg(scope, 'scope');
+        // important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart
+        // and sometimes changes the structure of the DOM.
+        var $linkNode = cloneConnectFn
+          ? JQLitePrototype.clone.call($compileNodes) // IMPORTANT!!!
+          : $compileNodes;
+
+        forEach(transcludeControllers, function(instance, name) {
+          $linkNode.data('$' + name + 'Controller', instance);
+        });
+
+        // Attach scope only to non-text nodes.
+        for(var i = 0, ii = $linkNode.length; i<ii; i++) {
+          var node = $linkNode[i];
+          if (node.nodeType == 1 /* element */ || node.nodeType == 9 /* document */) {
+            $linkNode.eq(i).data('$scope', scope);
+          }
+        }
+        safeAddClass($linkNode, 'ng-scope');
+        if (cloneConnectFn) cloneConnectFn($linkNode, scope);
+        if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode);
+        return $linkNode;
+      };
+    }
+
+    function safeAddClass($element, className) {
+      try {
+        $element.addClass(className);
+      } catch(e) {
+        // ignore, since it means that we are trying to set class on
+        // SVG element, where class name is read-only.
+      }
+    }
+
+    /**
+     * Compile function matches each node in nodeList against the directives. Once all directives
+     * for a particular node are collected their compile functions are executed. The compile
+     * functions return values - the linking functions - are combined into a composite linking
+     * function, which is the a linking function for the node.
+     *
+     * @param {NodeList} nodeList an array of nodes or NodeList to compile
+     * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the
+     *        scope argument is auto-generated to the new child of the transcluded parent scope.
+     * @param {DOMElement=} $rootElement If the nodeList is the root of the compilation tree then
+     *        the rootElement must be set the jqLite collection of the compile root. This is
+     *        needed so that the jqLite collection items can be replaced with widgets.
+     * @param {number=} max directive priority
+     * @returns {?function} A composite linking function of all of the matched directives or null.
+     */
+    function compileNodes(nodeList, transcludeFn, $rootElement, maxPriority, ignoreDirective,
+                            previousCompileContext) {
+      var linkFns = [],
+          nodeLinkFn, childLinkFn, directives, attrs, linkFnFound;
+
+      for(var i = 0; i < nodeList.length; i++) {
+        attrs = new Attributes();
+
+        // we must always refer to nodeList[i] since the nodes can be replaced underneath us.
+        directives = collectDirectives(nodeList[i], [], attrs, i === 0 ? maxPriority : undefined,
+                                        ignoreDirective);
+
+        nodeLinkFn = (directives.length)
+            ? applyDirectivesToNode(directives, nodeList[i], attrs, transcludeFn, $rootElement,
+                                      null, [], [], previousCompileContext)
+            : null;
+
+        childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||
+                      !nodeList[i].childNodes ||
+                      !nodeList[i].childNodes.length)
+            ? null
+            : compileNodes(nodeList[i].childNodes,
+                 nodeLinkFn ? nodeLinkFn.transclude : transcludeFn);
+
+        linkFns.push(nodeLinkFn);
+        linkFns.push(childLinkFn);
+        linkFnFound = (linkFnFound || nodeLinkFn || childLinkFn);
+        //use the previous context only for the first element in the virtual group
+        previousCompileContext = null;
+      }
+
+      // return a linking function if we have found anything, null otherwise
+      return linkFnFound ? compositeLinkFn : null;
+
+      function compositeLinkFn(scope, nodeList, $rootElement, boundTranscludeFn) {
+        var nodeLinkFn, childLinkFn, node, $node, childScope, childTranscludeFn, i, ii, n;
+
+        // copy nodeList so that linking doesn't break due to live list updates.
+        var stableNodeList = [];
+        for (i = 0, ii = nodeList.length; i < ii; i++) {
+          stableNodeList.push(nodeList[i]);
+        }
+
+        for(i = 0, n = 0, ii = linkFns.length; i < ii; n++) {
+          node = stableNodeList[n];
+          nodeLinkFn = linkFns[i++];
+          childLinkFn = linkFns[i++];
+          $node = jqLite(node);
+
+          if (nodeLinkFn) {
+            if (nodeLinkFn.scope) {
+              childScope = scope.$new();
+              $node.data('$scope', childScope);
+              safeAddClass($node, 'ng-scope');
+            } else {
+              childScope = scope;
+            }
+            childTranscludeFn = nodeLinkFn.transclude;
+            if (childTranscludeFn || (!boundTranscludeFn && transcludeFn)) {
+              nodeLinkFn(childLinkFn, childScope, node, $rootElement,
+                createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn)
+              );
+            } else {
+              nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn);
+            }
+          } else if (childLinkFn) {
+            childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);
+          }
+        }
+      }
+    }
+
+    function createBoundTranscludeFn(scope, transcludeFn) {
+      return function boundTranscludeFn(transcludedScope, cloneFn, controllers) {
+        var scopeCreated = false;
+
+        if (!transcludedScope) {
+          transcludedScope = scope.$new();
+          transcludedScope.$$transcluded = true;
+          scopeCreated = true;
+        }
+
+        var clone = transcludeFn(transcludedScope, cloneFn, controllers);
+        if (scopeCreated) {
+          clone.on('$destroy', bind(transcludedScope, transcludedScope.$destroy));
+        }
+        return clone;
+      };
+    }
+
+    /**
+     * Looks for directives on the given node and adds them to the directive collection which is
+     * sorted.
+     *
+     * @param node Node to search.
+     * @param directives An array to which the directives are added to. This array is sorted before
+     *        the function returns.
+     * @param attrs The shared attrs object which is used to populate the normalized attributes.
+     * @param {number=} maxPriority Max directive priority.
+     */
+    function collectDirectives(node, directives, attrs, maxPriority, ignoreDirective) {
+      var nodeType = node.nodeType,
+          attrsMap = attrs.$attr,
+          match,
+          className;
+
+      switch(nodeType) {
+        case 1: /* Element */
+          // use the node name: <directive>
+          addDirective(directives,
+              directiveNormalize(nodeName_(node).toLowerCase()), 'E', maxPriority, ignoreDirective);
+
+          // iterate over the attributes
+          for (var attr, name, nName, ngAttrName, value, nAttrs = node.attributes,
+                   j = 0, jj = nAttrs && nAttrs.length; j < jj; j++) {
+            var attrStartName = false;
+            var attrEndName = false;
+
+            attr = nAttrs[j];
+            if (!msie || msie >= 8 || attr.specified) {
+              name = attr.name;
+              // support ngAttr attribute binding
+              ngAttrName = directiveNormalize(name);
+              if (NG_ATTR_BINDING.test(ngAttrName)) {
+                name = snake_case(ngAttrName.substr(6), '-');
+              }
+
+              var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
+              if (ngAttrName === directiveNName + 'Start') {
+                attrStartName = name;
+                attrEndName = name.substr(0, name.length - 5) + 'end';
+                name = name.substr(0, name.length - 6);
+              }
+
+              nName = directiveNormalize(name.toLowerCase());
+              attrsMap[nName] = name;
+              attrs[nName] = value = trim((msie && name == 'href')
+                ? decodeURIComponent(node.getAttribute(name, 2))
+                : attr.value);
+              if (getBooleanAttrName(node, nName)) {
+                attrs[nName] = true; // presence means true
+              }
+              addAttrInterpolateDirective(node, directives, value, nName);
+              addDirective(directives, nName, 'A', maxPriority, ignoreDirective, attrStartName,
+                            attrEndName);
+            }
+          }
+
+          // use class as directive
+          className = node.className;
+          if (isString(className) && className !== '') {
+            while (match = CLASS_DIRECTIVE_REGEXP.exec(className)) {
+              nName = directiveNormalize(match[2]);
+              if (addDirective(directives, nName, 'C', maxPriority, ignoreDirective)) {
+                attrs[nName] = trim(match[3]);
+              }
+              className = className.substr(match.index + match[0].length);
+            }
+          }
+          break;
+        case 3: /* Text Node */
+          addTextInterpolateDirective(directives, node.nodeValue);
+          break;
+        case 8: /* Comment */
+          try {
+            match = COMMENT_DIRECTIVE_REGEXP.exec(node.nodeValue);
+            if (match) {
+              nName = directiveNormalize(match[1]);
+              if (addDirective(directives, nName, 'M', maxPriority, ignoreDirective)) {
+                attrs[nName] = trim(match[2]);
+              }
+            }
+          } catch (e) {
+            // turns out that under some circumstances IE9 throws errors when one attempts to read
+            // comment's node value.
+            // Just ignore it and continue. (Can't seem to reproduce in test case.)
+          }
+          break;
+      }
+
+      directives.sort(byPriority);
+      return directives;
+    }
+
+    /**
+     * Given a node with an directive-start it collects all of the siblings until it finds
+     * directive-end.
+     * @param node
+     * @param attrStart
+     * @param attrEnd
+     * @returns {*}
+     */
+    function groupScan(node, attrStart, attrEnd) {
+      var nodes = [];
+      var depth = 0;
+      if (attrStart && node.hasAttribute && node.hasAttribute(attrStart)) {
+        var startNode = node;
+        do {
+          if (!node) {
+            throw $compileMinErr('uterdir',
+                      "Unterminated attribute, found '{0}' but no matching '{1}' found.",
+                      attrStart, attrEnd);
+          }
+          if (node.nodeType == 1 /** Element **/) {
+            if (node.hasAttribute(attrStart)) depth++;
+            if (node.hasAttribute(attrEnd)) depth--;
+          }
+          nodes.push(node);
+          node = node.nextSibling;
+        } while (depth > 0);
+      } else {
+        nodes.push(node);
+      }
+
+      return jqLite(nodes);
+    }
+
+    /**
+     * Wrapper for linking function which converts normal linking function into a grouped
+     * linking function.
+     * @param linkFn
+     * @param attrStart
+     * @param attrEnd
+     * @returns {Function}
+     */
+    function groupElementsLinkFnWrapper(linkFn, attrStart, attrEnd) {
+      return function(scope, element, attrs, controllers, transcludeFn) {
+        element = groupScan(element[0], attrStart, attrEnd);
+        return linkFn(scope, element, attrs, controllers, transcludeFn);
+      };
+    }
+
+    /**
+     * Once the directives have been collected, their compile functions are executed. This method
+     * is responsible for inlining directive templates as well as terminating the application
+     * of the directives if the terminal directive has been reached.
+     *
+     * @param {Array} directives Array of collected directives to execute their compile function.
+     *        this needs to be pre-sorted by priority order.
+     * @param {Node} compileNode The raw DOM node to apply the compile functions to
+     * @param {Object} templateAttrs The shared attribute function
+     * @param {function(angular.Scope[, cloneAttachFn]} transcludeFn A linking function, where the
+     *                                                  scope argument is auto-generated to the new
+     *                                                  child of the transcluded parent scope.
+     * @param {JQLite} jqCollection If we are working on the root of the compile tree then this
+     *                              argument has the root jqLite array so that we can replace nodes
+     *                              on it.
+     * @param {Object=} originalReplaceDirective An optional directive that will be ignored when
+     *                                           compiling the transclusion.
+     * @param {Array.<Function>} preLinkFns
+     * @param {Array.<Function>} postLinkFns
+     * @param {Object} previousCompileContext Context used for previous compilation of the current
+     *                                        node
+     * @returns linkFn
+     */
+    function applyDirectivesToNode(directives, compileNode, templateAttrs, transcludeFn,
+                                   jqCollection, originalReplaceDirective, preLinkFns, postLinkFns,
+                                   previousCompileContext) {
+      previousCompileContext = previousCompileContext || {};
+
+      var terminalPriority = -Number.MAX_VALUE,
+          newScopeDirective,
+          controllerDirectives = previousCompileContext.controllerDirectives,
+          newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,
+          templateDirective = previousCompileContext.templateDirective,
+          nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,
+          hasTranscludeDirective = false,
+          hasElementTranscludeDirective = false,
+          $compileNode = templateAttrs.$$element = jqLite(compileNode),
+          directive,
+          directiveName,
+          $template,
+          replaceDirective = originalReplaceDirective,
+          childTranscludeFn = transcludeFn,
+          linkFn,
+          directiveValue;
+
+      // executes all directives on the current element
+      for(var i = 0, ii = directives.length; i < ii; i++) {
+        directive = directives[i];
+        var attrStart = directive.$$start;
+        var attrEnd = directive.$$end;
+
+        // collect multiblock sections
+        if (attrStart) {
+          $compileNode = groupScan(compileNode, attrStart, attrEnd);
+        }
+        $template = undefined;
+
+        if (terminalPriority > directive.priority) {
+          break; // prevent further processing of directives
+        }
+
+        if (directiveValue = directive.scope) {
+          newScopeDirective = newScopeDirective || directive;
+
+          // skip the check for directives with async templates, we'll check the derived sync
+          // directive when the template arrives
+          if (!directive.templateUrl) {
+            assertNoDuplicate('new/isolated scope', newIsolateScopeDirective, directive,
+                              $compileNode);
+            if (isObject(directiveValue)) {
+              newIsolateScopeDirective = directive;
+            }
+          }
+        }
+
+        directiveName = directive.name;
+
+        if (!directive.templateUrl && directive.controller) {
+          directiveValue = directive.controller;
+          controllerDirectives = controllerDirectives || {};
+          assertNoDuplicate("'" + directiveName + "' controller",
+              controllerDirectives[directiveName], directive, $compileNode);
+          controllerDirectives[directiveName] = directive;
+        }
+
+        if (directiveValue = directive.transclude) {
+          hasTranscludeDirective = true;
+
+          // Special case ngIf and ngRepeat so that we don't complain about duplicate transclusion.
+          // This option should only be used by directives that know how to how to safely handle element transclusion,
+          // where the transcluded nodes are added or replaced after linking.
+          if (!directive.$$tlb) {
+            assertNoDuplicate('transclusion', nonTlbTranscludeDirective, directive, $compileNode);
+            nonTlbTranscludeDirective = directive;
+          }
+
+          if (directiveValue == 'element') {
+            hasElementTranscludeDirective = true;
+            terminalPriority = directive.priority;
+            $template = groupScan(compileNode, attrStart, attrEnd);
+            $compileNode = templateAttrs.$$element =
+                jqLite(document.createComment(' ' + directiveName + ': ' +
+                                              templateAttrs[directiveName] + ' '));
+            compileNode = $compileNode[0];
+            replaceWith(jqCollection, jqLite(sliceArgs($template)), compileNode);
+
+            childTranscludeFn = compile($template, transcludeFn, terminalPriority,
+                                        replaceDirective && replaceDirective.name, {
+                                          // Don't pass in:
+                                          // - controllerDirectives - otherwise we'll create duplicates controllers
+                                          // - newIsolateScopeDirective or templateDirective - combining templates with
+                                          //   element transclusion doesn't make sense.
+                                          //
+                                          // We need only nonTlbTranscludeDirective so that we prevent putting transclusion
+                                          // on the same element more than once.
+                                          nonTlbTranscludeDirective: nonTlbTranscludeDirective
+                                        });
+          } else {
+            $template = jqLite(jqLiteClone(compileNode)).contents();
+            $compileNode.empty(); // clear contents
+            childTranscludeFn = compile($template, transcludeFn);
+          }
+        }
+
+        if (directive.template) {
+          assertNoDuplicate('template', templateDirective, directive, $compileNode);
+          templateDirective = directive;
+
+          directiveValue = (isFunction(directive.template))
+              ? directive.template($compileNode, templateAttrs)
+              : directive.template;
+
+          directiveValue = denormalizeTemplate(directiveValue);
+
+          if (directive.replace) {
+            replaceDirective = directive;
+            $template = jqLite('<div>' +
+                                 trim(directiveValue) +
+                               '</div>').contents();
+            compileNode = $template[0];
+
+            if ($template.length != 1 || compileNode.nodeType !== 1) {
+              throw $compileMinErr('tplrt',
+                  "Template for directive '{0}' must have exactly one root element. {1}",
+                  directiveName, '');
+            }
+
+            replaceWith(jqCollection, $compileNode, compileNode);
+
+            var newTemplateAttrs = {$attr: {}};
+
+            // combine directives from the original node and from the template:
+            // - take the array of directives for this element
+            // - split it into two parts, those that already applied (processed) and those that weren't (unprocessed)
+            // - collect directives from the template and sort them by priority
+            // - combine directives as: processed + template + unprocessed
+            var templateDirectives = collectDirectives(compileNode, [], newTemplateAttrs);
+            var unprocessedDirectives = directives.splice(i + 1, directives.length - (i + 1));
+
+            if (newIsolateScopeDirective) {
+              markDirectivesAsIsolate(templateDirectives);
+            }
+            directives = directives.concat(templateDirectives).concat(unprocessedDirectives);
+            mergeTemplateAttributes(templateAttrs, newTemplateAttrs);
+
+            ii = directives.length;
+          } else {
+            $compileNode.html(directiveValue);
+          }
+        }
+
+        if (directive.templateUrl) {
+          assertNoDuplicate('template', templateDirective, directive, $compileNode);
+          templateDirective = directive;
+
+          if (directive.replace) {
+            replaceDirective = directive;
+          }
+
+          nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,
+              templateAttrs, jqCollection, childTranscludeFn, preLinkFns, postLinkFns, {
+                controllerDirectives: controllerDirectives,
+                newIsolateScopeDirective: newIsolateScopeDirective,
+                templateDirective: templateDirective,
+                nonTlbTranscludeDirective: nonTlbTranscludeDirective
+              });
+          ii = directives.length;
+        } else if (directive.compile) {
+          try {
+            linkFn = directive.compile($compileNode, templateAttrs, childTranscludeFn);
+            if (isFunction(linkFn)) {
+              addLinkFns(null, linkFn, attrStart, attrEnd);
+            } else if (linkFn) {
+              addLinkFns(linkFn.pre, linkFn.post, attrStart, attrEnd);
+            }
+          } catch (e) {
+            $exceptionHandler(e, startingTag($compileNode));
+          }
+        }
+
+        if (directive.terminal) {
+          nodeLinkFn.terminal = true;
+          terminalPriority = Math.max(terminalPriority, directive.priority);
+        }
+
+      }
+
+      nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;
+      nodeLinkFn.transclude = hasTranscludeDirective && childTranscludeFn;
+
+      // might be normal or delayed nodeLinkFn depending on if templateUrl is present
+      return nodeLinkFn;
+
+      ////////////////////
+
+      function addLinkFns(pre, post, attrStart, attrEnd) {
+        if (pre) {
+          if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);
+          pre.require = directive.require;
+          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
+            pre = cloneAndAnnotateFn(pre, {isolateScope: true});
+          }
+          preLinkFns.push(pre);
+        }
+        if (post) {
+          if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);
+          post.require = directive.require;
+          if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
+            post = cloneAndAnnotateFn(post, {isolateScope: true});
+          }
+          postLinkFns.push(post);
+        }
+      }
+
+
+      function getControllers(require, $element, elementControllers) {
+        var value, retrievalMethod = 'data', optional = false;
+        if (isString(require)) {
+          while((value = require.charAt(0)) == '^' || value == '?') {
+            require = require.substr(1);
+            if (value == '^') {
+              retrievalMethod = 'inheritedData';
+            }
+            optional = optional || value == '?';
+          }
+          value = null;
+
+          if (elementControllers && retrievalMethod === 'data') {
+            value = elementControllers[require];
+          }
+          value = value || $element[retrievalMethod]('$' + require + 'Controller');
+
+          if (!value && !optional) {
+            throw $compileMinErr('ctreq',
+                "Controller '{0}', required by directive '{1}', can't be found!",
+                require, directiveName);
+          }
+          return value;
+        } else if (isArray(require)) {
+          value = [];
+          forEach(require, function(require) {
+            value.push(getControllers(require, $element, elementControllers));
+          });
+        }
+        return value;
+      }
+
+
+      function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {
+        var attrs, $element, i, ii, linkFn, controller, isolateScope, elementControllers = {}, transcludeFn;
+
+        if (compileNode === linkNode) {
+          attrs = templateAttrs;
+        } else {
+          attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));
+        }
+        $element = attrs.$$element;
+
+        if (newIsolateScopeDirective) {
+          var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/;
+          var $linkNode = jqLite(linkNode);
+
+          isolateScope = scope.$new(true);
+
+          if (templateDirective && (templateDirective === newIsolateScopeDirective.$$originalDirective)) {
+            $linkNode.data('$isolateScope', isolateScope) ;
+          } else {
+            $linkNode.data('$isolateScopeNoTemplate', isolateScope);
+          }
+
+
+
+          safeAddClass($linkNode, 'ng-isolate-scope');
+
+          forEach(newIsolateScopeDirective.scope, function(definition, scopeName) {
+            var match = definition.match(LOCAL_REGEXP) || [],
+                attrName = match[3] || scopeName,
+                optional = (match[2] == '?'),
+                mode = match[1], // @, =, or &
+                lastValue,
+                parentGet, parentSet, compare;
+
+            isolateScope.$$isolateBindings[scopeName] = mode + attrName;
+
+            switch (mode) {
+
+              case '@':
+                attrs.$observe(attrName, function(value) {
+                  isolateScope[scopeName] = value;
+                });
+                attrs.$$observers[attrName].$$scope = scope;
+                if( attrs[attrName] ) {
+                  // If the attribute has been provided then we trigger an interpolation to ensure
+                  // the value is there for use in the link fn
+                  isolateScope[scopeName] = $interpolate(attrs[attrName])(scope);
+                }
+                break;
+
+              case '=':
+                if (optional && !attrs[attrName]) {
+                  return;
+                }
+                parentGet = $parse(attrs[attrName]);
+                if (parentGet.literal) {
+                  compare = equals;
+                } else {
+                  compare = function(a,b) { return a === b; };
+                }
+                parentSet = parentGet.assign || function() {
+                  // reset the change, or we will throw this exception on every $digest
+                  lastValue = isolateScope[scopeName] = parentGet(scope);
+                  throw $compileMinErr('nonassign',
+                      "Expression '{0}' used with directive '{1}' is non-assignable!",
+                      attrs[attrName], newIsolateScopeDirective.name);
+                };
+                lastValue = isolateScope[scopeName] = parentGet(scope);
+                isolateScope.$watch(function parentValueWatch() {
+                  var parentValue = parentGet(scope);
+                  if (!compare(parentValue, isolateScope[scopeName])) {
+                    // we are out of sync and need to copy
+                    if (!compare(parentValue, lastValue)) {
+                      // parent changed and it has precedence
+                      isolateScope[scopeName] = parentValue;
+                    } else {
+                      // if the parent can be assigned then do so
+                      parentSet(scope, parentValue = isolateScope[scopeName]);
+                    }
+                  }
+                  return lastValue = parentValue;
+                }, null, parentGet.literal);
+                break;
+
+              case '&':
+                parentGet = $parse(attrs[attrName]);
+                isolateScope[scopeName] = function(locals) {
+                  return parentGet(scope, locals);
+                };
+                break;
+
+              default:
+                throw $compileMinErr('iscp',
+                    "Invalid isolate scope definition for directive '{0}'." +
+                    " Definition: {... {1}: '{2}' ...}",
+                    newIsolateScopeDirective.name, scopeName, definition);
+            }
+          });
+        }
+        transcludeFn = boundTranscludeFn && controllersBoundTransclude;
+        if (controllerDirectives) {
+          forEach(controllerDirectives, function(directive) {
+            var locals = {
+              $scope: directive === newIsolateScopeDirective || directive.$$isolateScope ? isolateScope : scope,
+              $element: $element,
+              $attrs: attrs,
+              $transclude: transcludeFn
+            }, controllerInstance;
+
+            controller = directive.controller;
+            if (controller == '@') {
+              controller = attrs[directive.name];
+            }
+
+            controllerInstance = $controller(controller, locals);
+            // For directives with element transclusion the element is a comment,
+            // but jQuery .data doesn't support attaching data to comment nodes as it's hard to
+            // clean up (http://bugs.jquery.com/ticket/8335).
+            // Instead, we save the controllers for the element in a local hash and attach to .data
+            // later, once we have the actual element.
+            elementControllers[directive.name] = controllerInstance;
+            if (!hasElementTranscludeDirective) {
+              $element.data('$' + directive.name + 'Controller', controllerInstance);
+            }
+
+            if (directive.controllerAs) {
+              locals.$scope[directive.controllerAs] = controllerInstance;
+            }
+          });
+        }
+
+        // PRELINKING
+        for(i = 0, ii = preLinkFns.length; i < ii; i++) {
+          try {
+            linkFn = preLinkFns[i];
+            linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,
+                linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn);
+          } catch (e) {
+            $exceptionHandler(e, startingTag($element));
+          }
+        }
+
+        // RECURSION
+        // We only pass the isolate scope, if the isolate directive has a template,
+        // otherwise the child elements do not belong to the isolate directive.
+        var scopeToChild = scope;
+        if (newIsolateScopeDirective && (newIsolateScopeDirective.template || newIsolateScopeDirective.templateUrl === null)) {
+          scopeToChild = isolateScope;
+        }
+        childLinkFn && childLinkFn(scopeToChild, linkNode.childNodes, undefined, boundTranscludeFn);
+
+        // POSTLINKING
+        for(i = postLinkFns.length - 1; i >= 0; i--) {
+          try {
+            linkFn = postLinkFns[i];
+            linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,
+                linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn);
+          } catch (e) {
+            $exceptionHandler(e, startingTag($element));
+          }
+        }
+
+        // This is the function that is injected as `$transclude`.
+        function controllersBoundTransclude(scope, cloneAttachFn) {
+          var transcludeControllers;
+
+          // no scope passed
+          if (arguments.length < 2) {
+            cloneAttachFn = scope;
+            scope = undefined;
+          }
+
+          if (hasElementTranscludeDirective) {
+            transcludeControllers = elementControllers;
+          }
+
+          return boundTranscludeFn(scope, cloneAttachFn, transcludeControllers);
+        }
+      }
+    }
+
+    function markDirectivesAsIsolate(directives) {
+      // mark all directives as needing isolate scope.
+      for (var j = 0, jj = directives.length; j < jj; j++) {
+        directives[j] = inherit(directives[j], {$$isolateScope: true});
+      }
+    }
+
+    /**
+     * looks up the directive and decorates it with exception handling and proper parameters. We
+     * call this the boundDirective.
+     *
+     * @param {string} name name of the directive to look up.
+     * @param {string} location The directive must be found in specific format.
+     *   String containing any of theses characters:
+     *
+     *   * `E`: element name
+     *   * `A': attribute
+     *   * `C`: class
+     *   * `M`: comment
+     * @returns true if directive was added.
+     */
+    function addDirective(tDirectives, name, location, maxPriority, ignoreDirective, startAttrName,
+                          endAttrName) {
+      if (name === ignoreDirective) return null;
+      var match = null;
+      if (hasDirectives.hasOwnProperty(name)) {
+        for(var directive, directives = $injector.get(name + Suffix),
+            i = 0, ii = directives.length; i<ii; i++) {
+          try {
+            directive = directives[i];
+            if ( (maxPriority === undefined || maxPriority > directive.priority) &&
+                 directive.restrict.indexOf(location) != -1) {
+              if (startAttrName) {
+                directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});
+              }
+              tDirectives.push(directive);
+              match = directive;
+            }
+          } catch(e) { $exceptionHandler(e); }
+        }
+      }
+      return match;
+    }
+
+
+    /**
+     * When the element is replaced with HTML template then the new attributes
+     * on the template need to be merged with the existing attributes in the DOM.
+     * The desired effect is to have both of the attributes present.
+     *
+     * @param {object} dst destination attributes (original DOM)
+     * @param {object} src source attributes (from the directive template)
+     */
+    function mergeTemplateAttributes(dst, src) {
+      var srcAttr = src.$attr,
+          dstAttr = dst.$attr,
+          $element = dst.$$element;
+
+      // reapply the old attributes to the new element
+      forEach(dst, function(value, key) {
+        if (key.charAt(0) != '$') {
+          if (src[key]) {
+            value += (key === 'style' ? ';' : ' ') + src[key];
+          }
+          dst.$set(key, value, true, srcAttr[key]);
+        }
+      });
+
+      // copy the new attributes on the old attrs object
+      forEach(src, function(value, key) {
+        if (key == 'class') {
+          safeAddClass($element, value);
+          dst['class'] = (dst['class'] ? dst['class'] + ' ' : '') + value;
+        } else if (key == 'style') {
+          $element.attr('style', $element.attr('style') + ';' + value);
+          dst['style'] = (dst['style'] ? dst['style'] + ';' : '') + value;
+          // `dst` will never contain hasOwnProperty as DOM parser won't let it.
+          // You will get an "InvalidCharacterError: DOM Exception 5" error if you
+          // have an attribute like "has-own-property" or "data-has-own-property", etc.
+        } else if (key.charAt(0) != '$' && !dst.hasOwnProperty(key)) {
+          dst[key] = value;
+          dstAttr[key] = srcAttr[key];
+        }
+      });
+    }
+
+
+    function compileTemplateUrl(directives, $compileNode, tAttrs,
+        $rootElement, childTranscludeFn, preLinkFns, postLinkFns, previousCompileContext) {
+      var linkQueue = [],
+          afterTemplateNodeLinkFn,
+          afterTemplateChildLinkFn,
+          beforeTemplateCompileNode = $compileNode[0],
+          origAsyncDirective = directives.shift(),
+          // The fact that we have to copy and patch the directive seems wrong!
+          derivedSyncDirective = extend({}, origAsyncDirective, {
+            templateUrl: null, transclude: null, replace: null, $$originalDirective: origAsyncDirective
+          }),
+          templateUrl = (isFunction(origAsyncDirective.templateUrl))
+              ? origAsyncDirective.templateUrl($compileNode, tAttrs)
+              : origAsyncDirective.templateUrl;
+
+      $compileNode.empty();
+
+      $http.get($sce.getTrustedResourceUrl(templateUrl), {cache: $templateCache}).
+        success(function(content) {
+          var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;
+
+          content = denormalizeTemplate(content);
+
+          if (origAsyncDirective.replace) {
+            $template = jqLite('<div>' + trim(content) + '</div>').contents();
+            compileNode = $template[0];
+
+            if ($template.length != 1 || compileNode.nodeType !== 1) {
+              throw $compileMinErr('tplrt',
+                  "Template for directive '{0}' must have exactly one root element. {1}",
+                  origAsyncDirective.name, templateUrl);
+            }
+
+            tempTemplateAttrs = {$attr: {}};
+            replaceWith($rootElement, $compileNode, compileNode);
+            var templateDirectives = collectDirectives(compileNode, [], tempTemplateAttrs);
+
+            if (isObject(origAsyncDirective.scope)) {
+              markDirectivesAsIsolate(templateDirectives);
+            }
+            directives = templateDirectives.concat(directives);
+            mergeTemplateAttributes(tAttrs, tempTemplateAttrs);
+          } else {
+            compileNode = beforeTemplateCompileNode;
+            $compileNode.html(content);
+          }
+
+          directives.unshift(derivedSyncDirective);
+
+          afterTemplateNodeLinkFn = applyDirectivesToNode(directives, compileNode, tAttrs,
+              childTranscludeFn, $compileNode, origAsyncDirective, preLinkFns, postLinkFns,
+              previousCompileContext);
+          forEach($rootElement, function(node, i) {
+            if (node == compileNode) {
+              $rootElement[i] = $compileNode[0];
+            }
+          });
+          afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);
+
+
+          while(linkQueue.length) {
+            var scope = linkQueue.shift(),
+                beforeTemplateLinkNode = linkQueue.shift(),
+                linkRootElement = linkQueue.shift(),
+                boundTranscludeFn = linkQueue.shift(),
+                linkNode = $compileNode[0];
+
+            if (beforeTemplateLinkNode !== beforeTemplateCompileNode) {
+              // it was cloned therefore we have to clone as well.
+              linkNode = jqLiteClone(compileNode);
+              replaceWith(linkRootElement, jqLite(beforeTemplateLinkNode), linkNode);
+            }
+            if (afterTemplateNodeLinkFn.transclude) {
+              childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude);
+            } else {
+              childBoundTranscludeFn = boundTranscludeFn;
+            }
+            afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, linkNode, $rootElement,
+              childBoundTranscludeFn);
+          }
+          linkQueue = null;
+        }).
+        error(function(response, code, headers, config) {
+          throw $compileMinErr('tpload', 'Failed to load template: {0}', config.url);
+        });
+
+      return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {
+        if (linkQueue) {
+          linkQueue.push(scope);
+          linkQueue.push(node);
+          linkQueue.push(rootElement);
+          linkQueue.push(boundTranscludeFn);
+        } else {
+          afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, boundTranscludeFn);
+        }
+      };
+    }
+
+
+    /**
+     * Sorting function for bound directives.
+     */
+    function byPriority(a, b) {
+      var diff = b.priority - a.priority;
+      if (diff !== 0) return diff;
+      if (a.name !== b.name) return (a.name < b.name) ? -1 : 1;
+      return a.index - b.index;
+    }
+
+
+    function assertNoDuplicate(what, previousDirective, directive, element) {
+      if (previousDirective) {
+        throw $compileMinErr('multidir', 'Multiple directives [{0}, {1}] asking for {2} on: {3}',
+            previousDirective.name, directive.name, what, startingTag(element));
+      }
+    }
+
+
+    function addTextInterpolateDirective(directives, text) {
+      var interpolateFn = $interpolate(text, true);
+      if (interpolateFn) {
+        directives.push({
+          priority: 0,
+          compile: valueFn(function textInterpolateLinkFn(scope, node) {
+            var parent = node.parent(),
+                bindings = parent.data('$binding') || [];
+            bindings.push(interpolateFn);
+            safeAddClass(parent.data('$binding', bindings), 'ng-binding');
+            scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {
+              node[0].nodeValue = value;
+            });
+          })
+        });
+      }
+    }
+
+
+    function getTrustedContext(node, attrNormalizedName) {
+      if (attrNormalizedName == "srcdoc") {
+        return $sce.HTML;
+      }
+      var tag = nodeName_(node);
+      // maction[xlink:href] can source SVG.  It's not limited to <maction>.
+      if (attrNormalizedName == "xlinkHref" ||
+          (tag == "FORM" && attrNormalizedName == "action") ||
+          (tag != "IMG" && (attrNormalizedName == "src" ||
+                            attrNormalizedName == "ngSrc"))) {
+        return $sce.RESOURCE_URL;
+      }
+    }
+
+
+    function addAttrInterpolateDirective(node, directives, value, name) {
+      var interpolateFn = $interpolate(value, true);
+
+      // no interpolation found -> ignore
+      if (!interpolateFn) return;
+
+
+      if (name === "multiple" && nodeName_(node) === "SELECT") {
+        throw $compileMinErr("selmulti",
+            "Binding to the 'multiple' attribute is not supported. Element: {0}",
+            startingTag(node));
+      }
+
+      directives.push({
+        priority: 100,
+        compile: function() {
+            return {
+              pre: function attrInterpolatePreLinkFn(scope, element, attr) {
+                var $$observers = (attr.$$observers || (attr.$$observers = {}));
+
+                if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {
+                  throw $compileMinErr('nodomevents',
+                      "Interpolations for HTML DOM event attributes are disallowed.  Please use the " +
+                          "ng- versions (such as ng-click instead of onclick) instead.");
+                }
+
+                // we need to interpolate again, in case the attribute value has been updated
+                // (e.g. by another directive's compile function)
+                interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name));
+
+                // if attribute was updated so that there is no interpolation going on we don't want to
+                // register any observers
+                if (!interpolateFn) return;
+
+                // TODO(i): this should likely be attr.$set(name, iterpolateFn(scope) so that we reset the
+                // actual attr value
+                attr[name] = interpolateFn(scope);
+                ($$observers[name] || ($$observers[name] = [])).$$inter = true;
+                (attr.$$observers && attr.$$observers[name].$$scope || scope).
+                  $watch(interpolateFn, function interpolateFnWatchAction(newValue, oldValue) {
+                    //special case for class attribute addition + removal
+                    //so that class changes can tap into the animation
+                    //hooks provided by the $animate service. Be sure to
+                    //skip animations when the first digest occurs (when
+                    //both the new and the old values are the same) since
+                    //the CSS classes are the non-interpolated values
+                    if(name === 'class' && newValue != oldValue) {
+                      attr.$updateClass(newValue, oldValue);
+                    } else {
+                      attr.$set(name, newValue);
+                    }
+                  });
+              }
+            };
+          }
+      });
+    }
+
+
+    /**
+     * This is a special jqLite.replaceWith, which can replace items which
+     * have no parents, provided that the containing jqLite collection is provided.
+     *
+     * @param {JqLite=} $rootElement The root of the compile tree. Used so that we can replace nodes
+     *                               in the root of the tree.
+     * @param {JqLite} elementsToRemove The jqLite element which we are going to replace. We keep
+     *                                  the shell, but replace its DOM node reference.
+     * @param {Node} newNode The new DOM node.
+     */
+    function replaceWith($rootElement, elementsToRemove, newNode) {
+      var firstElementToRemove = elementsToRemove[0],
+          removeCount = elementsToRemove.length,
+          parent = firstElementToRemove.parentNode,
+          i, ii;
+
+      if ($rootElement) {
+        for(i = 0, ii = $rootElement.length; i < ii; i++) {
+          if ($rootElement[i] == firstElementToRemove) {
+            $rootElement[i++] = newNode;
+            for (var j = i, j2 = j + removeCount - 1,
+                     jj = $rootElement.length;
+                 j < jj; j++, j2++) {
+              if (j2 < jj) {
+                $rootElement[j] = $rootElement[j2];
+              } else {
+                delete $rootElement[j];
+              }
+            }
+            $rootElement.length -= removeCount - 1;
+            break;
+          }
+        }
+      }
+
+      if (parent) {
+        parent.replaceChild(newNode, firstElementToRemove);
+      }
+      var fragment = document.createDocumentFragment();
+      fragment.appendChild(firstElementToRemove);
+      newNode[jqLite.expando] = firstElementToRemove[jqLite.expando];
+      for (var k = 1, kk = elementsToRemove.length; k < kk; k++) {
+        var element = elementsToRemove[k];
+        jqLite(element).remove(); // must do this way to clean up expando
+        fragment.appendChild(element);
+        delete elementsToRemove[k];
+      }
+
+      elementsToRemove[0] = newNode;
+      elementsToRemove.length = 1;
+    }
+
+
+    function cloneAndAnnotateFn(fn, annotation) {
+      return extend(function() { return fn.apply(null, arguments); }, fn, annotation);
+    }
+  }];
+}
+
+var PREFIX_REGEXP = /^(x[\:\-_]|data[\:\-_])/i;
+/**
+ * Converts all accepted directives format into proper directive name.
+ * All of these will become 'myDirective':
+ *   my:Directive
+ *   my-directive
+ *   x-my-directive
+ *   data-my:directive
+ *
+ * Also there is special case for Moz prefix starting with upper case letter.
+ * @param name Name to normalize
+ */
+function directiveNormalize(name) {
+  return camelCase(name.replace(PREFIX_REGEXP, ''));
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$compile.directive.Attributes
+ *
+ * @description
+ * A shared object between directive compile / linking functions which contains normalized DOM
+ * element attributes. The values reflect current binding state `{{ }}`. The normalization is
+ * needed since all of these are treated as equivalent in Angular:
+ *
+ *    <span ng:bind="a" ng-bind="a" data-ng-bind="a" x-ng-bind="a">
+ */
+
+/**
+ * @ngdoc property
+ * @name ng.$compile.directive.Attributes#$attr
+ * @propertyOf ng.$compile.directive.Attributes
+ * @returns {object} A map of DOM element attribute names to the normalized name. This is
+ *                   needed to do reverse lookup from normalized name back to actual name.
+ */
+
+
+/**
+ * @ngdoc function
+ * @name ng.$compile.directive.Attributes#$set
+ * @methodOf ng.$compile.directive.Attributes
+ * @function
+ *
+ * @description
+ * Set DOM element attribute value.
+ *
+ *
+ * @param {string} name Normalized element attribute name of the property to modify. The name is
+ *          revers translated using the {@link ng.$compile.directive.Attributes#$attr $attr}
+ *          property to the original name.
+ * @param {string} value Value to set the attribute to. The value can be an interpolated string.
+ */
+
+
+
+/**
+ * Closure compiler type information
+ */
+
+function nodesetLinkingFn(
+  /* angular.Scope */ scope,
+  /* NodeList */ nodeList,
+  /* Element */ rootElement,
+  /* function(Function) */ boundTranscludeFn
+){}
+
+function directiveLinkingFn(
+  /* nodesetLinkingFn */ nodesetLinkingFn,
+  /* angular.Scope */ scope,
+  /* Node */ node,
+  /* Element */ rootElement,
+  /* function(Function) */ boundTranscludeFn
+){}
+
+function tokenDifference(str1, str2) {
+  var values = '',
+      tokens1 = str1.split(/\s+/),
+      tokens2 = str2.split(/\s+/);
+
+  outer:
+  for(var i = 0; i < tokens1.length; i++) {
+    var token = tokens1[i];
+    for(var j = 0; j < tokens2.length; j++) {
+      if(token == tokens2[j]) continue outer;
+    }
+    values += (values.length > 0 ? ' ' : '') + token;
+  }
+  return values;
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$controllerProvider
+ * @description
+ * The {@link ng.$controller $controller service} is used by Angular to create new
+ * controllers.
+ *
+ * This provider allows controller registration via the
+ * {@link ng.$controllerProvider#methods_register register} method.
+ */
+function $ControllerProvider() {
+  var controllers = {},
+      CNTRL_REG = /^(\S+)(\s+as\s+(\w+))?$/;
+
+
+  /**
+   * @ngdoc function
+   * @name ng.$controllerProvider#register
+   * @methodOf ng.$controllerProvider
+   * @param {string|Object} name Controller name, or an object map of controllers where the keys are
+   *    the names and the values are the constructors.
+   * @param {Function|Array} constructor Controller constructor fn (optionally decorated with DI
+   *    annotations in the array notation).
+   */
+  this.register = function(name, constructor) {
+    assertNotHasOwnProperty(name, 'controller');
+    if (isObject(name)) {
+      extend(controllers, name);
+    } else {
+      controllers[name] = constructor;
+    }
+  };
+
+
+  this.$get = ['$injector', '$window', function($injector, $window) {
+
+    /**
+     * @ngdoc function
+     * @name ng.$controller
+     * @requires $injector
+     *
+     * @param {Function|string} constructor If called with a function then it's considered to be the
+     *    controller constructor function. Otherwise it's considered to be a string which is used
+     *    to retrieve the controller constructor using the following steps:
+     *
+     *    * check if a controller with given name is registered via `$controllerProvider`
+     *    * check if evaluating the string on the current scope returns a constructor
+     *    * check `window[constructor]` on the global `window` object
+     *
+     * @param {Object} locals Injection locals for Controller.
+     * @return {Object} Instance of given controller.
+     *
+     * @description
+     * `$controller` service is responsible for instantiating controllers.
+     *
+     * It's just a simple call to {@link AUTO.$injector $injector}, but extracted into
+     * a service, so that one can override this service with {@link https://gist.github.com/1649788
+     * BC version}.
+     */
+    return function(expression, locals) {
+      var instance, match, constructor, identifier;
+
+      if(isString(expression)) {
+        match = expression.match(CNTRL_REG),
+        constructor = match[1],
+        identifier = match[3];
+        expression = controllers.hasOwnProperty(constructor)
+            ? controllers[constructor]
+            : getter(locals.$scope, constructor, true) || getter($window, constructor, true);
+
+        assertArgFn(expression, constructor, true);
+      }
+
+      instance = $injector.instantiate(expression, locals);
+
+      if (identifier) {
+        if (!(locals && typeof locals.$scope == 'object')) {
+          throw minErr('$controller')('noscp',
+              "Cannot export controller '{0}' as '{1}'! No $scope object provided via `locals`.",
+              constructor || expression.name, identifier);
+        }
+
+        locals.$scope[identifier] = instance;
+      }
+
+      return instance;
+    };
+  }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$document
+ * @requires $window
+ *
+ * @description
+ * A {@link angular.element jQuery (lite)}-wrapped reference to the browser's `window.document`
+ * element.
+ */
+function $DocumentProvider(){
+  this.$get = ['$window', function(window){
+    return jqLite(window.document);
+  }];
+}
+
+/**
+ * @ngdoc function
+ * @name ng.$exceptionHandler
+ * @requires $log
+ *
+ * @description
+ * Any uncaught exception in angular expressions is delegated to this service.
+ * The default implementation simply delegates to `$log.error` which logs it into
+ * the browser console.
+ * 
+ * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by
+ * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.
+ *
+ * ## Example:
+ * 
+ * <pre>
+ *   angular.module('exceptionOverride', []).factory('$exceptionHandler', function () {
+ *     return function (exception, cause) {
+ *       exception.message += ' (caused by "' + cause + '")';
+ *       throw exception;
+ *     };
+ *   });
+ * </pre>
+ * 
+ * This example will override the normal action of `$exceptionHandler`, to make angular
+ * exceptions fail hard when they happen, instead of just logging to the console.
+ *
+ * @param {Error} exception Exception associated with the error.
+ * @param {string=} cause optional information about the context in which
+ *       the error was thrown.
+ *
+ */
+function $ExceptionHandlerProvider() {
+  this.$get = ['$log', function($log) {
+    return function(exception, cause) {
+      $log.error.apply($log, arguments);
+    };
+  }];
+}
+
+/**
+ * Parse headers into key value object
+ *
+ * @param {string} headers Raw headers as a string
+ * @returns {Object} Parsed headers as key value object
+ */
+function parseHeaders(headers) {
+  var parsed = {}, key, val, i;
+
+  if (!headers) return parsed;
+
+  forEach(headers.split('\n'), function(line) {
+    i = line.indexOf(':');
+    key = lowercase(trim(line.substr(0, i)));
+    val = trim(line.substr(i + 1));
+
+    if (key) {
+      if (parsed[key]) {
+        parsed[key] += ', ' + val;
+      } else {
+        parsed[key] = val;
+      }
+    }
+  });
+
+  return parsed;
+}
+
+
+/**
+ * Returns a function that provides access to parsed headers.
+ *
+ * Headers are lazy parsed when first requested.
+ * @see parseHeaders
+ *
+ * @param {(string|Object)} headers Headers to provide access to.
+ * @returns {function(string=)} Returns a getter function which if called with:
+ *
+ *   - if called with single an argument returns a single header value or null
+ *   - if called with no arguments returns an object containing all headers.
+ */
+function headersGetter(headers) {
+  var headersObj = isObject(headers) ? headers : undefined;
+
+  return function(name) {
+    if (!headersObj) headersObj =  parseHeaders(headers);
+
+    if (name) {
+      return headersObj[lowercase(name)] || null;
+    }
+
+    return headersObj;
+  };
+}
+
+
+/**
+ * Chain all given functions
+ *
+ * This function is used for both request and response transforming
+ *
+ * @param {*} data Data to transform.
+ * @param {function(string=)} headers Http headers getter fn.
+ * @param {(function|Array.<function>)} fns Function or an array of functions.
+ * @returns {*} Transformed data.
+ */
+function transformData(data, headers, fns) {
+  if (isFunction(fns))
+    return fns(data, headers);
+
+  forEach(fns, function(fn) {
+    data = fn(data, headers);
+  });
+
+  return data;
+}
+
+
+function isSuccess(status) {
+  return 200 <= status && status < 300;
+}
+
+
+function $HttpProvider() {
+  var JSON_START = /^\s*(\[|\{[^\{])/,
+      JSON_END = /[\}\]]\s*$/,
+      PROTECTION_PREFIX = /^\)\]\}',?\n/,
+      CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': 'application/json;charset=utf-8'};
+
+  var defaults = this.defaults = {
+    // transform incoming response data
+    transformResponse: [function(data) {
+      if (isString(data)) {
+        // strip json vulnerability protection prefix
+        data = data.replace(PROTECTION_PREFIX, '');
+        if (JSON_START.test(data) && JSON_END.test(data))
+          data = fromJson(data);
+      }
+      return data;
+    }],
+
+    // transform outgoing request data
+    transformRequest: [function(d) {
+      return isObject(d) && !isFile(d) ? toJson(d) : d;
+    }],
+
+    // default headers
+    headers: {
+      common: {
+        'Accept': 'application/json, text/plain, */*'
+      },
+      post:   CONTENT_TYPE_APPLICATION_JSON,
+      put:    CONTENT_TYPE_APPLICATION_JSON,
+      patch:  CONTENT_TYPE_APPLICATION_JSON
+    },
+
+    xsrfCookieName: 'XSRF-TOKEN',
+    xsrfHeaderName: 'X-XSRF-TOKEN'
+  };
+
+  /**
+   * Are ordered by request, i.e. they are applied in the same order as the
+   * array, on request, but reverse order, on response.
+   */
+  var interceptorFactories = this.interceptors = [];
+
+  /**
+   * For historical reasons, response interceptors are ordered by the order in which
+   * they are applied to the response. (This is the opposite of interceptorFactories)
+   */
+  var responseInterceptorFactories = this.responseInterceptors = [];
+
+  this.$get = ['$httpBackend', '$browser', '$cacheFactory', '$rootScope', '$q', '$injector',
+      function($httpBackend, $browser, $cacheFactory, $rootScope, $q, $injector) {
+
+    var defaultCache = $cacheFactory('$http');
+
+    /**
+     * Interceptors stored in reverse order. Inner interceptors before outer interceptors.
+     * The reversal is needed so that we can build up the interception chain around the
+     * server request.
+     */
+    var reversedInterceptors = [];
+
+    forEach(interceptorFactories, function(interceptorFactory) {
+      reversedInterceptors.unshift(isString(interceptorFactory)
+          ? $injector.get(interceptorFactory) : $injector.invoke(interceptorFactory));
+    });
+
+    forEach(responseInterceptorFactories, function(interceptorFactory, index) {
+      var responseFn = isString(interceptorFactory)
+          ? $injector.get(interceptorFactory)
+          : $injector.invoke(interceptorFactory);
+
+      /**
+       * Response interceptors go before "around" interceptors (no real reason, just
+       * had to pick one.) But they are already reversed, so we can't use unshift, hence
+       * the splice.
+       */
+      reversedInterceptors.splice(index, 0, {
+        response: function(response) {
+          return responseFn($q.when(response));
+        },
+        responseError: function(response) {
+          return responseFn($q.reject(response));
+        }
+      });
+    });
+
+
+    /**
+     * @ngdoc function
+     * @name ng.$http
+     * @requires $httpBackend
+     * @requires $browser
+     * @requires $cacheFactory
+     * @requires $rootScope
+     * @requires $q
+     * @requires $injector
+     *
+     * @description
+     * The `$http` service is a core Angular service that facilitates communication with the remote
+     * HTTP servers via the browser's {@link https://developer.mozilla.org/en/xmlhttprequest
+     * XMLHttpRequest} object or via {@link http://en.wikipedia.org/wiki/JSONP JSONP}.
+     *
+     * For unit testing applications that use `$http` service, see
+     * {@link ngMock.$httpBackend $httpBackend mock}.
+     *
+     * For a higher level of abstraction, please check out the {@link ngResource.$resource
+     * $resource} service.
+     *
+     * The $http API is based on the {@link ng.$q deferred/promise APIs} exposed by
+     * the $q service. While for simple usage patterns this doesn't matter much, for advanced usage
+     * it is important to familiarize yourself with these APIs and the guarantees they provide.
+     *
+     *
+     * # General usage
+     * The `$http` service is a function which takes a single argument — a configuration object —
+     * that is used to generate an HTTP request and returns  a {@link ng.$q promise}
+     * with two $http specific methods: `success` and `error`.
+     *
+     * <pre>
+     *   $http({method: 'GET', url: '/someUrl'}).
+     *     success(function(data, status, headers, config) {
+     *       // this callback will be called asynchronously
+     *       // when the response is available
+     *     }).
+     *     error(function(data, status, headers, config) {
+     *       // called asynchronously if an error occurs
+     *       // or server returns response with an error status.
+     *     });
+     * </pre>
+     *
+     * Since the returned value of calling the $http function is a `promise`, you can also use
+     * the `then` method to register callbacks, and these callbacks will receive a single argument –
+     * an object representing the response. See the API signature and type info below for more
+     * details.
+     *
+     * A response status code between 200 and 299 is considered a success status and
+     * will result in the success callback being called. Note that if the response is a redirect,
+     * XMLHttpRequest will transparently follow it, meaning that the error callback will not be
+     * called for such responses.
+     * 
+     * # Calling $http from outside AngularJS
+     * The `$http` service will not actually send the request until the next `$digest()` is
+     * executed. Normally this is not an issue, since almost all the time your call to `$http` will
+     * be from within a `$apply()` block.
+     * If you are calling `$http` from outside Angular, then you should wrap it in a call to
+     * `$apply` to cause a $digest to occur and also to handle errors in the block correctly.
+     *
+     * ```
+     * $scope.$apply(function() {
+     *   $http(...);
+     * });
+     * ```
+     *
+     * # Writing Unit Tests that use $http
+     * When unit testing you are mostly responsible for scheduling the `$digest` cycle. If you do
+     * not trigger a `$digest` before calling `$httpBackend.flush()` then the request will not have
+     * been made and `$httpBackend.expect(...)` expectations will fail.  The solution is to run the
+     * code that calls the `$http()` method inside a $apply block as explained in the previous
+     * section.
+     *
+     * ```
+     * $httpBackend.expectGET(...);
+     * $scope.$apply(function() {
+     *   $http.get(...);
+     * });
+     * $httpBackend.flush();
+     * ```
+     *
+     * # Shortcut methods
+     *
+     * Since all invocations of the $http service require passing in an HTTP method and URL, and
+     * POST/PUT requests require request data to be provided as well, shortcut methods
+     * were created:
+     *
+     * <pre>
+     *   $http.get('/someUrl').success(successCallback);
+     *   $http.post('/someUrl', data).success(successCallback);
+     * </pre>
+     *
+     * Complete list of shortcut methods:
+     *
+     * - {@link ng.$http#methods_get $http.get}
+     * - {@link ng.$http#methods_head $http.head}
+     * - {@link ng.$http#methods_post $http.post}
+     * - {@link ng.$http#methods_put $http.put}
+     * - {@link ng.$http#methods_delete $http.delete}
+     * - {@link ng.$http#methods_jsonp $http.jsonp}
+     *
+     *
+     * # Setting HTTP Headers
+     *
+     * The $http service will automatically add certain HTTP headers to all requests. These defaults
+     * can be fully configured by accessing the `$httpProvider.defaults.headers` configuration
+     * object, which currently contains this default configuration:
+     *
+     * - `$httpProvider.defaults.headers.common` (headers that are common for all requests):
+     *   - `Accept: application/json, text/plain, * / *`
+     * - `$httpProvider.defaults.headers.post`: (header defaults for POST requests)
+     *   - `Content-Type: application/json`
+     * - `$httpProvider.defaults.headers.put` (header defaults for PUT requests)
+     *   - `Content-Type: application/json`
+     *
+     * To add or overwrite these defaults, simply add or remove a property from these configuration
+     * objects. To add headers for an HTTP method other than POST or PUT, simply add a new object
+     * with the lowercased HTTP method name as the key, e.g.
+     * `$httpProvider.defaults.headers.get = { 'My-Header' : 'value' }.
+     *
+     * The defaults can also be set at runtime via the `$http.defaults` object in the same
+     * fashion. In addition, you can supply a `headers` property in the config object passed when
+     * calling `$http(config)`, which overrides the defaults without changing them globally.
+     *
+     *
+     * # Transforming Requests and Responses
+     *
+     * Both requests and responses can be transformed using transform functions. By default, Angular
+     * applies these transformations:
+     *
+     * Request transformations:
+     *
+     * - If the `data` property of the request configuration object contains an object, serialize it
+     *   into JSON format.
+     *
+     * Response transformations:
+     *
+     *  - If XSRF prefix is detected, strip it (see Security Considerations section below).
+     *  - If JSON response is detected, deserialize it using a JSON parser.
+     *
+     * To globally augment or override the default transforms, modify the
+     * `$httpProvider.defaults.transformRequest` and `$httpProvider.defaults.transformResponse`
+     * properties. These properties are by default an array of transform functions, which allows you
+     * to `push` or `unshift` a new transformation function into the transformation chain. You can
+     * also decide to completely override any default transformations by assigning your
+     * transformation functions to these properties directly without the array wrapper.
+     *
+     * Similarly, to locally override the request/response transforms, augment the
+     * `transformRequest` and/or `transformResponse` properties of the configuration object passed
+     * into `$http`.
+     *
+     *
+     * # Caching
+     *
+     * To enable caching, set the request configuration `cache` property to `true` (to use default
+     * cache) or to a custom cache object (built with {@link ng.$cacheFactory `$cacheFactory`}).
+     * When the cache is enabled, `$http` stores the response from the server in the specified
+     * cache. The next time the same request is made, the response is served from the cache without
+     * sending a request to the server.
+     *
+     * Note that even if the response is served from cache, delivery of the data is asynchronous in
+     * the same way that real requests are.
+     *
+     * If there are multiple GET requests for the same URL that should be cached using the same
+     * cache, but the cache is not populated yet, only one request to the server will be made and
+     * the remaining requests will be fulfilled using the response from the first request.
+     *
+     * You can change the default cache to a new object (built with
+     * {@link ng.$cacheFactory `$cacheFactory`}) by updating the
+     * {@link ng.$http#properties_defaults `$http.defaults.cache`} property. All requests who set
+     * their `cache` property to `true` will now use this cache object.
+     *
+     * If you set the default cache to `false` then only requests that specify their own custom
+     * cache object will be cached.
+     *
+     * # Interceptors
+     *
+     * Before you start creating interceptors, be sure to understand the
+     * {@link ng.$q $q and deferred/promise APIs}.
+     *
+     * For purposes of global error handling, authentication, or any kind of synchronous or
+     * asynchronous pre-processing of request or postprocessing of responses, it is desirable to be
+     * able to intercept requests before they are handed to the server and
+     * responses before they are handed over to the application code that
+     * initiated these requests. The interceptors leverage the {@link ng.$q
+     * promise APIs} to fulfill this need for both synchronous and asynchronous pre-processing.
+     *
+     * The interceptors are service factories that are registered with the `$httpProvider` by
+     * adding them to the `$httpProvider.interceptors` array. The factory is called and
+     * injected with dependencies (if specified) and returns the interceptor.
+     *
+     * There are two kinds of interceptors (and two kinds of rejection interceptors):
+     *
+     *   * `request`: interceptors get called with http `config` object. The function is free to
+     *     modify the `config` or create a new one. The function needs to return the `config`
+     *     directly or as a promise.
+     *   * `requestError`: interceptor gets called when a previous interceptor threw an error or
+     *     resolved with a rejection.
+     *   * `response`: interceptors get called with http `response` object. The function is free to
+     *     modify the `response` or create a new one. The function needs to return the `response`
+     *     directly or as a promise.
+     *   * `responseError`: interceptor gets called when a previous interceptor threw an error or
+     *     resolved with a rejection.
+     *
+     *
+     * <pre>
+     *   // register the interceptor as a service
+     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
+     *     return {
+     *       // optional method
+     *       'request': function(config) {
+     *         // do something on success
+     *         return config || $q.when(config);
+     *       },
+     *
+     *       // optional method
+     *      'requestError': function(rejection) {
+     *         // do something on error
+     *         if (canRecover(rejection)) {
+     *           return responseOrNewPromise
+     *         }
+     *         return $q.reject(rejection);
+     *       },
+     *
+     *
+     *
+     *       // optional method
+     *       'response': function(response) {
+     *         // do something on success
+     *         return response || $q.when(response);
+     *       },
+     *
+     *       // optional method
+     *      'responseError': function(rejection) {
+     *         // do something on error
+     *         if (canRecover(rejection)) {
+     *           return responseOrNewPromise
+     *         }
+     *         return $q.reject(rejection);
+     *       };
+     *     }
+     *   });
+     *
+     *   $httpProvider.interceptors.push('myHttpInterceptor');
+     *
+     *
+     *   // register the interceptor via an anonymous factory
+     *   $httpProvider.interceptors.push(function($q, dependency1, dependency2) {
+     *     return {
+     *      'request': function(config) {
+     *          // same as above
+     *       },
+     *       'response': function(response) {
+     *          // same as above
+     *       }
+     *     };
+     *   });
+     * </pre>
+     *
+     * # Response interceptors (DEPRECATED)
+     *
+     * Before you start creating interceptors, be sure to understand the
+     * {@link ng.$q $q and deferred/promise APIs}.
+     *
+     * For purposes of global error handling, authentication or any kind of synchronous or
+     * asynchronous preprocessing of received responses, it is desirable to be able to intercept
+     * responses for http requests before they are handed over to the application code that
+     * initiated these requests. The response interceptors leverage the {@link ng.$q
+     * promise apis} to fulfil this need for both synchronous and asynchronous preprocessing.
+     *
+     * The interceptors are service factories that are registered with the $httpProvider by
+     * adding them to the `$httpProvider.responseInterceptors` array. The factory is called and
+     * injected with dependencies (if specified) and returns the interceptor  — a function that
+     * takes a {@link ng.$q promise} and returns the original or a new promise.
+     *
+     * <pre>
+     *   // register the interceptor as a service
+     *   $provide.factory('myHttpInterceptor', function($q, dependency1, dependency2) {
+     *     return function(promise) {
+     *       return promise.then(function(response) {
+     *         // do something on success
+     *         return response;
+     *       }, function(response) {
+     *         // do something on error
+     *         if (canRecover(response)) {
+     *           return responseOrNewPromise
+     *         }
+     *         return $q.reject(response);
+     *       });
+     *     }
+     *   });
+     *
+     *   $httpProvider.responseInterceptors.push('myHttpInterceptor');
+     *
+     *
+     *   // register the interceptor via an anonymous factory
+     *   $httpProvider.responseInterceptors.push(function($q, dependency1, dependency2) {
+     *     return function(promise) {
+     *       // same as above
+     *     }
+     *   });
+     * </pre>
+     *
+     *
+     * # Security Considerations
+     *
+     * When designing web applications, consider security threats from:
+     *
+     * - {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
+     *   JSON vulnerability}
+     * - {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF}
+     *
+     * Both server and the client must cooperate in order to eliminate these threats. Angular comes
+     * pre-configured with strategies that address these issues, but for this to work backend server
+     * cooperation is required.
+     *
+     * ## JSON Vulnerability Protection
+     *
+     * A {@link http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx
+     * JSON vulnerability} allows third party website to turn your JSON resource URL into
+     * {@link http://en.wikipedia.org/wiki/JSONP JSONP} request under some conditions. To
+     * counter this your server can prefix all JSON requests with following string `")]}',\n"`.
+     * Angular will automatically strip the prefix before processing it as JSON.
+     *
+     * For example if your server needs to return:
+     * <pre>
+     * ['one','two']
+     * </pre>
+     *
+     * which is vulnerable to attack, your server can return:
+     * <pre>
+     * )]}',
+     * ['one','two']
+     * </pre>
+     *
+     * Angular will strip the prefix, before processing the JSON.
+     *
+     *
+     * ## Cross Site Request Forgery (XSRF) Protection
+     *
+     * {@link http://en.wikipedia.org/wiki/Cross-site_request_forgery XSRF} is a technique by which
+     * an unauthorized site can gain your user's private data. Angular provides a mechanism
+     * to counter XSRF. When performing XHR requests, the $http service reads a token from a cookie
+     * (by default, `XSRF-TOKEN`) and sets it as an HTTP header (`X-XSRF-TOKEN`). Since only
+     * JavaScript that runs on your domain could read the cookie, your server can be assured that
+     * the XHR came from JavaScript running on your domain. The header will not be set for
+     * cross-domain requests.
+     *
+     * To take advantage of this, your server needs to set a token in a JavaScript readable session
+     * cookie called `XSRF-TOKEN` on the first HTTP GET request. On subsequent XHR requests the
+     * server can verify that the cookie matches `X-XSRF-TOKEN` HTTP header, and therefore be sure
+     * that only JavaScript running on your domain could have sent the request. The token must be
+     * unique for each user and must be verifiable by the server (to prevent the JavaScript from
+     * making up its own tokens). We recommend that the token is a digest of your site's
+     * authentication cookie with a {@link https://en.wikipedia.org/wiki/Salt_(cryptography) salt}
+     * for added security.
+     *
+     * The name of the headers can be specified using the xsrfHeaderName and xsrfCookieName
+     * properties of either $httpProvider.defaults, or the per-request config object.
+     *
+     *
+     * @param {object} config Object describing the request to be made and how it should be
+     *    processed. The object has following properties:
+     *
+     *    - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)
+     *    - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.
+     *    - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be turned
+     *      to `?key1=value1&key2=value2` after the url. If the value is not a string, it will be
+     *      JSONified.
+     *    - **data** – `{string|Object}` – Data to be sent as the request message data.
+     *    - **headers** – `{Object}` – Map of strings or functions which return strings representing
+     *      HTTP headers to send to the server. If the return value of a function is null, the
+     *      header will not be sent.
+     *    - **xsrfHeaderName** – `{string}` – Name of HTTP header to populate with the XSRF token.
+     *    - **xsrfCookieName** – `{string}` – Name of cookie containing the XSRF token.
+     *    - **transformRequest** –
+     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+     *      transform function or an array of such functions. The transform function takes the http
+     *      request body and headers and returns its transformed (typically serialized) version.
+     *    - **transformResponse** –
+     *      `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
+     *      transform function or an array of such functions. The transform function takes the http
+     *      response body and headers and returns its transformed (typically deserialized) version.
+     *    - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
+     *      GET request, otherwise if a cache instance built with
+     *      {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
+     *      caching.
+     *    - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}
+     *      that should abort the request when resolved.
+     *    - **withCredentials** - `{boolean}` - whether to to set the `withCredentials` flag on the
+     *      XHR object. See {@link https://developer.mozilla.org/en/http_access_control#section_5
+     *      requests with credentials} for more information.
+     *    - **responseType** - `{string}` - see {@link
+     *      https://developer.mozilla.org/en-US/docs/DOM/XMLHttpRequest#responseType requestType}.
+     *
+     * @returns {HttpPromise} Returns a {@link ng.$q promise} object with the
+     *   standard `then` method and two http specific methods: `success` and `error`. The `then`
+     *   method takes two arguments a success and an error callback which will be called with a
+     *   response object. The `success` and `error` methods take a single argument - a function that
+     *   will be called when the request succeeds or fails respectively. The arguments passed into
+     *   these functions are destructured representation of the response object passed into the
+     *   `then` method. The response object has these properties:
+     *
+     *   - **data** – `{string|Object}` – The response body transformed with the transform
+     *     functions.
+     *   - **status** – `{number}` – HTTP status code of the response.
+     *   - **headers** – `{function([headerName])}` – Header getter function.
+     *   - **config** – `{Object}` – The configuration object that was used to generate the request.
+     *
+     * @property {Array.<Object>} pendingRequests Array of config objects for currently pending
+     *   requests. This is primarily meant to be used for debugging purposes.
+     *
+     *
+     * @example
+<example>
+<file name="index.html">
+  <div ng-controller="FetchCtrl">
+    <select ng-model="method">
+      <option>GET</option>
+      <option>JSONP</option>
+    </select>
+    <input type="text" ng-model="url" size="80"/>
+    <button ng-click="fetch()">fetch</button><br>
+    <button ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button>
+    <button
+      ng-click="updateModel('JSONP',
+                    'http://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')">
+      Sample JSONP
+    </button>
+    <button
+      ng-click="updateModel('JSONP', 'http://angularjs.org/doesntexist&callback=JSON_CALLBACK')">
+        Invalid JSONP
+      </button>
+    <pre>http status code: {{status}}</pre>
+    <pre>http response data: {{data}}</pre>
+  </div>
+</file>
+<file name="script.js">
+  function FetchCtrl($scope, $http, $templateCache) {
+    $scope.method = 'GET';
+    $scope.url = 'http-hello.html';
+
+    $scope.fetch = function() {
+      $scope.code = null;
+      $scope.response = null;
+
+      $http({method: $scope.method, url: $scope.url, cache: $templateCache}).
+        success(function(data, status) {
+          $scope.status = status;
+          $scope.data = data;
+        }).
+        error(function(data, status) {
+          $scope.data = data || "Request failed";
+          $scope.status = status;
+      });
+    };
+
+    $scope.updateModel = function(method, url) {
+      $scope.method = method;
+      $scope.url = url;
+    };
+  }
+</file>
+<file name="http-hello.html">
+  Hello, $http!
+</file>
+<file name="scenario.js">
+  it('should make an xhr GET request', function() {
+    element(':button:contains("Sample GET")').click();
+    element(':button:contains("fetch")').click();
+    expect(binding('status')).toBe('200');
+    expect(binding('data')).toMatch(/Hello, \$http!/);
+  });
+
+  it('should make a JSONP request to angularjs.org', function() {
+    element(':button:contains("Sample JSONP")').click();
+    element(':button:contains("fetch")').click();
+    expect(binding('status')).toBe('200');
+    expect(binding('data')).toMatch(/Super Hero!/);
+  });
+
+  it('should make JSONP request to invalid URL and invoke the error handler',
+      function() {
+    element(':button:contains("Invalid JSONP")').click();
+    element(':button:contains("fetch")').click();
+    expect(binding('status')).toBe('0');
+    expect(binding('data')).toBe('Request failed');
+  });
+</file>
+</example>
+     */
+    function $http(requestConfig) {
+      var config = {
+        transformRequest: defaults.transformRequest,
+        transformResponse: defaults.transformResponse
+      };
+      var headers = mergeHeaders(requestConfig);
+
+      extend(config, requestConfig);
+      config.headers = headers;
+      config.method = uppercase(config.method);
+
+      var xsrfValue = urlIsSameOrigin(config.url)
+          ? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
+          : undefined;
+      if (xsrfValue) {
+        headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
+      }
+
+
+      var serverRequest = function(config) {
+        headers = config.headers;
+        var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
+
+        // strip content-type if data is undefined
+        if (isUndefined(config.data)) {
+          forEach(headers, function(value, header) {
+            if (lowercase(header) === 'content-type') {
+                delete headers[header];
+            }
+          });
+        }
+
+        if (isUndefined(config.withCredentials) && !isUndefined(defaults.withCredentials)) {
+          config.withCredentials = defaults.withCredentials;
+        }
+
+        // send request
+        return sendReq(config, reqData, headers).then(transformResponse, transformResponse);
+      };
+
+      var chain = [serverRequest, undefined];
+      var promise = $q.when(config);
+
+      // apply interceptors
+      forEach(reversedInterceptors, function(interceptor) {
+        if (interceptor.request || interceptor.requestError) {
+          chain.unshift(interceptor.request, interceptor.requestError);
+        }
+        if (interceptor.response || interceptor.responseError) {
+          chain.push(interceptor.response, interceptor.responseError);
+        }
+      });
+
+      while(chain.length) {
+        var thenFn = chain.shift();
+        var rejectFn = chain.shift();
+
+        promise = promise.then(thenFn, rejectFn);
+      }
+
+      promise.success = function(fn) {
+        promise.then(function(response) {
+          fn(response.data, response.status, response.headers, config);
+        });
+        return promise;
+      };
+
+      promise.error = function(fn) {
+        promise.then(null, function(response) {
+          fn(response.data, response.status, response.headers, config);
+        });
+        return promise;
+      };
+
+      return promise;
+
+      function transformResponse(response) {
+        // make a copy since the response must be cacheable
+        var resp = extend({}, response, {
+          data: transformData(response.data, response.headers, config.transformResponse)
+        });
+        return (isSuccess(response.status))
+          ? resp
+          : $q.reject(resp);
+      }
+
+      function mergeHeaders(config) {
+        var defHeaders = defaults.headers,
+            reqHeaders = extend({}, config.headers),
+            defHeaderName, lowercaseDefHeaderName, reqHeaderName;
+
+        defHeaders = extend({}, defHeaders.common, defHeaders[lowercase(config.method)]);
+
+        // execute if header value is function
+        execHeaders(defHeaders);
+        execHeaders(reqHeaders);
+
+        // using for-in instead of forEach to avoid unecessary iteration after header has been found
+        defaultHeadersIteration:
+        for (defHeaderName in defHeaders) {
+          lowercaseDefHeaderName = lowercase(defHeaderName);
+
+          for (reqHeaderName in reqHeaders) {
+            if (lowercase(reqHeaderName) === lowercaseDefHeaderName) {
+              continue defaultHeadersIteration;
+            }
+          }
+
+          reqHeaders[defHeaderName] = defHeaders[defHeaderName];
+        }
+
+        return reqHeaders;
+
+        function execHeaders(headers) {
+          var headerContent;
+
+          forEach(headers, function(headerFn, header) {
+            if (isFunction(headerFn)) {
+              headerContent = headerFn();
+              if (headerContent != null) {
+                headers[header] = headerContent;
+              } else {
+                delete headers[header];
+              }
+            }
+          });
+        }
+      }
+    }
+
+    $http.pendingRequests = [];
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#get
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `GET` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#delete
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `DELETE` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#head
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `HEAD` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#jsonp
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `JSONP` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request.
+     *                     Should contain `JSON_CALLBACK` string.
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+    createShortMethods('get', 'delete', 'head', 'jsonp');
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#post
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `POST` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {*} data Request content
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$http#put
+     * @methodOf ng.$http
+     *
+     * @description
+     * Shortcut method to perform `PUT` request.
+     *
+     * @param {string} url Relative or absolute URL specifying the destination of the request
+     * @param {*} data Request content
+     * @param {Object=} config Optional configuration object
+     * @returns {HttpPromise} Future object
+     */
+    createShortMethodsWithData('post', 'put');
+
+        /**
+         * @ngdoc property
+         * @name ng.$http#defaults
+         * @propertyOf ng.$http
+         *
+         * @description
+         * Runtime equivalent of the `$httpProvider.defaults` property. Allows configuration of
+         * default headers, withCredentials as well as request and response transformations.
+         *
+         * See "Setting HTTP Headers" and "Transforming Requests and Responses" sections above.
+         */
+    $http.defaults = defaults;
+
+
+    return $http;
+
+
+    function createShortMethods(names) {
+      forEach(arguments, function(name) {
+        $http[name] = function(url, config) {
+          return $http(extend(config || {}, {
+            method: name,
+            url: url
+          }));
+        };
+      });
+    }
+
+
+    function createShortMethodsWithData(name) {
+      forEach(arguments, function(name) {
+        $http[name] = function(url, data, config) {
+          return $http(extend(config || {}, {
+            method: name,
+            url: url,
+            data: data
+          }));
+        };
+      });
+    }
+
+
+    /**
+     * Makes the request.
+     *
+     * !!! ACCESSES CLOSURE VARS:
+     * $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests
+     */
+    function sendReq(config, reqData, reqHeaders) {
+      var deferred = $q.defer(),
+          promise = deferred.promise,
+          cache,
+          cachedResp,
+          url = buildUrl(config.url, config.params);
+
+      $http.pendingRequests.push(config);
+      promise.then(removePendingReq, removePendingReq);
+
+
+      if ((config.cache || defaults.cache) && config.cache !== false && config.method == 'GET') {
+        cache = isObject(config.cache) ? config.cache
+              : isObject(defaults.cache) ? defaults.cache
+              : defaultCache;
+      }
+
+      if (cache) {
+        cachedResp = cache.get(url);
+        if (isDefined(cachedResp)) {
+          if (cachedResp.then) {
+            // cached request has already been sent, but there is no response yet
+            cachedResp.then(removePendingReq, removePendingReq);
+            return cachedResp;
+          } else {
+            // serving from cache
+            if (isArray(cachedResp)) {
+              resolvePromise(cachedResp[1], cachedResp[0], copy(cachedResp[2]));
+            } else {
+              resolvePromise(cachedResp, 200, {});
+            }
+          }
+        } else {
+          // put the promise for the non-transformed response into cache as a placeholder
+          cache.put(url, promise);
+        }
+      }
+
+      // if we won't have the response in cache, send the request to the backend
+      if (isUndefined(cachedResp)) {
+        $httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,
+            config.withCredentials, config.responseType);
+      }
+
+      return promise;
+
+
+      /**
+       * Callback registered to $httpBackend():
+       *  - caches the response if desired
+       *  - resolves the raw $http promise
+       *  - calls $apply
+       */
+      function done(status, response, headersString) {
+        if (cache) {
+          if (isSuccess(status)) {
+            cache.put(url, [status, response, parseHeaders(headersString)]);
+          } else {
+            // remove promise from the cache
+            cache.remove(url);
+          }
+        }
+
+        resolvePromise(response, status, headersString);
+        if (!$rootScope.$$phase) $rootScope.$apply();
+      }
+
+
+      /**
+       * Resolves the raw $http promise.
+       */
+      function resolvePromise(response, status, headers) {
+        // normalize internal statuses to 0
+        status = Math.max(status, 0);
+
+        (isSuccess(status) ? deferred.resolve : deferred.reject)({
+          data: response,
+          status: status,
+          headers: headersGetter(headers),
+          config: config
+        });
+      }
+
+
+      function removePendingReq() {
+        var idx = indexOf($http.pendingRequests, config);
+        if (idx !== -1) $http.pendingRequests.splice(idx, 1);
+      }
+    }
+
+
+    function buildUrl(url, params) {
+          if (!params) return url;
+          var parts = [];
+          forEachSorted(params, function(value, key) {
+            if (value === null || isUndefined(value)) return;
+            if (!isArray(value)) value = [value];
+
+            forEach(value, function(v) {
+              if (isObject(v)) {
+                v = toJson(v);
+              }
+              parts.push(encodeUriQuery(key) + '=' +
+                         encodeUriQuery(v));
+            });
+          });
+          return url + ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
+        }
+
+
+  }];
+}
+
+var XHR = window.XMLHttpRequest || function() {
+  /* global ActiveXObject */
+  try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); } catch (e1) {}
+  try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); } catch (e2) {}
+  try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e3) {}
+  throw minErr('$httpBackend')('noxhr', "This browser does not support XMLHttpRequest.");
+};
+
+
+/**
+ * @ngdoc object
+ * @name ng.$httpBackend
+ * @requires $browser
+ * @requires $window
+ * @requires $document
+ *
+ * @description
+ * HTTP backend used by the {@link ng.$http service} that delegates to
+ * XMLHttpRequest object or JSONP and deals with browser incompatibilities.
+ *
+ * You should never need to use this service directly, instead use the higher-level abstractions:
+ * {@link ng.$http $http} or {@link ngResource.$resource $resource}.
+ *
+ * During testing this implementation is swapped with {@link ngMock.$httpBackend mock
+ * $httpBackend} which can be trained with responses.
+ */
+function $HttpBackendProvider() {
+  this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {
+    return createHttpBackend($browser, XHR, $browser.defer, $window.angular.callbacks, $document[0]);
+  }];
+}
+
+function createHttpBackend($browser, XHR, $browserDefer, callbacks, rawDocument) {
+  var ABORTED = -1;
+
+  // TODO(vojta): fix the signature
+  return function(method, url, post, callback, headers, timeout, withCredentials, responseType) {
+    var status;
+    $browser.$$incOutstandingRequestCount();
+    url = url || $browser.url();
+
+    if (lowercase(method) == 'jsonp') {
+      var callbackId = '_' + (callbacks.counter++).toString(36);
+      callbacks[callbackId] = function(data) {
+        callbacks[callbackId].data = data;
+      };
+
+      var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),
+          function() {
+        if (callbacks[callbackId].data) {
+          completeRequest(callback, 200, callbacks[callbackId].data);
+        } else {
+          completeRequest(callback, status || -2);
+        }
+        delete callbacks[callbackId];
+      });
+    } else {
+      var xhr = new XHR();
+      xhr.open(method, url, true);
+      forEach(headers, function(value, key) {
+        if (isDefined(value)) {
+            xhr.setRequestHeader(key, value);
+        }
+      });
+
+      // In IE6 and 7, this might be called synchronously when xhr.send below is called and the
+      // response is in the cache. the promise api will ensure that to the app code the api is
+      // always async
+      xhr.onreadystatechange = function() {
+        if (xhr.readyState == 4) {
+          var responseHeaders = null,
+              response = null;
+
+          if(status !== ABORTED) {
+            responseHeaders = xhr.getAllResponseHeaders();
+            response = xhr.responseType ? xhr.response : xhr.responseText;
+          }
+
+          // responseText is the old-school way of retrieving response (supported by IE8 & 9)
+          // response/responseType properties were introduced in XHR Level2 spec (supported by IE10)
+          completeRequest(callback,
+              status || xhr.status,
+              response,
+              responseHeaders);
+        }
+      };
+
+      if (withCredentials) {
+        xhr.withCredentials = true;
+      }
+
+      if (responseType) {
+        xhr.responseType = responseType;
+      }
+
+      xhr.send(post || null);
+    }
+
+    if (timeout > 0) {
+      var timeoutId = $browserDefer(timeoutRequest, timeout);
+    } else if (timeout && timeout.then) {
+      timeout.then(timeoutRequest);
+    }
+
+
+    function timeoutRequest() {
+      status = ABORTED;
+      jsonpDone && jsonpDone();
+      xhr && xhr.abort();
+    }
+
+    function completeRequest(callback, status, response, headersString) {
+      var protocol = urlResolve(url).protocol;
+
+      // cancel timeout and subsequent timeout promise resolution
+      timeoutId && $browserDefer.cancel(timeoutId);
+      jsonpDone = xhr = null;
+
+      // fix status code for file protocol (it's always 0)
+      status = (protocol == 'file' && status === 0) ? (response ? 200 : 404) : status;
+
+      // normalize IE bug (http://bugs.jquery.com/ticket/1450)
+      status = status == 1223 ? 204 : status;
+
+      callback(status, response, headersString);
+      $browser.$$completeOutstandingRequest(noop);
+    }
+  };
+
+  function jsonpReq(url, done) {
+    // we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:
+    // - fetches local scripts via XHR and evals them
+    // - adds and immediately removes script elements from the document
+    var script = rawDocument.createElement('script'),
+        doneWrapper = function() {
+          script.onreadystatechange = script.onload = script.onerror = null;
+          rawDocument.body.removeChild(script);
+          if (done) done();
+        };
+
+    script.type = 'text/javascript';
+    script.src = url;
+
+    if (msie && msie <= 8) {
+      script.onreadystatechange = function() {
+        if (/loaded|complete/.test(script.readyState)) {
+          doneWrapper();
+        }
+      };
+    } else {
+      script.onload = script.onerror = function() {
+        doneWrapper();
+      };
+    }
+
+    rawDocument.body.appendChild(script);
+    return doneWrapper;
+  }
+}
+
+var $interpolateMinErr = minErr('$interpolate');
+
+/**
+ * @ngdoc object
+ * @name ng.$interpolateProvider
+ * @function
+ *
+ * @description
+ *
+ * Used for configuring the interpolation markup. Defaults to `{{` and `}}`.
+ *
+ * @example
+<doc:example module="customInterpolationApp">
+<doc:source>
+<script>
+  var customInterpolationApp = angular.module('customInterpolationApp', []);
+
+  customInterpolationApp.config(function($interpolateProvider) {
+    $interpolateProvider.startSymbol('//');
+    $interpolateProvider.endSymbol('//');
+  });
+
+
+  customInterpolationApp.controller('DemoController', function DemoController() {
+      this.label = "This binding is brought you by // interpolation symbols.";
+  });
+</script>
+<div ng-app="App" ng-controller="DemoController as demo">
+    //demo.label//
+</div>
+</doc:source>
+<doc:scenario>
+ it('should interpolate binding with custom symbols', function() {
+  expect(binding('demo.label')).toBe('This binding is brought you by // interpolation symbols.');
+ });
+</doc:scenario>
+</doc:example>
+ */
+function $InterpolateProvider() {
+  var startSymbol = '{{';
+  var endSymbol = '}}';
+
+  /**
+   * @ngdoc method
+   * @name ng.$interpolateProvider#startSymbol
+   * @methodOf ng.$interpolateProvider
+   * @description
+   * Symbol to denote start of expression in the interpolated string. Defaults to `{{`.
+   *
+   * @param {string=} value new value to set the starting symbol to.
+   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.
+   */
+  this.startSymbol = function(value){
+    if (value) {
+      startSymbol = value;
+      return this;
+    } else {
+      return startSymbol;
+    }
+  };
+
+  /**
+   * @ngdoc method
+   * @name ng.$interpolateProvider#endSymbol
+   * @methodOf ng.$interpolateProvider
+   * @description
+   * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
+   *
+   * @param {string=} value new value to set the ending symbol to.
+   * @returns {string|self} Returns the symbol when used as getter and self if used as setter.
+   */
+  this.endSymbol = function(value){
+    if (value) {
+      endSymbol = value;
+      return this;
+    } else {
+      return endSymbol;
+    }
+  };
+
+
+  this.$get = ['$parse', '$exceptionHandler', '$sce', function($parse, $exceptionHandler, $sce) {
+    var startSymbolLength = startSymbol.length,
+        endSymbolLength = endSymbol.length;
+
+    /**
+     * @ngdoc function
+     * @name ng.$interpolate
+     * @function
+     *
+     * @requires $parse
+     * @requires $sce
+     *
+     * @description
+     *
+     * Compiles a string with markup into an interpolation function. This service is used by the
+     * HTML {@link ng.$compile $compile} service for data binding. See
+     * {@link ng.$interpolateProvider $interpolateProvider} for configuring the
+     * interpolation markup.
+     *
+     *
+       <pre>
+         var $interpolate = ...; // injected
+         var exp = $interpolate('Hello {{name | uppercase}}!');
+         expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');
+       </pre>
+     *
+     *
+     * @param {string} text The text with markup to interpolate.
+     * @param {boolean=} mustHaveExpression if set to true then the interpolation string must have
+     *    embedded expression in order to return an interpolation function. Strings with no
+     *    embedded expression will return null for the interpolation function.
+     * @param {string=} trustedContext when provided, the returned function passes the interpolated
+     *    result through {@link ng.$sce#methods_getTrusted $sce.getTrusted(interpolatedResult,
+     *    trustedContext)} before returning it.  Refer to the {@link ng.$sce $sce} service that
+     *    provides Strict Contextual Escaping for details.
+     * @returns {function(context)} an interpolation function which is used to compute the
+     *    interpolated string. The function has these parameters:
+     *
+     *    * `context`: an object against which any expressions embedded in the strings are evaluated
+     *      against.
+     *
+     */
+    function $interpolate(text, mustHaveExpression, trustedContext) {
+      var startIndex,
+          endIndex,
+          index = 0,
+          parts = [],
+          length = text.length,
+          hasInterpolation = false,
+          fn,
+          exp,
+          concat = [];
+
+      while(index < length) {
+        if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) &&
+             ((endIndex = text.indexOf(endSymbol, startIndex + startSymbolLength)) != -1) ) {
+          (index != startIndex) && parts.push(text.substring(index, startIndex));
+          parts.push(fn = $parse(exp = text.substring(startIndex + startSymbolLength, endIndex)));
+          fn.exp = exp;
+          index = endIndex + endSymbolLength;
+          hasInterpolation = true;
+        } else {
+          // we did not find anything, so we have to add the remainder to the parts array
+          (index != length) && parts.push(text.substring(index));
+          index = length;
+        }
+      }
+
+      if (!(length = parts.length)) {
+        // we added, nothing, must have been an empty string.
+        parts.push('');
+        length = 1;
+      }
+
+      // Concatenating expressions makes it hard to reason about whether some combination of
+      // concatenated values are unsafe to use and could easily lead to XSS.  By requiring that a
+      // single expression be used for iframe[src], object[src], etc., we ensure that the value
+      // that's used is assigned or constructed by some JS code somewhere that is more testable or
+      // make it obvious that you bound the value to some user controlled value.  This helps reduce
+      // the load when auditing for XSS issues.
+      if (trustedContext && parts.length > 1) {
+          throw $interpolateMinErr('noconcat',
+              "Error while interpolating: {0}\nStrict Contextual Escaping disallows " +
+              "interpolations that concatenate multiple expressions when a trusted value is " +
+              "required.  See http://docs.angularjs.org/api/ng.$sce", text);
+      }
+
+      if (!mustHaveExpression  || hasInterpolation) {
+        concat.length = length;
+        fn = function(context) {
+          try {
+            for(var i = 0, ii = length, part; i<ii; i++) {
+              if (typeof (part = parts[i]) == 'function') {
+                part = part(context);
+                if (trustedContext) {
+                  part = $sce.getTrusted(trustedContext, part);
+                } else {
+                  part = $sce.valueOf(part);
+                }
+                if (part === null || isUndefined(part)) {
+                  part = '';
+                } else if (typeof part != 'string') {
+                  part = toJson(part);
+                }
+              }
+              concat[i] = part;
+            }
+            return concat.join('');
+          }
+          catch(err) {
+            var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
+                err.toString());
+            $exceptionHandler(newErr);
+          }
+        };
+        fn.exp = text;
+        fn.parts = parts;
+        return fn;
+      }
+    }
+
+
+    /**
+     * @ngdoc method
+     * @name ng.$interpolate#startSymbol
+     * @methodOf ng.$interpolate
+     * @description
+     * Symbol to denote the start of expression in the interpolated string. Defaults to `{{`.
+     *
+     * Use {@link ng.$interpolateProvider#startSymbol $interpolateProvider#startSymbol} to change
+     * the symbol.
+     *
+     * @returns {string} start symbol.
+     */
+    $interpolate.startSymbol = function() {
+      return startSymbol;
+    };
+
+
+    /**
+     * @ngdoc method
+     * @name ng.$interpolate#endSymbol
+     * @methodOf ng.$interpolate
+     * @description
+     * Symbol to denote the end of expression in the interpolated string. Defaults to `}}`.
+     *
+     * Use {@link ng.$interpolateProvider#endSymbol $interpolateProvider#endSymbol} to change
+     * the symbol.
+     *
+     * @returns {string} start symbol.
+     */
+    $interpolate.endSymbol = function() {
+      return endSymbol;
+    };
+
+    return $interpolate;
+  }];
+}
+
+function $IntervalProvider() {
+  this.$get = ['$rootScope', '$window', '$q',
+       function($rootScope,   $window,   $q) {
+    var intervals = {};
+
+
+     /**
+      * @ngdoc function
+      * @name ng.$interval
+      *
+      * @description
+      * Angular's wrapper for `window.setInterval`. The `fn` function is executed every `delay`
+      * milliseconds.
+      *
+      * The return value of registering an interval function is a promise. This promise will be
+      * notified upon each tick of the interval, and will be resolved after `count` iterations, or
+      * run indefinitely if `count` is not defined. The value of the notification will be the
+      * number of iterations that have run.
+      * To cancel an interval, call `$interval.cancel(promise)`.
+      *
+      * In tests you can use {@link ngMock.$interval#methods_flush `$interval.flush(millis)`} to
+      * move forward by `millis` milliseconds and trigger any functions scheduled to run in that
+      * time.
+      *
+      * @param {function()} fn A function that should be called repeatedly.
+      * @param {number} delay Number of milliseconds between each function call.
+      * @param {number=} [count=0] Number of times to repeat. If not set, or 0, will repeat
+      *   indefinitely.
+      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
+      *   will invoke `fn` within the {@link ng.$rootScope.Scope#methods_$apply $apply} block.
+      * @returns {promise} A promise which will be notified on each iteration.
+      */
+    function interval(fn, delay, count, invokeApply) {
+      var setInterval = $window.setInterval,
+          clearInterval = $window.clearInterval,
+          deferred = $q.defer(),
+          promise = deferred.promise,
+          iteration = 0,
+          skipApply = (isDefined(invokeApply) && !invokeApply);
+      
+      count = isDefined(count) ? count : 0,
+
+      promise.then(null, null, fn);
+
+      promise.$$intervalId = setInterval(function tick() {
+        deferred.notify(iteration++);
+
+        if (count > 0 && iteration >= count) {
+          deferred.resolve(iteration);
+          clearInterval(promise.$$intervalId);
+          delete intervals[promise.$$intervalId];
+        }
+
+        if (!skipApply) $rootScope.$apply();
+
+      }, delay);
+
+      intervals[promise.$$intervalId] = deferred;
+
+      return promise;
+    }
+
+
+     /**
+      * @ngdoc function
+      * @name ng.$interval#cancel
+      * @methodOf ng.$interval
+      *
+      * @description
+      * Cancels a task associated with the `promise`.
+      *
+      * @param {number} promise Promise returned by the `$interval` function.
+      * @returns {boolean} Returns `true` if the task was successfully canceled.
+      */
+    interval.cancel = function(promise) {
+      if (promise && promise.$$intervalId in intervals) {
+        intervals[promise.$$intervalId].reject('canceled');
+        clearInterval(promise.$$intervalId);
+        delete intervals[promise.$$intervalId];
+        return true;
+      }
+      return false;
+    };
+
+    return interval;
+  }];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$locale
+ *
+ * @description
+ * $locale service provides localization rules for various Angular components. As of right now the
+ * only public api is:
+ *
+ * * `id` – `{string}` – locale id formatted as `languageId-countryId` (e.g. `en-us`)
+ */
+function $LocaleProvider(){
+  this.$get = function() {
+    return {
+      id: 'en-us',
+
+      NUMBER_FORMATS: {
+        DECIMAL_SEP: '.',
+        GROUP_SEP: ',',
+        PATTERNS: [
+          { // Decimal Pattern
+            minInt: 1,
+            minFrac: 0,
+            maxFrac: 3,
+            posPre: '',
+            posSuf: '',
+            negPre: '-',
+            negSuf: '',
+            gSize: 3,
+            lgSize: 3
+          },{ //Currency Pattern
+            minInt: 1,
+            minFrac: 2,
+            maxFrac: 2,
+            posPre: '\u00A4',
+            posSuf: '',
+            negPre: '(\u00A4',
+            negSuf: ')',
+            gSize: 3,
+            lgSize: 3
+          }
+        ],
+        CURRENCY_SYM: '$'
+      },
+
+      DATETIME_FORMATS: {
+        MONTH:
+            'January,February,March,April,May,June,July,August,September,October,November,December'
+            .split(','),
+        SHORTMONTH:  'Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec'.split(','),
+        DAY: 'Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday'.split(','),
+        SHORTDAY: 'Sun,Mon,Tue,Wed,Thu,Fri,Sat'.split(','),
+        AMPMS: ['AM','PM'],
+        medium: 'MMM d, y h:mm:ss a',
+        short: 'M/d/yy h:mm a',
+        fullDate: 'EEEE, MMMM d, y',
+        longDate: 'MMMM d, y',
+        mediumDate: 'MMM d, y',
+        shortDate: 'M/d/yy',
+        mediumTime: 'h:mm:ss a',
+        shortTime: 'h:mm a'
+      },
+
+      pluralCat: function(num) {
+        if (num === 1) {
+          return 'one';
+        }
+        return 'other';
+      }
+    };
+  };
+}
+
+var PATH_MATCH = /^([^\?#]*)(\?([^#]*))?(#(.*))?$/,
+    DEFAULT_PORTS = {'http': 80, 'https': 443, 'ftp': 21};
+var $locationMinErr = minErr('$location');
+
+
+/**
+ * Encode path using encodeUriSegment, ignoring forward slashes
+ *
+ * @param {string} path Path to encode
+ * @returns {string}
+ */
+function encodePath(path) {
+  var segments = path.split('/'),
+      i = segments.length;
+
+  while (i--) {
+    segments[i] = encodeUriSegment(segments[i]);
+  }
+
+  return segments.join('/');
+}
+
+function parseAbsoluteUrl(absoluteUrl, locationObj, appBase) {
+  var parsedUrl = urlResolve(absoluteUrl, appBase);
+
+  locationObj.$$protocol = parsedUrl.protocol;
+  locationObj.$$host = parsedUrl.hostname;
+  locationObj.$$port = int(parsedUrl.port) || DEFAULT_PORTS[parsedUrl.protocol] || null;
+}
+
+
+function parseAppUrl(relativeUrl, locationObj, appBase) {
+  var prefixed = (relativeUrl.charAt(0) !== '/');
+  if (prefixed) {
+    relativeUrl = '/' + relativeUrl;
+  }
+  var match = urlResolve(relativeUrl, appBase);
+  locationObj.$$path = decodeURIComponent(prefixed && match.pathname.charAt(0) === '/' ?
+      match.pathname.substring(1) : match.pathname);
+  locationObj.$$search = parseKeyValue(match.search);
+  locationObj.$$hash = decodeURIComponent(match.hash);
+
+  // make sure path starts with '/';
+  if (locationObj.$$path && locationObj.$$path.charAt(0) != '/') {
+    locationObj.$$path = '/' + locationObj.$$path;
+  }
+}
+
+
+/**
+ *
+ * @param {string} begin
+ * @param {string} whole
+ * @returns {string} returns text from whole after begin or undefined if it does not begin with
+ *                   expected string.
+ */
+function beginsWith(begin, whole) {
+  if (whole.indexOf(begin) === 0) {
+    return whole.substr(begin.length);
+  }
+}
+
+
+function stripHash(url) {
+  var index = url.indexOf('#');
+  return index == -1 ? url : url.substr(0, index);
+}
+
+
+function stripFile(url) {
+  return url.substr(0, stripHash(url).lastIndexOf('/') + 1);
+}
+
+/* return the server only (scheme://host:port) */
+function serverBase(url) {
+  return url.substring(0, url.indexOf('/', url.indexOf('//') + 2));
+}
+
+
+/**
+ * LocationHtml5Url represents an url
+ * This object is exposed as $location service when HTML5 mode is enabled and supported
+ *
+ * @constructor
+ * @param {string} appBase application base URL
+ * @param {string} basePrefix url path prefix
+ */
+function LocationHtml5Url(appBase, basePrefix) {
+  this.$$html5 = true;
+  basePrefix = basePrefix || '';
+  var appBaseNoFile = stripFile(appBase);
+  parseAbsoluteUrl(appBase, this, appBase);
+
+
+  /**
+   * Parse given html5 (regular) url string into properties
+   * @param {string} newAbsoluteUrl HTML5 url
+   * @private
+   */
+  this.$$parse = function(url) {
+    var pathUrl = beginsWith(appBaseNoFile, url);
+    if (!isString(pathUrl)) {
+      throw $locationMinErr('ipthprfx', 'Invalid url "{0}", missing path prefix "{1}".', url,
+          appBaseNoFile);
+    }
+
+    parseAppUrl(pathUrl, this, appBase);
+
+    if (!this.$$path) {
+      this.$$path = '/';
+    }
+
+    this.$$compose();
+  };
+
+  /**
+   * Compose url and update `absUrl` property
+   * @private
+   */
+  this.$$compose = function() {
+    var search = toKeyValue(this.$$search),
+        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
+
+    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
+    this.$$absUrl = appBaseNoFile + this.$$url.substr(1); // first char is always '/'
+  };
+
+  this.$$rewrite = function(url) {
+    var appUrl, prevAppUrl;
+
+    if ( (appUrl = beginsWith(appBase, url)) !== undefined ) {
+      prevAppUrl = appUrl;
+      if ( (appUrl = beginsWith(basePrefix, appUrl)) !== undefined ) {
+        return appBaseNoFile + (beginsWith('/', appUrl) || appUrl);
+      } else {
+        return appBase + prevAppUrl;
+      }
+    } else if ( (appUrl = beginsWith(appBaseNoFile, url)) !== undefined ) {
+      return appBaseNoFile + appUrl;
+    } else if (appBaseNoFile == url + '/') {
+      return appBaseNoFile;
+    }
+  };
+}
+
+
+/**
+ * LocationHashbangUrl represents url
+ * This object is exposed as $location service when developer doesn't opt into html5 mode.
+ * It also serves as the base class for html5 mode fallback on legacy browsers.
+ *
+ * @constructor
+ * @param {string} appBase application base URL
+ * @param {string} hashPrefix hashbang prefix
+ */
+function LocationHashbangUrl(appBase, hashPrefix) {
+  var appBaseNoFile = stripFile(appBase);
+
+  parseAbsoluteUrl(appBase, this, appBase);
+
+
+  /**
+   * Parse given hashbang url into properties
+   * @param {string} url Hashbang url
+   * @private
+   */
+  this.$$parse = function(url) {
+    var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);
+    var withoutHashUrl = withoutBaseUrl.charAt(0) == '#'
+        ? beginsWith(hashPrefix, withoutBaseUrl)
+        : (this.$$html5)
+          ? withoutBaseUrl
+          : '';
+
+    if (!isString(withoutHashUrl)) {
+      throw $locationMinErr('ihshprfx', 'Invalid url "{0}", missing hash prefix "{1}".', url,
+          hashPrefix);
+    }
+    parseAppUrl(withoutHashUrl, this, appBase);
+
+    this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
+
+    this.$$compose();
+
+    /*
+     * In Windows, on an anchor node on documents loaded from
+     * the filesystem, the browser will return a pathname
+     * prefixed with the drive name ('/C:/path') when a
+     * pathname without a drive is set:
+     *  * a.setAttribute('href', '/foo')
+     *   * a.pathname === '/C:/foo' //true
+     *
+     * Inside of Angular, we're always using pathnames that
+     * do not include drive names for routing.
+     */
+    function removeWindowsDriveName (path, url, base) {
+      /*
+      Matches paths for file protocol on windows,
+      such as /C:/foo/bar, and captures only /foo/bar.
+      */
+      var windowsFilePathExp = /^\/?.*?:(\/.*)/;
+
+      var firstPathSegmentMatch;
+
+      //Get the relative path from the input URL.
+      if (url.indexOf(base) === 0) {
+        url = url.replace(base, '');
+      }
+
+      /*
+       * The input URL intentionally contains a
+       * first path segment that ends with a colon.
+       */
+      if (windowsFilePathExp.exec(url)) {
+        return path;
+      }
+
+      firstPathSegmentMatch = windowsFilePathExp.exec(path);
+      return firstPathSegmentMatch ? firstPathSegmentMatch[1] : path;
+    }
+  };
+
+  /**
+   * Compose hashbang url and update `absUrl` property
+   * @private
+   */
+  this.$$compose = function() {
+    var search = toKeyValue(this.$$search),
+        hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
+
+    this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
+    this.$$absUrl = appBase + (this.$$url ? hashPrefix + this.$$url : '');
+  };
+
+  this.$$rewrite = function(url) {
+    if(stripHash(appBase) == stripHash(url)) {
+      return url;
+    }
+  };
+}
+
+
+/**
+ * LocationHashbangUrl represents url
+ * This object is exposed as $location service when html5 history api is enabled but the browser
+ * does not support it.
+ *
+ * @constructor
+ * @param {string} appBase application base URL
+ * @param {string} hashPrefix hashbang prefix
+ */
+function LocationHashbangInHtml5Url(appBase, hashPrefix) {
+  this.$$html5 = true;
+  LocationHashbangUrl.apply(this, arguments);
+
+  var appBaseNoFile = stripFile(appBase);
+
+  this.$$rewrite = function(url) {
+    var appUrl;
+
+    if ( appBase == stripHash(url) ) {
+      return url;
+    } else if ( (appUrl = beginsWith(appBaseNoFile, url)) ) {
+      return appBase + hashPrefix + appUrl;
+    } else if ( appBaseNoFile === url + '/') {
+      return appBaseNoFile;
+    }
+  };
+}
+
+
+LocationHashbangInHtml5Url.prototype =
+  LocationHashbangUrl.prototype =
+  LocationHtml5Url.prototype = {
+
+  /**
+   * Are we in html5 mode?
+   * @private
+   */
+  $$html5: false,
+
+  /**
+   * Has any change been replacing ?
+   * @private
+   */
+  $$replace: false,
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#absUrl
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter only.
+   *
+   * Return full url representation with all segments encoded according to rules specified in
+   * {@link http://www.ietf.org/rfc/rfc3986.txt RFC 3986}.
+   *
+   * @return {string} full url
+   */
+  absUrl: locationGetter('$$absUrl'),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#url
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter / setter.
+   *
+   * Return url (e.g. `/path?a=b#hash`) when called without any parameter.
+   *
+   * Change path, search and hash, when called with parameter and return `$location`.
+   *
+   * @param {string=} url New url without base prefix (e.g. `/path?a=b#hash`)
+   * @param {string=} replace The path that will be changed
+   * @return {string} url
+   */
+  url: function(url, replace) {
+    if (isUndefined(url))
+      return this.$$url;
+
+    var match = PATH_MATCH.exec(url);
+    if (match[1]) this.path(decodeURIComponent(match[1]));
+    if (match[2] || match[1]) this.search(match[3] || '');
+    this.hash(match[5] || '', replace);
+
+    return this;
+  },
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#protocol
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter only.
+   *
+   * Return protocol of current url.
+   *
+   * @return {string} protocol of current url
+   */
+  protocol: locationGetter('$$protocol'),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#host
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter only.
+   *
+   * Return host of current url.
+   *
+   * @return {string} host of current url.
+   */
+  host: locationGetter('$$host'),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#port
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter only.
+   *
+   * Return port of current url.
+   *
+   * @return {Number} port
+   */
+  port: locationGetter('$$port'),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#path
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter / setter.
+   *
+   * Return path of current url when called without any parameter.
+   *
+   * Change path when called with parameter and return `$location`.
+   *
+   * Note: Path should always begin with forward slash (/), this method will add the forward slash
+   * if it is missing.
+   *
+   * @param {string=} path New path
+   * @return {string} path
+   */
+  path: locationGetterSetter('$$path', function(path) {
+    return path.charAt(0) == '/' ? path : '/' + path;
+  }),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#search
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter / setter.
+   *
+   * Return search part (as object) of current url when called without any parameter.
+   *
+   * Change search part when called with parameter and return `$location`.
+   *
+   * @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or
+   * hash object. Hash object may contain an array of values, which will be decoded as duplicates in
+   * the url.
+   *
+   * @param {(string|Array<string>)=} paramValue If `search` is a string, then `paramValue` will override only a
+   * single search parameter. If `paramValue` is an array, it will set the parameter as a
+   * comma-separated value. If `paramValue` is `null`, the parameter will be deleted.
+   *
+   * @return {string} search
+   */
+  search: function(search, paramValue) {
+    switch (arguments.length) {
+      case 0:
+        return this.$$search;
+      case 1:
+        if (isString(search)) {
+          this.$$search = parseKeyValue(search);
+        } else if (isObject(search)) {
+          this.$$search = search;
+        } else {
+          throw $locationMinErr('isrcharg',
+              'The first argument of the `$location#search()` call must be a string or an object.');
+        }
+        break;
+      default:
+        if (isUndefined(paramValue) || paramValue === null) {
+          delete this.$$search[search];
+        } else {
+          this.$$search[search] = paramValue;
+        }
+    }
+
+    this.$$compose();
+    return this;
+  },
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#hash
+   * @methodOf ng.$location
+   *
+   * @description
+   * This method is getter / setter.
+   *
+   * Return hash fragment when called without any parameter.
+   *
+   * Change hash fragment when called with parameter and return `$location`.
+   *
+   * @param {string=} hash New hash fragment
+   * @return {string} hash
+   */
+  hash: locationGetterSetter('$$hash', identity),
+
+  /**
+   * @ngdoc method
+   * @name ng.$location#replace
+   * @methodOf ng.$location
+   *
+   * @description
+   * If called, all changes to $location during current `$digest` will be replacing current history
+   * record, instead of adding new one.
+   */
+  replace: function() {
+    this.$$replace = true;
+    return this;
+  }
+};
+
+function locationGetter(property) {
+  return function() {
+    return this[property];
+  };
+}
+
+
+function locationGetterSetter(property, preprocess) {
+  return function(value) {
+    if (isUndefined(value))
+      return this[property];
+
+    this[property] = preprocess(value);
+    this.$$compose();
+
+    return this;
+  };
+}
+
+
+/**
+ * @ngdoc object
+ * @name ng.$location
+ *
+ * @requires $browser
+ * @requires $sniffer
+ * @requires $rootElement
+ *
+ * @description
+ * The $location service parses the URL in the browser address bar (based on the
+ * {@link https://developer.mozilla.org/en/window.location window.location}) and makes the URL
+ * available to your application. Changes to the URL in the address bar are reflected into
+ * $location service and changes to $location are reflected into the browser address bar.
+ *
+ * **The $location service:**
+ *
+ * - Exposes the current URL in the browser address bar, so you can
+ *   - Watch and observe the URL.
+ *   - Change the URL.
+ * - Synchronizes the URL with the browser when the user
+ *   - Changes the address bar.
+ *   - Clicks the back or forward button (or clicks a History link).
+ *   - Clicks on a link.
+ * - Represents the URL object as a set of methods (protocol, host, port, path, search, hash).
+ *
+ * For more information see {@link guide/dev_guide.services.$location Developer Guide: Angular
+ * Services: Using $location}
+ */
+
+/**
+ * @ngdoc object
+ * @name ng.$locationProvider
+ * @description
+ * Use the `$locationProvider` to configure how the application deep linking paths are stored.
+ */
+function $LocationProvider(){
+  var hashPrefix = '',
+      html5Mode = false;
+
+  /**
+   * @ngdoc property
+   * @name ng.$locationProvider#hashPrefix
+   * @methodOf ng.$locationProvider
+   * @description
+   * @param {string=} prefix Prefix for hash part (containing path and search)
+   * @returns {*} current value if used as getter or itself (chaining) if used as setter
+   */
+  this.hashPrefix = function(prefix) {
+    if (isDefined(prefix)) {
+      hashPrefix = prefix;
+      return this;
+    } else {
+      return hashPrefix;
+    }
+  };
+
+  /**
+   * @ngdoc property
+   * @name ng.$locationProvider#html5Mode
+   * @methodOf ng.$locationProvider
+   * @description
+   * @param {boolean=} mode Use HTML5 strategy if available.
+   * @returns {*} current value if used as getter or itself (chaining) if used as setter
+   */
+  this.html5Mode = function(mode) {
+    if (isDefined(mode)) {
+      html5Mode = mode;
+      return this;
+    } else {
+      return html5Mode;
+    }
+  };
+
+  /**
+   * @ngdoc event
+   * @name ng.$location#$locationChangeStart
+   * @eventOf ng.$location
+   * @eventType broadcast on root scope
+   * @description
+   * Broadcasted before a URL will change. This change can be prevented by calling
+   * `preventDefault` method of the event. See {@link ng.$rootScope.Scope#$on} for more
+   * details about event object. Upon successful change
+   * {@link ng.$location#$locationChangeSuccess $locationChangeSuccess} is fired.
+   *
+   * @param {Object} angularEvent Synthetic event object.
+   * @param {string} newUrl New URL
+   * @param {string=} oldUrl URL that was before it was changed.
+   */
+
+  /**
+   * @ngdoc event
+   * @name ng.$location#$locationChangeSuccess
+   * @eventOf ng.$location
+   * @eventType broadcast on root scope
+   * @description
+   * Broadcasted after a URL was changed.
+   *
+   * @param {Object} angularEvent Synthetic event object.
+   * @param {string} newUrl New URL
+   * @param {string=} oldUrl URL that was before it was changed.
+   */
+
+  this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',
+      function( $rootScope,   $browser,   $sniffer,   $rootElement) {
+    var $location,
+        LocationMode,
+        baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''
+        initialUrl = $browser.url(),
+        appBase;
+
+    if (html5Mode) {
+      appBase = serverBase(initialUrl) + (baseHref || '/');
+      LocationMode = $sniffer.history ? LocationHtml5Url : LocationHashbangInHtml5Url;
+    } else {
+      appBase = stripHash(initialUrl);
+      LocationMode = LocationHashbangUrl;
+    }
+    $location = new LocationMode(appBase, '#' + hashPrefix);
+    $location.$$parse($location.$$rewrite(initialUrl));
+
+    $rootElement.on('click', function(event) {
+      // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
+      // currently we open nice url link and redirect then
+
+      if (event.ctrlKey || event.metaKey || event.which == 2) return;
+
+      var elm = jqLite(event.target);
+
+      // traverse the DOM up to find first A tag
+      while (lowercase(elm[0].nodeName) !== 'a') {
+        // ignore rewriting if no A tag (reached root element, or no parent - removed from document)
+        if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
+      }
+
+      var absHref = elm.prop('href');
+      var rewrittenUrl = $location.$$rewrite(absHref);
+
+      if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {
+        event.preventDefault();
+        if (rewrittenUrl != $browser.url()) {
+          // update location manually
+          $location.$$parse(rewrittenUrl);
+          $rootScope.$apply();
+          // hack to work around FF6 bug 684208 when scenario runner clicks on links
+          window.angular['ff-684208-preventDefault'] = true;
+        }
+      }
+    });
+
+
+    // rewrite hashbang url <> html5 url
+    if ($location.absUrl() != initialUrl) {
+      $browser.url($location.absUrl(), true);
+    }
+
+    // update $location when $browser url changes
+    $browser.onUrlChange(function(newUrl) {
+      if ($location.absUrl() != newUrl) {
+        if ($rootScope.$broadcast('$locationChangeStart', newUrl,
+                                  $location.absUrl()).defaultPrevented) {
+          $browser.url($location.absUrl());
+          return;
+        }
+        $rootScope.$evalAsync(function() {
+          var oldUrl = $location.absUrl();
+
+          $location.$$parse(newUrl);
+          afterLocationChange(oldUrl);
+        });
+        if (!$rootScope.$$phase) $rootScope.$digest();
+      }
+    });
+
+    // update browser
+    var changeCounter = 0;
+    $rootScope.$watch(function $locationWatch() {
+      var oldUrl = $browser.url();
+      var currentReplace = $location.$$replace;
+
+      if (!changeCounter || oldUrl != $location.absUrl()) {
+        changeCounter++;
+        $rootScope.$evalAsync(function() {
+          if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).
+              defaultPrevented) {
+            $location.$$parse(oldUrl);
+          } else {
+            $browser.url($location.absUrl(), currentReplace);
+            afterLocationChange(oldUrl);
+          }
+        });
+      }
+      $location.$$replace = false;
+
+      return changeCounter;
+    });
+
+    return $location;
+
+    function afterLocationChange(oldUrl) {
+      $rootScope.$broadcast('$locationChangeSuccess', $location.absUrl(), oldUrl);
+    }
+}];
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$log
+ * @requires $window
+ *
+ * @description
+ * Simple service for logging. Default implementation safely writes the message
+ * into the browser's console (if present).
+ * 
+ * The main purpose of this service is to simplify debugging and troubleshooting.
+ *
+ * The default is to log `debug` messages. You can use
+ * {@link ng.$logProvider ng.$logProvider#debugEnabled} to change this.
+ *
+ * @example
+   <example>
+     <file name="script.js">
+       function LogCtrl($scope, $log) {
+         $scope.$log = $log;
+         $scope.message = 'Hello World!';
+       }
+     </file>
+     <file name="index.html">
+       <div ng-controller="LogCtrl">
+         <p>Reload this page with open console, enter text and hit the log button...</p>
+         Message:
+         <input type="text" ng-model="message"/>
+         <button ng-click="$log.log(message)">log</button>
+         <button ng-click="$log.warn(message)">warn</button>
+         <button ng-click="$log.info(message)">info</button>
+         <button ng-click="$log.error(message)">error</button>
+       </div>
+     </file>
+   </example>
+ */
+
+/**
+ * @ngdoc object
+ * @name ng.$logProvider
+ * @description
+ * Use the `$logProvider` to configure how the application logs messages
+ */
+function $LogProvider(){
+  var debug = true,
+      self = this;
+  
+  /**
+   * @ngdoc property
+   * @name ng.$logProvider#debugEnabled
+   * @methodOf ng.$logProvider
+   * @description
+   * @param {string=} flag enable or disable debug level messages
+   * @returns {*} current value if used as getter or itself (chaining) if used as setter
+   */
+  this.debugEnabled = function(flag) {
+    if (isDefined(flag)) {
+      debug = flag;
+    return this;
+    } else {
+      return debug;
+    }
+  };
+  
+  this.$get = ['$window', function($window){
+    return {
+      /**
+       * @ngdoc method
+       * @name ng.$log#log
+       * @methodOf ng.$log
+       *
+       * @description
+       * Write a log message
+       */
+      log: consoleLog('log'),
+
+      /**
+       * @ngdoc method
+       * @name ng.$log#info
+       * @methodOf ng.$log
+       *
+       * @description
+       * Write an information message
+       */
+      info: consoleLog('info'),
+
+      /**
+       * @ngdoc method
+       * @name ng.$log#warn
+       * @methodOf ng.$log
+       *
+       * @description
+       * Write a warning message
+       */
+      warn: consoleLog('warn'),
+
+      /**
+       * @ngdoc method
+       * @name ng.$log#error
+       * @methodOf ng.$log
+       *
+       * @description
+       * Write an error message
+       */
+      error: consoleLog('error'),
+      
+      /**
+       * @ngdoc method
+       * @name ng.$log#debug
+       * @methodOf ng.$log
+       * 
+       * @description
+       * Write a debug message
+       */
+      debug: (function () {
+        var fn = consoleLog('debug');
+
+        return function() {
+          if (debug) {
+            fn.apply(self, arguments);
+          }
+        };
+      }())
+    };
+
+    function formatError(arg) {
+      if (arg instanceof Error) {
+        if (arg.stack) {
+          arg = (arg.message && arg.stack.indexOf(arg.message) === -1)
+              ? 'Error: ' + arg.message + '\n' + arg.stack
+              : arg.stack;
+        } else if (arg.sourceURL) {
+          arg = arg.message + '\n' + arg.sourceURL + ':' + arg.line;
+        }
+      }
+      return arg;
+    }
+
+    function consoleLog(type) {
+      var console = $window.console || {},
+          logFn = console[type] || console.log || noop;
+
+      if (logFn.apply) {
+        return function() {
+          var args = [];
+          forEach(arguments, function(arg) {
+            args.push(formatError(arg));
+          });
+          return logFn.apply(console, args);
+        };
+      }
+
+      // we are IE which either doesn't have window.console => this is noop and we do nothing,
+      // or we are IE where console.log doesn't have apply so we log at least first 2 args
+      return function(arg1, arg2) {
+        logFn(arg1, arg2 == null ? '' : arg2);
+      };
+    }
+  }];
+}
+
+var $parseMinErr = minErr('$parse');
+var promiseWarningCache = {};
+var promiseWarning;
+
+// Sandboxing Angular Expressions
+// ------------------------------
+// Angular expressions are generally considered safe because these expressions only have direct
+// access to $scope and locals. However, one can obtain the ability to execute arbitrary JS code by
+// obtaining a reference to native JS functions such as the Function constructor.
+//
+// As an example, consider the following Angular expression:
+//
+//   {}.toString.constructor(alert("evil JS code"))
+//
+// We want to prevent this type of access. For the sake of performance, during the lexing phase we
+// disallow any "dotted" access to any member named "constructor".
+//
+// For reflective calls (a[b]) we check that the value of the lookup is not the Function constructor
+// while evaluating the expression, which is a stronger but more expensive test. Since reflective
+// calls are expensive anyway, this is not such a big deal compared to static dereferencing.
+//
+// This sandboxing technique is not perfect and doesn't aim to be. The goal is to prevent exploits
+// against the expression language, but not to prevent exploits that were enabled by exposing
+// sensitive JavaScript or browser apis on Scope. Exposing such objects on a Scope is never a good
+// practice and therefore we are not even trying to protect against interaction with an object
+// explicitly exposed in this way.
+//
+// A developer could foil the name check by aliasing the Function constructor under a different
+// name on the scope.
+//
+// In general, it is not possible to access a Window object from an angular expression unless a
+// window or some DOM object that has a reference to window is published onto a Scope.
+
+function ensureSafeMemberName(name, fullExpression) {
+  if (name === "constructor") {
+    throw $parseMinErr('isecfld',
+        'Referencing "constructor" field in Angular expressions is disallowed! Expression: {0}',
+        fullExpression);
+  }
+  return name;
+}
+
+function ensureSafeObject(obj, fullExpression) {
+  // nifty check if obj is Function that is fast and works across iframes and other contexts
+  if (obj) {
+    if (obj.constructor === obj) {
+      throw $parseMinErr('isecfn',
+          'Referencing Function in Angular expressions is disallowed! Expression: {0}',
+          fullExpression);
+    } else if (// isWindow(obj)
+        obj.document && obj.location && obj.alert && obj.setInterval) {
+      throw $parseMinErr('isecwindow',
+          'Referencing the Window in Angular expressions is disallowed! Expression: {0}',
+          fullExpression);
+    } else if (// isElement(obj)
+        obj.children && (obj.nodeName || (obj.on && obj.find))) {
+      throw $parseMinErr('isecdom',
+          'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
+          fullExpression);
+    }
+  }
+  return obj;
+}
+
+var OPERATORS = {
+    /* jshint bitwise : false */
+    'null':function(){return null;},
+    'true':function(){return true;},
+    'false':function(){return false;},
+    undefined:noop,
+    '+':function(self, locals, a,b){
+      a=a(self, locals); b=b(self, locals);
+      if (isDefined(a)) {
+        if (isDefined(b)) {
+          return a + b;
+        }
+        return a;
+      }
+      return isDefined(b)?b:undefined;},
+    '-':function(self, locals, a,b){
+          a=a(self, locals); b=b(self, locals);
+          return (isDefined(a)?a:0)-(isDefined(b)?b:0);
+        },
+    '*':function(self, locals, a,b){return a(self, locals)*b(self, locals);},
+    '/':function(self, locals, a,b){return a(self, locals)/b(self, locals);},
+    '%':function(self, locals, a,b){return a(self, locals)%b(self, locals);},
+    '^':function(self, locals, a,b){return a(self, locals)^b(self, locals);},
+    '=':noop,
+    '===':function(self, locals, a, b){return a(self, locals)===b(self, locals);},
+    '!==':function(self, locals, a, b){return a(self, locals)!==b(self, locals);},
+    '==':function(self, locals, a,b){return a(self, locals)==b(self, locals);},
+    '!=':function(self, locals, a,b){return a(self, locals)!=b(self, locals);},
+    '<':function(self, locals, a,b){return a(self, locals)<b(self, locals);},
+    '>':function(self, locals, a,b){return a(self, locals)>b(self, locals);},
+    '<=':function(self, locals, a,b){return a(self, locals)<=b(self, locals);},
+    '>=':function(self, locals, a,b){return a(self, locals)>=b(self, locals);},
+    '&&':function(self, locals, a,b){return a(self, locals)&&b(self, locals);},
+    '||':function(self, locals, a,b){return a(self, locals)||b(self, locals);},
+    '&':function(self, locals, a,b){return a(self, locals)&b(self, locals);},
+//    '|':function(self, locals, a,b){return a|b;},
+    '|':function(self, locals, a,b){return b(self, locals)(self, locals, a(self, locals));},
+    '!':function(self, locals, a){return !a(self, locals);}
+};
+/* jshint bitwise: true */
+var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'};
+
+
+/////////////////////////////////////////
+
+
+/**
+ * @constructor
+ */
+var Lexer = function (options) {
+  this.options = options;
+};
+
+Lexer.prototype = {
+  constructor: Lexer,
+
+  lex: function (text) {
+    this.text = text;
+
+    this.index = 0;
+    this.ch = undefined;
+    this.lastCh = ':'; // can start regexp
+
+    this.tokens = [];
+
+    var token;
+    var json = [];
+
+    while (this.index < this.text.length) {
+      this.ch = this.text.charAt(this.index);
+      if (this.is('"\'')) {
+        this.readString(this.ch);
+      } else if (this.isNumber(this.ch) || this.is('.') && this.isNumber(this.peek())) {
+        this.readNumber();
+      } else if (this.isIdent(this.ch)) {
+        this.readIdent();
+        // identifiers can only be if the preceding char was a { or ,
+        if (this.was('{,') && json[0] === '{' &&
+            (token = this.tokens[this.tokens.length - 1])) {
+          token.json = token.text.indexOf('.') === -1;
+        }
+      } else if (this.is('(){}[].,;:?')) {
+        this.tokens.push({
+          index: this.index,
+          text: this.ch,
+          json: (this.was(':[,') && this.is('{[')) || this.is('}]:,')
+        });
+        if (this.is('{[')) json.unshift(this.ch);
+        if (this.is('}]')) json.shift();
+        this.index++;
+      } else if (this.isWhitespace(this.ch)) {
+        this.index++;
+        continue;
+      } else {
+        var ch2 = this.ch + this.peek();
+        var ch3 = ch2 + this.peek(2);
+        var fn = OPERATORS[this.ch];
+        var fn2 = OPERATORS[ch2];
+        var fn3 = OPERATORS[ch3];
+        if (fn3) {
+          this.tokens.push({index: this.index, text: ch3, fn: fn3});
+          this.index += 3;
+        } else if (fn2) {
+          this.tokens.push({index: this.index, text: ch2, fn: fn2});
+          this.index += 2;
+        } else if (fn) {
+          this.tokens.push({
+            index: this.index,
+            text: this.ch,
+            fn: fn,
+            json: (this.was('[,:') && this.is('+-'))
+          });
+          this.index += 1;
+        } else {
+          this.throwError('Unexpected next character ', this.index, this.index + 1);
+        }
+      }
+      this.lastCh = this.ch;
+    }
+    return this.tokens;
+  },
+
+  is: function(chars) {
+    return chars.indexOf(this.ch) !== -1;
+  },
+
+  was: function(chars) {
+    return chars.indexOf(this.lastCh) !== -1;
+  },
+
+  peek: function(i) {
+    var num = i || 1;
+    return (this.index + num < this.text.length) ? this.text.charAt(this.index + num) : false;
+  },
+
+  isNumber: function(ch) {
+    return ('0' <= ch && ch <= '9');
+  },
+
+  isWhitespace: function(ch) {
+    // IE treats non-breaking space as \u00A0
+    return (ch === ' ' || ch === '\r' || ch === '\t' ||
+            ch === '\n' || ch === '\v' || ch === '\u00A0');
+  },
+
+  isIdent: function(ch) {
+    return ('a' <= ch && ch <= 'z' ||
+            'A' <= ch && ch <= 'Z' ||
+            '_' === ch || ch === '$');
+  },
+
+  isExpOperator: function(ch) {
+    return (ch === '-' || ch === '+' || this.isNumber(ch));
+  },
+
+  throwError: function(error, start, end) {
+    end = end || this.index;
+    var colStr = (isDefined(start)
+            ? 's ' + start +  '-' + this.index + ' [' + this.text.substring(start, end) + ']'
+            : ' ' + end);
+    throw $parseMinErr('lexerr', 'Lexer Error: {0} at column{1} in expression [{2}].',
+        error, colStr, this.text);
+  },
+
+  readNumber: function() {
+    var number = '';
+    var start = this.index;
+    while (this.index < this.text.length) {
+      var ch = lowercase(this.text.charAt(this.index));
+      if (ch == '.' || this.isNumber(ch)) {
+        number += ch;
+      } else {
+        var peekCh = this.peek();
+        if (ch == 'e' && this.isExpOperator(peekCh)) {
+          number += ch;
+        } else if (this.isExpOperator(ch) &&
+            peekCh && this.isNumber(peekCh) &&
+            number.charAt(number.length - 1) == 'e') {
+          number += ch;
+        } else if (this.isExpOperator(ch) &&
+            (!peekCh || !this.isNumber(peekCh)) &&
+            number.charAt(number.length - 1) == 'e') {
+          this.throwError('Invalid exponent');
+        } else {
+          break;
+        }
+      }
+      this.index++;
+    }
+    number = 1 * number;
+    this.tokens.push({
+      index: start,
+      text: number,
+      json: true,
+      fn: function() { return number; }
+    });
+  },
+
+  readIdent: function() {
+    var parser = this;
+
+    var ident = '';
+    var start = this.index;
+
+    var lastDot, peekIndex, methodName, ch;
+
+    while (this.index < this.text.length) {
+      ch = this.text.charAt(this.index);
+      if (ch === '.' || this.isIdent(ch) || this.isNumber(ch)) {
+        if (ch === '.') lastDot = this.index;
+        ident += ch;
+      } else {
+        break;
+      }
+      this.index++;
+    }
+
+    //check if this is not a method invocation and if it is back out to last dot
+    if (lastDot) {
+      peekIndex = this.index;
+      while (peekIndex < this.text.length) {
+        ch = this.text.charAt(peekIndex);
+        if (ch === '(') {
+          methodName = ident.substr(lastDot - start + 1);
+          ident = ident.substr(0, lastDot - start);
+          this.index = peekIndex;
+          break;
+        }
+        if (this.isWhitespace(ch)) {
+          peekIndex++;
+        } else {
+          break;
+        }
+      }
+    }
+
+
+    var token = {
+      index: start,
+      text: ident
+    };
+
+    // OPERATORS is our own object so we don't need to use special hasOwnPropertyFn
+    if (OPERATORS.hasOwnProperty(ident)) {
+      token.fn = OPERATORS[ident];
+      token.json = OPERATORS[ident];
+    } else {
+      var getter = getterFn(ident, this.options, this.text);
+      token.fn = extend(function(self, locals) {
+        return (getter(self, locals));
+      }, {
+        assign: function(self, value) {
+          return setter(self, ident, value, parser.text, parser.options);
+        }
+      });
+    }
+
+    this.tokens.push(token);
+
+    if (methodName) {
+      this.tokens.push({
+        index:lastDot,
+        text: '.',
+        json: false
+      });
+      this.tokens.push({
+        index: lastDot + 1,
+        text: methodName,
+        json: false
+      });
+    }
+  },
+
+  readString: function(quote) {
+    var start = this.index;
+    this.index++;
+    var string = '';
+    var rawString = quote;
+    var escape = false;
+    while (this.index < this.text.length) {
+      var ch = this.text.charAt(this.index);
+      rawString += ch;
+      if (escape) {
+        if (ch === 'u') {
+          var hex = this.text.substring(this.index + 1, this.index + 5);
+          if (!hex.match(/[\da-f]{4}/i))
+            this.throwError('Invalid unicode escape [\\u' + hex + ']');
+          this.index += 4;
+          string += String.fromCharCode(parseInt(hex, 16));
+        } else {
+          var rep = ESCAPE[ch];
+          if (rep) {
+            string += rep;
+          } else {
+            string += ch;
+          }
+        }
+        escape = false;
+      } else if (ch === '\\') {
+        escape = true;
+      } else if (ch === quote) {
+        this.index++;
+        this.tokens.push({
+          index: start,
+          text: rawString,
+          string: string,
+          json: true,
+          fn: function() { return string; }
+        });
+        return;
+      } else {
+        string += ch;
+      }
+      this.index++;
+    }
+    this.throwError('Unterminated quote', start);
+  }
+};
+
+
+/**
+ * @constructor
+ */
+var Parser = function (lexer, $filter, options) {
+  this.lexer = lexer;
+  this.$filter = $filter;
+  this.options = options;
+};
+
+Parser.ZERO = function () { return 0; };
+
+Parser.prototype = {
+  constructor: Parser,
+
+  parse: function (text, json) {
+    this.text = text;
+
+    //TODO(i): strip all the obsolte json stuff from this file
+    this.json = json;
+
+    this.tokens = this.lexer.lex(text);
+
+    if (json) {
+      // The extra level of aliasing is here, just in case the lexer misses something, so that
+      // we prevent any accidental execution in JSON.
+      this.assignment = this.logicalOR;
+
+      this.functionCall =
+      this.fieldAccess =
+      this.objectIndex =
+      this.filterChain = function() {
+        this.throwError('is not valid json', {text: text, index: 0});
+      };
+    }
+
+    var value = json ? this.primary() : this.statements();
+
+    if (this.tokens.length !== 0) {
+      this.throwError('is an unexpected token', this.tokens[0]);
+    }
+
+    value.literal = !!value.literal;
+    value.constant = !!value.constant;
+
+    return value;
+  },
+
+  primary: function () {
+    var primary;
+    if (this.expect('(')) {
+      primary = this.filterChain();
+      this.consume(')');
+    } else if (this.expect('[')) {
+      primary = this.arrayDeclaration();
+    } else if (this.expect('{')) {
+      primary = this.object();
+    } else {
+      var token = this.expect();
+      primary = token.fn;
+      if (!primary) {
+        this.throwError('not a primary expression', token);
+      }
+      if (token.json) {
+        primary.constant = true;
+        primary.literal = true;
+      }
+    }
+
+    var next, context;
+    while ((next = this.expect('(', '[', '.'))) {
+      if (next.text === '(') {
+        primary = this.functionCall(primary, context);
+        context = null;
+      } else if (next.text === '[') {
+        context = primary;
+        primary = this.objectIndex(primary);
+      } else if (next.text === '.') {
+        context = primary;
+        primary = this.fieldAccess(primary);
+      } else {
+        this.throwError('IMPOSSIBLE');
+      }
+    }
+    return primary;
+  },
+
+  throwError: function(msg, token) {
+    throw $parseMinErr('syntax',
+        'Syntax Error: Token \'{0}\' {1} at column {2} of the expression [{3}] starting at [{4}].',
+          token.text, msg, (token.index + 1), this.text, this.text.substring(token.index));
+  },
+
+  peekToken: function() {
+    if (this.tokens.length === 0)
+      throw $parseMinErr('ueoe', 'Unexpected end of expression: {0}', this.text);
+    return this.tokens[0];
+  },
+
+  peek: function(e1, e2, e3, e4) {
+    if (this.tokens.length > 0) {
+      var token = this.tokens[0];
+      var t = token.text;
+      if (t === e1 || t === e2 || t === e3 || t === e4 ||
+          (!e1 && !e2 && !e3 && !e4)) {
+        return token;
+      }
+    }
+    return false;
+  },
+
+  expect: function(e1, e2, e3, e4){
+    var token = this.peek(e1, e2, e3, e4);
+    if (token) {
+      if (this.json && !token.json) {
+        this.throwError('is not valid json', token);
+      }
+      this.tokens.shift();
+      return token;
+    }
+    return false;
+  },
+
+  consume: function(e1){
+    if (!this.expect(e1)) {
+      this.throwError('is unexpected, expecting [' + e1 + ']', this.peek());
+    }
+  },
+
+  unaryFn: function(fn, right) {
+    return extend(function(self, locals) {
+      return fn(self, locals, right);
+    }, {
+      constant:right.constant
+    });
+  },
+
+  ternaryFn: function(left, middle, right){
+    return extend(function(self, locals){
+      return left(self, locals) ? middle(self, locals) : right(self, locals);
+    }, {
+      constant: left.constant && middle.constant && right.constant
+    });
+  },
+
+  binaryFn: function(left, fn, right) {
+    return extend(function(self, locals) {
+      return fn(self, locals, left, right);
+    }, {
+      constant:left.constant && right.constant
+    });
+  },
+
+  statements: function() {
+    var statements = [];
+    while (true) {
+      if (this.tokens.length > 0 && !this.peek('}', ')', ';', ']'))
+        statements.push(this.filterChain());
+      if (!this.expect(';')) {
+        // optimize for the common case where there is only one statement.
+        // TODO(size): maybe we should not support multiple statements?
+        return (statements.length === 1)
+            ? statements[0]
+            : function(self, locals) {
+                var value;
+                for (var i = 0; i < statements.length; i++) {
+                  var statement = statements[i];
+                  if (statement) {
+                    value = statement(self, locals);
+                  }
+                }
+                return value;
+              };
+      }
+    }
+  },
+
+  filterChain: function() {
+    var left = this.expression();
+    var token;
+    while (true) {
+      if ((token = this.expect('|'))) {
+        left = this.binaryFn(left, token.fn, this.filter());
+      } else {
+        return left;
+      }
+    }
+  },
+
+  filter: function() {
+    var token = this.expect();
+    var fn = this.$filter(token.text);
+    var argsFn = [];
+    while (true) {
+      if ((token = this.expect(':'))) {
+        argsFn.push(this.expression());
+      } else {
+        var fnInvoke = function(self, locals, input) {
+          var args = [input];
+          for (var i = 0; i < argsFn.length; i++) {
+            args.push(argsFn[i](self, locals));
+          }
+          return fn.apply(self, args);
+        };
+        return function() {
+          return fnInvoke;
+        };
+      }
+    }
+  },
+
+  expression: function() {
+    return this.assignment();
+  },
+
+  assignment: function() {
+    var left = this.ternary();
+    var right;
+    var token;
+    if ((token = this.expect('='))) {
+      if (!left.assign) {
+        this.throwError('implies assignment but [' +
+            this.text.substring(0, token.index) + '] can not be assigned to', token);
+      }
+      right = this.ternary();
+      return function(scope, locals) {
+        return left.assign(scope, right(scope, locals), locals);
+      };
+    }
+    return left;
+  },
+
+  ternary: function() {
+    var left = this.logicalOR();
+    var middle;
+    var token;
+    if ((token = this.expect('?'))) {
+      middle = this.ternary();
+      if ((token = this.expect(':'))) {
+        return this.ternaryFn(left, middle, this.ternary());
+      } else {
+        this.throwError('expected :', token);
+      }
+    } else {
+      return left;
+    }
+  },
+
+  logicalOR: function() {
+    var left = this.logicalAND();
+    var token;
+    while (true) {
+      if ((token = this.expect('||'))) {
+        left = this.binaryFn(left, token.fn, this.logicalAND());
+      } else {
+        return left;
+      }
+    }
+  },
+
+  logicalAND: function() {
+    var left = this.equality();
+    var token;
+    if ((token = this.expect('&&'))) {
+      left = this.binaryFn(left, token.fn, this.logicalAND());
+    }
+    return left;
+  },
+
+  equality: function() {
+    var left = this.relational();
+    var token;
+    if ((token = this.expect('==','!=','===','!=='))) {
+      left = this.binaryFn(left, token.fn, this.equality());
+    }
+    return left;
+  },
+
+  relational: function() {
+    var left = this.additive();
+    var token;
+    if ((token = this.expect('<', '>', '<=', '>='))) {
+      left = this.binaryFn(left, token.fn, this.relational());
+    }
+    return left;
+  },
+
+  additive: function() {
+    var left = this.multiplicative();
+    var token;
+    while ((token = this.expect('+','-'))) {
+      left = this.binaryFn(left, token.fn, this.multiplicative());
+    }
+    return left;
+  },
+
+  multiplicative: function() {
+    var left = this.unary();
+    var token;
+    while ((token = this.expect('*','/','%'))) {
+      left = this.binaryFn(left, token.fn, this.unary());
+    }
+    return left;
+  },
+
+  unary: function() {
+    var token;
+    if (this.expect('+')) {
+      return this.primary();
+    } else if ((token = this.expect('-'))) {
+      return this.binaryFn(Parser.ZERO, token.fn, this.unary());
+    } else if ((token = this.expect('!'))) {
+      return this.unaryFn(token.fn, this.unary());
+    } else {
+      return this.primary();
+    }
+  },
+
+  fieldAccess: function(object) {
+    var parser = this;
+    var field = this.expect().text;
+    var getter = getterFn(field, this.options, this.text);
+
+    return extend(function(scope, locals, self) {
+      return getter(self || object(scope, locals), locals);
+    }, {
+      assign: function(scope, value, locals) {
+        return setter(object(scope, locals), field, value, parser.text, parser.options);
+      }
+    });
+  },
+
+  objectIndex: function(obj) {
+    var parser = this;
+
+    var indexFn = this.expression();
+    this.consume(']');
+
+    return extend(function(self, locals) {
+      var o = obj(self, locals),
+          i = indexFn(self, locals),
+          v, p;
+
+      if (!o) return undefined;
+      v = ensureSafeObject(o[i], parser.text);
+      if (v && v.then && parser.options.unwrapPromises) {
+        p = v;
+        if (!('$$v' in v)) {
+          p.$$v = undefined;
+          p.then(function(val) { p.$$v = val; });
+        }
+        v = v.$$v;
+      }
+      return v;
+    }, {
+      assign: function(self, value, locals) {
+        var key = indexFn(self, locals);
+        // prevent overwriting of Function.constructor which would break ensureSafeObject check
+        var safe = ensureSafeObject(obj(self, locals), parser.text);
+        return safe[key] = value;
+      }
+    });
+  },
+
+  functionCall: function(fn, contextGetter) {
+    var argsFn = [];
+    if (this.peekToken().text !== ')') {
+      do {
+        argsFn.push(this.expression());
+      } while (this.expect(','));
+    }
+    this.consume(')');
+
+    var parser = this;
+
+    return function(scope, locals) {
+      var args = [];
+      var context = contextGetter ? contextGetter(scope, locals) : scope;
+
+      for (var i = 0; i < argsFn.length; i++) {
+        args.push(argsFn[i](scope, locals));
+      }
+      var fnPtr = fn(scope, locals, context) || noop;
+
+      ensureSafeObject(context, parser.text);
+      ensureSafeObject(fnPtr, parser.text);
+
+      // IE stupidity! (IE doesn't have apply for some native functions)
+      var v = fnPtr.apply
+            ? fnPtr.apply(context, args)
+            : fnPtr(args[0], args[1], args[2], args[3], args[4]);
+
+      return ensureSafeObject(v, parser.text);
+    };
+  },
+
+  // This is used with json array declaration
+  arrayDeclaration: function () {
+    var elementFns = [];
+    var allConstant = true;
+    if (this.peekToken().text !== ']') {
+      do {
+        var elementFn = this.expression();
+        elementFns.push(elementFn);
+        if (!elementFn.constant) {
+          allConstant = false;
+        }
+      } while (this.expect(','));
+    }
+    this.consume(']');
+
+    return extend(function(self, locals) {
+      var array = [];
+      for (var i = 0; i < elementFns.length; i++) {
+        array.push(elementFns[i](self, locals));
+      }
+      return array;
+    }, {
+      literal: true,
+      constant: allConstant
+    });
+  },
+
+  object: function () {
+    var keyValues = [];
+    var allConstant = true;
+    if (this.peekToken().text !== '}') {
+      do {
+        var token = this.expect(),
+        key = token.string || token.text;
+        this.consume(':');
+        var value = this.expression();
+        keyValues.push({key: key, value: value});
+        if (!value.constant) {
+          allConstant = false;
+        }
+      } while (this.expect(','));
+    }
+    this.consume('}');
+
+    return extend(function(self, locals) {
+      var object = {};
+      for (var i = 0; i < keyValues.length; i++) {
+        var keyValue = keyValues[i];
+        object[keyValue.key] = keyValue.value(self, locals);
+      }
+      return object;
+    }, {
+      literal: true,
+      constant: allConstant
+    });
+  }
+};
+
+
+//////////////////////////////////////////////////
+// Parser helper functions
+//////////////////////////////////////////////////
+
+function setter(obj, path, setValue, fullExp, options) {
+  //needed?
+  options = options || {};
+
+  var element = path.split('.'), key;
+  for (var i = 0; element.length > 1; i++) {
+    key = ensureSafeMemberName(element.shift(), fullExp);
+    var propertyObj = obj[key];
+    if (!propertyObj) {
+      propertyObj = {};
+      obj[key] = propertyObj;
+    }
+    obj = propertyObj;
+    if (obj.then && options.unwrapPromises) {
+      promiseWarning(fullExp);
+      if (!("$$v" in obj)) {
+        (function(promise) {
+          promise.then(function(val) { promise.$$v = val; }); }
+        )(obj);
+      }
+      if (obj.$$v === undefined) {
+        obj.$$v = {};
+      }
+      obj = obj.$$v;
+    }
+  }
+  key = ensureSafeMemberName(element.shift(), fullExp);
+  obj[key] = setValue;
+  return setValue;
+}
+
+var getterFnCache = {};
+
+/**
+ * Implementation of the "Black Hole" variant from:
+ * - http://jsperf.com/angularjs-parse-getter/4
+ * - http://jsperf.com/path-evaluation-simplified/7
+ */
+function cspSafeGetterFn(key0, key1, key2, key3, key4, fullExp, options) {
+  ensureSafeMemberName(key0, fullExp);
+  ensureSafeMemberName(key1, fullExp);
+  ensureSafeMemberName(key2, fullExp);
+  ensureSafeMemberName(key3, fullExp);
+  ensureSafeMemberName(key4, fullExp);
+
+  return !options.unwrapPromises
+      ? function cspSafeGetter(scope, locals) {
+          var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope;
+
+          if (pathVal === null || pathVal === undefined) return pathVal;
+          pathVal = pathVal[key0];
+
+          if (!key1 || pathVal === null || pathVal === undefined) return pathVal;
+          pathVal = pathVal[key1];
+
+          if (!key2 || pathVal === null || pathVal === undefined) return pathVal;
+          pathVal = pathVal[key2];
+
+          if (!key3 || pathVal === null || pathVal === undefined) return pathVal;
+          pathVal = pathVal[key3];
+
+          if (!key4 || pathVal === null || pathVal === undefined) return pathVal;
+          pathVal = pathVal[key4];
+
+          return pathVal;
+        }
+      : function cspSafePromiseEnabledGetter(scope, locals) {
+          var pathVal = (locals && locals.hasOwnProperty(key0)) ? locals : scope,
+              promise;
+
+          if (pathVal === null || pathVal === undefined) return pathVal;
+
+          pathVal = pathVal[key0];
+          if (pathVal && pathVal.then) {
+            promiseWarning(fullExp);
+            if (!("$$v" in pathVal)) {
+              promise = pathVal;
+              promise.$$v = undefined;
+              promise.then(function(val) { promise.$$v = val; });
+            }
+            pathVal = pathVal.$$v;
+          }
+          if (!key1 || pathVal === null || pathVal === undefined) return pathVal;
+
+          pathVal = pathVal[key1];
+          if (pathVal && pathVal.then) {
+            promiseWarning(fullExp);
+            if (!("$$v" in pathVal)) {
+              promise = pathVal;
+              promise.$$v = undefined;
+              promise.then(function(val) { promise.$$v = val; });
+            }
+            pathVal = pathVal.$$v;
+          }
+          if (!key2 || pathVal === null || pathVal === undefined) return pathVal;
+
+          pathVal = pathVal[key2];
+          if (pathVal && pathVal.then) {
+            promiseWarning(fullExp);
+            if (!("$$v" in pathVal)) {
+              promise = pathVal;
+              promise.$$v = undefined;
+              promise.then(function(val) { promise.$$v = val; });
+            }
+            pathVal = pathVal.$$v;
+          }
+          if (!key3 || pathVal === null || pathVal === undefined) return pathVal;
+
+          pathVal = pathVal[key3];
+          if (pathVal && pathVal.then) {
+            promiseWarning(fullExp);
+            if (!("$$v" in pathVal)) {
+              promise = pathVal;
+              promise.$$v = undefined;
+              promise.then(function(val) { promise.$$v = val; });
+            }
+            pathVal = pathVal.$$v;
+          }
+          if (!key4 || pathVal === null || pathVal === undefined) return pathVal;
+
+          pathVal = pathVal[key4];
+          if (pathVal && pathVal.then) {
+            promiseWarning(fullExp);
+            if (!("$$v" in pathVal)) {
+              promise = pathVal;
+              promise.$$v = undefined;
+              promise.then(function(val) { promise.$$v = val; });
+            }
+            pathVal = pathVal.$$v;
+          }
+          return pathVal;
+        };
+}
+
+function getterFn(path, options, fullExp) {
+  // Check whether the cache has this getter already.
+  // We can use hasOwnProperty directly on the cache because we ensure,
+  // see below, that the cache never stores a path called 'hasOwnProperty'
+  if (getterFnCache.hasOwnProperty(path)) {
+    return getterFnCache[path];
+  }
+
+  var pathKeys = path.split('.'),
+      pathKeysLength = pathKeys.length,
+      fn;
+
+  if (options.csp) {
+    if (pathKeysLength < 6) {
+      fn = cspSafeGetterFn(pathKeys[0], pathKeys[1], pathKeys[2], pathKeys[3], pathKeys[4], fullExp,
+                          options);
+    } else {
+      fn = function(scope, locals) {
+        var i = 0, val;
+        do {
+          val = cspSafeGetterFn(pathKeys[i++], pathKeys[i++], pathKeys[i++], pathKeys[i++],
+                                pathKeys[i++], fullExp, options)(scope, locals);
+
+          locals = undefined; // clear after first iteration
+          scope = val;
+        } while (i < pathKeysLength);
+        return val;
+      };
+    }
+  } else {
+    var code = 'var l, fn, p;\n';
+    forEach(pathKeys, function(key, index) {
+      ensureSafeMemberName(key, fullExp);
+      code += 'if(s === null || s === undefined) return s;\n' +
+              'l=s;\n' +
+              's='+ (index
+                      // we simply dereference 's' on any .dot notation
+                      ? 's'
+                      // but if we are first then we check locals first, and if so read it first
+                      : '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '["' + key + '"]' + ';\n' +
+              (options.unwrapPromises
+                ? 'if (s && s.then) {\n' +
+                  ' pw("' + fullExp.replace(/(["\r\n])/g, '\\$1') + '");\n' +
+                  ' if (!("$$v" in s)) {\n' +
+                    ' p=s;\n' +
+                    ' p.$$v = undefined;\n' +
+                    ' p.then(function(v) {p.$$v=v;});\n' +
+                    '}\n' +
+                  ' s=s.$$v\n' +
+                '}\n'
+                : '');
+    });
+    code += 'return s;';
+
+    /* jshint -W054 */
+    var evaledFnGetter = new Function('s', 'k', 'pw', code); // s=scope, k=locals, pw=promiseWarning
+    /* jshint +W054 */
+    evaledFnGetter.toString = function() { return code; };
+    fn = function(scope, locals) {
+      return evaledFnGetter(scope, locals, promiseWarning);
+    };
+  }
+
+  // Only cache the value if it's not going to mess up the cache object
+  // This is more performant that using Object.prototype.hasOwnProperty.call
+  if (path !== 'hasOwnProperty') {
+    getterFnCache[path] = fn;
+  }
+  return fn;
+}
+
+///////////////////////////////////
+
+/**
+ * @ngdoc function
+ * @name ng.$parse
+ * @function
+ *
+ * @description
+ *
+ * Converts Angular {@link guide/expression expression} into a function.
+ *
+ * <pre>
+ *   var getter = $parse('user.name');
+ *   var setter = getter.assign;
+ *   var context = {user:{name:'angular'}};
+ *   var locals = {user:{name:'local'}};
+ *
+ *   expect(getter(context)).toEqual('angular');
+ *   setter(context, 'newValue');
+ *   expect(context.user.name).toEqual('newValue');
+ *   expect(getter(context, locals)).toEqual('local');
+ * </pre>
+ *
+ *
+ * @param {string} expression String expression to compile.
+ * @returns {function(context, locals)} a function which represents the compiled expression:
+ *
+ *    * `context` – `{object}` – an object against which any expressions embedded in the strings
+ *      are evaluated against (typically a scope object).
+ *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
+ *      `context`.
+ *
+ *    The returned function also has the following properties:
+ *      * `literal` – `{boolean}` – whether the expression's top-level node is a JavaScript
+ *        literal.
+ *      * `constant` – `{boolean}` – whether the expression is made entirely of JavaScript
+ *        constant literals.
+ *      * `assign` – `{?function(context, value)}` – if the expression is assignable, this will be
+ *        set to a function to change its value on the given context.
+ *
+ */
+
+
+/**
+ * @ngdoc object
+ * @name ng.$parseProvider
+ * @function
+ *
+ * @description
+ * `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}
+ *  service.
+ */
+function $ParseProvider() {
+  var cache = {};
+
+  var $parseOptions = {
+    csp: false,
+    unwrapPromises: false,
+    logPromiseWarnings: true
+  };
+
+
+  /**
+   * @deprecated Promise unwrapping via $parse is deprecated and will be removed in the future.
+   *
+   * @ngdoc method
+   * @name ng.$parseProvider#unwrapPromises
+   * @methodOf ng.$parseProvider
+   * @description
+   *
+   * **This feature is deprecated, see deprecation notes below for more info**
+   *
+   * If set to true (default is false), $parse will unwrap promises automatically when a promise is
+   * found at any part of the expression. In other words, if set to true, the expression will always
+   * result in a non-promise value.
+   *
+   * While the promise is unresolved, it's treated as undefined, but once resolved and fulfilled,
+   * the fulfillment value is used in place of the promise while evaluating the expression.
+   *
+   * **Deprecation notice**
+   *
+   * This is a feature that didn't prove to be wildly useful or popular, primarily because of the
+   * dichotomy between data access in templates (accessed as raw values) and controller code
+   * (accessed as promises).
+   *
+   * In most code we ended up resolving promises manually in controllers anyway and thus unifying
+   * the model access there.
+   *
+   * Other downsides of automatic promise unwrapping:
+   *
+   * - when building components it's often desirable to receive the raw promises
+   * - adds complexity and slows down expression evaluation
+   * - makes expression code pre-generation unattractive due to the amount of code that needs to be
+   *   generated
+   * - makes IDE auto-completion and tool support hard
+   *
+   * **Warning Logs**
+   *
+   * If the unwrapping is enabled, Angular will log a warning about each expression that unwraps a
+   * promise (to reduce the noise, each expression is logged only once). To disable this logging use
+   * `$parseProvider.logPromiseWarnings(false)` api.
+   *
+   *
+   * @param {boolean=} value New value.
+   * @returns {boolean|self} Returns the current setting when used as getter and self if used as
+   *                         setter.
+   */
+  this.unwrapPromises = function(value) {
+    if (isDefined(value)) {
+      $parseOptions.unwrapPromises = !!value;
+      return this;
+    } else {
+      return $parseOptions.unwrapPromises;
+    }
+  };
+
+
+  /**
+   * @deprecated Promise unwrapping via $parse is deprecated and will be removed in the future.
+   *
+   * @ngdoc method
+   * @name ng.$parseProvider#logPromiseWarnings
+   * @methodOf ng.$parseProvider
+   * @description
+   *
+   * Controls whether Angular should log a warning on any encounter of a promise in an expression.
+   *
+   * The default is set to `true`.
+   *
+   * This setting applies only if `$parseProvider.unwrapPromises` setting is set to true as well.
+   *
+   * @param {boolean=} value New value.
+   * @returns {boolean|self} Returns the current setting when used as getter and self if used as
+   *                         setter.
+   */
+ this.logPromiseWarnings = function(value) {
+    if (isDefined(value)) {
+      $parseOptions.logPromiseWarnings = value;
+      return this;
+    } else {
+      return $parseOptions.logPromiseWarnings;
+    }
+  };
+
+
+  this.$get = ['$filter', '$sniffer', '$log', function($filter, $sniffer, $log) {
+    $parseOptions.csp = $sniffer.csp;
+
+    promiseWarning = function promiseWarningFn(fullExp) {
+      if (!$parseOptions.logPromiseWarnings || promiseWarningCache.hasOwnProperty(fullExp)) return;
+      promiseWarningCache[fullExp] = true;
+      $log.warn('[$parse] Promise found in the expression `' + fullExp + '`. ' +
+          'Automatic unwrapping of promises in Angular expressions is deprecated.');
+    };
+
+    return function(exp) {
+      var parsedExpression;
+
+      switch (typeof exp) {
+        case 'string':
+
+          if (cache.hasOwnProperty(exp)) {
+            return cache[exp];
+          }
+
+          var lexer = new Lexer($parseOptions);
+          var parser = new Parser(lexer, $filter, $parseOptions);
+          parsedExpression = parser.parse(exp, false);
+
+          if (exp !== 'hasOwnProperty') {
+            // Only cache the value if it's not going to mess up the cache object
+            // This is more performant that using Object.prototype.hasOwnProperty.call
+            cache[exp] = parsedExpression;
+          }
+
+          return parsedExpression;
+
+        case 'function':
+          return exp;
+
+        default:
+          return noop;
+      }
+    };
+  }];
+}
+
+/**
+ * @ngdoc service
+ * @name ng.$q
+ * @requires $rootScope
+ *
+ * @description
+ * A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).
+ *
+ * [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an
+ * interface for interacting with an object that represents the result of an action that is
+ * performed asynchronously, and may or may not be finished at any given point in time.
+ *
+ * From the perspective of dealing with error handling, deferred and promise APIs are to
+ * asynchronous programming what `try`, `catch` and `throw` keywords are to synchronous programming.
+ *
+ * <pre>
+ *   // for the purpose of this example let's assume that variables `$q` and `scope` are
+ *   // available in the current lexical scope (they could have been injected or passed in).
+ *
+ *   function asyncGreet(name) {
+ *     var deferred = $q.defer();
+ *
+ *     setTimeout(function() {
+ *       // since this fn executes async in a future turn of the event loop, we need to wrap
+ *       // our code into an $apply call so that the model changes are properly observed.
+ *       scope.$apply(function() {
+ *         deferred.notify('About to greet ' + name + '.');
+ *
+ *         if (okToGreet(name)) {
+ *           deferred.resolve('Hello, ' + name + '!');
+ *         } else {
+ *           deferred.reject('Greeting ' + name + ' is not allowed.');
+ *         }
+ *       });
+ *     }, 1000);
+ *
+ *     return deferred.promise;
+ *   }
+ *
+ *   var promise = asyncGreet('Robin Hood');
+ *   promise.then(function(greeting) {
+ *     alert('Success: ' + greeting);
+ *   }, function(reason) {
+ *     alert('Failed: ' + reason);
+ *   }, function(update) {
+ *     alert('Got notification: ' + update);
+ *   });
+ * </pre>
+ *
+ * At first it might not be obvious why this extra complexity is worth the trouble. The payoff
+ * comes in the way of guarantees that promise and deferred APIs make, see
+ * https://github.com/kriskowal/uncommonjs/blob/master/promises/specification.md.
+ *
+ * Additionally the promise api allows for composition that is very hard to do with the
+ * traditional callback ([CPS](http://en.wikipedia.org/wiki/Continuation-passing_style)) approach.
+ * For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the
+ * section on serial or parallel joining of promises.
+ *
+ *
+ * # The Deferred API
+ *
+ * A new instance of deferred is constructed by calling `$q.defer()`.
+ *
+ * The purpose of the deferred object is to expose the associated Promise instance as well as APIs
+ * that can be used for signaling the successful or unsuccessful completion, as well as the status
+ * of the task.
+ *
+ * **Methods**
+ *
+ * - `resolve(value)` – resolves the derived promise with the `value`. If the value is a rejection
+ *   constructed via `$q.reject`, the promise will be rejected instead.
+ * - `reject(reason)` – rejects the derived promise with the `reason`. This is equivalent to
+ *   resolving it with a rejection constructed via `$q.reject`.
+ * - `notify(value)` - provides updates on the status of the promises execution. This may be called
+ *   multiple times before the promise is either resolved or rejected.
+ *
+ * **Properties**
+ *
+ * - promise – `{Promise}` – promise object associated with this deferred.
+ *
+ *
+ * # The Promise API
+ *
+ * A new promise instance is created when a deferred instance is created and can be retrieved by
+ * calling `deferred.promise`.
+ *
+ * The purpose of the promise object is to allow for interested parties to get access to the result
+ * of the deferred task when it completes.
+ *
+ * **Methods**
+ *
+ * - `then(successCallback, errorCallback, notifyCallback)` – regardless of when the promise was or
+ *   will be resolved or rejected, `then` calls one of the success or error callbacks asynchronously
+ *   as soon as the result is available. The callbacks are called with a single argument: the result
+ *   or rejection reason. Additionally, the notify callback may be called zero or more times to
+ *   provide a progress indication, before the promise is resolved or rejected.
+ *
+ *   This method *returns a new promise* which is resolved or rejected via the return value of the
+ *   `successCallback`, `errorCallback`. It also notifies via the return value of the
+ *   `notifyCallback` method. The promise can not be resolved or rejected from the notifyCallback
+ *   method.
+ *
+ * - `catch(errorCallback)` – shorthand for `promise.then(null, errorCallback)`
+ *
+ * - `finally(callback)` – allows you to observe either the fulfillment or rejection of a promise,
+ *   but to do so without modifying the final value. This is useful to release resources or do some
+ *   clean-up that needs to be done whether the promise was rejected or resolved. See the [full
+ *   specification](https://github.com/kriskowal/q/wiki/API-Reference#promisefinallycallback) for
+ *   more information.
+ *
+ *   Because `finally` is a reserved word in JavaScript and reserved keywords are not supported as
+ *   property names by ES3, you'll need to invoke the method like `promise['finally'](callback)` to
+ *   make your code IE8 compatible.
+ *
+ * # Chaining promises
+ *
+ * Because calling the `then` method of a promise returns a new derived promise, it is easily
+ * possible to create a chain of promises:
+ *
+ * <pre>
+ *   promiseB = promiseA.then(function(result) {
+ *     return result + 1;
+ *   });
+ *
+ *   // promiseB will be resolved immediately after promiseA is resolved and its value
+ *   // will be the result of promiseA incremented by 1
+ * </pre>
+ *
+ * It is possible to create chains of any length and since a promise can be resolved with another
+ * promise (which will defer its resolution further), it is possible to pause/defer resolution of
+ * the promises at any point in the chain. This makes it possible to implement powerful APIs like
+ * $http's response interceptors.
+ *
+ *
+ * # Differences between Kris Kowal's Q and $q
+ *
+ *  There are two main differences:
+ *
+ * - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation
+ *   mechanism in angular, which means faster propagation of resolution or rejection into your
+ *   models and avoiding unnecessary browser repaints, which would result in flickering UI.
+ * - Q has many more features than $q, but that comes at a cost of bytes. $q is tiny, but contains
+ *   all the important functionality needed for common async tasks.
+ *
+ *  # Testing
+ *
+ *  <pre>
+ *    it('should simulate promise', inject(function($q, $rootScope) {
+ *      var deferred = $q.defer();
+ *      var promise = deferred.promise;
+ *      var resolvedValue;
+ *
+ *      promise.then(function(value) { resolvedValue = value; });
+ *      expect(resolvedValue).toBeUndefined();
+ *
+ *      // Simulate resolving of promise
+ *      deferred.resolve(123);
+ *      // Note that the 'then' function does not get called synchronously.
+ *      // This is because we want the promise API to always be async, whether or not
+ *      // it got called synchronously or asynchronously.
+ *      expect(resolvedValue).toBeUndefined();
+ *
+ *      // Propagate promise resolution to 'then' functions using $apply().
+ *      $rootScope.$apply();
+ *      expect(resolvedValue).toEqual(123);
+ *    }));
+ *  </pre>
+ */
+function $QProvider() {
+
+  this.$get = ['$rootScope', '$exceptionHandler', function($rootScope, $exceptionHandler) {
+    return qFactory(function(callback) {
+      $rootScope.$evalAsync(callback);
+    }, $exceptionHandler);
+  }];
+}
+
+
+/**
+ * Constructs a promise manager.
+ *
+ * @param {function(function)} nextTick Function for executing functions in the next turn.
+ * @param {function(...*)} exceptionHandler Function into which unexpected exceptions are passed for
+ *     debugging purposes.
+ * @returns {object} Promise manager.
+ */
+function qFactory(nextTick, exceptionHandler) {
+
+  /**
+   * @ngdoc
+   * @name ng.$q#defer
+   * @methodOf ng.$q
+   * @description
+   * Creates a `Deferred` object which represents a task which will finish in the future.
+   *
+   * @returns {Deferred} Returns a new instance of deferred.
+   */
+  var defer = function() {
+    var pending = [],
+        value, deferred;
+
+    deferred = {
+
+      resolve: function(val) {
+        if (pending) {
+          var callbacks = pending;
+          pending = undefined;
+          value = ref(val);
+
+          if (callbacks.length) {
+            nextTick(function() {
+              var callback;
+              for (var i = 0, ii = callbacks.length; i < ii; i++) {
+                callback = callbacks[i];
+                value.then(callback[0], callback[1], callback[2]);
+              }
+            });
+          }
+        }
+      },
+
+
+      reject: function(reason) {
+        deferred.resolve(reject(reason));
+      },
+
+
+      notify: function(progress) {
+        if (pending) {
+          var callbacks = pending;
+
+          if (pending.length) {
+            nextTick(function() {
+              var callback;
+              for (var i = 0, ii = callbacks.length; i < ii; i++) {
+                callback = callbacks[i];
+                callback[2](progress);
+              }
+            });
+          }
+        }
+      },
+
+
+      promise: {
+        then: function(callback, errback, progressback) {
+          var result = defer();
+
+          var wrappedCallback = function(value) {
+            try {
+              result.resolve((isFunction(callback) ? callback : defaultCallback)(value));
+            } catch(e) {
+              result.reject(e);
+              exceptionHandler(e);
+            }
+          };
+
+          var wrappedErrback = function(reason) {
+            try {
+              result.resolve((isFunction(errback) ? errback : defaultErrback)(reason));
+            } catch(e) {
+              result.reject(e);
+              exceptionHandler(e);
+            }
+          };
+
+          var wrappedProgressback = function(progress) {
+            try {
+              result.notify((isFunction(progressback) ? progressback : defaultCallback)(progress));
+            } catch(e) {
+              exceptionHandler(e);
+            }
+          };
+
+          if (pending) {
+            pending.push([wrappedCallback, wrappedErrback, wrappedProgressback]);
+          } else {
+            value.then(wrappedCallback, wrappedErrback, wrappedProgressback);
+          }
+
+          return result.promise;
+        },
+
+        "catch": function(callback) {
+          return this.then(null, callback);
+        },
+
+        "finally": function(callback) {
+
+          function makePromise(value, resolved) {
+            var result = defer();
+            if (resolved) {
+              result.resolve(value);
+            } else {
+              result.reject(value);
+            }
+            return result.promise;
+          }
+
+          function handleCallback(value, isResolved) {
+            var callbackOutput = null;
+            try {
+              callbackOutput = (callback ||defaultCallback)();
+            } catch(e) {
+              return makePromise(e, false);
+            }
+            if (callbackOutput && isFunction(callbackOutput.then)) {
+              return callbackOutput.then(function() {
+                return makePromise(value, isResolved);
+              }, function(error) {
+                return makePromise(error, false);
+              });
+            } else {
+              return makePromise(value, isResolved);
+            }
+          }
+
+          return this.then(function(value) {
+            return handleCallback(value, true);
+          }, function(error) {
+            return handleCallback(error, false);
+          });
+        }
+      }
+    };
+
+    return deferred;
+  };
+
+
+  var ref = function(value) {
+    if (value && isFunction(value.then)) return value;
+    return {
+      then: function(callback) {
+        var result = defer();
+        nextTick(function() {
+          result.resolve(callback(value));
+        });
+        return result.promise;
+      }
+    };
+  };
+
+
+  /**
+   * @ngdoc
+   * @name ng.$q#reject
+   * @methodOf ng.$q
+   * @description
+   * Creates a promise that is resolved as rejected with the specified `reason`. This api should be
+   * used to forward rejection in a chain of promises. If you are dealing with the last promise in
+   * a promise chain, you don't need to worry about it.
+   *
+   * When comparing deferreds/promises to the familiar behavior of try/catch/throw, think of
+   * `reject` as the `throw` keyword in JavaScript. This also means that if you "catch" an error via
+   * a promise error callback and you want to forward the error to the promise derived from the
+   * current promise, you have to "rethrow" the error by returning a rejection constructed via
+   * `reject`.
+   *
+   * <pre>
+   *   promiseB = promiseA.then(function(result) {
+   *     // success: do something and resolve promiseB
+   *     //          with the old or a new result
+   *     return result;
+   *   }, function(reason) {
+   *     // error: handle the error if possible and
+   *     //        resolve promiseB with newPromiseOrValue,
+   *     //        otherwise forward the rejection to promiseB
+   *     if (canHandle(reason)) {
+   *      // handle the error and recover
+   *      return newPromiseOrValue;
+   *     }
+   *     return $q.reject(reason);
+   *   });
+   * </pre>
+   *
+   * @param {*} reason Constant, message, exception or an object representing the rejection reason.
+   * @returns {Promise} Returns a promise that was already resolved as rejected with the `reason`.
+   */
+  var reject = function(reason) {
+    return {
+      then: function(callback, errback) {
+        var result = defer();
+        nextTick(function() {
+          try {
+            result.resolve((isFunction(errback) ? errback : defaultErrback)(reason));
+          } catch(e) {
+            result.reject(e);
+            exceptionHandler(e);
+          }
+        });
+        return result.promise;
+      }
+    };
+  };
+
+
+  /**
+   * @ngdoc
+   * @name ng.$q#when
+   * @methodOf ng.$q
+   * @description
+   * Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.
+   * This is useful when you are dealing with an object that might or might not be a promise, or if
+   * the promise comes from a source that can't be trusted.
+   *
+   * @param {*} value Value or a promise
+   * @returns {Promise} Returns a promise of the passed value or promise
+   */
+  var when = function(value, callback, errback, progressback) {
+    var result = defer(),
+        done;
+
+    var wrappedCallback = function(value) {
+      try {
+        return (isFunction(callback) ? callback : defaultCallback)(value);
+      } catch (e) {
+        exceptionHandler(e);
+        return reject(e);
+      }
+    };
+
+    var wrappedErrback = function(reason) {
+      try {
+        return (isFunction(errback) ? errback : defaultErrback)(reason);
+      } catch (e) {
+        exceptionHandler(e);
+        return reject(e);
+      }
+    };
+
+    var wrappedProgressback = function(progress) {
+      try {
+        return (isFunction(progressback) ? progressback : defaultCallback)(progress);
+      } catch (e) {
+        exceptionHandler(e);
+      }
+    };
+
+    nextTick(function() {
+      ref(value).then(function(value) {
+        if (done) return;
+        done = true;
+        result.resolve(ref(value).then(wrappedCallback, wrappedErrback, wrappedProgressback));
+      }, function(reason) {
+        if (done) return;
+        done = true;
+        result.resolve(wrappedErrback(reason));
+      }, function(progress) {
+        if (done) return;
+        result.notify(wrappedProgressback(progress));
+      });
+    });
+
+    return result.promise;
+  };
+
+
+  function defaultCallback(value) {
+    return value;
+  }
+
+
+  function defaultErrback(reason) {
+    return reject(reason);
+  }
+
+
+  /**
+   * @ngdoc
+   * @name ng.$q#all
+   * @methodOf ng.$q
+   * @description
+   * Combines multiple promises into a single promise that is resolved when all of the input
+   * promises are resolved.
+   *
+   * @param {Array.<Promise>|Object.<Promise>} promises An array or hash of promises.
+   * @returns {Promise} Returns a single promise that will be resolved with an array/hash of values,
+   *   each value corresponding to the promise at the same index/key in the `promises` array/hash.
+   *   If any of the promises is resolved with a rejection, this resulting promise will be rejected
+   *   with the same rejection value.
+   */
+  function all(promises) {
+    var deferred = defer(),
+        counter = 0,
+        results = isArray(promises) ? [] : {};
+
+    forEach(promises, function(promise, key) {
+      counter++;
+      ref(promise).then(function(value) {
+        if (results.hasOwnProperty(key)) return;
+        results[key] = value;
+        if (!(--counter)) deferred.resolve(results);
+      }, function(reason) {
+        if (results.hasOwnProperty(key)) return;
+        deferred.reject(reason);
+      });
+    });
+
+    if (counter === 0) {
+      deferred.resolve(results);
+    }
+
+    return deferred.promise;
+  }
+
+  return {
+    defer: defer,
+    reject: reject,
+    when: when,
+    all: all
+  };
+}
+
+/**
+ * DESIGN NOTES
+ *
+ * The design decisions behind the scope are heavily favored for speed and memory consumption.
+ *
+ * The typical use of scope is to watch the expressions, which most of the time return the same
+ * value as last time so we optimize the operation.
+ *
+ * Closures construction is expensive in terms of speed as well as memory:
+ *   - No closures, instead use prototypical inheritance for API
+ *   - Internal state needs to be stored on scope directly, which means that private state is
+ *     exposed as $$____ properties
+ *
+ * Loop operations are optimized by using while(count--) { ... }
+ *   - this means that in order to keep the same order of execution as addition we have to add
+ *     items to the array at the beginning (shift) instead of at the end (push)
+ *
+ * Child scopes are created and removed often
+ *   - Using an array would be slow since inserts in middle are expensive so we use linked list
+ *
+ * There are few watches then a lot of observers. This is why you don't want the observer to be
+ * implemented in the same way as watch. Watch requires return of initialization function which
+ * are expensive to construct.
+ */
+
+
+/**
+ * @ngdoc object
+ * @name ng.$rootScopeProvider
+ * @description
+ *
+ * Provider for the $rootScope service.
+ */
+
+/**
+ * @ngdoc function
+ * @name ng.$rootScopeProvider#digestTtl
+ * @methodOf ng.$rootScopeProvider
+ * @description
+ *
+ * Sets the number of `$digest` iterations the scope should attempt to execute before giving up and
+ * assuming that the model is unstable.
+ *
+ * The current default is 10 iterations.
+ *
+ * In complex applications it's possible that the dependencies between `$watch`s will result in
+ * several digest iterations. However if an application needs more than the default 10 digest
+ * iterations for its model to stabilize then you should investigate what is causing the model to
+ * continuously change during the digest.
+ *
+ * Increasing the TTL could have performance implications, so you should not change it without
+ * proper justification.
+ *
+ * @param {number} limit The number of digest iterations.
+ */
+
+
+/**
+ * @ngdoc object
+ * @name ng.$rootScope
+ * @description
+ *
+ * Every application has a single root {@link ng.$rootScope.Scope scope}.
+ * All other scopes are descendant scopes of the root scope. Scopes provide separation
+ * between the model and the view, via a mechanism for watching the model for changes.
+ * They also provide an event emission/broadcast and subscription facility. See the
+ * {@link guide/scope developer guide on scopes}.
+ */
+function $RootScopeProvider(){
+  var TTL = 10;
+  var $rootScopeMinErr = minErr('$rootScope');
+  var lastDirtyWatch = null;
+
+  this.digestTtl = function(value) {
+    if (arguments.length) {
+      TTL = value;
+    }
+    return TTL;
+  };
+
+  this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser',
+      function( $injector,   $exceptionHandler,   $parse,   $browser) {
+
+    /**
+     * @ngdoc function
+     * @name ng.$rootScope.Scope
+     *
+     * @description
+     * A root scope can be retrieved using the {@link ng.$rootScope $rootScope} key from the
+     * {@link AUTO.$injector $injector}. Child scopes are created using the
+     * {@link ng.$rootScope.Scope#methods_$new $new()} method. (Most scopes are created automatically when
+     * compiled HTML template is executed.)
+     *
+     * Here is a simple scope snippet to show how you can interact with the scope.
+     * <pre>
+     * <file src="./test/ng/rootScopeSpec.js" tag="docs1" />
+     * </pre>
+     *
+     * # Inheritance
+     * A scope can inherit from a parent scope, as in this example:
+     * <pre>
+         var parent = $rootScope;
+         var child = parent.$new();
+
+         parent.salutation = "Hello";
+         child.name = "World";
+         expect(child.salutation).toEqual('Hello');
+
+         child.salutation = "Welcome";
+         expect(child.salutation).toEqual('Welcome');
+         expect(parent.salutation).toEqual('Hello');
+     * </pre>
+     *
+     *
+     * @param {Object.<string, function()>=} providers Map of service factory which need to be
+     *                                       provided for the current scope. Defaults to {@link ng}.
+     * @param {Object.<string, *>=} instanceCache Provides pre-instantiated services which should
+     *                              append/override services provided by `providers`. This is handy
+     *                              when unit-testing and having the need to override a default
+     *                              service.
+     * @returns {Object} Newly created scope.
+     *
+     */
+    function Scope() {
+      this.$id = nextUid();
+      this.$$phase = this.$parent = this.$$watchers =
+                     this.$$nextSibling = this.$$prevSibling =
+                     this.$$childHead = this.$$childTail = null;
+      this['this'] = this.$root =  this;
+      this.$$destroyed = false;
+      this.$$asyncQueue = [];
+      this.$$postDigestQueue = [];
+      this.$$listeners = {};
+      this.$$isolateBindings = {};
+    }
+
+    /**
+     * @ngdoc property
+     * @name ng.$rootScope.Scope#$id
+     * @propertyOf ng.$rootScope.Scope
+     * @returns {number} Unique scope ID (monotonically increasing alphanumeric sequence) useful for
+     *   debugging.
+     */
+
+
+    Scope.prototype = {
+      constructor: Scope,
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$new
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Creates a new child {@link ng.$rootScope.Scope scope}.
+       *
+       * The parent scope will propagate the {@link ng.$rootScope.Scope#methods_$digest $digest()} and
+       * {@link ng.$rootScope.Scope#methods_$digest $digest()} events. The scope can be removed from the
+       * scope hierarchy using {@link ng.$rootScope.Scope#methods_$destroy $destroy()}.
+       *
+       * {@link ng.$rootScope.Scope#methods_$destroy $destroy()} must be called on a scope when it is
+       * desired for the scope and its child scopes to be permanently detached from the parent and
+       * thus stop participating in model change detection and listener notification by invoking.
+       *
+       * @param {boolean} isolate If true, then the scope does not prototypically inherit from the
+       *         parent scope. The scope is isolated, as it can not see parent scope properties.
+       *         When creating widgets, it is useful for the widget to not accidentally read parent
+       *         state.
+       *
+       * @returns {Object} The newly created child scope.
+       *
+       */
+      $new: function(isolate) {
+        var ChildScope,
+            child;
+
+        if (isolate) {
+          child = new Scope();
+          child.$root = this.$root;
+          // ensure that there is just one async queue per $rootScope and its children
+          child.$$asyncQueue = this.$$asyncQueue;
+          child.$$postDigestQueue = this.$$postDigestQueue;
+        } else {
+          ChildScope = function() {}; // should be anonymous; This is so that when the minifier munges
+            // the name it does not become random set of chars. This will then show up as class
+            // name in the debugger.
+          ChildScope.prototype = this;
+          child = new ChildScope();
+          child.$id = nextUid();
+        }
+        child['this'] = child;
+        child.$$listeners = {};
+        child.$parent = this;
+        child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null;
+        child.$$prevSibling = this.$$childTail;
+        if (this.$$childHead) {
+          this.$$childTail.$$nextSibling = child;
+          this.$$childTail = child;
+        } else {
+          this.$$childHead = this.$$childTail = child;
+        }
+        return child;
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$watch
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Registers a `listener` callback to be executed whenever the `watchExpression` changes.
+       *
+       * - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#methods_$digest
+       *   $digest()} and should return the value that will be watched. (Since
+       *   {@link ng.$rootScope.Scope#methods_$digest $digest()} reruns when it detects changes the
+       *   `watchExpression` can execute multiple times per
+       *   {@link ng.$rootScope.Scope#methods_$digest $digest()} and should be idempotent.)
+       * - The `listener` is called only when the value from the current `watchExpression` and the
+       *   previous call to `watchExpression` are not equal (with the exception of the initial run,
+       *   see below). The inequality is determined according to
+       *   {@link angular.equals} function. To save the value of the object for later comparison,
+       *   the {@link angular.copy} function is used. It also means that watching complex options
+       *   will have adverse memory and performance implications.
+       * - The watch `listener` may change the model, which may trigger other `listener`s to fire.
+       *   This is achieved by rerunning the watchers until no changes are detected. The rerun
+       *   iteration limit is 10 to prevent an infinite loop deadlock.
+       *
+       *
+       * If you want to be notified whenever {@link ng.$rootScope.Scope#methods_$digest $digest} is called,
+       * you can register a `watchExpression` function with no `listener`. (Since `watchExpression`
+       * can execute multiple times per {@link ng.$rootScope.Scope#methods_$digest $digest} cycle when a
+       * change is detected, be prepared for multiple calls to your listener.)
+       *
+       * After a watcher is registered with the scope, the `listener` fn is called asynchronously
+       * (via {@link ng.$rootScope.Scope#methods_$evalAsync $evalAsync}) to initialize the
+       * watcher. In rare cases, this is undesirable because the listener is called when the result
+       * of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you
+       * can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the
+       * listener was called due to initialization.
+       *
+       * The example below contains an illustration of using a function as your $watch listener
+       *
+       *
+       * # Example
+       * <pre>
+           // let's assume that scope was dependency injected as the $rootScope
+           var scope = $rootScope;
+           scope.name = 'misko';
+           scope.counter = 0;
+
+           expect(scope.counter).toEqual(0);
+           scope.$watch('name', function(newValue, oldValue) {
+             scope.counter = scope.counter + 1;
+           });
+           expect(scope.counter).toEqual(0);
+
+           scope.$digest();
+           // no variable change
+           expect(scope.counter).toEqual(0);
+
+           scope.name = 'adam';
+           scope.$digest();
+           expect(scope.counter).toEqual(1);
+
+
+
+           // Using a listener function
+           var food;
+           scope.foodCounter = 0;
+           expect(scope.foodCounter).toEqual(0);
+           scope.$watch(
+             // This is the listener function
+             function() { return food; },
+             // This is the change handler
+             function(newValue, oldValue) {
+               if ( newValue !== oldValue ) {
+                 // Only increment the counter if the value changed
+                 scope.foodCounter = scope.foodCounter + 1;
+               }
+             }
+           );
+           // No digest has been run so the counter will be zero
+           expect(scope.foodCounter).toEqual(0);
+
+           // Run the digest but since food has not changed cout will still be zero
+           scope.$digest();
+           expect(scope.foodCounter).toEqual(0);
+
+           // Update food and run digest.  Now the counter will increment
+           food = 'cheeseburger';
+           scope.$digest();
+           expect(scope.foodCounter).toEqual(1);
+
+       * </pre>
+       *
+       *
+       *
+       * @param {(function()|string)} watchExpression Expression that is evaluated on each
+       *    {@link ng.$rootScope.Scope#methods_$digest $digest} cycle. A change in the return value triggers
+       *    a call to the `listener`.
+       *
+       *    - `string`: Evaluated as {@link guide/expression expression}
+       *    - `function(scope)`: called with current `scope` as a parameter.
+       * @param {(function()|string)=} listener Callback called whenever the return value of
+       *   the `watchExpression` changes.
+       *
+       *    - `string`: Evaluated as {@link guide/expression expression}
+       *    - `function(newValue, oldValue, scope)`: called with current and previous values as
+       *      parameters.
+       *
+       * @param {boolean=} objectEquality Compare object for equality rather than for reference.
+       * @returns {function()} Returns a deregistration function for this listener.
+       */
+      $watch: function(watchExp, listener, objectEquality) {
+        var scope = this,
+            get = compileToFn(watchExp, 'watch'),
+            array = scope.$$watchers,
+            watcher = {
+              fn: listener,
+              last: initWatchVal,
+              get: get,
+              exp: watchExp,
+              eq: !!objectEquality
+            };
+
+        lastDirtyWatch = null;
+
+        // in the case user pass string, we need to compile it, do we really need this ?
+        if (!isFunction(listener)) {
+          var listenFn = compileToFn(listener || noop, 'listener');
+          watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);};
+        }
+
+        if (typeof watchExp == 'string' && get.constant) {
+          var originalFn = watcher.fn;
+          watcher.fn = function(newVal, oldVal, scope) {
+            originalFn.call(this, newVal, oldVal, scope);
+            arrayRemove(array, watcher);
+          };
+        }
+
+        if (!array) {
+          array = scope.$$watchers = [];
+        }
+        // we use unshift since we use a while loop in $digest for speed.
+        // the while loop reads in reverse order.
+        array.unshift(watcher);
+
+        return function() {
+          arrayRemove(array, watcher);
+        };
+      },
+
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$watchCollection
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Shallow watches the properties of an object and fires whenever any of the properties change
+       * (for arrays, this implies watching the array items; for object maps, this implies watching
+       * the properties). If a change is detected, the `listener` callback is fired.
+       *
+       * - The `obj` collection is observed via standard $watch operation and is examined on every
+       *   call to $digest() to see if any items have been added, removed, or moved.
+       * - The `listener` is called whenever anything within the `obj` has changed. Examples include
+       *   adding, removing, and moving items belonging to an object or array.
+       *
+       *
+       * # Example
+       * <pre>
+          $scope.names = ['igor', 'matias', 'misko', 'james'];
+          $scope.dataCount = 4;
+
+          $scope.$watchCollection('names', function(newNames, oldNames) {
+            $scope.dataCount = newNames.length;
+          });
+
+          expect($scope.dataCount).toEqual(4);
+          $scope.$digest();
+
+          //still at 4 ... no changes
+          expect($scope.dataCount).toEqual(4);
+
+          $scope.names.pop();
+          $scope.$digest();
+
+          //now there's been a change
+          expect($scope.dataCount).toEqual(3);
+       * </pre>
+       *
+       *
+       * @param {string|Function(scope)} obj Evaluated as {@link guide/expression expression}. The
+       *    expression value should evaluate to an object or an array which is observed on each
+       *    {@link ng.$rootScope.Scope#methods_$digest $digest} cycle. Any shallow change within the
+       *    collection will trigger a call to the `listener`.
+       *
+       * @param {function(newCollection, oldCollection, scope)} listener a callback function that is
+       *    fired with both the `newCollection` and `oldCollection` as parameters.
+       *    The `newCollection` object is the newly modified data obtained from the `obj` expression
+       *    and the `oldCollection` object is a copy of the former collection data.
+       *    The `scope` refers to the current scope.
+       *
+       * @returns {function()} Returns a de-registration function for this listener. When the
+       *    de-registration function is executed, the internal watch operation is terminated.
+       */
+      $watchCollection: function(obj, listener) {
+        var self = this;
+        var oldValue;
+        var newValue;
+        var changeDetected = 0;
+        var objGetter = $parse(obj);
+        var internalArray = [];
+        var internalObject = {};
+        var oldLength = 0;
+
+        function $watchCollectionWatch() {
+          newValue = objGetter(self);
+          var newLength, key;
+
+          if (!isObject(newValue)) {
+            if (oldValue !== newValue) {
+              oldValue = newValue;
+              changeDetected++;
+            }
+          } else if (isArrayLike(newValue)) {
+            if (oldValue !== internalArray) {
+              // we are transitioning from something which was not an array into array.
+              oldValue = internalArray;
+              oldLength = oldValue.length = 0;
+              changeDetected++;
+            }
+
+            newLength = newValue.length;
+
+            if (oldLength !== newLength) {
+              // if lengths do not match we need to trigger change notification
+              changeDetected++;
+              oldValue.length = oldLength = newLength;
+            }
+            // copy the items to oldValue and look for changes.
+            for (var i = 0; i < newLength; i++) {
+              if (oldValue[i] !== newValue[i]) {
+                changeDetected++;
+                oldValue[i] = newValue[i];
+              }
+            }
+          } else {
+            if (oldValue !== internalObject) {
+              // we are transitioning from something which was not an object into object.
+              oldValue = internalObject = {};
+              oldLength = 0;
+              changeDetected++;
+            }
+            // copy the items to oldValue and look for changes.
+            newLength = 0;
+            for (key in newValue) {
+              if (newValue.hasOwnProperty(key)) {
+                newLength++;
+                if (oldValue.hasOwnProperty(key)) {
+                  if (oldValue[key] !== newValue[key]) {
+                    changeDetected++;
+                    oldValue[key] = newValue[key];
+                  }
+                } else {
+                  oldLength++;
+                  oldValue[key] = newValue[key];
+                  changeDetected++;
+                }
+              }
+            }
+            if (oldLength > newLength) {
+              // we used to have more keys, need to find them and destroy them.
+              changeDetected++;
+              for(key in oldValue) {
+                if (oldValue.hasOwnProperty(key) && !newValue.hasOwnProperty(key)) {
+                  oldLength--;
+                  delete oldValue[key];
+                }
+              }
+            }
+          }
+          return changeDetected;
+        }
+
+        function $watchCollectionAction() {
+          listener(newValue, oldValue, self);
+        }
+
+        return this.$watch($watchCollectionWatch, $watchCollectionAction);
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$digest
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Processes all of the {@link ng.$rootScope.Scope#methods_$watch watchers} of the current scope and
+       * its children. Because a {@link ng.$rootScope.Scope#methods_$watch watcher}'s listener can change
+       * the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#methods_$watch watchers}
+       * until no more listeners are firing. This means that it is possible to get into an infinite
+       * loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of
+       * iterations exceeds 10.
+       *
+       * Usually, you don't call `$digest()` directly in
+       * {@link ng.directive:ngController controllers} or in
+       * {@link ng.$compileProvider#methods_directive directives}.
+       * Instead, you should call {@link ng.$rootScope.Scope#methods_$apply $apply()} (typically from within
+       * a {@link ng.$compileProvider#methods_directive directives}), which will force a `$digest()`.
+       *
+       * If you want to be notified whenever `$digest()` is called,
+       * you can register a `watchExpression` function with
+       * {@link ng.$rootScope.Scope#methods_$watch $watch()} with no `listener`.
+       *
+       * In unit tests, you may need to call `$digest()` to simulate the scope life cycle.
+       *
+       * # Example
+       * <pre>
+           var scope = ...;
+           scope.name = 'misko';
+           scope.counter = 0;
+
+           expect(scope.counter).toEqual(0);
+           scope.$watch('name', function(newValue, oldValue) {
+             scope.counter = scope.counter + 1;
+           });
+           expect(scope.counter).toEqual(0);
+
+           scope.$digest();
+           // no variable change
+           expect(scope.counter).toEqual(0);
+
+           scope.name = 'adam';
+           scope.$digest();
+           expect(scope.counter).toEqual(1);
+       * </pre>
+       *
+       */
+      $digest: function() {
+        var watch, value, last,
+            watchers,
+            asyncQueue = this.$$asyncQueue,
+            postDigestQueue = this.$$postDigestQueue,
+            length,
+            dirty, ttl = TTL,
+            next, current, target = this,
+            watchLog = [],
+            logIdx, logMsg, asyncTask;
+
+        beginPhase('$digest');
+
+        lastDirtyWatch = null;
+
+        do { // "while dirty" loop
+          dirty = false;
+          current = target;
+
+          while(asyncQueue.length) {
+            try {
+              asyncTask = asyncQueue.shift();
+              asyncTask.scope.$eval(asyncTask.expression);
+            } catch (e) {
+              clearPhase();
+              $exceptionHandler(e);
+            }
+            lastDirtyWatch = null;
+          }
+
+          traverseScopesLoop:
+          do { // "traverse the scopes" loop
+            if ((watchers = current.$$watchers)) {
+              // process our watches
+              length = watchers.length;
+              while (length--) {
+                try {
+                  watch = watchers[length];
+                  // Most common watches are on primitives, in which case we can short
+                  // circuit it with === operator, only when === fails do we use .equals
+                  if (watch) {
+                    if ((value = watch.get(current)) !== (last = watch.last) &&
+                        !(watch.eq
+                            ? equals(value, last)
+                            : (typeof value == 'number' && typeof last == 'number'
+                               && isNaN(value) && isNaN(last)))) {
+                      dirty = true;
+                      lastDirtyWatch = watch;
+                      watch.last = watch.eq ? copy(value) : value;
+                      watch.fn(value, ((last === initWatchVal) ? value : last), current);
+                      if (ttl < 5) {
+                        logIdx = 4 - ttl;
+                        if (!watchLog[logIdx]) watchLog[logIdx] = [];
+                        logMsg = (isFunction(watch.exp))
+                            ? 'fn: ' + (watch.exp.name || watch.exp.toString())
+                            : watch.exp;
+                        logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
+                        watchLog[logIdx].push(logMsg);
+                      }
+                    } else if (watch === lastDirtyWatch) {
+                      // If the most recently dirty watcher is now clean, short circuit since the remaining watchers
+                      // have already been tested.
+                      dirty = false;
+                      break traverseScopesLoop;
+                    }
+                  }
+                } catch (e) {
+                  clearPhase();
+                  $exceptionHandler(e);
+                }
+              }
+            }
+
+            // Insanity Warning: scope depth-first traversal
+            // yes, this code is a bit crazy, but it works and we have tests to prove it!
+            // this piece should be kept in sync with the traversal in $broadcast
+            if (!(next = (current.$$childHead ||
+                (current !== target && current.$$nextSibling)))) {
+              while(current !== target && !(next = current.$$nextSibling)) {
+                current = current.$parent;
+              }
+            }
+          } while ((current = next));
+
+          // `break traverseScopesLoop;` takes us to here
+
+          if(dirty && !(ttl--)) {
+            clearPhase();
+            throw $rootScopeMinErr('infdig',
+                '{0} $digest() iterations reached. Aborting!\n' +
+                'Watchers fired in the last 5 iterations: {1}',
+                TTL, toJson(watchLog));
+          }
+
+        } while (dirty || asyncQueue.length);
+
+        clearPhase();
+
+        while(postDigestQueue.length) {
+          try {
+            postDigestQueue.shift()();
+          } catch (e) {
+            $exceptionHandler(e);
+          }
+        }
+      },
+
+
+      /**
+       * @ngdoc event
+       * @name ng.$rootScope.Scope#$destroy
+       * @eventOf ng.$rootScope.Scope
+       * @eventType broadcast on scope being destroyed
+       *
+       * @description
+       * Broadcasted when a scope and its children are being destroyed.
+       *
+       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
+       * clean up DOM bindings before an element is removed from the DOM.
+       */
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$destroy
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Removes the current scope (and all of its children) from the parent scope. Removal implies
+       * that calls to {@link ng.$rootScope.Scope#methods_$digest $digest()} will no longer
+       * propagate to the current scope and its children. Removal also implies that the current
+       * scope is eligible for garbage collection.
+       *
+       * The `$destroy()` is usually used by directives such as
+       * {@link ng.directive:ngRepeat ngRepeat} for managing the
+       * unrolling of the loop.
+       *
+       * Just before a scope is destroyed, a `$destroy` event is broadcasted on this scope.
+       * Application code can register a `$destroy` event handler that will give it a chance to
+       * perform any necessary cleanup.
+       *
+       * Note that, in AngularJS, there is also a `$destroy` jQuery event, which can be used to
+       * clean up DOM bindings before an element is removed from the DOM.
+       */
+      $destroy: function() {
+        // we can't destroy the root scope or a scope that has been already destroyed
+        if (this.$$destroyed) return;
+        var parent = this.$parent;
+
+        this.$broadcast('$destroy');
+        this.$$destroyed = true;
+        if (this === $rootScope) return;
+
+        if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;
+        if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;
+        if (this.$$prevSibling) this.$$prevSibling.$$nextSibling = this.$$nextSibling;
+        if (this.$$nextSibling) this.$$nextSibling.$$prevSibling = this.$$prevSibling;
+
+        // This is bogus code that works around Chrome's GC leak
+        // see: https://github.com/angular/angular.js/issues/1313#issuecomment-10378451
+        this.$parent = this.$$nextSibling = this.$$prevSibling = this.$$childHead =
+            this.$$childTail = null;
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$eval
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Executes the `expression` on the current scope and returns the result. Any exceptions in
+       * the expression are propagated (uncaught). This is useful when evaluating Angular
+       * expressions.
+       *
+       * # Example
+       * <pre>
+           var scope = ng.$rootScope.Scope();
+           scope.a = 1;
+           scope.b = 2;
+
+           expect(scope.$eval('a+b')).toEqual(3);
+           expect(scope.$eval(function(scope){ return scope.a + scope.b; })).toEqual(3);
+       * </pre>
+       *
+       * @param {(string|function())=} expression An angular expression to be executed.
+       *
+       *    - `string`: execute using the rules as defined in  {@link guide/expression expression}.
+       *    - `function(scope)`: execute the function with the current `scope` parameter.
+       *
+       * @param {(object)=} locals Local variables object, useful for overriding values in scope.
+       * @returns {*} The result of evaluating the expression.
+       */
+      $eval: function(expr, locals) {
+        return $parse(expr)(this, locals);
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$evalAsync
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Executes the expression on the current scope at a later point in time.
+       *
+       * The `$evalAsync` makes no guarantees as to when the `expression` will be executed, only
+       * that:
+       *
+       *   - it will execute after the function that scheduled the evaluation (preferably before DOM
+       *     rendering).
+       *   - at least one {@link ng.$rootScope.Scope#methods_$digest $digest cycle} will be performed after
+       *     `expression` execution.
+       *
+       * Any exceptions from the execution of the expression are forwarded to the
+       * {@link ng.$exceptionHandler $exceptionHandler} service.
+       *
+       * __Note:__ if this function is called outside of a `$digest` cycle, a new `$digest` cycle
+       * will be scheduled. However, it is encouraged to always call code that changes the model
+       * from within an `$apply` call. That includes code evaluated via `$evalAsync`.
+       *
+       * @param {(string|function())=} expression An angular expression to be executed.
+       *
+       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.
+       *    - `function(scope)`: execute the function with the current `scope` parameter.
+       *
+       */
+      $evalAsync: function(expr) {
+        // if we are outside of an $digest loop and this is the first time we are scheduling async
+        // task also schedule async auto-flush
+        if (!$rootScope.$$phase && !$rootScope.$$asyncQueue.length) {
+          $browser.defer(function() {
+            if ($rootScope.$$asyncQueue.length) {
+              $rootScope.$digest();
+            }
+          });
+        }
+
+        this.$$asyncQueue.push({scope: this, expression: expr});
+      },
+
+      $$postDigest : function(fn) {
+        this.$$postDigestQueue.push(fn);
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$apply
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * `$apply()` is used to execute an expression in angular from outside of the angular
+       * framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).
+       * Because we are calling into the angular framework we need to perform proper scope life
+       * cycle of {@link ng.$exceptionHandler exception handling},
+       * {@link ng.$rootScope.Scope#methods_$digest executing watches}.
+       *
+       * ## Life cycle
+       *
+       * # Pseudo-Code of `$apply()`
+       * <pre>
+           function $apply(expr) {
+             try {
+               return $eval(expr);
+             } catch (e) {
+               $exceptionHandler(e);
+             } finally {
+               $root.$digest();
+             }
+           }
+       * </pre>
+       *
+       *
+       * Scope's `$apply()` method transitions through the following stages:
+       *
+       * 1. The {@link guide/expression expression} is executed using the
+       *    {@link ng.$rootScope.Scope#methods_$eval $eval()} method.
+       * 2. Any exceptions from the execution of the expression are forwarded to the
+       *    {@link ng.$exceptionHandler $exceptionHandler} service.
+       * 3. The {@link ng.$rootScope.Scope#methods_$watch watch} listeners are fired immediately after the
+       *    expression was executed using the {@link ng.$rootScope.Scope#methods_$digest $digest()} method.
+       *
+       *
+       * @param {(string|function())=} exp An angular expression to be executed.
+       *
+       *    - `string`: execute using the rules as defined in {@link guide/expression expression}.
+       *    - `function(scope)`: execute the function with current `scope` parameter.
+       *
+       * @returns {*} The result of evaluating the expression.
+       */
+      $apply: function(expr) {
+        try {
+          beginPhase('$apply');
+          return this.$eval(expr);
+        } catch (e) {
+          $exceptionHandler(e);
+        } finally {
+          clearPhase();
+          try {
+            $rootScope.$digest();
+          } catch (e) {
+            $exceptionHandler(e);
+            throw e;
+          }
+        }
+      },
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$on
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Listens on events of a given type. See {@link ng.$rootScope.Scope#methods_$emit $emit} for
+       * discussion of event life cycle.
+       *
+       * The event listener function format is: `function(event, args...)`. The `event` object
+       * passed into the listener has the following attributes:
+       *
+       *   - `targetScope` - `{Scope}`: the scope on which the event was `$emit`-ed or
+       *     `$broadcast`-ed.
+       *   - `currentScope` - `{Scope}`: the current scope which is handling the event.
+       *   - `name` - `{string}`: name of the event.
+       *   - `stopPropagation` - `{function=}`: calling `stopPropagation` function will cancel
+       *     further event propagation (available only for events that were `$emit`-ed).
+       *   - `preventDefault` - `{function}`: calling `preventDefault` sets `defaultPrevented` flag
+       *     to true.
+       *   - `defaultPrevented` - `{boolean}`: true if `preventDefault` was called.
+       *
+       * @param {string} name Event name to listen on.
+       * @param {function(event, args...)} listener Function to call when the event is emitted.
+       * @returns {function()} Returns a deregistration function for this listener.
+       */
+      $on: function(name, listener) {
+        var namedListeners = this.$$listeners[name];
+        if (!namedListeners) {
+          this.$$listeners[name] = namedListeners = [];
+        }
+        namedListeners.push(listener);
+
+        return function() {
+          namedListeners[indexOf(namedListeners, listener)] = null;
+        };
+      },
+
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$emit
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Dispatches an event `name` upwards through the scope hierarchy notifying the
+       * registered {@link ng.$rootScope.Scope#methods_$on} listeners.
+       *
+       * The event life cycle starts at the scope on which `$emit` was called. All
+       * {@link ng.$rootScope.Scope#methods_$on listeners} listening for `name` event on this scope get
+       * notified. Afterwards, the event traverses upwards toward the root scope and calls all
+       * registered listeners along the way. The event will stop propagating if one of the listeners
+       * cancels it.
+       *
+       * Any exception emitted from the {@link ng.$rootScope.Scope#methods_$on listeners} will be passed
+       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
+       *
+       * @param {string} name Event name to emit.
+       * @param {...*} args Optional set of arguments which will be passed onto the event listeners.
+       * @return {Object} Event object (see {@link ng.$rootScope.Scope#methods_$on}).
+       */
+      $emit: function(name, args) {
+        var empty = [],
+            namedListeners,
+            scope = this,
+            stopPropagation = false,
+            event = {
+              name: name,
+              targetScope: scope,
+              stopPropagation: function() {stopPropagation = true;},
+              preventDefault: function() {
+                event.defaultPrevented = true;
+              },
+              defaultPrevented: false
+            },
+            listenerArgs = concat([event], arguments, 1),
+            i, length;
+
+        do {
+          namedListeners = scope.$$listeners[name] || empty;
+          event.currentScope = scope;
+          for (i=0, length=namedListeners.length; i<length; i++) {
+
+            // if listeners were deregistered, defragment the array
+            if (!namedListeners[i]) {
+              namedListeners.splice(i, 1);
+              i--;
+              length--;
+              continue;
+            }
+            try {
+              //allow all listeners attached to the current scope to run
+              namedListeners[i].apply(null, listenerArgs);
+            } catch (e) {
+              $exceptionHandler(e);
+            }
+          }
+          //if any listener on the current scope stops propagation, prevent bubbling
+          if (stopPropagation) return event;
+          //traverse upwards
+          scope = scope.$parent;
+        } while (scope);
+
+        return event;
+      },
+
+
+      /**
+       * @ngdoc function
+       * @name ng.$rootScope.Scope#$broadcast
+       * @methodOf ng.$rootScope.Scope
+       * @function
+       *
+       * @description
+       * Dispatches an event `name` downwards to all child scopes (and their children) notifying the
+       * registered {@link ng.$rootScope.Scope#methods_$on} listeners.
+       *
+       * The event life cycle starts at the scope on which `$broadcast` was called. All
+       * {@link ng.$rootScope.Scope#methods_$on listeners} listening for `name` event on this scope get
+       * notified. Afterwards, the event propagates to all direct and indirect scopes of the current
+       * scope and calls all registered listeners along the way. The event cannot be canceled.
+       *
+       * Any exception emitted from the {@link ng.$rootScope.Scope#methods_$on listeners} will be passed
+       * onto the {@link ng.$exceptionHandler $exceptionHandler} service.
+       *
+       * @param {string} name Event name to broadcast.
+       * @param {...*} args Optional set of arguments which will be passed onto the event listeners.
+       * @return {Object} Event object, see {@link ng.$rootScope.Scope#methods_$on}
+       */
+      $broadcast: function(name, args) {
+        var target = this,
+            current = target,
+            next = target,
+            event = {
+              name: name,
+              targetScope: target,
+              preventDefault: function() {
+                event.defaultPrevented = true;
+              },
+              defaultPrevented: false
+            },
+            listenerArgs = concat([event], arguments, 1),
+            listeners, i, length;
+
+        //down while you can, then up and next sibling or up and next sibling until back at root
+        do {
+          current = next;
+          event.currentScope = current;
+          listeners = current.$$listeners[name] || [];
+          for (i=0, length = listeners.length; i<length; i++) {
+            // if listeners were deregistered, defragment the array
+            if (!listeners[i]) {
+              listeners.splice(i, 1);
+              i--;
+              length--;
+              continue;
+            }
+
+            try {
+              listeners[i].apply(null, listenerArgs);
+            } catch(e) {
+              $exceptionHandler(e);
+            }
+          }
+
+          // Insanity Warning: scope depth-first traversal
+          // yes, this code is a bit crazy, but it works and we have tests to prove it!
+          // this piece should be kept in sync with the traversal in $digest
+          if (!(next = (current.$$childHead || (current !== target && current.$$nextSibling)))) {
+            while(current !== target && !(next = current.$$nextSibling)) {
+              current = current.$parent;
+            }
+          }
+        } while ((current = next));
+
+        return event;
+      }
+    };
+
+    var $rootScope = new Scope();
+
+    return $rootScope;
+
+
+    function beginPhase(phase) {
+      if ($rootScope.$$phase) {
+        throw $rootScopeMinErr('inprog', '{0} already in progress', $rootScope.$$phase);
+      }
+
+      $rootScope.$$phase = phase;
+    }
+
+    function clearPhase() {
+      $rootScope.$$phase = null;
+    }
+
+    function compileToFn(exp, name) {
+      var fn = $parse(exp);
+      assertArgFn(fn, name);
+      return fn;
+    }
+
+    /**
+     * function used as an initial value for watchers.
+     * because it's unique we can easily tell it apart from other values
+     */
+    function initWatchVal() {}
+  }];
+}
+
+/**
+ * @description
+ * Private service to sanitize uris for links and images. Used by $compile and $sanitize.
+ */
+function $$SanitizeUriProvider() {
+  var aHrefSanitizationWhitelist = /^\s*(https?|ftp|mailto|tel|file):/,
+    imgSrcSanitizationWhitelist = /^\s*(https?|ftp|file):|data:image\//;
+
+  /**
+   * @description
+   * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+   * urls during a[href] sanitization.
+   *
+   * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+   *
+   * Any url about to be assigned to a[href] via data-binding is first normalized and turned into
+   * an absolute url. Afterwards, the url is matched against the `aHrefSanitizationWhitelist`
+   * regular expression. If a match is found, the original url is written into the dom. Otherwise,
+   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+   *
+   * @param {RegExp=} regexp New regexp to whitelist urls with.
+   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+   *    chaining otherwise.
+   */
+  this.aHrefSanitizationWhitelist = function(regexp) {
+    if (isDefined(regexp)) {
+      aHrefSanitizationWhitelist = regexp;
+      return this;
+    }
+    return aHrefSanitizationWhitelist;
+  };
+
+
+  /**
+   * @description
+   * Retrieves or overrides the default regular expression that is used for whitelisting of safe
+   * urls during img[src] sanitization.
+   *
+   * The sanitization is a security measure aimed at prevent XSS attacks via html links.
+   *
+   * Any url about to be assigned to img[src] via data-binding is first normalized and turned into
+   * an absolute url. Afterwards, the url is matched against the `imgSrcSanitizationWhitelist`
+   * regular expression. If a match is found, the original url is written into the dom. Otherwise,
+   * the absolute url is prefixed with `'unsafe:'` string and only then is it written into the DOM.
+   *
+   * @param {RegExp=} regexp New regexp to whitelist urls with.
+   * @returns {RegExp|ng.$compileProvider} Current RegExp if called without value or self for
+   *    chaining otherwise.
+   */
+  this.imgSrcSanitizationWhitelist = function(regexp) {
+    if (isDefined(regexp)) {
+      imgSrcSanitizationWhitelist = regexp;
+      return this;
+    }
+    return imgSrcSanitizationWhitelist;
+  };
+
+  this.$get = function() {
+    return function sanitizeUri(uri, isImage) {
+      var regex = isImage ? imgSrcSanitizationWhitelist : aHrefSanitizationWhitelist;
+      var normalizedVal;
+      // NOTE: urlResolve() doesn't support IE < 8 so we don't sanitize for that case.
+      if (!msie || msie >= 8 ) {
+        normalizedVal = urlResolve(uri).href;
+        if (normalizedVal !== '' && !normalizedVal.match(regex)) {
+          return 'unsafe:'+normalizedVal;
+        }
+      }
+      return uri;
+    };
+  };
+}
+
+var $sceMinErr = minErr('$sce');
+
+var SCE_CONTEXTS = {
+  HTML: 'html',
+  CSS: 'css',
+  URL: 'url',
+  // RESOURCE_URL is a subtype of URL used in contexts where a privileged resource is sourced from a
+  // url.  (e.g. ng-include, script src, templateUrl)
+  RESOURCE_URL: 'resourceUrl',
+  JS: 'js'
+};
+
+// Helper functions follow.
+
+// Copied from:
+// http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962
+// Prereq: s is a string.
+function escapeForRegexp(s) {
+  return s.replace(/([-()\[\]{}+?*.$\^|,:#<!\\])/g, '\\$1').
+           replace(/\x08/g, '\\x08');
+}
+
+
+function adjustMatcher(matcher) {
+  if (matcher === 'self') {
+    return matcher;
+  } else if (isString(matcher)) {
+    // Strings match exactly except for 2 wildcards - '*' and '**'.
+    // '*' matches any character except those from the set ':/.?&'.
+    // '**' matches any character (like .* in a RegExp).
+    // More than 2 *'s raises an error as it's ill defined.
+    if (matcher.indexOf('***') > -1) {
+      throw $sceMinErr('iwcard',
+          'Illegal sequence *** in string matcher.  String: {0}', matcher);
+    }
+    matcher = escapeForRegexp(matcher).
+                  replace('\\*\\*', '.*').
+                  replace('\\*', '[^:/.?&;]*');
+    return new RegExp('^' + matcher + '$');
+  } else if (isRegExp(matcher)) {
+    // The only other type of matcher allowed is a Regexp.
+    // Match entire URL / disallow partial matches.
+    // Flags are reset (i.e. no global, ignoreCase or multiline)
+    return new RegExp('^' + matcher.source + '$');
+  } else {
+    throw $sceMinErr('imatcher',
+        'Matchers may only be "self", string patterns or RegExp objects');
+  }
+}
+
+
+function adjustMatchers(matchers) {
+  var adjustedMatchers = [];
+  if (isDefined(matchers)) {
+    forEach(matchers, function(matcher) {
+      adjustedMatchers.push(adjustMatcher(matcher));
+    });
+  }
+  return adjustedMatchers;
+}
+
+
+/**
+ * @ngdoc service
+ * @name ng.$sceDelegate
+ * @function
+ *
+ * @description
+ *
+ * `$sceDelegate` is a service that is used by the `$sce` service to provide {@link ng.$sce Strict
+ * Contextual Escaping (SCE)} services to AngularJS.
+ *
+ * Typically, you would configure or override the {@link ng.$sceDelegate $sceDelegate} instead of
+ * the `$sce` service to customize the way Strict Contextual Escaping works in AngularJS.  This is
+ * because, while the `$sce` provides numerous shorthand methods, etc., you really only need to
+ * override 3 core functions (`trustAs`, `getTrusted` and `valueOf`) to replace the way things
+ * work because `$sce` delegates to `$sceDelegate` for these operations.
+ *
+ * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} to configure this service.
+ *
+ * The default instance of `$sceDelegate` should work out of the box with little pain.  While you
+ * can override it completely to change the behavior of `$sce`, the common case would
+ * involve configuring the {@link ng.$sceDelegateProvider $sceDelegateProvider} instead by setting
+ * your own whitelists and blacklists for trusting URLs used for loading AngularJS resources such as
+ * templates.  Refer {@link ng.$sceDelegateProvider#methods_resourceUrlWhitelist
+ * $sceDelegateProvider.resourceUrlWhitelist} and {@link
+ * ng.$sceDelegateProvider#methods_resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}
+ */
+
+/**
+ * @ngdoc object
+ * @name ng.$sceDelegateProvider
+ * @description
+ *
+ * The `$sceDelegateProvider` provider allows developers to configure the {@link ng.$sceDelegate
+ * $sceDelegate} service.  This allows one to get/set the whitelists and blacklists used to ensure
+ * that the URLs used for sourcing Angular templates are safe.  Refer {@link
+ * ng.$sceDelegateProvider#methods_resourceUrlWhitelist $sceDelegateProvider.resourceUrlWhitelist} and
+ * {@link ng.$sceDelegateProvider#methods_resourceUrlBlacklist $sceDelegateProvider.resourceUrlBlacklist}
+ *
+ * For the general details about this service in Angular, read the main page for {@link ng.$sce
+ * Strict Contextual Escaping (SCE)}.
+ *
+ * **Example**:  Consider the following case. <a name="example"></a>
+ *
+ * - your app is hosted at url `http://myapp.example.com/`
+ * - but some of your templates are hosted on other domains you control such as
+ *   `http://srv01.assets.example.com/`,  `http://srv02.assets.example.com/`, etc.
+ * - and you have an open redirect at `http://myapp.example.com/clickThru?...`.
+ *
+ * Here is what a secure configuration for this scenario might look like:
+ *
+ * <pre class="prettyprint">
+ *    angular.module('myApp', []).config(function($sceDelegateProvider) {
+ *      $sceDelegateProvider.resourceUrlWhitelist([
+ *        // Allow same origin resource loads.
+ *        'self',
+ *        // Allow loading from our assets domain.  Notice the difference between * and **.
+ *        'http://srv*.assets.example.com/**']);
+ *
+ *      // The blacklist overrides the whitelist so the open redirect here is blocked.
+ *      $sceDelegateProvider.resourceUrlBlacklist([
+ *        'http://myapp.example.com/clickThru**']);
+ *      });
+ * </pre>
+ */
+
+function $SceDelegateProvider() {
+  this.SCE_CONTEXTS = SCE_CONTEXTS;
+
+  // Resource URLs can also be trusted by policy.
+  var resourceUrlWhitelist = ['self'],
+      resourceUrlBlacklist = [];
+
+  /**
+   * @ngdoc function
+   * @name ng.sceDelegateProvider#resourceUrlWhitelist
+   * @methodOf ng.$sceDelegateProvider
+   * @function
+   *
+   * @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value
+   *     provided.  This must be an array or null.  A snapshot of this array is used so further
+   *     changes to the array are ignored.
+   *
+   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
+   *     allowed in this array.
+   *
+   *     Note: **an empty whitelist array will block all URLs**!
+   *
+   * @return {Array} the currently set whitelist array.
+   *
+   * The **default value** when no whitelist has been explicitly set is `['self']` allowing only
+   * same origin resource requests.
+   *
+   * @description
+   * Sets/Gets the whitelist of trusted resource URLs.
+   */
+  this.resourceUrlWhitelist = function (value) {
+    if (arguments.length) {
+      resourceUrlWhitelist = adjustMatchers(value);
+    }
+    return resourceUrlWhitelist;
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.sceDelegateProvider#resourceUrlBlacklist
+   * @methodOf ng.$sceDelegateProvider
+   * @function
+   *
+   * @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value
+   *     provided.  This must be an array or null.  A snapshot of this array is used so further
+   *     changes to the array are ignored.
+   *
+   *     Follow {@link ng.$sce#resourceUrlPatternItem this link} for a description of the items
+   *     allowed in this array.
+   *
+   *     The typical usage for the blacklist is to **block
+   *     [open redirects](http://cwe.mitre.org/data/definitions/601.html)** served by your domain as
+   *     these would otherwise be trusted but actually return content from the redirected domain.
+   *
+   *     Finally, **the blacklist overrides the whitelist** and has the final say.
+   *
+   * @return {Array} the currently set blacklist array.
+   *
+   * The **default value** when no whitelist has been explicitly set is the empty array (i.e. there
+   * is no blacklist.)
+   *
+   * @description
+   * Sets/Gets the blacklist of trusted resource URLs.
+   */
+
+  this.resourceUrlBlacklist = function (value) {
+    if (arguments.length) {
+      resourceUrlBlacklist = adjustMatchers(value);
+    }
+    return resourceUrlBlacklist;
+  };
+
+  this.$get = ['$injector', function($injector) {
+
+    var htmlSanitizer = function htmlSanitizer(html) {
+      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
+    };
+
+    if ($injector.has('$sanitize')) {
+      htmlSanitizer = $injector.get('$sanitize');
+    }
+
+
+    function matchUrl(matcher, parsedUrl) {
+      if (matcher === 'self') {
+        return urlIsSameOrigin(parsedUrl);
+      } else {
+        // definitely a regex.  See adjustMatchers()
+        return !!matcher.exec(parsedUrl.href);
+      }
+    }
+
+    function isResourceUrlAllowedByPolicy(url) {
+      var parsedUrl = urlResolve(url.toString());
+      var i, n, allowed = false;
+      // Ensure that at least one item from the whitelist allows this url.
+      for (i = 0, n = resourceUrlWhitelist.length; i < n; i++) {
+        if (matchUrl(resourceUrlWhitelist[i], parsedUrl)) {
+          allowed = true;
+          break;
+        }
+      }
+      if (allowed) {
+        // Ensure that no item from the blacklist blocked this url.
+        for (i = 0, n = resourceUrlBlacklist.length; i < n; i++) {
+          if (matchUrl(resourceUrlBlacklist[i], parsedUrl)) {
+            allowed = false;
+            break;
+          }
+        }
+      }
+      return allowed;
+    }
+
+    function generateHolderType(Base) {
+      var holderType = function TrustedValueHolderType(trustedValue) {
+        this.$$unwrapTrustedValue = function() {
+          return trustedValue;
+        };
+      };
+      if (Base) {
+        holderType.prototype = new Base();
+      }
+      holderType.prototype.valueOf = function sceValueOf() {
+        return this.$$unwrapTrustedValue();
+      };
+      holderType.prototype.toString = function sceToString() {
+        return this.$$unwrapTrustedValue().toString();
+      };
+      return holderType;
+    }
+
+    var trustedValueHolderBase = generateHolderType(),
+        byType = {};
+
+    byType[SCE_CONTEXTS.HTML] = generateHolderType(trustedValueHolderBase);
+    byType[SCE_CONTEXTS.CSS] = generateHolderType(trustedValueHolderBase);
+    byType[SCE_CONTEXTS.URL] = generateHolderType(trustedValueHolderBase);
+    byType[SCE_CONTEXTS.JS] = generateHolderType(trustedValueHolderBase);
+    byType[SCE_CONTEXTS.RESOURCE_URL] = generateHolderType(byType[SCE_CONTEXTS.URL]);
+
+    /**
+     * @ngdoc method
+     * @name ng.$sceDelegate#trustAs
+     * @methodOf ng.$sceDelegate
+     *
+     * @description
+     * Returns an object that is trusted by angular for use in specified strict
+     * contextual escaping contexts (such as ng-html-bind-unsafe, ng-include, any src
+     * attribute interpolation, any dom event binding attribute interpolation
+     * such as for onclick,  etc.) that uses the provided value.
+     * See {@link ng.$sce $sce} for enabling strict contextual escaping.
+     *
+     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,
+     *   resourceUrl, html, js and css.
+     * @param {*} value The value that that should be considered trusted/safe.
+     * @returns {*} A value that can be used to stand in for the provided `value` in places
+     * where Angular expects a $sce.trustAs() return value.
+     */
+    function trustAs(type, trustedValue) {
+      var Constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
+      if (!Constructor) {
+        throw $sceMinErr('icontext',
+            'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',
+            type, trustedValue);
+      }
+      if (trustedValue === null || trustedValue === undefined || trustedValue === '') {
+        return trustedValue;
+      }
+      // All the current contexts in SCE_CONTEXTS happen to be strings.  In order to avoid trusting
+      // mutable objects, we ensure here that the value passed in is actually a string.
+      if (typeof trustedValue !== 'string') {
+        throw $sceMinErr('itype',
+            'Attempted to trust a non-string value in a content requiring a string: Context: {0}',
+            type);
+      }
+      return new Constructor(trustedValue);
+    }
+
+    /**
+     * @ngdoc method
+     * @name ng.$sceDelegate#valueOf
+     * @methodOf ng.$sceDelegate
+     *
+     * @description
+     * If the passed parameter had been returned by a prior call to {@link ng.$sceDelegate#methods_trustAs
+     * `$sceDelegate.trustAs`}, returns the value that had been passed to {@link
+     * ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`}.
+     *
+     * If the passed parameter is not a value that had been returned by {@link
+     * ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`}, returns it as-is.
+     *
+     * @param {*} value The result of a prior {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`}
+     *      call or anything else.
+     * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#methods_trustAs
+     *     `$sceDelegate.trustAs`} if `value` is the result of such a call.  Otherwise, returns
+     *     `value` unchanged.
+     */
+    function valueOf(maybeTrusted) {
+      if (maybeTrusted instanceof trustedValueHolderBase) {
+        return maybeTrusted.$$unwrapTrustedValue();
+      } else {
+        return maybeTrusted;
+      }
+    }
+
+    /**
+     * @ngdoc method
+     * @name ng.$sceDelegate#getTrusted
+     * @methodOf ng.$sceDelegate
+     *
+     * @description
+     * Takes the result of a {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`} call and
+     * returns the originally supplied value if the queried context type is a supertype of the
+     * created type.  If this condition isn't satisfied, throws an exception.
+     *
+     * @param {string} type The kind of context in which this value is to be used.
+     * @param {*} maybeTrusted The result of a prior {@link ng.$sceDelegate#methods_trustAs
+     *     `$sceDelegate.trustAs`} call.
+     * @returns {*} The value the was originally provided to {@link ng.$sceDelegate#methods_trustAs
+     *     `$sceDelegate.trustAs`} if valid in this context.  Otherwise, throws an exception.
+     */
+    function getTrusted(type, maybeTrusted) {
+      if (maybeTrusted === null || maybeTrusted === undefined || maybeTrusted === '') {
+        return maybeTrusted;
+      }
+      var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
+      if (constructor && maybeTrusted instanceof constructor) {
+        return maybeTrusted.$$unwrapTrustedValue();
+      }
+      // If we get here, then we may only take one of two actions.
+      // 1. sanitize the value for the requested type, or
+      // 2. throw an exception.
+      if (type === SCE_CONTEXTS.RESOURCE_URL) {
+        if (isResourceUrlAllowedByPolicy(maybeTrusted)) {
+          return maybeTrusted;
+        } else {
+          throw $sceMinErr('insecurl',
+              'Blocked loading resource from url not allowed by $sceDelegate policy.  URL: {0}',
+              maybeTrusted.toString());
+        }
+      } else if (type === SCE_CONTEXTS.HTML) {
+        return htmlSanitizer(maybeTrusted);
+      }
+      throw $sceMinErr('unsafe', 'Attempting to use an unsafe value in a safe context.');
+    }
+
+    return { trustAs: trustAs,
+             getTrusted: getTrusted,
+             valueOf: valueOf };
+  }];
+}
+
+
+/**
+ * @ngdoc object
+ * @name ng.$sceProvider
+ * @description
+ *
+ * The $sceProvider provider allows developers to configure the {@link ng.$sce $sce} service.
+ * -   enable/disable Strict Contextual Escaping (SCE) in a module
+ * -   override the default implementation with a custom delegate
+ *
+ * Read more about {@link ng.$sce Strict Contextual Escaping (SCE)}.
+ */
+
+/* jshint maxlen: false*/
+
+/**
+ * @ngdoc service
+ * @name ng.$sce
+ * @function
+ *
+ * @description
+ *
+ * `$sce` is a service that provides Strict Contextual Escaping services to AngularJS.
+ *
+ * # Strict Contextual Escaping
+ *
+ * Strict Contextual Escaping (SCE) is a mode in which AngularJS requires bindings in certain
+ * contexts to result in a value that is marked as safe to use for that context.  One example of
+ * such a context is binding arbitrary html controlled by the user via `ng-bind-html`.  We refer
+ * to these contexts as privileged or SCE contexts.
+ *
+ * As of version 1.2, Angular ships with SCE enabled by default.
+ *
+ * Note:  When enabled (the default), IE8 in quirks mode is not supported.  In this mode, IE8 allows
+ * one to execute arbitrary javascript by the use of the expression() syntax.  Refer
+ * <http://blogs.msdn.com/b/ie/archive/2008/10/16/ending-expressions.aspx> to learn more about them.
+ * You can ensure your document is in standards mode and not quirks mode by adding `<!doctype html>`
+ * to the top of your HTML document.
+ *
+ * SCE assists in writing code in way that (a) is secure by default and (b) makes auditing for
+ * security vulnerabilities such as XSS, clickjacking, etc. a lot easier.
+ *
+ * Here's an example of a binding in a privileged context:
+ *
+ * <pre class="prettyprint">
+ *     <input ng-model="userHtml">
+ *     <div ng-bind-html="userHtml">
+ * </pre>
+ *
+ * Notice that `ng-bind-html` is bound to `userHtml` controlled by the user.  With SCE
+ * disabled, this application allows the user to render arbitrary HTML into the DIV.
+ * In a more realistic example, one may be rendering user comments, blog articles, etc. via
+ * bindings.  (HTML is just one example of a context where rendering user controlled input creates
+ * security vulnerabilities.)
+ *
+ * For the case of HTML, you might use a library, either on the client side, or on the server side,
+ * to sanitize unsafe HTML before binding to the value and rendering it in the document.
+ *
+ * How would you ensure that every place that used these types of bindings was bound to a value that
+ * was sanitized by your library (or returned as safe for rendering by your server?)  How can you
+ * ensure that you didn't accidentally delete the line that sanitized the value, or renamed some
+ * properties/fields and forgot to update the binding to the sanitized value?
+ *
+ * To be secure by default, you want to ensure that any such bindings are disallowed unless you can
+ * determine that something explicitly says it's safe to use a value for binding in that
+ * context.  You can then audit your code (a simple grep would do) to ensure that this is only done
+ * for those values that you can easily tell are safe - because they were received from your server,
+ * sanitized by your library, etc.  You can organize your codebase to help with this - perhaps
+ * allowing only the files in a specific directory to do this.  Ensuring that the internal API
+ * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.
+ *
+ * In the case of AngularJS' SCE service, one uses {@link ng.$sce#methods_trustAs $sce.trustAs} 
+ * (and shorthand methods such as {@link ng.$sce#methods_trustAsHtml $sce.trustAsHtml}, etc.) to
+ * obtain values that will be accepted by SCE / privileged contexts.
+ *
+ *
+ * ## How does it work?
+ *
+ * In privileged contexts, directives and code will bind to the result of {@link ng.$sce#methods_getTrusted
+ * $sce.getTrusted(context, value)} rather than to the value directly.  Directives use {@link
+ * ng.$sce#methods_parse $sce.parseAs} rather than `$parse` to watch attribute bindings, which performs the
+ * {@link ng.$sce#methods_getTrusted $sce.getTrusted} behind the scenes on non-constant literals.
+ *
+ * As an example, {@link ng.directive:ngBindHtml ngBindHtml} uses {@link
+ * ng.$sce#methods_parseAsHtml $sce.parseAsHtml(binding expression)}.  Here's the actual code (slightly
+ * simplified):
+ *
+ * <pre class="prettyprint">
+ *   var ngBindHtmlDirective = ['$sce', function($sce) {
+ *     return function(scope, element, attr) {
+ *       scope.$watch($sce.parseAsHtml(attr.ngBindHtml), function(value) {
+ *         element.html(value || '');
+ *       });
+ *     };
+ *   }];
+ * </pre>
+ *
+ * ## Impact on loading templates
+ *
+ * This applies both to the {@link ng.directive:ngInclude `ng-include`} directive as well as
+ * `templateUrl`'s specified by {@link guide/directive directives}.
+ *
+ * By default, Angular only loads templates from the same domain and protocol as the application
+ * document.  This is done by calling {@link ng.$sce#methods_getTrustedResourceUrl
+ * $sce.getTrustedResourceUrl} on the template URL.  To load templates from other domains and/or
+ * protocols, you may either either {@link ng.$sceDelegateProvider#methods_resourceUrlWhitelist whitelist
+ * them} or {@link ng.$sce#methods_trustAsResourceUrl wrap it} into a trusted value.
+ *
+ * *Please note*:
+ * The browser's
+ * {@link https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest
+ * Same Origin Policy} and {@link http://www.w3.org/TR/cors/ Cross-Origin Resource Sharing (CORS)}
+ * policy apply in addition to this and may further restrict whether the template is successfully
+ * loaded.  This means that without the right CORS policy, loading templates from a different domain
+ * won't work on all browsers.  Also, loading templates from `file://` URL does not work on some
+ * browsers.
+ *
+ * ## This feels like too much overhead for the developer?
+ *
+ * It's important to remember that SCE only applies to interpolation expressions.
+ *
+ * If your expressions are constant literals, they're automatically trusted and you don't need to
+ * call `$sce.trustAs` on them.  (e.g.
+ * `<div ng-html-bind-unsafe="'<b>implicitly trusted</b>'"></div>`) just works.
+ *
+ * Additionally, `a[href]` and `img[src]` automatically sanitize their URLs and do not pass them
+ * through {@link ng.$sce#methods_getTrusted $sce.getTrusted}.  SCE doesn't play a role here.
+ *
+ * The included {@link ng.$sceDelegate $sceDelegate} comes with sane defaults to allow you to load
+ * templates in `ng-include` from your application's domain without having to even know about SCE.
+ * It blocks loading templates from other domains or loading templates over http from an https
+ * served document.  You can change these by setting your own custom {@link
+ * ng.$sceDelegateProvider#methods_resourceUrlWhitelist whitelists} and {@link
+ * ng.$sceDelegateProvider#methods_resourceUrlBlacklist blacklists} for matching such URLs.
+ *
+ * This significantly reduces the overhead.  It is far easier to pay the small overhead and have an
+ * application that's secure and can be audited to verify that with much more ease than bolting
+ * security onto an application later.
+ *
+ * <a name="contexts"></a>
+ * ## What trusted context types are supported?
+ *
+ * | Context             | Notes          |
+ * |---------------------|----------------|
+ * | `$sce.HTML`         | For HTML that's safe to source into the application.  The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. |
+ * | `$sce.CSS`          | For CSS that's safe to source into the application.  Currently unused.  Feel free to use it in your own directives. |
+ * | `$sce.URL`          | For URLs that are safe to follow as links.  Currently unused (`<a href=` and `<img src=` sanitize their urls and don't consititute an SCE context. |
+ * | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contens are also safe to include in your application.  Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.)  <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |
+ * | `$sce.JS`           | For JavaScript that is safe to execute in your application's context.  Currently unused.  Feel free to use it in your own directives. |
+ *
+ * ## Format of items in {@link ng.$sceDelegateProvider#methods_resourceUrlWhitelist resourceUrlWhitelist}/{@link ng.$sceDelegateProvider#methods_resourceUrlBlacklist Blacklist} <a name="resourceUrlPatternItem"></a>
+ *
+ *  Each element in these arrays must be one of the following:
+ *
+ *  - **'self'**
+ *    - The special **string**, `'self'`, can be used to match against all URLs of the **same
+ *      domain** as the application document using the **same protocol**.
+ *  - **String** (except the special value `'self'`)
+ *    - The string is matched against the full *normalized / absolute URL* of the resource
+ *      being tested (substring matches are not good enough.)
+ *    - There are exactly **two wildcard sequences** - `*` and `**`.  All other characters
+ *      match themselves.
+ *    - `*`: matches zero or more occurances of any character other than one of the following 6
+ *      characters: '`:`', '`/`', '`.`', '`?`', '`&`' and ';'.  It's a useful wildcard for use
+ *      in a whitelist.
+ *    - `**`: matches zero or more occurances of *any* character.  As such, it's not
+ *      not appropriate to use in for a scheme, domain, etc. as it would match too much.  (e.g.
+ *      http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might
+ *      not have been the intention.)  It's usage at the very end of the path is ok.  (e.g.
+ *      http://foo.example.com/templates/**).
+ *  - **RegExp** (*see caveat below*)
+ *    - *Caveat*:  While regular expressions are powerful and offer great flexibility,  their syntax
+ *      (and all the inevitable escaping) makes them *harder to maintain*.  It's easy to
+ *      accidentally introduce a bug when one updates a complex expression (imho, all regexes should
+ *      have good test coverage.).  For instance, the use of `.` in the regex is correct only in a
+ *      small number of cases.  A `.` character in the regex used when matching the scheme or a
+ *      subdomain could be matched against a `:` or literal `.` that was likely not intended.   It
+ *      is highly recommended to use the string patterns and only fall back to regular expressions
+ *      if they as a last resort.
+ *    - The regular expression must be an instance of RegExp (i.e. not a string.)  It is
+ *      matched against the **entire** *normalized / absolute URL* of the resource being tested
+ *      (even when the RegExp did not have the `^` and `$` codes.)  In addition, any flags
+ *      present on the RegExp (such as multiline, global, ignoreCase) are ignored.
+ *    - If you are generating your Javascript from some other templating engine (not
+ *      recommended, e.g. in issue [#4006](https://github.com/angular/angular.js/issues/4006)),
+ *      remember to escape your regular expression (and be aware that you might need more than
+ *      one level of escaping depending on your templating engine and the way you interpolated
+ *      the value.)  Do make use of your platform's escaping mechanism as it might be good
+ *      enough before coding your own.  e.g. Ruby has
+ *      [Regexp.escape(str)](http://www.ruby-doc.org/core-2.0.0/Regexp.html#method-c-escape)
+ *      and Python has [re.escape](http://docs.python.org/library/re.html#re.escape).
+ *      Javascript lacks a similar built in function for escaping.  Take a look at Google
+ *      Closure library's [goog.string.regExpEscape(s)](
+ *      http://docs.closure-library.googlecode.com/git/closure_goog_string_string.js.source.html#line962).
+ *
+ * Refer {@link ng.$sceDelegateProvider $sceDelegateProvider} for an example.
+ *
+ * ## Show me an example using SCE.
+ *
+ * @example
+<example module="mySceApp">
+<file name="index.html">
+  <div ng-controller="myAppController as myCtrl">
+    <i ng-bind-html="myCtrl.explicitlyTrustedHtml" id="explicitlyTrustedHtml"></i><br><br>
+    <b>User comments</b><br>
+    By default, HTML that isn't explicitly trusted (e.g. Alice's comment) is sanitized when
+    $sanitize is available.  If $sanitize isn't available, this results in an error instead of an
+    exploit.
+    <div class="well">
+      <div ng-repeat="userComment in myCtrl.userComments">
+        <b>{{userComment.name}}</b>:
+        <span ng-bind-html="userComment.htmlComment" class="htmlComment"></span>
+        <br>
+      </div>
+    </div>
+  </div>
+</file>
+
+<file name="script.js">
+  var mySceApp = angular.module('mySceApp', ['ngSanitize']);
+
+  mySceApp.controller("myAppController", function myAppController($http, $templateCache, $sce) {
+    var self = this;
+    $http.get("test_data.json", {cache: $templateCache}).success(function(userComments) {
+      self.userComments = userComments;
+    });
+    self.explicitlyTrustedHtml = $sce.trustAsHtml(
+        '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
+        'sanitization.&quot;">Hover over this text.</span>');
+  });
+</file>
+
+<file name="test_data.json">
+[
+  { "name": "Alice",
+    "htmlComment":
+        "<span onmouseover='this.textContent=\"PWN3D!\"'>Is <i>anyone</i> reading this?</span>"
+  },
+  { "name": "Bob",
+    "htmlComment": "<i>Yes!</i>  Am I the only other one?"
+  }
+]
+</file>
+
+<file name="scenario.js">
+  describe('SCE doc demo', function() {
+    it('should sanitize untrusted values', function() {
+      expect(element('.htmlComment').html()).toBe('<span>Is <i>anyone</i> reading this?</span>');
+    });
+    it('should NOT sanitize explicitly trusted values', function() {
+      expect(element('#explicitlyTrustedHtml').html()).toBe(
+          '<span onmouseover="this.textContent=&quot;Explicitly trusted HTML bypasses ' +
+          'sanitization.&quot;">Hover over this text.</span>');
+    });
+  });
+</file>
+</example>
+ *
+ *
+ *
+ * ## Can I disable SCE completely?
+ *
+ * Yes, you can.  However, this is strongly discouraged.  SCE gives you a lot of security benefits
+ * for little coding overhead.  It will be much harder to take an SCE disabled application and
+ * either secure it on your own or enable SCE at a later stage.  It might make sense to disable SCE
+ * for cases where you have a lot of existing code that was written before SCE was introduced and
+ * you're migrating them a module at a time.
+ *
+ * That said, here's how you can completely disable SCE:
+ *
+ * <pre class="prettyprint">
+ *   angular.module('myAppWithSceDisabledmyApp', []).config(function($sceProvider) {
+ *     // Completely disable SCE.  For demonstration purposes only!
+ *     // Do not use in new projects.
+ *     $sceProvider.enabled(false);
+ *   });
+ * </pre>
+ *
+ */
+/* jshint maxlen: 100 */
+
+function $SceProvider() {
+  var enabled = true;
+
+  /**
+   * @ngdoc function
+   * @name ng.sceProvider#enabled
+   * @methodOf ng.$sceProvider
+   * @function
+   *
+   * @param {boolean=} value If provided, then enables/disables SCE.
+   * @return {boolean} true if SCE is enabled, false otherwise.
+   *
+   * @description
+   * Enables/disables SCE and returns the current value.
+   */
+  this.enabled = function (value) {
+    if (arguments.length) {
+      enabled = !!value;
+    }
+    return enabled;
+  };
+
+
+  /* Design notes on the default implementation for SCE.
+   *
+   * The API contract for the SCE delegate
+   * -------------------------------------
+   * The SCE delegate object must provide the following 3 methods:
+   *
+   * - trustAs(contextEnum, value)
+   *     This method is used to tell the SCE service that the provided value is OK to use in the
+   *     contexts specified by contextEnum.  It must return an object that will be accepted by
+   *     getTrusted() for a compatible contextEnum and return this value.
+   *
+   * - valueOf(value)
+   *     For values that were not produced by trustAs(), return them as is.  For values that were
+   *     produced by trustAs(), return the corresponding input value to trustAs.  Basically, if
+   *     trustAs is wrapping the given values into some type, this operation unwraps it when given
+   *     such a value.
+   *
+   * - getTrusted(contextEnum, value)
+   *     This function should return the a value that is safe to use in the context specified by
+   *     contextEnum or throw and exception otherwise.
+   *
+   * NOTE: This contract deliberately does NOT state that values returned by trustAs() must be
+   * opaque or wrapped in some holder object.  That happens to be an implementation detail.  For
+   * instance, an implementation could maintain a registry of all trusted objects by context.  In
+   * such a case, trustAs() would return the same object that was passed in.  getTrusted() would
+   * return the same object passed in if it was found in the registry under a compatible context or
+   * throw an exception otherwise.  An implementation might only wrap values some of the time based
+   * on some criteria.  getTrusted() might return a value and not throw an exception for special
+   * constants or objects even if not wrapped.  All such implementations fulfill this contract.
+   *
+   *
+   * A note on the inheritance model for SCE contexts
+   * ------------------------------------------------
+   * I've used inheritance and made RESOURCE_URL wrapped types a subtype of URL wrapped types.  This
+   * is purely an implementation details.
+   *
+   * The contract is simply this:
+   *
+   *     getTrusted($sce.RESOURCE_URL, value) succeeding implies that getTrusted($sce.URL, value)
+   *     will also succeed.
+   *
+   * Inheritance happens to capture this in a natural way.  In some future, we
+   * may not use inheritance anymore.  That is OK because no code outside of
+   * sce.js and sceSpecs.js would need to be aware of this detail.
+   */
+
+  this.$get = ['$parse', '$sniffer', '$sceDelegate', function(
+                $parse,   $sniffer,   $sceDelegate) {
+    // Prereq: Ensure that we're not running in IE8 quirks mode.  In that mode, IE allows
+    // the "expression(javascript expression)" syntax which is insecure.
+    if (enabled && $sniffer.msie && $sniffer.msieDocumentMode < 8) {
+      throw $sceMinErr('iequirks',
+        'Strict Contextual Escaping does not support Internet Explorer version < 9 in quirks ' +
+        'mode.  You can fix this by adding the text <!doctype html> to the top of your HTML ' +
+        'document.  See http://docs.angularjs.org/api/ng.$sce for more information.');
+    }
+
+    var sce = copy(SCE_CONTEXTS);
+
+    /**
+     * @ngdoc function
+     * @name ng.sce#isEnabled
+     * @methodOf ng.$sce
+     * @function
+     *
+     * @return {Boolean} true if SCE is enabled, false otherwise.  If you want to set the value, you
+     * have to do it at module config time on {@link ng.$sceProvider $sceProvider}.
+     *
+     * @description
+     * Returns a boolean indicating if SCE is enabled.
+     */
+    sce.isEnabled = function () {
+      return enabled;
+    };
+    sce.trustAs = $sceDelegate.trustAs;
+    sce.getTrusted = $sceDelegate.getTrusted;
+    sce.valueOf = $sceDelegate.valueOf;
+
+    if (!enabled) {
+      sce.trustAs = sce.getTrusted = function(type, value) { return value; };
+      sce.valueOf = identity;
+    }
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#parse
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Converts Angular {@link guide/expression expression} into a function.  This is like {@link
+     * ng.$parse $parse} and is identical when the expression is a literal constant.  Otherwise, it
+     * wraps the expression in a call to {@link ng.$sce#methods_getTrusted $sce.getTrusted(*type*,
+     * *result*)}
+     *
+     * @param {string} type The kind of SCE context in which this result will be used.
+     * @param {string} expression String expression to compile.
+     * @returns {function(context, locals)} a function which represents the compiled expression:
+     *
+     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
+     *      are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
+     *      `context`.
+     */
+    sce.parseAs = function sceParseAs(type, expr) {
+      var parsed = $parse(expr);
+      if (parsed.literal && parsed.constant) {
+        return parsed;
+      } else {
+        return function sceParseAsTrusted(self, locals) {
+          return sce.getTrusted(type, parsed(self, locals));
+        };
+      }
+    };
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#trustAs
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Delegates to {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs`}.  As such,
+     * returns an objectthat is trusted by angular for use in specified strict contextual
+     * escaping contexts (such as ng-html-bind-unsafe, ng-include, any src attribute
+     * interpolation, any dom event binding attribute interpolation such as for onclick,  etc.)
+     * that uses the provided value.  See * {@link ng.$sce $sce} for enabling strict contextual
+     * escaping.
+     *
+     * @param {string} type The kind of context in which this value is safe for use.  e.g. url,
+     *   resource_url, html, js and css.
+     * @param {*} value The value that that should be considered trusted/safe.
+     * @returns {*} A value that can be used to stand in for the provided `value` in places
+     * where Angular expects a $sce.trustAs() return value.
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#trustAsHtml
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.trustAsHtml(value)` →
+     *     {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs($sce.HTML, value)`}
+     *
+     * @param {*} value The value to trustAs.
+     * @returns {*} An object that can be passed to {@link ng.$sce#methods_getTrustedHtml
+     *     $sce.getTrustedHtml(value)} to obtain the original value.  (privileged directives
+     *     only accept expressions that are either literal constants or are the
+     *     return value of {@link ng.$sce#methods_trustAs $sce.trustAs}.)
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#trustAsUrl
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.trustAsUrl(value)` →
+     *     {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs($sce.URL, value)`}
+     *
+     * @param {*} value The value to trustAs.
+     * @returns {*} An object that can be passed to {@link ng.$sce#methods_getTrustedUrl
+     *     $sce.getTrustedUrl(value)} to obtain the original value.  (privileged directives
+     *     only accept expressions that are either literal constants or are the
+     *     return value of {@link ng.$sce#methods_trustAs $sce.trustAs}.)
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#trustAsResourceUrl
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.trustAsResourceUrl(value)` →
+     *     {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs($sce.RESOURCE_URL, value)`}
+     *
+     * @param {*} value The value to trustAs.
+     * @returns {*} An object that can be passed to {@link ng.$sce#methods_getTrustedResourceUrl
+     *     $sce.getTrustedResourceUrl(value)} to obtain the original value.  (privileged directives
+     *     only accept expressions that are either literal constants or are the return
+     *     value of {@link ng.$sce#methods_trustAs $sce.trustAs}.)
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#trustAsJs
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.trustAsJs(value)` →
+     *     {@link ng.$sceDelegate#methods_trustAs `$sceDelegate.trustAs($sce.JS, value)`}
+     *
+     * @param {*} value The value to trustAs.
+     * @returns {*} An object that can be passed to {@link ng.$sce#methods_getTrustedJs
+     *     $sce.getTrustedJs(value)} to obtain the original value.  (privileged directives
+     *     only accept expressions that are either literal constants or are the
+     *     return value of {@link ng.$sce#methods_trustAs $sce.trustAs}.)
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#getTrusted
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Delegates to {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted`}.  As such,
+     * takes the result of a {@link ng.$sce#methods_trustAs `$sce.trustAs`}() call and returns the
+     * originally supplied value if the queried context type is a supertype of the created type.
+     * If this condition isn't satisfied, throws an exception.
+     *
+     * @param {string} type The kind of context in which this value is to be used.
+     * @param {*} maybeTrusted The result of a prior {@link ng.$sce#methods_trustAs `$sce.trustAs`}
+     *                         call.
+     * @returns {*} The value the was originally provided to
+     *              {@link ng.$sce#methods_trustAs `$sce.trustAs`} if valid in this context.
+     *              Otherwise, throws an exception.
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#getTrustedHtml
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.getTrustedHtml(value)` →
+     *     {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.HTML, value)`}
+     *
+     * @param {*} value The value to pass to `$sce.getTrusted`.
+     * @returns {*} The return value of `$sce.getTrusted($sce.HTML, value)`
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#getTrustedCss
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.getTrustedCss(value)` →
+     *     {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.CSS, value)`}
+     *
+     * @param {*} value The value to pass to `$sce.getTrusted`.
+     * @returns {*} The return value of `$sce.getTrusted($sce.CSS, value)`
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#getTrustedUrl
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.getTrustedUrl(value)` →
+     *     {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.URL, value)`}
+     *
+     * @param {*} value The value to pass to `$sce.getTrusted`.
+     * @returns {*} The return value of `$sce.getTrusted($sce.URL, value)`
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#getTrustedResourceUrl
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.getTrustedResourceUrl(value)` →
+     *     {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.RESOURCE_URL, value)`}
+     *
+     * @param {*} value The value to pass to `$sceDelegate.getTrusted`.
+     * @returns {*} The return value of `$sce.getTrusted($sce.RESOURCE_URL, value)`
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#getTrustedJs
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.getTrustedJs(value)` →
+     *     {@link ng.$sceDelegate#methods_getTrusted `$sceDelegate.getTrusted($sce.JS, value)`}
+     *
+     * @param {*} value The value to pass to `$sce.getTrusted`.
+     * @returns {*} The return value of `$sce.getTrusted($sce.JS, value)`
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#parseAsHtml
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.parseAsHtml(expression string)` →
+     *     {@link ng.$sce#methods_parse `$sce.parseAs($sce.HTML, value)`}
+     *
+     * @param {string} expression String expression to compile.
+     * @returns {function(context, locals)} a function which represents the compiled expression:
+     *
+     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
+     *      are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
+     *      `context`.
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#parseAsCss
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.parseAsCss(value)` →
+     *     {@link ng.$sce#methods_parse `$sce.parseAs($sce.CSS, value)`}
+     *
+     * @param {string} expression String expression to compile.
+     * @returns {function(context, locals)} a function which represents the compiled expression:
+     *
+     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
+     *      are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
+     *      `context`.
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#parseAsUrl
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.parseAsUrl(value)` →
+     *     {@link ng.$sce#methods_parse `$sce.parseAs($sce.URL, value)`}
+     *
+     * @param {string} expression String expression to compile.
+     * @returns {function(context, locals)} a function which represents the compiled expression:
+     *
+     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
+     *      are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
+     *      `context`.
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#parseAsResourceUrl
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.parseAsResourceUrl(value)` →
+     *     {@link ng.$sce#methods_parse `$sce.parseAs($sce.RESOURCE_URL, value)`}
+     *
+     * @param {string} expression String expression to compile.
+     * @returns {function(context, locals)} a function which represents the compiled expression:
+     *
+     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
+     *      are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
+     *      `context`.
+     */
+
+    /**
+     * @ngdoc method
+     * @name ng.$sce#parseAsJs
+     * @methodOf ng.$sce
+     *
+     * @description
+     * Shorthand method.  `$sce.parseAsJs(value)` →
+     *     {@link ng.$sce#methods_parse `$sce.parseAs($sce.JS, value)`}
+     *
+     * @param {string} expression String expression to compile.
+     * @returns {function(context, locals)} a function which represents the compiled expression:
+     *
+     *    * `context` – `{object}` – an object against which any expressions embedded in the strings
+     *      are evaluated against (typically a scope object).
+     *    * `locals` – `{object=}` – local variables context object, useful for overriding values in
+     *      `context`.
+     */
+
+    // Shorthand delegations.
+    var parse = sce.parseAs,
+        getTrusted = sce.getTrusted,
+        trustAs = sce.trustAs;
+
+    forEach(SCE_CONTEXTS, function (enumValue, name) {
+      var lName = lowercase(name);
+      sce[camelCase("parse_as_" + lName)] = function (expr) {
+        return parse(enumValue, expr);
+      };
+      sce[camelCase("get_trusted_" + lName)] = function (value) {
+        return getTrusted(enumValue, value);
+      };
+      sce[camelCase("trust_as_" + lName)] = function (value) {
+        return trustAs(enumValue, value);
+      };
+    });
+
+    return sce;
+  }];
+}
+
+/**
+ * !!! This is an undocumented "private" service !!!
+ *
+ * @name ng.$sniffer
+ * @requires $window
+ * @requires $document
+ *
+ * @property {boolean} history Does the browser support html5 history api ?
+ * @property {boolean} hashchange Does the browser support hashchange event ?
+ * @property {boolean} transitions Does the browser support CSS transition events ?
+ * @property {boolean} animations Does the browser support CSS animation events ?
+ *
+ * @description
+ * This is very simple implementation of testing browser's features.
+ */
+function $SnifferProvider() {
+  this.$get = ['$window', '$document', function($window, $document) {
+    var eventSupport = {},
+        android =
+          int((/android (\d+)/.exec(lowercase(($window.navigator || {}).userAgent)) || [])[1]),
+        boxee = /Boxee/i.test(($window.navigator || {}).userAgent),
+        document = $document[0] || {},
+        documentMode = document.documentMode,
+        vendorPrefix,
+        vendorRegex = /^(Moz|webkit|O|ms)(?=[A-Z])/,
+        bodyStyle = document.body && document.body.style,
+        transitions = false,
+        animations = false,
+        match;
+
+    if (bodyStyle) {
+      for(var prop in bodyStyle) {
+        if(match = vendorRegex.exec(prop)) {
+          vendorPrefix = match[0];
+          vendorPrefix = vendorPrefix.substr(0, 1).toUpperCase() + vendorPrefix.substr(1);
+          break;
+        }
+      }
+
+      if(!vendorPrefix) {
+        vendorPrefix = ('WebkitOpacity' in bodyStyle) && 'webkit';
+      }
+
+      transitions = !!(('transition' in bodyStyle) || (vendorPrefix + 'Transition' in bodyStyle));
+      animations  = !!(('animation' in bodyStyle) || (vendorPrefix + 'Animation' in bodyStyle));
+
+      if (android && (!transitions||!animations)) {
+        transitions = isString(document.body.style.webkitTransition);
+        animations = isString(document.body.style.webkitAnimation);
+      }
+    }
+
+
+    return {
+      // Android has history.pushState, but it does not update location correctly
+      // so let's not use the history API at all.
+      // http://code.google.com/p/android/issues/detail?id=17471
+      // https://github.com/angular/angular.js/issues/904
+
+      // older webit browser (533.9) on Boxee box has exactly the same problem as Android has
+      // so let's not use the history API also
+      // We are purposefully using `!(android < 4)` to cover the case when `android` is undefined
+      // jshint -W018
+      history: !!($window.history && $window.history.pushState && !(android < 4) && !boxee),
+      // jshint +W018
+      hashchange: 'onhashchange' in $window &&
+                  // IE8 compatible mode lies
+                  (!documentMode || documentMode > 7),
+      hasEvent: function(event) {
+        // IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have
+        // it. In particular the event is not fired when backspace or delete key are pressed or
+        // when cut operation is performed.
+        if (event == 'input' && msie == 9) return false;
+
+        if (isUndefined(eventSupport[event])) {
+          var divElm = document.createElement('div');
+          eventSupport[event] = 'on' + event in divElm;
+        }
+
+        return eventSupport[event];
+      },
+      csp: csp(),
+      vendorPrefix: vendorPrefix,
+      transitions : transitions,
+      animations : animations,
+      msie : msie,
+      msieDocumentMode: documentMode
+    };
+  }];
+}
+
+function $TimeoutProvider() {
+  this.$get = ['$rootScope', '$browser', '$q', '$exceptionHandler',
+       function($rootScope,   $browser,   $q,   $exceptionHandler) {
+    var deferreds = {};
+
+
+     /**
+      * @ngdoc function
+      * @name ng.$timeout
+      * @requires $browser
+      *
+      * @description
+      * Angular's wrapper for `window.setTimeout`. The `fn` function is wrapped into a try/catch
+      * block and delegates any exceptions to
+      * {@link ng.$exceptionHandler $exceptionHandler} service.
+      *
+      * The return value of registering a timeout function is a promise, which will be resolved when
+      * the timeout is reached and the timeout function is executed.
+      *
+      * To cancel a timeout request, call `$timeout.cancel(promise)`.
+      *
+      * In tests you can use {@link ngMock.$timeout `$timeout.flush()`} to
+      * synchronously flush the queue of deferred functions.
+      *
+      * @param {function()} fn A function, whose execution should be delayed.
+      * @param {number=} [delay=0] Delay in milliseconds.
+      * @param {boolean=} [invokeApply=true] If set to `false` skips model dirty checking, otherwise
+      *   will invoke `fn` within the {@link ng.$rootScope.Scope#methods_$apply $apply} block.
+      * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this
+      *   promise will be resolved with is the return value of the `fn` function.
+      * 
+      * @example
+      <doc:example module="time">
+        <doc:source>
+          <script>
+            function Ctrl2($scope,$timeout) {
+              $scope.format = 'M/d/yy h:mm:ss a';
+              $scope.blood_1 = 100;
+              $scope.blood_2 = 120;
+
+              var stop;
+              $scope.fight = function() {
+                stop = $timeout(function() {
+                  if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
+                      $scope.blood_1 = $scope.blood_1 - 3;
+                      $scope.blood_2 = $scope.blood_2 - 4;
+                      $scope.fight();
+                  } else {
+                      $timeout.cancel(stop);
+                  }
+                }, 100);
+              };
+
+              $scope.stopFight = function() {
+                $timeout.cancel(stop);
+              };
+
+              $scope.resetFight = function() {
+                $scope.blood_1 = 100;
+                $scope.blood_2 = 120;
+              }
+            }
+
+            angular.module('time', [])
+              // Register the 'myCurrentTime' directive factory method.
+              // We inject $timeout and dateFilter service since the factory method is DI.
+              .directive('myCurrentTime', function($timeout, dateFilter) {
+                // return the directive link function. (compile function not needed)
+                return function(scope, element, attrs) {
+                  var format,  // date format
+                  timeoutId; // timeoutId, so that we can cancel the time updates
+
+                  // used to update the UI
+                  function updateTime() {
+                    element.text(dateFilter(new Date(), format));
+                  }
+
+                  // watch the expression, and update the UI on change.
+                  scope.$watch(attrs.myCurrentTime, function(value) {
+                    format = value;
+                    updateTime();
+                  });
+
+                  // schedule update in one second
+                  function updateLater() {
+                    // save the timeoutId for canceling
+                    timeoutId = $timeout(function() {
+                      updateTime(); // update DOM
+                      updateLater(); // schedule another update
+                    }, 1000);
+                  }
+
+                  // listen on DOM destroy (removal) event, and cancel the next UI update
+                  // to prevent updating time ofter the DOM element was removed.
+                  element.bind('$destroy', function() {
+                    $timeout.cancel(timeoutId);
+                  });
+
+                  updateLater(); // kick off the UI update process.
+                }
+              });
+          </script>
+
+          <div>
+            <div ng-controller="Ctrl2">
+              Date format: <input ng-model="format"> <hr/>
+              Current time is: <span my-current-time="format"></span>
+              <hr/>
+              Blood 1 : <font color='red'>{{blood_1}}</font>
+              Blood 2 : <font color='red'>{{blood_2}}</font>
+              <button type="button" data-ng-click="fight()">Fight</button>
+              <button type="button" data-ng-click="stopFight()">StopFight</button>
+              <button type="button" data-ng-click="resetFight()">resetFight</button>
+            </div>
+          </div>
+
+        </doc:source>
+      </doc:example>
+      */
+    function timeout(fn, delay, invokeApply) {
+      var deferred = $q.defer(),
+          promise = deferred.promise,
+          skipApply = (isDefined(invokeApply) && !invokeApply),
+          timeoutId;
+
+      timeoutId = $browser.defer(function() {
+        try {
+          deferred.resolve(fn());
+        } catch(e) {
+          deferred.reject(e);
+          $exceptionHandler(e);
+        }
+        finally {
+          delete deferreds[promise.$$timeoutId];
+        }
+
+        if (!skipApply) $rootScope.$apply();
+      }, delay);
+
+      promise.$$timeoutId = timeoutId;
+      deferreds[timeoutId] = deferred;
+
+      return promise;
+    }
+
+
+     /**
+      * @ngdoc function
+      * @name ng.$timeout#cancel
+      * @methodOf ng.$timeout
+      *
+      * @description
+      * Cancels a task associated with the `promise`. As a result of this, the promise will be
+      * resolved with a rejection.
+      *
+      * @param {Promise=} promise Promise returned by the `$timeout` function.
+      * @returns {boolean} Returns `true` if the task hasn't executed yet and was successfully
+      *   canceled.
+      */
+    timeout.cancel = function(promise) {
+      if (promise && promise.$$timeoutId in deferreds) {
+        deferreds[promise.$$timeoutId].reject('canceled');
+        delete deferreds[promise.$$timeoutId];
+        return $browser.defer.cancel(promise.$$timeoutId);
+      }
+      return false;
+    };
+
+    return timeout;
+  }];
+}
+
+// NOTE:  The usage of window and document instead of $window and $document here is
+// deliberate.  This service depends on the specific behavior of anchor nodes created by the
+// browser (resolving and parsing URLs) that is unlikely to be provided by mock objects and
+// cause us to break tests.  In addition, when the browser resolves a URL for XHR, it
+// doesn't know about mocked locations and resolves URLs to the real document - which is
+// exactly the behavior needed here.  There is little value is mocking these out for this
+// service.
+var urlParsingNode = document.createElement("a");
+var originUrl = urlResolve(window.location.href, true);
+
+
+/**
+ *
+ * Implementation Notes for non-IE browsers
+ * ----------------------------------------
+ * Assigning a URL to the href property of an anchor DOM node, even one attached to the DOM,
+ * results both in the normalizing and parsing of the URL.  Normalizing means that a relative
+ * URL will be resolved into an absolute URL in the context of the application document.
+ * Parsing means that the anchor node's host, hostname, protocol, port, pathname and related
+ * properties are all populated to reflect the normalized URL.  This approach has wide
+ * compatibility - Safari 1+, Mozilla 1+, Opera 7+,e etc.  See
+ * http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
+ *
+ * Implementation Notes for IE
+ * ---------------------------
+ * IE >= 8 and <= 10 normalizes the URL when assigned to the anchor node similar to the other
+ * browsers.  However, the parsed components will not be set if the URL assigned did not specify
+ * them.  (e.g. if you assign a.href = "foo", then a.protocol, a.host, etc. will be empty.)  We
+ * work around that by performing the parsing in a 2nd step by taking a previously normalized
+ * URL (e.g. by assigning to a.href) and assigning it a.href again.  This correctly populates the
+ * properties such as protocol, hostname, port, etc.
+ *
+ * IE7 does not normalize the URL when assigned to an anchor node.  (Apparently, it does, if one
+ * uses the inner HTML approach to assign the URL as part of an HTML snippet -
+ * http://stackoverflow.com/a/472729)  However, setting img[src] does normalize the URL.
+ * Unfortunately, setting img[src] to something like "javascript:foo" on IE throws an exception.
+ * Since the primary usage for normalizing URLs is to sanitize such URLs, we can't use that
+ * method and IE < 8 is unsupported.
+ *
+ * References:
+ *   http://developer.mozilla.org/en-US/docs/Web/API/HTMLAnchorElement
+ *   http://www.aptana.com/reference/html/api/HTMLAnchorElement.html
+ *   http://url.spec.whatwg.org/#urlutils
+ *   https://github.com/angular/angular.js/pull/2902
+ *   http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
+ *
+ * @function
+ * @param {string} url The URL to be parsed.
+ * @description Normalizes and parses a URL.
+ * @returns {object} Returns the normalized URL as a dictionary.
+ *
+ *   | member name   | Description    |
+ *   |---------------|----------------|
+ *   | href          | A normalized version of the provided URL if it was not an absolute URL |
+ *   | protocol      | The protocol including the trailing colon                              |
+ *   | host          | The host and port (if the port is non-default) of the normalizedUrl    |
+ *   | search        | The search params, minus the question mark                             |
+ *   | hash          | The hash string, minus the hash symbol
+ *   | hostname      | The hostname
+ *   | port          | The port, without ":"
+ *   | pathname      | The pathname, beginning with "/"
+ *
+ */
+function urlResolve(url, base) {
+  var href = url;
+
+  if (msie) {
+    // Normalize before parse.  Refer Implementation Notes on why this is
+    // done in two steps on IE.
+    urlParsingNode.setAttribute("href", href);
+    href = urlParsingNode.href;
+  }
+
+  urlParsingNode.setAttribute('href', href);
+
+  // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
+  return {
+    href: urlParsingNode.href,
+    protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
+    host: urlParsingNode.host,
+    search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
+    hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
+    hostname: urlParsingNode.hostname,
+    port: urlParsingNode.port,
+    pathname: (urlParsingNode.pathname.charAt(0) === '/')
+      ? urlParsingNode.pathname
+      : '/' + urlParsingNode.pathname
+  };
+}
+
+/**
+ * Parse a request URL and determine whether this is a same-origin request as the application document.
+ *
+ * @param {string|object} requestUrl The url of the request as a string that will be resolved
+ * or a parsed URL object.
+ * @returns {boolean} Whether the request is for the same origin as the application document.
+ */
+function urlIsSameOrigin(requestUrl) {
+  var parsed = (isString(requestUrl)) ? urlResolve(requestUrl) : requestUrl;
+  return (parsed.protocol === originUrl.protocol &&
+          parsed.host === originUrl.host);
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$window
+ *
+ * @description
+ * A reference to the browser's `window` object. While `window`
+ * is globally available in JavaScript, it causes testability problems, because
+ * it is a global variable. In angular we always refer to it through the
+ * `$window` service, so it may be overridden, removed or mocked for testing.
+ *
+ * Expressions, like the one defined for the `ngClick` directive in the example
+ * below, are evaluated with respect to the current scope.  Therefore, there is
+ * no risk of inadvertently coding in a dependency on a global value in such an
+ * expression.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope, $window) {
+           $scope.greeting = 'Hello, World!';
+           $scope.doGreeting = function(greeting) {
+               $window.alert(greeting);
+           };
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         <input type="text" ng-model="greeting" />
+         <button ng-click="doGreeting(greeting)">ALERT</button>
+       </div>
+     </doc:source>
+     <doc:scenario>
+      it('should display the greeting in the input box', function() {
+       input('greeting').enter('Hello, E2E Tests');
+       // If we click the button it will block the test runner
+       // element(':button').click();
+      });
+     </doc:scenario>
+   </doc:example>
+ */
+function $WindowProvider(){
+  this.$get = valueFn(window);
+}
+
+/**
+ * @ngdoc object
+ * @name ng.$filterProvider
+ * @description
+ *
+ * Filters are just functions which transform input to an output. However filters need to be
+ * Dependency Injected. To achieve this a filter definition consists of a factory function which is
+ * annotated with dependencies and is responsible for creating a filter function.
+ *
+ * <pre>
+ *   // Filter registration
+ *   function MyModule($provide, $filterProvider) {
+ *     // create a service to demonstrate injection (not always needed)
+ *     $provide.value('greet', function(name){
+ *       return 'Hello ' + name + '!';
+ *     });
+ *
+ *     // register a filter factory which uses the
+ *     // greet service to demonstrate DI.
+ *     $filterProvider.register('greet', function(greet){
+ *       // return the filter function which uses the greet service
+ *       // to generate salutation
+ *       return function(text) {
+ *         // filters need to be forgiving so check input validity
+ *         return text && greet(text) || text;
+ *       };
+ *     });
+ *   }
+ * </pre>
+ *
+ * The filter function is registered with the `$injector` under the filter name suffix with
+ * `Filter`.
+ * 
+ * <pre>
+ *   it('should be the same instance', inject(
+ *     function($filterProvider) {
+ *       $filterProvider.register('reverse', function(){
+ *         return ...;
+ *       });
+ *     },
+ *     function($filter, reverseFilter) {
+ *       expect($filter('reverse')).toBe(reverseFilter);
+ *     });
+ * </pre>
+ *
+ *
+ * For more information about how angular filters work, and how to create your own filters, see
+ * {@link guide/filter Filters} in the Angular Developer Guide.
+ */
+/**
+ * @ngdoc method
+ * @name ng.$filterProvider#register
+ * @methodOf ng.$filterProvider
+ * @description
+ * Register filter factory function.
+ *
+ * @param {String} name Name of the filter.
+ * @param {function} fn The filter factory function which is injectable.
+ */
+
+
+/**
+ * @ngdoc function
+ * @name ng.$filter
+ * @function
+ * @description
+ * Filters are used for formatting data displayed to the user.
+ *
+ * The general syntax in templates is as follows:
+ *
+ *         {{ expression [| filter_name[:parameter_value] ... ] }}
+ *
+ * @param {String} name Name of the filter function to retrieve
+ * @return {Function} the filter function
+ */
+$FilterProvider.$inject = ['$provide'];
+function $FilterProvider($provide) {
+  var suffix = 'Filter';
+
+  /**
+   * @ngdoc function
+   * @name ng.$controllerProvider#register
+   * @methodOf ng.$controllerProvider
+   * @param {string|Object} name Name of the filter function, or an object map of filters where
+   *    the keys are the filter names and the values are the filter factories.
+   * @returns {Object} Registered filter instance, or if a map of filters was provided then a map
+   *    of the registered filter instances.
+   */
+  function register(name, factory) {
+    if(isObject(name)) {
+      var filters = {};
+      forEach(name, function(filter, key) {
+        filters[key] = register(key, filter);
+      });
+      return filters;
+    } else {
+      return $provide.factory(name + suffix, factory);
+    }
+  }
+  this.register = register;
+
+  this.$get = ['$injector', function($injector) {
+    return function(name) {
+      return $injector.get(name + suffix);
+    };
+  }];
+
+  ////////////////////////////////////////
+  
+  /* global
+    currencyFilter: false,
+    dateFilter: false,
+    filterFilter: false,
+    jsonFilter: false,
+    limitToFilter: false,
+    lowercaseFilter: false,
+    numberFilter: false,
+    orderByFilter: false,
+    uppercaseFilter: false,
+  */
+
+  register('currency', currencyFilter);
+  register('date', dateFilter);
+  register('filter', filterFilter);
+  register('json', jsonFilter);
+  register('limitTo', limitToFilter);
+  register('lowercase', lowercaseFilter);
+  register('number', numberFilter);
+  register('orderBy', orderByFilter);
+  register('uppercase', uppercaseFilter);
+}
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:filter
+ * @function
+ *
+ * @description
+ * Selects a subset of items from `array` and returns it as a new array.
+ *
+ * @param {Array} array The source array.
+ * @param {string|Object|function()} expression The predicate to be used for selecting items from
+ *   `array`.
+ *
+ *   Can be one of:
+ *
+ *   - `string`: Predicate that results in a substring match using the value of `expression`
+ *     string. All strings or objects with string properties in `array` that contain this string
+ *     will be returned. The predicate can be negated by prefixing the string with `!`.
+ *
+ *   - `Object`: A pattern object can be used to filter specific properties on objects contained
+ *     by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items
+ *     which have property `name` containing "M" and property `phone` containing "1". A special
+ *     property name `$` can be used (as in `{$:"text"}`) to accept a match against any
+ *     property of the object. That's equivalent to the simple substring match with a `string`
+ *     as described above.
+ *
+ *   - `function`: A predicate function can be used to write arbitrary filters. The function is
+ *     called for each element of `array`. The final result is an array of those elements that
+ *     the predicate returned true for.
+ *
+ * @param {function(expected, actual)|true|undefined} comparator Comparator which is used in
+ *     determining if the expected value (from the filter expression) and actual value (from
+ *     the object in the array) should be considered a match.
+ *
+ *   Can be one of:
+ *
+ *     - `function(expected, actual)`:
+ *       The function will be given the object value and the predicate value to compare and
+ *       should return true if the item should be included in filtered result.
+ *
+ *     - `true`: A shorthand for `function(expected, actual) { return angular.equals(expected, actual)}`.
+ *       this is essentially strict comparison of expected and actual.
+ *
+ *     - `false|undefined`: A short hand for a function which will look for a substring match in case
+ *       insensitive way.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <div ng-init="friends = [{name:'John', phone:'555-1276'},
+                                {name:'Mary', phone:'800-BIG-MARY'},
+                                {name:'Mike', phone:'555-4321'},
+                                {name:'Adam', phone:'555-5678'},
+                                {name:'Julie', phone:'555-8765'},
+                                {name:'Juliette', phone:'555-5678'}]"></div>
+
+       Search: <input ng-model="searchText">
+       <table id="searchTextResults">
+         <tr><th>Name</th><th>Phone</th></tr>
+         <tr ng-repeat="friend in friends | filter:searchText">
+           <td>{{friend.name}}</td>
+           <td>{{friend.phone}}</td>
+         </tr>
+       </table>
+       <hr>
+       Any: <input ng-model="search.$"> <br>
+       Name only <input ng-model="search.name"><br>
+       Phone only <input ng-model="search.phone"><br>
+       Equality <input type="checkbox" ng-model="strict"><br>
+       <table id="searchObjResults">
+         <tr><th>Name</th><th>Phone</th></tr>
+         <tr ng-repeat="friend in friends | filter:search:strict">
+           <td>{{friend.name}}</td>
+           <td>{{friend.phone}}</td>
+         </tr>
+       </table>
+     </doc:source>
+     <doc:scenario>
+       it('should search across all fields when filtering with a string', function() {
+         input('searchText').enter('m');
+         expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')).
+           toEqual(['Mary', 'Mike', 'Adam']);
+
+         input('searchText').enter('76');
+         expect(repeater('#searchTextResults tr', 'friend in friends').column('friend.name')).
+           toEqual(['John', 'Julie']);
+       });
+
+       it('should search in specific fields when filtering with a predicate object', function() {
+         input('search.$').enter('i');
+         expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')).
+           toEqual(['Mary', 'Mike', 'Julie', 'Juliette']);
+       });
+       it('should use a equal comparison when comparator is true', function() {
+         input('search.name').enter('Julie');
+         input('strict').check();
+         expect(repeater('#searchObjResults tr', 'friend in friends').column('friend.name')).
+           toEqual(['Julie']);
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+function filterFilter() {
+  return function(array, expression, comparator) {
+    if (!isArray(array)) return array;
+
+    var comparatorType = typeof(comparator),
+        predicates = [];
+
+    predicates.check = function(value) {
+      for (var j = 0; j < predicates.length; j++) {
+        if(!predicates[j](value)) {
+          return false;
+        }
+      }
+      return true;
+    };
+
+    if (comparatorType !== 'function') {
+      if (comparatorType === 'boolean' && comparator) {
+        comparator = function(obj, text) {
+          return angular.equals(obj, text);
+        };
+      } else {
+        comparator = function(obj, text) {
+          text = (''+text).toLowerCase();
+          return (''+obj).toLowerCase().indexOf(text) > -1;
+        };
+      }
+    }
+
+    var search = function(obj, text){
+      if (typeof text == 'string' && text.charAt(0) === '!') {
+        return !search(obj, text.substr(1));
+      }
+      switch (typeof obj) {
+        case "boolean":
+        case "number":
+        case "string":
+          return comparator(obj, text);
+        case "object":
+          switch (typeof text) {
+            case "object":
+              return comparator(obj, text);
+            default:
+              for ( var objKey in obj) {
+                if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
+                  return true;
+                }
+              }
+              break;
+          }
+          return false;
+        case "array":
+          for ( var i = 0; i < obj.length; i++) {
+            if (search(obj[i], text)) {
+              return true;
+            }
+          }
+          return false;
+        default:
+          return false;
+      }
+    };
+    switch (typeof expression) {
+      case "boolean":
+      case "number":
+      case "string":
+        // Set up expression object and fall through
+        expression = {$:expression};
+        // jshint -W086
+      case "object":
+        // jshint +W086
+        for (var key_4 in expression) {
+          if (key_4 == '$') {
+            (function() {
+              if (!expression[key_4]) return;
+              var path = key_4;
+              predicates.push(function(value) {
+                return search(value, expression[path]);
+              });
+            })();
+          } else {
+            (function() {
+              if (typeof(expression[key_4]) == 'undefined') { return; }
+              var path = key_4;
+              predicates.push(function(value) {
+                return search(getter(value,path), expression[path]);
+              });
+            })();
+          }
+        }
+        break;
+      case 'function':
+        predicates.push(expression);
+        break;
+      default:
+        return array;
+    }
+    var filtered = [];
+    for ( var j = 0; j < array.length; j++) {
+      var value = array[j];
+      if (predicates.check(value)) {
+        filtered.push(value);
+      }
+    }
+    return filtered;
+  };
+}
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:currency
+ * @function
+ *
+ * @description
+ * Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default
+ * symbol for current locale is used.
+ *
+ * @param {number} amount Input to filter.
+ * @param {string=} symbol Currency symbol or identifier to be displayed.
+ * @returns {string} Formatted number.
+ *
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.amount = 1234.56;
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         <input type="number" ng-model="amount"> <br>
+         default currency symbol ($): {{amount | currency}}<br>
+         custom currency identifier (USD$): {{amount | currency:"USD$"}}
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should init with 1234.56', function() {
+         expect(binding('amount | currency')).toBe('$1,234.56');
+         expect(binding('amount | currency:"USD$"')).toBe('USD$1,234.56');
+       });
+       it('should update', function() {
+         input('amount').enter('-1234');
+         expect(binding('amount | currency')).toBe('($1,234.00)');
+         expect(binding('amount | currency:"USD$"')).toBe('(USD$1,234.00)');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+currencyFilter.$inject = ['$locale'];
+function currencyFilter($locale) {
+  var formats = $locale.NUMBER_FORMATS;
+  return function(amount, currencySymbol){
+    if (isUndefined(currencySymbol)) currencySymbol = formats.CURRENCY_SYM;
+    return formatNumber(amount, formats.PATTERNS[1], formats.GROUP_SEP, formats.DECIMAL_SEP, 2).
+                replace(/\u00A4/g, currencySymbol);
+  };
+}
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:number
+ * @function
+ *
+ * @description
+ * Formats a number as text.
+ *
+ * If the input is not a number an empty string is returned.
+ *
+ * @param {number|string} number Number to format.
+ * @param {(number|string)=} fractionSize Number of decimal places to round the number to.
+ * If this is not provided then the fraction size is computed from the current locale's number
+ * formatting pattern. In the case of the default locale, it will be 3.
+ * @returns {string} Number rounded to decimalPlaces and places a “,” after each third digit.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.val = 1234.56789;
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         Enter number: <input ng-model='val'><br>
+         Default formatting: {{val | number}}<br>
+         No fractions: {{val | number:0}}<br>
+         Negative number: {{-val | number:4}}
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should format numbers', function() {
+         expect(binding('val | number')).toBe('1,234.568');
+         expect(binding('val | number:0')).toBe('1,235');
+         expect(binding('-val | number:4')).toBe('-1,234.5679');
+       });
+
+       it('should update', function() {
+         input('val').enter('3374.333');
+         expect(binding('val | number')).toBe('3,374.333');
+         expect(binding('val | number:0')).toBe('3,374');
+         expect(binding('-val | number:4')).toBe('-3,374.3330');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+
+
+numberFilter.$inject = ['$locale'];
+function numberFilter($locale) {
+  var formats = $locale.NUMBER_FORMATS;
+  return function(number, fractionSize) {
+    return formatNumber(number, formats.PATTERNS[0], formats.GROUP_SEP, formats.DECIMAL_SEP,
+      fractionSize);
+  };
+}
+
+var DECIMAL_SEP = '.';
+function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
+  if (isNaN(number) || !isFinite(number)) return '';
+
+  var isNegative = number < 0;
+  number = Math.abs(number);
+  var numStr = number + '',
+      formatedText = '',
+      parts = [];
+
+  var hasExponent = false;
+  if (numStr.indexOf('e') !== -1) {
+    var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
+    if (match && match[2] == '-' && match[3] > fractionSize + 1) {
+      numStr = '0';
+    } else {
+      formatedText = numStr;
+      hasExponent = true;
+    }
+  }
+
+  if (!hasExponent) {
+    var fractionLen = (numStr.split(DECIMAL_SEP)[1] || '').length;
+
+    // determine fractionSize if it is not specified
+    if (isUndefined(fractionSize)) {
+      fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);
+    }
+
+    var pow = Math.pow(10, fractionSize);
+    number = Math.round(number * pow) / pow;
+    var fraction = ('' + number).split(DECIMAL_SEP);
+    var whole = fraction[0];
+    fraction = fraction[1] || '';
+
+    var i, pos = 0,
+        lgroup = pattern.lgSize,
+        group = pattern.gSize;
+
+    if (whole.length >= (lgroup + group)) {
+      pos = whole.length - lgroup;
+      for (i = 0; i < pos; i++) {
+        if ((pos - i)%group === 0 && i !== 0) {
+          formatedText += groupSep;
+        }
+        formatedText += whole.charAt(i);
+      }
+    }
+
+    for (i = pos; i < whole.length; i++) {
+      if ((whole.length - i)%lgroup === 0 && i !== 0) {
+        formatedText += groupSep;
+      }
+      formatedText += whole.charAt(i);
+    }
+
+    // format fraction part.
+    while(fraction.length < fractionSize) {
+      fraction += '0';
+    }
+
+    if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
+  } else {
+
+    if (fractionSize > 0 && number > -1 && number < 1) {
+      formatedText = number.toFixed(fractionSize);
+    }
+  }
+
+  parts.push(isNegative ? pattern.negPre : pattern.posPre);
+  parts.push(formatedText);
+  parts.push(isNegative ? pattern.negSuf : pattern.posSuf);
+  return parts.join('');
+}
+
+function padNumber(num, digits, trim) {
+  var neg = '';
+  if (num < 0) {
+    neg =  '-';
+    num = -num;
+  }
+  num = '' + num;
+  while(num.length < digits) num = '0' + num;
+  if (trim)
+    num = num.substr(num.length - digits);
+  return neg + num;
+}
+
+
+function dateGetter(name, size, offset, trim) {
+  offset = offset || 0;
+  return function(date) {
+    var value = date['get' + name]();
+    if (offset > 0 || value > -offset)
+      value += offset;
+    if (value === 0 && offset == -12 ) value = 12;
+    return padNumber(value, size, trim);
+  };
+}
+
+function dateStrGetter(name, shortForm) {
+  return function(date, formats) {
+    var value = date['get' + name]();
+    var get = uppercase(shortForm ? ('SHORT' + name) : name);
+
+    return formats[get][value];
+  };
+}
+
+function timeZoneGetter(date) {
+  var zone = -1 * date.getTimezoneOffset();
+  var paddedZone = (zone >= 0) ? "+" : "";
+
+  paddedZone += padNumber(Math[zone > 0 ? 'floor' : 'ceil'](zone / 60), 2) +
+                padNumber(Math.abs(zone % 60), 2);
+
+  return paddedZone;
+}
+
+function ampmGetter(date, formats) {
+  return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];
+}
+
+var DATE_FORMATS = {
+  yyyy: dateGetter('FullYear', 4),
+    yy: dateGetter('FullYear', 2, 0, true),
+     y: dateGetter('FullYear', 1),
+  MMMM: dateStrGetter('Month'),
+   MMM: dateStrGetter('Month', true),
+    MM: dateGetter('Month', 2, 1),
+     M: dateGetter('Month', 1, 1),
+    dd: dateGetter('Date', 2),
+     d: dateGetter('Date', 1),
+    HH: dateGetter('Hours', 2),
+     H: dateGetter('Hours', 1),
+    hh: dateGetter('Hours', 2, -12),
+     h: dateGetter('Hours', 1, -12),
+    mm: dateGetter('Minutes', 2),
+     m: dateGetter('Minutes', 1),
+    ss: dateGetter('Seconds', 2),
+     s: dateGetter('Seconds', 1),
+     // while ISO 8601 requires fractions to be prefixed with `.` or `,`
+     // we can be just safely rely on using `sss` since we currently don't support single or two digit fractions
+   sss: dateGetter('Milliseconds', 3),
+  EEEE: dateStrGetter('Day'),
+   EEE: dateStrGetter('Day', true),
+     a: ampmGetter,
+     Z: timeZoneGetter
+};
+
+var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z))(.*)/,
+    NUMBER_STRING = /^\-?\d+$/;
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:date
+ * @function
+ *
+ * @description
+ *   Formats `date` to a string based on the requested `format`.
+ *
+ *   `format` string can be composed of the following elements:
+ *
+ *   * `'yyyy'`: 4 digit representation of year (e.g. AD 1 => 0001, AD 2010 => 2010)
+ *   * `'yy'`: 2 digit representation of year, padded (00-99). (e.g. AD 2001 => 01, AD 2010 => 10)
+ *   * `'y'`: 1 digit representation of year, e.g. (AD 1 => 1, AD 199 => 199)
+ *   * `'MMMM'`: Month in year (January-December)
+ *   * `'MMM'`: Month in year (Jan-Dec)
+ *   * `'MM'`: Month in year, padded (01-12)
+ *   * `'M'`: Month in year (1-12)
+ *   * `'dd'`: Day in month, padded (01-31)
+ *   * `'d'`: Day in month (1-31)
+ *   * `'EEEE'`: Day in Week,(Sunday-Saturday)
+ *   * `'EEE'`: Day in Week, (Sun-Sat)
+ *   * `'HH'`: Hour in day, padded (00-23)
+ *   * `'H'`: Hour in day (0-23)
+ *   * `'hh'`: Hour in am/pm, padded (01-12)
+ *   * `'h'`: Hour in am/pm, (1-12)
+ *   * `'mm'`: Minute in hour, padded (00-59)
+ *   * `'m'`: Minute in hour (0-59)
+ *   * `'ss'`: Second in minute, padded (00-59)
+ *   * `'s'`: Second in minute (0-59)
+ *   * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)
+ *   * `'a'`: am/pm marker
+ *   * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)
+ *
+ *   `format` string can also be one of the following predefined
+ *   {@link guide/i18n localizable formats}:
+ *
+ *   * `'medium'`: equivalent to `'MMM d, y h:mm:ss a'` for en_US locale
+ *     (e.g. Sep 3, 2010 12:05:08 pm)
+ *   * `'short'`: equivalent to `'M/d/yy h:mm a'` for en_US  locale (e.g. 9/3/10 12:05 pm)
+ *   * `'fullDate'`: equivalent to `'EEEE, MMMM d,y'` for en_US  locale
+ *     (e.g. Friday, September 3, 2010)
+ *   * `'longDate'`: equivalent to `'MMMM d, y'` for en_US  locale (e.g. September 3, 2010)
+ *   * `'mediumDate'`: equivalent to `'MMM d, y'` for en_US  locale (e.g. Sep 3, 2010)
+ *   * `'shortDate'`: equivalent to `'M/d/yy'` for en_US locale (e.g. 9/3/10)
+ *   * `'mediumTime'`: equivalent to `'h:mm:ss a'` for en_US locale (e.g. 12:05:08 pm)
+ *   * `'shortTime'`: equivalent to `'h:mm a'` for en_US locale (e.g. 12:05 pm)
+ *
+ *   `format` string can contain literal values. These need to be quoted with single quotes (e.g.
+ *   `"h 'in the morning'"`). In order to output single quote, use two single quotes in a sequence
+ *   (e.g. `"h 'o''clock'"`).
+ *
+ * @param {(Date|number|string)} date Date to format either as Date object, milliseconds (string or
+ *    number) or various ISO 8601 datetime string formats (e.g. yyyy-MM-ddTHH:mm:ss.SSSZ and its
+ *    shorter versions like yyyy-MM-ddTHH:mmZ, yyyy-MM-dd or yyyyMMddTHHmmssZ). If no timezone is
+ *    specified in the string input, the time is considered to be in the local timezone.
+ * @param {string=} format Formatting rules (see Description). If not specified,
+ *    `mediumDate` is used.
+ * @returns {string} Formatted string or the input if input is not recognized as date/millis.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <span ng-non-bindable>{{1288323623006 | date:'medium'}}</span>:
+           {{1288323623006 | date:'medium'}}<br>
+       <span ng-non-bindable>{{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}</span>:
+          {{1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'}}<br>
+       <span ng-non-bindable>{{1288323623006 | date:'MM/dd/yyyy @ h:mma'}}</span>:
+          {{'1288323623006' | date:'MM/dd/yyyy @ h:mma'}}<br>
+     </doc:source>
+     <doc:scenario>
+       it('should format date', function() {
+         expect(binding("1288323623006 | date:'medium'")).
+            toMatch(/Oct 2\d, 2010 \d{1,2}:\d{2}:\d{2} (AM|PM)/);
+         expect(binding("1288323623006 | date:'yyyy-MM-dd HH:mm:ss Z'")).
+            toMatch(/2010\-10\-2\d \d{2}:\d{2}:\d{2} (\-|\+)?\d{4}/);
+         expect(binding("'1288323623006' | date:'MM/dd/yyyy @ h:mma'")).
+            toMatch(/10\/2\d\/2010 @ \d{1,2}:\d{2}(AM|PM)/);
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+dateFilter.$inject = ['$locale'];
+function dateFilter($locale) {
+
+
+  var R_ISO8601_STR = /^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
+                     // 1        2       3         4          5          6          7          8  9     10      11
+  function jsonStringToDate(string) {
+    var match;
+    if (match = string.match(R_ISO8601_STR)) {
+      var date = new Date(0),
+          tzHour = 0,
+          tzMin  = 0,
+          dateSetter = match[8] ? date.setUTCFullYear : date.setFullYear,
+          timeSetter = match[8] ? date.setUTCHours : date.setHours;
+
+      if (match[9]) {
+        tzHour = int(match[9] + match[10]);
+        tzMin = int(match[9] + match[11]);
+      }
+      dateSetter.call(date, int(match[1]), int(match[2]) - 1, int(match[3]));
+      var h = int(match[4]||0) - tzHour;
+      var m = int(match[5]||0) - tzMin;
+      var s = int(match[6]||0);
+      var ms = Math.round(parseFloat('0.' + (match[7]||0)) * 1000);
+      timeSetter.call(date, h, m, s, ms);
+      return date;
+    }
+    return string;
+  }
+
+
+  return function(date, format) {
+    var text = '',
+        parts = [],
+        fn, match;
+
+    format = format || 'mediumDate';
+    format = $locale.DATETIME_FORMATS[format] || format;
+    if (isString(date)) {
+      if (NUMBER_STRING.test(date)) {
+        date = int(date);
+      } else {
+        date = jsonStringToDate(date);
+      }
+    }
+
+    if (isNumber(date)) {
+      date = new Date(date);
+    }
+
+    if (!isDate(date)) {
+      return date;
+    }
+
+    while(format) {
+      match = DATE_FORMATS_SPLIT.exec(format);
+      if (match) {
+        parts = concat(parts, match, 1);
+        format = parts.pop();
+      } else {
+        parts.push(format);
+        format = null;
+      }
+    }
+
+    forEach(parts, function(value){
+      fn = DATE_FORMATS[value];
+      text += fn ? fn(date, $locale.DATETIME_FORMATS)
+                 : value.replace(/(^'|'$)/g, '').replace(/''/g, "'");
+    });
+
+    return text;
+  };
+}
+
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:json
+ * @function
+ *
+ * @description
+ *   Allows you to convert a JavaScript object into JSON string.
+ *
+ *   This filter is mostly useful for debugging. When using the double curly {{value}} notation
+ *   the binding is automatically converted to JSON.
+ *
+ * @param {*} object Any JavaScript object (including arrays and primitive types) to filter.
+ * @returns {string} JSON string.
+ *
+ *
+ * @example:
+   <doc:example>
+     <doc:source>
+       <pre>{{ {'name':'value'} | json }}</pre>
+     </doc:source>
+     <doc:scenario>
+       it('should jsonify filtered objects', function() {
+         expect(binding("{'name':'value'}")).toMatch(/\{\n  "name": ?"value"\n}/);
+       });
+     </doc:scenario>
+   </doc:example>
+ *
+ */
+function jsonFilter() {
+  return function(object) {
+    return toJson(object, true);
+  };
+}
+
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:lowercase
+ * @function
+ * @description
+ * Converts string to lowercase.
+ * @see angular.lowercase
+ */
+var lowercaseFilter = valueFn(lowercase);
+
+
+/**
+ * @ngdoc filter
+ * @name ng.filter:uppercase
+ * @function
+ * @description
+ * Converts string to uppercase.
+ * @see angular.uppercase
+ */
+var uppercaseFilter = valueFn(uppercase);
+
+/**
+ * @ngdoc function
+ * @name ng.filter:limitTo
+ * @function
+ *
+ * @description
+ * Creates a new array or string containing only a specified number of elements. The elements
+ * are taken from either the beginning or the end of the source array or string, as specified by
+ * the value and sign (positive or negative) of `limit`.
+ *
+ * @param {Array|string} input Source array or string to be limited.
+ * @param {string|number} limit The length of the returned array or string. If the `limit` number 
+ *     is positive, `limit` number of items from the beginning of the source array/string are copied.
+ *     If the number is negative, `limit` number  of items from the end of the source array/string 
+ *     are copied. The `limit` will be trimmed if it exceeds `array.length`
+ * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array
+ *     had less than `limit` elements.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.numbers = [1,2,3,4,5,6,7,8,9];
+           $scope.letters = "abcdefghi";
+           $scope.numLimit = 3;
+           $scope.letterLimit = 3;
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         Limit {{numbers}} to: <input type="integer" ng-model="numLimit">
+         <p>Output numbers: {{ numbers | limitTo:numLimit }}</p>
+         Limit {{letters}} to: <input type="integer" ng-model="letterLimit">
+         <p>Output letters: {{ letters | limitTo:letterLimit }}</p>
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should limit the number array to first three items', function() {
+         expect(element('.doc-example-live input[ng-model=numLimit]').val()).toBe('3');
+         expect(element('.doc-example-live input[ng-model=letterLimit]').val()).toBe('3');
+         expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3]');
+         expect(binding('letters | limitTo:letterLimit')).toEqual('abc');
+       });
+
+       it('should update the output when -3 is entered', function() {
+         input('numLimit').enter(-3);
+         input('letterLimit').enter(-3);
+         expect(binding('numbers | limitTo:numLimit')).toEqual('[7,8,9]');
+         expect(binding('letters | limitTo:letterLimit')).toEqual('ghi');
+       });
+
+       it('should not exceed the maximum size of input array', function() {
+         input('numLimit').enter(100);
+         input('letterLimit').enter(100);
+         expect(binding('numbers | limitTo:numLimit')).toEqual('[1,2,3,4,5,6,7,8,9]');
+         expect(binding('letters | limitTo:letterLimit')).toEqual('abcdefghi');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+function limitToFilter(){
+  return function(input, limit) {
+    if (!isArray(input) && !isString(input)) return input;
+    
+    limit = int(limit);
+
+    if (isString(input)) {
+      //NaN check on limit
+      if (limit) {
+        return limit >= 0 ? input.slice(0, limit) : input.slice(limit, input.length);
+      } else {
+        return "";
+      }
+    }
+
+    var out = [],
+      i, n;
+
+    // if abs(limit) exceeds maximum length, trim it
+    if (limit > input.length)
+      limit = input.length;
+    else if (limit < -input.length)
+      limit = -input.length;
+
+    if (limit > 0) {
+      i = 0;
+      n = limit;
+    } else {
+      i = input.length + limit;
+      n = input.length;
+    }
+
+    for (; i<n; i++) {
+      out.push(input[i]);
+    }
+
+    return out;
+  };
+}
+
+/**
+ * @ngdoc function
+ * @name ng.filter:orderBy
+ * @function
+ *
+ * @description
+ * Orders a specified `array` by the `expression` predicate.
+ *
+ * @param {Array} array The array to sort.
+ * @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be
+ *    used by the comparator to determine the order of elements.
+ *
+ *    Can be one of:
+ *
+ *    - `function`: Getter function. The result of this function will be sorted using the
+ *      `<`, `=`, `>` operator.
+ *    - `string`: An Angular expression which evaluates to an object to order by, such as 'name'
+ *      to sort by a property called 'name'. Optionally prefixed with `+` or `-` to control
+ *      ascending or descending sort order (for example, +name or -name).
+ *    - `Array`: An array of function or string predicates. The first predicate in the array
+ *      is used for sorting, but when two items are equivalent, the next predicate is used.
+ *
+ * @param {boolean=} reverse Reverse the order the array.
+ * @returns {Array} Sorted copy of the source array.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.friends =
+               [{name:'John', phone:'555-1212', age:10},
+                {name:'Mary', phone:'555-9876', age:19},
+                {name:'Mike', phone:'555-4321', age:21},
+                {name:'Adam', phone:'555-5678', age:35},
+                {name:'Julie', phone:'555-8765', age:29}]
+           $scope.predicate = '-age';
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         <pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
+         <hr/>
+         [ <a href="" ng-click="predicate=''">unsorted</a> ]
+         <table class="friend">
+           <tr>
+             <th><a href="" ng-click="predicate = 'name'; reverse=false">Name</a>
+                 (<a href="" ng-click="predicate = '-name'; reverse=false">^</a>)</th>
+             <th><a href="" ng-click="predicate = 'phone'; reverse=!reverse">Phone Number</a></th>
+             <th><a href="" ng-click="predicate = 'age'; reverse=!reverse">Age</a></th>
+           </tr>
+           <tr ng-repeat="friend in friends | orderBy:predicate:reverse">
+             <td>{{friend.name}}</td>
+             <td>{{friend.phone}}</td>
+             <td>{{friend.age}}</td>
+           </tr>
+         </table>
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should be reverse ordered by aged', function() {
+         expect(binding('predicate')).toBe('-age');
+         expect(repeater('table.friend', 'friend in friends').column('friend.age')).
+           toEqual(['35', '29', '21', '19', '10']);
+         expect(repeater('table.friend', 'friend in friends').column('friend.name')).
+           toEqual(['Adam', 'Julie', 'Mike', 'Mary', 'John']);
+       });
+
+       it('should reorder the table when user selects different predicate', function() {
+         element('.doc-example-live a:contains("Name")').click();
+         expect(repeater('table.friend', 'friend in friends').column('friend.name')).
+           toEqual(['Adam', 'John', 'Julie', 'Mary', 'Mike']);
+         expect(repeater('table.friend', 'friend in friends').column('friend.age')).
+           toEqual(['35', '10', '29', '19', '21']);
+
+         element('.doc-example-live a:contains("Phone")').click();
+         expect(repeater('table.friend', 'friend in friends').column('friend.phone')).
+           toEqual(['555-9876', '555-8765', '555-5678', '555-4321', '555-1212']);
+         expect(repeater('table.friend', 'friend in friends').column('friend.name')).
+           toEqual(['Mary', 'Julie', 'Adam', 'Mike', 'John']);
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+orderByFilter.$inject = ['$parse'];
+function orderByFilter($parse){
+  return function(array, sortPredicate, reverseOrder) {
+    if (!isArray(array)) return array;
+    if (!sortPredicate) return array;
+    sortPredicate = isArray(sortPredicate) ? sortPredicate: [sortPredicate];
+    sortPredicate = map(sortPredicate, function(predicate){
+      var descending = false, get = predicate || identity;
+      if (isString(predicate)) {
+        if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {
+          descending = predicate.charAt(0) == '-';
+          predicate = predicate.substring(1);
+        }
+        get = $parse(predicate);
+      }
+      return reverseComparator(function(a,b){
+        return compare(get(a),get(b));
+      }, descending);
+    });
+    var arrayCopy = [];
+    for ( var i = 0; i < array.length; i++) { arrayCopy.push(array[i]); }
+    return arrayCopy.sort(reverseComparator(comparator, reverseOrder));
+
+    function comparator(o1, o2){
+      for ( var i = 0; i < sortPredicate.length; i++) {
+        var comp = sortPredicate[i](o1, o2);
+        if (comp !== 0) return comp;
+      }
+      return 0;
+    }
+    function reverseComparator(comp, descending) {
+      return toBoolean(descending)
+          ? function(a,b){return comp(b,a);}
+          : comp;
+    }
+    function compare(v1, v2){
+      var t1 = typeof v1;
+      var t2 = typeof v2;
+      if (t1 == t2) {
+        if (t1 == "string") {
+           v1 = v1.toLowerCase();
+           v2 = v2.toLowerCase();
+        }
+        if (v1 === v2) return 0;
+        return v1 < v2 ? -1 : 1;
+      } else {
+        return t1 < t2 ? -1 : 1;
+      }
+    }
+  };
+}
+
+function ngDirective(directive) {
+  if (isFunction(directive)) {
+    directive = {
+      link: directive
+    };
+  }
+  directive.restrict = directive.restrict || 'AC';
+  return valueFn(directive);
+}
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:a
+ * @restrict E
+ *
+ * @description
+ * Modifies the default behavior of the html A tag so that the default action is prevented when
+ * the href attribute is empty.
+ *
+ * This change permits the easy creation of action links with the `ngClick` directive
+ * without changing the location or causing page reloads, e.g.:
+ * `<a href="" ng-click="list.addItem()">Add Item</a>`
+ */
+var htmlAnchorDirective = valueFn({
+  restrict: 'E',
+  compile: function(element, attr) {
+
+    if (msie <= 8) {
+
+      // turn <a href ng-click="..">link</a> into a stylable link in IE
+      // but only if it doesn't have name attribute, in which case it's an anchor
+      if (!attr.href && !attr.name) {
+        attr.$set('href', '');
+      }
+
+      // add a comment node to anchors to workaround IE bug that causes element content to be reset
+      // to new attribute content if attribute is updated with value containing @ and element also
+      // contains value with @
+      // see issue #1949
+      element.append(document.createComment('IE fix'));
+    }
+
+    if (!attr.href && !attr.name) {
+      return function(scope, element) {
+        element.on('click', function(event){
+          // if we have no href url, then don't navigate anywhere.
+          if (!element.attr('href')) {
+            event.preventDefault();
+          }
+        });
+      };
+    }
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngHref
+ * @restrict A
+ *
+ * @description
+ * Using Angular markup like `{{hash}}` in an href attribute will
+ * make the link go to the wrong URL if the user clicks it before
+ * Angular has a chance to replace the `{{hash}}` markup with its
+ * value. Until Angular replaces the markup the link will be broken
+ * and will most likely return a 404 error.
+ *
+ * The `ngHref` directive solves this problem.
+ *
+ * The wrong way to write it:
+ * <pre>
+ * <a href="http://www.gravatar.com/avatar/{{hash}}"/>
+ * </pre>
+ *
+ * The correct way to write it:
+ * <pre>
+ * <a ng-href="http://www.gravatar.com/avatar/{{hash}}"/>
+ * </pre>
+ *
+ * @element A
+ * @param {template} ngHref any string which can contain `{{}}` markup.
+ *
+ * @example
+ * This example shows various combinations of `href`, `ng-href` and `ng-click` attributes
+ * in links and their different behaviors:
+    <doc:example>
+      <doc:source>
+        <input ng-model="value" /><br />
+        <a id="link-1" href ng-click="value = 1">link 1</a> (link, don't reload)<br />
+        <a id="link-2" href="" ng-click="value = 2">link 2</a> (link, don't reload)<br />
+        <a id="link-3" ng-href="/{{'123'}}">link 3</a> (link, reload!)<br />
+        <a id="link-4" href="" name="xx" ng-click="value = 4">anchor</a> (link, don't reload)<br />
+        <a id="link-5" name="xxx" ng-click="value = 5">anchor</a> (no link)<br />
+        <a id="link-6" ng-href="{{value}}">link</a> (link, change location)
+      </doc:source>
+      <doc:scenario>
+        it('should execute ng-click but not reload when href without value', function() {
+          element('#link-1').click();
+          expect(input('value').val()).toEqual('1');
+          expect(element('#link-1').attr('href')).toBe("");
+        });
+
+        it('should execute ng-click but not reload when href empty string', function() {
+          element('#link-2').click();
+          expect(input('value').val()).toEqual('2');
+          expect(element('#link-2').attr('href')).toBe("");
+        });
+
+        it('should execute ng-click and change url when ng-href specified', function() {
+          expect(element('#link-3').attr('href')).toBe("/123");
+
+          element('#link-3').click();
+          expect(browser().window().path()).toEqual('/123');
+        });
+
+        it('should execute ng-click but not reload when href empty string and name specified', function() {
+          element('#link-4').click();
+          expect(input('value').val()).toEqual('4');
+          expect(element('#link-4').attr('href')).toBe('');
+        });
+
+        it('should execute ng-click but not reload when no href but name specified', function() {
+          element('#link-5').click();
+          expect(input('value').val()).toEqual('5');
+          expect(element('#link-5').attr('href')).toBe(undefined);
+        });
+
+        it('should only change url when only ng-href', function() {
+          input('value').enter('6');
+          expect(element('#link-6').attr('href')).toBe('6');
+
+          element('#link-6').click();
+          expect(browser().location().url()).toEqual('/6');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSrc
+ * @restrict A
+ *
+ * @description
+ * Using Angular markup like `{{hash}}` in a `src` attribute doesn't
+ * work right: The browser will fetch from the URL with the literal
+ * text `{{hash}}` until Angular replaces the expression inside
+ * `{{hash}}`. The `ngSrc` directive solves this problem.
+ *
+ * The buggy way to write it:
+ * <pre>
+ * <img src="http://www.gravatar.com/avatar/{{hash}}"/>
+ * </pre>
+ *
+ * The correct way to write it:
+ * <pre>
+ * <img ng-src="http://www.gravatar.com/avatar/{{hash}}"/>
+ * </pre>
+ *
+ * @element IMG
+ * @param {template} ngSrc any string which can contain `{{}}` markup.
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSrcset
+ * @restrict A
+ *
+ * @description
+ * Using Angular markup like `{{hash}}` in a `srcset` attribute doesn't
+ * work right: The browser will fetch from the URL with the literal
+ * text `{{hash}}` until Angular replaces the expression inside
+ * `{{hash}}`. The `ngSrcset` directive solves this problem.
+ *
+ * The buggy way to write it:
+ * <pre>
+ * <img srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/>
+ * </pre>
+ *
+ * The correct way to write it:
+ * <pre>
+ * <img ng-srcset="http://www.gravatar.com/avatar/{{hash}} 2x"/>
+ * </pre>
+ *
+ * @element IMG
+ * @param {template} ngSrcset any string which can contain `{{}}` markup.
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngDisabled
+ * @restrict A
+ *
+ * @description
+ *
+ * The following markup will make the button enabled on Chrome/Firefox but not on IE8 and older IEs:
+ * <pre>
+ * <div ng-init="scope = { isDisabled: false }">
+ *  <button disabled="{{scope.isDisabled}}">Disabled</button>
+ * </div>
+ * </pre>
+ *
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as disabled. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngDisabled` directive solves this problem for the `disabled` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        Click me to toggle: <input type="checkbox" ng-model="checked"><br/>
+        <button ng-model="button" ng-disabled="checked">Button</button>
+      </doc:source>
+      <doc:scenario>
+        it('should toggle button', function() {
+          expect(element('.doc-example-live :button').prop('disabled')).toBeFalsy();
+          input('checked').check();
+          expect(element('.doc-example-live :button').prop('disabled')).toBeTruthy();
+        });
+      </doc:scenario>
+    </doc:example>
+ *
+ * @element INPUT
+ * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, 
+ *     then special attribute "disabled" will be set on the element
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngChecked
+ * @restrict A
+ *
+ * @description
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as checked. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngChecked` directive solves this problem for the `checked` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+ * @example
+    <doc:example>
+      <doc:source>
+        Check me to check both: <input type="checkbox" ng-model="master"><br/>
+        <input id="checkSlave" type="checkbox" ng-checked="master">
+      </doc:source>
+      <doc:scenario>
+        it('should check both checkBoxes', function() {
+          expect(element('.doc-example-live #checkSlave').prop('checked')).toBeFalsy();
+          input('master').check();
+          expect(element('.doc-example-live #checkSlave').prop('checked')).toBeTruthy();
+        });
+      </doc:scenario>
+    </doc:example>
+ *
+ * @element INPUT
+ * @param {expression} ngChecked If the {@link guide/expression expression} is truthy, 
+ *     then special attribute "checked" will be set on the element
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngReadonly
+ * @restrict A
+ *
+ * @description
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as readonly. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngReadonly` directive solves this problem for the `readonly` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+
+ * @example
+    <doc:example>
+      <doc:source>
+        Check me to make text readonly: <input type="checkbox" ng-model="checked"><br/>
+        <input type="text" ng-readonly="checked" value="I'm Angular"/>
+      </doc:source>
+      <doc:scenario>
+        it('should toggle readonly attr', function() {
+          expect(element('.doc-example-live :text').prop('readonly')).toBeFalsy();
+          input('checked').check();
+          expect(element('.doc-example-live :text').prop('readonly')).toBeTruthy();
+        });
+      </doc:scenario>
+    </doc:example>
+ *
+ * @element INPUT
+ * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, 
+ *     then special attribute "readonly" will be set on the element
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSelected
+ * @restrict A
+ *
+ * @description
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as selected. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngSelected` directive solves this problem for the `selected` atttribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+ * @example
+    <doc:example>
+      <doc:source>
+        Check me to select: <input type="checkbox" ng-model="selected"><br/>
+        <select>
+          <option>Hello!</option>
+          <option id="greet" ng-selected="selected">Greetings!</option>
+        </select>
+      </doc:source>
+      <doc:scenario>
+        it('should select Greetings!', function() {
+          expect(element('.doc-example-live #greet').prop('selected')).toBeFalsy();
+          input('selected').check();
+          expect(element('.doc-example-live #greet').prop('selected')).toBeTruthy();
+        });
+      </doc:scenario>
+    </doc:example>
+ *
+ * @element OPTION
+ * @param {expression} ngSelected If the {@link guide/expression expression} is truthy, 
+ *     then special attribute "selected" will be set on the element
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngOpen
+ * @restrict A
+ *
+ * @description
+ * The HTML specification does not require browsers to preserve the values of boolean attributes
+ * such as open. (Their presence means true and their absence means false.)
+ * If we put an Angular interpolation expression into such an attribute then the
+ * binding information would be lost when the browser removes the attribute.
+ * The `ngOpen` directive solves this problem for the `open` attribute.
+ * This complementary directive is not removed by the browser and so provides
+ * a permanent reliable place to store the binding information.
+
+ *
+ * @example
+     <doc:example>
+       <doc:source>
+         Check me check multiple: <input type="checkbox" ng-model="open"><br/>
+         <details id="details" ng-open="open">
+            <summary>Show/Hide me</summary>
+         </details>
+       </doc:source>
+       <doc:scenario>
+         it('should toggle open', function() {
+           expect(element('#details').prop('open')).toBeFalsy();
+           input('open').check();
+           expect(element('#details').prop('open')).toBeTruthy();
+         });
+       </doc:scenario>
+     </doc:example>
+ *
+ * @element DETAILS
+ * @param {expression} ngOpen If the {@link guide/expression expression} is truthy, 
+ *     then special attribute "open" will be set on the element
+ */
+
+var ngAttributeAliasDirectives = {};
+
+
+// boolean attrs are evaluated
+forEach(BOOLEAN_ATTR, function(propName, attrName) {
+  // binding to multiple is not supported
+  if (propName == "multiple") return;
+
+  var normalized = directiveNormalize('ng-' + attrName);
+  ngAttributeAliasDirectives[normalized] = function() {
+    return {
+      priority: 100,
+      compile: function() {
+        return function(scope, element, attr) {
+          scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {
+            attr.$set(attrName, !!value);
+          });
+        };
+      }
+    };
+  };
+});
+
+
+// ng-src, ng-srcset, ng-href are interpolated
+forEach(['src', 'srcset', 'href'], function(attrName) {
+  var normalized = directiveNormalize('ng-' + attrName);
+  ngAttributeAliasDirectives[normalized] = function() {
+    return {
+      priority: 99, // it needs to run after the attributes are interpolated
+      link: function(scope, element, attr) {
+        attr.$observe(normalized, function(value) {
+          if (!value)
+             return;
+
+          attr.$set(attrName, value);
+
+          // on IE, if "ng:src" directive declaration is used and "src" attribute doesn't exist
+          // then calling element.setAttribute('src', 'foo') doesn't do anything, so we need
+          // to set the property as well to achieve the desired effect.
+          // we use attr[attrName] value since $set can sanitize the url.
+          if (msie) element.prop(attrName, attr[attrName]);
+        });
+      }
+    };
+  };
+});
+
+/* global -nullFormCtrl */
+var nullFormCtrl = {
+  $addControl: noop,
+  $removeControl: noop,
+  $setValidity: noop,
+  $setDirty: noop,
+  $setPristine: noop
+};
+
+/**
+ * @ngdoc object
+ * @name ng.directive:form.FormController
+ *
+ * @property {boolean} $pristine True if user has not interacted with the form yet.
+ * @property {boolean} $dirty True if user has already interacted with the form.
+ * @property {boolean} $valid True if all of the containing forms and controls are valid.
+ * @property {boolean} $invalid True if at least one containing control or form is invalid.
+ *
+ * @property {Object} $error Is an object hash, containing references to all invalid controls or
+ *  forms, where:
+ *
+ *  - keys are validation tokens (error names),
+ *  - values are arrays of controls or forms that are invalid for given error name.
+ *
+ *
+ *  Built-in validation tokens:
+ *
+ *  - `email`
+ *  - `max`
+ *  - `maxlength`
+ *  - `min`
+ *  - `minlength`
+ *  - `number`
+ *  - `pattern`
+ *  - `required`
+ *  - `url`
+ * 
+ * @description
+ * `FormController` keeps track of all its controls and nested forms as well as state of them,
+ * such as being valid/invalid or dirty/pristine.
+ *
+ * Each {@link ng.directive:form form} directive creates an instance
+ * of `FormController`.
+ *
+ */
+//asks for $scope to fool the BC controller module
+FormController.$inject = ['$element', '$attrs', '$scope'];
+function FormController(element, attrs) {
+  var form = this,
+      parentForm = element.parent().controller('form') || nullFormCtrl,
+      invalidCount = 0, // used to easily determine if we are valid
+      errors = form.$error = {},
+      controls = [];
+
+  // init state
+  form.$name = attrs.name || attrs.ngForm;
+  form.$dirty = false;
+  form.$pristine = true;
+  form.$valid = true;
+  form.$invalid = false;
+
+  parentForm.$addControl(form);
+
+  // Setup initial state of the control
+  element.addClass(PRISTINE_CLASS);
+  toggleValidCss(true);
+
+  // convenience method for easy toggling of classes
+  function toggleValidCss(isValid, validationErrorKey) {
+    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
+    element.
+      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).
+      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
+  }
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$addControl
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Register a control with the form.
+   *
+   * Input elements using ngModelController do this automatically when they are linked.
+   */
+  form.$addControl = function(control) {
+    // Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
+    // and not added to the scope.  Now we throw an error.
+    assertNotHasOwnProperty(control.$name, 'input');
+    controls.push(control);
+
+    if (control.$name) {
+      form[control.$name] = control;
+    }
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$removeControl
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Deregister a control from the form.
+   *
+   * Input elements using ngModelController do this automatically when they are destroyed.
+   */
+  form.$removeControl = function(control) {
+    if (control.$name && form[control.$name] === control) {
+      delete form[control.$name];
+    }
+    forEach(errors, function(queue, validationToken) {
+      form.$setValidity(validationToken, true, control);
+    });
+
+    arrayRemove(controls, control);
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$setValidity
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Sets the validity of a form control.
+   *
+   * This method will also propagate to parent forms.
+   */
+  form.$setValidity = function(validationToken, isValid, control) {
+    var queue = errors[validationToken];
+
+    if (isValid) {
+      if (queue) {
+        arrayRemove(queue, control);
+        if (!queue.length) {
+          invalidCount--;
+          if (!invalidCount) {
+            toggleValidCss(isValid);
+            form.$valid = true;
+            form.$invalid = false;
+          }
+          errors[validationToken] = false;
+          toggleValidCss(true, validationToken);
+          parentForm.$setValidity(validationToken, true, form);
+        }
+      }
+
+    } else {
+      if (!invalidCount) {
+        toggleValidCss(isValid);
+      }
+      if (queue) {
+        if (includes(queue, control)) return;
+      } else {
+        errors[validationToken] = queue = [];
+        invalidCount++;
+        toggleValidCss(false, validationToken);
+        parentForm.$setValidity(validationToken, false, form);
+      }
+      queue.push(control);
+
+      form.$valid = false;
+      form.$invalid = true;
+    }
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$setDirty
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Sets the form to a dirty state.
+   *
+   * This method can be called to add the 'ng-dirty' class and set the form to a dirty
+   * state (ng-dirty class). This method will also propagate to parent forms.
+   */
+  form.$setDirty = function() {
+    element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);
+    form.$dirty = true;
+    form.$pristine = false;
+    parentForm.$setDirty();
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:form.FormController#$setPristine
+   * @methodOf ng.directive:form.FormController
+   *
+   * @description
+   * Sets the form to its pristine state.
+   *
+   * This method can be called to remove the 'ng-dirty' class and set the form to its pristine
+   * state (ng-pristine class). This method will also propagate to all the controls contained
+   * in this form.
+   *
+   * Setting a form back to a pristine state is often useful when we want to 'reuse' a form after
+   * saving or resetting it.
+   */
+  form.$setPristine = function () {
+    element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS);
+    form.$dirty = false;
+    form.$pristine = true;
+    forEach(controls, function(control) {
+      control.$setPristine();
+    });
+  };
+}
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngForm
+ * @restrict EAC
+ *
+ * @description
+ * Nestable alias of {@link ng.directive:form `form`} directive. HTML
+ * does not allow nesting of form elements. It is useful to nest forms, for example if the validity of a
+ * sub-group of controls needs to be determined.
+ *
+ * @param {string=} ngForm|name Name of the form. If specified, the form controller will be published into
+ *                       related scope, under this name.
+ *
+ */
+
+ /**
+ * @ngdoc directive
+ * @name ng.directive:form
+ * @restrict E
+ *
+ * @description
+ * Directive that instantiates
+ * {@link ng.directive:form.FormController FormController}.
+ *
+ * If the `name` attribute is specified, the form controller is published onto the current scope under
+ * this name.
+ *
+ * # Alias: {@link ng.directive:ngForm `ngForm`}
+ *
+ * In Angular forms can be nested. This means that the outer form is valid when all of the child
+ * forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so
+ * Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to
+ * `<form>` but can be nested.  This allows you to have nested forms, which is very useful when
+ * using Angular validation directives in forms that are dynamically generated using the
+ * {@link ng.directive:ngRepeat `ngRepeat`} directive. Since you cannot dynamically generate the `name`
+ * attribute of input elements using interpolation, you have to wrap each set of repeated inputs in an
+ * `ngForm` directive and nest these in an outer `form` element.
+ *
+ *
+ * # CSS classes
+ *  - `ng-valid` Is set if the form is valid.
+ *  - `ng-invalid` Is set if the form is invalid.
+ *  - `ng-pristine` Is set if the form is pristine.
+ *  - `ng-dirty` Is set if the form is dirty.
+ *
+ *
+ * # Submitting a form and preventing the default action
+ *
+ * Since the role of forms in client-side Angular applications is different than in classical
+ * roundtrip apps, it is desirable for the browser not to translate the form submission into a full
+ * page reload that sends the data to the server. Instead some javascript logic should be triggered
+ * to handle the form submission in an application-specific way.
+ *
+ * For this reason, Angular prevents the default action (form submission to the server) unless the
+ * `<form>` element has an `action` attribute specified.
+ *
+ * You can use one of the following two ways to specify what javascript method should be called when
+ * a form is submitted:
+ *
+ * - {@link ng.directive:ngSubmit ngSubmit} directive on the form element
+ * - {@link ng.directive:ngClick ngClick} directive on the first
+  *  button or input field of type submit (input[type=submit])
+ *
+ * To prevent double execution of the handler, use only one of the {@link ng.directive:ngSubmit ngSubmit}
+ * or {@link ng.directive:ngClick ngClick} directives.
+ * This is because of the following form submission rules in the HTML specification:
+ *
+ * - If a form has only one input field then hitting enter in this field triggers form submit
+ * (`ngSubmit`)
+ * - if a form has 2+ input fields and no buttons or input[type=submit] then hitting enter
+ * doesn't trigger submit
+ * - if a form has one or more input fields and one or more buttons or input[type=submit] then
+ * hitting enter in any of the input fields will trigger the click handler on the *first* button or
+ * input[type=submit] (`ngClick`) *and* a submit handler on the enclosing form (`ngSubmit`)
+ *
+ * @param {string=} name Name of the form. If specified, the form controller will be published into
+ *                       related scope, under this name.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.userType = 'guest';
+         }
+       </script>
+       <form name="myForm" ng-controller="Ctrl">
+         userType: <input name="input" ng-model="userType" required>
+         <span class="error" ng-show="myForm.input.$error.required">Required!</span><br>
+         <tt>userType = {{userType}}</tt><br>
+         <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br>
+         <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br>
+         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
+         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
+        </form>
+      </doc:source>
+      <doc:scenario>
+        it('should initialize to model', function() {
+         expect(binding('userType')).toEqual('guest');
+         expect(binding('myForm.input.$valid')).toEqual('true');
+        });
+
+        it('should be invalid if empty', function() {
+         input('userType').enter('');
+         expect(binding('userType')).toEqual('');
+         expect(binding('myForm.input.$valid')).toEqual('false');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var formDirectiveFactory = function(isNgForm) {
+  return ['$timeout', function($timeout) {
+    var formDirective = {
+      name: 'form',
+      restrict: isNgForm ? 'EAC' : 'E',
+      controller: FormController,
+      compile: function() {
+        return {
+          pre: function(scope, formElement, attr, controller) {
+            if (!attr.action) {
+              // we can't use jq events because if a form is destroyed during submission the default
+              // action is not prevented. see #1238
+              //
+              // IE 9 is not affected because it doesn't fire a submit event and try to do a full
+              // page reload if the form was destroyed by submission of the form via a click handler
+              // on a button in the form. Looks like an IE9 specific bug.
+              var preventDefaultListener = function(event) {
+                event.preventDefault
+                  ? event.preventDefault()
+                  : event.returnValue = false; // IE
+              };
+
+              addEventListenerFn(formElement[0], 'submit', preventDefaultListener);
+
+              // unregister the preventDefault listener so that we don't not leak memory but in a
+              // way that will achieve the prevention of the default action.
+              formElement.on('$destroy', function() {
+                $timeout(function() {
+                  removeEventListenerFn(formElement[0], 'submit', preventDefaultListener);
+                }, 0, false);
+              });
+            }
+
+            var parentFormCtrl = formElement.parent().controller('form'),
+                alias = attr.name || attr.ngForm;
+
+            if (alias) {
+              setter(scope, alias, controller, alias);
+            }
+            if (parentFormCtrl) {
+              formElement.on('$destroy', function() {
+                parentFormCtrl.$removeControl(controller);
+                if (alias) {
+                  setter(scope, alias, undefined, alias);
+                }
+                extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
+              });
+            }
+          }
+        };
+      }
+    };
+
+    return formDirective;
+  }];
+};
+
+var formDirective = formDirectiveFactory();
+var ngFormDirective = formDirectiveFactory(true);
+
+/* global
+
+    -VALID_CLASS,
+    -INVALID_CLASS,
+    -PRISTINE_CLASS,
+    -DIRTY_CLASS
+*/
+
+var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
+var EMAIL_REGEXP = /^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/;
+var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))\s*$/;
+
+var inputType = {
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.text
+   *
+   * @description
+   * Standard HTML text input with angular data binding.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} required Adds `required` validation error key if the value is not entered.
+   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+   *    `required` when you want to data-bind to the `required` attribute.
+   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+   *    minlength.
+   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+   *    maxlength.
+   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+   *    patterns defined as scope expressions.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   * @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.text = 'guest';
+             $scope.word = /^\s*\w*\s*$/;
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           Single word: <input type="text" name="input" ng-model="text"
+                               ng-pattern="word" required ng-trim="false">
+           <span class="error" ng-show="myForm.input.$error.required">
+             Required!</span>
+           <span class="error" ng-show="myForm.input.$error.pattern">
+             Single word only!</span>
+
+           <tt>text = {{text}}</tt><br/>
+           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should initialize to model', function() {
+            expect(binding('text')).toEqual('guest');
+            expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+
+          it('should be invalid if empty', function() {
+            input('text').enter('');
+            expect(binding('text')).toEqual('');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should be invalid if multi word', function() {
+            input('text').enter('hello world');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should not be trimmed', function() {
+            input('text').enter('untrimmed ');
+            expect(binding('text')).toEqual('untrimmed ');
+            expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'text': textInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.number
+   *
+   * @description
+   * Text input with number validation and transformation. Sets the `number` validation
+   * error if not a valid number.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
+   * @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
+   * @param {string=} required Sets `required` validation error key if the value is not entered.
+   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+   *    `required` when you want to data-bind to the `required` attribute.
+   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+   *    minlength.
+   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+   *    maxlength.
+   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+   *    patterns defined as scope expressions.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.value = 12;
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           Number: <input type="number" name="input" ng-model="value"
+                          min="0" max="99" required>
+           <span class="error" ng-show="myForm.input.$error.required">
+             Required!</span>
+           <span class="error" ng-show="myForm.input.$error.number">
+             Not valid number!</span>
+           <tt>value = {{value}}</tt><br/>
+           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should initialize to model', function() {
+           expect(binding('value')).toEqual('12');
+           expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+
+          it('should be invalid if empty', function() {
+           input('value').enter('');
+           expect(binding('value')).toEqual('');
+           expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should be invalid if over max', function() {
+           input('value').enter('123');
+           expect(binding('value')).toEqual('');
+           expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'number': numberInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.url
+   *
+   * @description
+   * Text input with URL validation. Sets the `url` validation error key if the content is not a
+   * valid URL.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} required Sets `required` validation error key if the value is not entered.
+   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+   *    `required` when you want to data-bind to the `required` attribute.
+   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+   *    minlength.
+   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+   *    maxlength.
+   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+   *    patterns defined as scope expressions.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.text = 'http://google.com';
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           URL: <input type="url" name="input" ng-model="text" required>
+           <span class="error" ng-show="myForm.input.$error.required">
+             Required!</span>
+           <span class="error" ng-show="myForm.input.$error.url">
+             Not valid url!</span>
+           <tt>text = {{text}}</tt><br/>
+           <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+           <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+           <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+           <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+           <tt>myForm.$error.url = {{!!myForm.$error.url}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should initialize to model', function() {
+            expect(binding('text')).toEqual('http://google.com');
+            expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+
+          it('should be invalid if empty', function() {
+            input('text').enter('');
+            expect(binding('text')).toEqual('');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should be invalid if not url', function() {
+            input('text').enter('xxx');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'url': urlInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.email
+   *
+   * @description
+   * Text input with email validation. Sets the `email` validation error key if not a valid email
+   * address.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} required Sets `required` validation error key if the value is not entered.
+   * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+   *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+   *    `required` when you want to data-bind to the `required` attribute.
+   * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+   *    minlength.
+   * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+   *    maxlength.
+   * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+   *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+   *    patterns defined as scope expressions.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.text = 'me@example.com';
+           }
+         </script>
+           <form name="myForm" ng-controller="Ctrl">
+             Email: <input type="email" name="input" ng-model="text" required>
+             <span class="error" ng-show="myForm.input.$error.required">
+               Required!</span>
+             <span class="error" ng-show="myForm.input.$error.email">
+               Not valid email!</span>
+             <tt>text = {{text}}</tt><br/>
+             <tt>myForm.input.$valid = {{myForm.input.$valid}}</tt><br/>
+             <tt>myForm.input.$error = {{myForm.input.$error}}</tt><br/>
+             <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+             <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+             <tt>myForm.$error.email = {{!!myForm.$error.email}}</tt><br/>
+           </form>
+        </doc:source>
+        <doc:scenario>
+          it('should initialize to model', function() {
+            expect(binding('text')).toEqual('me@example.com');
+            expect(binding('myForm.input.$valid')).toEqual('true');
+          });
+
+          it('should be invalid if empty', function() {
+            input('text').enter('');
+            expect(binding('text')).toEqual('');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+
+          it('should be invalid if not email', function() {
+            input('text').enter('xxx');
+            expect(binding('myForm.input.$valid')).toEqual('false');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'email': emailInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.radio
+   *
+   * @description
+   * HTML radio button.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string} value The value to which the expression should be set when selected.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.color = 'blue';
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           <input type="radio" ng-model="color" value="red">  Red <br/>
+           <input type="radio" ng-model="color" value="green"> Green <br/>
+           <input type="radio" ng-model="color" value="blue"> Blue <br/>
+           <tt>color = {{color}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should change state', function() {
+            expect(binding('color')).toEqual('blue');
+
+            input('color').select('red');
+            expect(binding('color')).toEqual('red');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'radio': radioInputType,
+
+
+  /**
+   * @ngdoc inputType
+   * @name ng.directive:input.checkbox
+   *
+   * @description
+   * HTML checkbox.
+   *
+   * @param {string} ngModel Assignable angular expression to data-bind to.
+   * @param {string=} name Property name of the form under which the control is published.
+   * @param {string=} ngTrueValue The value to which the expression should be set when selected.
+   * @param {string=} ngFalseValue The value to which the expression should be set when not selected.
+   * @param {string=} ngChange Angular expression to be executed when input changes due to user
+   *    interaction with the input element.
+   *
+   * @example
+      <doc:example>
+        <doc:source>
+         <script>
+           function Ctrl($scope) {
+             $scope.value1 = true;
+             $scope.value2 = 'YES'
+           }
+         </script>
+         <form name="myForm" ng-controller="Ctrl">
+           Value1: <input type="checkbox" ng-model="value1"> <br/>
+           Value2: <input type="checkbox" ng-model="value2"
+                          ng-true-value="YES" ng-false-value="NO"> <br/>
+           <tt>value1 = {{value1}}</tt><br/>
+           <tt>value2 = {{value2}}</tt><br/>
+          </form>
+        </doc:source>
+        <doc:scenario>
+          it('should change state', function() {
+            expect(binding('value1')).toEqual('true');
+            expect(binding('value2')).toEqual('YES');
+
+            input('value1').check();
+            input('value2').check();
+            expect(binding('value1')).toEqual('false');
+            expect(binding('value2')).toEqual('NO');
+          });
+        </doc:scenario>
+      </doc:example>
+   */
+  'checkbox': checkboxInputType,
+
+  'hidden': noop,
+  'button': noop,
+  'submit': noop,
+  'reset': noop
+};
+
+
+function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+  // In composition mode, users are still inputing intermediate text buffer,
+  // hold the listener until composition is done.
+  // More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent
+  var composing = false;
+
+  element.on('compositionstart', function() {
+    composing = true;
+  });
+
+  element.on('compositionend', function() {
+    composing = false;
+  });
+
+  var listener = function() {
+    if (composing) return;
+    var value = element.val();
+
+    // By default we will trim the value
+    // If the attribute ng-trim exists we will avoid trimming
+    // e.g. <input ng-model="foo" ng-trim="false">
+    if (toBoolean(attr.ngTrim || 'T')) {
+      value = trim(value);
+    }
+
+    if (ctrl.$viewValue !== value) {
+      scope.$apply(function() {
+        ctrl.$setViewValue(value);
+      });
+    }
+  };
+
+  // if the browser does support "input" event, we are fine - except on IE9 which doesn't fire the
+  // input event on backspace, delete or cut
+  if ($sniffer.hasEvent('input')) {
+    element.on('input', listener);
+  } else {
+    var timeout;
+
+    var deferListener = function() {
+      if (!timeout) {
+        timeout = $browser.defer(function() {
+          listener();
+          timeout = null;
+        });
+      }
+    };
+
+    element.on('keydown', function(event) {
+      var key = event.keyCode;
+
+      // ignore
+      //    command            modifiers                   arrows
+      if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;
+
+      deferListener();
+    });
+
+    // if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it
+    if ($sniffer.hasEvent('paste')) {
+      element.on('paste cut', deferListener);
+    }
+  }
+
+  // if user paste into input using mouse on older browser
+  // or form autocomplete on newer browser, we need "change" event to catch it
+  element.on('change', listener);
+
+  ctrl.$render = function() {
+    element.val(ctrl.$isEmpty(ctrl.$viewValue) ? '' : ctrl.$viewValue);
+  };
+
+  // pattern validator
+  var pattern = attr.ngPattern,
+      patternValidator,
+      match;
+
+  var validate = function(regexp, value) {
+    if (ctrl.$isEmpty(value) || regexp.test(value)) {
+      ctrl.$setValidity('pattern', true);
+      return value;
+    } else {
+      ctrl.$setValidity('pattern', false);
+      return undefined;
+    }
+  };
+
+  if (pattern) {
+    match = pattern.match(/^\/(.*)\/([gim]*)$/);
+    if (match) {
+      pattern = new RegExp(match[1], match[2]);
+      patternValidator = function(value) {
+        return validate(pattern, value);
+      };
+    } else {
+      patternValidator = function(value) {
+        var patternObj = scope.$eval(pattern);
+
+        if (!patternObj || !patternObj.test) {
+          throw minErr('ngPattern')('noregexp',
+            'Expected {0} to be a RegExp but was {1}. Element: {2}', pattern,
+            patternObj, startingTag(element));
+        }
+        return validate(patternObj, value);
+      };
+    }
+
+    ctrl.$formatters.push(patternValidator);
+    ctrl.$parsers.push(patternValidator);
+  }
+
+  // min length validator
+  if (attr.ngMinlength) {
+    var minlength = int(attr.ngMinlength);
+    var minLengthValidator = function(value) {
+      if (!ctrl.$isEmpty(value) && value.length < minlength) {
+        ctrl.$setValidity('minlength', false);
+        return undefined;
+      } else {
+        ctrl.$setValidity('minlength', true);
+        return value;
+      }
+    };
+
+    ctrl.$parsers.push(minLengthValidator);
+    ctrl.$formatters.push(minLengthValidator);
+  }
+
+  // max length validator
+  if (attr.ngMaxlength) {
+    var maxlength = int(attr.ngMaxlength);
+    var maxLengthValidator = function(value) {
+      if (!ctrl.$isEmpty(value) && value.length > maxlength) {
+        ctrl.$setValidity('maxlength', false);
+        return undefined;
+      } else {
+        ctrl.$setValidity('maxlength', true);
+        return value;
+      }
+    };
+
+    ctrl.$parsers.push(maxLengthValidator);
+    ctrl.$formatters.push(maxLengthValidator);
+  }
+}
+
+function numberInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+  textInputType(scope, element, attr, ctrl, $sniffer, $browser);
+
+  ctrl.$parsers.push(function(value) {
+    var empty = ctrl.$isEmpty(value);
+    if (empty || NUMBER_REGEXP.test(value)) {
+      ctrl.$setValidity('number', true);
+      return value === '' ? null : (empty ? value : parseFloat(value));
+    } else {
+      ctrl.$setValidity('number', false);
+      return undefined;
+    }
+  });
+
+  ctrl.$formatters.push(function(value) {
+    return ctrl.$isEmpty(value) ? '' : '' + value;
+  });
+
+  if (attr.min) {
+    var minValidator = function(value) {
+      var min = parseFloat(attr.min);
+      if (!ctrl.$isEmpty(value) && value < min) {
+        ctrl.$setValidity('min', false);
+        return undefined;
+      } else {
+        ctrl.$setValidity('min', true);
+        return value;
+      }
+    };
+
+    ctrl.$parsers.push(minValidator);
+    ctrl.$formatters.push(minValidator);
+  }
+
+  if (attr.max) {
+    var maxValidator = function(value) {
+      var max = parseFloat(attr.max);
+      if (!ctrl.$isEmpty(value) && value > max) {
+        ctrl.$setValidity('max', false);
+        return undefined;
+      } else {
+        ctrl.$setValidity('max', true);
+        return value;
+      }
+    };
+
+    ctrl.$parsers.push(maxValidator);
+    ctrl.$formatters.push(maxValidator);
+  }
+
+  ctrl.$formatters.push(function(value) {
+
+    if (ctrl.$isEmpty(value) || isNumber(value)) {
+      ctrl.$setValidity('number', true);
+      return value;
+    } else {
+      ctrl.$setValidity('number', false);
+      return undefined;
+    }
+  });
+}
+
+function urlInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+  textInputType(scope, element, attr, ctrl, $sniffer, $browser);
+
+  var urlValidator = function(value) {
+    if (ctrl.$isEmpty(value) || URL_REGEXP.test(value)) {
+      ctrl.$setValidity('url', true);
+      return value;
+    } else {
+      ctrl.$setValidity('url', false);
+      return undefined;
+    }
+  };
+
+  ctrl.$formatters.push(urlValidator);
+  ctrl.$parsers.push(urlValidator);
+}
+
+function emailInputType(scope, element, attr, ctrl, $sniffer, $browser) {
+  textInputType(scope, element, attr, ctrl, $sniffer, $browser);
+
+  var emailValidator = function(value) {
+    if (ctrl.$isEmpty(value) || EMAIL_REGEXP.test(value)) {
+      ctrl.$setValidity('email', true);
+      return value;
+    } else {
+      ctrl.$setValidity('email', false);
+      return undefined;
+    }
+  };
+
+  ctrl.$formatters.push(emailValidator);
+  ctrl.$parsers.push(emailValidator);
+}
+
+function radioInputType(scope, element, attr, ctrl) {
+  // make the name unique, if not defined
+  if (isUndefined(attr.name)) {
+    element.attr('name', nextUid());
+  }
+
+  element.on('click', function() {
+    if (element[0].checked) {
+      scope.$apply(function() {
+        ctrl.$setViewValue(attr.value);
+      });
+    }
+  });
+
+  ctrl.$render = function() {
+    var value = attr.value;
+    element[0].checked = (value == ctrl.$viewValue);
+  };
+
+  attr.$observe('value', ctrl.$render);
+}
+
+function checkboxInputType(scope, element, attr, ctrl) {
+  var trueValue = attr.ngTrueValue,
+      falseValue = attr.ngFalseValue;
+
+  if (!isString(trueValue)) trueValue = true;
+  if (!isString(falseValue)) falseValue = false;
+
+  element.on('click', function() {
+    scope.$apply(function() {
+      ctrl.$setViewValue(element[0].checked);
+    });
+  });
+
+  ctrl.$render = function() {
+    element[0].checked = ctrl.$viewValue;
+  };
+
+  // Override the standard `$isEmpty` because a value of `false` means empty in a checkbox.
+  ctrl.$isEmpty = function(value) {
+    return value !== trueValue;
+  };
+
+  ctrl.$formatters.push(function(value) {
+    return value === trueValue;
+  });
+
+  ctrl.$parsers.push(function(value) {
+    return value ? trueValue : falseValue;
+  });
+}
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:textarea
+ * @restrict E
+ *
+ * @description
+ * HTML textarea element control with angular data-binding. The data-binding and validation
+ * properties of this element are exactly the same as those of the
+ * {@link ng.directive:input input element}.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ *    `required` when you want to data-bind to the `required` attribute.
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ *    minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ *    maxlength.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+ *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+ *    patterns defined as scope expressions.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ *    interaction with the input element.
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:input
+ * @restrict E
+ *
+ * @description
+ * HTML input element control with angular data-binding. Input control follows HTML5 input types
+ * and polyfills the HTML5 validation behavior for older browsers.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required Sets `required` validation error key if the value is not entered.
+ * @param {boolean=} ngRequired Sets `required` attribute if set to true
+ * @param {number=} ngMinlength Sets `minlength` validation error key if the value is shorter than
+ *    minlength.
+ * @param {number=} ngMaxlength Sets `maxlength` validation error key if the value is longer than
+ *    maxlength.
+ * @param {string=} ngPattern Sets `pattern` validation error key if the value does not match the
+ *    RegExp pattern expression. Expected value is `/regexp/` for inline patterns or `regexp` for
+ *    patterns defined as scope expressions.
+ * @param {string=} ngChange Angular expression to be executed when input changes due to user
+ *    interaction with the input element.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.user = {name: 'guest', last: 'visitor'};
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         <form name="myForm">
+           User name: <input type="text" name="userName" ng-model="user.name" required>
+           <span class="error" ng-show="myForm.userName.$error.required">
+             Required!</span><br>
+           Last name: <input type="text" name="lastName" ng-model="user.last"
+             ng-minlength="3" ng-maxlength="10">
+           <span class="error" ng-show="myForm.lastName.$error.minlength">
+             Too short!</span>
+           <span class="error" ng-show="myForm.lastName.$error.maxlength">
+             Too long!</span><br>
+         </form>
+         <hr>
+         <tt>user = {{user}}</tt><br/>
+         <tt>myForm.userName.$valid = {{myForm.userName.$valid}}</tt><br>
+         <tt>myForm.userName.$error = {{myForm.userName.$error}}</tt><br>
+         <tt>myForm.lastName.$valid = {{myForm.lastName.$valid}}</tt><br>
+         <tt>myForm.lastName.$error = {{myForm.lastName.$error}}</tt><br>
+         <tt>myForm.$valid = {{myForm.$valid}}</tt><br>
+         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br>
+         <tt>myForm.$error.minlength = {{!!myForm.$error.minlength}}</tt><br>
+         <tt>myForm.$error.maxlength = {{!!myForm.$error.maxlength}}</tt><br>
+       </div>
+      </doc:source>
+      <doc:scenario>
+        it('should initialize to model', function() {
+          expect(binding('user')).toEqual('{"name":"guest","last":"visitor"}');
+          expect(binding('myForm.userName.$valid')).toEqual('true');
+          expect(binding('myForm.$valid')).toEqual('true');
+        });
+
+        it('should be invalid if empty when required', function() {
+          input('user.name').enter('');
+          expect(binding('user')).toEqual('{"last":"visitor"}');
+          expect(binding('myForm.userName.$valid')).toEqual('false');
+          expect(binding('myForm.$valid')).toEqual('false');
+        });
+
+        it('should be valid if empty when min length is set', function() {
+          input('user.last').enter('');
+          expect(binding('user')).toEqual('{"name":"guest","last":""}');
+          expect(binding('myForm.lastName.$valid')).toEqual('true');
+          expect(binding('myForm.$valid')).toEqual('true');
+        });
+
+        it('should be invalid if less than required min length', function() {
+          input('user.last').enter('xx');
+          expect(binding('user')).toEqual('{"name":"guest"}');
+          expect(binding('myForm.lastName.$valid')).toEqual('false');
+          expect(binding('myForm.lastName.$error')).toMatch(/minlength/);
+          expect(binding('myForm.$valid')).toEqual('false');
+        });
+
+        it('should be invalid if longer than max length', function() {
+          input('user.last').enter('some ridiculously long name');
+          expect(binding('user'))
+            .toEqual('{"name":"guest"}');
+          expect(binding('myForm.lastName.$valid')).toEqual('false');
+          expect(binding('myForm.lastName.$error')).toMatch(/maxlength/);
+          expect(binding('myForm.$valid')).toEqual('false');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var inputDirective = ['$browser', '$sniffer', function($browser, $sniffer) {
+  return {
+    restrict: 'E',
+    require: '?ngModel',
+    link: function(scope, element, attr, ctrl) {
+      if (ctrl) {
+        (inputType[lowercase(attr.type)] || inputType.text)(scope, element, attr, ctrl, $sniffer,
+                                                            $browser);
+      }
+    }
+  };
+}];
+
+var VALID_CLASS = 'ng-valid',
+    INVALID_CLASS = 'ng-invalid',
+    PRISTINE_CLASS = 'ng-pristine',
+    DIRTY_CLASS = 'ng-dirty';
+
+/**
+ * @ngdoc object
+ * @name ng.directive:ngModel.NgModelController
+ *
+ * @property {string} $viewValue Actual string value in the view.
+ * @property {*} $modelValue The value in the model, that the control is bound to.
+ * @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
+       the control reads value from the DOM.  Each function is called, in turn, passing the value
+       through to the next. Used to sanitize / convert the value as well as validation.
+       For validation, the parsers should update the validity state using
+       {@link ng.directive:ngModel.NgModelController#methods_$setValidity $setValidity()},
+       and return `undefined` for invalid values.
+
+ *
+ * @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
+       the model value changes. Each function is called, in turn, passing the value through to the
+       next. Used to format / convert values for display in the control and validation.
+ *      <pre>
+ *      function formatter(value) {
+ *        if (value) {
+ *          return value.toUpperCase();
+ *        }
+ *      }
+ *      ngModel.$formatters.push(formatter);
+ *      </pre>
+ *
+ * @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the
+ *     view value has changed. It is called with no arguments, and its return value is ignored.
+ *     This can be used in place of additional $watches against the model value.
+ *
+ * @property {Object} $error An object hash with all errors as keys.
+ *
+ * @property {boolean} $pristine True if user has not interacted with the control yet.
+ * @property {boolean} $dirty True if user has already interacted with the control.
+ * @property {boolean} $valid True if there is no error.
+ * @property {boolean} $invalid True if at least one error on the control.
+ *
+ * @description
+ *
+ * `NgModelController` provides API for the `ng-model` directive. The controller contains
+ * services for data-binding, validation, CSS updates, and value formatting and parsing. It
+ * purposefully does not contain any logic which deals with DOM rendering or listening to
+ * DOM events. Such DOM related logic should be provided by other directives which make use of
+ * `NgModelController` for data-binding.
+ *
+ * ## Custom Control Example
+ * This example shows how to use `NgModelController` with a custom control to achieve
+ * data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)
+ * collaborate together to achieve the desired result.
+ *
+ * Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element
+ * contents be edited in place by the user.  This will not work on older browsers.
+ *
+ * <example module="customControl">
+    <file name="style.css">
+      [contenteditable] {
+        border: 1px solid black;
+        background-color: white;
+        min-height: 20px;
+      }
+
+      .ng-invalid {
+        border: 1px solid red;
+      }
+
+    </file>
+    <file name="script.js">
+      angular.module('customControl', []).
+        directive('contenteditable', function() {
+          return {
+            restrict: 'A', // only activate on element attribute
+            require: '?ngModel', // get a hold of NgModelController
+            link: function(scope, element, attrs, ngModel) {
+              if(!ngModel) return; // do nothing if no ng-model
+
+              // Specify how UI should be updated
+              ngModel.$render = function() {
+                element.html(ngModel.$viewValue || '');
+              };
+
+              // Listen for change events to enable binding
+              element.on('blur keyup change', function() {
+                scope.$apply(read);
+              });
+              read(); // initialize
+
+              // Write data to the model
+              function read() {
+                var html = element.html();
+                // When we clear the content editable the browser leaves a <br> behind
+                // If strip-br attribute is provided then we strip this out
+                if( attrs.stripBr && html == '<br>' ) {
+                  html = '';
+                }
+                ngModel.$setViewValue(html);
+              }
+            }
+          };
+        });
+    </file>
+    <file name="index.html">
+      <form name="myForm">
+       <div contenteditable
+            name="myWidget" ng-model="userContent"
+            strip-br="true"
+            required>Change me!</div>
+        <span ng-show="myForm.myWidget.$error.required">Required!</span>
+       <hr>
+       <textarea ng-model="userContent"></textarea>
+      </form>
+    </file>
+    <file name="scenario.js">
+      it('should data-bind and become invalid', function() {
+        var contentEditable = element('[contenteditable]');
+
+        expect(contentEditable.text()).toEqual('Change me!');
+        input('userContent').enter('');
+        expect(contentEditable.text()).toEqual('');
+        expect(contentEditable.prop('className')).toMatch(/ng-invalid-required/);
+      });
+    </file>
+ * </example>
+ *
+ *
+ */
+var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse',
+    function($scope, $exceptionHandler, $attr, $element, $parse) {
+  this.$viewValue = Number.NaN;
+  this.$modelValue = Number.NaN;
+  this.$parsers = [];
+  this.$formatters = [];
+  this.$viewChangeListeners = [];
+  this.$pristine = true;
+  this.$dirty = false;
+  this.$valid = true;
+  this.$invalid = false;
+  this.$name = $attr.name;
+
+  var ngModelGet = $parse($attr.ngModel),
+      ngModelSet = ngModelGet.assign;
+
+  if (!ngModelSet) {
+    throw minErr('ngModel')('nonassign', "Expression '{0}' is non-assignable. Element: {1}",
+        $attr.ngModel, startingTag($element));
+  }
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:ngModel.NgModelController#$render
+   * @methodOf ng.directive:ngModel.NgModelController
+   *
+   * @description
+   * Called when the view needs to be updated. It is expected that the user of the ng-model
+   * directive will implement this method.
+   */
+  this.$render = noop;
+
+  /**
+   * @ngdoc function
+   * @name { ng.directive:ngModel.NgModelController#$isEmpty
+   * @methodOf ng.directive:ngModel.NgModelController
+   *
+   * @description
+   * This is called when we need to determine if the value of the input is empty.
+   *
+   * For instance, the required directive does this to work out if the input has data or not.
+   * The default `$isEmpty` function checks whether the value is `undefined`, `''`, `null` or `NaN`.
+   *
+   * You can override this for input directives whose concept of being empty is different to the
+   * default. The `checkboxInputType` directive does this because in its case a value of `false`
+   * implies empty.
+   */
+  this.$isEmpty = function(value) {
+    return isUndefined(value) || value === '' || value === null || value !== value;
+  };
+
+  var parentForm = $element.inheritedData('$formController') || nullFormCtrl,
+      invalidCount = 0, // used to easily determine if we are valid
+      $error = this.$error = {}; // keep invalid keys here
+
+
+  // Setup initial state of the control
+  $element.addClass(PRISTINE_CLASS);
+  toggleValidCss(true);
+
+  // convenience method for easy toggling of classes
+  function toggleValidCss(isValid, validationErrorKey) {
+    validationErrorKey = validationErrorKey ? '-' + snake_case(validationErrorKey, '-') : '';
+    $element.
+      removeClass((isValid ? INVALID_CLASS : VALID_CLASS) + validationErrorKey).
+      addClass((isValid ? VALID_CLASS : INVALID_CLASS) + validationErrorKey);
+  }
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:ngModel.NgModelController#$setValidity
+   * @methodOf ng.directive:ngModel.NgModelController
+   *
+   * @description
+   * Change the validity state, and notifies the form when the control changes validity. (i.e. it
+   * does not notify form if given validator is already marked as invalid).
+   *
+   * This method should be called by validators - i.e. the parser or formatter functions.
+   *
+   * @param {string} validationErrorKey Name of the validator. the `validationErrorKey` will assign
+   *        to `$error[validationErrorKey]=isValid` so that it is available for data-binding.
+   *        The `validationErrorKey` should be in camelCase and will get converted into dash-case
+   *        for class name. Example: `myError` will result in `ng-valid-my-error` and `ng-invalid-my-error`
+   *        class and can be bound to as  `{{someForm.someControl.$error.myError}}` .
+   * @param {boolean} isValid Whether the current state is valid (true) or invalid (false).
+   */
+  this.$setValidity = function(validationErrorKey, isValid) {
+    // Purposeful use of ! here to cast isValid to boolean in case it is undefined
+    // jshint -W018
+    if ($error[validationErrorKey] === !isValid) return;
+    // jshint +W018
+
+    if (isValid) {
+      if ($error[validationErrorKey]) invalidCount--;
+      if (!invalidCount) {
+        toggleValidCss(true);
+        this.$valid = true;
+        this.$invalid = false;
+      }
+    } else {
+      toggleValidCss(false);
+      this.$invalid = true;
+      this.$valid = false;
+      invalidCount++;
+    }
+
+    $error[validationErrorKey] = !isValid;
+    toggleValidCss(isValid, validationErrorKey);
+
+    parentForm.$setValidity(validationErrorKey, isValid, this);
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:ngModel.NgModelController#$setPristine
+   * @methodOf ng.directive:ngModel.NgModelController
+   *
+   * @description
+   * Sets the control to its pristine state.
+   *
+   * This method can be called to remove the 'ng-dirty' class and set the control to its pristine
+   * state (ng-pristine class).
+   */
+  this.$setPristine = function () {
+    this.$dirty = false;
+    this.$pristine = true;
+    $element.removeClass(DIRTY_CLASS).addClass(PRISTINE_CLASS);
+  };
+
+  /**
+   * @ngdoc function
+   * @name ng.directive:ngModel.NgModelController#$setViewValue
+   * @methodOf ng.directive:ngModel.NgModelController
+   *
+   * @description
+   * Update the view value.
+   *
+   * This method should be called when the view value changes, typically from within a DOM event handler.
+   * For example {@link ng.directive:input input} and
+   * {@link ng.directive:select select} directives call it.
+   *
+   * It will update the $viewValue, then pass this value through each of the functions in `$parsers`,
+   * which includes any validators. The value that comes out of this `$parsers` pipeline, be applied to
+   * `$modelValue` and the **expression** specified in the `ng-model` attribute.
+   *
+   * Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.
+   *
+   * Note that calling this function does not trigger a `$digest`.
+   *
+   * @param {string} value Value from the view.
+   */
+  this.$setViewValue = function(value) {
+    this.$viewValue = value;
+
+    // change to dirty
+    if (this.$pristine) {
+      this.$dirty = true;
+      this.$pristine = false;
+      $element.removeClass(PRISTINE_CLASS).addClass(DIRTY_CLASS);
+      parentForm.$setDirty();
+    }
+
+    forEach(this.$parsers, function(fn) {
+      value = fn(value);
+    });
+
+    if (this.$modelValue !== value) {
+      this.$modelValue = value;
+      ngModelSet($scope, value);
+      forEach(this.$viewChangeListeners, function(listener) {
+        try {
+          listener();
+        } catch(e) {
+          $exceptionHandler(e);
+        }
+      });
+    }
+  };
+
+  // model -> value
+  var ctrl = this;
+
+  $scope.$watch(function ngModelWatch() {
+    var value = ngModelGet($scope);
+
+    // if scope model value and ngModel value are out of sync
+    if (ctrl.$modelValue !== value) {
+
+      var formatters = ctrl.$formatters,
+          idx = formatters.length;
+
+      ctrl.$modelValue = value;
+      while(idx--) {
+        value = formatters[idx](value);
+      }
+
+      if (ctrl.$viewValue !== value) {
+        ctrl.$viewValue = value;
+        ctrl.$render();
+      }
+    }
+
+    return value;
+  });
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngModel
+ *
+ * @element input
+ *
+ * @description
+ * The `ngModel` directive binds an `input`,`select`, `textarea` (or custom form control) to a
+ * property on the scope using {@link ng.directive:ngModel.NgModelController NgModelController},
+ * which is created and exposed by this directive.
+ *
+ * `ngModel` is responsible for:
+ *
+ * - Binding the view into the model, which other directives such as `input`, `textarea` or `select`
+ *   require.
+ * - Providing validation behavior (i.e. required, number, email, url).
+ * - Keeping the state of the control (valid/invalid, dirty/pristine, validation errors).
+ * - Setting related css classes on the element (`ng-valid`, `ng-invalid`, `ng-dirty`, `ng-pristine`).
+ * - Registering the control with its parent {@link ng.directive:form form}.
+ *
+ * Note: `ngModel` will try to bind to the property given by evaluating the expression on the
+ * current scope. If the property doesn't already exist on this scope, it will be created
+ * implicitly and added to the scope.
+ *
+ * For best practices on using `ngModel`, see:
+ *
+ *  - {@link https://github.com/angular/angular.js/wiki/Understanding-Scopes}
+ *
+ * For basic examples, how to use `ngModel`, see:
+ *
+ *  - {@link ng.directive:input input}
+ *    - {@link ng.directive:input.text text}
+ *    - {@link ng.directive:input.checkbox checkbox}
+ *    - {@link ng.directive:input.radio radio}
+ *    - {@link ng.directive:input.number number}
+ *    - {@link ng.directive:input.email email}
+ *    - {@link ng.directive:input.url url}
+ *  - {@link ng.directive:select select}
+ *  - {@link ng.directive:textarea textarea}
+ *
+ */
+var ngModelDirective = function() {
+  return {
+    require: ['ngModel', '^?form'],
+    controller: NgModelController,
+    link: function(scope, element, attr, ctrls) {
+      // notify others, especially parent forms
+
+      var modelCtrl = ctrls[0],
+          formCtrl = ctrls[1] || nullFormCtrl;
+
+      formCtrl.$addControl(modelCtrl);
+
+      scope.$on('$destroy', function() {
+        formCtrl.$removeControl(modelCtrl);
+      });
+    }
+  };
+};
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngChange
+ *
+ * @description
+ * Evaluate given expression when user changes the input.
+ * The expression is not evaluated when the value change is coming from the model.
+ *
+ * Note, this directive requires `ngModel` to be present.
+ *
+ * @element input
+ * @param {expression} ngChange {@link guide/expression Expression} to evaluate upon change
+ * in input value.
+ *
+ * @example
+ * <doc:example>
+ *   <doc:source>
+ *     <script>
+ *       function Controller($scope) {
+ *         $scope.counter = 0;
+ *         $scope.change = function() {
+ *           $scope.counter++;
+ *         };
+ *       }
+ *     </script>
+ *     <div ng-controller="Controller">
+ *       <input type="checkbox" ng-model="confirmed" ng-change="change()" id="ng-change-example1" />
+ *       <input type="checkbox" ng-model="confirmed" id="ng-change-example2" />
+ *       <label for="ng-change-example2">Confirmed</label><br />
+ *       debug = {{confirmed}}<br />
+ *       counter = {{counter}}
+ *     </div>
+ *   </doc:source>
+ *   <doc:scenario>
+ *     it('should evaluate the expression if changing from view', function() {
+ *       expect(binding('counter')).toEqual('0');
+ *       element('#ng-change-example1').click();
+ *       expect(binding('counter')).toEqual('1');
+ *       expect(binding('confirmed')).toEqual('true');
+ *     });
+ *
+ *     it('should not evaluate the expression if changing from model', function() {
+ *       element('#ng-change-example2').click();
+ *       expect(binding('counter')).toEqual('0');
+ *       expect(binding('confirmed')).toEqual('true');
+ *     });
+ *   </doc:scenario>
+ * </doc:example>
+ */
+var ngChangeDirective = valueFn({
+  require: 'ngModel',
+  link: function(scope, element, attr, ctrl) {
+    ctrl.$viewChangeListeners.push(function() {
+      scope.$eval(attr.ngChange);
+    });
+  }
+});
+
+
+var requiredDirective = function() {
+  return {
+    require: '?ngModel',
+    link: function(scope, elm, attr, ctrl) {
+      if (!ctrl) return;
+      attr.required = true; // force truthy in case we are on non input element
+
+      var validator = function(value) {
+        if (attr.required && ctrl.$isEmpty(value)) {
+          ctrl.$setValidity('required', false);
+          return;
+        } else {
+          ctrl.$setValidity('required', true);
+          return value;
+        }
+      };
+
+      ctrl.$formatters.push(validator);
+      ctrl.$parsers.unshift(validator);
+
+      attr.$observe('required', function() {
+        validator(ctrl.$viewValue);
+      });
+    }
+  };
+};
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngList
+ *
+ * @description
+ * Text input that converts between a delimited string and an array of strings. The delimiter
+ * can be a fixed string (by default a comma) or a regular expression.
+ *
+ * @element input
+ * @param {string=} ngList optional delimiter that should be used to split the value. If
+ *   specified in form `/something/` then the value will be converted into a regular expression.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.names = ['igor', 'misko', 'vojta'];
+         }
+       </script>
+       <form name="myForm" ng-controller="Ctrl">
+         List: <input name="namesInput" ng-model="names" ng-list required>
+         <span class="error" ng-show="myForm.namesInput.$error.required">
+           Required!</span>
+         <br>
+         <tt>names = {{names}}</tt><br/>
+         <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>
+         <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>
+         <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
+         <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
+        </form>
+      </doc:source>
+      <doc:scenario>
+        it('should initialize to model', function() {
+          expect(binding('names')).toEqual('["igor","misko","vojta"]');
+          expect(binding('myForm.namesInput.$valid')).toEqual('true');
+          expect(element('span.error').css('display')).toBe('none');
+        });
+
+        it('should be invalid if empty', function() {
+          input('names').enter('');
+          expect(binding('names')).toEqual('');
+          expect(binding('myForm.namesInput.$valid')).toEqual('false');
+          expect(element('span.error').css('display')).not().toBe('none');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var ngListDirective = function() {
+  return {
+    require: 'ngModel',
+    link: function(scope, element, attr, ctrl) {
+      var match = /\/(.*)\//.exec(attr.ngList),
+          separator = match && new RegExp(match[1]) || attr.ngList || ',';
+
+      var parse = function(viewValue) {
+        // If the viewValue is invalid (say required but empty) it will be `undefined`
+        if (isUndefined(viewValue)) return;
+
+        var list = [];
+
+        if (viewValue) {
+          forEach(viewValue.split(separator), function(value) {
+            if (value) list.push(trim(value));
+          });
+        }
+
+        return list;
+      };
+
+      ctrl.$parsers.push(parse);
+      ctrl.$formatters.push(function(value) {
+        if (isArray(value)) {
+          return value.join(', ');
+        }
+
+        return undefined;
+      });
+
+      // Override the standard $isEmpty because an empty array means the input is empty.
+      ctrl.$isEmpty = function(value) {
+        return !value || !value.length;
+      };
+    }
+  };
+};
+
+
+var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngValue
+ *
+ * @description
+ * Binds the given expression to the value of `input[select]` or `input[radio]`, so
+ * that when the element is selected, the `ngModel` of that element is set to the
+ * bound value.
+ *
+ * `ngValue` is useful when dynamically generating lists of radio buttons using `ng-repeat`, as
+ * shown below.
+ *
+ * @element input
+ * @param {string=} ngValue angular expression, whose value will be bound to the `value` attribute
+ *   of the `input` element
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+       <script>
+          function Ctrl($scope) {
+            $scope.names = ['pizza', 'unicorns', 'robots'];
+            $scope.my = { favorite: 'unicorns' };
+          }
+       </script>
+        <form ng-controller="Ctrl">
+          <h2>Which is your favorite?</h2>
+            <label ng-repeat="name in names" for="{{name}}">
+              {{name}}
+              <input type="radio"
+                     ng-model="my.favorite"
+                     ng-value="name"
+                     id="{{name}}"
+                     name="favorite">
+            </label>
+          <div>You chose {{my.favorite}}</div>
+        </form>
+      </doc:source>
+      <doc:scenario>
+        it('should initialize to model', function() {
+          expect(binding('my.favorite')).toEqual('unicorns');
+        });
+        it('should bind the values to the inputs', function() {
+          input('my.favorite').select('pizza');
+          expect(binding('my.favorite')).toEqual('pizza');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var ngValueDirective = function() {
+  return {
+    priority: 100,
+    compile: function(tpl, tplAttr) {
+      if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
+        return function ngValueConstantLink(scope, elm, attr) {
+          attr.$set('value', scope.$eval(attr.ngValue));
+        };
+      } else {
+        return function ngValueLink(scope, elm, attr) {
+          scope.$watch(attr.ngValue, function valueWatchAction(value) {
+            attr.$set('value', value);
+          });
+        };
+      }
+    }
+  };
+};
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngBind
+ * @restrict AC
+ *
+ * @description
+ * The `ngBind` attribute tells Angular to replace the text content of the specified HTML element
+ * with the value of a given expression, and to update the text content when the value of that
+ * expression changes.
+ *
+ * Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
+ * `{{ expression }}` which is similar but less verbose.
+ *
+ * It is preferrable to use `ngBind` instead of `{{ expression }}` when a template is momentarily
+ * displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
+ * element attribute, it makes the bindings invisible to the user while the page is loading.
+ *
+ * An alternative solution to this problem would be using the
+ * {@link ng.directive:ngCloak ngCloak} directive.
+ *
+ *
+ * @element ANY
+ * @param {expression} ngBind {@link guide/expression Expression} to evaluate.
+ *
+ * @example
+ * Enter a name in the Live Preview text box; the greeting below the text box changes instantly.
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.name = 'Whirled';
+         }
+       </script>
+       <div ng-controller="Ctrl">
+         Enter name: <input type="text" ng-model="name"><br>
+         Hello <span ng-bind="name"></span>!
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-bind', function() {
+         expect(using('.doc-example-live').binding('name')).toBe('Whirled');
+         using('.doc-example-live').input('name').enter('world');
+         expect(using('.doc-example-live').binding('name')).toBe('world');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+var ngBindDirective = ngDirective(function(scope, element, attr) {
+  element.addClass('ng-binding').data('$binding', attr.ngBind);
+  scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
+    // We are purposefully using == here rather than === because we want to
+    // catch when value is "null or undefined"
+    // jshint -W041
+    element.text(value == undefined ? '' : value);
+  });
+});
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngBindTemplate
+ *
+ * @description
+ * The `ngBindTemplate` directive specifies that the element
+ * text content should be replaced with the interpolation of the template
+ * in the `ngBindTemplate` attribute.
+ * Unlike `ngBind`, the `ngBindTemplate` can contain multiple `{{` `}}`
+ * expressions. This directive is needed since some HTML elements
+ * (such as TITLE and OPTION) cannot contain SPAN elements.
+ *
+ * @element ANY
+ * @param {string} ngBindTemplate template of form
+ *   <tt>{{</tt> <tt>expression</tt> <tt>}}</tt> to eval.
+ *
+ * @example
+ * Try it here: enter text in text box and watch the greeting change.
+   <doc:example>
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.salutation = 'Hello';
+           $scope.name = 'World';
+         }
+       </script>
+       <div ng-controller="Ctrl">
+        Salutation: <input type="text" ng-model="salutation"><br>
+        Name: <input type="text" ng-model="name"><br>
+        <pre ng-bind-template="{{salutation}} {{name}}!"></pre>
+       </div>
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-bind', function() {
+         expect(using('.doc-example-live').binding('salutation')).
+           toBe('Hello');
+         expect(using('.doc-example-live').binding('name')).
+           toBe('World');
+         using('.doc-example-live').input('salutation').enter('Greetings');
+         using('.doc-example-live').input('name').enter('user');
+         expect(using('.doc-example-live').binding('salutation')).
+           toBe('Greetings');
+         expect(using('.doc-example-live').binding('name')).
+           toBe('user');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
+  return function(scope, element, attr) {
+    // TODO: move this to scenario runner
+    var interpolateFn = $interpolate(element.attr(attr.$attr.ngBindTemplate));
+    element.addClass('ng-binding').data('$binding', interpolateFn);
+    attr.$observe('ngBindTemplate', function(value) {
+      element.text(value);
+    });
+  };
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngBindHtml
+ *
+ * @description
+ * Creates a binding that will innerHTML the result of evaluating the `expression` into the current
+ * element in a secure way.  By default, the innerHTML-ed content will be sanitized using the {@link
+ * ngSanitize.$sanitize $sanitize} service.  To utilize this functionality, ensure that `$sanitize`
+ * is available, for example, by including {@link ngSanitize} in your module's dependencies (not in
+ * core Angular.)  You may also bypass sanitization for values you know are safe. To do so, bind to
+ * an explicitly trusted value via {@link ng.$sce#methods_trustAsHtml $sce.trustAsHtml}.  See the example
+ * under {@link ng.$sce#Example Strict Contextual Escaping (SCE)}.
+ *
+ * Note: If a `$sanitize` service is unavailable and the bound value isn't explicitly trusted, you
+ * will have an exception (instead of an exploit.)
+ *
+ * @element ANY
+ * @param {expression} ngBindHtml {@link guide/expression Expression} to evaluate.
+ *
+ * @example
+   Try it here: enter text in text box and watch the greeting change.
+ 
+   <example module="ngBindHtmlExample" deps="angular-sanitize.js">
+     <file name="index.html">
+       <div ng-controller="ngBindHtmlCtrl">
+        <p ng-bind-html="myHTML"></p>
+       </div>
+     </file>
+     
+     <file name="script.js">
+       angular.module('ngBindHtmlExample', ['ngSanitize'])
+
+       .controller('ngBindHtmlCtrl', ['$scope', function ngBindHtmlCtrl($scope) {
+         $scope.myHTML =
+            'I am an <code>HTML</code>string with <a href="#">links!</a> and other <em>stuff</em>';
+       }]);
+     </file>
+
+     <file name="scenario.js">
+       it('should check ng-bind-html', function() {
+         expect(using('.doc-example-live').binding('myHTML')).
+           toBe(
+           'I am an <code>HTML</code>string with <a href="#">links!</a> and other <em>stuff</em>'
+           );
+       });
+     </file>
+   </example>
+ */
+var ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) {
+  return function(scope, element, attr) {
+    element.addClass('ng-binding').data('$binding', attr.ngBindHtml);
+
+    var parsed = $parse(attr.ngBindHtml);
+    function getStringValue() { return (parsed(scope) || '').toString(); }
+
+    scope.$watch(getStringValue, function ngBindHtmlWatchAction(value) {
+      element.html($sce.getTrustedHtml(parsed(scope)) || '');
+    });
+  };
+}];
+
+function classDirective(name, selector) {
+  name = 'ngClass' + name;
+  return function() {
+    return {
+      restrict: 'AC',
+      link: function(scope, element, attr) {
+        var oldVal;
+
+        scope.$watch(attr[name], ngClassWatchAction, true);
+
+        attr.$observe('class', function(value) {
+          ngClassWatchAction(scope.$eval(attr[name]));
+        });
+
+
+        if (name !== 'ngClass') {
+          scope.$watch('$index', function($index, old$index) {
+            // jshint bitwise: false
+            var mod = $index & 1;
+            if (mod !== old$index & 1) {
+              var classes = flattenClasses(scope.$eval(attr[name]));
+              mod === selector ?
+                attr.$addClass(classes) :
+                attr.$removeClass(classes);
+            }
+          });
+        }
+
+
+        function ngClassWatchAction(newVal) {
+          if (selector === true || scope.$index % 2 === selector) {
+            var newClasses = flattenClasses(newVal || '');
+            if(!oldVal) {
+              attr.$addClass(newClasses);
+            } else if(!equals(newVal,oldVal)) {
+              attr.$updateClass(newClasses, flattenClasses(oldVal));
+            }
+          }
+          oldVal = copy(newVal);
+        }
+
+
+        function flattenClasses(classVal) {
+          if(isArray(classVal)) {
+            return classVal.join(' ');
+          } else if (isObject(classVal)) {
+            var classes = [], i = 0;
+            forEach(classVal, function(v, k) {
+              if (v) {
+                classes.push(k);
+              }
+            });
+            return classes.join(' ');
+          }
+
+          return classVal;
+        }
+      }
+    };
+  };
+}
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngClass
+ * @restrict AC
+ *
+ * @description
+ * The `ngClass` directive allows you to dynamically set CSS classes on an HTML element by databinding
+ * an expression that represents all classes to be added.
+ *
+ * The directive won't add duplicate classes if a particular class was already set.
+ *
+ * When the expression changes, the previously added classes are removed and only then the
+ * new classes are added.
+ *
+ * @animations
+ * add - happens just before the class is applied to the element
+ * remove - happens just before the class is removed from the element
+ *
+ * @element ANY
+ * @param {expression} ngClass {@link guide/expression Expression} to eval. The result
+ *   of the evaluation can be a string representing space delimited class
+ *   names, an array, or a map of class names to boolean values. In the case of a map, the
+ *   names of the properties whose values are truthy will be added as css classes to the
+ *   element.
+ *
+ * @example Example that demonstrates basic bindings via ngClass directive.
+   <example>
+     <file name="index.html">
+       <p ng-class="{strike: deleted, bold: important, red: error}">Map Syntax Example</p>
+       <input type="checkbox" ng-model="deleted"> deleted (apply "strike" class)<br>
+       <input type="checkbox" ng-model="important"> important (apply "bold" class)<br>
+       <input type="checkbox" ng-model="error"> error (apply "red" class)
+       <hr>
+       <p ng-class="style">Using String Syntax</p>
+       <input type="text" ng-model="style" placeholder="Type: bold strike red">
+       <hr>
+       <p ng-class="[style1, style2, style3]">Using Array Syntax</p>
+       <input ng-model="style1" placeholder="Type: bold, strike or red"><br>
+       <input ng-model="style2" placeholder="Type: bold, strike or red"><br>
+       <input ng-model="style3" placeholder="Type: bold, strike or red"><br>
+     </file>
+     <file name="style.css">
+       .strike {
+         text-decoration: line-through;
+       }
+       .bold {
+           font-weight: bold;
+       }
+       .red {
+           color: red;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should let you toggle the class', function() {
+
+         expect(element('.doc-example-live p:first').prop('className')).not().toMatch(/bold/);
+         expect(element('.doc-example-live p:first').prop('className')).not().toMatch(/red/);
+
+         input('important').check();
+         expect(element('.doc-example-live p:first').prop('className')).toMatch(/bold/);
+
+         input('error').check();
+         expect(element('.doc-example-live p:first').prop('className')).toMatch(/red/);
+       });
+
+       it('should let you toggle string example', function() {
+         expect(element('.doc-example-live p:nth-of-type(2)').prop('className')).toBe('');
+         input('style').enter('red');
+         expect(element('.doc-example-live p:nth-of-type(2)').prop('className')).toBe('red');
+       });
+
+       it('array example should have 3 classes', function() {
+         expect(element('.doc-example-live p:last').prop('className')).toBe('');
+         input('style1').enter('bold');
+         input('style2').enter('strike');
+         input('style3').enter('red');
+         expect(element('.doc-example-live p:last').prop('className')).toBe('bold strike red');
+       });
+     </file>
+   </example>
+
+   ## Animations
+
+   The example below demonstrates how to perform animations using ngClass.
+
+   <example animations="true">
+     <file name="index.html">
+      <input type="button" value="set" ng-click="myVar='my-class'">
+      <input type="button" value="clear" ng-click="myVar=''">
+      <br>
+      <span class="base-class" ng-class="myVar">Sample Text</span>
+     </file>
+     <file name="style.css">
+       .base-class {
+         -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+         transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+       }
+
+       .base-class.my-class {
+         color: red;
+         font-size:3em;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should check ng-class', function() {
+         expect(element('.doc-example-live span').prop('className')).not().
+           toMatch(/my-class/);
+
+         using('.doc-example-live').element(':button:first').click();
+
+         expect(element('.doc-example-live span').prop('className')).
+           toMatch(/my-class/);
+
+         using('.doc-example-live').element(':button:last').click();
+
+         expect(element('.doc-example-live span').prop('className')).not().
+           toMatch(/my-class/);
+       });
+     </file>
+   </example>
+
+
+   ## ngClass and pre-existing CSS3 Transitions/Animations
+   The ngClass directive still supports CSS3 Transitions/Animations even if they do not follow the ngAnimate CSS naming structure.
+   Upon animation ngAnimate will apply supplementary CSS classes to track the start and end of an animation, but this will not hinder
+   any pre-existing CSS transitions already on the element. To get an idea of what happens during a class-based animation, be sure
+   to view the step by step details of {@link ngAnimate.$animate#methods_addclass $animate.addClass} and
+   {@link ngAnimate.$animate#methods_removeclass $animate.removeClass}.
+ */
+var ngClassDirective = classDirective('', true);
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngClassOdd
+ * @restrict AC
+ *
+ * @description
+ * The `ngClassOdd` and `ngClassEven` directives work exactly as
+ * {@link ng.directive:ngClass ngClass}, except they work in
+ * conjunction with `ngRepeat` and take effect only on odd (even) rows.
+ *
+ * This directive can be applied only within the scope of an
+ * {@link ng.directive:ngRepeat ngRepeat}.
+ *
+ * @element ANY
+ * @param {expression} ngClassOdd {@link guide/expression Expression} to eval. The result
+ *   of the evaluation can be a string representing space delimited class names or an array.
+ *
+ * @example
+   <example>
+     <file name="index.html">
+        <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']">
+          <li ng-repeat="name in names">
+           <span ng-class-odd="'odd'" ng-class-even="'even'">
+             {{name}}
+           </span>
+          </li>
+        </ol>
+     </file>
+     <file name="style.css">
+       .odd {
+         color: red;
+       }
+       .even {
+         color: blue;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should check ng-class-odd and ng-class-even', function() {
+         expect(element('.doc-example-live li:first span').prop('className')).
+           toMatch(/odd/);
+         expect(element('.doc-example-live li:last span').prop('className')).
+           toMatch(/even/);
+       });
+     </file>
+   </example>
+ */
+var ngClassOddDirective = classDirective('Odd', 0);
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngClassEven
+ * @restrict AC
+ *
+ * @description
+ * The `ngClassOdd` and `ngClassEven` directives work exactly as
+ * {@link ng.directive:ngClass ngClass}, except they work in
+ * conjunction with `ngRepeat` and take effect only on odd (even) rows.
+ *
+ * This directive can be applied only within the scope of an
+ * {@link ng.directive:ngRepeat ngRepeat}.
+ *
+ * @element ANY
+ * @param {expression} ngClassEven {@link guide/expression Expression} to eval. The
+ *   result of the evaluation can be a string representing space delimited class names or an array.
+ *
+ * @example
+   <example>
+     <file name="index.html">
+        <ol ng-init="names=['John', 'Mary', 'Cate', 'Suz']">
+          <li ng-repeat="name in names">
+           <span ng-class-odd="'odd'" ng-class-even="'even'">
+             {{name}} &nbsp; &nbsp; &nbsp;
+           </span>
+          </li>
+        </ol>
+     </file>
+     <file name="style.css">
+       .odd {
+         color: red;
+       }
+       .even {
+         color: blue;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should check ng-class-odd and ng-class-even', function() {
+         expect(element('.doc-example-live li:first span').prop('className')).
+           toMatch(/odd/);
+         expect(element('.doc-example-live li:last span').prop('className')).
+           toMatch(/even/);
+       });
+     </file>
+   </example>
+ */
+var ngClassEvenDirective = classDirective('Even', 1);
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngCloak
+ * @restrict AC
+ *
+ * @description
+ * The `ngCloak` directive is used to prevent the Angular html template from being briefly
+ * displayed by the browser in its raw (uncompiled) form while your application is loading. Use this
+ * directive to avoid the undesirable flicker effect caused by the html template display.
+ *
+ * The directive can be applied to the `<body>` element, but the preferred usage is to apply
+ * multiple `ngCloak` directives to small portions of the page to permit progressive rendering
+ * of the browser view.
+ *
+ * `ngCloak` works in cooperation with the following css rule embedded within `angular.js` and
+ * `angular.min.js`.
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
+ *
+ * <pre>
+ * [ng\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak], .ng-cloak, .x-ng-cloak {
+ *   display: none !important;
+ * }
+ * </pre>
+ *
+ * When this css rule is loaded by the browser, all html elements (including their children) that
+ * are tagged with the `ngCloak` directive are hidden. When Angular encounters this directive
+ * during the compilation of the template it deletes the `ngCloak` element attribute, making
+ * the compiled element visible.
+ *
+ * For the best result, the `angular.js` script must be loaded in the head section of the html
+ * document; alternatively, the css rule above must be included in the external stylesheet of the
+ * application.
+ *
+ * Legacy browsers, like IE7, do not provide attribute selector support (added in CSS 2.1) so they
+ * cannot match the `[ng\:cloak]` selector. To work around this limitation, you must add the css
+ * class `ngCloak` in addition to the `ngCloak` directive as shown in the example below.
+ *
+ * @element ANY
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+        <div id="template1" ng-cloak>{{ 'hello' }}</div>
+        <div id="template2" ng-cloak class="ng-cloak">{{ 'hello IE7' }}</div>
+     </doc:source>
+     <doc:scenario>
+       it('should remove the template directive and css class', function() {
+         expect(element('.doc-example-live #template1').attr('ng-cloak')).
+           not().toBeDefined();
+         expect(element('.doc-example-live #template2').attr('ng-cloak')).
+           not().toBeDefined();
+       });
+     </doc:scenario>
+   </doc:example>
+ *
+ */
+var ngCloakDirective = ngDirective({
+  compile: function(element, attr) {
+    attr.$set('ngCloak', undefined);
+    element.removeClass('ng-cloak');
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngController
+ *
+ * @description
+ * The `ngController` directive attaches a controller class to the view. This is a key aspect of how angular
+ * supports the principles behind the Model-View-Controller design pattern.
+ *
+ * MVC components in angular:
+ *
+ * * Model — The Model is scope properties; scopes are attached to the DOM where scope properties
+ *   are accessed through bindings.
+ * * View — The template (HTML with data bindings) that is rendered into the View.
+ * * Controller — The `ngController` directive specifies a Controller class; the class contains business
+ *   logic behind the application to decorate the scope with functions and values
+ *
+ * Note that you can also attach controllers to the DOM by declaring it in a route definition
+ * via the {@link ngRoute.$route $route} service. A common mistake is to declare the controller
+ * again using `ng-controller` in the template itself.  This will cause the controller to be attached
+ * and executed twice.
+ *
+ * @element ANY
+ * @scope
+ * @param {expression} ngController Name of a globally accessible constructor function or an
+ *     {@link guide/expression expression} that on the current scope evaluates to a
+ *     constructor function. The controller instance can be published into a scope property
+ *     by specifying `as propertyName`.
+ *
+ * @example
+ * Here is a simple form for editing user contact information. Adding, removing, clearing, and
+ * greeting are methods declared on the controller (see source tab). These methods can
+ * easily be called from the angular markup. Notice that the scope becomes the `this` for the
+ * controller's instance. This allows for easy access to the view data from the controller. Also
+ * notice that any changes to the data are automatically reflected in the View without the need
+ * for a manual update. The example is shown in two different declaration styles you may use
+ * according to preference.
+   <doc:example>
+     <doc:source>
+      <script>
+        function SettingsController1() {
+          this.name = "John Smith";
+          this.contacts = [
+            {type: 'phone', value: '408 555 1212'},
+            {type: 'email', value: 'john.smith@example.org'} ];
+          };
+
+        SettingsController1.prototype.greet = function() {
+          alert(this.name);
+        };
+
+        SettingsController1.prototype.addContact = function() {
+          this.contacts.push({type: 'email', value: 'yourname@example.org'});
+        };
+
+        SettingsController1.prototype.removeContact = function(contactToRemove) {
+         var index = this.contacts.indexOf(contactToRemove);
+          this.contacts.splice(index, 1);
+        };
+
+        SettingsController1.prototype.clearContact = function(contact) {
+          contact.type = 'phone';
+          contact.value = '';
+        };
+      </script>
+      <div id="ctrl-as-exmpl" ng-controller="SettingsController1 as settings">
+        Name: <input type="text" ng-model="settings.name"/>
+        [ <a href="" ng-click="settings.greet()">greet</a> ]<br/>
+        Contact:
+        <ul>
+          <li ng-repeat="contact in settings.contacts">
+            <select ng-model="contact.type">
+               <option>phone</option>
+               <option>email</option>
+            </select>
+            <input type="text" ng-model="contact.value"/>
+            [ <a href="" ng-click="settings.clearContact(contact)">clear</a>
+            | <a href="" ng-click="settings.removeContact(contact)">X</a> ]
+          </li>
+          <li>[ <a href="" ng-click="settings.addContact()">add</a> ]</li>
+       </ul>
+      </div>
+     </doc:source>
+     <doc:scenario>
+       it('should check controller as', function() {
+         expect(element('#ctrl-as-exmpl>:input').val()).toBe('John Smith');
+         expect(element('#ctrl-as-exmpl li:nth-child(1) input').val())
+           .toBe('408 555 1212');
+         expect(element('#ctrl-as-exmpl li:nth-child(2) input').val())
+           .toBe('john.smith@example.org');
+
+         element('#ctrl-as-exmpl li:first a:contains("clear")').click();
+         expect(element('#ctrl-as-exmpl li:first input').val()).toBe('');
+
+         element('#ctrl-as-exmpl li:last a:contains("add")').click();
+         expect(element('#ctrl-as-exmpl li:nth-child(3) input').val())
+           .toBe('yourname@example.org');
+       });
+     </doc:scenario>
+   </doc:example>
+    <doc:example>
+     <doc:source>
+      <script>
+        function SettingsController2($scope) {
+          $scope.name = "John Smith";
+          $scope.contacts = [
+            {type:'phone', value:'408 555 1212'},
+            {type:'email', value:'john.smith@example.org'} ];
+
+          $scope.greet = function() {
+           alert(this.name);
+          };
+
+          $scope.addContact = function() {
+           this.contacts.push({type:'email', value:'yourname@example.org'});
+          };
+
+          $scope.removeContact = function(contactToRemove) {
+           var index = this.contacts.indexOf(contactToRemove);
+           this.contacts.splice(index, 1);
+          };
+
+          $scope.clearContact = function(contact) {
+           contact.type = 'phone';
+           contact.value = '';
+          };
+        }
+      </script>
+      <div id="ctrl-exmpl" ng-controller="SettingsController2">
+        Name: <input type="text" ng-model="name"/>
+        [ <a href="" ng-click="greet()">greet</a> ]<br/>
+        Contact:
+        <ul>
+          <li ng-repeat="contact in contacts">
+            <select ng-model="contact.type">
+               <option>phone</option>
+               <option>email</option>
+            </select>
+            <input type="text" ng-model="contact.value"/>
+            [ <a href="" ng-click="clearContact(contact)">clear</a>
+            | <a href="" ng-click="removeContact(contact)">X</a> ]
+          </li>
+          <li>[ <a href="" ng-click="addContact()">add</a> ]</li>
+       </ul>
+      </div>
+     </doc:source>
+     <doc:scenario>
+       it('should check controller', function() {
+         expect(element('#ctrl-exmpl>:input').val()).toBe('John Smith');
+         expect(element('#ctrl-exmpl li:nth-child(1) input').val())
+           .toBe('408 555 1212');
+         expect(element('#ctrl-exmpl li:nth-child(2) input').val())
+           .toBe('john.smith@example.org');
+
+         element('#ctrl-exmpl li:first a:contains("clear")').click();
+         expect(element('#ctrl-exmpl li:first input').val()).toBe('');
+
+         element('#ctrl-exmpl li:last a:contains("add")').click();
+         expect(element('#ctrl-exmpl li:nth-child(3) input').val())
+           .toBe('yourname@example.org');
+       });
+     </doc:scenario>
+   </doc:example>
+
+ */
+var ngControllerDirective = [function() {
+  return {
+    scope: true,
+    controller: '@',
+    priority: 500
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngCsp
+ *
+ * @element html
+ * @description
+ * Enables [CSP (Content Security Policy)](https://developer.mozilla.org/en/Security/CSP) support.
+ *
+ * This is necessary when developing things like Google Chrome Extensions.
+ *
+ * CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).
+ * For us to be compatible, we just need to implement the "getterFn" in $parse without violating
+ * any of these restrictions.
+ *
+ * AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`
+ * directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will
+ * evaluate all expressions up to 30% slower than in non-CSP mode, but no security violations will
+ * be raised.
+ *
+ * CSP forbids JavaScript to inline stylesheet rules. In non CSP mode Angular automatically
+ * includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).
+ * To make those directives work in CSP mode, include the `angular-csp.css` manually.
+ *
+ * In order to use this feature put the `ngCsp` directive on the root element of the application.
+ *
+ * *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*
+ *
+ * @example
+ * This example shows how to apply the `ngCsp` directive to the `html` tag.
+   <pre>
+     <!doctype html>
+     <html ng-app ng-csp>
+     ...
+     ...
+     </html>
+   </pre>
+ */
+
+// ngCsp is not implemented as a proper directive any more, because we need it be processed while we bootstrap
+// the system (before $parse is instantiated), for this reason we just have a csp() fn that looks for ng-csp attribute
+// anywhere in the current doc
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngClick
+ *
+ * @description
+ * The ngClick directive allows you to specify custom behavior when
+ * an element is clicked.
+ *
+ * @element ANY
+ * @param {expression} ngClick {@link guide/expression Expression} to evaluate upon
+ * click. (Event object is available as `$event`)
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+      <button ng-click="count = count + 1" ng-init="count=0">
+        Increment
+      </button>
+      count: {{count}}
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-click', function() {
+         expect(binding('count')).toBe('0');
+         element('.doc-example-live :button').click();
+         expect(binding('count')).toBe('1');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+/*
+ * A directive that allows creation of custom onclick handlers that are defined as angular
+ * expressions and are compiled and executed within the current scope.
+ *
+ * Events that are handled via these handler are always configured not to propagate further.
+ */
+var ngEventDirectives = {};
+forEach(
+  'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),
+  function(name) {
+    var directiveName = directiveNormalize('ng-' + name);
+    ngEventDirectives[directiveName] = ['$parse', function($parse) {
+      return {
+        compile: function($element, attr) {
+          var fn = $parse(attr[directiveName]);
+          return function(scope, element, attr) {
+            element.on(lowercase(name), function(event) {
+              scope.$apply(function() {
+                fn(scope, {$event:event});
+              });
+            });
+          };
+        }
+      };
+    }];
+  }
+);
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngDblclick
+ *
+ * @description
+ * The `ngDblclick` directive allows you to specify custom behavior on a dblclick event.
+ *
+ * @element ANY
+ * @param {expression} ngDblclick {@link guide/expression Expression} to evaluate upon
+ * a dblclick. (The Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMousedown
+ *
+ * @description
+ * The ngMousedown directive allows you to specify custom behavior on mousedown event.
+ *
+ * @element ANY
+ * @param {expression} ngMousedown {@link guide/expression Expression} to evaluate upon
+ * mousedown. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMouseup
+ *
+ * @description
+ * Specify custom behavior on mouseup event.
+ *
+ * @element ANY
+ * @param {expression} ngMouseup {@link guide/expression Expression} to evaluate upon
+ * mouseup. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMouseover
+ *
+ * @description
+ * Specify custom behavior on mouseover event.
+ *
+ * @element ANY
+ * @param {expression} ngMouseover {@link guide/expression Expression} to evaluate upon
+ * mouseover. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMouseenter
+ *
+ * @description
+ * Specify custom behavior on mouseenter event.
+ *
+ * @element ANY
+ * @param {expression} ngMouseenter {@link guide/expression Expression} to evaluate upon
+ * mouseenter. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMouseleave
+ *
+ * @description
+ * Specify custom behavior on mouseleave event.
+ *
+ * @element ANY
+ * @param {expression} ngMouseleave {@link guide/expression Expression} to evaluate upon
+ * mouseleave. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngMousemove
+ *
+ * @description
+ * Specify custom behavior on mousemove event.
+ *
+ * @element ANY
+ * @param {expression} ngMousemove {@link guide/expression Expression} to evaluate upon
+ * mousemove. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngKeydown
+ *
+ * @description
+ * Specify custom behavior on keydown event.
+ *
+ * @element ANY
+ * @param {expression} ngKeydown {@link guide/expression Expression} to evaluate upon
+ * keydown. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngKeyup
+ *
+ * @description
+ * Specify custom behavior on keyup event.
+ *
+ * @element ANY
+ * @param {expression} ngKeyup {@link guide/expression Expression} to evaluate upon
+ * keyup. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngKeypress
+ *
+ * @description
+ * Specify custom behavior on keypress event.
+ *
+ * @element ANY
+ * @param {expression} ngKeypress {@link guide/expression Expression} to evaluate upon
+ * keypress. (Event object is available as `$event` and can be interrogated for keyCode, altKey, etc.)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSubmit
+ *
+ * @description
+ * Enables binding angular expressions to onsubmit events.
+ *
+ * Additionally it prevents the default action (which for form means sending the request to the
+ * server and reloading the current page) **but only if the form does not contain an `action`
+ * attribute**.
+ *
+ * @element form
+ * @param {expression} ngSubmit {@link guide/expression Expression} to eval. (Event object is available as `$event`)
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+      <script>
+        function Ctrl($scope) {
+          $scope.list = [];
+          $scope.text = 'hello';
+          $scope.submit = function() {
+            if (this.text) {
+              this.list.push(this.text);
+              this.text = '';
+            }
+          };
+        }
+      </script>
+      <form ng-submit="submit()" ng-controller="Ctrl">
+        Enter text and hit enter:
+        <input type="text" ng-model="text" name="text" />
+        <input type="submit" id="submit" value="Submit" />
+        <pre>list={{list}}</pre>
+      </form>
+     </doc:source>
+     <doc:scenario>
+       it('should check ng-submit', function() {
+         expect(binding('list')).toBe('[]');
+         element('.doc-example-live #submit').click();
+         expect(binding('list')).toBe('["hello"]');
+         expect(input('text').val()).toBe('');
+       });
+       it('should ignore empty strings', function() {
+         expect(binding('list')).toBe('[]');
+         element('.doc-example-live #submit').click();
+         element('.doc-example-live #submit').click();
+         expect(binding('list')).toBe('["hello"]');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngFocus
+ *
+ * @description
+ * Specify custom behavior on focus event.
+ *
+ * @element window, input, select, textarea, a
+ * @param {expression} ngFocus {@link guide/expression Expression} to evaluate upon
+ * focus. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngBlur
+ *
+ * @description
+ * Specify custom behavior on blur event.
+ *
+ * @element window, input, select, textarea, a
+ * @param {expression} ngBlur {@link guide/expression Expression} to evaluate upon
+ * blur. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngCopy
+ *
+ * @description
+ * Specify custom behavior on copy event.
+ *
+ * @element window, input, select, textarea, a
+ * @param {expression} ngCopy {@link guide/expression Expression} to evaluate upon
+ * copy. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngCut
+ *
+ * @description
+ * Specify custom behavior on cut event.
+ *
+ * @element window, input, select, textarea, a
+ * @param {expression} ngCut {@link guide/expression Expression} to evaluate upon
+ * cut. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngPaste
+ *
+ * @description
+ * Specify custom behavior on paste event.
+ *
+ * @element window, input, select, textarea, a
+ * @param {expression} ngPaste {@link guide/expression Expression} to evaluate upon
+ * paste. (Event object is available as `$event`)
+ *
+ * @example
+ * See {@link ng.directive:ngClick ngClick}
+ */
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngIf
+ * @restrict A
+ *
+ * @description
+ * The `ngIf` directive removes or recreates a portion of the DOM tree based on an
+ * {expression}. If the expression assigned to `ngIf` evaluates to a false
+ * value then the element is removed from the DOM, otherwise a clone of the
+ * element is reinserted into the DOM.
+ *
+ * `ngIf` differs from `ngShow` and `ngHide` in that `ngIf` completely removes and recreates the
+ * element in the DOM rather than changing its visibility via the `display` css property.  A common
+ * case when this difference is significant is when using css selectors that rely on an element's
+ * position within the DOM, such as the `:first-child` or `:last-child` pseudo-classes.
+ *
+ * Note that when an element is removed using `ngIf` its scope is destroyed and a new scope
+ * is created when the element is restored.  The scope created within `ngIf` inherits from
+ * its parent scope using
+ * {@link https://github.com/angular/angular.js/wiki/The-Nuances-of-Scope-Prototypal-Inheritance prototypal inheritance}.
+ * An important implication of this is if `ngModel` is used within `ngIf` to bind to
+ * a javascript primitive defined in the parent scope. In this case any modifications made to the
+ * variable within the child scope will override (hide) the value in the parent scope.
+ *
+ * Also, `ngIf` recreates elements using their compiled state. An example of this behavior
+ * is if an element's class attribute is directly modified after it's compiled, using something like
+ * jQuery's `.addClass()` method, and the element is later removed. When `ngIf` recreates the element
+ * the added class will be lost because the original compiled state is used to regenerate the element.
+ *
+ * Additionally, you can provide animations via the `ngAnimate` module to animate the `enter`
+ * and `leave` effects.
+ *
+ * @animations
+ * enter - happens just after the ngIf contents change and a new DOM element is created and injected into the ngIf container
+ * leave - happens just before the ngIf contents are removed from the DOM
+ *
+ * @element ANY
+ * @scope
+ * @priority 600
+ * @param {expression} ngIf If the {@link guide/expression expression} is falsy then
+ *     the element is removed from the DOM tree. If it is truthy a copy of the compiled
+ *     element is added to the DOM tree.
+ *
+ * @example
+  <example animations="true">
+    <file name="index.html">
+      Click me: <input type="checkbox" ng-model="checked" ng-init="checked=true" /><br/>
+      Show when checked:
+      <span ng-if="checked" class="animate-if">
+        I'm removed when the checkbox is unchecked.
+      </span>
+    </file>
+    <file name="animations.css">
+      .animate-if {
+        background:white;
+        border:1px solid black;
+        padding:10px;
+      }
+
+      /&#42;
+        The transition styles can also be placed on the CSS base class above
+      &#42;/
+      .animate-if.ng-enter, .animate-if.ng-leave {
+        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+      }
+
+      .animate-if.ng-enter,
+      .animate-if.ng-leave.ng-leave-active {
+        opacity:0;
+      }
+
+      .animate-if.ng-leave,
+      .animate-if.ng-enter.ng-enter-active {
+        opacity:1;
+      }
+    </file>
+  </example>
+ */
+var ngIfDirective = ['$animate', function($animate) {
+  return {
+    transclude: 'element',
+    priority: 600,
+    terminal: true,
+    restrict: 'A',
+    $$tlb: true,
+    link: function ($scope, $element, $attr, ctrl, $transclude) {
+        var block, childScope;
+        $scope.$watch($attr.ngIf, function ngIfWatchAction(value) {
+
+          if (toBoolean(value)) {
+            if (!childScope) {
+              childScope = $scope.$new();
+              $transclude(childScope, function (clone) {
+                clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');
+                // Note: We only need the first/last node of the cloned nodes.
+                // However, we need to keep the reference to the jqlite wrapper as it might be changed later
+                // by a directive with templateUrl when it's template arrives.
+                block = {
+                  clone: clone
+                };
+                $animate.enter(clone, $element.parent(), $element);
+              });
+            }
+          } else {
+
+            if (childScope) {
+              childScope.$destroy();
+              childScope = null;
+            }
+
+            if (block) {
+              $animate.leave(getBlockElements(block.clone));
+              block = null;
+            }
+          }
+        });
+    }
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngInclude
+ * @restrict ECA
+ *
+ * @description
+ * Fetches, compiles and includes an external HTML fragment.
+ *
+ * By default, the template URL is restricted to the same domain and protocol as the
+ * application document. This is done by calling {@link ng.$sce#methods_getTrustedResourceUrl
+ * $sce.getTrustedResourceUrl} on it. To load templates from other domains or protocols
+ * you may either {@link ng.$sceDelegateProvider#methods_resourceUrlWhitelist whitelist them} or
+ * {@link ng.$sce#methods_trustAsResourceUrl wrap them} as trusted values. Refer to Angular's {@link
+ * ng.$sce Strict Contextual Escaping}.
+ *
+ * In addition, the browser's
+ * {@link https://code.google.com/p/browsersec/wiki/Part2#Same-origin_policy_for_XMLHttpRequest
+ * Same Origin Policy} and {@link http://www.w3.org/TR/cors/ Cross-Origin Resource Sharing
+ * (CORS)} policy may further restrict whether the template is successfully loaded.
+ * For example, `ngInclude` won't work for cross-domain requests on all browsers and for `file://`
+ * access on some browsers.
+ *
+ * @animations
+ * enter - animation is used to bring new content into the browser.
+ * leave - animation is used to animate existing content away.
+ *
+ * The enter and leave animation occur concurrently.
+ *
+ * @scope
+ * @priority 400
+ *
+ * @param {string} ngInclude|src angular expression evaluating to URL. If the source is a string constant,
+ *                 make sure you wrap it in quotes, e.g. `src="'myPartialTemplate.html'"`.
+ * @param {string=} onload Expression to evaluate when a new partial is loaded.
+ *
+ * @param {string=} autoscroll Whether `ngInclude` should call {@link ng.$anchorScroll
+ *                  $anchorScroll} to scroll the viewport after the content is loaded.
+ *
+ *                  - If the attribute is not set, disable scrolling.
+ *                  - If the attribute is set without value, enable scrolling.
+ *                  - Otherwise enable scrolling only if the expression evaluates to truthy value.
+ *
+ * @example
+  <example animations="true">
+    <file name="index.html">
+     <div ng-controller="Ctrl">
+       <select ng-model="template" ng-options="t.name for t in templates">
+        <option value="">(blank)</option>
+       </select>
+       url of the template: <tt>{{template.url}}</tt>
+       <hr/>
+       <div class="slide-animate-container">
+         <div class="slide-animate" ng-include="template.url"></div>
+       </div>
+     </div>
+    </file>
+    <file name="script.js">
+      function Ctrl($scope) {
+        $scope.templates =
+          [ { name: 'template1.html', url: 'template1.html'}
+          , { name: 'template2.html', url: 'template2.html'} ];
+        $scope.template = $scope.templates[0];
+      }
+     </file>
+    <file name="template1.html">
+      Content of template1.html
+    </file>
+    <file name="template2.html">
+      Content of template2.html
+    </file>
+    <file name="animations.css">
+      .slide-animate-container {
+        position:relative;
+        background:white;
+        border:1px solid black;
+        height:40px;
+        overflow:hidden;
+      }
+
+      .slide-animate {
+        padding:10px;
+      }
+
+      .slide-animate.ng-enter, .slide-animate.ng-leave {
+        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+
+        position:absolute;
+        top:0;
+        left:0;
+        right:0;
+        bottom:0;
+        display:block;
+        padding:10px;
+      }
+
+      .slide-animate.ng-enter {
+        top:-50px;
+      }
+      .slide-animate.ng-enter.ng-enter-active {
+        top:0;
+      }
+
+      .slide-animate.ng-leave {
+        top:0;
+      }
+      .slide-animate.ng-leave.ng-leave-active {
+        top:50px;
+      }
+    </file>
+    <file name="scenario.js">
+      it('should load template1.html', function() {
+       expect(element('.doc-example-live [ng-include]').text()).
+         toMatch(/Content of template1.html/);
+      });
+      it('should load template2.html', function() {
+       select('template').option('1');
+       expect(element('.doc-example-live [ng-include]').text()).
+         toMatch(/Content of template2.html/);
+      });
+      it('should change to blank', function() {
+       select('template').option('');
+       expect(element('.doc-example-live [ng-include]')).toBe(undefined);
+      });
+    </file>
+  </example>
+ */
+
+
+/**
+ * @ngdoc event
+ * @name ng.directive:ngInclude#$includeContentRequested
+ * @eventOf ng.directive:ngInclude
+ * @eventType emit on the scope ngInclude was declared in
+ * @description
+ * Emitted every time the ngInclude content is requested.
+ */
+
+
+/**
+ * @ngdoc event
+ * @name ng.directive:ngInclude#$includeContentLoaded
+ * @eventOf ng.directive:ngInclude
+ * @eventType emit on the current ngInclude scope
+ * @description
+ * Emitted every time the ngInclude content is reloaded.
+ */
+var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$animate', '$sce',
+                  function($http,   $templateCache,   $anchorScroll,   $animate,   $sce) {
+  return {
+    restrict: 'ECA',
+    priority: 400,
+    terminal: true,
+    transclude: 'element',
+    controller: angular.noop,
+    compile: function(element, attr) {
+      var srcExp = attr.ngInclude || attr.src,
+          onloadExp = attr.onload || '',
+          autoScrollExp = attr.autoscroll;
+
+      return function(scope, $element, $attr, ctrl, $transclude) {
+        var changeCounter = 0,
+            currentScope,
+            currentElement;
+
+        var cleanupLastIncludeContent = function() {
+          if (currentScope) {
+            currentScope.$destroy();
+            currentScope = null;
+          }
+          if(currentElement) {
+            $animate.leave(currentElement);
+            currentElement = null;
+          }
+        };
+
+        scope.$watch($sce.parseAsResourceUrl(srcExp), function ngIncludeWatchAction(src) {
+          var afterAnimation = function() {
+            if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {
+              $anchorScroll();
+            }
+          };
+          var thisChangeId = ++changeCounter;
+
+          if (src) {
+            $http.get(src, {cache: $templateCache}).success(function(response) {
+              if (thisChangeId !== changeCounter) return;
+              var newScope = scope.$new();
+              ctrl.template = response;
+
+              // Note: This will also link all children of ng-include that were contained in the original
+              // html. If that content contains controllers, ... they could pollute/change the scope.
+              // However, using ng-include on an element with additional content does not make sense...
+              // Note: We can't remove them in the cloneAttchFn of $transclude as that
+              // function is called before linking the content, which would apply child
+              // directives to non existing elements.
+              var clone = $transclude(newScope, function(clone) {
+                cleanupLastIncludeContent();
+                $animate.enter(clone, null, $element, afterAnimation);
+              });
+
+              currentScope = newScope;
+              currentElement = clone;
+
+              currentScope.$emit('$includeContentLoaded');
+              scope.$eval(onloadExp);
+            }).error(function() {
+              if (thisChangeId === changeCounter) cleanupLastIncludeContent();
+            });
+            scope.$emit('$includeContentRequested');
+          } else {
+            cleanupLastIncludeContent();
+            ctrl.template = null;
+          }
+        });
+      };
+    }
+  };
+}];
+
+// This directive is called during the $transclude call of the first `ngInclude` directive.
+// It will replace and compile the content of the element with the loaded template.
+// We need this directive so that the element content is already filled when
+// the link function of another directive on the same element as ngInclude
+// is called.
+var ngIncludeFillContentDirective = ['$compile',
+  function($compile) {
+    return {
+      restrict: 'ECA',
+      priority: -400,
+      require: 'ngInclude',
+      link: function(scope, $element, $attr, ctrl) {
+        $element.html(ctrl.template);
+        $compile($element.contents())(scope);
+      }
+    };
+  }];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngInit
+ * @restrict AC
+ *
+ * @description
+ * The `ngInit` directive allows you to evaluate an expression in the
+ * current scope.
+ *
+ * <div class="alert alert-error">
+ * The only appropriate use of `ngInit` for aliasing special properties of
+ * {@link api/ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below. Besides this case, you
+ * should use {@link guide/controller controllers} rather than `ngInit`
+ * to initialize values on a scope.
+ * </div>
+ *
+ * @priority 450
+ *
+ * @element ANY
+ * @param {expression} ngInit {@link guide/expression Expression} to eval.
+ *
+ * @example
+   <doc:example>
+     <doc:source>
+   <script>
+     function Ctrl($scope) {
+       $scope.list = [['a', 'b'], ['c', 'd']];
+     }
+   </script>
+   <div ng-controller="Ctrl">
+     <div ng-repeat="innerList in list" ng-init="outerIndex = $index">
+       <div ng-repeat="value in innerList" ng-init="innerIndex = $index">
+          <span class="example-init">list[ {{outerIndex}} ][ {{innerIndex}} ] = {{value}};</span>
+       </div>
+     </div>
+   </div>
+     </doc:source>
+     <doc:scenario>
+       it('should alias index positions', function() {
+         expect(element('.example-init').text())
+           .toBe('list[ 0 ][ 0 ] = a;' +
+                 'list[ 0 ][ 1 ] = b;' +
+                 'list[ 1 ][ 0 ] = c;' +
+                 'list[ 1 ][ 1 ] = d;');
+       });
+     </doc:scenario>
+   </doc:example>
+ */
+var ngInitDirective = ngDirective({
+  priority: 450,
+  compile: function() {
+    return {
+      pre: function(scope, element, attrs) {
+        scope.$eval(attrs.ngInit);
+      }
+    };
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngNonBindable
+ * @restrict AC
+ * @priority 1000
+ *
+ * @description
+ * The `ngNonBindable` directive tells Angular not to compile or bind the contents of the current
+ * DOM element. This is useful if the element contains what appears to be Angular directives and
+ * bindings but which should be ignored by Angular. This could be the case if you have a site that
+ * displays snippets of code, for instance.
+ *
+ * @element ANY
+ *
+ * @example
+ * In this example there are two locations where a simple interpolation binding (`{{}}`) is present,
+ * but the one wrapped in `ngNonBindable` is left alone.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        <div>Normal: {{1 + 2}}</div>
+        <div ng-non-bindable>Ignored: {{1 + 2}}</div>
+      </doc:source>
+      <doc:scenario>
+       it('should check ng-non-bindable', function() {
+         expect(using('.doc-example-live').binding('1 + 2')).toBe('3');
+         expect(using('.doc-example-live').element('div:last').text()).
+           toMatch(/1 \+ 2/);
+       });
+      </doc:scenario>
+    </doc:example>
+ */
+var ngNonBindableDirective = ngDirective({ terminal: true, priority: 1000 });
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngPluralize
+ * @restrict EA
+ *
+ * @description
+ * # Overview
+ * `ngPluralize` is a directive that displays messages according to en-US localization rules.
+ * These rules are bundled with angular.js, but can be overridden
+ * (see {@link guide/i18n Angular i18n} dev guide). You configure ngPluralize directive
+ * by specifying the mappings between
+ * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+ * plural categories} and the strings to be displayed.
+ *
+ * # Plural categories and explicit number rules
+ * There are two
+ * {@link http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html
+ * plural categories} in Angular's default en-US locale: "one" and "other".
+ *
+ * While a plural category may match many numbers (for example, in en-US locale, "other" can match
+ * any number that is not 1), an explicit number rule can only match one number. For example, the
+ * explicit number rule for "3" matches the number 3. There are examples of plural categories
+ * and explicit number rules throughout the rest of this documentation.
+ *
+ * # Configuring ngPluralize
+ * You configure ngPluralize by providing 2 attributes: `count` and `when`.
+ * You can also provide an optional attribute, `offset`.
+ *
+ * The value of the `count` attribute can be either a string or an {@link guide/expression
+ * Angular expression}; these are evaluated on the current scope for its bound value.
+ *
+ * The `when` attribute specifies the mappings between plural categories and the actual
+ * string to be displayed. The value of the attribute should be a JSON object.
+ *
+ * The following example shows how to configure ngPluralize:
+ *
+ * <pre>
+ * <ng-pluralize count="personCount"
+                 when="{'0': 'Nobody is viewing.',
+ *                      'one': '1 person is viewing.',
+ *                      'other': '{} people are viewing.'}">
+ * </ng-pluralize>
+ *</pre>
+ *
+ * In the example, `"0: Nobody is viewing."` is an explicit number rule. If you did not
+ * specify this rule, 0 would be matched to the "other" category and "0 people are viewing"
+ * would be shown instead of "Nobody is viewing". You can specify an explicit number rule for
+ * other numbers, for example 12, so that instead of showing "12 people are viewing", you can
+ * show "a dozen people are viewing".
+ *
+ * You can use a set of closed braces (`{}`) as a placeholder for the number that you want substituted
+ * into pluralized strings. In the previous example, Angular will replace `{}` with
+ * <span ng-non-bindable>`{{personCount}}`</span>. The closed braces `{}` is a placeholder
+ * for <span ng-non-bindable>{{numberExpression}}</span>.
+ *
+ * # Configuring ngPluralize with offset
+ * The `offset` attribute allows further customization of pluralized text, which can result in
+ * a better user experience. For example, instead of the message "4 people are viewing this document",
+ * you might display "John, Kate and 2 others are viewing this document".
+ * The offset attribute allows you to offset a number by any desired value.
+ * Let's take a look at an example:
+ *
+ * <pre>
+ * <ng-pluralize count="personCount" offset=2
+ *               when="{'0': 'Nobody is viewing.',
+ *                      '1': '{{person1}} is viewing.',
+ *                      '2': '{{person1}} and {{person2}} are viewing.',
+ *                      'one': '{{person1}}, {{person2}} and one other person are viewing.',
+ *                      'other': '{{person1}}, {{person2}} and {} other people are viewing.'}">
+ * </ng-pluralize>
+ * </pre>
+ *
+ * Notice that we are still using two plural categories(one, other), but we added
+ * three explicit number rules 0, 1 and 2.
+ * When one person, perhaps John, views the document, "John is viewing" will be shown.
+ * When three people view the document, no explicit number rule is found, so
+ * an offset of 2 is taken off 3, and Angular uses 1 to decide the plural category.
+ * In this case, plural category 'one' is matched and "John, Marry and one other person are viewing"
+ * is shown.
+ *
+ * Note that when you specify offsets, you must provide explicit number rules for
+ * numbers from 0 up to and including the offset. If you use an offset of 3, for example,
+ * you must provide explicit number rules for 0, 1, 2 and 3. You must also provide plural strings for
+ * plural categories "one" and "other".
+ *
+ * @param {string|expression} count The variable to be bounded to.
+ * @param {string} when The mapping between plural category to its corresponding strings.
+ * @param {number=} offset Offset to deduct from the total number.
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        <script>
+          function Ctrl($scope) {
+            $scope.person1 = 'Igor';
+            $scope.person2 = 'Misko';
+            $scope.personCount = 1;
+          }
+        </script>
+        <div ng-controller="Ctrl">
+          Person 1:<input type="text" ng-model="person1" value="Igor" /><br/>
+          Person 2:<input type="text" ng-model="person2" value="Misko" /><br/>
+          Number of People:<input type="text" ng-model="personCount" value="1" /><br/>
+
+          <!--- Example with simple pluralization rules for en locale --->
+          Without Offset:
+          <ng-pluralize count="personCount"
+                        when="{'0': 'Nobody is viewing.',
+                               'one': '1 person is viewing.',
+                               'other': '{} people are viewing.'}">
+          </ng-pluralize><br>
+
+          <!--- Example with offset --->
+          With Offset(2):
+          <ng-pluralize count="personCount" offset=2
+                        when="{'0': 'Nobody is viewing.',
+                               '1': '{{person1}} is viewing.',
+                               '2': '{{person1}} and {{person2}} are viewing.',
+                               'one': '{{person1}}, {{person2}} and one other person are viewing.',
+                               'other': '{{person1}}, {{person2}} and {} other people are viewing.'}">
+          </ng-pluralize>
+        </div>
+      </doc:source>
+      <doc:scenario>
+        it('should show correct pluralized string', function() {
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                             toBe('1 person is viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                                                toBe('Igor is viewing.');
+
+          using('.doc-example-live').input('personCount').enter('0');
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                               toBe('Nobody is viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                                              toBe('Nobody is viewing.');
+
+          using('.doc-example-live').input('personCount').enter('2');
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                            toBe('2 people are viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                              toBe('Igor and Misko are viewing.');
+
+          using('.doc-example-live').input('personCount').enter('3');
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                            toBe('3 people are viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                              toBe('Igor, Misko and one other person are viewing.');
+
+          using('.doc-example-live').input('personCount').enter('4');
+          expect(element('.doc-example-live ng-pluralize:first').text()).
+                                            toBe('4 people are viewing.');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+                              toBe('Igor, Misko and 2 other people are viewing.');
+        });
+
+        it('should show data-binded names', function() {
+          using('.doc-example-live').input('personCount').enter('4');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+              toBe('Igor, Misko and 2 other people are viewing.');
+
+          using('.doc-example-live').input('person1').enter('Di');
+          using('.doc-example-live').input('person2').enter('Vojta');
+          expect(element('.doc-example-live ng-pluralize:last').text()).
+              toBe('Di, Vojta and 2 other people are viewing.');
+        });
+      </doc:scenario>
+    </doc:example>
+ */
+var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interpolate) {
+  var BRACE = /{}/g;
+  return {
+    restrict: 'EA',
+    link: function(scope, element, attr) {
+      var numberExp = attr.count,
+          whenExp = attr.$attr.when && element.attr(attr.$attr.when), // we have {{}} in attrs
+          offset = attr.offset || 0,
+          whens = scope.$eval(whenExp) || {},
+          whensExpFns = {},
+          startSymbol = $interpolate.startSymbol(),
+          endSymbol = $interpolate.endSymbol(),
+          isWhen = /^when(Minus)?(.+)$/;
+
+      forEach(attr, function(expression, attributeName) {
+        if (isWhen.test(attributeName)) {
+          whens[lowercase(attributeName.replace('when', '').replace('Minus', '-'))] =
+            element.attr(attr.$attr[attributeName]);
+        }
+      });
+      forEach(whens, function(expression, key) {
+        whensExpFns[key] =
+          $interpolate(expression.replace(BRACE, startSymbol + numberExp + '-' +
+            offset + endSymbol));
+      });
+
+      scope.$watch(function ngPluralizeWatch() {
+        var value = parseFloat(scope.$eval(numberExp));
+
+        if (!isNaN(value)) {
+          //if explicit number rule such as 1, 2, 3... is defined, just use it. Otherwise,
+          //check it against pluralization rules in $locale service
+          if (!(value in whens)) value = $locale.pluralCat(value - offset);
+           return whensExpFns[value](scope, element, true);
+        } else {
+          return '';
+        }
+      }, function ngPluralizeWatchAction(newVal) {
+        element.text(newVal);
+      });
+    }
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngRepeat
+ *
+ * @description
+ * The `ngRepeat` directive instantiates a template once per item from a collection. Each template
+ * instance gets its own scope, where the given loop variable is set to the current collection item,
+ * and `$index` is set to the item index or key.
+ *
+ * Special properties are exposed on the local scope of each template instance, including:
+ *
+ * | Variable  | Type            | Details                                                                     |
+ * |-----------|-----------------|-----------------------------------------------------------------------------|
+ * | `$index`  | {@type number}  | iterator offset of the repeated element (0..length-1)                       |
+ * | `$first`  | {@type boolean} | true if the repeated element is first in the iterator.                      |
+ * | `$middle` | {@type boolean} | true if the repeated element is between the first and last in the iterator. |
+ * | `$last`   | {@type boolean} | true if the repeated element is last in the iterator.                       |
+ * | `$even`   | {@type boolean} | true if the iterator position `$index` is even (otherwise false).           |
+ * | `$odd`    | {@type boolean} | true if the iterator position `$index` is odd (otherwise false).            |
+ *
+ *
+ * # Special repeat start and end points
+ * To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
+ * the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.
+ * The **ng-repeat-start** directive works the same as **ng-repeat**, but will repeat all the HTML code (including the tag it's defined on)
+ * up to and including the ending HTML tag where **ng-repeat-end** is placed.
+ *
+ * The example below makes use of this feature:
+ * <pre>
+ *   <header ng-repeat-start="item in items">
+ *     Header {{ item }}
+ *   </header>
+ *   <div class="body">
+ *     Body {{ item }}
+ *   </div>
+ *   <footer ng-repeat-end>
+ *     Footer {{ item }}
+ *   </footer>
+ * </pre>
+ *
+ * And with an input of {@type ['A','B']} for the items variable in the example above, the output will evaluate to:
+ * <pre>
+ *   <header>
+ *     Header A
+ *   </header>
+ *   <div class="body">
+ *     Body A
+ *   </div>
+ *   <footer>
+ *     Footer A
+ *   </footer>
+ *   <header>
+ *     Header B
+ *   </header>
+ *   <div class="body">
+ *     Body B
+ *   </div>
+ *   <footer>
+ *     Footer B
+ *   </footer>
+ * </pre>
+ *
+ * The custom start and end points for ngRepeat also support all other HTML directive syntax flavors provided in AngularJS (such
+ * as **data-ng-repeat-start**, **x-ng-repeat-start** and **ng:repeat-start**).
+ *
+ * @animations
+ * enter - when a new item is added to the list or when an item is revealed after a filter
+ * leave - when an item is removed from the list or when an item is filtered out
+ * move - when an adjacent item is filtered out causing a reorder or when the item contents are reordered
+ *
+ * @element ANY
+ * @scope
+ * @priority 1000
+ * @param {repeat_expression} ngRepeat The expression indicating how to enumerate a collection. These
+ *   formats are currently supported:
+ *
+ *   * `variable in expression` – where variable is the user defined loop variable and `expression`
+ *     is a scope expression giving the collection to enumerate.
+ *
+ *     For example: `album in artist.albums`.
+ *
+ *   * `(key, value) in expression` – where `key` and `value` can be any user defined identifiers,
+ *     and `expression` is the scope expression giving the collection to enumerate.
+ *
+ *     For example: `(name, age) in {'adam':10, 'amalie':12}`.
+ *
+ *   * `variable in expression track by tracking_expression` – You can also provide an optional tracking function
+ *     which can be used to associate the objects in the collection with the DOM elements. If no tracking function
+ *     is specified the ng-repeat associates elements by identity in the collection. It is an error to have
+ *     more than one tracking function to resolve to the same key. (This would mean that two distinct objects are
+ *     mapped to the same DOM element, which is not possible.)  Filters should be applied to the expression,
+ *     before specifying a tracking expression.
+ *
+ *     For example: `item in items` is equivalent to `item in items track by $id(item)'. This implies that the DOM elements
+ *     will be associated by item identity in the array.
+ *
+ *     For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique
+ *     `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements
+ *     with the corresponding item in the array by identity. Moving the same object in array would move the DOM
+ *     element in the same way in the DOM.
+ *
+ *     For example: `item in items track by item.id` is a typical pattern when the items come from the database. In this
+ *     case the object identity does not matter. Two objects are considered equivalent as long as their `id`
+ *     property is same.
+ *
+ *     For example: `item in items | filter:searchText track by item.id` is a pattern that might be used to apply a filter
+ *     to items in conjunction with a tracking expression.
+ *
+ * @example
+ * This example initializes the scope to a list of names and
+ * then uses `ngRepeat` to display every person:
+  <example animations="true">
+    <file name="index.html">
+      <div ng-init="friends = [
+        {name:'John', age:25, gender:'boy'},
+        {name:'Jessie', age:30, gender:'girl'},
+        {name:'Johanna', age:28, gender:'girl'},
+        {name:'Joy', age:15, gender:'girl'},
+        {name:'Mary', age:28, gender:'girl'},
+        {name:'Peter', age:95, gender:'boy'},
+        {name:'Sebastian', age:50, gender:'boy'},
+        {name:'Erika', age:27, gender:'girl'},
+        {name:'Patrick', age:40, gender:'boy'},
+        {name:'Samantha', age:60, gender:'girl'}
+      ]">
+        I have {{friends.length}} friends. They are:
+        <input type="search" ng-model="q" placeholder="filter friends..." />
+        <ul class="example-animate-container">
+          <li class="animate-repeat" ng-repeat="friend in friends | filter:q">
+            [{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
+          </li>
+        </ul>
+      </div>
+    </file>
+    <file name="animations.css">
+      .example-animate-container {
+        background:white;
+        border:1px solid black;
+        list-style:none;
+        margin:0;
+        padding:0 10px;
+      }
+
+      .animate-repeat {
+        line-height:40px;
+        list-style:none;
+        box-sizing:border-box;
+      }
+
+      .animate-repeat.ng-move,
+      .animate-repeat.ng-enter,
+      .animate-repeat.ng-leave {
+        -webkit-transition:all linear 0.5s;
+        transition:all linear 0.5s;
+      }
+
+      .animate-repeat.ng-leave.ng-leave-active,
+      .animate-repeat.ng-move,
+      .animate-repeat.ng-enter {
+        opacity:0;
+        max-height:0;
+      }
+
+      .animate-repeat.ng-leave,
+      .animate-repeat.ng-move.ng-move-active,
+      .animate-repeat.ng-enter.ng-enter-active {
+        opacity:1;
+        max-height:40px;
+      }
+    </file>
+    <file name="scenario.js">
+       it('should render initial data set', function() {
+         var r = using('.doc-example-live').repeater('ul li');
+         expect(r.count()).toBe(10);
+         expect(r.row(0)).toEqual(["1","John","25"]);
+         expect(r.row(1)).toEqual(["2","Jessie","30"]);
+         expect(r.row(9)).toEqual(["10","Samantha","60"]);
+         expect(binding('friends.length')).toBe("10");
+       });
+
+       it('should update repeater when filter predicate changes', function() {
+         var r = using('.doc-example-live').repeater('ul li');
+         expect(r.count()).toBe(10);
+
+         input('q').enter('ma');
+
+         expect(r.count()).toBe(2);
+         expect(r.row(0)).toEqual(["1","Mary","28"]);
+         expect(r.row(1)).toEqual(["2","Samantha","60"]);
+       });
+      </file>
+    </example>
+ */
+var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
+  var NG_REMOVED = '$$NG_REMOVED';
+  var ngRepeatMinErr = minErr('ngRepeat');
+  return {
+    transclude: 'element',
+    priority: 1000,
+    terminal: true,
+    $$tlb: true,
+    link: function($scope, $element, $attr, ctrl, $transclude){
+        var expression = $attr.ngRepeat;
+        var match = expression.match(/^\s*(.+)\s+in\s+(.*?)\s*(\s+track\s+by\s+(.+)\s*)?$/),
+          trackByExp, trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn,
+          lhs, rhs, valueIdentifier, keyIdentifier,
+          hashFnLocals = {$id: hashKey};
+
+        if (!match) {
+          throw ngRepeatMinErr('iexp', "Expected expression in form of '_item_ in _collection_[ track by _id_]' but got '{0}'.",
+            expression);
+        }
+
+        lhs = match[1];
+        rhs = match[2];
+        trackByExp = match[4];
+
+        if (trackByExp) {
+          trackByExpGetter = $parse(trackByExp);
+          trackByIdExpFn = function(key, value, index) {
+            // assign key, value, and $index to the locals so that they can be used in hash functions
+            if (keyIdentifier) hashFnLocals[keyIdentifier] = key;
+            hashFnLocals[valueIdentifier] = value;
+            hashFnLocals.$index = index;
+            return trackByExpGetter($scope, hashFnLocals);
+          };
+        } else {
+          trackByIdArrayFn = function(key, value) {
+            return hashKey(value);
+          };
+          trackByIdObjFn = function(key) {
+            return key;
+          };
+        }
+
+        match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);
+        if (!match) {
+          throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",
+                                                                    lhs);
+        }
+        valueIdentifier = match[3] || match[1];
+        keyIdentifier = match[2];
+
+        // Store a list of elements from previous run. This is a hash where key is the item from the
+        // iterator, and the value is objects with following properties.
+        //   - scope: bound scope
+        //   - element: previous element.
+        //   - index: position
+        var lastBlockMap = {};
+
+        //watch props
+        $scope.$watchCollection(rhs, function ngRepeatAction(collection){
+          var index, length,
+              previousNode = $element[0],     // current position of the node
+              nextNode,
+              // Same as lastBlockMap but it has the current state. It will become the
+              // lastBlockMap on the next iteration.
+              nextBlockMap = {},
+              arrayLength,
+              childScope,
+              key, value, // key/value of iteration
+              trackById,
+              trackByIdFn,
+              collectionKeys,
+              block,       // last object information {scope, element, id}
+              nextBlockOrder = [],
+              elementsToRemove;
+
+
+          if (isArrayLike(collection)) {
+            collectionKeys = collection;
+            trackByIdFn = trackByIdExpFn || trackByIdArrayFn;
+          } else {
+            trackByIdFn = trackByIdExpFn || trackByIdObjFn;
+            // if object, extract keys, sort them and use to determine order of iteration over obj props
+            collectionKeys = [];
+            for (key in collection) {
+              if (collection.hasOwnProperty(key) && key.charAt(0) != '$') {
+                collectionKeys.push(key);
+              }
+            }
+            collectionKeys.sort();
+          }
+
+          arrayLength = collectionKeys.length;
+
+          // locate existing items
+          length = nextBlockOrder.length = collectionKeys.length;
+          for(index = 0; index < length; index++) {
+           key = (collection === collectionKeys) ? index : collectionKeys[index];
+           value = collection[key];
+           trackById = trackByIdFn(key, value, index);
+           assertNotHasOwnProperty(trackById, '`track by` id');
+           if(lastBlockMap.hasOwnProperty(trackById)) {
+             block = lastBlockMap[trackById];
+             delete lastBlockMap[trackById];
+             nextBlockMap[trackById] = block;
+             nextBlockOrder[index] = block;
+           } else if (nextBlockMap.hasOwnProperty(trackById)) {
+             // restore lastBlockMap
+             forEach(nextBlockOrder, function(block) {
+               if (block && block.scope) lastBlockMap[block.id] = block;
+             });
+             // This is a duplicate and we need to throw an error
+             throw ngRepeatMinErr('dupes', "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}",
+                                                                                                                                                    expression,       trackById);
+           } else {
+             // new never before seen block
+             nextBlockOrder[index] = { id: trackById };
+             nextBlockMap[trackById] = false;
+           }
+         }
+
+          // remove existing items
+          for (key in lastBlockMap) {
+            // lastBlockMap is our own object so we don't need to use special hasOwnPropertyFn
+            if (lastBlockMap.hasOwnProperty(key)) {
+              block = lastBlockMap[key];
+              elementsToRemove = getBlockElements(block.clone);
+              $animate.leave(elementsToRemove);
+              forEach(elementsToRemove, function(element) { element[NG_REMOVED] = true; });
+              block.scope.$destroy();
+            }
+          }
+
+          // we are not using forEach for perf reasons (trying to avoid #call)
+          for (index = 0, length = collectionKeys.length; index < length; index++) {
+            key = (collection === collectionKeys) ? index : collectionKeys[index];
+            value = collection[key];
+            block = nextBlockOrder[index];
+            if (nextBlockOrder[index - 1]) previousNode = getBlockEnd(nextBlockOrder[index - 1]);
+
+            if (block.scope) {
+              // if we have already seen this object, then we need to reuse the
+              // associated scope/element
+              childScope = block.scope;
+
+              nextNode = previousNode;
+              do {
+                nextNode = nextNode.nextSibling;
+              } while(nextNode && nextNode[NG_REMOVED]);
+
+              if (getBlockStart(block) != nextNode) {
+                // existing item which got moved
+                $animate.move(getBlockElements(block.clone), null, jqLite(previousNode));
+              }
+              previousNode = getBlockEnd(block);
+            } else {
+              // new item which we don't know about
+              childScope = $scope.$new();
+            }
+
+            childScope[valueIdentifier] = value;
+            if (keyIdentifier) childScope[keyIdentifier] = key;
+            childScope.$index = index;
+            childScope.$first = (index === 0);
+            childScope.$last = (index === (arrayLength - 1));
+            childScope.$middle = !(childScope.$first || childScope.$last);
+            // jshint bitwise: false
+            childScope.$odd = !(childScope.$even = (index&1) === 0);
+            // jshint bitwise: true
+
+            if (!block.scope) {
+              $transclude(childScope, function(clone) {
+                clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');
+                $animate.enter(clone, null, jqLite(previousNode));
+                previousNode = clone;
+                block.scope = childScope;
+                // Note: We only need the first/last node of the cloned nodes.
+                // However, we need to keep the reference to the jqlite wrapper as it might be changed later
+                // by a directive with templateUrl when it's template arrives.
+                block.clone = clone;
+                nextBlockMap[block.id] = block;
+              });
+            }
+          }
+          lastBlockMap = nextBlockMap;
+        });
+    }
+  };
+
+  function getBlockStart(block) {
+    return block.clone[0];
+  }
+
+  function getBlockEnd(block) {
+    return block.clone[block.clone.length - 1];
+  }
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngShow
+ *
+ * @description
+ * The `ngShow` directive shows or hides the given HTML element based on the expression
+ * provided to the ngShow attribute. The element is shown or hidden by removing or adding
+ * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined
+ * in AngularJS and sets the display style to none (using an !important flag).
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
+ *
+ * <pre>
+ * <!-- when $scope.myValue is truthy (element is visible) -->
+ * <div ng-show="myValue"></div>
+ *
+ * <!-- when $scope.myValue is falsy (element is hidden) -->
+ * <div ng-show="myValue" class="ng-hide"></div>
+ * </pre>
+ *
+ * When the ngShow expression evaluates to false then the ng-hide CSS class is added to the class attribute
+ * on the element causing it to become hidden. When true, the ng-hide CSS class is removed
+ * from the element causing the element not to appear hidden.
+ *
+ * ## Why is !important used?
+ *
+ * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector
+ * can be easily overridden by heavier selectors. For example, something as simple
+ * as changing the display style on a HTML list item would make hidden elements appear visible.
+ * This also becomes a bigger issue when dealing with CSS frameworks.
+ *
+ * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector
+ * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the
+ * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.
+ *
+ * ### Overriding .ng-hide
+ *
+ * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by
+ * restating the styles for the .ng-hide class in CSS:
+ * <pre>
+ * .ng-hide {
+ *   //!annotate CSS Specificity|Not to worry, this will override the AngularJS default...
+ *   display:block!important;
+ *
+ *   //this is just another form of hiding an element
+ *   position:absolute;
+ *   top:-9999px;
+ *   left:-9999px;
+ * }
+ * </pre>
+ *
+ * Just remember to include the important flag so the CSS override will function.
+ *
+ * ## A note about animations with ngShow
+ *
+ * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression
+ * is true and false. This system works like the animation system present with ngClass except that
+ * you must also include the !important flag to override the display property
+ * so that you can perform an animation when the element is hidden during the time of the animation.
+ *
+ * <pre>
+ * //
+ * //a working example can be found at the bottom of this page
+ * //
+ * .my-element.ng-hide-add, .my-element.ng-hide-remove {
+ *   transition:0.5s linear all;
+ *   display:block!important;
+ * }
+ *
+ * .my-element.ng-hide-add { ... }
+ * .my-element.ng-hide-add.ng-hide-add-active { ... }
+ * .my-element.ng-hide-remove { ... }
+ * .my-element.ng-hide-remove.ng-hide-remove-active { ... }
+ * </pre>
+ *
+ * @animations
+ * addClass: .ng-hide - happens after the ngShow expression evaluates to a truthy value and the just before contents are set to visible
+ * removeClass: .ng-hide - happens after the ngShow expression evaluates to a non truthy value and just before the contents are set to hidden
+ *
+ * @element ANY
+ * @param {expression} ngShow If the {@link guide/expression expression} is truthy
+ *     then the element is shown or hidden respectively.
+ *
+ * @example
+  <example animations="true">
+    <file name="index.html">
+      Click me: <input type="checkbox" ng-model="checked"><br/>
+      <div>
+        Show:
+        <div class="check-element animate-show" ng-show="checked">
+          <span class="icon-thumbs-up"></span> I show up when your checkbox is checked.
+        </div>
+      </div>
+      <div>
+        Hide:
+        <div class="check-element animate-show" ng-hide="checked">
+          <span class="icon-thumbs-down"></span> I hide when your checkbox is checked.
+        </div>
+      </div>
+    </file>
+    <file name="animations.css">
+      .animate-show {
+        -webkit-transition:all linear 0.5s;
+        transition:all linear 0.5s;
+        line-height:20px;
+        opacity:1;
+        padding:10px;
+        border:1px solid black;
+        background:white;
+      }
+
+      .animate-show.ng-hide-add,
+      .animate-show.ng-hide-remove {
+        display:block!important;
+      }
+
+      .animate-show.ng-hide {
+        line-height:0;
+        opacity:0;
+        padding:0 10px;
+      }
+
+      .check-element {
+        padding:10px;
+        border:1px solid black;
+        background:white;
+      }
+    </file>
+    <file name="scenario.js">
+       it('should check ng-show / ng-hide', function() {
+         expect(element('.doc-example-live span:first:hidden').count()).toEqual(1);
+         expect(element('.doc-example-live span:last:visible').count()).toEqual(1);
+
+         input('checked').check();
+
+         expect(element('.doc-example-live span:first:visible').count()).toEqual(1);
+         expect(element('.doc-example-live span:last:hidden').count()).toEqual(1);
+       });
+    </file>
+  </example>
+ */
+var ngShowDirective = ['$animate', function($animate) {
+  return function(scope, element, attr) {
+    scope.$watch(attr.ngShow, function ngShowWatchAction(value){
+      $animate[toBoolean(value) ? 'removeClass' : 'addClass'](element, 'ng-hide');
+    });
+  };
+}];
+
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngHide
+ *
+ * @description
+ * The `ngHide` directive shows or hides the given HTML element based on the expression
+ * provided to the ngHide attribute. The element is shown or hidden by removing or adding
+ * the `ng-hide` CSS class onto the element. The `.ng-hide` CSS class is predefined
+ * in AngularJS and sets the display style to none (using an !important flag).
+ * For CSP mode please add `angular-csp.css` to your html file (see {@link ng.directive:ngCsp ngCsp}).
+ *
+ * <pre>
+ * <!-- when $scope.myValue is truthy (element is hidden) -->
+ * <div ng-hide="myValue"></div>
+ *
+ * <!-- when $scope.myValue is falsy (element is visible) -->
+ * <div ng-hide="myValue" class="ng-hide"></div>
+ * </pre>
+ *
+ * When the ngHide expression evaluates to true then the .ng-hide CSS class is added to the class attribute
+ * on the element causing it to become hidden. When false, the ng-hide CSS class is removed
+ * from the element causing the element not to appear hidden.
+ *
+ * ## Why is !important used?
+ *
+ * You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector
+ * can be easily overridden by heavier selectors. For example, something as simple
+ * as changing the display style on a HTML list item would make hidden elements appear visible.
+ * This also becomes a bigger issue when dealing with CSS frameworks.
+ *
+ * By using !important, the show and hide behavior will work as expected despite any clash between CSS selector
+ * specificity (when !important isn't used with any conflicting styles). If a developer chooses to override the
+ * styling to change how to hide an element then it is just a matter of using !important in their own CSS code.
+ *
+ * ### Overriding .ng-hide
+ *
+ * If you wish to change the hide behavior with ngShow/ngHide then this can be achieved by
+ * restating the styles for the .ng-hide class in CSS:
+ * <pre>
+ * .ng-hide {
+ *   //!annotate CSS Specificity|Not to worry, this will override the AngularJS default...
+ *   display:block!important;
+ *
+ *   //this is just another form of hiding an element
+ *   position:absolute;
+ *   top:-9999px;
+ *   left:-9999px;
+ * }
+ * </pre>
+ *
+ * Just remember to include the important flag so the CSS override will function.
+ *
+ * ## A note about animations with ngHide
+ *
+ * Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression
+ * is true and false. This system works like the animation system present with ngClass, except that
+ * you must also include the !important flag to override the display property so
+ * that you can perform an animation when the element is hidden during the time of the animation.
+ *
+ * <pre>
+ * //
+ * //a working example can be found at the bottom of this page
+ * //
+ * .my-element.ng-hide-add, .my-element.ng-hide-remove {
+ *   transition:0.5s linear all;
+ *   display:block!important;
+ * }
+ *
+ * .my-element.ng-hide-add { ... }
+ * .my-element.ng-hide-add.ng-hide-add-active { ... }
+ * .my-element.ng-hide-remove { ... }
+ * .my-element.ng-hide-remove.ng-hide-remove-active { ... }
+ * </pre>
+ *
+ * @animations
+ * removeClass: .ng-hide - happens after the ngHide expression evaluates to a truthy value and just before the contents are set to hidden
+ * addClass: .ng-hide - happens after the ngHide expression evaluates to a non truthy value and just before the contents are set to visible
+ *
+ * @element ANY
+ * @param {expression} ngHide If the {@link guide/expression expression} is truthy then
+ *     the element is shown or hidden respectively.
+ *
+ * @example
+  <example animations="true">
+    <file name="index.html">
+      Click me: <input type="checkbox" ng-model="checked"><br/>
+      <div>
+        Show:
+        <div class="check-element animate-hide" ng-show="checked">
+          <span class="icon-thumbs-up"></span> I show up when your checkbox is checked.
+        </div>
+      </div>
+      <div>
+        Hide:
+        <div class="check-element animate-hide" ng-hide="checked">
+          <span class="icon-thumbs-down"></span> I hide when your checkbox is checked.
+        </div>
+      </div>
+    </file>
+    <file name="animations.css">
+      .animate-hide {
+        -webkit-transition:all linear 0.5s;
+        transition:all linear 0.5s;
+        line-height:20px;
+        opacity:1;
+        padding:10px;
+        border:1px solid black;
+        background:white;
+      }
+
+      .animate-hide.ng-hide-add,
+      .animate-hide.ng-hide-remove {
+        display:block!important;
+      }
+
+      .animate-hide.ng-hide {
+        line-height:0;
+        opacity:0;
+        padding:0 10px;
+      }
+
+      .check-element {
+        padding:10px;
+        border:1px solid black;
+        background:white;
+      }
+    </file>
+    <file name="scenario.js">
+       it('should check ng-show / ng-hide', function() {
+         expect(element('.doc-example-live .check-element:first:hidden').count()).toEqual(1);
+         expect(element('.doc-example-live .check-element:last:visible').count()).toEqual(1);
+
+         input('checked').check();
+
+         expect(element('.doc-example-live .check-element:first:visible').count()).toEqual(1);
+         expect(element('.doc-example-live .check-element:last:hidden').count()).toEqual(1);
+       });
+    </file>
+  </example>
+ */
+var ngHideDirective = ['$animate', function($animate) {
+  return function(scope, element, attr) {
+    scope.$watch(attr.ngHide, function ngHideWatchAction(value){
+      $animate[toBoolean(value) ? 'addClass' : 'removeClass'](element, 'ng-hide');
+    });
+  };
+}];
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngStyle
+ * @restrict AC
+ *
+ * @description
+ * The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.
+ *
+ * @element ANY
+ * @param {expression} ngStyle {@link guide/expression Expression} which evals to an
+ *      object whose keys are CSS style names and values are corresponding values for those CSS
+ *      keys.
+ *
+ * @example
+   <example>
+     <file name="index.html">
+        <input type="button" value="set" ng-click="myStyle={color:'red'}">
+        <input type="button" value="clear" ng-click="myStyle={}">
+        <br/>
+        <span ng-style="myStyle">Sample Text</span>
+        <pre>myStyle={{myStyle}}</pre>
+     </file>
+     <file name="style.css">
+       span {
+         color: black;
+       }
+     </file>
+     <file name="scenario.js">
+       it('should check ng-style', function() {
+         expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)');
+         element('.doc-example-live :button[value=set]').click();
+         expect(element('.doc-example-live span').css('color')).toBe('rgb(255, 0, 0)');
+         element('.doc-example-live :button[value=clear]').click();
+         expect(element('.doc-example-live span').css('color')).toBe('rgb(0, 0, 0)');
+       });
+     </file>
+   </example>
+ */
+var ngStyleDirective = ngDirective(function(scope, element, attr) {
+  scope.$watch(attr.ngStyle, function ngStyleWatchAction(newStyles, oldStyles) {
+    if (oldStyles && (newStyles !== oldStyles)) {
+      forEach(oldStyles, function(val, style) { element.css(style, '');});
+    }
+    if (newStyles) element.css(newStyles);
+  }, true);
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngSwitch
+ * @restrict EA
+ *
+ * @description
+ * The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.
+ * Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location
+ * as specified in the template.
+ *
+ * The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it
+ * from the template cache), `ngSwitch` simply choses one of the nested elements and makes it visible based on which element
+ * matches the value obtained from the evaluated expression. In other words, you define a container element
+ * (where you place the directive), place an expression on the **`on="..."` attribute**
+ * (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place
+ * a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on
+ * expression is evaluated. If a matching expression is not found via a when attribute then an element with the default
+ * attribute is displayed.
+ *
+ * <div class="alert alert-info">
+ * Be aware that the attribute values to match against cannot be expressions. They are interpreted
+ * as literal string values to match against.
+ * For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the
+ * value of the expression `$scope.someVal`.
+ * </div>
+
+ * @animations
+ * enter - happens after the ngSwitch contents change and the matched child element is placed inside the container
+ * leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM
+ *
+ * @usage
+ * <ANY ng-switch="expression">
+ *   <ANY ng-switch-when="matchValue1">...</ANY>
+ *   <ANY ng-switch-when="matchValue2">...</ANY>
+ *   <ANY ng-switch-default>...</ANY>
+ * </ANY>
+ *
+ *
+ * @scope
+ * @priority 800
+ * @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.
+ * @paramDescription
+ * On child elements add:
+ *
+ * * `ngSwitchWhen`: the case statement to match against. If match then this
+ *   case will be displayed. If the same match appears multiple times, all the
+ *   elements will be displayed.
+ * * `ngSwitchDefault`: the default case when no other case match. If there
+ *   are multiple default cases, all of them will be displayed when no other
+ *   case match.
+ *
+ *
+ * @example
+  <example animations="true">
+    <file name="index.html">
+      <div ng-controller="Ctrl">
+        <select ng-model="selection" ng-options="item for item in items">
+        </select>
+        <tt>selection={{selection}}</tt>
+        <hr/>
+        <div class="animate-switch-container"
+          ng-switch on="selection">
+            <div class="animate-switch" ng-switch-when="settings">Settings Div</div>
+            <div class="animate-switch" ng-switch-when="home">Home Span</div>
+            <div class="animate-switch" ng-switch-default>default</div>
+        </div>
+      </div>
+    </file>
+    <file name="script.js">
+      function Ctrl($scope) {
+        $scope.items = ['settings', 'home', 'other'];
+        $scope.selection = $scope.items[0];
+      }
+    </file>
+    <file name="animations.css">
+      .animate-switch-container {
+        position:relative;
+        background:white;
+        border:1px solid black;
+        height:40px;
+        overflow:hidden;
+      }
+
+      .animate-switch {
+        padding:10px;
+      }
+
+      .animate-switch.ng-animate {
+        -webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+        transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
+
+        position:absolute;
+        top:0;
+        left:0;
+        right:0;
+        bottom:0;
+      }
+
+      .animate-switch.ng-leave.ng-leave-active,
+      .animate-switch.ng-enter {
+        top:-50px;
+      }
+      .animate-switch.ng-leave,
+      .animate-switch.ng-enter.ng-enter-active {
+        top:0;
+      }
+    </file>
+    <file name="scenario.js">
+      it('should start in settings', function() {
+        expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Settings Div/);
+      });
+      it('should change to home', function() {
+        select('selection').option('home');
+        expect(element('.doc-example-live [ng-switch]').text()).toMatch(/Home Span/);
+      });
+      it('should select default', function() {
+        select('selection').option('other');
+        expect(element('.doc-example-live [ng-switch]').text()).toMatch(/default/);
+      });
+    </file>
+  </example>
+ */
+var ngSwitchDirective = ['$animate', function($animate) {
+  return {
+    restrict: 'EA',
+    require: 'ngSwitch',
+
+    // asks for $scope to fool the BC controller module
+    controller: ['$scope', function ngSwitchController() {
+     this.cases = {};
+    }],
+    link: function(scope, element, attr, ngSwitchController) {
+      var watchExpr = attr.ngSwitch || attr.on,
+          selectedTranscludes,
+          selectedElements,
+          selectedScopes = [];
+
+      scope.$watch(watchExpr, function ngSwitchWatchAction(value) {
+        for (var i= 0, ii=selectedScopes.length; i<ii; i++) {
+          selectedScopes[i].$destroy();
+          $animate.leave(selectedElements[i]);
+        }
+
+        selectedElements = [];
+        selectedScopes = [];
+
+        if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {
+          scope.$eval(attr.change);
+          forEach(selectedTranscludes, function(selectedTransclude) {
+            var selectedScope = scope.$new();
+            selectedScopes.push(selectedScope);
+            selectedTransclude.transclude(selectedScope, function(caseElement) {
+              var anchor = selectedTransclude.element;
+
+              selectedElements.push(caseElement);
+              $animate.enter(caseElement, anchor.parent(), anchor);
+            });
+          });
+        }
+      });
+    }
+  };
+}];
+
+var ngSwitchWhenDirective = ngDirective({
+  transclude: 'element',
+  priority: 800,
+  require: '^ngSwitch',
+  compile: function(element, attrs) {
+    return function(scope, element, attr, ctrl, $transclude) {
+      ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);
+      ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });
+    };
+  }
+});
+
+var ngSwitchDefaultDirective = ngDirective({
+  transclude: 'element',
+  priority: 800,
+  require: '^ngSwitch',
+  link: function(scope, element, attr, ctrl, $transclude) {
+    ctrl.cases['?'] = (ctrl.cases['?'] || []);
+    ctrl.cases['?'].push({ transclude: $transclude, element: element });
+   }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:ngTransclude
+ * @restrict AC
+ *
+ * @description
+ * Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.
+ *
+ * Any existing content of the element that this directive is placed on will be removed before the transcluded content is inserted.
+ *
+ * @element ANY
+ *
+ * @example
+   <doc:example module="transclude">
+     <doc:source>
+       <script>
+         function Ctrl($scope) {
+           $scope.title = 'Lorem Ipsum';
+           $scope.text = 'Neque porro quisquam est qui dolorem ipsum quia dolor...';
+         }
+
+         angular.module('transclude', [])
+          .directive('pane', function(){
+             return {
+               restrict: 'E',
+               transclude: true,
+               scope: { title:'@' },
+               template: '<div style="border: 1px solid black;">' +
+                           '<div style="background-color: gray">{{title}}</div>' +
+                           '<div ng-transclude></div>' +
+                         '</div>'
+             };
+         });
+       </script>
+       <div ng-controller="Ctrl">
+         <input ng-model="title"><br>
+         <textarea ng-model="text"></textarea> <br/>
+         <pane title="{{title}}">{{text}}</pane>
+       </div>
+     </doc:source>
+     <doc:scenario>
+        it('should have transcluded', function() {
+          input('title').enter('TITLE');
+          input('text').enter('TEXT');
+          expect(binding('title')).toEqual('TITLE');
+          expect(binding('text')).toEqual('TEXT');
+        });
+     </doc:scenario>
+   </doc:example>
+ *
+ */
+var ngTranscludeDirective = ngDirective({
+  controller: ['$element', '$transclude', function($element, $transclude) {
+    if (!$transclude) {
+      throw minErr('ngTransclude')('orphan',
+          'Illegal use of ngTransclude directive in the template! ' +
+          'No parent directive that requires a transclusion found. ' +
+          'Element: {0}',
+          startingTag($element));
+    }
+
+    // remember the transclusion fn but call it during linking so that we don't process transclusion before directives on
+    // the parent element even when the transclusion replaces the current element. (we can't use priority here because
+    // that applies only to compile fns and not controllers
+    this.$transclude = $transclude;
+  }],
+
+  link: function($scope, $element, $attrs, controller) {
+    controller.$transclude(function(clone) {
+      $element.empty();
+      $element.append(clone);
+    });
+  }
+});
+
+/**
+ * @ngdoc directive
+ * @name ng.directive:script
+ * @restrict E
+ *
+ * @description
+ * Load content of a script tag, with type `text/ng-template`, into `$templateCache`, so that the
+ * template can be used by `ngInclude`, `ngView` or directive templates.
+ *
+ * @param {'text/ng-template'} type must be set to `'text/ng-template'`
+ *
+ * @example
+  <doc:example>
+    <doc:source>
+      <script type="text/ng-template" id="/tpl.html">
+        Content of the template.
+      </script>
+
+      <a ng-click="currentTpl='/tpl.html'" id="tpl-link">Load inlined template</a>
+      <div id="tpl-content" ng-include src="currentTpl"></div>
+    </doc:source>
+    <doc:scenario>
+      it('should load template defined inside script tag', function() {
+        element('#tpl-link').click();
+        expect(element('#tpl-content').text()).toMatch(/Content of the template/);
+      });
+    </doc:scenario>
+  </doc:example>
+ */
+var scriptDirective = ['$templateCache', function($templateCache) {
+  return {
+    restrict: 'E',
+    terminal: true,
+    compile: function(element, attr) {
+      if (attr.type == 'text/ng-template') {
+        var templateUrl = attr.id,
+            // IE is not consistent, in scripts we have to read .text but in other nodes we have to read .textContent
+            text = element[0].text;
+
+        $templateCache.put(templateUrl, text);
+      }
+    }
+  };
+}];
+
+var ngOptionsMinErr = minErr('ngOptions');
+/**
+ * @ngdoc directive
+ * @name ng.directive:select
+ * @restrict E
+ *
+ * @description
+ * HTML `SELECT` element with angular data-binding.
+ *
+ * # `ngOptions`
+ *
+ * The `ngOptions` attribute can be used to dynamically generate a list of `<option>`
+ * elements for the `<select>` element using the array or object obtained by evaluating the
+ * `ngOptions` comprehension_expression.
+ *
+ * When an item in the `<select>` menu is selected, the array element or object property
+ * represented by the selected option will be bound to the model identified by the `ngModel`
+ * directive.
+ *
+ * Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can
+ * be nested into the `<select>` element. This element will then represent the `null` or "not selected"
+ * option. See example below for demonstration.
+ *
+ * Note: `ngOptions` provides iterator facility for `<option>` element which should be used instead
+ * of {@link ng.directive:ngRepeat ngRepeat} when you want the
+ * `select` model to be bound to a non-string value. This is because an option element can only
+ * be bound to string values at present.
+ *
+ * @param {string} ngModel Assignable angular expression to data-bind to.
+ * @param {string=} name Property name of the form under which the control is published.
+ * @param {string=} required The control is considered valid only if value is entered.
+ * @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
+ *    the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
+ *    `required` when you want to data-bind to the `required` attribute.
+ * @param {comprehension_expression=} ngOptions in one of the following forms:
+ *
+ *   * for array data sources:
+ *     * `label` **`for`** `value` **`in`** `array`
+ *     * `select` **`as`** `label` **`for`** `value` **`in`** `array`
+ *     * `label`  **`group by`** `group` **`for`** `value` **`in`** `array`
+ *     * `select` **`as`** `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`
+ *   * for object data sources:
+ *     * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
+ *     * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
+ *     * `label` **`group by`** `group` **`for (`**`key`**`,`** `value`**`) in`** `object`
+ *     * `select` **`as`** `label` **`group by`** `group`
+ *         **`for` `(`**`key`**`,`** `value`**`) in`** `object`
+ *
+ * Where:
+ *
+ *   * `array` / `object`: an expression which evaluates to an array / object to iterate over.
+ *   * `value`: local variable which will refer to each item in the `array` or each property value
+ *      of `object` during iteration.
+ *   * `key`: local variable which will refer to a property name in `object` during iteration.
+ *   * `label`: The result of this expression will be the label for `<option>` element. The
+ *     `expression` will most likely refer to the `value` variable (e.g. `value.propertyName`).
+ *   * `select`: The result of this expression will be bound to the model of the parent `<select>`
+ *      element. If not specified, `select` expression will default to `value`.
+ *   * `group`: The result of this expression will be used to group options using the `<optgroup>`
+ *      DOM element.
+ *   * `trackexpr`: Used when working with an array of objects. The result of this expression will be
+ *      used to identify the objects in the array. The `trackexpr` will most likely refer to the
+ *     `value` variable (e.g. `value.propertyName`).
+ *
+ * @example
+    <doc:example>
+      <doc:source>
+        <script>
+        function MyCntrl($scope) {
+          $scope.colors = [
+            {name:'black', shade:'dark'},
+            {name:'white', shade:'light'},
+            {name:'red', shade:'dark'},
+            {name:'blue', shade:'dark'},
+            {name:'yellow', shade:'light'}
+          ];
+          $scope.color = $scope.colors[2]; // red
+        }
+        </script>
+        <div ng-controller="MyCntrl">
+          <ul>
+            <li ng-repeat="color in colors">
+              Name: <input ng-model="color.name">
+              [<a href ng-click="colors.splice($index, 1)">X</a>]
+            </li>
+            <li>
+              [<a href ng-click="colors.push({})">add</a>]
+            </li>
+          </ul>
+          <hr/>
+          Color (null not allowed):
+          <select ng-model="color" ng-options="c.name for c in colors"></select><br>
+
+          Color (null allowed):
+          <span  class="nullable">
+            <select ng-model="color" ng-options="c.name for c in colors">
+              <option value="">-- choose color --</option>
+            </select>
+          </span><br/>
+
+          Color grouped by shade:
+          <select ng-model="color" ng-options="c.name group by c.shade for c in colors">
+          </select><br/>
+
+
+          Select <a href ng-click="color={name:'not in list'}">bogus</a>.<br>
+          <hr/>
+          Currently selected: {{ {selected_color:color}  }}
+          <div style="border:solid 1px black; height:20px"
+               ng-style="{'background-color':color.name}">
+          </div>
+        </div>
+      </doc:source>
+      <doc:scenario>
+         it('should check ng-options', function() {
+           expect(binding('{selected_color:color}')).toMatch('red');
+           select('color').option('0');
+           expect(binding('{selected_color:color}')).toMatch('black');
+           using('.nullable').select('color').option('');
+           expect(binding('{selected_color:color}')).toMatch('null');
+         });
+      </doc:scenario>
+    </doc:example>
+ */
+
+var ngOptionsDirective = valueFn({ terminal: true });
+// jshint maxlen: false
+var selectDirective = ['$compile', '$parse', function($compile,   $parse) {
+                         //0000111110000000000022220000000000000000000000333300000000000000444444444444444000000000555555555555555000000066666666666666600000000000000007777000000000000000000088888
+  var NG_OPTIONS_REGEXP = /^\s*(.*?)(?:\s+as\s+(.*?))?(?:\s+group\s+by\s+(.*))?\s+for\s+(?:([\$\w][\$\w]*)|(?:\(\s*([\$\w][\$\w]*)\s*,\s*([\$\w][\$\w]*)\s*\)))\s+in\s+(.*?)(?:\s+track\s+by\s+(.*?))?$/,
+      nullModelCtrl = {$setViewValue: noop};
+// jshint maxlen: 100
+
+  return {
+    restrict: 'E',
+    require: ['select', '?ngModel'],
+    controller: ['$element', '$scope', '$attrs', function($element, $scope, $attrs) {
+      var self = this,
+          optionsMap = {},
+          ngModelCtrl = nullModelCtrl,
+          nullOption,
+          unknownOption;
+
+
+      self.databound = $attrs.ngModel;
+
+
+      self.init = function(ngModelCtrl_, nullOption_, unknownOption_) {
+        ngModelCtrl = ngModelCtrl_;
+        nullOption = nullOption_;
+        unknownOption = unknownOption_;
+      };
+
+
+      self.addOption = function(value) {
+        assertNotHasOwnProperty(value, '"option value"');
+        optionsMap[value] = true;
+
+        if (ngModelCtrl.$viewValue == value) {
+          $element.val(value);
+          if (unknownOption.parent()) unknownOption.remove();
+        }
+      };
+
+
+      self.removeOption = function(value) {
+        if (this.hasOption(value)) {
+          delete optionsMap[value];
+          if (ngModelCtrl.$viewValue == value) {
+            this.renderUnknownOption(value);
+          }
+        }
+      };
+
+
+      self.renderUnknownOption = function(val) {
+        var unknownVal = '? ' + hashKey(val) + ' ?';
+        unknownOption.val(unknownVal);
+        $element.prepend(unknownOption);
+        $element.val(unknownVal);
+        unknownOption.prop('selected', true); // needed for IE
+      };
+
+
+      self.hasOption = function(value) {
+        return optionsMap.hasOwnProperty(value);
+      };
+
+      $scope.$on('$destroy', function() {
+        // disable unknown option so that we don't do work when the whole select is being destroyed
+        self.renderUnknownOption = noop;
+      });
+    }],
+
+    link: function(scope, element, attr, ctrls) {
+      // if ngModel is not defined, we don't need to do anything
+      if (!ctrls[1]) return;
+
+      var selectCtrl = ctrls[0],
+          ngModelCtrl = ctrls[1],
+          multiple = attr.multiple,
+          optionsExp = attr.ngOptions,
+          nullOption = false, // if false, user will not be able to select it (used by ngOptions)
+          emptyOption,
+          // we can't just jqLite('<option>') since jqLite is not smart enough
+          // to create it in <select> and IE barfs otherwise.
+          optionTemplate = jqLite(document.createElement('option')),
+          optGroupTemplate =jqLite(document.createElement('optgroup')),
+          unknownOption = optionTemplate.clone();
+
+      // find "null" option
+      for(var i = 0, children = element.children(), ii = children.length; i < ii; i++) {
+        if (children[i].value === '') {
+          emptyOption = nullOption = children.eq(i);
+          break;
+        }
+      }
+
+      selectCtrl.init(ngModelCtrl, nullOption, unknownOption);
+
+      // required validator
+      if (multiple && (attr.required || attr.ngRequired)) {
+        var requiredValidator = function(value) {
+          ngModelCtrl.$setValidity('required', !attr.required || (value && value.length));
+          return value;
+        };
+
+        ngModelCtrl.$parsers.push(requiredValidator);
+        ngModelCtrl.$formatters.unshift(requiredValidator);
+
+        attr.$observe('required', function() {
+          requiredValidator(ngModelCtrl.$viewValue);
+        });
+      }
+
+      if (optionsExp) setupAsOptions(scope, element, ngModelCtrl);
+      else if (multiple) setupAsMultiple(scope, element, ngModelCtrl);
+      else setupAsSingle(scope, element, ngModelCtrl, selectCtrl);
+
+
+      ////////////////////////////
+
+
+
+      function setupAsSingle(scope, selectElement, ngModelCtrl, selectCtrl) {
+        ngModelCtrl.$render = function() {
+          var viewValue = ngModelCtrl.$viewValue;
+
+          if (selectCtrl.hasOption(viewValue)) {
+            if (unknownOption.parent()) unknownOption.remove();
+            selectElement.val(viewValue);
+            if (viewValue === '') emptyOption.prop('selected', true); // to make IE9 happy
+          } else {
+            if (isUndefined(viewValue) && emptyOption) {
+              selectElement.val('');
+            } else {
+              selectCtrl.renderUnknownOption(viewValue);
+            }
+          }
+        };
+
+        selectElement.on('change', function() {
+          scope.$apply(function() {
+            if (unknownOption.parent()) unknownOption.remove();
+            ngModelCtrl.$setViewValue(selectElement.val());
+          });
+        });
+      }
+
+      function setupAsMultiple(scope, selectElement, ctrl) {
+        var lastView;
+        ctrl.$render = function() {
+          var items = new HashMap(ctrl.$viewValue);
+          forEach(selectElement.find('option'), function(option) {
+            option.selected = isDefined(items.get(option.value));
+          });
+        };
+
+        // we have to do it on each watch since ngModel watches reference, but
+        // we need to work of an array, so we need to see if anything was inserted/removed
+        scope.$watch(function selectMultipleWatch() {
+          if (!equals(lastView, ctrl.$viewValue)) {
+            lastView = copy(ctrl.$viewValue);
+            ctrl.$render();
+          }
+        });
+
+        selectElement.on('change', function() {
+          scope.$apply(function() {
+            var array = [];
+            forEach(selectElement.find('option'), function(option) {
+              if (option.selected) {
+                array.push(option.value);
+              }
+            });
+            ctrl.$setViewValue(array);
+          });
+        });
+      }
+
+      function setupAsOptions(scope, selectElement, ctrl) {
+        var match;
+
+        if (! (match = optionsExp.match(NG_OPTIONS_REGEXP))) {
+          throw ngOptionsMinErr('iexp',
+            "Expected expression in form of " +
+            "'_select_ (as _label_)? for (_key_,)?_value_ in _collection_'" +
+            " but got '{0}'. Element: {1}",
+            optionsExp, startingTag(selectElement));
+        }
+
+        var displayFn = $parse(match[2] || match[1]),
+            valueName = match[4] || match[6],
+            keyName = match[5],
+            groupByFn = $parse(match[3] || ''),
+            valueFn = $parse(match[2] ? match[1] : valueName),
+            valuesFn = $parse(match[7]),
+            track = match[8],
+            trackFn = track ? $parse(match[8]) : null,
+            // This is an array of array of existing option groups in DOM.
+            // We try to reuse these if possible
+            // - optionGroupsCache[0] is the options with no option group
+            // - optionGroupsCache[?][0] is the parent: either the SELECT or OPTGROUP element
+            optionGroupsCache = [[{element: selectElement, label:''}]];
+
+        if (nullOption) {
+          // compile the element since there might be bindings in it
+          $compile(nullOption)(scope);
+
+          // remove the class, which is added automatically because we recompile the element and it
+          // becomes the compilation root
+          nullOption.removeClass('ng-scope');
+
+          // we need to remove it before calling selectElement.empty() because otherwise IE will
+          // remove the label from the element. wtf?
+          nullOption.remove();
+        }
+
+        // clear contents, we'll add what's needed based on the model
+        selectElement.empty();
+
+        selectElement.on('change', function() {
+          scope.$apply(function() {
+            var optionGroup,
+                collection = valuesFn(scope) || [],
+                locals = {},
+                key, value, optionElement, index, groupIndex, length, groupLength, trackIndex;
+
+            if (multiple) {
+              value = [];
+              for (groupIndex = 0, groupLength = optionGroupsCache.length;
+                   groupIndex < groupLength;
+                   groupIndex++) {
+                // list of options for that group. (first item has the parent)
+                optionGroup = optionGroupsCache[groupIndex];
+
+                for(index = 1, length = optionGroup.length; index < length; index++) {
+                  if ((optionElement = optionGroup[index].element)[0].selected) {
+                    key = optionElement.val();
+                    if (keyName) locals[keyName] = key;
+                    if (trackFn) {
+                      for (trackIndex = 0; trackIndex < collection.length; trackIndex++) {
+                        locals[valueName] = collection[trackIndex];
+                        if (trackFn(scope, locals) == key) break;
+                      }
+                    } else {
+                      locals[valueName] = collection[key];
+                    }
+                    value.push(valueFn(scope, locals));
+                  }
+                }
+              }
+            } else {
+              key = selectElement.val();
+              if (key == '?') {
+                value = undefined;
+              } else if (key === ''){
+                value = null;
+              } else {
+                if (trackFn) {
+                  for (trackIndex = 0; trackIndex < collection.length; trackIndex++) {
+                    locals[valueName] = collection[trackIndex];
+                    if (trackFn(scope, locals) == key) {
+                      value = valueFn(scope, locals);
+                      break;
+                    }
+                  }
+                } else {
+                  locals[valueName] = collection[key];
+                  if (keyName) locals[keyName] = key;
+                  value = valueFn(scope, locals);
+                }
+              }
+            }
+            ctrl.$setViewValue(value);
+          });
+        });
+
+        ctrl.$render = render;
+
+        // TODO(vojta): can't we optimize this ?
+        scope.$watch(render);
+
+        function render() {
+              // Temporary location for the option groups before we render them
+          var optionGroups = {'':[]},
+              optionGroupNames = [''],
+              optionGroupName,
+              optionGroup,
+              option,
+              existingParent, existingOptions, existingOption,
+              modelValue = ctrl.$modelValue,
+              values = valuesFn(scope) || [],
+              keys = keyName ? sortedKeys(values) : values,
+              key,
+              groupLength, length,
+              groupIndex, index,
+              locals = {},
+              selected,
+              selectedSet = false, // nothing is selected yet
+              lastElement,
+              element,
+              label;
+
+          if (multiple) {
+            if (trackFn && isArray(modelValue)) {
+              selectedSet = new HashMap([]);
+              for (var trackIndex = 0; trackIndex < modelValue.length; trackIndex++) {
+                locals[valueName] = modelValue[trackIndex];
+                selectedSet.put(trackFn(scope, locals), modelValue[trackIndex]);
+              }
+            } else {
+              selectedSet = new HashMap(modelValue);
+            }
+          }
+
+          // We now build up the list of options we need (we merge later)
+          for (index = 0; length = keys.length, index < length; index++) {
+            
+            key = index;
+            if (keyName) {
+              key = keys[index];
+              if ( key.charAt(0) === '$' ) continue;
+              locals[keyName] = key;
+            }
+
+            locals[valueName] = values[key];
+
+            optionGroupName = groupByFn(scope, locals) || '';
+            if (!(optionGroup = optionGroups[optionGroupName])) {
+              optionGroup = optionGroups[optionGroupName] = [];
+              optionGroupNames.push(optionGroupName);
+            }
+            if (multiple) {
+              selected = isDefined(
+                selectedSet.remove(trackFn ? trackFn(scope, locals) : valueFn(scope, locals))
+              );
+            } else {
+              if (trackFn) {
+                var modelCast = {};
+                modelCast[valueName] = modelValue;
+                selected = trackFn(scope, modelCast) === trackFn(scope, locals);
+              } else {
+                selected = modelValue === valueFn(scope, locals);
+              }
+              selectedSet = selectedSet || selected; // see if at least one item is selected
+            }
+            label = displayFn(scope, locals); // what will be seen by the user
+
+            // doing displayFn(scope, locals) || '' overwrites zero values
+            label = isDefined(label) ? label : '';
+            optionGroup.push({
+              // either the index into array or key from object
+              id: trackFn ? trackFn(scope, locals) : (keyName ? keys[index] : index),
+              label: label,
+              selected: selected                   // determine if we should be selected
+            });
+          }
+          if (!multiple) {
+            if (nullOption || modelValue === null) {
+              // insert null option if we have a placeholder, or the model is null
+              optionGroups[''].unshift({id:'', label:'', selected:!selectedSet});
+            } else if (!selectedSet) {
+              // option could not be found, we have to insert the undefined item
+              optionGroups[''].unshift({id:'?', label:'', selected:true});
+            }
+          }
+
+          // Now we need to update the list of DOM nodes to match the optionGroups we computed above
+          for (groupIndex = 0, groupLength = optionGroupNames.length;
+               groupIndex < groupLength;
+               groupIndex++) {
+            // current option group name or '' if no group
+            optionGroupName = optionGroupNames[groupIndex];
+
+            // list of options for that group. (first item has the parent)
+            optionGroup = optionGroups[optionGroupName];
+
+            if (optionGroupsCache.length <= groupIndex) {
+              // we need to grow the optionGroups
+              existingParent = {
+                element: optGroupTemplate.clone().attr('label', optionGroupName),
+                label: optionGroup.label
+              };
+              existingOptions = [existingParent];
+              optionGroupsCache.push(existingOptions);
+              selectElement.append(existingParent.element);
+            } else {
+              existingOptions = optionGroupsCache[groupIndex];
+              existingParent = existingOptions[0];  // either SELECT (no group) or OPTGROUP element
+
+              // update the OPTGROUP label if not the same.
+              if (existingParent.label != optionGroupName) {
+                existingParent.element.attr('label', existingParent.label = optionGroupName);
+              }
+            }
+
+            lastElement = null;  // start at the beginning
+            for(index = 0, length = optionGroup.length; index < length; index++) {
+              option = optionGroup[index];
+              if ((existingOption = existingOptions[index+1])) {
+                // reuse elements
+                lastElement = existingOption.element;
+                if (existingOption.label !== option.label) {
+                  lastElement.text(existingOption.label = option.label);
+                }
+                if (existingOption.id !== option.id) {
+                  lastElement.val(existingOption.id = option.id);
+                }
+                // lastElement.prop('selected') provided by jQuery has side-effects
+                if (lastElement[0].selected !== option.selected) {
+                  lastElement.prop('selected', (existingOption.selected = option.selected));
+                }
+              } else {
+                // grow elements
+
+                // if it's a null option
+                if (option.id === '' && nullOption) {
+                  // put back the pre-compiled element
+                  element = nullOption;
+                } else {
+                  // jQuery(v1.4.2) Bug: We should be able to chain the method calls, but
+                  // in this version of jQuery on some browser the .text() returns a string
+                  // rather then the element.
+                  (element = optionTemplate.clone())
+                      .val(option.id)
+                      .attr('selected', option.selected)
+                      .text(option.label);
+                }
+
+                existingOptions.push(existingOption = {
+                    element: element,
+                    label: option.label,
+                    id: option.id,
+                    selected: option.selected
+                });
+                if (lastElement) {
+                  lastElement.after(element);
+                } else {
+                  existingParent.element.append(element);
+                }
+                lastElement = element;
+              }
+            }
+            // remove any excessive OPTIONs in a group
+            index++; // increment since the existingOptions[0] is parent element not OPTION
+            while(existingOptions.length > index) {
+              existingOptions.pop().element.remove();
+            }
+          }
+          // remove any excessive OPTGROUPs from select
+          while(optionGroupsCache.length > groupIndex) {
+            optionGroupsCache.pop()[0].element.remove();
+          }
+        }
+      }
+    }
+  };
+}];
+
+var optionDirective = ['$interpolate', function($interpolate) {
+  var nullSelectCtrl = {
+    addOption: noop,
+    removeOption: noop
+  };
+
+  return {
+    restrict: 'E',
+    priority: 100,
+    compile: function(element, attr) {
+      if (isUndefined(attr.value)) {
+        var interpolateFn = $interpolate(element.text(), true);
+        if (!interpolateFn) {
+          attr.$set('value', element.text());
+        }
+      }
+
+      return function (scope, element, attr) {
+        var selectCtrlName = '$selectController',
+            parent = element.parent(),
+            selectCtrl = parent.data(selectCtrlName) ||
+              parent.parent().data(selectCtrlName); // in case we are in optgroup
+
+        if (selectCtrl && selectCtrl.databound) {
+          // For some reason Opera defaults to true and if not overridden this messes up the repeater.
+          // We don't want the view to drive the initialization of the model anyway.
+          element.prop('selected', false);
+        } else {
+          selectCtrl = nullSelectCtrl;
+        }
+
+        if (interpolateFn) {
+          scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {
+            attr.$set('value', newVal);
+            if (newVal !== oldVal) selectCtrl.removeOption(oldVal);
+            selectCtrl.addOption(newVal);
+          });
+        } else {
+          selectCtrl.addOption(attr.value);
+        }
+
+        element.on('$destroy', function() {
+          selectCtrl.removeOption(attr.value);
+        });
+      };
+    }
+  };
+}];
+
+var styleDirective = valueFn({
+  restrict: 'E',
+  terminal: true
+});
+
+  //try to bind to jquery now so that one can write angular.element().read()
+  //but we will rebind on bootstrap again.
+  bindJQuery();
+
+  publishExternalAPI(angular);
+
+  jqLite(document).ready(function() {
+    angularInit(document, bootstrap);
+  });
+
+})(window, document);
+
+!angular.$$csp() && angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}.ng-animate-start{border-spacing:1px 1px;-ms-zoom:1.0001;}.ng-animate-active{border-spacing:0px 0px;-ms-zoom:1;}</style>');
\ No newline at end of file
new file mode 100644
index 0000000000000000000000000000000000000000..2e8c6eca3c148d6d3ea742cba13b3a60a39230e1
GIT binary patch
literal 523443
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
Vb2}#lOd*3;K`Kn78cSq@{~sxybtC`)
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/frameworks/backbone-1.1.js
@@ -0,0 +1,1581 @@
+//     Backbone.js 1.1.0
+
+//     (c) 2010-2011 Jeremy Ashkenas, DocumentCloud Inc.
+//     (c) 2011-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Backbone may be freely distributed under the MIT license.
+//     For all details and documentation:
+//     http://backbonejs.org
+
+(function(){
+
+  // Initial Setup
+  // -------------
+
+  // Save a reference to the global object (`window` in the browser, `exports`
+  // on the server).
+  var root = this;
+
+  // Save the previous value of the `Backbone` variable, so that it can be
+  // restored later on, if `noConflict` is used.
+  var previousBackbone = root.Backbone;
+
+  // Create local references to array methods we'll want to use later.
+  var array = [];
+  var push = array.push;
+  var slice = array.slice;
+  var splice = array.splice;
+
+  // The top-level namespace. All public Backbone classes and modules will
+  // be attached to this. Exported for both the browser and the server.
+  var Backbone;
+  if (typeof exports !== 'undefined') {
+    Backbone = exports;
+  } else {
+    Backbone = root.Backbone = {};
+  }
+
+  // Current version of the library. Keep in sync with `package.json`.
+  Backbone.VERSION = '1.1.0';
+
+  // Require Underscore, if we're on the server, and it's not already present.
+  var _ = root._;
+  if (!_ && (typeof require !== 'undefined')) _ = require('underscore');
+
+  // For Backbone's purposes, jQuery, Zepto, Ender, or My Library (kidding) owns
+  // the `$` variable.
+  Backbone.$ = root.jQuery || root.Zepto || root.ender || root.$;
+
+  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable
+  // to its previous owner. Returns a reference to this Backbone object.
+  Backbone.noConflict = function() {
+    root.Backbone = previousBackbone;
+    return this;
+  };
+
+  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option
+  // will fake `"PATCH"`, `"PUT"` and `"DELETE"` requests via the `_method` parameter and
+  // set a `X-Http-Method-Override` header.
+  Backbone.emulateHTTP = false;
+
+  // Turn on `emulateJSON` to support legacy servers that can't deal with direct
+  // `application/json` requests ... will encode the body as
+  // `application/x-www-form-urlencoded` instead and will send the model in a
+  // form param named `model`.
+  Backbone.emulateJSON = false;
+
+  // Backbone.Events
+  // ---------------
+
+  // A module that can be mixed in to *any object* in order to provide it with
+  // custom events. You may bind with `on` or remove with `off` callback
+  // functions to an event; `trigger`-ing an event fires all callbacks in
+  // succession.
+  //
+  //     var object = {};
+  //     _.extend(object, Backbone.Events);
+  //     object.on('expand', function(){ alert('expanded'); });
+  //     object.trigger('expand');
+  //
+  var Events = Backbone.Events = {
+
+    // Bind an event to a `callback` function. Passing `"all"` will bind
+    // the callback to all events fired.
+    on: function(name, callback, context) {
+      if (!eventsApi(this, 'on', name, [callback, context]) || !callback) return this;
+      this._events || (this._events = {});
+      var events = this._events[name] || (this._events[name] = []);
+      events.push({callback: callback, context: context, ctx: context || this});
+      return this;
+    },
+
+    // Bind an event to only be triggered a single time. After the first time
+    // the callback is invoked, it will be removed.
+    once: function(name, callback, context) {
+      if (!eventsApi(this, 'once', name, [callback, context]) || !callback) return this;
+      var self = this;
+      var once = _.once(function() {
+        self.off(name, once);
+        callback.apply(this, arguments);
+      });
+      once._callback = callback;
+      return this.on(name, once, context);
+    },
+
+    // Remove one or many callbacks. If `context` is null, removes all
+    // callbacks with that function. If `callback` is null, removes all
+    // callbacks for the event. If `name` is null, removes all bound
+    // callbacks for all events.
+    off: function(name, callback, context) {
+      var retain, ev, events, names, i, l, j, k;
+      if (!this._events || !eventsApi(this, 'off', name, [callback, context])) return this;
+      if (!name && !callback && !context) {
+        this._events = {};
+        return this;
+      }
+      names = name ? [name] : _.keys(this._events);
+      for (i = 0, l = names.length; i < l; i++) {
+        name = names[i];
+        if (events = this._events[name]) {
+          this._events[name] = retain = [];
+          if (callback || context) {
+            for (j = 0, k = events.length; j < k; j++) {
+              ev = events[j];
+              if ((callback && callback !== ev.callback && callback !== ev.callback._callback) ||
+                  (context && context !== ev.context)) {
+                retain.push(ev);
+              }
+            }
+          }
+          if (!retain.length) delete this._events[name];
+        }
+      }
+
+      return this;
+    },
+
+    // Trigger one or many events, firing all bound callbacks. Callbacks are
+    // passed the same arguments as `trigger` is, apart from the event name
+    // (unless you're listening on `"all"`, which will cause your callback to
+    // receive the true name of the event as the first argument).
+    trigger: function(name) {
+      if (!this._events) return this;
+      var args = slice.call(arguments, 1);
+      if (!eventsApi(this, 'trigger', name, args)) return this;
+      var events = this._events[name];
+      var allEvents = this._events.all;
+      if (events) triggerEvents(events, args);
+      if (allEvents) triggerEvents(allEvents, arguments);
+      return this;
+    },
+
+    // Tell this object to stop listening to either specific events ... or
+    // to every object it's currently listening to.
+    stopListening: function(obj, name, callback) {
+      var listeningTo = this._listeningTo;
+      if (!listeningTo) return this;
+      var remove = !name && !callback;
+      if (!callback && typeof name === 'object') callback = this;
+      if (obj) (listeningTo = {})[obj._listenId] = obj;
+      for (var id in listeningTo) {
+        obj = listeningTo[id];
+        obj.off(name, callback, this);
+        if (remove || _.isEmpty(obj._events)) delete this._listeningTo[id];
+      }
+      return this;
+    }
+
+  };
+
+  // Regular expression used to split event strings.
+  var eventSplitter = /\s+/;
+
+  // Implement fancy features of the Events API such as multiple event
+  // names `"change blur"` and jQuery-style event maps `{change: action}`
+  // in terms of the existing API.
+  var eventsApi = function(obj, action, name, rest) {
+    if (!name) return true;
+
+    // Handle event maps.
+    if (typeof name === 'object') {
+      for (var key in name) {
+        obj[action].apply(obj, [key, name[key]].concat(rest));
+      }
+      return false;
+    }
+
+    // Handle space separated event names.
+    if (eventSplitter.test(name)) {
+      var names = name.split(eventSplitter);
+      for (var i = 0, l = names.length; i < l; i++) {
+        obj[action].apply(obj, [names[i]].concat(rest));
+      }
+      return false;
+    }
+
+    return true;
+  };
+
+  // A difficult-to-believe, but optimized internal dispatch function for
+  // triggering events. Tries to keep the usual cases speedy (most internal
+  // Backbone events have 3 arguments).
+  var triggerEvents = function(events, args) {
+    var ev, i = -1, l = events.length, a1 = args[0], a2 = args[1], a3 = args[2];
+    switch (args.length) {
+      case 0: while (++i < l) (ev = events[i]).callback.call(ev.ctx); return;
+      case 1: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1); return;
+      case 2: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2); return;
+      case 3: while (++i < l) (ev = events[i]).callback.call(ev.ctx, a1, a2, a3); return;
+      default: while (++i < l) (ev = events[i]).callback.apply(ev.ctx, args);
+    }
+  };
+
+  var listenMethods = {listenTo: 'on', listenToOnce: 'once'};
+
+  // Inversion-of-control versions of `on` and `once`. Tell *this* object to
+  // listen to an event in another object ... keeping track of what it's
+  // listening to.
+  _.each(listenMethods, function(implementation, method) {
+    Events[method] = function(obj, name, callback) {
+      var listeningTo = this._listeningTo || (this._listeningTo = {});
+      var id = obj._listenId || (obj._listenId = _.uniqueId('l'));
+      listeningTo[id] = obj;
+      if (!callback && typeof name === 'object') callback = this;
+      obj[implementation](name, callback, this);
+      return this;
+    };
+  });
+
+  // Aliases for backwards compatibility.
+  Events.bind   = Events.on;
+  Events.unbind = Events.off;
+
+  // Allow the `Backbone` object to serve as a global event bus, for folks who
+  // want global "pubsub" in a convenient place.
+  _.extend(Backbone, Events);
+
+  // Backbone.Model
+  // --------------
+
+  // Backbone **Models** are the basic data object in the framework --
+  // frequently representing a row in a table in a database on your server.
+  // A discrete chunk of data and a bunch of useful, related methods for
+  // performing computations and transformations on that data.
+
+  // Create a new model with the specified attributes. A client id (`cid`)
+  // is automatically generated and assigned for you.
+  var Model = Backbone.Model = function(attributes, options) {
+    var attrs = attributes || {};
+    options || (options = {});
+    this.cid = _.uniqueId('c');
+    this.attributes = {};
+    if (options.collection) this.collection = options.collection;
+    if (options.parse) attrs = this.parse(attrs, options) || {};
+    attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
+    this.set(attrs, options);
+    this.changed = {};
+    this.initialize.apply(this, arguments);
+  };
+
+  // Attach all inheritable methods to the Model prototype.
+  _.extend(Model.prototype, Events, {
+
+    // A hash of attributes whose current and previous value differ.
+    changed: null,
+
+    // The value returned during the last failed validation.
+    validationError: null,
+
+    // The default name for the JSON `id` attribute is `"id"`. MongoDB and
+    // CouchDB users may want to set this to `"_id"`.
+    idAttribute: 'id',
+
+    // Initialize is an empty function by default. Override it with your own
+    // initialization logic.
+    initialize: function(){},
+
+    // Return a copy of the model's `attributes` object.
+    toJSON: function(options) {
+      return _.clone(this.attributes);
+    },
+
+    // Proxy `Backbone.sync` by default -- but override this if you need
+    // custom syncing semantics for *this* particular model.
+    sync: function() {
+      return Backbone.sync.apply(this, arguments);
+    },
+
+    // Get the value of an attribute.
+    get: function(attr) {
+      return this.attributes[attr];
+    },
+
+    // Get the HTML-escaped value of an attribute.
+    escape: function(attr) {
+      return _.escape(this.get(attr));
+    },
+
+    // Returns `true` if the attribute contains a value that is not null
+    // or undefined.
+    has: function(attr) {
+      return this.get(attr) != null;
+    },
+
+    // Set a hash of model attributes on the object, firing `"change"`. This is
+    // the core primitive operation of a model, updating the data and notifying
+    // anyone who needs to know about the change in state. The heart of the beast.
+    set: function(key, val, options) {
+      var attr, attrs, unset, changes, silent, changing, prev, current;
+      if (key == null) return this;
+
+      // Handle both `"key", value` and `{key: value}` -style arguments.
+      if (typeof key === 'object') {
+        attrs = key;
+        options = val;
+      } else {
+        (attrs = {})[key] = val;
+      }
+
+      options || (options = {});
+
+      // Run validation.
+      if (!this._validate(attrs, options)) return false;
+
+      // Extract attributes and options.
+      unset           = options.unset;
+      silent          = options.silent;
+      changes         = [];
+      changing        = this._changing;
+      this._changing  = true;
+
+      if (!changing) {
+        this._previousAttributes = _.clone(this.attributes);
+        this.changed = {};
+      }
+      current = this.attributes, prev = this._previousAttributes;
+
+      // Check for changes of `id`.
+      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
+
+      // For each `set` attribute, update or delete the current value.
+      for (attr in attrs) {
+        val = attrs[attr];
+        if (!_.isEqual(current[attr], val)) changes.push(attr);
+        if (!_.isEqual(prev[attr], val)) {
+          this.changed[attr] = val;
+        } else {
+          delete this.changed[attr];
+        }
+        unset ? delete current[attr] : current[attr] = val;
+      }
+
+      // Trigger all relevant attribute changes.
+      if (!silent) {
+        if (changes.length) this._pending = true;
+        for (var i = 0, l = changes.length; i < l; i++) {
+          this.trigger('change:' + changes[i], this, current[changes[i]], options);
+        }
+      }
+
+      // You might be wondering why there's a `while` loop here. Changes can
+      // be recursively nested within `"change"` events.
+      if (changing) return this;
+      if (!silent) {
+        while (this._pending) {
+          this._pending = false;
+          this.trigger('change', this, options);
+        }
+      }
+      this._pending = false;
+      this._changing = false;
+      return this;
+    },
+
+    // Remove an attribute from the model, firing `"change"`. `unset` is a noop
+    // if the attribute doesn't exist.
+    unset: function(attr, options) {
+      return this.set(attr, void 0, _.extend({}, options, {unset: true}));
+    },
+
+    // Clear all attributes on the model, firing `"change"`.
+    clear: function(options) {
+      var attrs = {};
+      for (var key in this.attributes) attrs[key] = void 0;
+      return this.set(attrs, _.extend({}, options, {unset: true}));
+    },
+
+    // Determine if the model has changed since the last `"change"` event.
+    // If you specify an attribute name, determine if that attribute has changed.
+    hasChanged: function(attr) {
+      if (attr == null) return !_.isEmpty(this.changed);
+      return _.has(this.changed, attr);
+    },
+
+    // Return an object containing all the attributes that have changed, or
+    // false if there are no changed attributes. Useful for determining what
+    // parts of a view need to be updated and/or what attributes need to be
+    // persisted to the server. Unset attributes will be set to undefined.
+    // You can also pass an attributes object to diff against the model,
+    // determining if there *would be* a change.
+    changedAttributes: function(diff) {
+      if (!diff) return this.hasChanged() ? _.clone(this.changed) : false;
+      var val, changed = false;
+      var old = this._changing ? this._previousAttributes : this.attributes;
+      for (var attr in diff) {
+        if (_.isEqual(old[attr], (val = diff[attr]))) continue;
+        (changed || (changed = {}))[attr] = val;
+      }
+      return changed;
+    },
+
+    // Get the previous value of an attribute, recorded at the time the last
+    // `"change"` event was fired.
+    previous: function(attr) {
+      if (attr == null || !this._previousAttributes) return null;
+      return this._previousAttributes[attr];
+    },
+
+    // Get all of the attributes of the model at the time of the previous
+    // `"change"` event.
+    previousAttributes: function() {
+      return _.clone(this._previousAttributes);
+    },
+
+    // Fetch the model from the server. If the server's representation of the
+    // model differs from its current attributes, they will be overridden,
+    // triggering a `"change"` event.
+    fetch: function(options) {
+      options = options ? _.clone(options) : {};
+      if (options.parse === void 0) options.parse = true;
+      var model = this;
+      var success = options.success;
+      options.success = function(resp) {
+        if (!model.set(model.parse(resp, options), options)) return false;
+        if (success) success(model, resp, options);
+        model.trigger('sync', model, resp, options);
+      };
+      wrapError(this, options);
+      return this.sync('read', this, options);
+    },
+
+    // Set a hash of model attributes, and sync the model to the server.
+    // If the server returns an attributes hash that differs, the model's
+    // state will be `set` again.
+    save: function(key, val, options) {
+      var attrs, method, xhr, attributes = this.attributes;
+
+      // Handle both `"key", value` and `{key: value}` -style arguments.
+      if (key == null || typeof key === 'object') {
+        attrs = key;
+        options = val;
+      } else {
+        (attrs = {})[key] = val;
+      }
+
+      options = _.extend({validate: true}, options);
+
+      // If we're not waiting and attributes exist, save acts as
+      // `set(attr).save(null, opts)` with validation. Otherwise, check if
+      // the model will be valid when the attributes, if any, are set.
+      if (attrs && !options.wait) {
+        if (!this.set(attrs, options)) return false;
+      } else {
+        if (!this._validate(attrs, options)) return false;
+      }
+
+      // Set temporary attributes if `{wait: true}`.
+      if (attrs && options.wait) {
+        this.attributes = _.extend({}, attributes, attrs);
+      }
+
+      // After a successful server-side save, the client is (optionally)
+      // updated with the server-side state.
+      if (options.parse === void 0) options.parse = true;
+      var model = this;
+      var success = options.success;
+      options.success = function(resp) {
+        // Ensure attributes are restored during synchronous saves.
+        model.attributes = attributes;
+        var serverAttrs = model.parse(resp, options);
+        if (options.wait) serverAttrs = _.extend(attrs || {}, serverAttrs);
+        if (_.isObject(serverAttrs) && !model.set(serverAttrs, options)) {
+          return false;
+        }
+        if (success) success(model, resp, options);
+        model.trigger('sync', model, resp, options);
+      };
+      wrapError(this, options);
+
+      method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');
+      if (method === 'patch') options.attrs = attrs;
+      xhr = this.sync(method, this, options);
+
+      // Restore attributes.
+      if (attrs && options.wait) this.attributes = attributes;
+
+      return xhr;
+    },
+
+    // Destroy this model on the server if it was already persisted.
+    // Optimistically removes the model from its collection, if it has one.
+    // If `wait: true` is passed, waits for the server to respond before removal.
+    destroy: function(options) {
+      options = options ? _.clone(options) : {};
+      var model = this;
+      var success = options.success;
+
+      var destroy = function() {
+        model.trigger('destroy', model, model.collection, options);
+      };
+
+      options.success = function(resp) {
+        if (options.wait || model.isNew()) destroy();
+        if (success) success(model, resp, options);
+        if (!model.isNew()) model.trigger('sync', model, resp, options);
+      };
+
+      if (this.isNew()) {
+        options.success();
+        return false;
+      }
+      wrapError(this, options);
+
+      var xhr = this.sync('delete', this, options);
+      if (!options.wait) destroy();
+      return xhr;
+    },
+
+    // Default URL for the model's representation on the server -- if you're
+    // using Backbone's restful methods, override this to change the endpoint
+    // that will be called.
+    url: function() {
+      var base = _.result(this, 'urlRoot') || _.result(this.collection, 'url') || urlError();
+      if (this.isNew()) return base;
+      return base + (base.charAt(base.length - 1) === '/' ? '' : '/') + encodeURIComponent(this.id);
+    },
+
+    // **parse** converts a response into the hash of attributes to be `set` on
+    // the model. The default implementation is just to pass the response along.
+    parse: function(resp, options) {
+      return resp;
+    },
+
+    // Create a new model with identical attributes to this one.
+    clone: function() {
+      return new this.constructor(this.attributes);
+    },
+
+    // A model is new if it has never been saved to the server, and lacks an id.
+    isNew: function() {
+      return this.id == null;
+    },
+
+    // Check if the model is currently in a valid state.
+    isValid: function(options) {
+      return this._validate({}, _.extend(options || {}, { validate: true }));
+    },
+
+    // Run validation against the next complete set of model attributes,
+    // returning `true` if all is well. Otherwise, fire an `"invalid"` event.
+    _validate: function(attrs, options) {
+      if (!options.validate || !this.validate) return true;
+      attrs = _.extend({}, this.attributes, attrs);
+      var error = this.validationError = this.validate(attrs, options) || null;
+      if (!error) return true;
+      this.trigger('invalid', this, error, _.extend(options, {validationError: error}));
+      return false;
+    }
+
+  });
+
+  // Underscore methods that we want to implement on the Model.
+  var modelMethods = ['keys', 'values', 'pairs', 'invert', 'pick', 'omit'];
+
+  // Mix in each Underscore method as a proxy to `Model#attributes`.
+  _.each(modelMethods, function(method) {
+    Model.prototype[method] = function() {
+      var args = slice.call(arguments);
+      args.unshift(this.attributes);
+      return _[method].apply(_, args);
+    };
+  });
+
+  // Backbone.Collection
+  // -------------------
+
+  // If models tend to represent a single row of data, a Backbone Collection is
+  // more analagous to a table full of data ... or a small slice or page of that
+  // table, or a collection of rows that belong together for a particular reason
+  // -- all of the messages in this particular folder, all of the documents
+  // belonging to this particular author, and so on. Collections maintain
+  // indexes of their models, both in order, and for lookup by `id`.
+
+  // Create a new **Collection**, perhaps to contain a specific type of `model`.
+  // If a `comparator` is specified, the Collection will maintain
+  // its models in sort order, as they're added and removed.
+  var Collection = Backbone.Collection = function(models, options) {
+    options || (options = {});
+    if (options.model) this.model = options.model;
+    if (options.comparator !== void 0) this.comparator = options.comparator;
+    this._reset();
+    this.initialize.apply(this, arguments);
+    if (models) this.reset(models, _.extend({silent: true}, options));
+  };
+
+  // Default options for `Collection#set`.
+  var setOptions = {add: true, remove: true, merge: true};
+  var addOptions = {add: true, remove: false};
+
+  // Define the Collection's inheritable methods.
+  _.extend(Collection.prototype, Events, {
+
+    // The default model for a collection is just a **Backbone.Model**.
+    // This should be overridden in most cases.
+    model: Model,
+
+    // Initialize is an empty function by default. Override it with your own
+    // initialization logic.
+    initialize: function(){},
+
+    // The JSON representation of a Collection is an array of the
+    // models' attributes.
+    toJSON: function(options) {
+      return this.map(function(model){ return model.toJSON(options); });
+    },
+
+    // Proxy `Backbone.sync` by default.
+    sync: function() {
+      return Backbone.sync.apply(this, arguments);
+    },
+
+    // Add a model, or list of models to the set.
+    add: function(models, options) {
+      return this.set(models, _.extend({merge: false}, options, addOptions));
+    },
+
+    // Remove a model, or a list of models from the set.
+    remove: function(models, options) {
+      var singular = !_.isArray(models);
+      models = singular ? [models] : _.clone(models);
+      options || (options = {});
+      var i, l, index, model;
+      for (i = 0, l = models.length; i < l; i++) {
+        model = models[i] = this.get(models[i]);
+        if (!model) continue;
+        delete this._byId[model.id];
+        delete this._byId[model.cid];
+        index = this.indexOf(model);
+        this.models.splice(index, 1);
+        this.length--;
+        if (!options.silent) {
+          options.index = index;
+          model.trigger('remove', model, this, options);
+        }
+        this._removeReference(model);
+      }
+      return singular ? models[0] : models;
+    },
+
+    // Update a collection by `set`-ing a new list of models, adding new ones,
+    // removing models that are no longer present, and merging models that
+    // already exist in the collection, as necessary. Similar to **Model#set**,
+    // the core operation for updating the data contained by the collection.
+    set: function(models, options) {
+      options = _.defaults({}, options, setOptions);
+      if (options.parse) models = this.parse(models, options);
+      var singular = !_.isArray(models);
+      models = singular ? (models ? [models] : []) : _.clone(models);
+      var i, l, id, model, attrs, existing, sort;
+      var at = options.at;
+      var targetModel = this.model;
+      var sortable = this.comparator && (at == null) && options.sort !== false;
+      var sortAttr = _.isString(this.comparator) ? this.comparator : null;
+      var toAdd = [], toRemove = [], modelMap = {};
+      var add = options.add, merge = options.merge, remove = options.remove;
+      var order = !sortable && add && remove ? [] : false;
+
+      // Turn bare objects into model references, and prevent invalid models
+      // from being added.
+      for (i = 0, l = models.length; i < l; i++) {
+        attrs = models[i];
+        if (attrs instanceof Model) {
+          id = model = attrs;
+        } else {
+          id = attrs[targetModel.prototype.idAttribute];
+        }
+
+        // If a duplicate is found, prevent it from being added and
+        // optionally merge it into the existing model.
+        if (existing = this.get(id)) {
+          if (remove) modelMap[existing.cid] = true;
+          if (merge) {
+            attrs = attrs === model ? model.attributes : attrs;
+            if (options.parse) attrs = existing.parse(attrs, options);
+            existing.set(attrs, options);
+            if (sortable && !sort && existing.hasChanged(sortAttr)) sort = true;
+          }
+          models[i] = existing;
+
+        // If this is a new, valid model, push it to the `toAdd` list.
+        } else if (add) {
+          model = models[i] = this._prepareModel(attrs, options);
+          if (!model) continue;
+          toAdd.push(model);
+
+          // Listen to added models' events, and index models for lookup by
+          // `id` and by `cid`.
+          model.on('all', this._onModelEvent, this);
+          this._byId[model.cid] = model;
+          if (model.id != null) this._byId[model.id] = model;
+        }
+        if (order) order.push(existing || model);
+      }
+
+      // Remove nonexistent models if appropriate.
+      if (remove) {
+        for (i = 0, l = this.length; i < l; ++i) {
+          if (!modelMap[(model = this.models[i]).cid]) toRemove.push(model);
+        }
+        if (toRemove.length) this.remove(toRemove, options);
+      }
+
+      // See if sorting is needed, update `length` and splice in new models.
+      if (toAdd.length || (order && order.length)) {
+        if (sortable) sort = true;
+        this.length += toAdd.length;
+        if (at != null) {
+          for (i = 0, l = toAdd.length; i < l; i++) {
+            this.models.splice(at + i, 0, toAdd[i]);
+          }
+        } else {
+          if (order) this.models.length = 0;
+          var orderedModels = order || toAdd;
+          for (i = 0, l = orderedModels.length; i < l; i++) {
+            this.models.push(orderedModels[i]);
+          }
+        }
+      }
+
+      // Silently sort the collection if appropriate.
+      if (sort) this.sort({silent: true});
+
+      // Unless silenced, it's time to fire all appropriate add/sort events.
+      if (!options.silent) {
+        for (i = 0, l = toAdd.length; i < l; i++) {
+          (model = toAdd[i]).trigger('add', model, this, options);
+        }
+        if (sort || (order && order.length)) this.trigger('sort', this, options);
+      }
+      
+      // Return the added (or merged) model (or models).
+      return singular ? models[0] : models;
+    },
+
+    // When you have more items than you want to add or remove individually,
+    // you can reset the entire set with a new list of models, without firing
+    // any granular `add` or `remove` events. Fires `reset` when finished.
+    // Useful for bulk operations and optimizations.
+    reset: function(models, options) {
+      options || (options = {});
+      for (var i = 0, l = this.models.length; i < l; i++) {
+        this._removeReference(this.models[i]);
+      }
+      options.previousModels = this.models;
+      this._reset();
+      models = this.add(models, _.extend({silent: true}, options));
+      if (!options.silent) this.trigger('reset', this, options);
+      return models;
+    },
+
+    // Add a model to the end of the collection.
+    push: function(model, options) {
+      return this.add(model, _.extend({at: this.length}, options));
+    },
+
+    // Remove a model from the end of the collection.
+    pop: function(options) {
+      var model = this.at(this.length - 1);
+      this.remove(model, options);
+      return model;
+    },
+
+    // Add a model to the beginning of the collection.
+    unshift: function(model, options) {
+      return this.add(model, _.extend({at: 0}, options));
+    },
+
+    // Remove a model from the beginning of the collection.
+    shift: function(options) {
+      var model = this.at(0);
+      this.remove(model, options);
+      return model;
+    },
+
+    // Slice out a sub-array of models from the collection.
+    slice: function() {
+      return slice.apply(this.models, arguments);
+    },
+
+    // Get a model from the set by id.
+    get: function(obj) {
+      if (obj == null) return void 0;
+      return this._byId[obj.id] || this._byId[obj.cid] || this._byId[obj];
+    },
+
+    // Get the model at the given index.
+    at: function(index) {
+      return this.models[index];
+    },
+
+    // Return models with matching attributes. Useful for simple cases of
+    // `filter`.
+    where: function(attrs, first) {
+      if (_.isEmpty(attrs)) return first ? void 0 : [];
+      return this[first ? 'find' : 'filter'](function(model) {
+        for (var key in attrs) {
+          if (attrs[key] !== model.get(key)) return false;
+        }
+        return true;
+      });
+    },
+
+    // Return the first model with matching attributes. Useful for simple cases
+    // of `find`.
+    findWhere: function(attrs) {
+      return this.where(attrs, true);
+    },
+
+    // Force the collection to re-sort itself. You don't need to call this under
+    // normal circumstances, as the set will maintain sort order as each item
+    // is added.
+    sort: function(options) {
+      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
+      options || (options = {});
+
+      // Run sort based on type of `comparator`.
+      if (_.isString(this.comparator) || this.comparator.length === 1) {
+        this.models = this.sortBy(this.comparator, this);
+      } else {
+        this.models.sort(_.bind(this.comparator, this));
+      }
+
+      if (!options.silent) this.trigger('sort', this, options);
+      return this;
+    },
+
+    // Pluck an attribute from each model in the collection.
+    pluck: function(attr) {
+      return _.invoke(this.models, 'get', attr);
+    },
+
+    // Fetch the default set of models for this collection, resetting the
+    // collection when they arrive. If `reset: true` is passed, the response
+    // data will be passed through the `reset` method instead of `set`.
+    fetch: function(options) {
+      options = options ? _.clone(options) : {};
+      if (options.parse === void 0) options.parse = true;
+      var success = options.success;
+      var collection = this;
+      options.success = function(resp) {
+        var method = options.reset ? 'reset' : 'set';
+        collection[method](resp, options);
+        if (success) success(collection, resp, options);
+        collection.trigger('sync', collection, resp, options);
+      };
+      wrapError(this, options);
+      return this.sync('read', this, options);
+    },
+
+    // Create a new instance of a model in this collection. Add the model to the
+    // collection immediately, unless `wait: true` is passed, in which case we
+    // wait for the server to agree.
+    create: function(model, options) {
+      options = options ? _.clone(options) : {};
+      if (!(model = this._prepareModel(model, options))) return false;
+      if (!options.wait) this.add(model, options);
+      var collection = this;
+      var success = options.success;
+      options.success = function(model, resp, options) {
+        if (options.wait) collection.add(model, options);
+        if (success) success(model, resp, options);
+      };
+      model.save(null, options);
+      return model;
+    },
+
+    // **parse** converts a response into a list of models to be added to the
+    // collection. The default implementation is just to pass it through.
+    parse: function(resp, options) {
+      return resp;
+    },
+
+    // Create a new collection with an identical list of models as this one.
+    clone: function() {
+      return new this.constructor(this.models);
+    },
+
+    // Private method to reset all internal state. Called when the collection
+    // is first initialized or reset.
+    _reset: function() {
+      this.length = 0;
+      this.models = [];
+      this._byId  = {};
+    },
+
+    // Prepare a hash of attributes (or other model) to be added to this
+    // collection.
+    _prepareModel: function(attrs, options) {
+      if (attrs instanceof Model) {
+        if (!attrs.collection) attrs.collection = this;
+        return attrs;
+      }
+      options = options ? _.clone(options) : {};
+      options.collection = this;
+      var model = new this.model(attrs, options);
+      if (!model.validationError) return model;
+      this.trigger('invalid', this, model.validationError, options);
+      return false;
+    },
+
+    // Internal method to sever a model's ties to a collection.
+    _removeReference: function(model) {
+      if (this === model.collection) delete model.collection;
+      model.off('all', this._onModelEvent, this);
+    },
+
+    // Internal method called every time a model in the set fires an event.
+    // Sets need to update their indexes when models change ids. All other
+    // events simply proxy through. "add" and "remove" events that originate
+    // in other collections are ignored.
+    _onModelEvent: function(event, model, collection, options) {
+      if ((event === 'add' || event === 'remove') && collection !== this) return;
+      if (event === 'destroy') this.remove(model, options);
+      if (model && event === 'change:' + model.idAttribute) {
+        delete this._byId[model.previous(model.idAttribute)];
+        if (model.id != null) this._byId[model.id] = model;
+      }
+      this.trigger.apply(this, arguments);
+    }
+
+  });
+
+  // Underscore methods that we want to implement on the Collection.
+  // 90% of the core usefulness of Backbone Collections is actually implemented
+  // right here:
+  var methods = ['forEach', 'each', 'map', 'collect', 'reduce', 'foldl',
+    'inject', 'reduceRight', 'foldr', 'find', 'detect', 'filter', 'select',
+    'reject', 'every', 'all', 'some', 'any', 'include', 'contains', 'invoke',
+    'max', 'min', 'toArray', 'size', 'first', 'head', 'take', 'initial', 'rest',
+    'tail', 'drop', 'last', 'without', 'difference', 'indexOf', 'shuffle',
+    'lastIndexOf', 'isEmpty', 'chain'];
+
+  // Mix in each Underscore method as a proxy to `Collection#models`.
+  _.each(methods, function(method) {
+    Collection.prototype[method] = function() {
+      var args = slice.call(arguments);
+      args.unshift(this.models);
+      return _[method].apply(_, args);
+    };
+  });
+
+  // Underscore methods that take a property name as an argument.
+  var attributeMethods = ['groupBy', 'countBy', 'sortBy'];
+
+  // Use attributes instead of properties.
+  _.each(attributeMethods, function(method) {
+    Collection.prototype[method] = function(value, context) {
+      var iterator = _.isFunction(value) ? value : function(model) {
+        return model.get(value);
+      };
+      return _[method](this.models, iterator, context);
+    };
+  });
+
+  // Backbone.View
+  // -------------
+
+  // Backbone Views are almost more convention than they are actual code. A View
+  // is simply a JavaScript object that represents a logical chunk of UI in the
+  // DOM. This might be a single item, an entire list, a sidebar or panel, or
+  // even the surrounding frame which wraps your whole app. Defining a chunk of
+  // UI as a **View** allows you to define your DOM events declaratively, without
+  // having to worry about render order ... and makes it easy for the view to
+  // react to specific changes in the state of your models.
+
+  // Creating a Backbone.View creates its initial element outside of the DOM,
+  // if an existing element is not provided...
+  var View = Backbone.View = function(options) {
+    this.cid = _.uniqueId('view');
+    options || (options = {});
+    _.extend(this, _.pick(options, viewOptions));
+    this._ensureElement();
+    this.initialize.apply(this, arguments);
+    this.delegateEvents();
+  };
+
+  // Cached regex to split keys for `delegate`.
+  var delegateEventSplitter = /^(\S+)\s*(.*)$/;
+
+  // List of view options to be merged as properties.
+  var viewOptions = ['model', 'collection', 'el', 'id', 'attributes', 'className', 'tagName', 'events'];
+
+  // Set up all inheritable **Backbone.View** properties and methods.
+  _.extend(View.prototype, Events, {
+
+    // The default `tagName` of a View's element is `"div"`.
+    tagName: 'div',
+
+    // jQuery delegate for element lookup, scoped to DOM elements within the
+    // current view. This should be preferred to global lookups where possible.
+    $: function(selector) {
+      return this.$el.find(selector);
+    },
+
+    // Initialize is an empty function by default. Override it with your own
+    // initialization logic.
+    initialize: function(){},
+
+    // **render** is the core function that your view should override, in order
+    // to populate its element (`this.el`), with the appropriate HTML. The
+    // convention is for **render** to always return `this`.
+    render: function() {
+      return this;
+    },
+
+    // Remove this view by taking the element out of the DOM, and removing any
+    // applicable Backbone.Events listeners.
+    remove: function() {
+      this.$el.remove();
+      this.stopListening();
+      return this;
+    },
+
+    // Change the view's element (`this.el` property), including event
+    // re-delegation.
+    setElement: function(element, delegate) {
+      if (this.$el) this.undelegateEvents();
+      this.$el = element instanceof Backbone.$ ? element : Backbone.$(element);
+      this.el = this.$el[0];
+      if (delegate !== false) this.delegateEvents();
+      return this;
+    },
+
+    // Set callbacks, where `this.events` is a hash of
+    //
+    // *{"event selector": "callback"}*
+    //
+    //     {
+    //       'mousedown .title':  'edit',
+    //       'click .button':     'save',
+    //       'click .open':       function(e) { ... }
+    //     }
+    //
+    // pairs. Callbacks will be bound to the view, with `this` set properly.
+    // Uses event delegation for efficiency.
+    // Omitting the selector binds the event to `this.el`.
+    // This only works for delegate-able events: not `focus`, `blur`, and
+    // not `change`, `submit`, and `reset` in Internet Explorer.
+    delegateEvents: function(events) {
+      if (!(events || (events = _.result(this, 'events')))) return this;
+      this.undelegateEvents();
+      for (var key in events) {
+        var method = events[key];
+        if (!_.isFunction(method)) method = this[events[key]];
+        if (!method) continue;
+
+        var match = key.match(delegateEventSplitter);
+        var eventName = match[1], selector = match[2];
+        method = _.bind(method, this);
+        eventName += '.delegateEvents' + this.cid;
+        if (selector === '') {
+          this.$el.on(eventName, method);
+        } else {
+          this.$el.on(eventName, selector, method);
+        }
+      }
+      return this;
+    },
+
+    // Clears all callbacks previously bound to the view with `delegateEvents`.
+    // You usually don't need to use this, but may wish to if you have multiple
+    // Backbone views attached to the same DOM element.
+    undelegateEvents: function() {
+      this.$el.off('.delegateEvents' + this.cid);
+      return this;
+    },
+
+    // Ensure that the View has a DOM element to render into.
+    // If `this.el` is a string, pass it through `$()`, take the first
+    // matching element, and re-assign it to `el`. Otherwise, create
+    // an element from the `id`, `className` and `tagName` properties.
+    _ensureElement: function() {
+      if (!this.el) {
+        var attrs = _.extend({}, _.result(this, 'attributes'));
+        if (this.id) attrs.id = _.result(this, 'id');
+        if (this.className) attrs['class'] = _.result(this, 'className');
+        var $el = Backbone.$('<' + _.result(this, 'tagName') + '>').attr(attrs);
+        this.setElement($el, false);
+      } else {
+        this.setElement(_.result(this, 'el'), false);
+      }
+    }
+
+  });
+
+  // Backbone.sync
+  // -------------
+
+  // Override this function to change the manner in which Backbone persists
+  // models to the server. You will be passed the type of request, and the
+  // model in question. By default, makes a RESTful Ajax request
+  // to the model's `url()`. Some possible customizations could be:
+  //
+  // * Use `setTimeout` to batch rapid-fire updates into a single request.
+  // * Send up the models as XML instead of JSON.
+  // * Persist models via WebSockets instead of Ajax.
+  //
+  // Turn on `Backbone.emulateHTTP` in order to send `PUT` and `DELETE` requests
+  // as `POST`, with a `_method` parameter containing the true HTTP method,
+  // as well as all requests with the body as `application/x-www-form-urlencoded`
+  // instead of `application/json` with the model in a param named `model`.
+  // Useful when interfacing with server-side languages like **PHP** that make
+  // it difficult to read the body of `PUT` requests.
+  Backbone.sync = function(method, model, options) {
+    var type = methodMap[method];
+
+    // Default options, unless specified.
+    _.defaults(options || (options = {}), {
+      emulateHTTP: Backbone.emulateHTTP,
+      emulateJSON: Backbone.emulateJSON
+    });
+
+    // Default JSON-request options.
+    var params = {type: type, dataType: 'json'};
+
+    // Ensure that we have a URL.
+    if (!options.url) {
+      params.url = _.result(model, 'url') || urlError();
+    }
+
+    // Ensure that we have the appropriate request data.
+    if (options.data == null && model && (method === 'create' || method === 'update' || method === 'patch')) {
+      params.contentType = 'application/json';
+      params.data = JSON.stringify(options.attrs || model.toJSON(options));
+    }
+
+    // For older servers, emulate JSON by encoding the request into an HTML-form.
+    if (options.emulateJSON) {
+      params.contentType = 'application/x-www-form-urlencoded';
+      params.data = params.data ? {model: params.data} : {};
+    }
+
+    // For older servers, emulate HTTP by mimicking the HTTP method with `_method`
+    // And an `X-HTTP-Method-Override` header.
+    if (options.emulateHTTP && (type === 'PUT' || type === 'DELETE' || type === 'PATCH')) {
+      params.type = 'POST';
+      if (options.emulateJSON) params.data._method = type;
+      var beforeSend = options.beforeSend;
+      options.beforeSend = function(xhr) {
+        xhr.setRequestHeader('X-HTTP-Method-Override', type);
+        if (beforeSend) return beforeSend.apply(this, arguments);
+      };
+    }
+
+    // Don't process data on a non-GET request.
+    if (params.type !== 'GET' && !options.emulateJSON) {
+      params.processData = false;
+    }
+
+    // If we're sending a `PATCH` request, and we're in an old Internet Explorer
+    // that still has ActiveX enabled by default, override jQuery to use that
+    // for XHR instead. Remove this line when jQuery supports `PATCH` on IE8.
+    if (params.type === 'PATCH' && noXhrPatch) {
+      params.xhr = function() {
+        return new ActiveXObject("Microsoft.XMLHTTP");
+      };
+    }
+
+    // Make the request, allowing the user to override any Ajax options.
+    var xhr = options.xhr = Backbone.ajax(_.extend(params, options));
+    model.trigger('request', model, xhr, options);
+    return xhr;
+  };
+
+  var noXhrPatch = typeof window !== 'undefined' && !!window.ActiveXObject && !(window.XMLHttpRequest && (new XMLHttpRequest).dispatchEvent);
+
+  // Map from CRUD to HTTP for our default `Backbone.sync` implementation.
+  var methodMap = {
+    'create': 'POST',
+    'update': 'PUT',
+    'patch':  'PATCH',
+    'delete': 'DELETE',
+    'read':   'GET'
+  };
+
+  // Set the default implementation of `Backbone.ajax` to proxy through to `$`.
+  // Override this if you'd like to use a different library.
+  Backbone.ajax = function() {
+    return Backbone.$.ajax.apply(Backbone.$, arguments);
+  };
+
+  // Backbone.Router
+  // ---------------
+
+  // Routers map faux-URLs to actions, and fire events when routes are
+  // matched. Creating a new one sets its `routes` hash, if not set statically.
+  var Router = Backbone.Router = function(options) {
+    options || (options = {});
+    if (options.routes) this.routes = options.routes;
+    this._bindRoutes();
+    this.initialize.apply(this, arguments);
+  };
+
+  // Cached regular expressions for matching named param parts and splatted
+  // parts of route strings.
+  var optionalParam = /\((.*?)\)/g;
+  var namedParam    = /(\(\?)?:\w+/g;
+  var splatParam    = /\*\w+/g;
+  var escapeRegExp  = /[\-{}\[\]+?.,\\\^$|#\s]/g;
+
+  // Set up all inheritable **Backbone.Router** properties and methods.
+  _.extend(Router.prototype, Events, {
+
+    // Initialize is an empty function by default. Override it with your own
+    // initialization logic.
+    initialize: function(){},
+
+    // Manually bind a single named route to a callback. For example:
+    //
+    //     this.route('search/:query/p:num', 'search', function(query, num) {
+    //       ...
+    //     });
+    //
+    route: function(route, name, callback) {
+      if (!_.isRegExp(route)) route = this._routeToRegExp(route);
+      if (_.isFunction(name)) {
+        callback = name;
+        name = '';
+      }
+      if (!callback) callback = this[name];
+      var router = this;
+      Backbone.history.route(route, function(fragment) {
+        var args = router._extractParameters(route, fragment);
+        callback && callback.apply(router, args);
+        router.trigger.apply(router, ['route:' + name].concat(args));
+        router.trigger('route', name, args);
+        Backbone.history.trigger('route', router, name, args);
+      });
+      return this;
+    },
+
+    // Simple proxy to `Backbone.history` to save a fragment into the history.
+    navigate: function(fragment, options) {
+      Backbone.history.navigate(fragment, options);
+      return this;
+    },
+
+    // Bind all defined routes to `Backbone.history`. We have to reverse the
+    // order of the routes here to support behavior where the most general
+    // routes can be defined at the bottom of the route map.
+    _bindRoutes: function() {
+      if (!this.routes) return;
+      this.routes = _.result(this, 'routes');
+      var route, routes = _.keys(this.routes);
+      while ((route = routes.pop()) != null) {
+        this.route(route, this.routes[route]);
+      }
+    },
+
+    // Convert a route string into a regular expression, suitable for matching
+    // against the current location hash.
+    _routeToRegExp: function(route) {
+      route = route.replace(escapeRegExp, '\\$&')
+                   .replace(optionalParam, '(?:$1)?')
+                   .replace(namedParam, function(match, optional) {
+                     return optional ? match : '([^\/]+)';
+                   })
+                   .replace(splatParam, '(.*?)');
+      return new RegExp('^' + route + '$');
+    },
+
+    // Given a route, and a URL fragment that it matches, return the array of
+    // extracted decoded parameters. Empty or unmatched parameters will be
+    // treated as `null` to normalize cross-browser behavior.
+    _extractParameters: function(route, fragment) {
+      var params = route.exec(fragment).slice(1);
+      return _.map(params, function(param) {
+        return param ? decodeURIComponent(param) : null;
+      });
+    }
+
+  });
+
+  // Backbone.History
+  // ----------------
+
+  // Handles cross-browser history management, based on either
+  // [pushState](http://diveintohtml5.info/history.html) and real URLs, or
+  // [onhashchange](https://developer.mozilla.org/en-US/docs/DOM/window.onhashchange)
+  // and URL fragments. If the browser supports neither (old IE, natch),
+  // falls back to polling.
+  var History = Backbone.History = function() {
+    this.handlers = [];
+    _.bindAll(this, 'checkUrl');
+
+    // Ensure that `History` can be used outside of the browser.
+    if (typeof window !== 'undefined') {
+      this.location = window.location;
+      this.history = window.history;
+    }
+  };
+
+  // Cached regex for stripping a leading hash/slash and trailing space.
+  var routeStripper = /^[#\/]|\s+$/g;
+
+  // Cached regex for stripping leading and trailing slashes.
+  var rootStripper = /^\/+|\/+$/g;
+
+  // Cached regex for detecting MSIE.
+  var isExplorer = /msie [\w.]+/;
+
+  // Cached regex for removing a trailing slash.
+  var trailingSlash = /\/$/;
+
+  // Cached regex for stripping urls of hash and query.
+  var pathStripper = /[?#].*$/;
+
+  // Has the history handling already been started?
+  History.started = false;
+
+  // Set up all inheritable **Backbone.History** properties and methods.
+  _.extend(History.prototype, Events, {
+
+    // The default interval to poll for hash changes, if necessary, is
+    // twenty times a second.
+    interval: 50,
+
+    // Gets the true hash value. Cannot use location.hash directly due to bug
+    // in Firefox where location.hash will always be decoded.
+    getHash: function(window) {
+      var match = (window || this).location.href.match(/#(.*)$/);
+      return match ? match[1] : '';
+    },
+
+    // Get the cross-browser normalized URL fragment, either from the URL,
+    // the hash, or the override.
+    getFragment: function(fragment, forcePushState) {
+      if (fragment == null) {
+        if (this._hasPushState || !this._wantsHashChange || forcePushState) {
+          fragment = this.location.pathname;
+          var root = this.root.replace(trailingSlash, '');
+          if (!fragment.indexOf(root)) fragment = fragment.slice(root.length);
+        } else {
+          fragment = this.getHash();
+        }
+      }
+      return fragment.replace(routeStripper, '');
+    },
+
+    // Start the hash change handling, returning `true` if the current URL matches
+    // an existing route, and `false` otherwise.
+    start: function(options) {
+      if (History.started) throw new Error("Backbone.history has already been started");
+      History.started = true;
+
+      // Figure out the initial configuration. Do we need an iframe?
+      // Is pushState desired ... is it available?
+      this.options          = _.extend({root: '/'}, this.options, options);
+      this.root             = this.options.root;
+      this._wantsHashChange = this.options.hashChange !== false;
+      this._wantsPushState  = !!this.options.pushState;
+      this._hasPushState    = !!(this.options.pushState && this.history && this.history.pushState);
+      var fragment          = this.getFragment();
+      var docMode           = document.documentMode;
+      var oldIE             = (isExplorer.exec(navigator.userAgent.toLowerCase()) && (!docMode || docMode <= 7));
+
+      // Normalize root to always include a leading and trailing slash.
+      this.root = ('/' + this.root + '/').replace(rootStripper, '/');
+
+      if (oldIE && this._wantsHashChange) {
+        this.iframe = Backbone.$('<iframe src="javascript:0" tabindex="-1" />').hide().appendTo('body')[0].contentWindow;
+        this.navigate(fragment);
+      }
+
+      // Depending on whether we're using pushState or hashes, and whether
+      // 'onhashchange' is supported, determine how we check the URL state.
+      if (this._hasPushState) {
+        Backbone.$(window).on('popstate', this.checkUrl);
+      } else if (this._wantsHashChange && ('onhashchange' in window) && !oldIE) {
+        Backbone.$(window).on('hashchange', this.checkUrl);
+      } else if (this._wantsHashChange) {
+        this._checkUrlInterval = setInterval(this.checkUrl, this.interval);
+      }
+
+      // Determine if we need to change the base url, for a pushState link
+      // opened by a non-pushState browser.
+      this.fragment = fragment;
+      var loc = this.location;
+      var atRoot = loc.pathname.replace(/[^\/]$/, '$&/') === this.root;
+
+      // Transition from hashChange to pushState or vice versa if both are
+      // requested.
+      if (this._wantsHashChange && this._wantsPushState) {
+
+        // If we've started off with a route from a `pushState`-enabled
+        // browser, but we're currently in a browser that doesn't support it...
+        if (!this._hasPushState && !atRoot) {
+          this.fragment = this.getFragment(null, true);
+          this.location.replace(this.root + this.location.search + '#' + this.fragment);
+          // Return immediately as browser will do redirect to new url
+          return true;
+
+        // Or if we've started out with a hash-based route, but we're currently
+        // in a browser where it could be `pushState`-based instead...
+        } else if (this._hasPushState && atRoot && loc.hash) {
+          this.fragment = this.getHash().replace(routeStripper, '');
+          this.history.replaceState({}, document.title, this.root + this.fragment + loc.search);
+        }
+
+      }
+
+      if (!this.options.silent) return this.loadUrl();
+    },
+
+    // Disable Backbone.history, perhaps temporarily. Not useful in a real app,
+    // but possibly useful for unit testing Routers.
+    stop: function() {
+      Backbone.$(window).off('popstate', this.checkUrl).off('hashchange', this.checkUrl);
+      clearInterval(this._checkUrlInterval);
+      History.started = false;
+    },
+
+    // Add a route to be tested when the fragment changes. Routes added later
+    // may override previous routes.
+    route: function(route, callback) {
+      this.handlers.unshift({route: route, callback: callback});
+    },
+
+    // Checks the current URL to see if it has changed, and if it has,
+    // calls `loadUrl`, normalizing across the hidden iframe.
+    checkUrl: function(e) {
+      var current = this.getFragment();
+      if (current === this.fragment && this.iframe) {
+        current = this.getFragment(this.getHash(this.iframe));
+      }
+      if (current === this.fragment) return false;
+      if (this.iframe) this.navigate(current);
+      this.loadUrl();
+    },
+
+    // Attempt to load the current URL fragment. If a route succeeds with a
+    // match, returns `true`. If no defined routes matches the fragment,
+    // returns `false`.
+    loadUrl: function(fragment) {
+      fragment = this.fragment = this.getFragment(fragment);
+      return _.any(this.handlers, function(handler) {
+        if (handler.route.test(fragment)) {
+          handler.callback(fragment);
+          return true;
+        }
+      });
+    },
+
+    // Save a fragment into the hash history, or replace the URL state if the
+    // 'replace' option is passed. You are responsible for properly URL-encoding
+    // the fragment in advance.
+    //
+    // The options object can contain `trigger: true` if you wish to have the
+    // route callback be fired (not usually desirable), or `replace: true`, if
+    // you wish to modify the current URL without adding an entry to the history.
+    navigate: function(fragment, options) {
+      if (!History.started) return false;
+      if (!options || options === true) options = {trigger: !!options};
+
+      var url = this.root + (fragment = this.getFragment(fragment || ''));
+
+      // Strip the fragment of the query and hash for matching.
+      fragment = fragment.replace(pathStripper, '');
+
+      if (this.fragment === fragment) return;
+      this.fragment = fragment;
+
+      // Don't include a trailing slash on the root.
+      if (fragment === '' && url !== '/') url = url.slice(0, -1);
+
+      // If pushState is available, we use it to set the fragment as a real URL.
+      if (this._hasPushState) {
+        this.history[options.replace ? 'replaceState' : 'pushState']({}, document.title, url);
+
+      // If hash changes haven't been explicitly disabled, update the hash
+      // fragment to store history.
+      } else if (this._wantsHashChange) {
+        this._updateHash(this.location, fragment, options.replace);
+        if (this.iframe && (fragment !== this.getFragment(this.getHash(this.iframe)))) {
+          // Opening and closing the iframe tricks IE7 and earlier to push a
+          // history entry on hash-tag change.  When replace is true, we don't
+          // want this.
+          if(!options.replace) this.iframe.document.open().close();
+          this._updateHash(this.iframe.location, fragment, options.replace);
+        }
+
+      // If you've told us that you explicitly don't want fallback hashchange-
+      // based history, then `navigate` becomes a page refresh.
+      } else {
+        return this.location.assign(url);
+      }
+      if (options.trigger) return this.loadUrl(fragment);
+    },
+
+    // Update the hash location, either replacing the current entry, or adding
+    // a new one to the browser history.
+    _updateHash: function(location, fragment, replace) {
+      if (replace) {
+        var href = location.href.replace(/(javascript:|#).*$/, '');
+        location.replace(href + '#' + fragment);
+      } else {
+        // Some browsers require that `hash` contains a leading #.
+        location.hash = '#' + fragment;
+      }
+    }
+
+  });
+
+  // Create the default Backbone.history.
+  Backbone.history = new History;
+
+  // Helpers
+  // -------
+
+  // Helper function to correctly set up the prototype chain, for subclasses.
+  // Similar to `goog.inherits`, but uses a hash of prototype properties and
+  // class properties to be extended.
+  var extend = function(protoProps, staticProps) {
+    var parent = this;
+    var child;
+
+    // The constructor function for the new subclass is either defined by you
+    // (the "constructor" property in your `extend` definition), or defaulted
+    // by us to simply call the parent's constructor.
+    if (protoProps && _.has(protoProps, 'constructor')) {
+      child = protoProps.constructor;
+    } else {
+      child = function(){ return parent.apply(this, arguments); };
+    }
+
+    // Add static properties to the constructor function, if supplied.
+    _.extend(child, parent, staticProps);
+
+    // Set the prototype chain to inherit from `parent`, without calling
+    // `parent`'s constructor function.
+    var Surrogate = function(){ this.constructor = child; };
+    Surrogate.prototype = parent.prototype;
+    child.prototype = new Surrogate;
+
+    // Add prototype properties (instance properties) to the subclass,
+    // if supplied.
+    if (protoProps) _.extend(child.prototype, protoProps);
+
+    // Set a convenience property in case the parent's prototype is needed
+    // later.
+    child.__super__ = parent.prototype;
+
+    return child;
+  };
+
+  // Set up inheritance for the model, collection, router, view and history.
+  Model.extend = Collection.extend = Router.extend = View.extend = History.extend = extend;
+
+  // Throw an error when a URL is needed, and none is supplied.
+  var urlError = function() {
+    throw new Error('A "url" property or function must be specified');
+  };
+
+  // Wrap an optional error callback with a fallback error event.
+  var wrapError = function(model, options) {
+    var error = options.error;
+    options.error = function(resp) {
+      if (error) error(model, resp, options);
+      model.trigger('error', model, resp, options);
+    };
+  };
+
+}).call(this);
new file mode 100644
index 0000000000000000000000000000000000000000..3be8ab08667e944c9ead117cef669a2e19884ce6
GIT binary patch
literal 780718
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/frameworks/benchmark.js
@@ -0,0 +1,3918 @@
+/*!
+ * Benchmark.js v1.0.0 <http://benchmarkjs.com/>
+ * Copyright 2010-2012 Mathias Bynens <http://mths.be/>
+ * Based on JSLitmus.js, copyright Robert Kieffer <http://broofa.com/>
+ * Modified by John-David Dalton <http://allyoucanleet.com/>
+ * Available under MIT license <http://mths.be/mit>
+ */
+;(function(window, undefined) {
+  'use strict';
+
+  /** Used to assign each benchmark an incrimented id */
+  var counter = 0;
+
+  /** Detect DOM document object */
+  var doc = isHostType(window, 'document') && document;
+
+  /** Detect free variable `define` */
+  var freeDefine = typeof define == 'function' &&
+    typeof define.amd == 'object' && define.amd && define;
+
+  /** Detect free variable `exports` */
+  var freeExports = typeof exports == 'object' && exports &&
+    (typeof global == 'object' && global && global == global.global && (window = global), exports);
+
+  /** Detect free variable `require` */
+  var freeRequire = typeof require == 'function' && require;
+
+  /** Used to crawl all properties regardless of enumerability */
+  var getAllKeys = Object.getOwnPropertyNames;
+
+  /** Used to get property descriptors */
+  var getDescriptor = Object.getOwnPropertyDescriptor;
+
+  /** Used in case an object doesn't have its own method */
+  var hasOwnProperty = {}.hasOwnProperty;
+
+  /** Used to check if an object is extensible */
+  var isExtensible = Object.isExtensible || function() { return true; };
+
+  /** Used to access Wade Simmons' Node microtime module */
+  var microtimeObject = req('microtime');
+
+  /** Used to access the browser's high resolution timer */
+  var perfObject = isHostType(window, 'performance') && performance;
+
+  /** Used to call the browser's high resolution timer */
+  var perfName = perfObject && (
+    perfObject.now && 'now' ||
+    perfObject.webkitNow && 'webkitNow'
+  );
+
+  /** Used to access Node's high resolution timer */
+  var processObject = isHostType(window, 'process') && process;
+
+  /** Used to check if an own property is enumerable */
+  var propertyIsEnumerable = {}.propertyIsEnumerable;
+
+  /** Used to set property descriptors */
+  var setDescriptor = Object.defineProperty;
+
+  /** Used to resolve a value's internal [[Class]] */
+  var toString = {}.toString;
+
+  /** Used to prevent a `removeChild` memory leak in IE < 9 */
+  var trash = doc && doc.createElement('div');
+
+  /** Used to integrity check compiled tests */
+  var uid = 'uid' + (+new Date);
+
+  /** Used to avoid infinite recursion when methods call each other */
+  var calledBy = {};
+
+  /** Used to avoid hz of Infinity */
+  var divisors = {
+    '1': 4096,
+    '2': 512,
+    '3': 64,
+    '4': 8,
+    '5': 0
+  };
+
+  /**
+   * T-Distribution two-tailed critical values for 95% confidence
+   * http://www.itl.nist.gov/div898/handbook/eda/section3/eda3672.htm
+   */
+  var tTable = {
+    '1':  12.706,'2':  4.303, '3':  3.182, '4':  2.776, '5':  2.571, '6':  2.447,
+    '7':  2.365, '8':  2.306, '9':  2.262, '10': 2.228, '11': 2.201, '12': 2.179,
+    '13': 2.16,  '14': 2.145, '15': 2.131, '16': 2.12,  '17': 2.11,  '18': 2.101,
+    '19': 2.093, '20': 2.086, '21': 2.08,  '22': 2.074, '23': 2.069, '24': 2.064,
+    '25': 2.06,  '26': 2.056, '27': 2.052, '28': 2.048, '29': 2.045, '30': 2.042,
+    'infinity': 1.96
+  };
+
+  /**
+   * Critical Mann-Whitney U-values for 95% confidence
+   * http://www.saburchill.com/IBbiology/stats/003.html
+   */
+  var uTable = {
+    '5':  [0, 1, 2],
+    '6':  [1, 2, 3, 5],
+    '7':  [1, 3, 5, 6, 8],
+    '8':  [2, 4, 6, 8, 10, 13],
+    '9':  [2, 4, 7, 10, 12, 15, 17],
+    '10': [3, 5, 8, 11, 14, 17, 20, 23],
+    '11': [3, 6, 9, 13, 16, 19, 23, 26, 30],
+    '12': [4, 7, 11, 14, 18, 22, 26, 29, 33, 37],
+    '13': [4, 8, 12, 16, 20, 24, 28, 33, 37, 41, 45],
+    '14': [5, 9, 13, 17, 22, 26, 31, 36, 40, 45, 50, 55],
+    '15': [5, 10, 14, 19, 24, 29, 34, 39, 44, 49, 54, 59, 64],
+    '16': [6, 11, 15, 21, 26, 31, 37, 42, 47, 53, 59, 64, 70, 75],
+    '17': [6, 11, 17, 22, 28, 34, 39, 45, 51, 57, 63, 67, 75, 81, 87],
+    '18': [7, 12, 18, 24, 30, 36, 42, 48, 55, 61, 67, 74, 80, 86, 93, 99],
+    '19': [7, 13, 19, 25, 32, 38, 45, 52, 58, 65, 72, 78, 85, 92, 99, 106, 113],
+    '20': [8, 14, 20, 27, 34, 41, 48, 55, 62, 69, 76, 83, 90, 98, 105, 112, 119, 127],
+    '21': [8, 15, 22, 29, 36, 43, 50, 58, 65, 73, 80, 88, 96, 103, 111, 119, 126, 134, 142],
+    '22': [9, 16, 23, 30, 38, 45, 53, 61, 69, 77, 85, 93, 101, 109, 117, 125, 133, 141, 150, 158],
+    '23': [9, 17, 24, 32, 40, 48, 56, 64, 73, 81, 89, 98, 106, 115, 123, 132, 140, 149, 157, 166, 175],
+    '24': [10, 17, 25, 33, 42, 50, 59, 67, 76, 85, 94, 102, 111, 120, 129, 138, 147, 156, 165, 174, 183, 192],
+    '25': [10, 18, 27, 35, 44, 53, 62, 71, 80, 89, 98, 107, 117, 126, 135, 145, 154, 163, 173, 182, 192, 201, 211],
+    '26': [11, 19, 28, 37, 46, 55, 64, 74, 83, 93, 102, 112, 122, 132, 141, 151, 161, 171, 181, 191, 200, 210, 220, 230],
+    '27': [11, 20, 29, 38, 48, 57, 67, 77, 87, 97, 107, 118, 125, 138, 147, 158, 168, 178, 188, 199, 209, 219, 230, 240, 250],
+    '28': [12, 21, 30, 40, 50, 60, 70, 80, 90, 101, 111, 122, 132, 143, 154, 164, 175, 186, 196, 207, 218, 228, 239, 250, 261, 272],
+    '29': [13, 22, 32, 42, 52, 62, 73, 83, 94, 105, 116, 127, 138, 149, 160, 171, 182, 193, 204, 215, 226, 238, 249, 260, 271, 282, 294],
+    '30': [13, 23, 33, 43, 54, 65, 76, 87, 98, 109, 120, 131, 143, 154, 166, 177, 189, 200, 212, 223, 235, 247, 258, 270, 282, 293, 305, 317]
+  };
+
+  /**
+   * An object used to flag environments/features.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @type Object
+   */
+  var support = {};
+
+  (function() {
+
+    /**
+     * Detect Adobe AIR.
+     *
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    support.air = isClassOf(window.runtime, 'ScriptBridgingProxyObject');
+
+    /**
+     * Detect if `arguments` objects have the correct internal [[Class]] value.
+     *
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    support.argumentsClass = isClassOf(arguments, 'Arguments');
+
+    /**
+     * Detect if in a browser environment.
+     *
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    support.browser = doc && isHostType(window, 'navigator');
+
+    /**
+     * Detect if strings support accessing characters by index.
+     *
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    support.charByIndex =
+      // IE 8 supports indexes on string literals but not string objects
+      ('x'[0] + Object('x')[0]) == 'xx';
+
+    /**
+     * Detect if strings have indexes as own properties.
+     *
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    support.charByOwnIndex =
+      // Narwhal, Rhino, RingoJS, IE 8, and Opera < 10.52 support indexes on
+      // strings but don't detect them as own properties
+      support.charByIndex && hasKey('x', '0');
+
+    /**
+     * Detect if Java is enabled/exposed.
+     *
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    support.java = isClassOf(window.java, 'JavaPackage');
+
+    /**
+     * Detect if the Timers API exists.
+     *
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    support.timeout = isHostType(window, 'setTimeout') && isHostType(window, 'clearTimeout');
+
+    /**
+     * Detect if functions support decompilation.
+     *
+     * @name decompilation
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    try {
+      // Safari 2.x removes commas in object literals
+      // from Function#toString results
+      // http://webk.it/11609
+      // Firefox 3.6 and Opera 9.25 strip grouping
+      // parentheses from Function#toString results
+      // http://bugzil.la/559438
+      support.decompilation = Function(
+        'return (' + (function(x) { return { 'x': '' + (1 + x) + '', 'y': 0 }; }) + ')'
+      )()(0).x === '1';
+    } catch(e) {
+      support.decompilation = false;
+    }
+
+    /**
+     * Detect ES5+ property descriptor API.
+     *
+     * @name descriptors
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    try {
+      var o = {};
+      support.descriptors = (setDescriptor(o, o, o), 'value' in getDescriptor(o, o));
+    } catch(e) {
+      support.descriptors = false;
+    }
+
+    /**
+     * Detect ES5+ Object.getOwnPropertyNames().
+     *
+     * @name getAllKeys
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    try {
+      support.getAllKeys = /\bvalueOf\b/.test(getAllKeys(Object.prototype));
+    } catch(e) {
+      support.getAllKeys = false;
+    }
+
+    /**
+     * Detect if own properties are iterated before inherited properties (all but IE < 9).
+     *
+     * @name iteratesOwnLast
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    support.iteratesOwnFirst = (function() {
+      var props = [];
+      function ctor() { this.x = 1; }
+      ctor.prototype = { 'y': 1 };
+      for (var prop in new ctor) { props.push(prop); }
+      return props[0] == 'x';
+    }());
+
+    /**
+     * Detect if a node's [[Class]] is resolvable (all but IE < 9)
+     * and that the JS engine errors when attempting to coerce an object to a
+     * string without a `toString` property value of `typeof` "function".
+     *
+     * @name nodeClass
+     * @memberOf Benchmark.support
+     * @type Boolean
+     */
+    try {
+      support.nodeClass = ({ 'toString': 0 } + '', toString.call(doc || 0) != '[object Object]');
+    } catch(e) {
+      support.nodeClass = true;
+    }
+  }());
+
+  /**
+   * Timer object used by `clock()` and `Deferred#resolve`.
+   *
+   * @private
+   * @type Object
+   */
+  var timer = {
+
+   /**
+    * The timer namespace object or constructor.
+    *
+    * @private
+    * @memberOf timer
+    * @type Function|Object
+    */
+    'ns': Date,
+
+   /**
+    * Starts the deferred timer.
+    *
+    * @private
+    * @memberOf timer
+    * @param {Object} deferred The deferred instance.
+    */
+    'start': null, // lazy defined in `clock()`
+
+   /**
+    * Stops the deferred timer.
+    *
+    * @private
+    * @memberOf timer
+    * @param {Object} deferred The deferred instance.
+    */
+    'stop': null // lazy defined in `clock()`
+  };
+
+  /** Shortcut for inverse results */
+  var noArgumentsClass = !support.argumentsClass,
+      noCharByIndex = !support.charByIndex,
+      noCharByOwnIndex = !support.charByOwnIndex;
+
+  /** Math shortcuts */
+  var abs   = Math.abs,
+      floor = Math.floor,
+      max   = Math.max,
+      min   = Math.min,
+      pow   = Math.pow,
+      sqrt  = Math.sqrt;
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * The Benchmark constructor.
+   *
+   * @constructor
+   * @param {String} name A name to identify the benchmark.
+   * @param {Function|String} fn The test to benchmark.
+   * @param {Object} [options={}] Options object.
+   * @example
+   *
+   * // basic usage (the `new` operator is optional)
+   * var bench = new Benchmark(fn);
+   *
+   * // or using a name first
+   * var bench = new Benchmark('foo', fn);
+   *
+   * // or with options
+   * var bench = new Benchmark('foo', fn, {
+   *
+   *   // displayed by Benchmark#toString if `name` is not available
+   *   'id': 'xyz',
+   *
+   *   // called when the benchmark starts running
+   *   'onStart': onStart,
+   *
+   *   // called after each run cycle
+   *   'onCycle': onCycle,
+   *
+   *   // called when aborted
+   *   'onAbort': onAbort,
+   *
+   *   // called when a test errors
+   *   'onError': onError,
+   *
+   *   // called when reset
+   *   'onReset': onReset,
+   *
+   *   // called when the benchmark completes running
+   *   'onComplete': onComplete,
+   *
+   *   // compiled/called before the test loop
+   *   'setup': setup,
+   *
+   *   // compiled/called after the test loop
+   *   'teardown': teardown
+   * });
+   *
+   * // or name and options
+   * var bench = new Benchmark('foo', {
+   *
+   *   // a flag to indicate the benchmark is deferred
+   *   'defer': true,
+   *
+   *   // benchmark test function
+   *   'fn': function(deferred) {
+   *     // call resolve() when the deferred test is finished
+   *     deferred.resolve();
+   *   }
+   * });
+   *
+   * // or options only
+   * var bench = new Benchmark({
+   *
+   *   // benchmark name
+   *   'name': 'foo',
+   *
+   *   // benchmark test as a string
+   *   'fn': '[1,2,3,4].sort()'
+   * });
+   *
+   * // a test's `this` binding is set to the benchmark instance
+   * var bench = new Benchmark('foo', function() {
+   *   'My name is '.concat(this.name); // My name is foo
+   * });
+   */
+  function Benchmark(name, fn, options) {
+    var me = this;
+
+    // allow instance creation without the `new` operator
+    if (me == null || me.constructor != Benchmark) {
+      return new Benchmark(name, fn, options);
+    }
+    // juggle arguments
+    if (isClassOf(name, 'Object')) {
+      // 1 argument (options)
+      options = name;
+    }
+    else if (isClassOf(name, 'Function')) {
+      // 2 arguments (fn, options)
+      options = fn;
+      fn = name;
+    }
+    else if (isClassOf(fn, 'Object')) {
+      // 2 arguments (name, options)
+      options = fn;
+      fn = null;
+      me.name = name;
+    }
+    else {
+      // 3 arguments (name, fn [, options])
+      me.name = name;
+    }
+    setOptions(me, options);
+    me.id || (me.id = ++counter);
+    me.fn == null && (me.fn = fn);
+    me.stats = deepClone(me.stats);
+    me.times = deepClone(me.times);
+  }
+
+  /**
+   * The Deferred constructor.
+   *
+   * @constructor
+   * @memberOf Benchmark
+   * @param {Object} clone The cloned benchmark instance.
+   */
+  function Deferred(clone) {
+    var me = this;
+    if (me == null || me.constructor != Deferred) {
+      return new Deferred(clone);
+    }
+    me.benchmark = clone;
+    clock(me);
+  }
+
+  /**
+   * The Event constructor.
+   *
+   * @constructor
+   * @memberOf Benchmark
+   * @param {String|Object} type The event type.
+   */
+  function Event(type) {
+    var me = this;
+    return (me == null || me.constructor != Event)
+      ? new Event(type)
+      : (type instanceof Event)
+          ? type
+          : extend(me, { 'timeStamp': +new Date }, typeof type == 'string' ? { 'type': type } : type);
+  }
+
+  /**
+   * The Suite constructor.
+   *
+   * @constructor
+   * @memberOf Benchmark
+   * @param {String} name A name to identify the suite.
+   * @param {Object} [options={}] Options object.
+   * @example
+   *
+   * // basic usage (the `new` operator is optional)
+   * var suite = new Benchmark.Suite;
+   *
+   * // or using a name first
+   * var suite = new Benchmark.Suite('foo');
+   *
+   * // or with options
+   * var suite = new Benchmark.Suite('foo', {
+   *
+   *   // called when the suite starts running
+   *   'onStart': onStart,
+   *
+   *   // called between running benchmarks
+   *   'onCycle': onCycle,
+   *
+   *   // called when aborted
+   *   'onAbort': onAbort,
+   *
+   *   // called when a test errors
+   *   'onError': onError,
+   *
+   *   // called when reset
+   *   'onReset': onReset,
+   *
+   *   // called when the suite completes running
+   *   'onComplete': onComplete
+   * });
+   */
+  function Suite(name, options) {
+    var me = this;
+
+    // allow instance creation without the `new` operator
+    if (me == null || me.constructor != Suite) {
+      return new Suite(name, options);
+    }
+    // juggle arguments
+    if (isClassOf(name, 'Object')) {
+      // 1 argument (options)
+      options = name;
+    } else {
+      // 2 arguments (name [, options])
+      me.name = name;
+    }
+    setOptions(me, options);
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Note: Some array methods have been implemented in plain JavaScript to avoid
+   * bugs in IE, Opera, Rhino, and Mobile Safari.
+   *
+   * IE compatibility mode and IE < 9 have buggy Array `shift()` and `splice()`
+   * functions that fail to remove the last element, `object[0]`, of
+   * array-like-objects even though the `length` property is set to `0`.
+   * The `shift()` method is buggy in IE 8 compatibility mode, while `splice()`
+   * is buggy regardless of mode in IE < 9 and buggy in compatibility mode in IE 9.
+   *
+   * In Opera < 9.50 and some older/beta Mobile Safari versions using `unshift()`
+   * generically to augment the `arguments` object will pave the value at index 0
+   * without incrimenting the other values's indexes.
+   * https://github.com/documentcloud/underscore/issues/9
+   *
+   * Rhino and environments it powers, like Narwhal and RingoJS, may have
+   * buggy Array `concat()`, `reverse()`, `shift()`, `slice()`, `splice()` and
+   * `unshift()` functions that make sparse arrays non-sparse by assigning the
+   * undefined indexes a value of undefined.
+   * https://github.com/mozilla/rhino/commit/702abfed3f8ca043b2636efd31c14ba7552603dd
+   */
+
+  /**
+   * Creates an array containing the elements of the host array followed by the
+   * elements of each argument in order.
+   *
+   * @memberOf Benchmark.Suite
+   * @returns {Array} The new array.
+   */
+  function concat() {
+    var value,
+        j = -1,
+        length = arguments.length,
+        result = slice.call(this),
+        index = result.length;
+
+    while (++j < length) {
+      value = arguments[j];
+      if (isClassOf(value, 'Array')) {
+        for (var k = 0, l = value.length; k < l; k++, index++) {
+          if (k in value) {
+            result[index] = value[k];
+          }
+        }
+      } else {
+        result[index++] = value;
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Utility function used by `shift()`, `splice()`, and `unshift()`.
+   *
+   * @private
+   * @param {Number} start The index to start inserting elements.
+   * @param {Number} deleteCount The number of elements to delete from the insert point.
+   * @param {Array} elements The elements to insert.
+   * @returns {Array} An array of deleted elements.
+   */
+  function insert(start, deleteCount, elements) {
+    // `result` should have its length set to the `deleteCount`
+    // see https://bugs.ecmascript.org/show_bug.cgi?id=332
+    var deleteEnd = start + deleteCount,
+        elementCount = elements ? elements.length : 0,
+        index = start - 1,
+        length = start + elementCount,
+        object = this,
+        result = Array(deleteCount),
+        tail = slice.call(object, deleteEnd);
+
+    // delete elements from the array
+    while (++index < deleteEnd) {
+      if (index in object) {
+        result[index - start] = object[index];
+        delete object[index];
+      }
+    }
+    // insert elements
+    index = start - 1;
+    while (++index < length) {
+      object[index] = elements[index - start];
+    }
+    // append tail elements
+    start = index--;
+    length = max(0, (object.length >>> 0) - deleteCount + elementCount);
+    while (++index < length) {
+      if ((index - start) in tail) {
+        object[index] = tail[index - start];
+      } else if (index in object) {
+        delete object[index];
+      }
+    }
+    // delete excess elements
+    deleteCount = deleteCount > elementCount ? deleteCount - elementCount : 0;
+    while (deleteCount--) {
+      index = length + deleteCount;
+      if (index in object) {
+        delete object[index];
+      }
+    }
+    object.length = length;
+    return result;
+  }
+
+  /**
+   * Rearrange the host array's elements in reverse order.
+   *
+   * @memberOf Benchmark.Suite
+   * @returns {Array} The reversed array.
+   */
+  function reverse() {
+    var upperIndex,
+        value,
+        index = -1,
+        object = Object(this),
+        length = object.length >>> 0,
+        middle = floor(length / 2);
+
+    if (length > 1) {
+      while (++index < middle) {
+        upperIndex = length - index - 1;
+        value = upperIndex in object ? object[upperIndex] : uid;
+        if (index in object) {
+          object[upperIndex] = object[index];
+        } else {
+          delete object[upperIndex];
+        }
+        if (value != uid) {
+          object[index] = value;
+        } else {
+          delete object[index];
+        }
+      }
+    }
+    return object;
+  }
+
+  /**
+   * Removes the first element of the host array and returns it.
+   *
+   * @memberOf Benchmark.Suite
+   * @returns {Mixed} The first element of the array.
+   */
+  function shift() {
+    return insert.call(this, 0, 1)[0];
+  }
+
+  /**
+   * Creates an array of the host array's elements from the start index up to,
+   * but not including, the end index.
+   *
+   * @memberOf Benchmark.Suite
+   * @param {Number} start The starting index.
+   * @param {Number} end The end index.
+   * @returns {Array} The new array.
+   */
+  function slice(start, end) {
+    var index = -1,
+        object = Object(this),
+        length = object.length >>> 0,
+        result = [];
+
+    start = toInteger(start);
+    start = start < 0 ? max(length + start, 0) : min(start, length);
+    start--;
+    end = end == null ? length : toInteger(end);
+    end = end < 0 ? max(length + end, 0) : min(end, length);
+
+    while ((++index, ++start) < end) {
+      if (start in object) {
+        result[index] = object[start];
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Allows removing a range of elements and/or inserting elements into the
+   * host array.
+   *
+   * @memberOf Benchmark.Suite
+   * @param {Number} start The start index.
+   * @param {Number} deleteCount The number of elements to delete.
+   * @param {Mixed} [val1, val2, ...] values to insert at the `start` index.
+   * @returns {Array} An array of removed elements.
+   */
+  function splice(start, deleteCount) {
+    var object = Object(this),
+        length = object.length >>> 0;
+
+    start = toInteger(start);
+    start = start < 0 ? max(length + start, 0) : min(start, length);
+
+    // support the de-facto SpiderMonkey extension
+    // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/splice#Parameters
+    // https://bugs.ecmascript.org/show_bug.cgi?id=429
+    deleteCount = arguments.length == 1
+      ? length - start
+      : min(max(toInteger(deleteCount), 0), length - start);
+
+    return insert.call(object, start, deleteCount, slice.call(arguments, 2));
+  }
+
+  /**
+   * Converts the specified `value` to an integer.
+   *
+   * @private
+   * @param {Mixed} value The value to convert.
+   * @returns {Number} The resulting integer.
+   */
+  function toInteger(value) {
+    value = +value;
+    return value === 0 || !isFinite(value) ? value || 0 : value - (value % 1);
+  }
+
+  /**
+   * Appends arguments to the host array.
+   *
+   * @memberOf Benchmark.Suite
+   * @returns {Number} The new length.
+   */
+  function unshift() {
+    var object = Object(this);
+    insert.call(object, 0, 0, arguments);
+    return object.length;
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * A generic `Function#bind` like method.
+   *
+   * @private
+   * @param {Function} fn The function to be bound to `thisArg`.
+   * @param {Mixed} thisArg The `this` binding for the given function.
+   * @returns {Function} The bound function.
+   */
+  function bind(fn, thisArg) {
+    return function() { fn.apply(thisArg, arguments); };
+  }
+
+  /**
+   * Creates a function from the given arguments string and body.
+   *
+   * @private
+   * @param {String} args The comma separated function arguments.
+   * @param {String} body The function body.
+   * @returns {Function} The new function.
+   */
+  function createFunction() {
+    // lazy define
+    createFunction = function(args, body) {
+      var result,
+          anchor = freeDefine ? define.amd : Benchmark,
+          prop = uid + 'createFunction';
+
+      runScript((freeDefine ? 'define.amd.' : 'Benchmark.') + prop + '=function(' + args + '){' + body + '}');
+      result = anchor[prop];
+      delete anchor[prop];
+      return result;
+    };
+    // fix JaegerMonkey bug
+    // http://bugzil.la/639720
+    createFunction = support.browser && (createFunction('', 'return"' + uid + '"') || noop)() == uid ? createFunction : Function;
+    return createFunction.apply(null, arguments);
+  }
+
+  /**
+   * Delay the execution of a function based on the benchmark's `delay` property.
+   *
+   * @private
+   * @param {Object} bench The benchmark instance.
+   * @param {Object} fn The function to execute.
+   */
+  function delay(bench, fn) {
+    bench._timerId = setTimeout(fn, bench.delay * 1e3);
+  }
+
+  /**
+   * Destroys the given element.
+   *
+   * @private
+   * @param {Element} element The element to destroy.
+   */
+  function destroyElement(element) {
+    trash.appendChild(element);
+    trash.innerHTML = '';
+  }
+
+  /**
+   * Iterates over an object's properties, executing the `callback` for each.
+   * Callbacks may terminate the loop by explicitly returning `false`.
+   *
+   * @private
+   * @param {Object} object The object to iterate over.
+   * @param {Function} callback The function executed per own property.
+   * @param {Object} options The options object.
+   * @returns {Object} Returns the object iterated over.
+   */
+  function forProps() {
+    var forShadowed,
+        skipSeen,
+        forArgs = true,
+        shadowed = ['constructor', 'hasOwnProperty', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'valueOf'];
+
+    (function(enumFlag, key) {
+      // must use a non-native constructor to catch the Safari 2 issue
+      function Klass() { this.valueOf = 0; };
+      Klass.prototype.valueOf = 0;
+      // check various for-in bugs
+      for (key in new Klass) {
+        enumFlag += key == 'valueOf' ? 1 : 0;
+      }
+      // check if `arguments` objects have non-enumerable indexes
+      for (key in arguments) {
+        key == '0' && (forArgs = false);
+      }
+      // Safari 2 iterates over shadowed properties twice
+      // http://replay.waybackmachine.org/20090428222941/http://tobielangel.com/2007/1/29/for-in-loop-broken-in-safari/
+      skipSeen = enumFlag == 2;
+      // IE < 9 incorrectly makes an object's properties non-enumerable if they have
+      // the same name as other non-enumerable properties in its prototype chain.
+      forShadowed = !enumFlag;
+    }(0));
+
+    // lazy define
+    forProps = function(object, callback, options) {
+      options || (options = {});
+
+      var result = object;
+      object = Object(object);
+
+      var ctor,
+          key,
+          keys,
+          skipCtor,
+          done = !result,
+          which = options.which,
+          allFlag = which == 'all',
+          index = -1,
+          iteratee = object,
+          length = object.length,
+          ownFlag = allFlag || which == 'own',
+          seen = {},
+          skipProto = isClassOf(object, 'Function'),
+          thisArg = options.bind;
+
+      if (thisArg !== undefined) {
+        callback = bind(callback, thisArg);
+      }
+      // iterate all properties
+      if (allFlag && support.getAllKeys) {
+        for (index = 0, keys = getAllKeys(object), length = keys.length; index < length; index++) {
+          key = keys[index];
+          if (callback(object[key], key, object) === false) {
+            break;
+          }
+        }
+      }
+      // else iterate only enumerable properties
+      else {
+        for (key in object) {
+          // Firefox < 3.6, Opera > 9.50 - Opera < 11.60, and Safari < 5.1
+          // (if the prototype or a property on the prototype has been set)
+          // incorrectly set a function's `prototype` property [[Enumerable]] value
+          // to `true`. Because of this we standardize on skipping the `prototype`
+          // property of functions regardless of their [[Enumerable]] value.
+          if ((done =
+              !(skipProto && key == 'prototype') &&
+              !(skipSeen && (hasKey(seen, key) || !(seen[key] = true))) &&
+              (!ownFlag || ownFlag && hasKey(object, key)) &&
+              callback(object[key], key, object) === false)) {
+            break;
+          }
+        }
+        // in IE < 9 strings don't support accessing characters by index
+        if (!done && (forArgs && isArguments(object) ||
+            ((noCharByIndex || noCharByOwnIndex) && isClassOf(object, 'String') &&
+              (iteratee = noCharByIndex ? object.split('') : object)))) {
+          while (++index < length) {
+            if ((done =
+                callback(iteratee[index], String(index), object) === false)) {
+              break;
+            }
+          }
+        }
+        if (!done && forShadowed) {
+          // Because IE < 9 can't set the `[[Enumerable]]` attribute of an existing
+          // property and the `constructor` property of a prototype defaults to
+          // non-enumerable, we manually skip the `constructor` property when we
+          // think we are iterating over a `prototype` object.
+          ctor = object.constructor;
+          skipCtor = ctor && ctor.prototype && ctor.prototype.constructor === ctor;
+          for (index = 0; index < 7; index++) {
+            key = shadowed[index];
+            if (!(skipCtor && key == 'constructor') &&
+                hasKey(object, key) &&
+                callback(object[key], key, object) === false) {
+              break;
+            }
+          }
+        }
+      }
+      return result;
+    };
+    return forProps.apply(null, arguments);
+  }
+
+  /**
+   * Gets the name of the first argument from a function's source.
+   *
+   * @private
+   * @param {Function} fn The function.
+   * @returns {String} The argument name.
+   */
+  function getFirstArgument(fn) {
+    return (!hasKey(fn, 'toString') &&
+      (/^[\s(]*function[^(]*\(([^\s,)]+)/.exec(fn) || 0)[1]) || '';
+  }
+
+  /**
+   * Computes the arithmetic mean of a sample.
+   *
+   * @private
+   * @param {Array} sample The sample.
+   * @returns {Number} The mean.
+   */
+  function getMean(sample) {
+    return reduce(sample, function(sum, x) {
+      return sum + x;
+    }) / sample.length || 0;
+  }
+
+  /**
+   * Gets the source code of a function.
+   *
+   * @private
+   * @param {Function} fn The function.
+   * @param {String} altSource A string used when a function's source code is unretrievable.
+   * @returns {String} The function's source code.
+   */
+  function getSource(fn, altSource) {
+    var result = altSource;
+    if (isStringable(fn)) {
+      result = String(fn);
+    } else if (support.decompilation) {
+      // escape the `{` for Firefox 1
+      result = (/^[^{]+\{([\s\S]*)}\s*$/.exec(fn) || 0)[1];
+    }
+    // trim string
+    result = (result || '').replace(/^\s+|\s+$/g, '');
+
+    // detect strings containing only the "use strict" directive
+    return /^(?:\/\*+[\w|\W]*?\*\/|\/\/.*?[\n\r\u2028\u2029]|\s)*(["'])use strict\1;?$/.test(result)
+      ? ''
+      : result;
+  }
+
+  /**
+   * Checks if a value is an `arguments` object.
+   *
+   * @private
+   * @param {Mixed} value The value to check.
+   * @returns {Boolean} Returns `true` if the value is an `arguments` object, else `false`.
+   */
+  function isArguments() {
+    // lazy define
+    isArguments = function(value) {
+      return toString.call(value) == '[object Arguments]';
+    };
+    if (noArgumentsClass) {
+      isArguments = function(value) {
+        return hasKey(value, 'callee') &&
+          !(propertyIsEnumerable && propertyIsEnumerable.call(value, 'callee'));
+      };
+    }
+    return isArguments(arguments[0]);
+  }
+
+  /**
+   * Checks if an object is of the specified class.
+   *
+   * @private
+   * @param {Mixed} value The value to check.
+   * @param {String} name The name of the class.
+   * @returns {Boolean} Returns `true` if the value is of the specified class, else `false`.
+   */
+  function isClassOf(value, name) {
+    return value != null && toString.call(value) == '[object ' + name + ']';
+  }
+
+  /**
+   * Host objects can return type values that are different from their actual
+   * data type. The objects we are concerned with usually return non-primitive
+   * types of object, function, or unknown.
+   *
+   * @private
+   * @param {Mixed} object The owner of the property.
+   * @param {String} property The property to check.
+   * @returns {Boolean} Returns `true` if the property value is a non-primitive, else `false`.
+   */
+  function isHostType(object, property) {
+    var type = object != null ? typeof object[property] : 'number';
+    return !/^(?:boolean|number|string|undefined)$/.test(type) &&
+      (type == 'object' ? !!object[property] : true);
+  }
+
+  /**
+   * Checks if a given `value` is an object created by the `Object` constructor
+   * assuming objects created by the `Object` constructor have no inherited
+   * enumerable properties and that there are no `Object.prototype` extensions.
+   *
+   * @private
+   * @param {Mixed} value The value to check.
+   * @returns {Boolean} Returns `true` if the `value` is a plain `Object` object, else `false`.
+   */
+  function isPlainObject(value) {
+    // avoid non-objects and false positives for `arguments` objects in IE < 9
+    var result = false;
+    if (!(value && typeof value == 'object') || (noArgumentsClass && isArguments(value))) {
+      return result;
+    }
+    // IE < 9 presents DOM nodes as `Object` objects except they have `toString`
+    // methods that are `typeof` "string" and still can coerce nodes to strings.
+    // Also check that the constructor is `Object` (i.e. `Object instanceof Object`)
+    var ctor = value.constructor;
+    if ((support.nodeClass || !(typeof value.toString != 'function' && typeof (value + '') == 'string')) &&
+        (!isClassOf(ctor, 'Function') || ctor instanceof ctor)) {
+      // In most environments an object's own properties are iterated before
+      // its inherited properties. If the last iterated property is an object's
+      // own property then there are no inherited enumerable properties.
+      if (support.iteratesOwnFirst) {
+        forProps(value, function(subValue, subKey) {
+          result = subKey;
+        });
+        return result === false || hasKey(value, result);
+      }
+      // IE < 9 iterates inherited properties before own properties. If the first
+      // iterated property is an object's own property then there are no inherited
+      // enumerable properties.
+      forProps(value, function(subValue, subKey) {
+        result = !hasKey(value, subKey);
+        return false;
+      });
+      return result === false;
+    }
+    return result;
+  }
+
+  /**
+   * Checks if a value can be safely coerced to a string.
+   *
+   * @private
+   * @param {Mixed} value The value to check.
+   * @returns {Boolean} Returns `true` if the value can be coerced, else `false`.
+   */
+  function isStringable(value) {
+    return hasKey(value, 'toString') || isClassOf(value, 'String');
+  }
+
+  /**
+   * Wraps a function and passes `this` to the original function as the
+   * first argument.
+   *
+   * @private
+   * @param {Function} fn The function to be wrapped.
+   * @returns {Function} The new function.
+   */
+  function methodize(fn) {
+    return function() {
+      var args = [this];
+      args.push.apply(args, arguments);
+      return fn.apply(null, args);
+    };
+  }
+
+  /**
+   * A no-operation function.
+   *
+   * @private
+   */
+  function noop() {
+    // no operation performed
+  }
+
+  /**
+   * A wrapper around require() to suppress `module missing` errors.
+   *
+   * @private
+   * @param {String} id The module id.
+   * @returns {Mixed} The exported module or `null`.
+   */
+  function req(id) {
+    try {
+      var result = freeExports && freeRequire(id);
+    } catch(e) { }
+    return result || null;
+  }
+
+  /**
+   * Runs a snippet of JavaScript via script injection.
+   *
+   * @private
+   * @param {String} code The code to run.
+   */
+  function runScript(code) {
+    var anchor = freeDefine ? define.amd : Benchmark,
+        script = doc.createElement('script'),
+        sibling = doc.getElementsByTagName('script')[0],
+        parent = sibling.parentNode,
+        prop = uid + 'runScript',
+        prefix = '(' + (freeDefine ? 'define.amd.' : 'Benchmark.') + prop + '||function(){})();';
+
+    // Firefox 2.0.0.2 cannot use script injection as intended because it executes
+    // asynchronously, but that's OK because script injection is only used to avoid
+    // the previously commented JaegerMonkey bug.
+    try {
+      // remove the inserted script *before* running the code to avoid differences
+      // in the expected script element count/order of the document.
+      script.appendChild(doc.createTextNode(prefix + code));
+      anchor[prop] = function() { destroyElement(script); };
+    } catch(e) {
+      parent = parent.cloneNode(false);
+      sibling = null;
+      script.text = code;
+    }
+    parent.insertBefore(script, sibling);
+    delete anchor[prop];
+  }
+
+  /**
+   * A helper function for setting options/event handlers.
+   *
+   * @private
+   * @param {Object} bench The benchmark instance.
+   * @param {Object} [options={}] Options object.
+   */
+  function setOptions(bench, options) {
+    options = extend({}, bench.constructor.options, options);
+    bench.options = forOwn(options, function(value, key) {
+      if (value != null) {
+        // add event listeners
+        if (/^on[A-Z]/.test(key)) {
+          forEach(key.split(' '), function(key) {
+            bench.on(key.slice(2).toLowerCase(), value);
+          });
+        } else if (!hasKey(bench, key)) {
+          bench[key] = deepClone(value);
+        }
+      }
+    });
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Handles cycling/completing the deferred benchmark.
+   *
+   * @memberOf Benchmark.Deferred
+   */
+  function resolve() {
+    var me = this,
+        clone = me.benchmark,
+        bench = clone._original;
+
+    if (bench.aborted) {
+      // cycle() -> clone cycle/complete event -> compute()'s invoked bench.run() cycle/complete
+      me.teardown();
+      clone.running = false;
+      cycle(me);
+    }
+    else if (++me.cycles < clone.count) {
+      // continue the test loop
+      if (support.timeout) {
+        // use setTimeout to avoid a call stack overflow if called recursively
+        setTimeout(function() { clone.compiled.call(me, timer); }, 0);
+      } else {
+        clone.compiled.call(me, timer);
+      }
+    }
+    else {
+      timer.stop(me);
+      me.teardown();
+      delay(clone, function() { cycle(me); });
+    }
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * A deep clone utility.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Mixed} value The value to clone.
+   * @returns {Mixed} The cloned value.
+   */
+  function deepClone(value) {
+    var accessor,
+        circular,
+        clone,
+        ctor,
+        descriptor,
+        extensible,
+        key,
+        length,
+        markerKey,
+        parent,
+        result,
+        source,
+        subIndex,
+        data = { 'value': value },
+        index = 0,
+        marked = [],
+        queue = { 'length': 0 },
+        unmarked = [];
+
+    /**
+     * An easily detectable decorator for cloned values.
+     */
+    function Marker(object) {
+      this.raw = object;
+    }
+
+    /**
+     * The callback used by `forProps()`.
+     */
+    function forPropsCallback(subValue, subKey) {
+      // exit early to avoid cloning the marker
+      if (subValue && subValue.constructor == Marker) {
+        return;
+      }
+      // add objects to the queue
+      if (subValue === Object(subValue)) {
+        queue[queue.length++] = { 'key': subKey, 'parent': clone, 'source': value };
+      }
+      // assign non-objects
+      else {
+        try {
+          // will throw an error in strict mode if the property is read-only
+          clone[subKey] = subValue;
+        } catch(e) { }
+      }
+    }
+
+    /**
+     * Gets an available marker key for the given object.
+     */
+    function getMarkerKey(object) {
+      // avoid collisions with existing keys
+      var result = uid;
+      while (object[result] && object[result].constructor != Marker) {
+        result += 1;
+      }
+      return result;
+    }
+
+    do {
+      key = data.key;
+      parent = data.parent;
+      source = data.source;
+      clone = value = source ? source[key] : data.value;
+      accessor = circular = descriptor = false;
+
+      // create a basic clone to filter out functions, DOM elements, and
+      // other non `Object` objects
+      if (value === Object(value)) {
+        // use custom deep clone function if available
+        if (isClassOf(value.deepClone, 'Function')) {
+          clone = value.deepClone();
+        } else {
+          ctor = value.constructor;
+          switch (toString.call(value)) {
+            case '[object Array]':
+              clone = new ctor(value.length);
+              break;
+
+            case '[object Boolean]':
+              clone = new ctor(value == true);
+              break;
+
+            case '[object Date]':
+              clone = new ctor(+value);
+              break;
+
+            case '[object Object]':
+              isPlainObject(value) && (clone = {});
+              break;
+
+            case '[object Number]':
+            case '[object String]':
+              clone = new ctor(value);
+              break;
+
+            case '[object RegExp]':
+              clone = ctor(value.source,
+                (value.global     ? 'g' : '') +
+                (value.ignoreCase ? 'i' : '') +
+                (value.multiline  ? 'm' : ''));
+          }
+        }
+        // continue clone if `value` doesn't have an accessor descriptor
+        // http://es5.github.com/#x8.10.1
+        if (clone && clone != value &&
+            !(descriptor = source && support.descriptors && getDescriptor(source, key),
+              accessor = descriptor && (descriptor.get || descriptor.set))) {
+          // use an existing clone (circular reference)
+          if ((extensible = isExtensible(value))) {
+            markerKey = getMarkerKey(value);
+            if (value[markerKey]) {
+              circular = clone = value[markerKey].raw;
+            }
+          } else {
+            // for frozen/sealed objects
+            for (subIndex = 0, length = unmarked.length; subIndex < length; subIndex++) {
+              data = unmarked[subIndex];
+              if (data.object === value) {
+                circular = clone = data.clone;
+                break;
+              }
+            }
+          }
+          if (!circular) {
+            // mark object to allow quickly detecting circular references and tie it to its clone
+            if (extensible) {
+              value[markerKey] = new Marker(clone);
+              marked.push({ 'key': markerKey, 'object': value });
+            } else {
+              // for frozen/sealed objects
+              unmarked.push({ 'clone': clone, 'object': value });
+            }
+            // iterate over object properties
+            forProps(value, forPropsCallback, { 'which': 'all' });
+          }
+        }
+      }
+      if (parent) {
+        // for custom property descriptors
+        if (accessor || (descriptor && !(descriptor.configurable && descriptor.enumerable && descriptor.writable))) {
+          if ('value' in descriptor) {
+            descriptor.value = clone;
+          }
+          setDescriptor(parent, key, descriptor);
+        }
+        // for default property descriptors
+        else {
+          parent[key] = clone;
+        }
+      } else {
+        result = clone;
+      }
+    } while ((data = queue[index++]));
+
+    // remove markers
+    for (index = 0, length = marked.length; index < length; index++) {
+      data = marked[index];
+      delete data.object[data.key];
+    }
+    return result;
+  }
+
+  /**
+   * An iteration utility for arrays and objects.
+   * Callbacks may terminate the loop by explicitly returning `false`.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array|Object} object The object to iterate over.
+   * @param {Function} callback The function called per iteration.
+   * @param {Mixed} thisArg The `this` binding for the callback.
+   * @returns {Array|Object} Returns the object iterated over.
+   */
+  function each(object, callback, thisArg) {
+    var result = object;
+    object = Object(object);
+
+    var fn = callback,
+        index = -1,
+        length = object.length,
+        isSnapshot = !!(object.snapshotItem && (length = object.snapshotLength)),
+        isSplittable = (noCharByIndex || noCharByOwnIndex) && isClassOf(object, 'String'),
+        isConvertable = isSnapshot || isSplittable || 'item' in object,
+        origObject = object;
+
+    // in Opera < 10.5 `hasKey(object, 'length')` returns `false` for NodeLists
+    if (length === length >>> 0) {
+      if (isConvertable) {
+        // the third argument of the callback is the original non-array object
+        callback = function(value, index) {
+          return fn.call(this, value, index, origObject);
+        };
+        // in IE < 9 strings don't support accessing characters by index
+        if (isSplittable) {
+          object = object.split('');
+        } else {
+          object = [];
+          while (++index < length) {
+            // in Safari 2 `index in object` is always `false` for NodeLists
+            object[index] = isSnapshot ? result.snapshotItem(index) : result[index];
+          }
+        }
+      }
+      forEach(object, callback, thisArg);
+    } else {
+      forOwn(object, callback, thisArg);
+    }
+    return result;
+  }
+
+  /**
+   * Copies enumerable properties from the source(s) object to the destination object.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Object} destination The destination object.
+   * @param {Object} [source={}] The source object.
+   * @returns {Object} The destination object.
+   */
+  function extend(destination, source) {
+    // Chrome < 14 incorrectly sets `destination` to `undefined` when we `delete arguments[0]`
+    // http://code.google.com/p/v8/issues/detail?id=839
+    var result = destination;
+    delete arguments[0];
+
+    forEach(arguments, function(source) {
+      forProps(source, function(value, key) {
+        result[key] = value;
+      });
+    });
+    return result;
+  }
+
+  /**
+   * A generic `Array#filter` like method.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array} array The array to iterate over.
+   * @param {Function|String} callback The function/alias called per iteration.
+   * @param {Mixed} thisArg The `this` binding for the callback.
+   * @returns {Array} A new array of values that passed callback filter.
+   * @example
+   *
+   * // get odd numbers
+   * Benchmark.filter([1, 2, 3, 4, 5], function(n) {
+   *   return n % 2;
+   * }); // -> [1, 3, 5];
+   *
+   * // get fastest benchmarks
+   * Benchmark.filter(benches, 'fastest');
+   *
+   * // get slowest benchmarks
+   * Benchmark.filter(benches, 'slowest');
+   *
+   * // get benchmarks that completed without erroring
+   * Benchmark.filter(benches, 'successful');
+   */
+  function filter(array, callback, thisArg) {
+    var result;
+
+    if (callback == 'successful') {
+      // callback to exclude those that are errored, unrun, or have hz of Infinity
+      callback = function(bench) { return bench.cycles && isFinite(bench.hz); };
+    }
+    else if (callback == 'fastest' || callback == 'slowest') {
+      // get successful, sort by period + margin of error, and filter fastest/slowest
+      result = filter(array, 'successful').sort(function(a, b) {
+        a = a.stats; b = b.stats;
+        return (a.mean + a.moe > b.mean + b.moe ? 1 : -1) * (callback == 'fastest' ? 1 : -1);
+      });
+      result = filter(result, function(bench) {
+        return result[0].compare(bench) == 0;
+      });
+    }
+    return result || reduce(array, function(result, value, index) {
+      return callback.call(thisArg, value, index, array) ? (result.push(value), result) : result;
+    }, []);
+  }
+
+  /**
+   * A generic `Array#forEach` like method.
+   * Callbacks may terminate the loop by explicitly returning `false`.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array} array The array to iterate over.
+   * @param {Function} callback The function called per iteration.
+   * @param {Mixed} thisArg The `this` binding for the callback.
+   * @returns {Array} Returns the array iterated over.
+   */
+  function forEach(array, callback, thisArg) {
+    var index = -1,
+        length = (array = Object(array)).length >>> 0;
+
+    if (thisArg !== undefined) {
+      callback = bind(callback, thisArg);
+    }
+    while (++index < length) {
+      if (index in array &&
+          callback(array[index], index, array) === false) {
+        break;
+      }
+    }
+    return array;
+  }
+
+  /**
+   * Iterates over an object's own properties, executing the `callback` for each.
+   * Callbacks may terminate the loop by explicitly returning `false`.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Object} object The object to iterate over.
+   * @param {Function} callback The function executed per own property.
+   * @param {Mixed} thisArg The `this` binding for the callback.
+   * @returns {Object} Returns the object iterated over.
+   */
+  function forOwn(object, callback, thisArg) {
+    return forProps(object, callback, { 'bind': thisArg, 'which': 'own' });
+  }
+
+  /**
+   * Converts a number to a more readable comma-separated string representation.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Number} number The number to convert.
+   * @returns {String} The more readable string representation.
+   */
+  function formatNumber(number) {
+    number = String(number).split('.');
+    return number[0].replace(/(?=(?:\d{3})+$)(?!\b)/g, ',') +
+      (number[1] ? '.' + number[1] : '');
+  }
+
+  /**
+   * Checks if an object has the specified key as a direct property.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Object} object The object to check.
+   * @param {String} key The key to check for.
+   * @returns {Boolean} Returns `true` if key is a direct property, else `false`.
+   */
+  function hasKey() {
+    // lazy define for worst case fallback (not as accurate)
+    hasKey = function(object, key) {
+      var parent = object != null && (object.constructor || Object).prototype;
+      return !!parent && key in Object(object) && !(key in parent && object[key] === parent[key]);
+    };
+    // for modern browsers
+    if (isClassOf(hasOwnProperty, 'Function')) {
+      hasKey = function(object, key) {
+        return object != null && hasOwnProperty.call(object, key);
+      };
+    }
+    // for Safari 2
+    else if ({}.__proto__ == Object.prototype) {
+      hasKey = function(object, key) {
+        var result = false;
+        if (object != null) {
+          object = Object(object);
+          object.__proto__ = [object.__proto__, object.__proto__ = null, result = key in object][0];
+        }
+        return result;
+      };
+    }
+    return hasKey.apply(this, arguments);
+  }
+
+  /**
+   * A generic `Array#indexOf` like method.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array} array The array to iterate over.
+   * @param {Mixed} value The value to search for.
+   * @param {Number} [fromIndex=0] The index to start searching from.
+   * @returns {Number} The index of the matched value or `-1`.
+   */
+  function indexOf(array, value, fromIndex) {
+    var index = toInteger(fromIndex),
+        length = (array = Object(array)).length >>> 0;
+
+    index = (index < 0 ? max(0, length + index) : index) - 1;
+    while (++index < length) {
+      if (index in array && value === array[index]) {
+        return index;
+      }
+    }
+    return -1;
+  }
+
+  /**
+   * Modify a string by replacing named tokens with matching object property values.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {String} string The string to modify.
+   * @param {Object} object The template object.
+   * @returns {String} The modified string.
+   */
+  function interpolate(string, object) {
+    forOwn(object, function(value, key) {
+      // escape regexp special characters in `key`
+      string = string.replace(RegExp('#\\{' + key.replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1') + '\\}', 'g'), value);
+    });
+    return string;
+  }
+
+  /**
+   * Invokes a method on all items in an array.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array} benches Array of benchmarks to iterate over.
+   * @param {String|Object} name The name of the method to invoke OR options object.
+   * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the method with.
+   * @returns {Array} A new array of values returned from each method invoked.
+   * @example
+   *
+   * // invoke `reset` on all benchmarks
+   * Benchmark.invoke(benches, 'reset');
+   *
+   * // invoke `emit` with arguments
+   * Benchmark.invoke(benches, 'emit', 'complete', listener);
+   *
+   * // invoke `run(true)`, treat benchmarks as a queue, and register invoke callbacks
+   * Benchmark.invoke(benches, {
+   *
+   *   // invoke the `run` method
+   *   'name': 'run',
+   *
+   *   // pass a single argument
+   *   'args': true,
+   *
+   *   // treat as queue, removing benchmarks from front of `benches` until empty
+   *   'queued': true,
+   *
+   *   // called before any benchmarks have been invoked.
+   *   'onStart': onStart,
+   *
+   *   // called between invoking benchmarks
+   *   'onCycle': onCycle,
+   *
+   *   // called after all benchmarks have been invoked.
+   *   'onComplete': onComplete
+   * });
+   */
+  function invoke(benches, name) {
+    var args,
+        bench,
+        queued,
+        index = -1,
+        eventProps = { 'currentTarget': benches },
+        options = { 'onStart': noop, 'onCycle': noop, 'onComplete': noop },
+        result = map(benches, function(bench) { return bench; });
+
+    /**
+     * Invokes the method of the current object and if synchronous, fetches the next.
+     */
+    function execute() {
+      var listeners,
+          async = isAsync(bench);
+
+      if (async) {
+        // use `getNext` as the first listener
+        bench.on('complete', getNext);
+        listeners = bench.events.complete;
+        listeners.splice(0, 0, listeners.pop());
+      }
+      // execute method
+      result[index] = isClassOf(bench && bench[name], 'Function') ? bench[name].apply(bench, args) : undefined;
+      // if synchronous return true until finished
+      return !async && getNext();
+    }
+
+    /**
+     * Fetches the next bench or executes `onComplete` callback.
+     */
+    function getNext(event) {
+      var cycleEvent,
+          last = bench,
+          async = isAsync(last);
+
+      if (async) {
+        last.off('complete', getNext);
+        last.emit('complete');
+      }
+      // emit "cycle" event
+      eventProps.type = 'cycle';
+      eventProps.target = last;
+      cycleEvent = Event(eventProps);
+      options.onCycle.call(benches, cycleEvent);
+
+      // choose next benchmark if not exiting early
+      if (!cycleEvent.aborted && raiseIndex() !== false) {
+        bench = queued ? benches[0] : result[index];
+        if (isAsync(bench)) {
+          delay(bench, execute);
+        }
+        else if (async) {
+          // resume execution if previously asynchronous but now synchronous
+          while (execute()) { }
+        }
+        else {
+          // continue synchronous execution
+          return true;
+        }
+      } else {
+        // emit "complete" event
+        eventProps.type = 'complete';
+        options.onComplete.call(benches, Event(eventProps));
+      }
+      // When used as a listener `event.aborted = true` will cancel the rest of
+      // the "complete" listeners because they were already called above and when
+      // used as part of `getNext` the `return false` will exit the execution while-loop.
+      if (event) {
+        event.aborted = true;
+      } else {
+        return false;
+      }
+    }
+
+    /**
+     * Checks if invoking `Benchmark#run` with asynchronous cycles.
+     */
+    function isAsync(object) {
+      // avoid using `instanceof` here because of IE memory leak issues with host objects
+      var async = args[0] && args[0].async;
+      return Object(object).constructor == Benchmark && name == 'run' &&
+        ((async == null ? object.options.async : async) && support.timeout || object.defer);
+    }
+
+    /**
+     * Raises `index` to the next defined index or returns `false`.
+     */
+    function raiseIndex() {
+      var length = result.length;
+      if (queued) {
+        // if queued remove the previous bench and subsequent skipped non-entries
+        do {
+          ++index > 0 && shift.call(benches);
+        } while ((length = benches.length) && !('0' in benches));
+      }
+      else {
+        while (++index < length && !(index in result)) { }
+      }
+      // if we reached the last index then return `false`
+      return (queued ? length : index < length) ? index : (index = false);
+    }
+
+    // juggle arguments
+    if (isClassOf(name, 'String')) {
+      // 2 arguments (array, name)
+      args = slice.call(arguments, 2);
+    } else {
+      // 2 arguments (array, options)
+      options = extend(options, name);
+      name = options.name;
+      args = isClassOf(args = 'args' in options ? options.args : [], 'Array') ? args : [args];
+      queued = options.queued;
+    }
+
+    // start iterating over the array
+    if (raiseIndex() !== false) {
+      // emit "start" event
+      bench = result[index];
+      eventProps.type = 'start';
+      eventProps.target = bench;
+      options.onStart.call(benches, Event(eventProps));
+
+      // end early if the suite was aborted in an "onStart" listener
+      if (benches.aborted && benches.constructor == Suite && name == 'run') {
+        // emit "cycle" event
+        eventProps.type = 'cycle';
+        options.onCycle.call(benches, Event(eventProps));
+        // emit "complete" event
+        eventProps.type = 'complete';
+        options.onComplete.call(benches, Event(eventProps));
+      }
+      // else start
+      else {
+        if (isAsync(bench)) {
+          delay(bench, execute);
+        } else {
+          while (execute()) { }
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
+   * Creates a string of joined array values or object key-value pairs.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array|Object} object The object to operate on.
+   * @param {String} [separator1=','] The separator used between key-value pairs.
+   * @param {String} [separator2=': '] The separator used between keys and values.
+   * @returns {String} The joined result.
+   */
+  function join(object, separator1, separator2) {
+    var result = [],
+        length = (object = Object(object)).length,
+        arrayLike = length === length >>> 0;
+
+    separator2 || (separator2 = ': ');
+    each(object, function(value, key) {
+      result.push(arrayLike ? value : key + separator2 + value);
+    });
+    return result.join(separator1 || ',');
+  }
+
+  /**
+   * A generic `Array#map` like method.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array} array The array to iterate over.
+   * @param {Function} callback The function called per iteration.
+   * @param {Mixed} thisArg The `this` binding for the callback.
+   * @returns {Array} A new array of values returned by the callback.
+   */
+  function map(array, callback, thisArg) {
+    return reduce(array, function(result, value, index) {
+      result[index] = callback.call(thisArg, value, index, array);
+      return result;
+    }, Array(Object(array).length >>> 0));
+  }
+
+  /**
+   * Retrieves the value of a specified property from all items in an array.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array} array The array to iterate over.
+   * @param {String} property The property to pluck.
+   * @returns {Array} A new array of property values.
+   */
+  function pluck(array, property) {
+    return map(array, function(object) {
+      return object == null ? undefined : object[property];
+    });
+  }
+
+  /**
+   * A generic `Array#reduce` like method.
+   *
+   * @static
+   * @memberOf Benchmark
+   * @param {Array} array The array to iterate over.
+   * @param {Function} callback The function called per iteration.
+   * @param {Mixed} accumulator Initial value of the accumulator.
+   * @returns {Mixed} The accumulator.
+   */
+  function reduce(array, callback, accumulator) {
+    var noaccum = arguments.length < 3;
+    forEach(array, function(value, index) {
+      accumulator = noaccum ? (noaccum = false, value) : callback(accumulator, value, index, array);
+    });
+    return accumulator;
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Aborts all benchmarks in the suite.
+   *
+   * @name abort
+   * @memberOf Benchmark.Suite
+   * @returns {Object} The suite instance.
+   */
+  function abortSuite() {
+    var event,
+        me = this,
+        resetting = calledBy.resetSuite;
+
+    if (me.running) {
+      event = Event('abort');
+      me.emit(event);
+      if (!event.cancelled || resetting) {
+        // avoid infinite recursion
+        calledBy.abortSuite = true;
+        me.reset();
+        delete calledBy.abortSuite;
+
+        if (!resetting) {
+          me.aborted = true;
+          invoke(me, 'abort');
+        }
+      }
+    }
+    return me;
+  }
+
+  /**
+   * Adds a test to the benchmark suite.
+   *
+   * @memberOf Benchmark.Suite
+   * @param {String} name A name to identify the benchmark.
+   * @param {Function|String} fn The test to benchmark.
+   * @param {Object} [options={}] Options object.
+   * @returns {Object} The benchmark instance.
+   * @example
+   *
+   * // basic usage
+   * suite.add(fn);
+   *
+   * // or using a name first
+   * suite.add('foo', fn);
+   *
+   * // or with options
+   * suite.add('foo', fn, {
+   *   'onCycle': onCycle,
+   *   'onComplete': onComplete
+   * });
+   *
+   * // or name and options
+   * suite.add('foo', {
+   *   'fn': fn,
+   *   'onCycle': onCycle,
+   *   'onComplete': onComplete
+   * });
+   *
+   * // or options only
+   * suite.add({
+   *   'name': 'foo',
+   *   'fn': fn,
+   *   'onCycle': onCycle,
+   *   'onComplete': onComplete
+   * });
+   */
+  function add(name, fn, options) {
+    var me = this,
+        bench = Benchmark(name, fn, options),
+        event = Event({ 'type': 'add', 'target': bench });
+
+    if (me.emit(event), !event.cancelled) {
+      me.push(bench);
+    }
+    return me;
+  }
+
+  /**
+   * Creates a new suite with cloned benchmarks.
+   *
+   * @name clone
+   * @memberOf Benchmark.Suite
+   * @param {Object} options Options object to overwrite cloned options.
+   * @returns {Object} The new suite instance.
+   */
+  function cloneSuite(options) {
+    var me = this,
+        result = new me.constructor(extend({}, me.options, options));
+
+    // copy own properties
+    forOwn(me, function(value, key) {
+      if (!hasKey(result, key)) {
+        result[key] = value && isClassOf(value.clone, 'Function')
+          ? value.clone()
+          : deepClone(value);
+      }
+    });
+    return result;
+  }
+
+  /**
+   * An `Array#filter` like method.
+   *
+   * @name filter
+   * @memberOf Benchmark.Suite
+   * @param {Function|String} callback The function/alias called per iteration.
+   * @returns {Object} A new suite of benchmarks that passed callback filter.
+   */
+  function filterSuite(callback) {
+    var me = this,
+        result = new me.constructor;
+
+    result.push.apply(result, filter(me, callback));
+    return result;
+  }
+
+  /**
+   * Resets all benchmarks in the suite.
+   *
+   * @name reset
+   * @memberOf Benchmark.Suite
+   * @returns {Object} The suite instance.
+   */
+  function resetSuite() {
+    var event,
+        me = this,
+        aborting = calledBy.abortSuite;
+
+    if (me.running && !aborting) {
+      // no worries, `resetSuite()` is called within `abortSuite()`
+      calledBy.resetSuite = true;
+      me.abort();
+      delete calledBy.resetSuite;
+    }
+    // reset if the state has changed
+    else if ((me.aborted || me.running) &&
+        (me.emit(event = Event('reset')), !event.cancelled)) {
+      me.running = false;
+      if (!aborting) {
+        invoke(me, 'reset');
+      }
+    }
+    return me;
+  }
+
+  /**
+   * Runs the suite.
+   *
+   * @name run
+   * @memberOf Benchmark.Suite
+   * @param {Object} [options={}] Options object.
+   * @returns {Object} The suite instance.
+   * @example
+   *
+   * // basic usage
+   * suite.run();
+   *
+   * // or with options
+   * suite.run({ 'async': true, 'queued': true });
+   */
+  function runSuite(options) {
+    var me = this;
+
+    me.reset();
+    me.running = true;
+    options || (options = {});
+
+    invoke(me, {
+      'name': 'run',
+      'args': options,
+      'queued': options.queued,
+      'onStart': function(event) {
+        me.emit(event);
+      },
+      'onCycle': function(event) {
+        var bench = event.target;
+        if (bench.error) {
+          me.emit({ 'type': 'error', 'target': bench });
+        }
+        me.emit(event);
+        event.aborted = me.aborted;
+      },
+      'onComplete': function(event) {
+        me.running = false;
+        me.emit(event);
+      }
+    });
+    return me;
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Executes all registered listeners of the specified event type.
+   *
+   * @memberOf Benchmark, Benchmark.Suite
+   * @param {String|Object} type The event type or object.
+   * @returns {Mixed} Returns the return value of the last listener executed.
+   */
+  function emit(type) {
+    var listeners,
+        me = this,
+        event = Event(type),
+        events = me.events,
+        args = (arguments[0] = event, arguments);
+
+    event.currentTarget || (event.currentTarget = me);
+    event.target || (event.target = me);
+    delete event.result;
+
+    if (events && (listeners = hasKey(events, event.type) && events[event.type])) {
+      forEach(listeners.slice(), function(listener) {
+        if ((event.result = listener.apply(me, args)) === false) {
+          event.cancelled = true;
+        }
+        return !event.aborted;
+      });
+    }
+    return event.result;
+  }
+
+  /**
+   * Returns an array of event listeners for a given type that can be manipulated
+   * to add or remove listeners.
+   *
+   * @memberOf Benchmark, Benchmark.Suite
+   * @param {String} type The event type.
+   * @returns {Array} The listeners array.
+   */
+  function listeners(type) {
+    var me = this,
+        events = me.events || (me.events = {});
+
+    return hasKey(events, type) ? events[type] : (events[type] = []);
+  }
+
+  /**
+   * Unregisters a listener for the specified event type(s),
+   * or unregisters all listeners for the specified event type(s),
+   * or unregisters all listeners for all event types.
+   *
+   * @memberOf Benchmark, Benchmark.Suite
+   * @param {String} [type] The event type.
+   * @param {Function} [listener] The function to unregister.
+   * @returns {Object} The benchmark instance.
+   * @example
+   *
+   * // unregister a listener for an event type
+   * bench.off('cycle', listener);
+   *
+   * // unregister a listener for multiple event types
+   * bench.off('start cycle', listener);
+   *
+   * // unregister all listeners for an event type
+   * bench.off('cycle');
+   *
+   * // unregister all listeners for multiple event types
+   * bench.off('start cycle complete');
+   *
+   * // unregister all listeners for all event types
+   * bench.off();
+   */
+  function off(type, listener) {
+    var me = this,
+        events = me.events;
+
+    events && each(type ? type.split(' ') : events, function(listeners, type) {
+      var index;
+      if (typeof listeners == 'string') {
+        type = listeners;
+        listeners = hasKey(events, type) && events[type];
+      }
+      if (listeners) {
+        if (listener) {
+          index = indexOf(listeners, listener);
+          if (index > -1) {
+            listeners.splice(index, 1);
+          }
+        } else {
+          listeners.length = 0;
+        }
+      }
+    });
+    return me;
+  }
+
+  /**
+   * Registers a listener for the specified event type(s).
+   *
+   * @memberOf Benchmark, Benchmark.Suite
+   * @param {String} type The event type.
+   * @param {Function} listener The function to register.
+   * @returns {Object} The benchmark instance.
+   * @example
+   *
+   * // register a listener for an event type
+   * bench.on('cycle', listener);
+   *
+   * // register a listener for multiple event types
+   * bench.on('start cycle', listener);
+   */
+  function on(type, listener) {
+    var me = this,
+        events = me.events || (me.events = {});
+
+    forEach(type.split(' '), function(type) {
+      (hasKey(events, type)
+        ? events[type]
+        : (events[type] = [])
+      ).push(listener);
+    });
+    return me;
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Aborts the benchmark without recording times.
+   *
+   * @memberOf Benchmark
+   * @returns {Object} The benchmark instance.
+   */
+  function abort() {
+    var event,
+        me = this,
+        resetting = calledBy.reset;
+
+    if (me.running) {
+      event = Event('abort');
+      me.emit(event);
+      if (!event.cancelled || resetting) {
+        // avoid infinite recursion
+        calledBy.abort = true;
+        me.reset();
+        delete calledBy.abort;
+
+        if (support.timeout) {
+          clearTimeout(me._timerId);
+          delete me._timerId;
+        }
+        if (!resetting) {
+          me.aborted = true;
+          me.running = false;
+        }
+      }
+    }
+    return me;
+  }
+
+  /**
+   * Creates a new benchmark using the same test and options.
+   *
+   * @memberOf Benchmark
+   * @param {Object} options Options object to overwrite cloned options.
+   * @returns {Object} The new benchmark instance.
+   * @example
+   *
+   * var bizarro = bench.clone({
+   *   'name': 'doppelganger'
+   * });
+   */
+  function clone(options) {
+    var me = this,
+        result = new me.constructor(extend({}, me, options));
+
+    // correct the `options` object
+    result.options = extend({}, me.options, options);
+
+    // copy own custom properties
+    forOwn(me, function(value, key) {
+      if (!hasKey(result, key)) {
+        result[key] = deepClone(value);
+      }
+    });
+    return result;
+  }
+
+  /**
+   * Determines if a benchmark is faster than another.
+   *
+   * @memberOf Benchmark
+   * @param {Object} other The benchmark to compare.
+   * @returns {Number} Returns `-1` if slower, `1` if faster, and `0` if indeterminate.
+   */
+  function compare(other) {
+    var critical,
+        zStat,
+        me = this,
+        sample1 = me.stats.sample,
+        sample2 = other.stats.sample,
+        size1 = sample1.length,
+        size2 = sample2.length,
+        maxSize = max(size1, size2),
+        minSize = min(size1, size2),
+        u1 = getU(sample1, sample2),
+        u2 = getU(sample2, sample1),
+        u = min(u1, u2);
+
+    function getScore(xA, sampleB) {
+      return reduce(sampleB, function(total, xB) {
+        return total + (xB > xA ? 0 : xB < xA ? 1 : 0.5);
+      }, 0);
+    }
+
+    function getU(sampleA, sampleB) {
+      return reduce(sampleA, function(total, xA) {
+        return total + getScore(xA, sampleB);
+      }, 0);
+    }
+
+    function getZ(u) {
+      return (u - ((size1 * size2) / 2)) / sqrt((size1 * size2 * (size1 + size2 + 1)) / 12);
+    }
+
+    // exit early if comparing the same benchmark
+    if (me == other) {
+      return 0;
+    }
+    // reject the null hyphothesis the two samples come from the
+    // same population (i.e. have the same median) if...
+    if (size1 + size2 > 30) {
+      // ...the z-stat is greater than 1.96 or less than -1.96
+      // http://www.statisticslectures.com/topics/mannwhitneyu/
+      zStat = getZ(u);
+      return abs(zStat) > 1.96 ? (zStat > 0 ? -1 : 1) : 0;
+    }
+    // ...the U value is less than or equal the critical U value
+    // http://www.geoib.com/mann-whitney-u-test.html
+    critical = maxSize < 5 || minSize < 3 ? 0 : uTable[maxSize][minSize - 3];
+    return u <= critical ? (u == u1 ? 1 : -1) : 0;
+  }
+
+  /**
+   * Reset properties and abort if running.
+   *
+   * @memberOf Benchmark
+   * @returns {Object} The benchmark instance.
+   */
+  function reset() {
+    var data,
+        event,
+        me = this,
+        index = 0,
+        changes = { 'length': 0 },
+        queue = { 'length': 0 };
+
+    if (me.running && !calledBy.abort) {
+      // no worries, `reset()` is called within `abort()`
+      calledBy.reset = true;
+      me.abort();
+      delete calledBy.reset;
+    }
+    else {
+      // a non-recursive solution to check if properties have changed
+      // http://www.jslab.dk/articles/non.recursive.preorder.traversal.part4
+      data = { 'destination': me, 'source': extend({}, me.constructor.prototype, me.options) };
+      do {
+        forOwn(data.source, function(value, key) {
+          var changed,
+              destination = data.destination,
+              currValue = destination[key];
+
+          if (value && typeof value == 'object') {
+            if (isClassOf(value, 'Array')) {
+              // check if an array value has changed to a non-array value
+              if (!isClassOf(currValue, 'Array')) {
+                changed = currValue = [];
+              }
+              // or has changed its length
+              if (currValue.length != value.length) {
+                changed = currValue = currValue.slice(0, value.length);
+                currValue.length = value.length;
+              }
+            }
+            // check if an object has changed to a non-object value
+            else if (!currValue || typeof currValue != 'object') {
+              changed = currValue = {};
+            }
+            // register a changed object
+            if (changed) {
+              changes[changes.length++] = { 'destination': destination, 'key': key, 'value': currValue };
+            }
+            queue[queue.length++] = { 'destination': currValue, 'source': value };
+          }
+          // register a changed primitive
+          else if (value !== currValue && !(value == null || isClassOf(value, 'Function'))) {
+            changes[changes.length++] = { 'destination': destination, 'key': key, 'value': value };
+          }
+        });
+      }
+      while ((data = queue[index++]));
+
+      // if changed emit the `reset` event and if it isn't cancelled reset the benchmark
+      if (changes.length && (me.emit(event = Event('reset')), !event.cancelled)) {
+        forEach(changes, function(data) {
+          data.destination[data.key] = data.value;
+        });
+      }
+    }
+    return me;
+  }
+
+  /**
+   * Displays relevant benchmark information when coerced to a string.
+   *
+   * @name toString
+   * @memberOf Benchmark
+   * @returns {String} A string representation of the benchmark instance.
+   */
+  function toStringBench() {
+    var me = this,
+        error = me.error,
+        hz = me.hz,
+        id = me.id,
+        stats = me.stats,
+        size = stats.sample.length,
+        pm = support.java ? '+/-' : '\xb1',
+        result = me.name || (isNaN(id) ? id : '<Test #' + id + '>');
+
+    if (error) {
+      result += ': ' + join(error);
+    } else {
+      result += ' x ' + formatNumber(hz.toFixed(hz < 100 ? 2 : 0)) + ' ops/sec ' + pm +
+        stats.rme.toFixed(2) + '% (' + size + ' run' + (size == 1 ? '' : 's') + ' sampled)';
+    }
+    return result;
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Clocks the time taken to execute a test per cycle (secs).
+   *
+   * @private
+   * @param {Object} bench The benchmark instance.
+   * @returns {Number} The time taken.
+   */
+  function clock() {
+    var applet,
+        options = Benchmark.options,
+        template = { 'begin': 's$=new n$', 'end': 'r$=(new n$-s$)/1e3', 'uid': uid },
+        timers = [{ 'ns': timer.ns, 'res': max(0.0015, getRes('ms')), 'unit': 'ms' }];
+
+    // lazy define for hi-res timers
+    clock = function(clone) {
+      var deferred;
+      if (clone instanceof Deferred) {
+        deferred = clone;
+        clone = deferred.benchmark;
+      }
+
+      var bench = clone._original,
+          fn = bench.fn,
+          fnArg = deferred ? getFirstArgument(fn) || 'deferred' : '',
+          stringable = isStringable(fn);
+
+      var source = {
+        'setup': getSource(bench.setup, preprocess('m$.setup()')),
+        'fn': getSource(fn, preprocess('m$.fn(' + fnArg + ')')),
+        'fnArg': fnArg,
+        'teardown': getSource(bench.teardown, preprocess('m$.teardown()'))
+      };
+
+      var count = bench.count = clone.count,
+          decompilable = support.decompilation || stringable,
+          id = bench.id,
+          isEmpty = !(source.fn || stringable),
+          name = bench.name || (typeof id == 'number' ? '<Test #' + id + '>' : id),
+          ns = timer.ns,
+          result = 0;
+
+      // init `minTime` if needed
+      clone.minTime = bench.minTime || (bench.minTime = bench.options.minTime = options.minTime);
+
+      // repair nanosecond timer
+      // (some Chrome builds erase the `ns` variable after millions of executions)
+      if (applet) {
+        try {
+          ns.nanoTime();
+        } catch(e) {
+          // use non-element to avoid issues with libs that augment them
+          ns = timer.ns = new applet.Packages.nano;
+        }
+      }
+
+      // Compile in setup/teardown functions and the test loop.
+      // Create a new compiled test, instead of using the cached `bench.compiled`,
+      // to avoid potential engine optimizations enabled over the life of the test.
+      var compiled = bench.compiled = createFunction(preprocess('t$'), interpolate(
+        preprocess(deferred
+          ? 'var d$=this,#{fnArg}=d$,m$=d$.benchmark._original,f$=m$.fn,su$=m$.setup,td$=m$.teardown;' +
+            // when `deferred.cycles` is `0` then...
+            'if(!d$.cycles){' +
+            // set `deferred.fn`
+            'd$.fn=function(){var #{fnArg}=d$;if(typeof f$=="function"){try{#{fn}\n}catch(e$){f$(d$)}}else{#{fn}\n}};' +
+            // set `deferred.teardown`
+            'd$.teardown=function(){d$.cycles=0;if(typeof td$=="function"){try{#{teardown}\n}catch(e$){td$()}}else{#{teardown}\n}};' +
+            // execute the benchmark's `setup`
+            'if(typeof su$=="function"){try{#{setup}\n}catch(e$){su$()}}else{#{setup}\n};' +
+            // start timer
+            't$.start(d$);' +
+            // execute `deferred.fn` and return a dummy object
+            '}d$.fn();return{}'
+
+          : 'var r$,s$,m$=this,f$=m$.fn,i$=m$.count,n$=t$.ns;#{setup}\n#{begin};' +
+            'while(i$--){#{fn}\n}#{end};#{teardown}\nreturn{elapsed:r$,uid:"#{uid}"}'),
+        source
+      ));
+
+      try {
+        if (isEmpty) {
+          // Firefox may remove dead code from Function#toString results
+          // http://bugzil.la/536085
+          throw new Error('The test "' + name + '" is empty. This may be the result of dead code removal.');
+        }
+        else if (!deferred) {
+          // pretest to determine if compiled code is exits early, usually by a
+          // rogue `return` statement, by checking for a return object with the uid
+          bench.count = 1;
+          compiled = (compiled.call(bench, timer) || {}).uid == uid && compiled;
+          bench.count = count;
+        }
+      } catch(e) {
+        compiled = null;
+        clone.error = e || new Error(String(e));
+        bench.count = count;
+      }
+      // fallback when a test exits early or errors during pretest
+      if (decompilable && !compiled && !deferred && !isEmpty) {
+        compiled = createFunction(preprocess('t$'), interpolate(
+          preprocess(
+            (clone.error && !stringable
+              ? 'var r$,s$,m$=this,f$=m$.fn,i$=m$.count'
+              : 'function f$(){#{fn}\n}var r$,s$,m$=this,i$=m$.count'
+            ) +
+            ',n$=t$.ns;#{setup}\n#{begin};m$.f$=f$;while(i$--){m$.f$()}#{end};' +
+            'delete m$.f$;#{teardown}\nreturn{elapsed:r$}'
+          ),
+          source
+        ));
+
+        try {
+          // pretest one more time to check for errors
+          bench.count = 1;
+          compiled.call(bench, timer);
+          bench.compiled = compiled;
+          bench.count = count;
+          delete clone.error;
+        }
+        catch(e) {
+          bench.count = count;
+          if (clone.error) {
+            compiled = null;
+          } else {
+            bench.compiled = compiled;
+            clone.error = e || new Error(String(e));
+          }
+        }
+      }
+      // assign `compiled` to `clone` before calling in case a deferred benchmark
+      // immediately calls `deferred.resolve()`
+      clone.compiled = compiled;
+      // if no errors run the full test loop
+      if (!clone.error) {
+        result = compiled.call(deferred || bench, timer).elapsed;
+      }
+      return result;
+    };
+
+    /*------------------------------------------------------------------------*/
+
+    /**
+     * Gets the current timer's minimum resolution (secs).
+     */
+    function getRes(unit) {
+      var measured,
+          begin,
+          count = 30,
+          divisor = 1e3,
+          ns = timer.ns,
+          sample = [];
+
+      // get average smallest measurable time
+      while (count--) {
+        if (unit == 'us') {
+          divisor = 1e6;
+          if (ns.stop) {
+            ns.start();
+            while (!(measured = ns.microseconds())) { }
+          } else if (ns[perfName]) {
+            divisor = 1e3;
+            measured = Function('n', 'var r,s=n.' + perfName + '();while(!(r=n.' + perfName + '()-s)){};return r')(ns);
+          } else {
+            begin = ns();
+            while (!(measured = ns() - begin)) { }
+          }
+        }
+        else if (unit == 'ns') {
+          divisor = 1e9;
+          if (ns.nanoTime) {
+            begin = ns.nanoTime();
+            while (!(measured = ns.nanoTime() - begin)) { }
+          } else {
+            begin = (begin = ns())[0] + (begin[1] / divisor);
+            while (!(measured = ((measured = ns())[0] + (measured[1] / divisor)) - begin)) { }
+            divisor = 1;
+          }
+        }
+        else {
+          begin = new ns;
+          while (!(measured = new ns - begin)) { }
+        }
+        // check for broken timers (nanoTime may have issues)
+        // http://alivebutsleepy.srnet.cz/unreliable-system-nanotime/
+        if (measured > 0) {
+          sample.push(measured);
+        } else {
+          sample.push(Infinity);
+          break;
+        }
+      }
+      // convert to seconds
+      return getMean(sample) / divisor;
+    }
+
+    /**
+     * Replaces all occurrences of `$` with a unique number and
+     * template tokens with content.
+     */
+    function preprocess(code) {
+      return interpolate(code, template).replace(/\$/g, /\d+/.exec(uid));
+    }
+
+    /*------------------------------------------------------------------------*/
+
+    // detect nanosecond support from a Java applet
+    each(doc && doc.applets || [], function(element) {
+      return !(timer.ns = applet = 'nanoTime' in element && element);
+    });
+
+    // check type in case Safari returns an object instead of a number
+    try {
+      if (typeof timer.ns.nanoTime() == 'number') {
+        timers.push({ 'ns': timer.ns, 'res': getRes('ns'), 'unit': 'ns' });
+      }
+    } catch(e) { }
+
+    // detect Chrome's microsecond timer:
+    // enable benchmarking via the --enable-benchmarking command
+    // line switch in at least Chrome 7 to use chrome.Interval
+    try {
+      if ((timer.ns = new (window.chrome || window.chromium).Interval)) {
+        timers.push({ 'ns': timer.ns, 'res': getRes('us'), 'unit': 'us' });
+      }
+    } catch(e) { }
+
+    // detect `performance.now` microsecond resolution timer
+    if ((timer.ns = perfName && perfObject)) {
+      timers.push({ 'ns': timer.ns, 'res': getRes('us'), 'unit': 'us' });
+    }
+
+    // detect Node's nanosecond resolution timer available in Node >= 0.8
+    if (processObject && typeof (timer.ns = processObject.hrtime) == 'function') {
+      timers.push({ 'ns': timer.ns, 'res': getRes('ns'), 'unit': 'ns' });
+    }
+
+    // detect Wade Simmons' Node microtime module
+    if (microtimeObject && typeof (timer.ns = microtimeObject.now) == 'function') {
+      timers.push({ 'ns': timer.ns,  'res': getRes('us'), 'unit': 'us' });
+    }
+
+    // pick timer with highest resolution
+    timer = reduce(timers, function(timer, other) {
+      return other.res < timer.res ? other : timer;
+    });
+
+    // remove unused applet
+    if (timer.unit != 'ns' && applet) {
+      applet = destroyElement(applet);
+    }
+    // error if there are no working timers
+    if (timer.res == Infinity) {
+      throw new Error('Benchmark.js was unable to find a working timer.');
+    }
+    // use API of chosen timer
+    if (timer.unit == 'ns') {
+      if (timer.ns.nanoTime) {
+        extend(template, {
+          'begin': 's$=n$.nanoTime()',
+          'end': 'r$=(n$.nanoTime()-s$)/1e9'
+        });
+      } else {
+        extend(template, {
+          'begin': 's$=n$()',
+          'end': 'r$=n$(s$);r$=r$[0]+(r$[1]/1e9)'
+        });
+      }
+    }
+    else if (timer.unit == 'us') {
+      if (timer.ns.stop) {
+        extend(template, {
+          'begin': 's$=n$.start()',
+          'end': 'r$=n$.microseconds()/1e6'
+        });
+      } else if (perfName) {
+        extend(template, {
+          'begin': 's$=n$.' + perfName + '()',
+          'end': 'r$=(n$.' + perfName + '()-s$)/1e3'
+        });
+      } else {
+        extend(template, {
+          'begin': 's$=n$()',
+          'end': 'r$=(n$()-s$)/1e6'
+        });
+      }
+    }
+
+    // define `timer` methods
+    timer.start = createFunction(preprocess('o$'),
+      preprocess('var n$=this.ns,#{begin};o$.elapsed=0;o$.timeStamp=s$'));
+
+    timer.stop = createFunction(preprocess('o$'),
+      preprocess('var n$=this.ns,s$=o$.timeStamp,#{end};o$.elapsed=r$'));
+
+    // resolve time span required to achieve a percent uncertainty of at most 1%
+    // http://spiff.rit.edu/classes/phys273/uncert/uncert.html
+    options.minTime || (options.minTime = max(timer.res / 2 / 0.01, 0.05));
+    return clock.apply(null, arguments);
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Computes stats on benchmark results.
+   *
+   * @private
+   * @param {Object} bench The benchmark instance.
+   * @param {Object} options The options object.
+   */
+  function compute(bench, options) {
+    options || (options = {});
+
+    var async = options.async,
+        elapsed = 0,
+        initCount = bench.initCount,
+        minSamples = bench.minSamples,
+        queue = [],
+        sample = bench.stats.sample;
+
+    /**
+     * Adds a clone to the queue.
+     */
+    function enqueue() {
+      queue.push(bench.clone({
+        '_original': bench,
+        'events': {
+          'abort': [update],
+          'cycle': [update],
+          'error': [update],
+          'start': [update]
+        }
+      }));
+    }
+
+    /**
+     * Updates the clone/original benchmarks to keep their data in sync.
+     */
+    function update(event) {
+      var clone = this,
+          type = event.type;
+
+      if (bench.running) {
+        if (type == 'start') {
+          // Note: `clone.minTime` prop is inited in `clock()`
+          clone.count = bench.initCount;
+        }
+        else {
+          if (type == 'error') {
+            bench.error = clone.error;
+          }
+          if (type == 'abort') {
+            bench.abort();
+            bench.emit('cycle');
+          } else {
+            event.currentTarget = event.target = bench;
+            bench.emit(event);
+          }
+        }
+      } else if (bench.aborted) {
+        // clear abort listeners to avoid triggering bench's abort/cycle again
+        clone.events.abort.length = 0;
+        clone.abort();
+      }
+    }
+
+    /**
+     * Determines if more clones should be queued or if cycling should stop.
+     */
+    function evaluate(event) {
+      var critical,
+          df,
+          mean,
+          moe,
+          rme,
+          sd,
+          sem,
+          variance,
+          clone = event.target,
+          done = bench.aborted,
+          now = +new Date,
+          size = sample.push(clone.times.period),
+          maxedOut = size >= minSamples && (elapsed += now - clone.times.timeStamp) / 1e3 > bench.maxTime,
+          times = bench.times,
+          varOf = function(sum, x) { return sum + pow(x - mean, 2); };
+
+      // exit early for aborted or unclockable tests
+      if (done || clone.hz == Infinity) {
+        maxedOut = !(size = sample.length = queue.length = 0);
+      }
+
+      if (!done) {
+        // sample mean (estimate of the population mean)
+        mean = getMean(sample);
+        // sample variance (estimate of the population variance)
+        variance = reduce(sample, varOf, 0) / (size - 1) || 0;
+        // sample standard deviation (estimate of the population standard deviation)
+        sd = sqrt(variance);
+        // standard error of the mean (a.k.a. the standard deviation of the sampling distribution of the sample mean)
+        sem = sd / sqrt(size);
+        // degrees of freedom
+        df = size - 1;
+        // critical value
+        critical = tTable[Math.round(df) || 1] || tTable.infinity;
+        // margin of error
+        moe = sem * critical;
+        // relative margin of error
+        rme = (moe / mean) * 100 || 0;
+
+        extend(bench.stats, {
+          'deviation': sd,
+          'mean': mean,
+          'moe': moe,
+          'rme': rme,
+          'sem': sem,
+          'variance': variance
+        });
+
+        // Abort the cycle loop when the minimum sample size has been collected
+        // and the elapsed time exceeds the maximum time allowed per benchmark.
+        // We don't count cycle delays toward the max time because delays may be
+        // increased by browsers that clamp timeouts for inactive tabs.
+        // https://developer.mozilla.org/en/window.setTimeout#Inactive_tabs
+        if (maxedOut) {
+          // reset the `initCount` in case the benchmark is rerun
+          bench.initCount = initCount;
+          bench.running = false;
+          done = true;
+          times.elapsed = (now - times.timeStamp) / 1e3;
+        }
+        if (bench.hz != Infinity) {
+          bench.hz = 1 / mean;
+          times.cycle = mean * bench.count;
+          times.period = mean;
+        }
+      }
+      // if time permits, increase sample size to reduce the margin of error
+      if (queue.length < 2 && !maxedOut) {
+        enqueue();
+      }
+      // abort the invoke cycle when done
+      event.aborted = done;
+    }
+
+    // init queue and begin
+    enqueue();
+    invoke(queue, {
+      'name': 'run',
+      'args': { 'async': async },
+      'queued': true,
+      'onCycle': evaluate,
+      'onComplete': function() { bench.emit('complete'); }
+    });
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Cycles a benchmark until a run `count` can be established.
+   *
+   * @private
+   * @param {Object} clone The cloned benchmark instance.
+   * @param {Object} options The options object.
+   */
+  function cycle(clone, options) {
+    options || (options = {});
+
+    var deferred;
+    if (clone instanceof Deferred) {
+      deferred = clone;
+      clone = clone.benchmark;
+    }
+
+    var clocked,
+        cycles,
+        divisor,
+        event,
+        minTime,
+        period,
+        async = options.async,
+        bench = clone._original,
+        count = clone.count,
+        times = clone.times;
+
+    // continue, if not aborted between cycles
+    if (clone.running) {
+      // `minTime` is set to `Benchmark.options.minTime` in `clock()`
+      cycles = ++clone.cycles;
+      clocked = deferred ? deferred.elapsed : clock(clone);
+      minTime = clone.minTime;
+
+      if (cycles > bench.cycles) {
+        bench.cycles = cycles;
+      }
+      if (clone.error) {
+        event = Event('error');
+        event.message = clone.error;
+        clone.emit(event);
+        if (!event.cancelled) {
+          clone.abort();
+        }
+      }
+    }
+
+    // continue, if not errored
+    if (clone.running) {
+      // time taken to complete last test cycle
+      bench.times.cycle = times.cycle = clocked;
+      // seconds per operation
+      period = bench.times.period = times.period = clocked / count;
+      // ops per second
+      bench.hz = clone.hz = 1 / period;
+      // avoid working our way up to this next time
+      bench.initCount = clone.initCount = count;
+      // do we need to do another cycle?
+      clone.running = clocked < minTime;
+
+      if (clone.running) {
+        // tests may clock at `0` when `initCount` is a small number,
+        // to avoid that we set its count to something a bit higher
+        if (!clocked && (divisor = divisors[clone.cycles]) != null) {
+          count = floor(4e6 / divisor);
+        }
+        // calculate how many more iterations it will take to achive the `minTime`
+        if (count <= clone.count) {
+          count += Math.ceil((minTime - clocked) / period);
+        }
+        clone.running = count != Infinity;
+      }
+    }
+    // should we exit early?
+    event = Event('cycle');
+    clone.emit(event);
+    if (event.aborted) {
+      clone.abort();
+    }
+    // figure out what to do next
+    if (clone.running) {
+      // start a new cycle
+      clone.count = count;
+      if (deferred) {
+        clone.compiled.call(deferred, timer);
+      } else if (async) {
+        delay(clone, function() { cycle(clone, options); });
+      } else {
+        cycle(clone);
+      }
+    }
+    else {
+      // fix TraceMonkey bug associated with clock fallbacks
+      // http://bugzil.la/509069
+      if (support.browser) {
+        runScript(uid + '=1;delete ' + uid);
+      }
+      // done
+      clone.emit('complete');
+    }
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * Runs the benchmark.
+   *
+   * @memberOf Benchmark
+   * @param {Object} [options={}] Options object.
+   * @returns {Object} The benchmark instance.
+   * @example
+   *
+   * // basic usage
+   * bench.run();
+   *
+   * // or with options
+   * bench.run({ 'async': true });
+   */
+  function run(options) {
+    var me = this,
+        event = Event('start');
+
+    // set `running` to `false` so `reset()` won't call `abort()`
+    me.running = false;
+    me.reset();
+    me.running = true;
+
+    me.count = me.initCount;
+    me.times.timeStamp = +new Date;
+    me.emit(event);
+
+    if (!event.cancelled) {
+      options = { 'async': ((options = options && options.async) == null ? me.async : options) && support.timeout };
+
+      // for clones created within `compute()`
+      if (me._original) {
+        if (me.defer) {
+          Deferred(me);
+        } else {
+          cycle(me, options);
+        }
+      }
+      // for original benchmarks
+      else {
+        compute(me, options);
+      }
+    }
+    return me;
+  }
+
+  /*--------------------------------------------------------------------------*/
+
+  // Firefox 1 erroneously defines variable and argument names of functions on
+  // the function itself as non-configurable properties with `undefined` values.
+  // The bugginess continues as the `Benchmark` constructor has an argument
+  // named `options` and Firefox 1 will not assign a value to `Benchmark.options`,
+  // making it non-writable in the process, unless it is the first property
+  // assigned by for-in loop of `extend()`.
+  extend(Benchmark, {
+
+    /**
+     * The default options copied by benchmark instances.
+     *
+     * @static
+     * @memberOf Benchmark
+     * @type Object
+     */
+    'options': {
+
+      /**
+       * A flag to indicate that benchmark cycles will execute asynchronously
+       * by default.
+       *
+       * @memberOf Benchmark.options
+       * @type Boolean
+       */
+      'async': false,
+
+      /**
+       * A flag to indicate that the benchmark clock is deferred.
+       *
+       * @memberOf Benchmark.options
+       * @type Boolean
+       */
+      'defer': false,
+
+      /**
+       * The delay between test cycles (secs).
+       * @memberOf Benchmark.options
+       * @type Number
+       */
+      'delay': 0.005,
+
+      /**
+       * Displayed by Benchmark#toString when a `name` is not available
+       * (auto-generated if absent).
+       *
+       * @memberOf Benchmark.options
+       * @type String
+       */
+      'id': undefined,
+
+      /**
+       * The default number of times to execute a test on a benchmark's first cycle.
+       *
+       * @memberOf Benchmark.options
+       * @type Number
+       */
+      'initCount': 1,
+
+      /**
+       * The maximum time a benchmark is allowed to run before finishing (secs).
+       * Note: Cycle delays aren't counted toward the maximum time.
+       *
+       * @memberOf Benchmark.options
+       * @type Number
+       */
+      'maxTime': 5,
+
+      /**
+       * The minimum sample size required to perform statistical analysis.
+       *
+       * @memberOf Benchmark.options
+       * @type Number
+       */
+      'minSamples': 5,
+
+      /**
+       * The time needed to reduce the percent uncertainty of measurement to 1% (secs).
+       *
+       * @memberOf Benchmark.options
+       * @type Number
+       */
+      'minTime': 0,
+
+      /**
+       * The name of the benchmark.
+       *
+       * @memberOf Benchmark.options
+       * @type String
+       */
+      'name': undefined,
+
+      /**
+       * An event listener called when the benchmark is aborted.
+       *
+       * @memberOf Benchmark.options
+       * @type Function
+       */
+      'onAbort': undefined,
+
+      /**
+       * An event listener called when the benchmark completes running.
+       *
+       * @memberOf Benchmark.options
+       * @type Function
+       */
+      'onComplete': undefined,
+
+      /**
+       * An event listener called after each run cycle.
+       *
+       * @memberOf Benchmark.options
+       * @type Function
+       */
+      'onCycle': undefined,
+
+      /**
+       * An event listener called when a test errors.
+       *
+       * @memberOf Benchmark.options
+       * @type Function
+       */
+      'onError': undefined,
+
+      /**
+       * An event listener called when the benchmark is reset.
+       *
+       * @memberOf Benchmark.options
+       * @type Function
+       */
+      'onReset': undefined,
+
+      /**
+       * An event listener called when the benchmark starts running.
+       *
+       * @memberOf Benchmark.options
+       * @type Function
+       */
+      'onStart': undefined
+    },
+
+    /**
+     * Platform object with properties describing things like browser name,
+     * version, and operating system.
+     *
+     * @static
+     * @memberOf Benchmark
+     * @type Object
+     */
+    'platform': req('platform') || window.platform || {
+
+      /**
+       * The platform description.
+       *
+       * @memberOf Benchmark.platform
+       * @type String
+       */
+      'description': window.navigator && navigator.userAgent || null,
+
+      /**
+       * The name of the browser layout engine.
+       *
+       * @memberOf Benchmark.platform
+       * @type String|Null
+       */
+      'layout': null,
+
+      /**
+       * The name of the product hosting the browser.
+       *
+       * @memberOf Benchmark.platform
+       * @type String|Null
+       */
+      'product': null,
+
+      /**
+       * The name of the browser/environment.
+       *
+       * @memberOf Benchmark.platform
+       * @type String|Null
+       */
+      'name': null,
+
+      /**
+       * The name of the product's manufacturer.
+       *
+       * @memberOf Benchmark.platform
+       * @type String|Null
+       */
+      'manufacturer': null,
+
+      /**
+       * The name of the operating system.
+       *
+       * @memberOf Benchmark.platform
+       * @type String|Null
+       */
+      'os': null,
+
+      /**
+       * The alpha/beta release indicator.
+       *
+       * @memberOf Benchmark.platform
+       * @type String|Null
+       */
+      'prerelease': null,
+
+      /**
+       * The browser/environment version.
+       *
+       * @memberOf Benchmark.platform
+       * @type String|Null
+       */
+      'version': null,
+
+      /**
+       * Return platform description when the platform object is coerced to a string.
+       *
+       * @memberOf Benchmark.platform
+       * @type Function
+       * @returns {String} The platform description.
+       */
+      'toString': function() {
+        return this.description || '';
+      }
+    },
+
+    /**
+     * The semantic version number.
+     *
+     * @static
+     * @memberOf Benchmark
+     * @type String
+     */
+    'version': '1.0.0',
+
+    // an object of environment/feature detection flags
+    'support': support,
+
+    // clone objects
+    'deepClone': deepClone,
+
+    // iteration utility
+    'each': each,
+
+    // augment objects
+    'extend': extend,
+
+    // generic Array#filter
+    'filter': filter,
+
+    // generic Array#forEach
+    'forEach': forEach,
+
+    // generic own property iteration utility
+    'forOwn': forOwn,
+
+    // converts a number to a comma-separated string
+    'formatNumber': formatNumber,
+
+    // generic Object#hasOwnProperty
+    // (trigger hasKey's lazy define before assigning it to Benchmark)
+    'hasKey': (hasKey(Benchmark, ''), hasKey),
+
+    // generic Array#indexOf
+    'indexOf': indexOf,
+
+    // template utility
+    'interpolate': interpolate,
+
+    // invokes a method on each item in an array
+    'invoke': invoke,
+
+    // generic Array#join for arrays and objects
+    'join': join,
+
+    // generic Array#map
+    'map': map,
+
+    // retrieves a property value from each item in an array
+    'pluck': pluck,
+
+    // generic Array#reduce
+    'reduce': reduce
+  });
+
+  /*--------------------------------------------------------------------------*/
+
+  extend(Benchmark.prototype, {
+
+    /**
+     * The number of times a test was executed.
+     *
+     * @memberOf Benchmark
+     * @type Number
+     */
+    'count': 0,
+
+    /**
+     * The number of cycles performed while benchmarking.
+     *
+     * @memberOf Benchmark
+     * @type Number
+     */
+    'cycles': 0,
+
+    /**
+     * The number of executions per second.
+     *
+     * @memberOf Benchmark
+     * @type Number
+     */
+    'hz': 0,
+
+    /**
+     * The compiled test function.
+     *
+     * @memberOf Benchmark
+     * @type Function|String
+     */
+    'compiled': undefined,
+
+    /**
+     * The error object if the test failed.
+     *
+     * @memberOf Benchmark
+     * @type Object
+     */
+    'error': undefined,
+
+    /**
+     * The test to benchmark.
+     *
+     * @memberOf Benchmark
+     * @type Function|String
+     */
+    'fn': undefined,
+
+    /**
+     * A flag to indicate if the benchmark is aborted.
+     *
+     * @memberOf Benchmark
+     * @type Boolean
+     */
+    'aborted': false,
+
+    /**
+     * A flag to indicate if the benchmark is running.
+     *
+     * @memberOf Benchmark
+     * @type Boolean
+     */
+    'running': false,
+
+    /**
+     * Compiled into the test and executed immediately **before** the test loop.
+     *
+     * @memberOf Benchmark
+     * @type Function|String
+     * @example
+     *
+     * // basic usage
+     * var bench = Benchmark({
+     *   'setup': function() {
+     *     var c = this.count,
+     *         element = document.getElementById('container');
+     *     while (c--) {
+     *       element.appendChild(document.createElement('div'));
+     *     }
+     *   },
+     *   'fn': function() {
+     *     element.removeChild(element.lastChild);
+     *   }
+     * });
+     *
+     * // compiles to something like:
+     * var c = this.count,
+     *     element = document.getElementById('container');
+     * while (c--) {
+     *   element.appendChild(document.createElement('div'));
+     * }
+     * var start = new Date;
+     * while (count--) {
+     *   element.removeChild(element.lastChild);
+     * }
+     * var end = new Date - start;
+     *
+     * // or using strings
+     * var bench = Benchmark({
+     *   'setup': '\
+     *     var a = 0;\n\
+     *     (function() {\n\
+     *       (function() {\n\
+     *         (function() {',
+     *   'fn': 'a += 1;',
+     *   'teardown': '\
+     *          }())\n\
+     *        }())\n\
+     *      }())'
+     * });
+     *
+     * // compiles to something like:
+     * var a = 0;
+     * (function() {
+     *   (function() {
+     *     (function() {
+     *       var start = new Date;
+     *       while (count--) {
+     *         a += 1;
+     *       }
+     *       var end = new Date - start;
+     *     }())
+     *   }())
+     * }())
+     */
+    'setup': noop,
+
+    /**
+     * Compiled into the test and executed immediately **after** the test loop.
+     *
+     * @memberOf Benchmark
+     * @type Function|String
+     */
+    'teardown': noop,
+
+    /**
+     * An object of stats including mean, margin or error, and standard deviation.
+     *
+     * @memberOf Benchmark
+     * @type Object
+     */
+    'stats': {
+
+      /**
+       * The margin of error.
+       *
+       * @memberOf Benchmark#stats
+       * @type Number
+       */
+      'moe': 0,
+
+      /**
+       * The relative margin of error (expressed as a percentage of the mean).
+       *
+       * @memberOf Benchmark#stats
+       * @type Number
+       */
+      'rme': 0,
+
+      /**
+       * The standard error of the mean.
+       *
+       * @memberOf Benchmark#stats
+       * @type Number
+       */
+      'sem': 0,
+
+      /**
+       * The sample standard deviation.
+       *
+       * @memberOf Benchmark#stats
+       * @type Number
+       */
+      'deviation': 0,
+
+      /**
+       * The sample arithmetic mean.
+       *
+       * @memberOf Benchmark#stats
+       * @type Number
+       */
+      'mean': 0,
+
+      /**
+       * The array of sampled periods.
+       *
+       * @memberOf Benchmark#stats
+       * @type Array
+       */
+      'sample': [],
+
+      /**
+       * The sample variance.
+       *
+       * @memberOf Benchmark#stats
+       * @type Number
+       */
+      'variance': 0
+    },
+
+    /**
+     * An object of timing data including cycle, elapsed, period, start, and stop.
+     *
+     * @memberOf Benchmark
+     * @type Object
+     */
+    'times': {
+
+      /**
+       * The time taken to complete the last cycle (secs).
+       *
+       * @memberOf Benchmark#times
+       * @type Number
+       */
+      'cycle': 0,
+
+      /**
+       * The time taken to complete the benchmark (secs).
+       *
+       * @memberOf Benchmark#times
+       * @type Number
+       */
+      'elapsed': 0,
+
+      /**
+       * The time taken to execute the test once (secs).
+       *
+       * @memberOf Benchmark#times
+       * @type Number
+       */
+      'period': 0,
+
+      /**
+       * A timestamp of when the benchmark started (ms).
+       *
+       * @memberOf Benchmark#times
+       * @type Number
+       */
+      'timeStamp': 0
+    },
+
+    // aborts benchmark (does not record times)
+    'abort': abort,
+
+    // creates a new benchmark using the same test and options
+    'clone': clone,
+
+    // compares benchmark's hertz with another
+    'compare': compare,
+
+    // executes listeners
+    'emit': emit,
+
+    // get listeners
+    'listeners': listeners,
+
+    // unregister listeners
+    'off': off,
+
+    // register listeners
+    'on': on,
+
+    // reset benchmark properties
+    'reset': reset,
+
+    // runs the benchmark
+    'run': run,
+
+    // pretty print benchmark info
+    'toString': toStringBench
+  });
+
+  /*--------------------------------------------------------------------------*/
+
+  extend(Deferred.prototype, {
+
+    /**
+     * The deferred benchmark instance.
+     *
+     * @memberOf Benchmark.Deferred
+     * @type Object
+     */
+    'benchmark': null,
+
+    /**
+     * The number of deferred cycles performed while benchmarking.
+     *
+     * @memberOf Benchmark.Deferred
+     * @type Number
+     */
+    'cycles': 0,
+
+    /**
+     * The time taken to complete the deferred benchmark (secs).
+     *
+     * @memberOf Benchmark.Deferred
+     * @type Number
+     */
+    'elapsed': 0,
+
+    /**
+     * A timestamp of when the deferred benchmark started (ms).
+     *
+     * @memberOf Benchmark.Deferred
+     * @type Number
+     */
+    'timeStamp': 0,
+
+    // cycles/completes the deferred benchmark
+    'resolve': resolve
+  });
+
+  /*--------------------------------------------------------------------------*/
+
+  extend(Event.prototype, {
+
+    /**
+     * A flag to indicate if the emitters listener iteration is aborted.
+     *
+     * @memberOf Benchmark.Event
+     * @type Boolean
+     */
+    'aborted': false,
+
+    /**
+     * A flag to indicate if the default action is cancelled.
+     *
+     * @memberOf Benchmark.Event
+     * @type Boolean
+     */
+    'cancelled': false,
+
+    /**
+     * The object whose listeners are currently being processed.
+     *
+     * @memberOf Benchmark.Event
+     * @type Object
+     */
+    'currentTarget': undefined,
+
+    /**
+     * The return value of the last executed listener.
+     *
+     * @memberOf Benchmark.Event
+     * @type Mixed
+     */
+    'result': undefined,
+
+    /**
+     * The object to which the event was originally emitted.
+     *
+     * @memberOf Benchmark.Event
+     * @type Object
+     */
+    'target': undefined,
+
+    /**
+     * A timestamp of when the event was created (ms).
+     *
+     * @memberOf Benchmark.Event
+     * @type Number
+     */
+    'timeStamp': 0,
+
+    /**
+     * The event type.
+     *
+     * @memberOf Benchmark.Event
+     * @type String
+     */
+    'type': ''
+  });
+
+  /*--------------------------------------------------------------------------*/
+
+  /**
+   * The default options copied by suite instances.
+   *
+   * @static
+   * @memberOf Benchmark.Suite
+   * @type Object
+   */
+  Suite.options = {
+
+    /**
+     * The name of the suite.
+     *
+     * @memberOf Benchmark.Suite.options
+     * @type String
+     */
+    'name': undefined
+  };
+
+  /*--------------------------------------------------------------------------*/
+
+  extend(Suite.prototype, {
+
+    /**
+     * The number of benchmarks in the suite.
+     *
+     * @memberOf Benchmark.Suite
+     * @type Number
+     */
+    'length': 0,
+
+    /**
+     * A flag to indicate if the suite is aborted.
+     *
+     * @memberOf Benchmark.Suite
+     * @type Boolean
+     */
+    'aborted': false,
+
+    /**
+     * A flag to indicate if the suite is running.
+     *
+     * @memberOf Benchmark.Suite
+     * @type Boolean
+     */
+    'running': false,
+
+    /**
+     * An `Array#forEach` like method.
+     * Callbacks may terminate the loop by explicitly returning `false`.
+     *
+     * @memberOf Benchmark.Suite
+     * @param {Function} callback The function called per iteration.
+     * @returns {Object} The suite iterated over.
+     */
+    'forEach': methodize(forEach),
+
+    /**
+     * An `Array#indexOf` like method.
+     *
+     * @memberOf Benchmark.Suite
+     * @param {Mixed} value The value to search for.
+     * @returns {Number} The index of the matched value or `-1`.
+     */
+    'indexOf': methodize(indexOf),
+
+    /**
+     * Invokes a method on all benchmarks in the suite.
+     *
+     * @memberOf Benchmark.Suite
+     * @param {String|Object} name The name of the method to invoke OR options object.
+     * @param {Mixed} [arg1, arg2, ...] Arguments to invoke the method with.
+     * @returns {Array} A new array of values returned from each method invoked.
+     */
+    'invoke': methodize(invoke),
+
+    /**
+     * Converts the suite of benchmarks to a string.
+     *
+     * @memberOf Benchmark.Suite
+     * @param {String} [separator=','] A string to separate each element of the array.
+     * @returns {String} The string.
+     */
+    'join': [].join,
+
+    /**
+     * An `Array#map` like method.
+     *
+     * @memberOf Benchmark.Suite
+     * @param {Function} callback The function called per iteration.
+     * @returns {Array} A new array of values returned by the callback.
+     */
+    'map': methodize(map),
+
+    /**
+     * Retrieves the value of a specified property from all benchmarks in the suite.
+     *
+     * @memberOf Benchmark.Suite
+     * @param {String} property The property to pluck.
+     * @returns {Array} A new array of property values.
+     */
+    'pluck': methodize(pluck),
+
+    /**
+     * Removes the last benchmark from the suite and returns it.
+     *
+     * @memberOf Benchmark.Suite
+     * @returns {Mixed} The removed benchmark.
+     */
+    'pop': [].pop,
+
+    /**
+     * Appends benchmarks to the suite.
+     *
+     * @memberOf Benchmark.Suite
+     * @returns {Number} The suite's new length.
+     */
+    'push': [].push,
+
+    /**
+     * Sorts the benchmarks of the suite.
+     *
+     * @memberOf Benchmark.Suite
+     * @param {Function} [compareFn=null] A function that defines the sort order.
+     * @returns {Object} The sorted suite.
+     */
+    'sort': [].sort,
+
+    /**
+     * An `Array#reduce` like method.
+     *
+     * @memberOf Benchmark.Suite
+     * @param {Function} callback The function called per iteration.
+     * @param {Mixed} accumulator Initial value of the accumulator.
+     * @returns {Mixed} The accumulator.
+     */
+    'reduce': methodize(reduce),
+
+    // aborts all benchmarks in the suite
+    'abort': abortSuite,
+
+    // adds a benchmark to the suite
+    'add': add,
+
+    // creates a new suite with cloned benchmarks
+    'clone': cloneSuite,
+
+    // executes listeners of a specified type
+    'emit': emit,
+
+    // creates a new suite of filtered benchmarks
+    'filter': filterSuite,
+
+    // get listeners
+    'listeners': listeners,
+
+    // unregister listeners
+    'off': off,
+
+   // register listeners
+    'on': on,
+
+    // resets all benchmarks in the suite
+    'reset': resetSuite,
+
+    // runs all benchmarks in the suite
+    'run': runSuite,
+
+    // array methods
+    'concat': concat,
+
+    'reverse': reverse,
+
+    'shift': shift,
+
+    'slice': slice,
+
+    'splice': splice,
+
+    'unshift': unshift
+  });
+
+  /*--------------------------------------------------------------------------*/
+
+  // expose Deferred, Event and Suite
+  extend(Benchmark, {
+    'Deferred': Deferred,
+    'Event': Event,
+    'Suite': Suite
+  });
+
+  // expose Benchmark
+  // some AMD build optimizers, like r.js, check for specific condition patterns like the following:
+  if (typeof define == 'function' && typeof define.amd == 'object' && define.amd) {
+    // define as an anonymous module so, through path mapping, it can be aliased
+    define(function() {
+      return Benchmark;
+    });
+  }
+  // check for `exports` after `define` in case a build optimizer adds an `exports` object
+  else if (freeExports) {
+    // in Node.js or RingoJS v0.8.0+
+    if (typeof module == 'object' && module && module.exports == freeExports) {
+      (module.exports = Benchmark).Benchmark = Benchmark;
+    }
+    // in Narwhal or RingoJS v0.7.0-
+    else {
+      freeExports.Benchmark = Benchmark;
+    }
+  }
+  // in a browser or Rhino
+  else {
+    // use square bracket notation so Closure Compiler won't munge `Benchmark`
+    // http://code.google.com/closure/compiler/docs/api-tutorial3.html#export
+    window['Benchmark'] = Benchmark;
+  }
+
+  // trigger clock's lazy define early to avoid a security error
+  if (support.air) {
+    clock({ '_original': { 'fn': noop, 'count': 1, 'options': {} } });
+  }
+}(this));
new file mode 100644
index 0000000000000000000000000000000000000000..cadaa100a068c9f48552aa9b5cedbf7dd6ba7d39
GIT binary patch
literal 2909328
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%0D`sGq
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/frameworks/jquery-1.9.js
@@ -0,0 +1,9597 @@
+/*!
+ * jQuery JavaScript Library v1.9.1
+ * http://jquery.com/
+ *
+ * Includes Sizzle.js
+ * http://sizzlejs.com/
+ *
+ * Copyright 2005, 2012 jQuery Foundation, Inc. and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2013-2-4
+ */
+(function( window, undefined ) {
+
+// Can't do this because several apps including ASP.NET trace
+// the stack via arguments.caller.callee and Firefox dies if
+// you try to trace through "use strict" call chains. (#13335)
+// Support: Firefox 18+
+//"use strict";
+var
+	// The deferred used on DOM ready
+	readyList,
+
+	// A central reference to the root jQuery(document)
+	rootjQuery,
+
+	// Support: IE<9
+	// For `typeof node.method` instead of `node.method !== undefined`
+	core_strundefined = typeof undefined,
+
+	// Use the correct document accordingly with window argument (sandbox)
+	document = window.document,
+	location = window.location,
+
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	// [[Class]] -> type pairs
+	class2type = {},
+
+	// List of deleted data cache ids, so we can reuse them
+	core_deletedIds = [],
+
+	core_version = "1.9.1",
+
+	// Save a reference to some core methods
+	core_concat = core_deletedIds.concat,
+	core_push = core_deletedIds.push,
+	core_slice = core_deletedIds.slice,
+	core_indexOf = core_deletedIds.indexOf,
+	core_toString = class2type.toString,
+	core_hasOwn = class2type.hasOwnProperty,
+	core_trim = core_version.trim,
+
+	// Define a local copy of jQuery
+	jQuery = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context, rootjQuery );
+	},
+
+	// Used for matching numbers
+	core_pnum = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,
+
+	// Used for splitting on whitespace
+	core_rnotwhite = /\S+/g,
+
+	// Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+	// A simple way to check for HTML strings
+	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+	// Strict HTML recognition (#11290: must start with <)
+	rquickExpr = /^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,
+
+	// Match a standalone tag
+	rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+	// JSON RegExp
+	rvalidchars = /^[\],:{}\s]*$/,
+	rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+	rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+	rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,
+
+	// Matches dashed string for camelizing
+	rmsPrefix = /^-ms-/,
+	rdashAlpha = /-([\da-z])/gi,
+
+	// Used by jQuery.camelCase as callback to replace()
+	fcamelCase = function( all, letter ) {
+		return letter.toUpperCase();
+	},
+
+	// The ready event handler
+	completed = function( event ) {
+
+		// readyState === "complete" is good enough for us to call the dom ready in oldIE
+		if ( document.addEventListener || event.type === "load" || document.readyState === "complete" ) {
+			detach();
+			jQuery.ready();
+		}
+	},
+	// Clean-up method for dom ready events
+	detach = function() {
+		if ( document.addEventListener ) {
+			document.removeEventListener( "DOMContentLoaded", completed, false );
+			window.removeEventListener( "load", completed, false );
+
+		} else {
+			document.detachEvent( "onreadystatechange", completed );
+			window.detachEvent( "onload", completed );
+		}
+	};
+
+jQuery.fn = jQuery.prototype = {
+	// The current version of jQuery being used
+	jquery: core_version,
+
+	constructor: jQuery,
+	init: function( selector, context, rootjQuery ) {
+		var match, elem;
+
+		// HANDLE: $(""), $(null), $(undefined), $(false)
+		if ( !selector ) {
+			return this;
+		}
+
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+				// Assume that strings that start and end with <> are HTML and skip the regex check
+				match = [ null, selector, null ];
+
+			} else {
+				match = rquickExpr.exec( selector );
+			}
+
+			// Match html or make sure no context is specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] ) {
+					context = context instanceof jQuery ? context[0] : context;
+
+					// scripts is true for back-compat
+					jQuery.merge( this, jQuery.parseHTML(
+						match[1],
+						context && context.nodeType ? context.ownerDocument || context : document,
+						true
+					) );
+
+					// HANDLE: $(html, props)
+					if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+						for ( match in context ) {
+							// Properties of context are called as methods if possible
+							if ( jQuery.isFunction( this[ match ] ) ) {
+								this[ match ]( context[ match ] );
+
+							// ...and otherwise set as attributes
+							} else {
+								this.attr( match, context[ match ] );
+							}
+						}
+					}
+
+					return this;
+
+				// HANDLE: $(#id)
+				} else {
+					elem = document.getElementById( match[2] );
+
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE and Opera return items
+						// by name instead of ID
+						if ( elem.id !== match[2] ) {
+							return rootjQuery.find( selector );
+						}
+
+						// Otherwise, we inject the element directly into the jQuery object
+						this.length = 1;
+						this[0] = elem;
+					}
+
+					this.context = document;
+					this.selector = selector;
+					return this;
+				}
+
+			// HANDLE: $(expr, $(...))
+			} else if ( !context || context.jquery ) {
+				return ( context || rootjQuery ).find( selector );
+
+			// HANDLE: $(expr, context)
+			// (which is just equivalent to: $(context).find(expr)
+			} else {
+				return this.constructor( context ).find( selector );
+			}
+
+		// HANDLE: $(DOMElement)
+		} else if ( selector.nodeType ) {
+			this.context = this[0] = selector;
+			this.length = 1;
+			return this;
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) ) {
+			return rootjQuery.ready( selector );
+		}
+
+		if ( selector.selector !== undefined ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return jQuery.makeArray( selector, this );
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The default length of a jQuery object is 0
+	length: 0,
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	toArray: function() {
+		return core_slice.call( this );
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num == null ?
+
+			// Return a 'clean' array
+			this.toArray() :
+
+			// Return just the object
+			( num < 0 ? this[ this.length + num ] : this[ num ] );
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems ) {
+
+		// Build a new jQuery matched element set
+		var ret = jQuery.merge( this.constructor(), elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+		ret.context = this.context;
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Execute a callback for every element in the matched set.
+	// (You can seed the arguments with an array of args, but this is
+	// only used internally.)
+	each: function( callback, args ) {
+		return jQuery.each( this, callback, args );
+	},
+
+	ready: function( fn ) {
+		// Add the callback
+		jQuery.ready.promise().done( fn );
+
+		return this;
+	},
+
+	slice: function() {
+		return this.pushStack( core_slice.apply( this, arguments ) );
+	},
+
+	first: function() {
+		return this.eq( 0 );
+	},
+
+	last: function() {
+		return this.eq( -1 );
+	},
+
+	eq: function( i ) {
+		var len = this.length,
+			j = +i + ( i < 0 ? len : 0 );
+		return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );
+	},
+
+	map: function( callback ) {
+		return this.pushStack( jQuery.map(this, function( elem, i ) {
+			return callback.call( elem, i, elem );
+		}));
+	},
+
+	end: function() {
+		return this.prevObject || this.constructor(null);
+	},
+
+	// For internal use only.
+	// Behaves like an Array's method, not like a jQuery method.
+	push: core_push,
+	sort: [].sort,
+	splice: [].splice
+};
+
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+	var src, copyIsArray, copy, name, options, clone,
+		target = arguments[0] || {},
+		i = 1,
+		length = arguments.length,
+		deep = false;
+
+	// Handle a deep copy situation
+	if ( typeof target === "boolean" ) {
+		deep = target;
+		target = arguments[1] || {};
+		// skip the boolean and the target
+		i = 2;
+	}
+
+	// Handle case when target is a string or something (possible in deep copy)
+	if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+		target = {};
+	}
+
+	// extend jQuery itself if only one argument is passed
+	if ( length === i ) {
+		target = this;
+		--i;
+	}
+
+	for ( ; i < length; i++ ) {
+		// Only deal with non-null/undefined values
+		if ( (options = arguments[ i ]) != null ) {
+			// Extend the base object
+			for ( name in options ) {
+				src = target[ name ];
+				copy = options[ name ];
+
+				// Prevent never-ending loop
+				if ( target === copy ) {
+					continue;
+				}
+
+				// Recurse if we're merging plain objects or arrays
+				if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+					if ( copyIsArray ) {
+						copyIsArray = false;
+						clone = src && jQuery.isArray(src) ? src : [];
+
+					} else {
+						clone = src && jQuery.isPlainObject(src) ? src : {};
+					}
+
+					// Never move original objects, clone them
+					target[ name ] = jQuery.extend( deep, clone, copy );
+
+				// Don't bring in undefined values
+				} else if ( copy !== undefined ) {
+					target[ name ] = copy;
+				}
+			}
+		}
+	}
+
+	// Return the modified object
+	return target;
+};
+
+jQuery.extend({
+	noConflict: function( deep ) {
+		if ( window.$ === jQuery ) {
+			window.$ = _$;
+		}
+
+		if ( deep && window.jQuery === jQuery ) {
+			window.jQuery = _jQuery;
+		}
+
+		return jQuery;
+	},
+
+	// Is the DOM ready to be used? Set to true once it occurs.
+	isReady: false,
+
+	// A counter to track how many items to wait for before
+	// the ready event fires. See #6781
+	readyWait: 1,
+
+	// Hold (or release) the ready event
+	holdReady: function( hold ) {
+		if ( hold ) {
+			jQuery.readyWait++;
+		} else {
+			jQuery.ready( true );
+		}
+	},
+
+	// Handle when the DOM is ready
+	ready: function( wait ) {
+
+		// Abort if there are pending holds or we're already ready
+		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+			return;
+		}
+
+		// Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+		if ( !document.body ) {
+			return setTimeout( jQuery.ready );
+		}
+
+		// Remember that the DOM is ready
+		jQuery.isReady = true;
+
+		// If a normal DOM Ready event fired, decrement, and wait if need be
+		if ( wait !== true && --jQuery.readyWait > 0 ) {
+			return;
+		}
+
+		// If there are functions bound, to execute
+		readyList.resolveWith( document, [ jQuery ] );
+
+		// Trigger any bound ready events
+		if ( jQuery.fn.trigger ) {
+			jQuery( document ).trigger("ready").off("ready");
+		}
+	},
+
+	// See test/unit/core.js for details concerning isFunction.
+	// Since version 1.3, DOM methods and functions like alert
+	// aren't supported. They return false on IE (#2968).
+	isFunction: function( obj ) {
+		return jQuery.type(obj) === "function";
+	},
+
+	isArray: Array.isArray || function( obj ) {
+		return jQuery.type(obj) === "array";
+	},
+
+	isWindow: function( obj ) {
+		return obj != null && obj == obj.window;
+	},
+
+	isNumeric: function( obj ) {
+		return !isNaN( parseFloat(obj) ) && isFinite( obj );
+	},
+
+	type: function( obj ) {
+		if ( obj == null ) {
+			return String( obj );
+		}
+		return typeof obj === "object" || typeof obj === "function" ?
+			class2type[ core_toString.call(obj) ] || "object" :
+			typeof obj;
+	},
+
+	isPlainObject: function( obj ) {
+		// Must be an Object.
+		// Because of IE, we also have to check the presence of the constructor property.
+		// Make sure that DOM nodes and window objects don't pass through, as well
+		if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+			return false;
+		}
+
+		try {
+			// Not own constructor property must be Object
+			if ( obj.constructor &&
+				!core_hasOwn.call(obj, "constructor") &&
+				!core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+				return false;
+			}
+		} catch ( e ) {
+			// IE8,9 Will throw exceptions on certain host objects #9897
+			return false;
+		}
+
+		// Own properties are enumerated firstly, so to speed up,
+		// if last one is own, then all properties are own.
+
+		var key;
+		for ( key in obj ) {}
+
+		return key === undefined || core_hasOwn.call( obj, key );
+	},
+
+	isEmptyObject: function( obj ) {
+		var name;
+		for ( name in obj ) {
+			return false;
+		}
+		return true;
+	},
+
+	error: function( msg ) {
+		throw new Error( msg );
+	},
+
+	// data: string of html
+	// context (optional): If specified, the fragment will be created in this context, defaults to document
+	// keepScripts (optional): If true, will include scripts passed in the html string
+	parseHTML: function( data, context, keepScripts ) {
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		if ( typeof context === "boolean" ) {
+			keepScripts = context;
+			context = false;
+		}
+		context = context || document;
+
+		var parsed = rsingleTag.exec( data ),
+			scripts = !keepScripts && [];
+
+		// Single tag
+		if ( parsed ) {
+			return [ context.createElement( parsed[1] ) ];
+		}
+
+		parsed = jQuery.buildFragment( [ data ], context, scripts );
+		if ( scripts ) {
+			jQuery( scripts ).remove();
+		}
+		return jQuery.merge( [], parsed.childNodes );
+	},
+
+	parseJSON: function( data ) {
+		// Attempt to parse using the native JSON parser first
+		if ( window.JSON && window.JSON.parse ) {
+			return window.JSON.parse( data );
+		}
+
+		if ( data === null ) {
+			return data;
+		}
+
+		if ( typeof data === "string" ) {
+
+			// Make sure leading/trailing whitespace is removed (IE can't handle it)
+			data = jQuery.trim( data );
+
+			if ( data ) {
+				// Make sure the incoming data is actual JSON
+				// Logic borrowed from http://json.org/json2.js
+				if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+					.replace( rvalidtokens, "]" )
+					.replace( rvalidbraces, "")) ) {
+
+					return ( new Function( "return " + data ) )();
+				}
+			}
+		}
+
+		jQuery.error( "Invalid JSON: " + data );
+	},
+
+	// Cross-browser xml parsing
+	parseXML: function( data ) {
+		var xml, tmp;
+		if ( !data || typeof data !== "string" ) {
+			return null;
+		}
+		try {
+			if ( window.DOMParser ) { // Standard
+				tmp = new DOMParser();
+				xml = tmp.parseFromString( data , "text/xml" );
+			} else { // IE
+				xml = new ActiveXObject( "Microsoft.XMLDOM" );
+				xml.async = "false";
+				xml.loadXML( data );
+			}
+		} catch( e ) {
+			xml = undefined;
+		}
+		if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+			jQuery.error( "Invalid XML: " + data );
+		}
+		return xml;
+	},
+
+	noop: function() {},
+
+	// Evaluates a script in a global context
+	// Workarounds based on findings by Jim Driscoll
+	// http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+	globalEval: function( data ) {
+		if ( data && jQuery.trim( data ) ) {
+			// We use execScript on Internet Explorer
+			// We use an anonymous function so that context is window
+			// rather than jQuery in Firefox
+			( window.execScript || function( data ) {
+				window[ "eval" ].call( window, data );
+			} )( data );
+		}
+	},
+
+	// Convert dashed to camelCase; used by the css and data modules
+	// Microsoft forgot to hump their vendor prefix (#9572)
+	camelCase: function( string ) {
+		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+	},
+
+	nodeName: function( elem, name ) {
+		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+	},
+
+	// args is for internal usage only
+	each: function( obj, callback, args ) {
+		var value,
+			i = 0,
+			length = obj.length,
+			isArray = isArraylike( obj );
+
+		if ( args ) {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.apply( obj[ i ], args );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+
+		// A special, fast, case for the most common use of each
+		} else {
+			if ( isArray ) {
+				for ( ; i < length; i++ ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			} else {
+				for ( i in obj ) {
+					value = callback.call( obj[ i ], i, obj[ i ] );
+
+					if ( value === false ) {
+						break;
+					}
+				}
+			}
+		}
+
+		return obj;
+	},
+
+	// Use native String.trim function wherever possible
+	trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+		function( text ) {
+			return text == null ?
+				"" :
+				core_trim.call( text );
+		} :
+
+		// Otherwise use our own trimming functionality
+		function( text ) {
+			return text == null ?
+				"" :
+				( text + "" ).replace( rtrim, "" );
+		},
+
+	// results is for internal usage only
+	makeArray: function( arr, results ) {
+		var ret = results || [];
+
+		if ( arr != null ) {
+			if ( isArraylike( Object(arr) ) ) {
+				jQuery.merge( ret,
+					typeof arr === "string" ?
+					[ arr ] : arr
+				);
+			} else {
+				core_push.call( ret, arr );
+			}
+		}
+
+		return ret;
+	},
+
+	inArray: function( elem, arr, i ) {
+		var len;
+
+		if ( arr ) {
+			if ( core_indexOf ) {
+				return core_indexOf.call( arr, elem, i );
+			}
+
+			len = arr.length;
+			i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+
+			for ( ; i < len; i++ ) {
+				// Skip accessing in sparse arrays
+				if ( i in arr && arr[ i ] === elem ) {
+					return i;
+				}
+			}
+		}
+
+		return -1;
+	},
+
+	merge: function( first, second ) {
+		var l = second.length,
+			i = first.length,
+			j = 0;
+
+		if ( typeof l === "number" ) {
+			for ( ; j < l; j++ ) {
+				first[ i++ ] = second[ j ];
+			}
+		} else {
+			while ( second[j] !== undefined ) {
+				first[ i++ ] = second[ j++ ];
+			}
+		}
+
+		first.length = i;
+
+		return first;
+	},
+
+	grep: function( elems, callback, inv ) {
+		var retVal,
+			ret = [],
+			i = 0,
+			length = elems.length;
+		inv = !!inv;
+
+		// Go through the array, only saving the items
+		// that pass the validator function
+		for ( ; i < length; i++ ) {
+			retVal = !!callback( elems[ i ], i );
+			if ( inv !== retVal ) {
+				ret.push( elems[ i ] );
+			}
+		}
+
+		return ret;
+	},
+
+	// arg is for internal usage only
+	map: function( elems, callback, arg ) {
+		var value,
+			i = 0,
+			length = elems.length,
+			isArray = isArraylike( elems ),
+			ret = [];
+
+		// Go through the array, translating each of the items to their
+		if ( isArray ) {
+			for ( ; i < length; i++ ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+
+		// Go through every key on the object,
+		} else {
+			for ( i in elems ) {
+				value = callback( elems[ i ], i, arg );
+
+				if ( value != null ) {
+					ret[ ret.length ] = value;
+				}
+			}
+		}
+
+		// Flatten any nested arrays
+		return core_concat.apply( [], ret );
+	},
+
+	// A global GUID counter for objects
+	guid: 1,
+
+	// Bind a function to a context, optionally partially applying any
+	// arguments.
+	proxy: function( fn, context ) {
+		var args, proxy, tmp;
+
+		if ( typeof context === "string" ) {
+			tmp = fn[ context ];
+			context = fn;
+			fn = tmp;
+		}
+
+		// Quick check to determine if target is callable, in the spec
+		// this throws a TypeError, but we will just return undefined.
+		if ( !jQuery.isFunction( fn ) ) {
+			return undefined;
+		}
+
+		// Simulated bind
+		args = core_slice.call( arguments, 2 );
+		proxy = function() {
+			return fn.apply( context || this, args.concat( core_slice.call( arguments ) ) );
+		};
+
+		// Set the guid of unique handler to the same of original handler, so it can be removed
+		proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+		return proxy;
+	},
+
+	// Multifunctional method to get and set values of a collection
+	// The value/s can optionally be executed if it's a function
+	access: function( elems, fn, key, value, chainable, emptyGet, raw ) {
+		var i = 0,
+			length = elems.length,
+			bulk = key == null;
+
+		// Sets many values
+		if ( jQuery.type( key ) === "object" ) {
+			chainable = true;
+			for ( i in key ) {
+				jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );
+			}
+
+		// Sets one value
+		} else if ( value !== undefined ) {
+			chainable = true;
+
+			if ( !jQuery.isFunction( value ) ) {
+				raw = true;
+			}
+
+			if ( bulk ) {
+				// Bulk operations run against the entire set
+				if ( raw ) {
+					fn.call( elems, value );
+					fn = null;
+
+				// ...except when executing function values
+				} else {
+					bulk = fn;
+					fn = function( elem, key, value ) {
+						return bulk.call( jQuery( elem ), value );
+					};
+				}
+			}
+
+			if ( fn ) {
+				for ( ; i < length; i++ ) {
+					fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );
+				}
+			}
+		}
+
+		return chainable ?
+			elems :
+
+			// Gets
+			bulk ?
+				fn.call( elems ) :
+				length ? fn( elems[0], key ) : emptyGet;
+	},
+
+	now: function() {
+		return ( new Date() ).getTime();
+	}
+});
+
+jQuery.ready.promise = function( obj ) {
+	if ( !readyList ) {
+
+		readyList = jQuery.Deferred();
+
+		// Catch cases where $(document).ready() is called after the browser event has already occurred.
+		// we once tried to use readyState "interactive" here, but it caused issues like the one
+		// discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+		if ( document.readyState === "complete" ) {
+			// Handle it asynchronously to allow scripts the opportunity to delay ready
+			setTimeout( jQuery.ready );
+
+		// Standards-based browsers support DOMContentLoaded
+		} else if ( document.addEventListener ) {
+			// Use the handy event callback
+			document.addEventListener( "DOMContentLoaded", completed, false );
+
+			// A fallback to window.onload, that will always work
+			window.addEventListener( "load", completed, false );
+
+		// If IE event model is used
+		} else {
+			// Ensure firing before onload, maybe late but safe also for iframes
+			document.attachEvent( "onreadystatechange", completed );
+
+			// A fallback to window.onload, that will always work
+			window.attachEvent( "onload", completed );
+
+			// If IE and not a frame
+			// continually check to see if the document is ready
+			var top = false;
+
+			try {
+				top = window.frameElement == null && document.documentElement;
+			} catch(e) {}
+
+			if ( top && top.doScroll ) {
+				(function doScrollCheck() {
+					if ( !jQuery.isReady ) {
+
+						try {
+							// Use the trick by Diego Perini
+							// http://javascript.nwbox.com/IEContentLoaded/
+							top.doScroll("left");
+						} catch(e) {
+							return setTimeout( doScrollCheck, 50 );
+						}
+
+						// detach all dom ready events
+						detach();
+
+						// and execute any waiting functions
+						jQuery.ready();
+					}
+				})();
+			}
+		}
+	}
+	return readyList.promise( obj );
+};
+
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {
+	class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
+
+function isArraylike( obj ) {
+	var length = obj.length,
+		type = jQuery.type( obj );
+
+	if ( jQuery.isWindow( obj ) ) {
+		return false;
+	}
+
+	if ( obj.nodeType === 1 && length ) {
+		return true;
+	}
+
+	return type === "array" || type !== "function" &&
+		( length === 0 ||
+		typeof length === "number" && length > 0 && ( length - 1 ) in obj );
+}
+
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+	var object = optionsCache[ options ] = {};
+	jQuery.each( options.match( core_rnotwhite ) || [], function( _, flag ) {
+		object[ flag ] = true;
+	});
+	return object;
+}
+
+/*
+ * Create a callback list using the following parameters:
+ *
+ *	options: an optional list of space-separated options that will change how
+ *			the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ *	once:			will ensure the callback list can only be fired once (like a Deferred)
+ *
+ *	memory:			will keep track of previous values and will call any callback added
+ *					after the list has been fired right away with the latest "memorized"
+ *					values (like a Deferred)
+ *
+ *	unique:			will ensure a callback can only be added once (no duplicate in the list)
+ *
+ *	stopOnFalse:	interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
+
+	// Convert options from String-formatted to Object-formatted if needed
+	// (we check in cache first)
+	options = typeof options === "string" ?
+		( optionsCache[ options ] || createOptions( options ) ) :
+		jQuery.extend( {}, options );
+
+	var // Flag to know if list is currently firing
+		firing,
+		// Last fire value (for non-forgettable lists)
+		memory,
+		// Flag to know if list was already fired
+		fired,
+		// End of the loop when firing
+		firingLength,
+		// Index of currently firing callback (modified by remove if needed)
+		firingIndex,
+		// First callback to fire (used internally by add and fireWith)
+		firingStart,
+		// Actual callback list
+		list = [],
+		// Stack of fire calls for repeatable lists
+		stack = !options.once && [],
+		// Fire callbacks
+		fire = function( data ) {
+			memory = options.memory && data;
+			fired = true;
+			firingIndex = firingStart || 0;
+			firingStart = 0;
+			firingLength = list.length;
+			firing = true;
+			for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+				if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+					memory = false; // To prevent further calls using add
+					break;
+				}
+			}
+			firing = false;
+			if ( list ) {
+				if ( stack ) {
+					if ( stack.length ) {
+						fire( stack.shift() );
+					}
+				} else if ( memory ) {
+					list = [];
+				} else {
+					self.disable();
+				}
+			}
+		},
+		// Actual Callbacks object
+		self = {
+			// Add a callback or a collection of callbacks to the list
+			add: function() {
+				if ( list ) {
+					// First, we save the current length
+					var start = list.length;
+					(function add( args ) {
+						jQuery.each( args, function( _, arg ) {
+							var type = jQuery.type( arg );
+							if ( type === "function" ) {
+								if ( !options.unique || !self.has( arg ) ) {
+									list.push( arg );
+								}
+							} else if ( arg && arg.length && type !== "string" ) {
+								// Inspect recursively
+								add( arg );
+							}
+						});
+					})( arguments );
+					// Do we need to add the callbacks to the
+					// current firing batch?
+					if ( firing ) {
+						firingLength = list.length;
+					// With memory, if we're not firing then
+					// we should call right away
+					} else if ( memory ) {
+						firingStart = start;
+						fire( memory );
+					}
+				}
+				return this;
+			},
+			// Remove a callback from the list
+			remove: function() {
+				if ( list ) {
+					jQuery.each( arguments, function( _, arg ) {
+						var index;
+						while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+							list.splice( index, 1 );
+							// Handle firing indexes
+							if ( firing ) {
+								if ( index <= firingLength ) {
+									firingLength--;
+								}
+								if ( index <= firingIndex ) {
+									firingIndex--;
+								}
+							}
+						}
+					});
+				}
+				return this;
+			},
+			// Check if a given callback is in the list.
+			// If no argument is given, return whether or not list has callbacks attached.
+			has: function( fn ) {
+				return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );
+			},
+			// Remove all callbacks from the list
+			empty: function() {
+				list = [];
+				return this;
+			},
+			// Have the list do nothing anymore
+			disable: function() {
+				list = stack = memory = undefined;
+				return this;
+			},
+			// Is it disabled?
+			disabled: function() {
+				return !list;
+			},
+			// Lock the list in its current state
+			lock: function() {
+				stack = undefined;
+				if ( !memory ) {
+					self.disable();
+				}
+				return this;
+			},
+			// Is it locked?
+			locked: function() {
+				return !stack;
+			},
+			// Call all callbacks with the given context and arguments
+			fireWith: function( context, args ) {
+				args = args || [];
+				args = [ context, args.slice ? args.slice() : args ];
+				if ( list && ( !fired || stack ) ) {
+					if ( firing ) {
+						stack.push( args );
+					} else {
+						fire( args );
+					}
+				}
+				return this;
+			},
+			// Call all the callbacks with the given arguments
+			fire: function() {
+				self.fireWith( this, arguments );
+				return this;
+			},
+			// To know if the callbacks have already been called at least once
+			fired: function() {
+				return !!fired;
+			}
+		};
+
+	return self;
+};
+jQuery.extend({
+
+	Deferred: function( func ) {
+		var tuples = [
+				// action, add listener, listener list, final state
+				[ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+				[ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+				[ "notify", "progress", jQuery.Callbacks("memory") ]
+			],
+			state = "pending",
+			promise = {
+				state: function() {
+					return state;
+				},
+				always: function() {
+					deferred.done( arguments ).fail( arguments );
+					return this;
+				},
+				then: function( /* fnDone, fnFail, fnProgress */ ) {
+					var fns = arguments;
+					return jQuery.Deferred(function( newDefer ) {
+						jQuery.each( tuples, function( i, tuple ) {
+							var action = tuple[ 0 ],
+								fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];
+							// deferred[ done | fail | progress ] for forwarding actions to newDefer
+							deferred[ tuple[1] ](function() {
+								var returned = fn && fn.apply( this, arguments );
+								if ( returned && jQuery.isFunction( returned.promise ) ) {
+									returned.promise()
+										.done( newDefer.resolve )
+										.fail( newDefer.reject )
+										.progress( newDefer.notify );
+								} else {
+									newDefer[ action + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );
+								}
+							});
+						});
+						fns = null;
+					}).promise();
+				},
+				// Get a promise for this deferred
+				// If obj is provided, the promise aspect is added to the object
+				promise: function( obj ) {
+					return obj != null ? jQuery.extend( obj, promise ) : promise;
+				}
+			},
+			deferred = {};
+
+		// Keep pipe for back-compat
+		promise.pipe = promise.then;
+
+		// Add list-specific methods
+		jQuery.each( tuples, function( i, tuple ) {
+			var list = tuple[ 2 ],
+				stateString = tuple[ 3 ];
+
+			// promise[ done | fail | progress ] = list.add
+			promise[ tuple[1] ] = list.add;
+
+			// Handle state
+			if ( stateString ) {
+				list.add(function() {
+					// state = [ resolved | rejected ]
+					state = stateString;
+
+				// [ reject_list | resolve_list ].disable; progress_list.lock
+				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+			}
+
+			// deferred[ resolve | reject | notify ]
+			deferred[ tuple[0] ] = function() {
+				deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );
+				return this;
+			};
+			deferred[ tuple[0] + "With" ] = list.fireWith;
+		});
+
+		// Make the deferred a promise
+		promise.promise( deferred );
+
+		// Call given func if any
+		if ( func ) {
+			func.call( deferred, deferred );
+		}
+
+		// All done!
+		return deferred;
+	},
+
+	// Deferred helper
+	when: function( subordinate /* , ..., subordinateN */ ) {
+		var i = 0,
+			resolveValues = core_slice.call( arguments ),
+			length = resolveValues.length,
+
+			// the count of uncompleted subordinates
+			remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
+
+			// the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
+
+			// Update function for both resolve and progress values
+			updateFunc = function( i, contexts, values ) {
+				return function( value ) {
+					contexts[ i ] = this;
+					values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+					if( values === progressValues ) {
+						deferred.notifyWith( contexts, values );
+					} else if ( !( --remaining ) ) {
+						deferred.resolveWith( contexts, values );
+					}
+				};
+			},
+
+			progressValues, progressContexts, resolveContexts;
+
+		// add listeners to Deferred subordinates; treat others as resolved
+		if ( length > 1 ) {
+			progressValues = new Array( length );
+			progressContexts = new Array( length );
+			resolveContexts = new Array( length );
+			for ( ; i < length; i++ ) {
+				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+					resolveValues[ i ].promise()
+						.done( updateFunc( i, resolveContexts, resolveValues ) )
+						.fail( deferred.reject )
+						.progress( updateFunc( i, progressContexts, progressValues ) );
+				} else {
+					--remaining;
+				}
+			}
+		}
+
+		// if we're not waiting on anything, resolve the master
+		if ( !remaining ) {
+			deferred.resolveWith( resolveContexts, resolveValues );
+		}
+
+		return deferred.promise();
+	}
+});
+jQuery.support = (function() {
+
+	var support, all, a,
+		input, select, fragment,
+		opt, eventName, isSupported, i,
+		div = document.createElement("div");
+
+	// Setup
+	div.setAttribute( "className", "t" );
+	div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+	// Support tests won't run in some limited or non-browser environments
+	all = div.getElementsByTagName("*");
+	a = div.getElementsByTagName("a")[ 0 ];
+	if ( !all || !a || !all.length ) {
+		return {};
+	}
+
+	// First batch of tests
+	select = document.createElement("select");
+	opt = select.appendChild( document.createElement("option") );
+	input = div.getElementsByTagName("input")[ 0 ];
+
+	a.style.cssText = "top:1px;float:left;opacity:.5";
+	support = {
+		// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+		getSetAttribute: div.className !== "t",
+
+		// IE strips leading whitespace when .innerHTML is used
+		leadingWhitespace: div.firstChild.nodeType === 3,
+
+		// Make sure that tbody elements aren't automatically inserted
+		// IE will insert them into empty tables
+		tbody: !div.getElementsByTagName("tbody").length,
+
+		// Make sure that link elements get serialized correctly by innerHTML
+		// This requires a wrapper element in IE
+		htmlSerialize: !!div.getElementsByTagName("link").length,
+
+		// Get the style information from getAttribute
+		// (IE uses .cssText instead)
+		style: /top/.test( a.getAttribute("style") ),
+
+		// Make sure that URLs aren't manipulated
+		// (IE normalizes it by default)
+		hrefNormalized: a.getAttribute("href") === "/a",
+
+		// Make sure that element opacity exists
+		// (IE uses filter instead)
+		// Use a regex to work around a WebKit issue. See #5145
+		opacity: /^0.5/.test( a.style.opacity ),
+
+		// Verify style float existence
+		// (IE uses styleFloat instead of cssFloat)
+		cssFloat: !!a.style.cssFloat,
+
+		// Check the default checkbox/radio value ("" on WebKit; "on" elsewhere)
+		checkOn: !!input.value,
+
+		// Make sure that a selected-by-default option has a working selected property.
+		// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+		optSelected: opt.selected,
+
+		// Tests for enctype support on a form (#6743)
+		enctype: !!document.createElement("form").enctype,
+
+		// Makes sure cloning an html5 element does not cause problems
+		// Where outerHTML is undefined, this still works
+		html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+		// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+		boxModel: document.compatMode === "CSS1Compat",
+
+		// Will be defined later
+		deleteExpando: true,
+		noCloneEvent: true,
+		inlineBlockNeedsLayout: false,
+		shrinkWrapBlocks: false,
+		reliableMarginRight: true,
+		boxSizingReliable: true,
+		pixelPosition: false
+	};
+
+	// Make sure checked status is properly cloned
+	input.checked = true;
+	support.noCloneChecked = input.cloneNode( true ).checked;
+
+	// Make sure that the options inside disabled selects aren't marked as disabled
+	// (WebKit marks them as disabled)
+	select.disabled = true;
+	support.optDisabled = !opt.disabled;
+
+	// Support: IE<9
+	try {
+		delete div.test;
+	} catch( e ) {
+		support.deleteExpando = false;
+	}
+
+	// Check if we can trust getAttribute("value")
+	input = document.createElement("input");
+	input.setAttribute( "value", "" );
+	support.input = input.getAttribute( "value" ) === "";
+
+	// Check if an input maintains its value after becoming a radio
+	input.value = "t";
+	input.setAttribute( "type", "radio" );
+	support.radioValue = input.value === "t";
+
+	// #11217 - WebKit loses check when the name is after the checked attribute
+	input.setAttribute( "checked", "t" );
+	input.setAttribute( "name", "t" );
+
+	fragment = document.createDocumentFragment();
+	fragment.appendChild( input );
+
+	// Check if a disconnected checkbox will retain its checked
+	// value of true after appended to the DOM (IE6/7)
+	support.appendChecked = input.checked;
+
+	// WebKit doesn't clone checked state correctly in fragments
+	support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+	// Support: IE<9
+	// Opera does not clone events (and typeof div.attachEvent === undefined).
+	// IE9-10 clones events bound via attachEvent, but they don't trigger with .click()
+	if ( div.attachEvent ) {
+		div.attachEvent( "onclick", function() {
+			support.noCloneEvent = false;
+		});
+
+		div.cloneNode( true ).click();
+	}
+
+	// Support: IE<9 (lack submit/change bubble), Firefox 17+ (lack focusin event)
+	// Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP), test/csp.php
+	for ( i in { submit: true, change: true, focusin: true }) {
+		div.setAttribute( eventName = "on" + i, "t" );
+
+		support[ i + "Bubbles" ] = eventName in window || div.attributes[ eventName ].expando === false;
+	}
+
+	div.style.backgroundClip = "content-box";
+	div.cloneNode( true ).style.backgroundClip = "";
+	support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+	// Run tests that need a body at doc ready
+	jQuery(function() {
+		var container, marginDiv, tds,
+			divReset = "padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",
+			body = document.getElementsByTagName("body")[0];
+
+		if ( !body ) {
+			// Return for frameset docs that don't have a body
+			return;
+		}
+
+		container = document.createElement("div");
+		container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px";
+
+		body.appendChild( container ).appendChild( div );
+
+		// Support: IE8
+		// Check if table cells still have offsetWidth/Height when they are set
+		// to display:none and there are still other visible table cells in a
+		// table row; if so, offsetWidth/Height are not reliable for use when
+		// determining if an element has been hidden directly using
+		// display:none (it is still safe to use offsets if a parent element is
+		// hidden; don safety goggles and see bug #4512 for more information).
+		div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+		tds = div.getElementsByTagName("td");
+		tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+		isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+		tds[ 0 ].style.display = "";
+		tds[ 1 ].style.display = "none";
+
+		// Support: IE8
+		// Check if empty table cells still have offsetWidth/Height
+		support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+		// Check box-sizing and margin behavior
+		div.innerHTML = "";
+		div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+		support.boxSizing = ( div.offsetWidth === 4 );
+		support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+		// Use window.getComputedStyle because jsdom on node.js will break without it.
+		if ( window.getComputedStyle ) {
+			support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+			support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
+
+			// Check if div with explicit width and no margin-right incorrectly
+			// gets computed margin-right based on width of container. (#3333)
+			// Fails in WebKit before Feb 2011 nightlies
+			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+			marginDiv = div.appendChild( document.createElement("div") );
+			marginDiv.style.cssText = div.style.cssText = divReset;
+			marginDiv.style.marginRight = marginDiv.style.width = "0";
+			div.style.width = "1px";
+
+			support.reliableMarginRight =
+				!parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+		}
+
+		if ( typeof div.style.zoom !== core_strundefined ) {
+			// Support: IE<8
+			// Check if natively block-level elements act like inline-block
+			// elements when setting their display to 'inline' and giving
+			// them layout
+			div.innerHTML = "";
+			div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+			support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+			// Support: IE6
+			// Check if elements with layout shrink-wrap their children
+			div.style.display = "block";
+			div.innerHTML = "<div></div>";
+			div.firstChild.style.width = "5px";
+			support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+			if ( support.inlineBlockNeedsLayout ) {
+				// Prevent IE 6 from affecting layout for positioned elements #11048
+				// Prevent IE from shrinking the body in IE 7 mode #12869
+				// Support: IE<8
+				body.style.zoom = 1;
+			}
+		}
+
+		body.removeChild( container );
+
+		// Null elements to avoid leaks in IE
+		container = div = tds = marginDiv = null;
+	});
+
+	// Null elements to avoid leaks in IE
+	all = select = fragment = opt = a = input = null;
+
+	return support;
+})();
+
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+	rmultiDash = /([A-Z])/g;
+
+function internalData( elem, name, data, pvt /* Internal Use Only */ ){
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var thisCache, ret,
+		internalKey = jQuery.expando,
+		getByName = typeof name === "string",
+
+		// We have to handle DOM nodes and JS objects differently because IE6-7
+		// can't GC object references properly across the DOM-JS boundary
+		isNode = elem.nodeType,
+
+		// Only DOM nodes need the global jQuery cache; JS object data is
+		// attached directly to the object so GC can occur automatically
+		cache = isNode ? jQuery.cache : elem,
+
+		// Only defining an ID for JS objects if its cache already exists allows
+		// the code to shortcut on the same path as a DOM node with no cache
+		id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
+
+	// Avoid doing any more work than we need to when trying to get data on an
+	// object that has no data at all
+	if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+		return;
+	}
+
+	if ( !id ) {
+		// Only DOM nodes need a new unique ID for each element since their data
+		// ends up in the global cache
+		if ( isNode ) {
+			elem[ internalKey ] = id = core_deletedIds.pop() || jQuery.guid++;
+		} else {
+			id = internalKey;
+		}
+	}
+
+	if ( !cache[ id ] ) {
+		cache[ id ] = {};
+
+		// Avoids exposing jQuery metadata on plain JS objects when the object
+		// is serialized using JSON.stringify
+		if ( !isNode ) {
+			cache[ id ].toJSON = jQuery.noop;
+		}
+	}
+
+	// An object can be passed to jQuery.data instead of a key/value pair; this gets
+	// shallow copied over onto the existing cache
+	if ( typeof name === "object" || typeof name === "function" ) {
+		if ( pvt ) {
+			cache[ id ] = jQuery.extend( cache[ id ], name );
+		} else {
+			cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+		}
+	}
+
+	thisCache = cache[ id ];
+
+	// jQuery data() is stored in a separate object inside the object's internal data
+	// cache in order to avoid key collisions between internal data and user-defined
+	// data.
+	if ( !pvt ) {
+		if ( !thisCache.data ) {
+			thisCache.data = {};
+		}
+
+		thisCache = thisCache.data;
+	}
+
+	if ( data !== undefined ) {
+		thisCache[ jQuery.camelCase( name ) ] = data;
+	}
+
+	// Check for both converted-to-camel and non-converted data property names
+	// If a data property was specified
+	if ( getByName ) {
+
+		// First Try to find as-is property data
+		ret = thisCache[ name ];
+
+		// Test for null|undefined property data
+		if ( ret == null ) {
+
+			// Try to find the camelCased property
+			ret = thisCache[ jQuery.camelCase( name ) ];
+		}
+	} else {
+		ret = thisCache;
+	}
+
+	return ret;
+}
+
+function internalRemoveData( elem, name, pvt ) {
+	if ( !jQuery.acceptData( elem ) ) {
+		return;
+	}
+
+	var i, l, thisCache,
+		isNode = elem.nodeType,
+
+		// See jQuery.data for more information
+		cache = isNode ? jQuery.cache : elem,
+		id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
+
+	// If there is already no cache entry for this object, there is no
+	// purpose in continuing
+	if ( !cache[ id ] ) {
+		return;
+	}
+
+	if ( name ) {
+
+		thisCache = pvt ? cache[ id ] : cache[ id ].data;
+
+		if ( thisCache ) {
+
+			// Support array or space separated string names for data keys
+			if ( !jQuery.isArray( name ) ) {
+
+				// try the string as a key before any manipulation
+				if ( name in thisCache ) {
+					name = [ name ];
+				} else {
+
+					// split the camel cased version by spaces unless a key with the spaces exists
+					name = jQuery.camelCase( name );
+					if ( name in thisCache ) {
+						name = [ name ];
+					} else {
+						name = name.split(" ");
+					}
+				}
+			} else {
+				// If "name" is an array of keys...
+				// When data is initially created, via ("key", "val") signature,
+				// keys will be converted to camelCase.
+				// Since there is no way to tell _how_ a key was added, remove
+				// both plain key and camelCase key. #12786
+				// This will only penalize the array argument path.
+				name = name.concat( jQuery.map( name, jQuery.camelCase ) );
+			}
+
+			for ( i = 0, l = name.length; i < l; i++ ) {
+				delete thisCache[ name[i] ];
+			}
+
+			// If there is no data left in the cache, we want to continue
+			// and let the cache object itself get destroyed
+			if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+				return;
+			}
+		}
+	}
+
+	// See jQuery.data for more information
+	if ( !pvt ) {
+		delete cache[ id ].data;
+
+		// Don't destroy the parent cache unless the internal data object
+		// had been the only thing left in it
+		if ( !isEmptyDataObject( cache[ id ] ) ) {
+			return;
+		}
+	}
+
+	// Destroy the cache
+	if ( isNode ) {
+		jQuery.cleanData( [ elem ], true );
+
+	// Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+	} else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+		delete cache[ id ];
+
+	// When all else fails, null
+	} else {
+		cache[ id ] = null;
+	}
+}
+
+jQuery.extend({
+	cache: {},
+
+	// Unique for each copy of jQuery on the page
+	// Non-digits removed to match rinlinejQuery
+	expando: "jQuery" + ( core_version + Math.random() ).replace( /\D/g, "" ),
+
+	// The following elements throw uncatchable exceptions if you
+	// attempt to add expando properties to them.
+	noData: {
+		"embed": true,
+		// Ban all objects except for Flash (which handle expandos)
+		"object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+		"applet": true
+	},
+
+	hasData: function( elem ) {
+		elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+		return !!elem && !isEmptyDataObject( elem );
+	},
+
+	data: function( elem, name, data ) {
+		return internalData( elem, name, data );
+	},
+
+	removeData: function( elem, name ) {
+		return internalRemoveData( elem, name );
+	},
+
+	// For internal use only.
+	_data: function( elem, name, data ) {
+		return internalData( elem, name, data, true );
+	},
+
+	_removeData: function( elem, name ) {
+		return internalRemoveData( elem, name, true );
+	},
+
+	// A method for determining if a DOM node can handle the data expando
+	acceptData: function( elem ) {
+		// Do not set data on non-element because it will not be cleared (#8335).
+		if ( elem.nodeType && elem.nodeType !== 1 && elem.nodeType !== 9 ) {
+			return false;
+		}
+
+		var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
+
+		// nodes accept data unless otherwise specified; rejection can be conditional
+		return !noData || noData !== true && elem.getAttribute("classid") === noData;
+	}
+});
+
+jQuery.fn.extend({
+	data: function( key, value ) {
+		var attrs, name,
+			elem = this[0],
+			i = 0,
+			data = null;
+
+		// Gets all values
+		if ( key === undefined ) {
+			if ( this.length ) {
+				data = jQuery.data( elem );
+
+				if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+					attrs = elem.attributes;
+					for ( ; i < attrs.length; i++ ) {
+						name = attrs[i].name;
+
+						if ( !name.indexOf( "data-" ) ) {
+							name = jQuery.camelCase( name.slice(5) );
+
+							dataAttr( elem, name, data[ name ] );
+						}
+					}
+					jQuery._data( elem, "parsedAttrs", true );
+				}
+			}
+
+			return data;
+		}
+
+		// Sets multiple values
+		if ( typeof key === "object" ) {
+			return this.each(function() {
+				jQuery.data( this, key );
+			});
+		}
+
+		return jQuery.access( this, function( value ) {
+
+			if ( value === undefined ) {
+				// Try to fetch any internally stored data first
+				return elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : null;
+			}
+
+			this.each(function() {
+				jQuery.data( this, key, value );
+			});
+		}, null, value, arguments.length > 1, null, true );
+	},
+
+	removeData: function( key ) {
+		return this.each(function() {
+			jQuery.removeData( this, key );
+		});
+	}
+});
+
+function dataAttr( elem, key, data ) {
+	// If nothing was found internally, try to fetch any
+	// data from the HTML5 data-* attribute
+	if ( data === undefined && elem.nodeType === 1 ) {
+
+		var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
+
+		data = elem.getAttribute( name );
+
+		if ( typeof data === "string" ) {
+			try {
+				data = data === "true" ? true :
+					data === "false" ? false :
+					data === "null" ? null :
+					// Only convert to a number if it doesn't change the string
+					+data + "" === data ? +data :
+					rbrace.test( data ) ? jQuery.parseJSON( data ) :
+						data;
+			} catch( e ) {}
+
+			// Make sure we set the data so it isn't changed later
+			jQuery.data( elem, key, data );
+
+		} else {
+			data = undefined;
+		}
+	}
+
+	return data;
+}
+
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+	var name;
+	for ( name in obj ) {
+
+		// if the public data object is empty, the private is still empty
+		if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+			continue;
+		}
+		if ( name !== "toJSON" ) {
+			return false;
+		}
+	}
+
+	return true;
+}
+jQuery.extend({
+	queue: function( elem, type, data ) {
+		var queue;
+
+		if ( elem ) {
+			type = ( type || "fx" ) + "queue";
+			queue = jQuery._data( elem, type );
+
+			// Speed up dequeue by getting out quickly if this is just a lookup
+			if ( data ) {
+				if ( !queue || jQuery.isArray(data) ) {
+					queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+				} else {
+					queue.push( data );
+				}
+			}
+			return queue || [];
+		}
+	},
+
+	dequeue: function( elem, type ) {
+		type = type || "fx";
+
+		var queue = jQuery.queue( elem, type ),
+			startLength = queue.length,
+			fn = queue.shift(),
+			hooks = jQuery._queueHooks( elem, type ),
+			next = function() {
+				jQuery.dequeue( elem, type );
+			};
+
+		// If the fx queue is dequeued, always remove the progress sentinel
+		if ( fn === "inprogress" ) {
+			fn = queue.shift();
+			startLength--;
+		}
+
+		hooks.cur = fn;
+		if ( fn ) {
+
+			// Add a progress sentinel to prevent the fx queue from being
+			// automatically dequeued
+			if ( type === "fx" ) {
+				queue.unshift( "inprogress" );
+			}
+
+			// clear up the last queue stop function
+			delete hooks.stop;
+			fn.call( elem, next, hooks );
+		}
+
+		if ( !startLength && hooks ) {
+			hooks.empty.fire();
+		}
+	},
+
+	// not intended for public consumption - generates a queueHooks object, or returns the current one
+	_queueHooks: function( elem, type ) {
+		var key = type + "queueHooks";
+		return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+			empty: jQuery.Callbacks("once memory").add(function() {
+				jQuery._removeData( elem, type + "queue" );
+				jQuery._removeData( elem, key );
+			})
+		});
+	}
+});
+
+jQuery.fn.extend({
+	queue: function( type, data ) {
+		var setter = 2;
+
+		if ( typeof type !== "string" ) {
+			data = type;
+			type = "fx";
+			setter--;
+		}
+
+		if ( arguments.length < setter ) {
+			return jQuery.queue( this[0], type );
+		}
+
+		return data === undefined ?
+			this :
+			this.each(function() {
+				var queue = jQuery.queue( this, type, data );
+
+				// ensure a hooks for this queue
+				jQuery._queueHooks( this, type );
+
+				if ( type === "fx" && queue[0] !== "inprogress" ) {
+					jQuery.dequeue( this, type );
+				}
+			});
+	},
+	dequeue: function( type ) {
+		return this.each(function() {
+			jQuery.dequeue( this, type );
+		});
+	},
+	// Based off of the plugin by Clint Helfers, with permission.
+	// http://blindsignals.com/index.php/2009/07/jquery-delay/
+	delay: function( time, type ) {
+		time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+		type = type || "fx";
+
+		return this.queue( type, function( next, hooks ) {
+			var timeout = setTimeout( next, time );
+			hooks.stop = function() {
+				clearTimeout( timeout );
+			};
+		});
+	},
+	clearQueue: function( type ) {
+		return this.queue( type || "fx", [] );
+	},
+	// Get a promise resolved when queues of a certain type
+	// are emptied (fx is the type by default)
+	promise: function( type, obj ) {
+		var tmp,
+			count = 1,
+			defer = jQuery.Deferred(),
+			elements = this,
+			i = this.length,
+			resolve = function() {
+				if ( !( --count ) ) {
+					defer.resolveWith( elements, [ elements ] );
+				}
+			};
+
+		if ( typeof type !== "string" ) {
+			obj = type;
+			type = undefined;
+		}
+		type = type || "fx";
+
+		while( i-- ) {
+			tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+			if ( tmp && tmp.empty ) {
+				count++;
+				tmp.empty.add( resolve );
+			}
+		}
+		resolve();
+		return defer.promise( obj );
+	}
+});
+var nodeHook, boolHook,
+	rclass = /[\t\r\n]/g,
+	rreturn = /\r/g,
+	rfocusable = /^(?:input|select|textarea|button|object)$/i,
+	rclickable = /^(?:a|area)$/i,
+	rboolean = /^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,
+	ruseDefault = /^(?:checked|selected)$/i,
+	getSetAttribute = jQuery.support.getSetAttribute,
+	getSetInput = jQuery.support.input;
+
+jQuery.fn.extend({
+	attr: function( name, value ) {
+		return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+	},
+
+	removeAttr: function( name ) {
+		return this.each(function() {
+			jQuery.removeAttr( this, name );
+		});
+	},
+
+	prop: function( name, value ) {
+		return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+	},
+
+	removeProp: function( name ) {
+		name = jQuery.propFix[ name ] || name;
+		return this.each(function() {
+			// try/catch handles cases where IE balks (such as removing a property on window)
+			try {
+				this[ name ] = undefined;
+				delete this[ name ];
+			} catch( e ) {}
+		});
+	},
+
+	addClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).addClass( value.call( this, j, this.className ) );
+			});
+		}
+
+		if ( proceed ) {
+			// The disjunction here is for better compressibility (see removeClass)
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					" "
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
+							cur += clazz + " ";
+						}
+					}
+					elem.className = jQuery.trim( cur );
+
+				}
+			}
+		}
+
+		return this;
+	},
+
+	removeClass: function( value ) {
+		var classes, elem, cur, clazz, j,
+			i = 0,
+			len = this.length,
+			proceed = arguments.length === 0 || typeof value === "string" && value;
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( j ) {
+				jQuery( this ).removeClass( value.call( this, j, this.className ) );
+			});
+		}
+		if ( proceed ) {
+			classes = ( value || "" ).match( core_rnotwhite ) || [];
+
+			for ( ; i < len; i++ ) {
+				elem = this[ i ];
+				// This expression is here for better compressibility (see addClass)
+				cur = elem.nodeType === 1 && ( elem.className ?
+					( " " + elem.className + " " ).replace( rclass, " " ) :
+					""
+				);
+
+				if ( cur ) {
+					j = 0;
+					while ( (clazz = classes[j++]) ) {
+						// Remove *all* instances
+						while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {
+							cur = cur.replace( " " + clazz + " ", " " );
+						}
+					}
+					elem.className = value ? jQuery.trim( cur ) : "";
+				}
+			}
+		}
+
+		return this;
+	},
+
+	toggleClass: function( value, stateVal ) {
+		var type = typeof value,
+			isBool = typeof stateVal === "boolean";
+
+		if ( jQuery.isFunction( value ) ) {
+			return this.each(function( i ) {
+				jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+			});
+		}
+
+		return this.each(function() {
+			if ( type === "string" ) {
+				// toggle individual class names
+				var className,
+					i = 0,
+					self = jQuery( this ),
+					state = stateVal,
+					classNames = value.match( core_rnotwhite ) || [];
+
+				while ( (className = classNames[ i++ ]) ) {
+					// check each className given, space separated list
+					state = isBool ? state : !self.hasClass( className );
+					self[ state ? "addClass" : "removeClass" ]( className );
+				}
+
+			// Toggle whole class name
+			} else if ( type === core_strundefined || type === "boolean" ) {
+				if ( this.className ) {
+					// store className if set
+					jQuery._data( this, "__className__", this.className );
+				}
+
+				// If the element has a class name or if we're passed "false",
+				// then remove the whole classname (if there was one, the above saved it).
+				// Otherwise bring back whatever was previously saved (if anything),
+				// falling back to the empty string if nothing was stored.
+				this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+			}
+		});
+	},
+
+	hasClass: function( selector ) {
+		var className = " " + selector + " ",
+			i = 0,
+			l = this.length;
+		for ( ; i < l; i++ ) {
+			if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {
+				return true;
+			}
+		}
+
+		return false;
+	},
+
+	val: function( value ) {
+		var ret, hooks, isFunction,
+			elem = this[0];
+
+		if ( !arguments.length ) {
+			if ( elem ) {
+				hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
+
+				if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
+					return ret;
+				}
+
+				ret = elem.value;
+
+				return typeof ret === "string" ?
+					// handle most common string cases
+					ret.replace(rreturn, "") :
+					// handle cases where value is null/undef or number
+					ret == null ? "" : ret;
+			}
+
+			return;
+		}
+
+		isFunction = jQuery.isFunction( value );
+
+		return this.each(function( i ) {
+			var val,
+				self = jQuery(this);
+
+			if ( this.nodeType !== 1 ) {
+				return;
+			}
+
+			if ( isFunction ) {
+				val = value.call( this, i, self.val() );
+			} else {
+				val = value;
+			}
+
+			// Treat null/undefined as ""; convert numbers to string
+			if ( val == null ) {
+				val = "";
+			} else if ( typeof val === "number" ) {
+				val += "";
+			} else if ( jQuery.isArray( val ) ) {
+				val = jQuery.map(val, function ( value ) {
+					return value == null ? "" : value + "";
+				});
+			}
+
+			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
+
+			// If set returns undefined, fall back to normal setting
+			if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+				this.value = val;
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	valHooks: {
+		option: {
+			get: function( elem ) {
+				// attributes.value is undefined in Blackberry 4.7 but
+				// uses .value. See #6932
+				var val = elem.attributes.value;
+				return !val || val.specified ? elem.value : elem.text;
+			}
+		},
+		select: {
+			get: function( elem ) {
+				var value, option,
+					options = elem.options,
+					index = elem.selectedIndex,
+					one = elem.type === "select-one" || index < 0,
+					values = one ? null : [],
+					max = one ? index + 1 : options.length,
+					i = index < 0 ?
+						max :
+						one ? index : 0;
+
+				// Loop through all the selected options
+				for ( ; i < max; i++ ) {
+					option = options[ i ];
+
+					// oldIE doesn't update selected after form reset (#2551)
+					if ( ( option.selected || i === index ) &&
+							// Don't return options that are disabled or in a disabled optgroup
+							( jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null ) &&
+							( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {
+
+						// Get the specific value for the option
+						value = jQuery( option ).val();
+
+						// We don't need an array for one selects
+						if ( one ) {
+							return value;
+						}
+
+						// Multi-Selects return an array
+						values.push( value );
+					}
+				}
+
+				return values;
+			},
+
+			set: function( elem, value ) {
+				var values = jQuery.makeArray( value );
+
+				jQuery(elem).find("option").each(function() {
+					this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+				});
+
+				if ( !values.length ) {
+					elem.selectedIndex = -1;
+				}
+				return values;
+			}
+		}
+	},
+
+	attr: function( elem, name, value ) {
+		var hooks, notxml, ret,
+			nType = elem.nodeType;
+
+		// don't get/set attributes on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		// Fallback to prop when attributes are not supported
+		if ( typeof elem.getAttribute === core_strundefined ) {
+			return jQuery.prop( elem, name, value );
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		// All attributes are lowercase
+		// Grab necessary hook if one is defined
+		if ( notxml ) {
+			name = name.toLowerCase();
+			hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+		}
+
+		if ( value !== undefined ) {
+
+			if ( value === null ) {
+				jQuery.removeAttr( elem, name );
+
+			} else if ( hooks && notxml && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				elem.setAttribute( name, value + "" );
+				return value;
+			}
+
+		} else if ( hooks && notxml && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+			return ret;
+
+		} else {
+
+			// In IE9+, Flash objects don't have .getAttribute (#12945)
+			// Support: IE9+
+			if ( typeof elem.getAttribute !== core_strundefined ) {
+				ret =  elem.getAttribute( name );
+			}
+
+			// Non-existent attributes return null, we normalize to undefined
+			return ret == null ?
+				undefined :
+				ret;
+		}
+	},
+
+	removeAttr: function( elem, value ) {
+		var name, propName,
+			i = 0,
+			attrNames = value && value.match( core_rnotwhite );
+
+		if ( attrNames && elem.nodeType === 1 ) {
+			while ( (name = attrNames[i++]) ) {
+				propName = jQuery.propFix[ name ] || name;
+
+				// Boolean attributes get special treatment (#10870)
+				if ( rboolean.test( name ) ) {
+					// Set corresponding property to false for boolean attributes
+					// Also clear defaultChecked/defaultSelected (if appropriate) for IE<8
+					if ( !getSetAttribute && ruseDefault.test( name ) ) {
+						elem[ jQuery.camelCase( "default-" + name ) ] =
+							elem[ propName ] = false;
+					} else {
+						elem[ propName ] = false;
+					}
+
+				// See #9699 for explanation of this approach (setting first, then removal)
+				} else {
+					jQuery.attr( elem, name, "" );
+				}
+
+				elem.removeAttribute( getSetAttribute ? name : propName );
+			}
+		}
+	},
+
+	attrHooks: {
+		type: {
+			set: function( elem, value ) {
+				if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+					// Setting the type on a radio button after the value resets the value in IE6-9
+					// Reset value to default in case type is set after value during creation
+					var val = elem.value;
+					elem.setAttribute( "type", value );
+					if ( val ) {
+						elem.value = val;
+					}
+					return value;
+				}
+			}
+		}
+	},
+
+	propFix: {
+		tabindex: "tabIndex",
+		readonly: "readOnly",
+		"for": "htmlFor",
+		"class": "className",
+		maxlength: "maxLength",
+		cellspacing: "cellSpacing",
+		cellpadding: "cellPadding",
+		rowspan: "rowSpan",
+		colspan: "colSpan",
+		usemap: "useMap",
+		frameborder: "frameBorder",
+		contenteditable: "contentEditable"
+	},
+
+	prop: function( elem, name, value ) {
+		var ret, hooks, notxml,
+			nType = elem.nodeType;
+
+		// don't get/set properties on text, comment and attribute nodes
+		if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+			return;
+		}
+
+		notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
+
+		if ( notxml ) {
+			// Fix name and attach hooks
+			name = jQuery.propFix[ name ] || name;
+			hooks = jQuery.propHooks[ name ];
+		}
+
+		if ( value !== undefined ) {
+			if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+				return ret;
+
+			} else {
+				return ( elem[ name ] = value );
+			}
+
+		} else {
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+				return ret;
+
+			} else {
+				return elem[ name ];
+			}
+		}
+	},
+
+	propHooks: {
+		tabIndex: {
+			get: function( elem ) {
+				// elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+				var attributeNode = elem.getAttributeNode("tabindex");
+
+				return attributeNode && attributeNode.specified ?
+					parseInt( attributeNode.value, 10 ) :
+					rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+						0 :
+						undefined;
+			}
+		}
+	}
+});
+
+// Hook for boolean attributes
+boolHook = {
+	get: function( elem, name ) {
+		var
+			// Use .prop to determine if this attribute is understood as boolean
+			prop = jQuery.prop( elem, name ),
+
+			// Fetch it accordingly
+			attr = typeof prop === "boolean" && elem.getAttribute( name ),
+			detail = typeof prop === "boolean" ?
+
+				getSetInput && getSetAttribute ?
+					attr != null :
+					// oldIE fabricates an empty string for missing boolean attributes
+					// and conflates checked/selected into attroperties
+					ruseDefault.test( name ) ?
+						elem[ jQuery.camelCase( "default-" + name ) ] :
+						!!attr :
+
+				// fetch an attribute node for properties not recognized as boolean
+				elem.getAttributeNode( name );
+
+		return detail && detail.value !== false ?
+			name.toLowerCase() :
+			undefined;
+	},
+	set: function( elem, value, name ) {
+		if ( value === false ) {
+			// Remove boolean attributes when set to false
+			jQuery.removeAttr( elem, name );
+		} else if ( getSetInput && getSetAttribute || !ruseDefault.test( name ) ) {
+			// IE<8 needs the *property* name
+			elem.setAttribute( !getSetAttribute && jQuery.propFix[ name ] || name, name );
+
+		// Use defaultChecked and defaultSelected for oldIE
+		} else {
+			elem[ jQuery.camelCase( "default-" + name ) ] = elem[ name ] = true;
+		}
+
+		return name;
+	}
+};
+
+// fix oldIE value attroperty
+if ( !getSetInput || !getSetAttribute ) {
+	jQuery.attrHooks.value = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			return jQuery.nodeName( elem, "input" ) ?
+
+				// Ignore the value *property* by using defaultValue
+				elem.defaultValue :
+
+				ret && ret.specified ? ret.value : undefined;
+		},
+		set: function( elem, value, name ) {
+			if ( jQuery.nodeName( elem, "input" ) ) {
+				// Does not return so that setAttribute is also used
+				elem.defaultValue = value;
+			} else {
+				// Use nodeHook if defined (#1954); otherwise setAttribute is fine
+				return nodeHook && nodeHook.set( elem, value, name );
+			}
+		}
+	};
+}
+
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
+
+	// Use this for any attribute in IE6/7
+	// This fixes almost every IE6/7 issue
+	nodeHook = jQuery.valHooks.button = {
+		get: function( elem, name ) {
+			var ret = elem.getAttributeNode( name );
+			return ret && ( name === "id" || name === "name" || name === "coords" ? ret.value !== "" : ret.specified ) ?
+				ret.value :
+				undefined;
+		},
+		set: function( elem, value, name ) {
+			// Set the existing or create a new attribute node
+			var ret = elem.getAttributeNode( name );
+			if ( !ret ) {
+				elem.setAttributeNode(
+					(ret = elem.ownerDocument.createAttribute( name ))
+				);
+			}
+
+			ret.value = value += "";
+
+			// Break association with cloned elements by also using setAttribute (#9646)
+			return name === "value" || value === elem.getAttribute( name ) ?
+				value :
+				undefined;
+		}
+	};
+
+	// Set contenteditable to false on removals(#10429)
+	// Setting to empty string throws an error as an invalid value
+	jQuery.attrHooks.contenteditable = {
+		get: nodeHook.get,
+		set: function( elem, value, name ) {
+			nodeHook.set( elem, value === "" ? false : value, name );
+		}
+	};
+
+	// Set width and height to auto instead of 0 on empty string( Bug #8150 )
+	// This is for removals
+	jQuery.each([ "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			set: function( elem, value ) {
+				if ( value === "" ) {
+					elem.setAttribute( name, "auto" );
+					return value;
+				}
+			}
+		});
+	});
+}
+
+
+// Some attributes require a special call on IE
+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+if ( !jQuery.support.hrefNormalized ) {
+	jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+		jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+			get: function( elem ) {
+				var ret = elem.getAttribute( name, 2 );
+				return ret == null ? undefined : ret;
+			}
+		});
+	});
+
+	// href/src property should get the full normalized URL (#10299/#12915)
+	jQuery.each([ "href", "src" ], function( i, name ) {
+		jQuery.propHooks[ name ] = {
+			get: function( elem ) {
+				return elem.getAttribute( name, 4 );
+			}
+		};
+	});
+}
+
+if ( !jQuery.support.style ) {
+	jQuery.attrHooks.style = {
+		get: function( elem ) {
+			// Return undefined in the case of empty string
+			// Note: IE uppercases css property names, but if we were to .toLowerCase()
+			// .cssText, that would destroy case senstitivity in URL's, like in "background"
+			return elem.style.cssText || undefined;
+		},
+		set: function( elem, value ) {
+			return ( elem.style.cssText = value + "" );
+		}
+	};
+}
+
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+	jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+		get: function( elem ) {
+			var parent = elem.parentNode;
+
+			if ( parent ) {
+				parent.selectedIndex;
+
+				// Make sure that it also works with optgroups, see #5701
+				if ( parent.parentNode ) {
+					parent.parentNode.selectedIndex;
+				}
+			}
+			return null;
+		}
+	});
+}
+
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+	jQuery.propFix.enctype = "encoding";
+}
+
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+	jQuery.each([ "radio", "checkbox" ], function() {
+		jQuery.valHooks[ this ] = {
+			get: function( elem ) {
+				// Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+				return elem.getAttribute("value") === null ? "on" : elem.value;
+			}
+		};
+	});
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+	jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+		set: function( elem, value ) {
+			if ( jQuery.isArray( value ) ) {
+				return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+			}
+		}
+	});
+});
+var rformElems = /^(?:input|select|textarea)$/i,
+	rkeyEvent = /^key/,
+	rmouseEvent = /^(?:mouse|contextmenu)|click/,
+	rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+	rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;
+
+function returnTrue() {
+	return true;
+}
+
+function returnFalse() {
+	return false;
+}
+
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
+
+	global: {},
+
+	add: function( elem, types, handler, data, selector ) {
+		var tmp, events, t, handleObjIn,
+			special, eventHandle, handleObj,
+			handlers, type, namespaces, origType,
+			elemData = jQuery._data( elem );
+
+		// Don't attach events to noData or text/comment nodes (but allow plain objects)
+		if ( !elemData ) {
+			return;
+		}
+
+		// Caller can pass in an object of custom data in lieu of the handler
+		if ( handler.handler ) {
+			handleObjIn = handler;
+			handler = handleObjIn.handler;
+			selector = handleObjIn.selector;
+		}
+
+		// Make sure that the handler has a unique ID, used to find/remove it later
+		if ( !handler.guid ) {
+			handler.guid = jQuery.guid++;
+		}
+
+		// Init the element's event structure and main handler, if this is the first
+		if ( !(events = elemData.events) ) {
+			events = elemData.events = {};
+		}
+		if ( !(eventHandle = elemData.handle) ) {
+			eventHandle = elemData.handle = function( e ) {
+				// Discard the second event of a jQuery.event.trigger() and
+				// when an event is called after a page has unloaded
+				return typeof jQuery !== core_strundefined && (!e || jQuery.event.triggered !== e.type) ?
+					jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+					undefined;
+			};
+			// Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+			eventHandle.elem = elem;
+		}
+
+		// Handle multiple events separated by a space
+		// jQuery(...).bind("mouseover mouseout", fn);
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tmp[1];
+			namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+			// If event changes its type, use the special event handlers for the changed type
+			special = jQuery.event.special[ type ] || {};
+
+			// If selector defined, determine special event api type, otherwise given type
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+
+			// Update special based on newly reset type
+			special = jQuery.event.special[ type ] || {};
+
+			// handleObj is passed to all event handlers
+			handleObj = jQuery.extend({
+				type: type,
+				origType: origType,
+				data: data,
+				handler: handler,
+				guid: handler.guid,
+				selector: selector,
+				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
+				namespace: namespaces.join(".")
+			}, handleObjIn );
+
+			// Init the event handler queue if we're the first
+			if ( !(handlers = events[ type ]) ) {
+				handlers = events[ type ] = [];
+				handlers.delegateCount = 0;
+
+				// Only use addEventListener/attachEvent if the special events handler returns false
+				if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+					// Bind the global event handler to the element
+					if ( elem.addEventListener ) {
+						elem.addEventListener( type, eventHandle, false );
+
+					} else if ( elem.attachEvent ) {
+						elem.attachEvent( "on" + type, eventHandle );
+					}
+				}
+			}
+
+			if ( special.add ) {
+				special.add.call( elem, handleObj );
+
+				if ( !handleObj.handler.guid ) {
+					handleObj.handler.guid = handler.guid;
+				}
+			}
+
+			// Add to the element's handler list, delegates in front
+			if ( selector ) {
+				handlers.splice( handlers.delegateCount++, 0, handleObj );
+			} else {
+				handlers.push( handleObj );
+			}
+
+			// Keep track of which events have ever been used, for event optimization
+			jQuery.event.global[ type ] = true;
+		}
+
+		// Nullify elem to prevent memory leaks in IE
+		elem = null;
+	},
+
+	// Detach an event or set of events from an element
+	remove: function( elem, types, handler, selector, mappedTypes ) {
+		var j, handleObj, tmp,
+			origCount, t, events,
+			special, handlers, type,
+			namespaces, origType,
+			elemData = jQuery.hasData( elem ) && jQuery._data( elem );
+
+		if ( !elemData || !(events = elemData.events) ) {
+			return;
+		}
+
+		// Once for each type.namespace in types; type may be omitted
+		types = ( types || "" ).match( core_rnotwhite ) || [""];
+		t = types.length;
+		while ( t-- ) {
+			tmp = rtypenamespace.exec( types[t] ) || [];
+			type = origType = tmp[1];
+			namespaces = ( tmp[2] || "" ).split( "." ).sort();
+
+			// Unbind all events (on this namespace, if provided) for the element
+			if ( !type ) {
+				for ( type in events ) {
+					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
+				}
+				continue;
+			}
+
+			special = jQuery.event.special[ type ] || {};
+			type = ( selector ? special.delegateType : special.bindType ) || type;
+			handlers = events[ type ] || [];
+			tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );
+
+			// Remove matching events
+			origCount = j = handlers.length;
+			while ( j-- ) {
+				handleObj = handlers[ j ];
+
+				if ( ( mappedTypes || origType === handleObj.origType ) &&
+					( !handler || handler.guid === handleObj.guid ) &&
+					( !tmp || tmp.test( handleObj.namespace ) ) &&
+					( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+					handlers.splice( j, 1 );
+
+					if ( handleObj.selector ) {
+						handlers.delegateCount--;
+					}
+					if ( special.remove ) {
+						special.remove.call( elem, handleObj );
+					}
+				}
+			}
+
+			// Remove generic event handler if we removed something and no more handlers exist
+			// (avoids potential for endless recursion during removal of special event handlers)
+			if ( origCount && !handlers.length ) {
+				if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+					jQuery.removeEvent( elem, type, elemData.handle );
+				}
+
+				delete events[ type ];
+			}
+		}
+
+		// Remove the expando if it's no longer used
+		if ( jQuery.isEmptyObject( events ) ) {
+			delete elemData.handle;
+
+			// removeData also checks for emptiness and clears the expando if empty
+			// so use it instead of delete
+			jQuery._removeData( elem, "events" );
+		}
+	},
+
+	trigger: function( event, data, elem, onlyHandlers ) {
+		var handle, ontype, cur,
+			bubbleType, special, tmp, i,
+			eventPath = [ elem || document ],
+			type = core_hasOwn.call( event, "type" ) ? event.type : event,
+			namespaces = core_hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];
+
+		cur = tmp = elem = elem || document;
+
+		// Don't do events on text and comment nodes
+		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
+			return;
+		}
+
+		// focus/blur morphs to focusin/out; ensure we're not firing them right now
+		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+			return;
+		}
+
+		if ( type.indexOf(".") >= 0 ) {
+			// Namespaced trigger; create a regexp to match event type in handle()
+			namespaces = type.split(".");
+			type = namespaces.shift();
+			namespaces.sort();
+		}
+		ontype = type.indexOf(":") < 0 && "on" + type;
+
+		// Caller can pass in a jQuery.Event object, Object, or just an event type string
+		event = event[ jQuery.expando ] ?
+			event :
+			new jQuery.Event( type, typeof event === "object" && event );
+
+		event.isTrigger = true;
+		event.namespace = namespaces.join(".");
+		event.namespace_re = event.namespace ?
+			new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :
+			null;
+
+		// Clean up the event in case it is being reused
+		event.result = undefined;
+		if ( !event.target ) {
+			event.target = elem;
+		}
+
+		// Clone any incoming data and prepend the event, creating the handler arg list
+		data = data == null ?
+			[ event ] :
+			jQuery.makeArray( data, [ event ] );
+
+		// Allow special events to draw outside the lines
+		special = jQuery.event.special[ type ] || {};
+		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
+			return;
+		}
+
+		// Determine event propagation path in advance, per W3C events spec (#9951)
+		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+			bubbleType = special.delegateType || type;
+			if ( !rfocusMorph.test( bubbleType + type ) ) {
+				cur = cur.parentNode;
+			}
+			for ( ; cur; cur = cur.parentNode ) {
+				eventPath.push( cur );
+				tmp = cur;
+			}
+
+			// Only add window if we got to document (e.g., not plain obj or detached DOM)
+			if ( tmp === (elem.ownerDocument || document) ) {
+				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
+			}
+		}
+
+		// Fire handlers on the event path
+		i = 0;
+		while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {
+
+			event.type = i > 1 ?
+				bubbleType :
+				special.bindType || type;
+
+			// jQuery handler
+			handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+			if ( handle ) {
+				handle.apply( cur, data );
+			}
+
+			// Native handler
+			handle = ontype && cur[ ontype ];
+			if ( handle && jQuery.acceptData( cur ) && handle.apply && handle.apply( cur, data ) === false ) {
+				event.preventDefault();
+			}
+		}
+		event.type = type;
+
+		// If nobody prevented the default action, do it now
+		if ( !onlyHandlers && !event.isDefaultPrevented() ) {
+
+			if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+				!(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
+
+				// Call a native DOM method on the target with the same name name as the event.
+				// Can't use an .isFunction() check here because IE6/7 fails that test.
+				// Don't do default actions on window, that's where global variables be (#6170)
+				if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) {
+
+					// Don't re-trigger an onFOO event when we call its FOO() method
+					tmp = elem[ ontype ];
+
+					if ( tmp ) {
+						elem[ ontype ] = null;
+					}
+
+					// Prevent re-triggering of the same event, since we already bubbled it above
+					jQuery.event.triggered = type;
+					try {
+						elem[ type ]();
+					} catch ( e ) {
+						// IE<9 dies on focus/blur to hidden element (#1486,#12518)
+						// only reproducible on winXP IE8 native, not IE9 in IE8 mode
+					}
+					jQuery.event.triggered = undefined;
+
+					if ( tmp ) {
+						elem[ ontype ] = tmp;
+					}
+				}
+			}
+		}
+
+		return event.result;
+	},
+
+	dispatch: function( event ) {
+
+		// Make a writable jQuery.Event from the native event object
+		event = jQuery.event.fix( event );
+
+		var i, ret, handleObj, matched, j,
+			handlerQueue = [],
+			args = core_slice.call( arguments ),
+			handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [],
+			special = jQuery.event.special[ event.type ] || {};
+
+		// Use the fix-ed jQuery.Event rather than the (read-only) native event
+		args[0] = event;
+		event.delegateTarget = this;
+
+		// Call the preDispatch hook for the mapped type, and let it bail if desired
+		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+			return;
+		}
+
+		// Determine handlers
+		handlerQueue = jQuery.event.handlers.call( this, event, handlers );
+
+		// Run delegates first; they may want to stop propagation beneath us
+		i = 0;
+		while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {
+			event.currentTarget = matched.elem;
+
+			j = 0;
+			while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {
+
+				// Triggered event must either 1) have no namespace, or
+				// 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+				if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {
+
+					event.handleObj = handleObj;
+					event.data = handleObj.data;
+
+					ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+							.apply( matched.elem, args );
+
+					if ( ret !== undefined ) {
+						if ( (event.result = ret) === false ) {
+							event.preventDefault();
+							event.stopPropagation();
+						}
+					}
+				}
+			}
+		}
+
+		// Call the postDispatch hook for the mapped type
+		if ( special.postDispatch ) {
+			special.postDispatch.call( this, event );
+		}
+
+		return event.result;
+	},
+
+	handlers: function( event, handlers ) {
+		var sel, handleObj, matches, i,
+			handlerQueue = [],
+			delegateCount = handlers.delegateCount,
+			cur = event.target;
+
+		// Find delegate handlers
+		// Black-hole SVG <use> instance trees (#13180)
+		// Avoid non-left-click bubbling in Firefox (#3861)
+		if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {
+
+			for ( ; cur != this; cur = cur.parentNode || this ) {
+
+				// Don't check non-elements (#13208)
+				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+				if ( cur.nodeType === 1 && (cur.disabled !== true || event.type !== "click") ) {
+					matches = [];
+					for ( i = 0; i < delegateCount; i++ ) {
+						handleObj = handlers[ i ];
+
+						// Don't conflict with Object.prototype properties (#13203)
+						sel = handleObj.selector + " ";
+
+						if ( matches[ sel ] === undefined ) {
+							matches[ sel ] = handleObj.needsContext ?
+								jQuery( sel, this ).index( cur ) >= 0 :
+								jQuery.find( sel, this, null, [ cur ] ).length;
+						}
+						if ( matches[ sel ] ) {
+							matches.push( handleObj );
+						}
+					}
+					if ( matches.length ) {
+						handlerQueue.push({ elem: cur, handlers: matches });
+					}
+				}
+			}
+		}
+
+		// Add the remaining (directly-bound) handlers
+		if ( delegateCount < handlers.length ) {
+			handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });
+		}
+
+		return handlerQueue;
+	},
+
+	fix: function( event ) {
+		if ( event[ jQuery.expando ] ) {
+			return event;
+		}
+
+		// Create a writable copy of the event object and normalize some properties
+		var i, prop, copy,
+			type = event.type,
+			originalEvent = event,
+			fixHook = this.fixHooks[ type ];
+
+		if ( !fixHook ) {
+			this.fixHooks[ type ] = fixHook =
+				rmouseEvent.test( type ) ? this.mouseHooks :
+				rkeyEvent.test( type ) ? this.keyHooks :
+				{};
+		}
+		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
+
+		event = new jQuery.Event( originalEvent );
+
+		i = copy.length;
+		while ( i-- ) {
+			prop = copy[ i ];
+			event[ prop ] = originalEvent[ prop ];
+		}
+
+		// Support: IE<9
+		// Fix target property (#1925)
+		if ( !event.target ) {
+			event.target = originalEvent.srcElement || document;
+		}
+
+		// Support: Chrome 23+, Safari?
+		// Target should not be a text node (#504, #13143)
+		if ( event.target.nodeType === 3 ) {
+			event.target = event.target.parentNode;
+		}
+
+		// Support: IE<9
+		// For mouse/key events, metaKey==false if it's undefined (#3368, #11328)
+		event.metaKey = !!event.metaKey;
+
+		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
+	},
+
+	// Includes some event props shared by KeyEvent and MouseEvent
+	props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
+
+	fixHooks: {},
+
+	keyHooks: {
+		props: "char charCode key keyCode".split(" "),
+		filter: function( event, original ) {
+
+			// Add which for key events
+			if ( event.which == null ) {
+				event.which = original.charCode != null ? original.charCode : original.keyCode;
+			}
+
+			return event;
+		}
+	},
+
+	mouseHooks: {
+		props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+		filter: function( event, original ) {
+			var body, eventDoc, doc,
+				button = original.button,
+				fromElement = original.fromElement;
+
+			// Calculate pageX/Y if missing and clientX/Y available
+			if ( event.pageX == null && original.clientX != null ) {
+				eventDoc = event.target.ownerDocument || document;
+				doc = eventDoc.documentElement;
+				body = eventDoc.body;
+
+				event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+				event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+			}
+
+			// Add relatedTarget, if necessary
+			if ( !event.relatedTarget && fromElement ) {
+				event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+			}
+
+			// Add which for click: 1 === left; 2 === middle; 3 === right
+			// Note: button is not normalized, so don't use it
+			if ( !event.which && button !== undefined ) {
+				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
+			}
+
+			return event;
+		}
+	},
+
+	special: {
+		load: {
+			// Prevent triggered image.load events from bubbling to window.load
+			noBubble: true
+		},
+		click: {
+			// For checkbox, fire native event so checked state will be right
+			trigger: function() {
+				if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) {
+					this.click();
+					return false;
+				}
+			}
+		},
+		focus: {
+			// Fire native event if possible so blur/focus sequence is correct
+			trigger: function() {
+				if ( this !== document.activeElement && this.focus ) {
+					try {
+						this.focus();
+						return false;
+					} catch ( e ) {
+						// Support: IE<9
+						// If we error on focus to hidden element (#1486, #12518),
+						// let .trigger() run the handlers
+					}
+				}
+			},
+			delegateType: "focusin"
+		},
+		blur: {
+			trigger: function() {
+				if ( this === document.activeElement && this.blur ) {
+					this.blur();
+					return false;
+				}
+			},
+			delegateType: "focusout"
+		},
+
+		beforeunload: {
+			postDispatch: function( event ) {
+
+				// Even when returnValue equals to undefined Firefox will still show alert
+				if ( event.result !== undefined ) {
+					event.originalEvent.returnValue = event.result;
+				}
+			}
+		}
+	},
+
+	simulate: function( type, elem, event, bubble ) {
+		// Piggyback on a donor event to simulate a different one.
+		// Fake originalEvent to avoid donor's stopPropagation, but if the
+		// simulated event prevents default then we do the same on the donor.
+		var e = jQuery.extend(
+			new jQuery.Event(),
+			event,
+			{ type: type,
+				isSimulated: true,
+				originalEvent: {}
+			}
+		);
+		if ( bubble ) {
+			jQuery.event.trigger( e, null, elem );
+		} else {
+			jQuery.event.dispatch.call( elem, e );
+		}
+		if ( e.isDefaultPrevented() ) {
+			event.preventDefault();
+		}
+	}
+};
+
+jQuery.removeEvent = document.removeEventListener ?
+	function( elem, type, handle ) {
+		if ( elem.removeEventListener ) {
+			elem.removeEventListener( type, handle, false );
+		}
+	} :
+	function( elem, type, handle ) {
+		var name = "on" + type;
+
+		if ( elem.detachEvent ) {
+
+			// #8545, #7054, preventing memory leaks for custom events in IE6-8
+			// detachEvent needed property on element, by name of that event, to properly expose it to GC
+			if ( typeof elem[ name ] === core_strundefined ) {
+				elem[ name ] = null;
+			}
+
+			elem.detachEvent( name, handle );
+		}
+	};
+
+jQuery.Event = function( src, props ) {
+	// Allow instantiation without the 'new' keyword
+	if ( !(this instanceof jQuery.Event) ) {
+		return new jQuery.Event( src, props );
+	}
+
+	// Event object
+	if ( src && src.type ) {
+		this.originalEvent = src;
+		this.type = src.type;
+
+		// Events bubbling up the document may have been marked as prevented
+		// by a handler lower down the tree; reflect the correct value.
+		this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+			src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
+
+	// Event type
+	} else {
+		this.type = src;
+	}
+
+	// Put explicitly provided properties onto the event object
+	if ( props ) {
+		jQuery.extend( this, props );
+	}
+
+	// Create a timestamp if incoming event doesn't have one
+	this.timeStamp = src && src.timeStamp || jQuery.now();
+
+	// Mark it as fixed
+	this[ jQuery.expando ] = true;
+};
+
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+	isDefaultPrevented: returnFalse,
+	isPropagationStopped: returnFalse,
+	isImmediatePropagationStopped: returnFalse,
+
+	preventDefault: function() {
+		var e = this.originalEvent;
+
+		this.isDefaultPrevented = returnTrue;
+		if ( !e ) {
+			return;
+		}
+
+		// If preventDefault exists, run it on the original event
+		if ( e.preventDefault ) {
+			e.preventDefault();
+
+		// Support: IE
+		// Otherwise set the returnValue property of the original event to false
+		} else {
+			e.returnValue = false;
+		}
+	},
+	stopPropagation: function() {
+		var e = this.originalEvent;
+
+		this.isPropagationStopped = returnTrue;
+		if ( !e ) {
+			return;
+		}
+		// If stopPropagation exists, run it on the original event
+		if ( e.stopPropagation ) {
+			e.stopPropagation();
+		}
+
+		// Support: IE
+		// Set the cancelBubble property of the original event to true
+		e.cancelBubble = true;
+	},
+	stopImmediatePropagation: function() {
+		this.isImmediatePropagationStopped = returnTrue;
+		this.stopPropagation();
+	}
+};
+
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+	mouseenter: "mouseover",
+	mouseleave: "mouseout"
+}, function( orig, fix ) {
+	jQuery.event.special[ orig ] = {
+		delegateType: fix,
+		bindType: fix,
+
+		handle: function( event ) {
+			var ret,
+				target = this,
+				related = event.relatedTarget,
+				handleObj = event.handleObj;
+
+			// For mousenter/leave call the handler if related is outside the target.
+			// NB: No relatedTarget if the mouse left/entered the browser window
+			if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+				event.type = handleObj.origType;
+				ret = handleObj.handler.apply( this, arguments );
+				event.type = fix;
+			}
+			return ret;
+		}
+	};
+});
+
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
+
+	jQuery.event.special.submit = {
+		setup: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Lazy-add a submit handler when a descendant form may potentially be submitted
+			jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+				// Node name check avoids a VML-related crash in IE (#9807)
+				var elem = e.target,
+					form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+				if ( form && !jQuery._data( form, "submitBubbles" ) ) {
+					jQuery.event.add( form, "submit._submit", function( event ) {
+						event._submit_bubble = true;
+					});
+					jQuery._data( form, "submitBubbles", true );
+				}
+			});
+			// return undefined since we don't need an event listener
+		},
+
+		postDispatch: function( event ) {
+			// If form was submitted by the user, bubble the event up the tree
+			if ( event._submit_bubble ) {
+				delete event._submit_bubble;
+				if ( this.parentNode && !event.isTrigger ) {
+					jQuery.event.simulate( "submit", this.parentNode, event, true );
+				}
+			}
+		},
+
+		teardown: function() {
+			// Only need this for delegated form submit events
+			if ( jQuery.nodeName( this, "form" ) ) {
+				return false;
+			}
+
+			// Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+			jQuery.event.remove( this, "._submit" );
+		}
+	};
+}
+
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
+
+	jQuery.event.special.change = {
+
+		setup: function() {
+
+			if ( rformElems.test( this.nodeName ) ) {
+				// IE doesn't fire change on a check/radio until blur; trigger it on click
+				// after a propertychange. Eat the blur-change in special.change.handle.
+				// This still fires onchange a second time for check/radio after blur.
+				if ( this.type === "checkbox" || this.type === "radio" ) {
+					jQuery.event.add( this, "propertychange._change", function( event ) {
+						if ( event.originalEvent.propertyName === "checked" ) {
+							this._just_changed = true;
+						}
+					});
+					jQuery.event.add( this, "click._change", function( event ) {
+						if ( this._just_changed && !event.isTrigger ) {
+							this._just_changed = false;
+						}
+						// Allow triggered, simulated change events (#11500)
+						jQuery.event.simulate( "change", this, event, true );
+					});
+				}
+				return false;
+			}
+			// Delegated event; lazy-add a change handler on descendant inputs
+			jQuery.event.add( this, "beforeactivate._change", function( e ) {
+				var elem = e.target;
+
+				if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "changeBubbles" ) ) {
+					jQuery.event.add( elem, "change._change", function( event ) {
+						if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+							jQuery.event.simulate( "change", this.parentNode, event, true );
+						}
+					});
+					jQuery._data( elem, "changeBubbles", true );
+				}
+			});
+		},
+
+		handle: function( event ) {
+			var elem = event.target;
+
+			// Swallow native change events from checkbox/radio, we already triggered them above
+			if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+				return event.handleObj.handler.apply( this, arguments );
+			}
+		},
+
+		teardown: function() {
+			jQuery.event.remove( this, "._change" );
+
+			return !rformElems.test( this.nodeName );
+		}
+	};
+}
+
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+	jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
+
+		// Attach a single capturing handler while someone wants focusin/focusout
+		var attaches = 0,
+			handler = function( event ) {
+				jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+			};
+
+		jQuery.event.special[ fix ] = {
+			setup: function() {
+				if ( attaches++ === 0 ) {
+					document.addEventListener( orig, handler, true );
+				}
+			},
+			teardown: function() {
+				if ( --attaches === 0 ) {
+					document.removeEventListener( orig, handler, true );
+				}
+			}
+		};
+	});
+}
+
+jQuery.fn.extend({
+
+	on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+		var type, origFn;
+
+		// Types can be a map of types/handlers
+		if ( typeof types === "object" ) {
+			// ( types-Object, selector, data )
+			if ( typeof selector !== "string" ) {
+				// ( types-Object, data )
+				data = data || selector;
+				selector = undefined;
+			}
+			for ( type in types ) {
+				this.on( type, selector, data, types[ type ], one );
+			}
+			return this;
+		}
+
+		if ( data == null && fn == null ) {
+			// ( types, fn )
+			fn = selector;
+			data = selector = undefined;
+		} else if ( fn == null ) {
+			if ( typeof selector === "string" ) {
+				// ( types, selector, fn )
+				fn = data;
+				data = undefined;
+			} else {
+				// ( types, data, fn )
+				fn = data;
+				data = selector;
+				selector = undefined;
+			}
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		} else if ( !fn ) {
+			return this;
+		}
+
+		if ( one === 1 ) {
+			origFn = fn;
+			fn = function( event ) {
+				// Can use an empty set, since event contains the info
+				jQuery().off( event );
+				return origFn.apply( this, arguments );
+			};
+			// Use same guid so caller can remove using origFn
+			fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+		}
+		return this.each( function() {
+			jQuery.event.add( this, types, fn, data, selector );
+		});
+	},
+	one: function( types, selector, data, fn ) {
+		return this.on( types, selector, data, fn, 1 );
+	},
+	off: function( types, selector, fn ) {
+		var handleObj, type;
+		if ( types && types.preventDefault && types.handleObj ) {
+			// ( event )  dispatched jQuery.Event
+			handleObj = types.handleObj;
+			jQuery( types.delegateTarget ).off(
+				handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+				handleObj.selector,
+				handleObj.handler
+			);
+			return this;
+		}
+		if ( typeof types === "object" ) {
+			// ( types-object [, selector] )
+			for ( type in types ) {
+				this.off( type, selector, types[ type ] );
+			}
+			return this;
+		}
+		if ( selector === false || typeof selector === "function" ) {
+			// ( types [, fn] )
+			fn = selector;
+			selector = undefined;
+		}
+		if ( fn === false ) {
+			fn = returnFalse;
+		}
+		return this.each(function() {
+			jQuery.event.remove( this, types, fn, selector );
+		});
+	},
+
+	bind: function( types, data, fn ) {
+		return this.on( types, null, data, fn );
+	},
+	unbind: function( types, fn ) {
+		return this.off( types, null, fn );
+	},
+
+	delegate: function( selector, types, data, fn ) {
+		return this.on( types, selector, data, fn );
+	},
+	undelegate: function( selector, types, fn ) {
+		// ( namespace ) or ( selector, types [, fn] )
+		return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+	},
+
+	trigger: function( type, data ) {
+		return this.each(function() {
+			jQuery.event.trigger( type, data, this );
+		});
+	},
+	triggerHandler: function( type, data ) {
+		var elem = this[0];
+		if ( elem ) {
+			return jQuery.event.trigger( type, data, elem, true );
+		}
+	}
+});
+/*!
+ * Sizzle CSS Selector Engine
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://sizzlejs.com/
+ */
+(function( window, undefined ) {
+
+var i,
+	cachedruns,
+	Expr,
+	getText,
+	isXML,
+	compile,
+	hasDuplicate,
+	outermostContext,
+
+	// Local document vars
+	setDocument,
+	document,
+	docElem,
+	documentIsXML,
+	rbuggyQSA,
+	rbuggyMatches,
+	matches,
+	contains,
+	sortOrder,
+
+	// Instance-specific data
+	expando = "sizzle" + -(new Date()),
+	preferredDoc = window.document,
+	support = {},
+	dirruns = 0,
+	done = 0,
+	classCache = createCache(),
+	tokenCache = createCache(),
+	compilerCache = createCache(),
+
+	// General-purpose constants
+	strundefined = typeof undefined,
+	MAX_NEGATIVE = 1 << 31,
+
+	// Array methods
+	arr = [],
+	pop = arr.pop,
+	push = arr.push,
+	slice = arr.slice,
+	// Use a stripped-down indexOf if we can't use a native one
+	indexOf = arr.indexOf || function( elem ) {
+		var i = 0,
+			len = this.length;
+		for ( ; i < len; i++ ) {
+			if ( this[i] === elem ) {
+				return i;
+			}
+		}
+		return -1;
+	},
+
+
+	// Regular expressions
+
+	// Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace
+	whitespace = "[\\x20\\t\\r\\n\\f]",
+	// http://www.w3.org/TR/css3-syntax/#characters
+	characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",
+
+	// Loosely modeled on CSS identifier characters
+	// An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors
+	// Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+	identifier = characterEncoding.replace( "w", "w#" ),
+
+	// Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors
+	operators = "([*^$|!~]?=)",
+	attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +
+		"*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",
+
+	// Prefer arguments quoted,
+	//   then not containing pseudos/brackets,
+	//   then attribute selectors/non-parenthetical expressions,
+	//   then anything else
+	// These preferences are here to reduce the number of selectors
+	//   needing tokenize in the PSEUDO preFilter
+	pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",
+
+	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),
+
+	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
+	rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),
+	rpseudo = new RegExp( pseudos ),
+	ridentifier = new RegExp( "^" + identifier + "$" ),
+
+	matchExpr = {
+		"ID": new RegExp( "^#(" + characterEncoding + ")" ),
+		"CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),
+		"NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),
+		"TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),
+		"ATTR": new RegExp( "^" + attributes ),
+		"PSEUDO": new RegExp( "^" + pseudos ),
+		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
+		// For use in libraries implementing .is()
+		// We use this for POS matching in `select`
+		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
+	},
+
+	rsibling = /[\x20\t\r\n\f]*[+~]/,
+
+	rnative = /^[^{]+\{\s*\[native code/,
+
+	// Easily-parseable/retrievable ID or TAG or CLASS selectors
+	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+	rinputs = /^(?:input|select|textarea|button)$/i,
+	rheader = /^h\d$/i,
+
+	rescape = /'|\\/g,
+	rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,
+
+	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+	runescape = /\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,
+	funescape = function( _, escaped ) {
+		var high = "0x" + escaped - 0x10000;
+		// NaN means non-codepoint
+		return high !== high ?
+			escaped :
+			// BMP codepoint
+			high < 0 ?
+				String.fromCharCode( high + 0x10000 ) :
+				// Supplemental Plane codepoint (surrogate pair)
+				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
+	};
+
+// Use a stripped-down slice if we can't use a native one
+try {
+	slice.call( preferredDoc.documentElement.childNodes, 0 )[0].nodeType;
+} catch ( e ) {
+	slice = function( i ) {
+		var elem,
+			results = [];
+		while ( (elem = this[i++]) ) {
+			results.push( elem );
+		}
+		return results;
+	};
+}
+
+/**
+ * For feature detection
+ * @param {Function} fn The function to test for native support
+ */
+function isNative( fn ) {
+	return rnative.test( fn + "" );
+}
+
+/**
+ * Create key-value caches of limited size
+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with
+ *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ *	deleting the oldest entry
+ */
+function createCache() {
+	var cache,
+		keys = [];
+
+	return (cache = function( key, value ) {
+		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+		if ( keys.push( key += " " ) > Expr.cacheLength ) {
+			// Only keep the most recent entries
+			delete cache[ keys.shift() ];
+		}
+		return (cache[ key ] = value);
+	});
+}
+
+/**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+function markFunction( fn ) {
+	fn[ expando ] = true;
+	return fn;
+}
+
+/**
+ * Support testing using an element
+ * @param {Function} fn Passed the created div and expects a boolean result
+ */
+function assert( fn ) {
+	var div = document.createElement("div");
+
+	try {
+		return fn( div );
+	} catch (e) {
+		return false;
+	} finally {
+		// release memory in IE
+		div = null;
+	}
+}
+
+function Sizzle( selector, context, results, seed ) {
+	var match, elem, m, nodeType,
+		// QSA vars
+		i, groups, old, nid, newContext, newSelector;
+
+	if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
+		setDocument( context );
+	}
+
+	context = context || document;
+	results = results || [];
+
+	if ( !selector || typeof selector !== "string" ) {
+		return results;
+	}
+
+	if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {
+		return [];
+	}
+
+	if ( !documentIsXML && !seed ) {
+
+		// Shortcuts
+		if ( (match = rquickExpr.exec( selector )) ) {
+			// Speed-up: Sizzle("#ID")
+			if ( (m = match[1]) ) {
+				if ( nodeType === 9 ) {
+					elem = context.getElementById( m );
+					// Check parentNode to catch when Blackberry 4.6 returns
+					// nodes that are no longer in the document #6963
+					if ( elem && elem.parentNode ) {
+						// Handle the case where IE, Opera, and Webkit return items
+						// by name instead of ID
+						if ( elem.id === m ) {
+							results.push( elem );
+							return results;
+						}
+					} else {
+						return results;
+					}
+				} else {
+					// Context is not a document
+					if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&
+						contains( context, elem ) && elem.id === m ) {
+						results.push( elem );
+						return results;
+					}
+				}
+
+			// Speed-up: Sizzle("TAG")
+			} else if ( match[2] ) {
+				push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );
+				return results;
+
+			// Speed-up: Sizzle(".CLASS")
+			} else if ( (m = match[3]) && support.getByClassName && context.getElementsByClassName ) {
+				push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );
+				return results;
+			}
+		}
+
+		// QSA path
+		if ( support.qsa && !rbuggyQSA.test(selector) ) {
+			old = true;
+			nid = expando;
+			newContext = context;
+			newSelector = nodeType === 9 && selector;
+
+			// qSA works strangely on Element-rooted queries
+			// We can work around this by specifying an extra ID on the root
+			// and working up from there (Thanks to Andrew Dupont for the technique)
+			// IE 8 doesn't work on object elements
+			if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
+				groups = tokenize( selector );
+
+				if ( (old = context.getAttribute("id")) ) {
+					nid = old.replace( rescape, "\\$&" );
+				} else {
+					context.setAttribute( "id", nid );
+				}
+				nid = "[id='" + nid + "'] ";
+
+				i = groups.length;
+				while ( i-- ) {
+					groups[i] = nid + toSelector( groups[i] );
+				}
+				newContext = rsibling.test( selector ) && context.parentNode || context;
+				newSelector = groups.join(",");
+			}
+
+			if ( newSelector ) {
+				try {
+					push.apply( results, slice.call( newContext.querySelectorAll(
+						newSelector
+					), 0 ) );
+					return results;
+				} catch(qsaError) {
+				} finally {
+					if ( !old ) {
+						context.removeAttribute("id");
+					}
+				}
+			}
+		}
+	}
+
+	// All others
+	return select( selector.replace( rtrim, "$1" ), context, results, seed );
+}
+
+/**
+ * Detect xml
+ * @param {Element|Object} elem An element or a document
+ */
+isXML = Sizzle.isXML = function( elem ) {
+	// documentElement is verified for cases where it doesn't yet exist
+	// (such as loading iframes in IE - #4833)
+	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+	return documentElement ? documentElement.nodeName !== "HTML" : false;
+};
+
+/**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+setDocument = Sizzle.setDocument = function( node ) {
+	var doc = node ? node.ownerDocument || node : preferredDoc;
+
+	// If no document and documentElement is available, return
+	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
+		return document;
+	}
+
+	// Set our document
+	document = doc;
+	docElem = doc.documentElement;
+
+	// Support tests
+	documentIsXML = isXML( doc );
+
+	// Check if getElementsByTagName("*") returns only elements
+	support.tagNameNoComments = assert(function( div ) {
+		div.appendChild( doc.createComment("") );
+		return !div.getElementsByTagName("*").length;
+	});
+
+	// Check if attributes should be retrieved by attribute nodes
+	support.attributes = assert(function( div ) {
+		div.innerHTML = "<select></select>";
+		var type = typeof div.lastChild.getAttribute("multiple");
+		// IE8 returns a string for some attributes even when not present
+		return type !== "boolean" && type !== "string";
+	});
+
+	// Check if getElementsByClassName can be trusted
+	support.getByClassName = assert(function( div ) {
+		// Opera can't find a second classname (in 9.6)
+		div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";
+		if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {
+			return false;
+		}
+
+		// Safari 3.2 caches class attributes and doesn't catch changes
+		div.lastChild.className = "e";
+		return div.getElementsByClassName("e").length === 2;
+	});
+
+	// Check if getElementById returns elements by name
+	// Check if getElementsByName privileges form controls or returns elements by ID
+	support.getByName = assert(function( div ) {
+		// Inject content
+		div.id = expando + 0;
+		div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";
+		docElem.insertBefore( div, docElem.firstChild );
+
+		// Test
+		var pass = doc.getElementsByName &&
+			// buggy browsers will return fewer than the correct 2
+			doc.getElementsByName( expando ).length === 2 +
+			// buggy browsers will return more than the correct 0
+			doc.getElementsByName( expando + 0 ).length;
+		support.getIdNotName = !doc.getElementById( expando );
+
+		// Cleanup
+		docElem.removeChild( div );
+
+		return pass;
+	});
+
+	// IE6/7 return modified attributes
+	Expr.attrHandle = assert(function( div ) {
+		div.innerHTML = "<a href='#'></a>";
+		return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&
+			div.firstChild.getAttribute("href") === "#";
+	}) ?
+		{} :
+		{
+			"href": function( elem ) {
+				return elem.getAttribute( "href", 2 );
+			},
+			"type": function( elem ) {
+				return elem.getAttribute("type");
+			}
+		};
+
+	// ID find and filter
+	if ( support.getIdNotName ) {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
+				var m = context.getElementById( id );
+				// Check parentNode to catch when Blackberry 4.6 returns
+				// nodes that are no longer in the document #6963
+				return m && m.parentNode ? [m] : [];
+			}
+		};
+		Expr.filter["ID"] = function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				return elem.getAttribute("id") === attrId;
+			};
+		};
+	} else {
+		Expr.find["ID"] = function( id, context ) {
+			if ( typeof context.getElementById !== strundefined && !documentIsXML ) {
+				var m = context.getElementById( id );
+
+				return m ?
+					m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?
+						[m] :
+						undefined :
+					[];
+			}
+		};
+		Expr.filter["ID"] =  function( id ) {
+			var attrId = id.replace( runescape, funescape );
+			return function( elem ) {
+				var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");
+				return node && node.value === attrId;
+			};
+		};
+	}
+
+	// Tag
+	Expr.find["TAG"] = support.tagNameNoComments ?
+		function( tag, context ) {
+			if ( typeof context.getElementsByTagName !== strundefined ) {
+				return context.getElementsByTagName( tag );
+			}
+		} :
+		function( tag, context ) {
+			var elem,
+				tmp = [],
+				i = 0,
+				results = context.getElementsByTagName( tag );
+
+			// Filter out possible comments
+			if ( tag === "*" ) {
+				while ( (elem = results[i++]) ) {
+					if ( elem.nodeType === 1 ) {
+						tmp.push( elem );
+					}
+				}
+
+				return tmp;
+			}
+			return results;
+		};
+
+	// Name
+	Expr.find["NAME"] = support.getByName && function( tag, context ) {
+		if ( typeof context.getElementsByName !== strundefined ) {
+			return context.getElementsByName( name );
+		}
+	};
+
+	// Class
+	Expr.find["CLASS"] = support.getByClassName && function( className, context ) {
+		if ( typeof context.getElementsByClassName !== strundefined && !documentIsXML ) {
+			return context.getElementsByClassName( className );
+		}
+	};
+
+	// QSA and matchesSelector support
+
+	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+	rbuggyMatches = [];
+
+	// qSa(:focus) reports false when true (Chrome 21),
+	// no need to also add to buggyMatches since matches checks buggyQSA
+	// A support test would require too much code (would include document ready)
+	rbuggyQSA = [ ":focus" ];
+
+	if ( (support.qsa = isNative(doc.querySelectorAll)) ) {
+		// Build QSA regex
+		// Regex strategy adopted from Diego Perini
+		assert(function( div ) {
+			// Select is set to empty string on purpose
+			// This is to test IE's treatment of not explictly
+			// setting a boolean content attribute,
+			// since its presence should be enough
+			// http://bugs.jquery.com/ticket/12359
+			div.innerHTML = "<select><option selected=''></option></select>";
+
+			// IE8 - Some boolean attributes are not treated correctly
+			if ( !div.querySelectorAll("[selected]").length ) {
+				rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );
+			}
+
+			// Webkit/Opera - :checked should return selected option elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":checked").length ) {
+				rbuggyQSA.push(":checked");
+			}
+		});
+
+		assert(function( div ) {
+
+			// Opera 10-12/IE8 - ^= $= *= and empty values
+			// Should not select anything
+			div.innerHTML = "<input type='hidden' i=''/>";
+			if ( div.querySelectorAll("[i^='']").length ) {
+				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );
+			}
+
+			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+			// IE8 throws error here and will not see later tests
+			if ( !div.querySelectorAll(":enabled").length ) {
+				rbuggyQSA.push( ":enabled", ":disabled" );
+			}
+
+			// Opera 10-11 does not throw on post-comma invalid pseudos
+			div.querySelectorAll("*,:x");
+			rbuggyQSA.push(",.*:");
+		});
+	}
+
+	if ( (support.matchesSelector = isNative( (matches = docElem.matchesSelector ||
+		docElem.mozMatchesSelector ||
+		docElem.webkitMatchesSelector ||
+		docElem.oMatchesSelector ||
+		docElem.msMatchesSelector) )) ) {
+
+		assert(function( div ) {
+			// Check to see if it's possible to do matchesSelector
+			// on a disconnected node (IE 9)
+			support.disconnectedMatch = matches.call( div, "div" );
+
+			// This should fail with an exception
+			// Gecko does not error, returns false instead
+			matches.call( div, "[s!='']:x" );
+			rbuggyMatches.push( "!=", pseudos );
+		});
+	}
+
+	rbuggyQSA = new RegExp( rbuggyQSA.join("|") );
+	rbuggyMatches = new RegExp( rbuggyMatches.join("|") );
+
+	// Element contains another
+	// Purposefully does not implement inclusive descendent
+	// As in, an element does not contain itself
+	contains = isNative(docElem.contains) || docElem.compareDocumentPosition ?
+		function( a, b ) {
+			var adown = a.nodeType === 9 ? a.documentElement : a,
+				bup = b && b.parentNode;
+			return a === bup || !!( bup && bup.nodeType === 1 && (
+				adown.contains ?
+					adown.contains( bup ) :
+					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
+			));
+		} :
+		function( a, b ) {
+			if ( b ) {
+				while ( (b = b.parentNode) ) {
+					if ( b === a ) {
+						return true;
+					}
+				}
+			}
+			return false;
+		};
+
+	// Document order sorting
+	sortOrder = docElem.compareDocumentPosition ?
+	function( a, b ) {
+		var compare;
+
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+		}
+
+		if ( (compare = b.compareDocumentPosition && a.compareDocumentPosition && a.compareDocumentPosition( b )) ) {
+			if ( compare & 1 || a.parentNode && a.parentNode.nodeType === 11 ) {
+				if ( a === doc || contains( preferredDoc, a ) ) {
+					return -1;
+				}
+				if ( b === doc || contains( preferredDoc, b ) ) {
+					return 1;
+				}
+				return 0;
+			}
+			return compare & 4 ? -1 : 1;
+		}
+
+		return a.compareDocumentPosition ? -1 : 1;
+	} :
+	function( a, b ) {
+		var cur,
+			i = 0,
+			aup = a.parentNode,
+			bup = b.parentNode,
+			ap = [ a ],
+			bp = [ b ];
+
+		// Exit early if the nodes are identical
+		if ( a === b ) {
+			hasDuplicate = true;
+			return 0;
+
+		// Parentless nodes are either documents or disconnected
+		} else if ( !aup || !bup ) {
+			return a === doc ? -1 :
+				b === doc ? 1 :
+				aup ? -1 :
+				bup ? 1 :
+				0;
+
+		// If the nodes are siblings, we can do a quick check
+		} else if ( aup === bup ) {
+			return siblingCheck( a, b );
+		}
+
+		// Otherwise we need full lists of their ancestors for comparison
+		cur = a;
+		while ( (cur = cur.parentNode) ) {
+			ap.unshift( cur );
+		}
+		cur = b;
+		while ( (cur = cur.parentNode) ) {
+			bp.unshift( cur );
+		}
+
+		// Walk down the tree looking for a discrepancy
+		while ( ap[i] === bp[i] ) {
+			i++;
+		}
+
+		return i ?
+			// Do a sibling check if the nodes have a common ancestor
+			siblingCheck( ap[i], bp[i] ) :
+
+			// Otherwise nodes in our document sort first
+			ap[i] === preferredDoc ? -1 :
+			bp[i] === preferredDoc ? 1 :
+			0;
+	};
+
+	// Always assume the presence of duplicates if sort doesn't
+	// pass them to our comparison function (as in Google Chrome).
+	hasDuplicate = false;
+	[0, 0].sort( sortOrder );
+	support.detectDuplicates = hasDuplicate;
+
+	return document;
+};
+
+Sizzle.matches = function( expr, elements ) {
+	return Sizzle( expr, null, null, elements );
+};
+
+Sizzle.matchesSelector = function( elem, expr ) {
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	// Make sure that attribute selectors are quoted
+	expr = expr.replace( rattributeQuotes, "='$1']" );
+
+	// rbuggyQSA always contains :focus, so no need for an existence check
+	if ( support.matchesSelector && !documentIsXML && (!rbuggyMatches || !rbuggyMatches.test(expr)) && !rbuggyQSA.test(expr) ) {
+		try {
+			var ret = matches.call( elem, expr );
+
+			// IE 9's matchesSelector returns false on disconnected nodes
+			if ( ret || support.disconnectedMatch ||
+					// As well, disconnected nodes are said to be in a document
+					// fragment in IE 9
+					elem.document && elem.document.nodeType !== 11 ) {
+				return ret;
+			}
+		} catch(e) {}
+	}
+
+	return Sizzle( expr, document, null, [elem] ).length > 0;
+};
+
+Sizzle.contains = function( context, elem ) {
+	// Set document vars if needed
+	if ( ( context.ownerDocument || context ) !== document ) {
+		setDocument( context );
+	}
+	return contains( context, elem );
+};
+
+Sizzle.attr = function( elem, name ) {
+	var val;
+
+	// Set document vars if needed
+	if ( ( elem.ownerDocument || elem ) !== document ) {
+		setDocument( elem );
+	}
+
+	if ( !documentIsXML ) {
+		name = name.toLowerCase();
+	}
+	if ( (val = Expr.attrHandle[ name ]) ) {
+		return val( elem );
+	}
+	if ( documentIsXML || support.attributes ) {
+		return elem.getAttribute( name );
+	}
+	return ( (val = elem.getAttributeNode( name )) || elem.getAttribute( name ) ) && elem[ name ] === true ?
+		name :
+		val && val.specified ? val.value : null;
+};
+
+Sizzle.error = function( msg ) {
+	throw new Error( "Syntax error, unrecognized expression: " + msg );
+};
+
+// Document sorting and removing duplicates
+Sizzle.uniqueSort = function( results ) {
+	var elem,
+		duplicates = [],
+		i = 1,
+		j = 0;
+
+	// Unless we *know* we can detect duplicates, assume their presence
+	hasDuplicate = !support.detectDuplicates;
+	results.sort( sortOrder );
+
+	if ( hasDuplicate ) {
+		for ( ; (elem = results[i]); i++ ) {
+			if ( elem === results[ i - 1 ] ) {
+				j = duplicates.push( i );
+			}
+		}
+		while ( j-- ) {
+			results.splice( duplicates[ j ], 1 );
+		}
+	}
+
+	return results;
+};
+
+function siblingCheck( a, b ) {
+	var cur = b && a,
+		diff = cur && ( ~b.sourceIndex || MAX_NEGATIVE ) - ( ~a.sourceIndex || MAX_NEGATIVE );
+
+	// Use IE sourceIndex if available on both nodes
+	if ( diff ) {
+		return diff;
+	}
+
+	// Check if b follows a
+	if ( cur ) {
+		while ( (cur = cur.nextSibling) ) {
+			if ( cur === b ) {
+				return -1;
+			}
+		}
+	}
+
+	return a ? 1 : -1;
+}
+
+// Returns a function to use in pseudos for input types
+function createInputPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return name === "input" && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for buttons
+function createButtonPseudo( type ) {
+	return function( elem ) {
+		var name = elem.nodeName.toLowerCase();
+		return (name === "input" || name === "button") && elem.type === type;
+	};
+}
+
+// Returns a function to use in pseudos for positionals
+function createPositionalPseudo( fn ) {
+	return markFunction(function( argument ) {
+		argument = +argument;
+		return markFunction(function( seed, matches ) {
+			var j,
+				matchIndexes = fn( [], seed.length, argument ),
+				i = matchIndexes.length;
+
+			// Match elements found at the specified indexes
+			while ( i-- ) {
+				if ( seed[ (j = matchIndexes[i]) ] ) {
+					seed[j] = !(matches[j] = seed[j]);
+				}
+			}
+		});
+	});
+}
+
+/**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+getText = Sizzle.getText = function( elem ) {
+	var node,
+		ret = "",
+		i = 0,
+		nodeType = elem.nodeType;
+
+	if ( !nodeType ) {
+		// If no nodeType, this is expected to be an array
+		for ( ; (node = elem[i]); i++ ) {
+			// Do not traverse comment nodes
+			ret += getText( node );
+		}
+	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
+		// Use textContent for elements
+		// innerText usage removed for consistency of new lines (see #11153)
+		if ( typeof elem.textContent === "string" ) {
+			return elem.textContent;
+		} else {
+			// Traverse its children
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				ret += getText( elem );
+			}
+		}
+	} else if ( nodeType === 3 || nodeType === 4 ) {
+		return elem.nodeValue;
+	}
+	// Do not include comment or processing instruction nodes
+
+	return ret;
+};
+
+Expr = Sizzle.selectors = {
+
+	// Can be adjusted by the user
+	cacheLength: 50,
+
+	createPseudo: markFunction,
+
+	match: matchExpr,
+
+	find: {},
+
+	relative: {
+		">": { dir: "parentNode", first: true },
+		" ": { dir: "parentNode" },
+		"+": { dir: "previousSibling", first: true },
+		"~": { dir: "previousSibling" }
+	},
+
+	preFilter: {
+		"ATTR": function( match ) {
+			match[1] = match[1].replace( runescape, funescape );
+
+			// Move the given value to match[3] whether quoted or unquoted
+			match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );
+
+			if ( match[2] === "~=" ) {
+				match[3] = " " + match[3] + " ";
+			}
+
+			return match.slice( 0, 4 );
+		},
+
+		"CHILD": function( match ) {
+			/* matches from matchExpr["CHILD"]
+				1 type (only|nth|...)
+				2 what (child|of-type)
+				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+				4 xn-component of xn+y argument ([+-]?\d*n|)
+				5 sign of xn-component
+				6 x of xn-component
+				7 sign of y-component
+				8 y of y-component
+			*/
+			match[1] = match[1].toLowerCase();
+
+			if ( match[1].slice( 0, 3 ) === "nth" ) {
+				// nth-* requires argument
+				if ( !match[3] ) {
+					Sizzle.error( match[0] );
+				}
+
+				// numeric x and y parameters for Expr.filter.CHILD
+				// remember that false/true cast respectively to 0/1
+				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
+				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );
+
+			// other types prohibit arguments
+			} else if ( match[3] ) {
+				Sizzle.error( match[0] );
+			}
+
+			return match;
+		},
+
+		"PSEUDO": function( match ) {
+			var excess,
+				unquoted = !match[5] && match[2];
+
+			if ( matchExpr["CHILD"].test( match[0] ) ) {
+				return null;
+			}
+
+			// Accept quoted arguments as-is
+			if ( match[4] ) {
+				match[2] = match[4];
+
+			// Strip excess characters from unquoted arguments
+			} else if ( unquoted && rpseudo.test( unquoted ) &&
+				// Get excess from tokenize (recursively)
+				(excess = tokenize( unquoted, true )) &&
+				// advance to the next closing parenthesis
+				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {
+
+				// excess is a negative index
+				match[0] = match[0].slice( 0, excess );
+				match[2] = unquoted.slice( 0, excess );
+			}
+
+			// Return only captures needed by the pseudo filter method (type and argument)
+			return match.slice( 0, 3 );
+		}
+	},
+
+	filter: {
+
+		"TAG": function( nodeName ) {
+			if ( nodeName === "*" ) {
+				return function() { return true; };
+			}
+
+			nodeName = nodeName.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+			};
+		},
+
+		"CLASS": function( className ) {
+			var pattern = classCache[ className + " " ];
+
+			return pattern ||
+				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
+				classCache( className, function( elem ) {
+					return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );
+				});
+		},
+
+		"ATTR": function( name, operator, check ) {
+			return function( elem ) {
+				var result = Sizzle.attr( elem, name );
+
+				if ( result == null ) {
+					return operator === "!=";
+				}
+				if ( !operator ) {
+					return true;
+				}
+
+				result += "";
+
+				return operator === "=" ? result === check :
+					operator === "!=" ? result !== check :
+					operator === "^=" ? check && result.indexOf( check ) === 0 :
+					operator === "*=" ? check && result.indexOf( check ) > -1 :
+					operator === "$=" ? check && result.slice( -check.length ) === check :
+					operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :
+					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
+					false;
+			};
+		},
+
+		"CHILD": function( type, what, argument, first, last ) {
+			var simple = type.slice( 0, 3 ) !== "nth",
+				forward = type.slice( -4 ) !== "last",
+				ofType = what === "of-type";
+
+			return first === 1 && last === 0 ?
+
+				// Shortcut for :nth-*(n)
+				function( elem ) {
+					return !!elem.parentNode;
+				} :
+
+				function( elem, context, xml ) {
+					var cache, outerCache, node, diff, nodeIndex, start,
+						dir = simple !== forward ? "nextSibling" : "previousSibling",
+						parent = elem.parentNode,
+						name = ofType && elem.nodeName.toLowerCase(),
+						useCache = !xml && !ofType;
+
+					if ( parent ) {
+
+						// :(first|last|only)-(child|of-type)
+						if ( simple ) {
+							while ( dir ) {
+								node = elem;
+								while ( (node = node[ dir ]) ) {
+									if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {
+										return false;
+									}
+								}
+								// Reverse direction for :only-* (if we haven't yet done so)
+								start = dir = type === "only" && !start && "nextSibling";
+							}
+							return true;
+						}
+
+						start = [ forward ? parent.firstChild : parent.lastChild ];
+
+						// non-xml :nth-child(...) stores cache data on `parent`
+						if ( forward && useCache ) {
+							// Seek `elem` from a previously-cached index
+							outerCache = parent[ expando ] || (parent[ expando ] = {});
+							cache = outerCache[ type ] || [];
+							nodeIndex = cache[0] === dirruns && cache[1];
+							diff = cache[0] === dirruns && cache[2];
+							node = nodeIndex && parent.childNodes[ nodeIndex ];
+
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+
+								// Fallback to seeking `elem` from the start
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								// When found, cache indexes on `parent` and break
+								if ( node.nodeType === 1 && ++diff && node === elem ) {
+									outerCache[ type ] = [ dirruns, nodeIndex, diff ];
+									break;
+								}
+							}
+
+						// Use previously-cached element index if available
+						} else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {
+							diff = cache[1];
+
+						// xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)
+						} else {
+							// Use the same loop as above to seek `elem` from the start
+							while ( (node = ++nodeIndex && node && node[ dir ] ||
+								(diff = nodeIndex = 0) || start.pop()) ) {
+
+								if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {
+									// Cache the index of each encountered element
+									if ( useCache ) {
+										(node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];
+									}
+
+									if ( node === elem ) {
+										break;
+									}
+								}
+							}
+						}
+
+						// Incorporate the offset, then check against cycle size
+						diff -= last;
+						return diff === first || ( diff % first === 0 && diff / first >= 0 );
+					}
+				};
+		},
+
+		"PSEUDO": function( pseudo, argument ) {
+			// pseudo-class names are case-insensitive
+			// http://www.w3.org/TR/selectors/#pseudo-classes
+			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+			// Remember that setFilters inherits from pseudos
+			var args,
+				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
+					Sizzle.error( "unsupported pseudo: " + pseudo );
+
+			// The user may use createPseudo to indicate that
+			// arguments are needed to create the filter function
+			// just as Sizzle does
+			if ( fn[ expando ] ) {
+				return fn( argument );
+			}
+
+			// But maintain support for old signatures
+			if ( fn.length > 1 ) {
+				args = [ pseudo, pseudo, "", argument ];
+				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
+					markFunction(function( seed, matches ) {
+						var idx,
+							matched = fn( seed, argument ),
+							i = matched.length;
+						while ( i-- ) {
+							idx = indexOf.call( seed, matched[i] );
+							seed[ idx ] = !( matches[ idx ] = matched[i] );
+						}
+					}) :
+					function( elem ) {
+						return fn( elem, 0, args );
+					};
+			}
+
+			return fn;
+		}
+	},
+
+	pseudos: {
+		// Potentially complex pseudos
+		"not": markFunction(function( selector ) {
+			// Trim the selector passed to compile
+			// to avoid treating leading and trailing
+			// spaces as combinators
+			var input = [],
+				results = [],
+				matcher = compile( selector.replace( rtrim, "$1" ) );
+
+			return matcher[ expando ] ?
+				markFunction(function( seed, matches, context, xml ) {
+					var elem,
+						unmatched = matcher( seed, null, xml, [] ),
+						i = seed.length;
+
+					// Match elements unmatched by `matcher`
+					while ( i-- ) {
+						if ( (elem = unmatched[i]) ) {
+							seed[i] = !(matches[i] = elem);
+						}
+					}
+				}) :
+				function( elem, context, xml ) {
+					input[0] = elem;
+					matcher( input, null, xml, results );
+					return !results.pop();
+				};
+		}),
+
+		"has": markFunction(function( selector ) {
+			return function( elem ) {
+				return Sizzle( selector, elem ).length > 0;
+			};
+		}),
+
+		"contains": markFunction(function( text ) {
+			return function( elem ) {
+				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
+			};
+		}),
+
+		// "Whether an element is represented by a :lang() selector
+		// is based solely on the element's language value
+		// being equal to the identifier C,
+		// or beginning with the identifier C immediately followed by "-".
+		// The matching of C against the element's language value is performed case-insensitively.
+		// The identifier C does not have to be a valid language name."
+		// http://www.w3.org/TR/selectors/#lang-pseudo
+		"lang": markFunction( function( lang ) {
+			// lang value must be a valid identifider
+			if ( !ridentifier.test(lang || "") ) {
+				Sizzle.error( "unsupported lang: " + lang );
+			}
+			lang = lang.replace( runescape, funescape ).toLowerCase();
+			return function( elem ) {
+				var elemLang;
+				do {
+					if ( (elemLang = documentIsXML ?
+						elem.getAttribute("xml:lang") || elem.getAttribute("lang") :
+						elem.lang) ) {
+
+						elemLang = elemLang.toLowerCase();
+						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
+					}
+				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
+				return false;
+			};
+		}),
+
+		// Miscellaneous
+		"target": function( elem ) {
+			var hash = window.location && window.location.hash;
+			return hash && hash.slice( 1 ) === elem.id;
+		},
+
+		"root": function( elem ) {
+			return elem === docElem;
+		},
+
+		"focus": function( elem ) {
+			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+		},
+
+		// Boolean properties
+		"enabled": function( elem ) {
+			return elem.disabled === false;
+		},
+
+		"disabled": function( elem ) {
+			return elem.disabled === true;
+		},
+
+		"checked": function( elem ) {
+			// In CSS3, :checked should return both checked and selected elements
+			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+			var nodeName = elem.nodeName.toLowerCase();
+			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+		},
+
+		"selected": function( elem ) {
+			// Accessing this property makes selected-by-default
+			// options in Safari work properly
+			if ( elem.parentNode ) {
+				elem.parentNode.selectedIndex;
+			}
+
+			return elem.selected === true;
+		},
+
+		// Contents
+		"empty": function( elem ) {
+			// http://www.w3.org/TR/selectors/#empty-pseudo
+			// :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),
+			//   not comment, processing instructions, or others
+			// Thanks to Diego Perini for the nodeName shortcut
+			//   Greater than "@" means alpha characters (specifically not starting with "#" or "?")
+			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
+				if ( elem.nodeName > "@" || elem.nodeType === 3 || elem.nodeType === 4 ) {
+					return false;
+				}
+			}
+			return true;
+		},
+
+		"parent": function( elem ) {
+			return !Expr.pseudos["empty"]( elem );
+		},
+
+		// Element/input types
+		"header": function( elem ) {
+			return rheader.test( elem.nodeName );
+		},
+
+		"input": function( elem ) {
+			return rinputs.test( elem.nodeName );
+		},
+
+		"button": function( elem ) {
+			var name = elem.nodeName.toLowerCase();
+			return name === "input" && elem.type === "button" || name === "button";
+		},
+
+		"text": function( elem ) {
+			var attr;
+			// IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
+			// use getAttribute instead to test this case
+			return elem.nodeName.toLowerCase() === "input" &&
+				elem.type === "text" &&
+				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === elem.type );
+		},
+
+		// Position-in-collection
+		"first": createPositionalPseudo(function() {
+			return [ 0 ];
+		}),
+
+		"last": createPositionalPseudo(function( matchIndexes, length ) {
+			return [ length - 1 ];
+		}),
+
+		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			return [ argument < 0 ? argument + length : argument ];
+		}),
+
+		"even": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 0;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"odd": createPositionalPseudo(function( matchIndexes, length ) {
+			var i = 1;
+			for ( ; i < length; i += 2 ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; --i >= 0; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		}),
+
+		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
+			var i = argument < 0 ? argument + length : argument;
+			for ( ; ++i < length; ) {
+				matchIndexes.push( i );
+			}
+			return matchIndexes;
+		})
+	}
+};
+
+// Add button/input type pseudos
+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
+	Expr.pseudos[ i ] = createInputPseudo( i );
+}
+for ( i in { submit: true, reset: true } ) {
+	Expr.pseudos[ i ] = createButtonPseudo( i );
+}
+
+function tokenize( selector, parseOnly ) {
+	var matched, match, tokens, type,
+		soFar, groups, preFilters,
+		cached = tokenCache[ selector + " " ];
+
+	if ( cached ) {
+		return parseOnly ? 0 : cached.slice( 0 );
+	}
+
+	soFar = selector;
+	groups = [];
+	preFilters = Expr.preFilter;
+
+	while ( soFar ) {
+
+		// Comma and first run
+		if ( !matched || (match = rcomma.exec( soFar )) ) {
+			if ( match ) {
+				// Don't consume trailing commas as valid
+				soFar = soFar.slice( match[0].length ) || soFar;
+			}
+			groups.push( tokens = [] );
+		}
+
+		matched = false;
+
+		// Combinators
+		if ( (match = rcombinators.exec( soFar )) ) {
+			matched = match.shift();
+			tokens.push( {
+				value: matched,
+				// Cast descendant combinators to space
+				type: match[0].replace( rtrim, " " )
+			} );
+			soFar = soFar.slice( matched.length );
+		}
+
+		// Filters
+		for ( type in Expr.filter ) {
+			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
+				(match = preFilters[ type ]( match ))) ) {
+				matched = match.shift();
+				tokens.push( {
+					value: matched,
+					type: type,
+					matches: match
+				} );
+				soFar = soFar.slice( matched.length );
+			}
+		}
+
+		if ( !matched ) {
+			break;
+		}
+	}
+
+	// Return the length of the invalid excess
+	// if we're just parsing
+	// Otherwise, throw an error or return tokens
+	return parseOnly ?
+		soFar.length :
+		soFar ?
+			Sizzle.error( selector ) :
+			// Cache the tokens
+			tokenCache( selector, groups ).slice( 0 );
+}
+
+function toSelector( tokens ) {
+	var i = 0,
+		len = tokens.length,
+		selector = "";
+	for ( ; i < len; i++ ) {
+		selector += tokens[i].value;
+	}
+	return selector;
+}
+
+function addCombinator( matcher, combinator, base ) {
+	var dir = combinator.dir,
+		checkNonElements = base && dir === "parentNode",
+		doneName = done++;
+
+	return combinator.first ?
+		// Check against closest ancestor/preceding element
+		function( elem, context, xml ) {
+			while ( (elem = elem[ dir ]) ) {
+				if ( elem.nodeType === 1 || checkNonElements ) {
+					return matcher( elem, context, xml );
+				}
+			}
+		} :
+
+		// Check against all ancestor/preceding elements
+		function( elem, context, xml ) {
+			var data, cache, outerCache,
+				dirkey = dirruns + " " + doneName;
+
+			// We can't set arbitrary data on XML nodes, so they don't benefit from dir caching
+			if ( xml ) {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						if ( matcher( elem, context, xml ) ) {
+							return true;
+						}
+					}
+				}
+			} else {
+				while ( (elem = elem[ dir ]) ) {
+					if ( elem.nodeType === 1 || checkNonElements ) {
+						outerCache = elem[ expando ] || (elem[ expando ] = {});
+						if ( (cache = outerCache[ dir ]) && cache[0] === dirkey ) {
+							if ( (data = cache[1]) === true || data === cachedruns ) {
+								return data === true;
+							}
+						} else {
+							cache = outerCache[ dir ] = [ dirkey ];
+							cache[1] = matcher( elem, context, xml ) || cachedruns;
+							if ( cache[1] === true ) {
+								return true;
+							}
+						}
+					}
+				}
+			}
+		};
+}
+
+function elementMatcher( matchers ) {
+	return matchers.length > 1 ?
+		function( elem, context, xml ) {
+			var i = matchers.length;
+			while ( i-- ) {
+				if ( !matchers[i]( elem, context, xml ) ) {
+					return false;
+				}
+			}
+			return true;
+		} :
+		matchers[0];
+}
+
+function condense( unmatched, map, filter, context, xml ) {
+	var elem,
+		newUnmatched = [],
+		i = 0,
+		len = unmatched.length,
+		mapped = map != null;
+
+	for ( ; i < len; i++ ) {
+		if ( (elem = unmatched[i]) ) {
+			if ( !filter || filter( elem, context, xml ) ) {
+				newUnmatched.push( elem );
+				if ( mapped ) {
+					map.push( i );
+				}
+			}
+		}
+	}
+
+	return newUnmatched;
+}
+
+function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
+	if ( postFilter && !postFilter[ expando ] ) {
+		postFilter = setMatcher( postFilter );
+	}
+	if ( postFinder && !postFinder[ expando ] ) {
+		postFinder = setMatcher( postFinder, postSelector );
+	}
+	return markFunction(function( seed, results, context, xml ) {
+		var temp, i, elem,
+			preMap = [],
+			postMap = [],
+			preexisting = results.length,
+
+			// Get initial elements from seed or context
+			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),
+
+			// Prefilter to get matcher input, preserving a map for seed-results synchronization
+			matcherIn = preFilter && ( seed || !selector ) ?
+				condense( elems, preMap, preFilter, context, xml ) :
+				elems,
+
+			matcherOut = matcher ?
+				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?
+
+					// ...intermediate processing is necessary
+					[] :
+
+					// ...otherwise use results directly
+					results :
+				matcherIn;
+
+		// Find primary matches
+		if ( matcher ) {
+			matcher( matcherIn, matcherOut, context, xml );
+		}
+
+		// Apply postFilter
+		if ( postFilter ) {
+			temp = condense( matcherOut, postMap );
+			postFilter( temp, [], context, xml );
+
+			// Un-match failing elements by moving them back to matcherIn
+			i = temp.length;
+			while ( i-- ) {
+				if ( (elem = temp[i]) ) {
+					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
+				}
+			}
+		}
+
+		if ( seed ) {
+			if ( postFinder || preFilter ) {
+				if ( postFinder ) {
+					// Get the final matcherOut by condensing this intermediate into postFinder contexts
+					temp = [];
+					i = matcherOut.length;
+					while ( i-- ) {
+						if ( (elem = matcherOut[i]) ) {
+							// Restore matcherIn since elem is not yet a final match
+							temp.push( (matcherIn[i] = elem) );
+						}
+					}
+					postFinder( null, (matcherOut = []), temp, xml );
+				}
+
+				// Move matched elements from seed to results to keep them synchronized
+				i = matcherOut.length;
+				while ( i-- ) {
+					if ( (elem = matcherOut[i]) &&
+						(temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {
+
+						seed[temp] = !(results[temp] = elem);
+					}
+				}
+			}
+
+		// Add elements to results, through postFinder if defined
+		} else {
+			matcherOut = condense(
+				matcherOut === results ?
+					matcherOut.splice( preexisting, matcherOut.length ) :
+					matcherOut
+			);
+			if ( postFinder ) {
+				postFinder( null, results, matcherOut, xml );
+			} else {
+				push.apply( results, matcherOut );
+			}
+		}
+	});
+}
+
+function matcherFromTokens( tokens ) {
+	var checkContext, matcher, j,
+		len = tokens.length,
+		leadingRelative = Expr.relative[ tokens[0].type ],
+		implicitRelative = leadingRelative || Expr.relative[" "],
+		i = leadingRelative ? 1 : 0,
+
+		// The foundational matcher ensures that elements are reachable from top-level context(s)
+		matchContext = addCombinator( function( elem ) {
+			return elem === checkContext;
+		}, implicitRelative, true ),
+		matchAnyContext = addCombinator( function( elem ) {
+			return indexOf.call( checkContext, elem ) > -1;
+		}, implicitRelative, true ),
+		matchers = [ function( elem, context, xml ) {
+			return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
+				(checkContext = context).nodeType ?
+					matchContext( elem, context, xml ) :
+					matchAnyContext( elem, context, xml ) );
+		} ];
+
+	for ( ; i < len; i++ ) {
+		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
+			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
+		} else {
+			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );
+
+			// Return special upon seeing a positional matcher
+			if ( matcher[ expando ] ) {
+				// Find the next relative operator (if any) for proper handling
+				j = ++i;
+				for ( ; j < len; j++ ) {
+					if ( Expr.relative[ tokens[j].type ] ) {
+						break;
+					}
+				}
+				return setMatcher(
+					i > 1 && elementMatcher( matchers ),
+					i > 1 && toSelector( tokens.slice( 0, i - 1 ) ).replace( rtrim, "$1" ),
+					matcher,
+					i < j && matcherFromTokens( tokens.slice( i, j ) ),
+					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
+					j < len && toSelector( tokens )
+				);
+			}
+			matchers.push( matcher );
+		}
+	}
+
+	return elementMatcher( matchers );
+}
+
+function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
+	// A counter to specify which element is currently being matched
+	var matcherCachedRuns = 0,
+		bySet = setMatchers.length > 0,
+		byElement = elementMatchers.length > 0,
+		superMatcher = function( seed, context, xml, results, expandContext ) {
+			var elem, j, matcher,
+				setMatched = [],
+				matchedCount = 0,
+				i = "0",
+				unmatched = seed && [],
+				outermost = expandContext != null,
+				contextBackup = outermostContext,
+				// We must always have either seed elements or context
+				elems = seed || byElement && Expr.find["TAG"]( "*", expandContext && context.parentNode || context ),
+				// Use integer dirruns iff this is the outermost matcher
+				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1);
+
+			if ( outermost ) {
+				outermostContext = context !== document && context;
+				cachedruns = matcherCachedRuns;
+			}
+
+			// Add elements passing elementMatchers directly to results
+			// Keep `i` a string if there are no elements so `matchedCount` will be "00" below
+			for ( ; (elem = elems[i]) != null; i++ ) {
+				if ( byElement && elem ) {
+					j = 0;
+					while ( (matcher = elementMatchers[j++]) ) {
+						if ( matcher( elem, context, xml ) ) {
+							results.push( elem );
+							break;
+						}
+					}
+					if ( outermost ) {
+						dirruns = dirrunsUnique;
+						cachedruns = ++matcherCachedRuns;
+					}
+				}
+
+				// Track unmatched elements for set filters
+				if ( bySet ) {
+					// They will have gone through all possible matchers
+					if ( (elem = !matcher && elem) ) {
+						matchedCount--;
+					}
+
+					// Lengthen the array for every element, matched or not
+					if ( seed ) {
+						unmatched.push( elem );
+					}
+				}
+			}
+
+			// Apply set filters to unmatched elements
+			matchedCount += i;
+			if ( bySet && i !== matchedCount ) {
+				j = 0;
+				while ( (matcher = setMatchers[j++]) ) {
+					matcher( unmatched, setMatched, context, xml );
+				}
+
+				if ( seed ) {
+					// Reintegrate element matches to eliminate the need for sorting
+					if ( matchedCount > 0 ) {
+						while ( i-- ) {
+							if ( !(unmatched[i] || setMatched[i]) ) {
+								setMatched[i] = pop.call( results );
+							}
+						}
+					}
+
+					// Discard index placeholder values to get only actual matches
+					setMatched = condense( setMatched );
+				}
+
+				// Add matches to results
+				push.apply( results, setMatched );
+
+				// Seedless set matches succeeding multiple successful matchers stipulate sorting
+				if ( outermost && !seed && setMatched.length > 0 &&
+					( matchedCount + setMatchers.length ) > 1 ) {
+
+					Sizzle.uniqueSort( results );
+				}
+			}
+
+			// Override manipulation of globals by nested matchers
+			if ( outermost ) {
+				dirruns = dirrunsUnique;
+				outermostContext = contextBackup;
+			}
+
+			return unmatched;
+		};
+
+	return bySet ?
+		markFunction( superMatcher ) :
+		superMatcher;
+}
+
+compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {
+	var i,
+		setMatchers = [],
+		elementMatchers = [],
+		cached = compilerCache[ selector + " " ];
+
+	if ( !cached ) {
+		// Generate a function of recursive functions that can be used to check each element
+		if ( !group ) {
+			group = tokenize( selector );
+		}
+		i = group.length;
+		while ( i-- ) {
+			cached = matcherFromTokens( group[i] );
+			if ( cached[ expando ] ) {
+				setMatchers.push( cached );
+			} else {
+				elementMatchers.push( cached );
+			}
+		}
+
+		// Cache the compiled function
+		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );
+	}
+	return cached;
+};
+
+function multipleContexts( selector, contexts, results ) {
+	var i = 0,
+		len = contexts.length;
+	for ( ; i < len; i++ ) {
+		Sizzle( selector, contexts[i], results );
+	}
+	return results;
+}
+
+function select( selector, context, results, seed ) {
+	var i, tokens, token, type, find,
+		match = tokenize( selector );
+
+	if ( !seed ) {
+		// Try to minimize operations if there is only one group
+		if ( match.length === 1 ) {
+
+			// Take a shortcut and set the context if the root selector is an ID
+			tokens = match[0] = match[0].slice( 0 );
+			if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+					context.nodeType === 9 && !documentIsXML &&
+					Expr.relative[ tokens[1].type ] ) {
+
+				context = Expr.find["ID"]( token.matches[0].replace( runescape, funescape ), context )[0];
+				if ( !context ) {
+					return results;
+				}
+
+				selector = selector.slice( tokens.shift().value.length );
+			}
+
+			// Fetch a seed set for right-to-left matching
+			i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
+			while ( i-- ) {
+				token = tokens[i];
+
+				// Abort if we hit a combinator
+				if ( Expr.relative[ (type = token.type) ] ) {
+					break;
+				}
+				if ( (find = Expr.find[ type ]) ) {
+					// Search, expanding context for leading sibling combinators
+					if ( (seed = find(
+						token.matches[0].replace( runescape, funescape ),
+						rsibling.test( tokens[0].type ) && context.parentNode || context
+					)) ) {
+
+						// If seed is empty or no tokens remain, we can return early
+						tokens.splice( i, 1 );
+						selector = seed.length && toSelector( tokens );
+						if ( !selector ) {
+							push.apply( results, slice.call( seed, 0 ) );
+							return results;
+						}
+
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	// Compile and execute a filtering function
+	// Provide `match` to avoid retokenization if we modified the selector above
+	compile( selector, match )(
+		seed,
+		context,
+		documentIsXML,
+		results,
+		rsibling.test( selector )
+	);
+	return results;
+}
+
+// Deprecated
+Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+// Easy API for creating new setFilters
+function setFilters() {}
+Expr.filters = setFilters.prototype = Expr.pseudos;
+Expr.setFilters = new setFilters();
+
+// Initialize with the default document
+setDocument();
+
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+
+
+})( window );
+var runtil = /Until$/,
+	rparentsprev = /^(?:parents|prev(?:Until|All))/,
+	isSimple = /^.[^:#\[\.,]*$/,
+	rneedsContext = jQuery.expr.match.needsContext,
+	// methods guaranteed to produce a unique set when starting from a unique set
+	guaranteedUnique = {
+		children: true,
+		contents: true,
+		next: true,
+		prev: true
+	};
+
+jQuery.fn.extend({
+	find: function( selector ) {
+		var i, ret, self,
+			len = this.length;
+
+		if ( typeof selector !== "string" ) {
+			self = this;
+			return this.pushStack( jQuery( selector ).filter(function() {
+				for ( i = 0; i < len; i++ ) {
+					if ( jQuery.contains( self[ i ], this ) ) {
+						return true;
+					}
+				}
+			}) );
+		}
+
+		ret = [];
+		for ( i = 0; i < len; i++ ) {
+			jQuery.find( selector, this[ i ], ret );
+		}
+
+		// Needed because $( selector, context ) becomes $( context ).find( selector )
+		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
+		ret.selector = ( this.selector ? this.selector + " " : "" ) + selector;
+		return ret;
+	},
+
+	has: function( target ) {
+		var i,
+			targets = jQuery( target, this ),
+			len = targets.length;
+
+		return this.filter(function() {
+			for ( i = 0; i < len; i++ ) {
+				if ( jQuery.contains( this, targets[i] ) ) {
+					return true;
+				}
+			}
+		});
+	},
+
+	not: function( selector ) {
+		return this.pushStack( winnow(this, selector, false) );
+	},
+
+	filter: function( selector ) {
+		return this.pushStack( winnow(this, selector, true) );
+	},
+
+	is: function( selector ) {
+		return !!selector && (
+			typeof selector === "string" ?
+				// If this is a positional/relative selector, check membership in the returned set
+				// so $("p:first").is("p:last") won't return true for a doc with two "p".
+				rneedsContext.test( selector ) ?
+					jQuery( selector, this.context ).index( this[0] ) >= 0 :
+					jQuery.filter( selector, this ).length > 0 :
+				this.filter( selector ).length > 0 );
+	},
+
+	closest: function( selectors, context ) {
+		var cur,
+			i = 0,
+			l = this.length,
+			ret = [],
+			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+				jQuery( selectors, context || this.context ) :
+				0;
+
+		for ( ; i < l; i++ ) {
+			cur = this[i];
+
+			while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+				if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+					ret.push( cur );
+					break;
+				}
+				cur = cur.parentNode;
+			}
+		}
+
+		return this.pushStack( ret.length > 1 ? jQuery.unique( ret ) : ret );
+	},
+
+	// Determine the position of an element within
+	// the matched set of elements
+	index: function( elem ) {
+
+		// No argument, return index in parent
+		if ( !elem ) {
+			return ( this[0] && this[0].parentNode ) ? this.first().prevAll().length : -1;
+		}
+
+		// index in selector
+		if ( typeof elem === "string" ) {
+			return jQuery.inArray( this[0], jQuery( elem ) );
+		}
+
+		// Locate the position of the desired element
+		return jQuery.inArray(
+			// If it receives a jQuery object, the first element is used
+			elem.jquery ? elem[0] : elem, this );
+	},
+
+	add: function( selector, context ) {
+		var set = typeof selector === "string" ?
+				jQuery( selector, context ) :
+				jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+			all = jQuery.merge( this.get(), set );
+
+		return this.pushStack( jQuery.unique(all) );
+	},
+
+	addBack: function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter(selector)
+		);
+	}
+});
+
+jQuery.fn.andSelf = jQuery.fn.addBack;
+
+function sibling( cur, dir ) {
+	do {
+		cur = cur[ dir ];
+	} while ( cur && cur.nodeType !== 1 );
+
+	return cur;
+}
+
+jQuery.each({
+	parent: function( elem ) {
+		var parent = elem.parentNode;
+		return parent && parent.nodeType !== 11 ? parent : null;
+	},
+	parents: function( elem ) {
+		return jQuery.dir( elem, "parentNode" );
+	},
+	parentsUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "parentNode", until );
+	},
+	next: function( elem ) {
+		return sibling( elem, "nextSibling" );
+	},
+	prev: function( elem ) {
+		return sibling( elem, "previousSibling" );
+	},
+	nextAll: function( elem ) {
+		return jQuery.dir( elem, "nextSibling" );
+	},
+	prevAll: function( elem ) {
+		return jQuery.dir( elem, "previousSibling" );
+	},
+	nextUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "nextSibling", until );
+	},
+	prevUntil: function( elem, i, until ) {
+		return jQuery.dir( elem, "previousSibling", until );
+	},
+	siblings: function( elem ) {
+		return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+	},
+	children: function( elem ) {
+		return jQuery.sibling( elem.firstChild );
+	},
+	contents: function( elem ) {
+		return jQuery.nodeName( elem, "iframe" ) ?
+			elem.contentDocument || elem.contentWindow.document :
+			jQuery.merge( [], elem.childNodes );
+	}
+}, function( name, fn ) {
+	jQuery.fn[ name ] = function( until, selector ) {
+		var ret = jQuery.map( this, fn, until );
+
+		if ( !runtil.test( name ) ) {
+			selector = until;
+		}
+
+		if ( selector && typeof selector === "string" ) {
+			ret = jQuery.filter( selector, ret );
+		}
+
+		ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+
+		if ( this.length > 1 && rparentsprev.test( name ) ) {
+			ret = ret.reverse();
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+jQuery.extend({
+	filter: function( expr, elems, not ) {
+		if ( not ) {
+			expr = ":not(" + expr + ")";
+		}
+
+		return elems.length === 1 ?
+			jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+			jQuery.find.matches(expr, elems);
+	},
+
+	dir: function( elem, dir, until ) {
+		var matched = [],
+			cur = elem[ dir ];
+
+		while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+			if ( cur.nodeType === 1 ) {
+				matched.push( cur );
+			}
+			cur = cur[dir];
+		}
+		return matched;
+	},
+
+	sibling: function( n, elem ) {
+		var r = [];
+
+		for ( ; n; n = n.nextSibling ) {
+			if ( n.nodeType === 1 && n !== elem ) {
+				r.push( n );
+			}
+		}
+
+		return r;
+	}
+});
+
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
+
+	// Can't pass null or undefined to indexOf in Firefox 4
+	// Set to 0 to skip string check
+	qualifier = qualifier || 0;
+
+	if ( jQuery.isFunction( qualifier ) ) {
+		return jQuery.grep(elements, function( elem, i ) {
+			var retVal = !!qualifier.call( elem, i, elem );
+			return retVal === keep;
+		});
+
+	} else if ( qualifier.nodeType ) {
+		return jQuery.grep(elements, function( elem ) {
+			return ( elem === qualifier ) === keep;
+		});
+
+	} else if ( typeof qualifier === "string" ) {
+		var filtered = jQuery.grep(elements, function( elem ) {
+			return elem.nodeType === 1;
+		});
+
+		if ( isSimple.test( qualifier ) ) {
+			return jQuery.filter(qualifier, filtered, !keep);
+		} else {
+			qualifier = jQuery.filter( qualifier, filtered );
+		}
+	}
+
+	return jQuery.grep(elements, function( elem ) {
+		return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+	});
+}
+function createSafeFragment( document ) {
+	var list = nodeNames.split( "|" ),
+		safeFrag = document.createDocumentFragment();
+
+	if ( safeFrag.createElement ) {
+		while ( list.length ) {
+			safeFrag.createElement(
+				list.pop()
+			);
+		}
+	}
+	return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+		"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+	rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+	rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+	rleadingWhitespace = /^\s+/,
+	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+	rtagName = /<([\w:]+)/,
+	rtbody = /<tbody/i,
+	rhtml = /<|&#?\w+;/,
+	rnoInnerhtml = /<(?:script|style|link)/i,
+	manipulation_rcheckableType = /^(?:checkbox|radio)$/i,
+	// checked="checked" or checked
+	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+	rscriptType = /^$|\/(?:java|ecma)script/i,
+	rscriptTypeMasked = /^true\/(.*)/,
+	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,
+
+	// We have to close these tags to support XHTML (#13200)
+	wrapMap = {
+		option: [ 1, "<select multiple='multiple'>", "</select>" ],
+		legend: [ 1, "<fieldset>", "</fieldset>" ],
+		area: [ 1, "<map>", "</map>" ],
+		param: [ 1, "<object>", "</object>" ],
+		thead: [ 1, "<table>", "</table>" ],
+		tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+		col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+		td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+
+		// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+		// unless wrapped in a div with non-breaking characters in front of it.
+		_default: jQuery.support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X<div>", "</div>"  ]
+	},
+	safeFragment = createSafeFragment( document ),
+	fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+jQuery.fn.extend({
+	text: function( value ) {
+		return jQuery.access( this, function( value ) {
+			return value === undefined ?
+				jQuery.text( this ) :
+				this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+		}, null, value, arguments.length );
+	},
+
+	wrapAll: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapAll( html.call(this, i) );
+			});
+		}
+
+		if ( this[0] ) {
+			// The elements to wrap the target around
+			var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+
+			if ( this[0].parentNode ) {
+				wrap.insertBefore( this[0] );
+			}
+
+			wrap.map(function() {
+				var elem = this;
+
+				while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+					elem = elem.firstChild;
+				}
+
+				return elem;
+			}).append( this );
+		}
+
+		return this;
+	},
+
+	wrapInner: function( html ) {
+		if ( jQuery.isFunction( html ) ) {
+			return this.each(function(i) {
+				jQuery(this).wrapInner( html.call(this, i) );
+			});
+		}
+
+		return this.each(function() {
+			var self = jQuery( this ),
+				contents = self.contents();
+
+			if ( contents.length ) {
+				contents.wrapAll( html );
+
+			} else {
+				self.append( html );
+			}
+		});
+	},
+
+	wrap: function( html ) {
+		var isFunction = jQuery.isFunction( html );
+
+		return this.each(function(i) {
+			jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+		});
+	},
+
+	unwrap: function() {
+		return this.parent().each(function() {
+			if ( !jQuery.nodeName( this, "body" ) ) {
+				jQuery( this ).replaceWith( this.childNodes );
+			}
+		}).end();
+	},
+
+	append: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				this.appendChild( elem );
+			}
+		});
+	},
+
+	prepend: function() {
+		return this.domManip(arguments, true, function( elem ) {
+			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
+				this.insertBefore( elem, this.firstChild );
+			}
+		});
+	},
+
+	before: function() {
+		return this.domManip( arguments, false, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this );
+			}
+		});
+	},
+
+	after: function() {
+		return this.domManip( arguments, false, function( elem ) {
+			if ( this.parentNode ) {
+				this.parentNode.insertBefore( elem, this.nextSibling );
+			}
+		});
+	},
+
+	// keepData is for internal use only--do not document
+	remove: function( selector, keepData ) {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			if ( !selector || jQuery.filter( selector, [ elem ] ).length > 0 ) {
+				if ( !keepData && elem.nodeType === 1 ) {
+					jQuery.cleanData( getAll( elem ) );
+				}
+
+				if ( elem.parentNode ) {
+					if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {
+						setGlobalEval( getAll( elem, "script" ) );
+					}
+					elem.parentNode.removeChild( elem );
+				}
+			}
+		}
+
+		return this;
+	},
+
+	empty: function() {
+		var elem,
+			i = 0;
+
+		for ( ; (elem = this[i]) != null; i++ ) {
+			// Remove element nodes and prevent memory leaks
+			if ( elem.nodeType === 1 ) {
+				jQuery.cleanData( getAll( elem, false ) );
+			}
+
+			// Remove any remaining nodes
+			while ( elem.firstChild ) {
+				elem.removeChild( elem.firstChild );
+			}
+
+			// If this is a select, ensure that it displays empty (#12336)
+			// Support: IE<9
+			if ( elem.options && jQuery.nodeName( elem, "select" ) ) {
+				elem.options.length = 0;
+			}
+		}
+
+		return this;
+	},
+
+	clone: function( dataAndEvents, deepDataAndEvents ) {
+		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+		return this.map( function () {
+			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+		});
+	},
+
+	html: function( value ) {
+		return jQuery.access( this, function( value ) {
+			var elem = this[0] || {},
+				i = 0,
+				l = this.length;
+
+			if ( value === undefined ) {
+				return elem.nodeType === 1 ?
+					elem.innerHTML.replace( rinlinejQuery, "" ) :
+					undefined;
+			}
+
+			// See if we can take a shortcut and just use innerHTML
+			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+				( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+				( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+				!wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+
+				value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+				try {
+					for (; i < l; i++ ) {
+						// Remove element nodes and prevent memory leaks
+						elem = this[i] || {};
+						if ( elem.nodeType === 1 ) {
+							jQuery.cleanData( getAll( elem, false ) );
+							elem.innerHTML = value;
+						}
+					}
+
+					elem = 0;
+
+				// If using innerHTML throws an exception, use the fallback method
+				} catch(e) {}
+			}
+
+			if ( elem ) {
+				this.empty().append( value );
+			}
+		}, null, value, arguments.length );
+	},
+
+	replaceWith: function( value ) {
+		var isFunc = jQuery.isFunction( value );
+
+		// Make sure that the elements are removed from the DOM before they are inserted
+		// this can help fix replacing a parent with child elements
+		if ( !isFunc && typeof value !== "string" ) {
+			value = jQuery( value ).not( this ).detach();
+		}
+
+		return this.domManip( [ value ], true, function( elem ) {
+			var next = this.nextSibling,
+				parent = this.parentNode;
+
+			if ( parent ) {
+				jQuery( this ).remove();
+				parent.insertBefore( elem, next );
+			}
+		});
+	},
+
+	detach: function( selector ) {
+		return this.remove( selector, true );
+	},
+
+	domManip: function( args, table, callback ) {
+
+		// Flatten any nested arrays
+		args = core_concat.apply( [], args );
+
+		var first, node, hasScripts,
+			scripts, doc, fragment,
+			i = 0,
+			l = this.length,
+			set = this,
+			iNoClone = l - 1,
+			value = args[0],
+			isFunction = jQuery.isFunction( value );
+
+		// We can't cloneNode fragments that contain checked, in WebKit
+		if ( isFunction || !( l <= 1 || typeof value !== "string" || jQuery.support.checkClone || !rchecked.test( value ) ) ) {
+			return this.each(function( index ) {
+				var self = set.eq( index );
+				if ( isFunction ) {
+					args[0] = value.call( this, index, table ? self.html() : undefined );
+				}
+				self.domManip( args, table, callback );
+			});
+		}
+
+		if ( l ) {
+			fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );
+			first = fragment.firstChild;
+
+			if ( fragment.childNodes.length === 1 ) {
+				fragment = first;
+			}
+
+			if ( first ) {
+				table = table && jQuery.nodeName( first, "tr" );
+				scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
+				hasScripts = scripts.length;
+
+				// Use the original fragment for the last item instead of the first because it can end up
+				// being emptied incorrectly in certain situations (#8070).
+				for ( ; i < l; i++ ) {
+					node = fragment;
+
+					if ( i !== iNoClone ) {
+						node = jQuery.clone( node, true, true );
+
+						// Keep references to cloned scripts for later restoration
+						if ( hasScripts ) {
+							jQuery.merge( scripts, getAll( node, "script" ) );
+						}
+					}
+
+					callback.call(
+						table && jQuery.nodeName( this[i], "table" ) ?
+							findOrAppend( this[i], "tbody" ) :
+							this[i],
+						node,
+						i
+					);
+				}
+
+				if ( hasScripts ) {
+					doc = scripts[ scripts.length - 1 ].ownerDocument;
+
+					// Reenable scripts
+					jQuery.map( scripts, restoreScript );
+
+					// Evaluate executable scripts on first document insertion
+					for ( i = 0; i < hasScripts; i++ ) {
+						node = scripts[ i ];
+						if ( rscriptType.test( node.type || "" ) &&
+							!jQuery._data( node, "globalEval" ) && jQuery.contains( doc, node ) ) {
+
+							if ( node.src ) {
+								// Hope ajax is available...
+								jQuery.ajax({
+									url: node.src,
+									type: "GET",
+									dataType: "script",
+									async: false,
+									global: false,
+									"throws": true
+								});
+							} else {
+								jQuery.globalEval( ( node.text || node.textContent || node.innerHTML || "" ).replace( rcleanScript, "" ) );
+							}
+						}
+					}
+				}
+
+				// Fix #11809: Avoid leaking memory
+				fragment = first = null;
+			}
+		}
+
+		return this;
+	}
+});
+
+function findOrAppend( elem, tag ) {
+	return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
+
+// Replace/restore the type attribute of script elements for safe DOM manipulation
+function disableScript( elem ) {
+	var attr = elem.getAttributeNode("type");
+	elem.type = ( attr && attr.specified ) + "/" + elem.type;
+	return elem;
+}
+function restoreScript( elem ) {
+	var match = rscriptTypeMasked.exec( elem.type );
+	if ( match ) {
+		elem.type = match[1];
+	} else {
+		elem.removeAttribute("type");
+	}
+	return elem;
+}
+
+// Mark scripts as having already been evaluated
+function setGlobalEval( elems, refElements ) {
+	var elem,
+		i = 0;
+	for ( ; (elem = elems[i]) != null; i++ ) {
+		jQuery._data( elem, "globalEval", !refElements || jQuery._data( refElements[i], "globalEval" ) );
+	}
+}
+
+function cloneCopyEvent( src, dest ) {
+
+	if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+		return;
+	}
+
+	var type, i, l,
+		oldData = jQuery._data( src ),
+		curData = jQuery._data( dest, oldData ),
+		events = oldData.events;
+
+	if ( events ) {
+		delete curData.handle;
+		curData.events = {};
+
+		for ( type in events ) {
+			for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+				jQuery.event.add( dest, type, events[ type ][ i ] );
+			}
+		}
+	}
+
+	// make the cloned public data object a copy from the original
+	if ( curData.data ) {
+		curData.data = jQuery.extend( {}, curData.data );
+	}
+}
+
+function fixCloneNodeIssues( src, dest ) {
+	var nodeName, e, data;
+
+	// We do not need to do anything for non-Elements
+	if ( dest.nodeType !== 1 ) {
+		return;
+	}
+
+	nodeName = dest.nodeName.toLowerCase();
+
+	// IE6-8 copies events bound via attachEvent when using cloneNode.
+	if ( !jQuery.support.noCloneEvent && dest[ jQuery.expando ] ) {
+		data = jQuery._data( dest );
+
+		for ( e in data.events ) {
+			jQuery.removeEvent( dest, e, data.handle );
+		}
+
+		// Event data gets referenced instead of copied if the expando gets copied too
+		dest.removeAttribute( jQuery.expando );
+	}
+
+	// IE blanks contents when cloning scripts, and tries to evaluate newly-set text
+	if ( nodeName === "script" && dest.text !== src.text ) {
+		disableScript( dest ).text = src.text;
+		restoreScript( dest );
+
+	// IE6-10 improperly clones children of object elements using classid.
+	// IE10 throws NoModificationAllowedError if parent is null, #12132.
+	} else if ( nodeName === "object" ) {
+		if ( dest.parentNode ) {
+			dest.outerHTML = src.outerHTML;
+		}
+
+		// This path appears unavoidable for IE9. When cloning an object
+		// element in IE9, the outerHTML strategy above is not sufficient.
+		// If the src has innerHTML and the destination does not,
+		// copy the src.innerHTML into the dest.innerHTML. #10324
+		if ( jQuery.support.html5Clone && ( src.innerHTML && !jQuery.trim(dest.innerHTML) ) ) {
+			dest.innerHTML = src.innerHTML;
+		}
+
+	} else if ( nodeName === "input" && manipulation_rcheckableType.test( src.type ) ) {
+		// IE6-8 fails to persist the checked state of a cloned checkbox
+		// or radio button. Worse, IE6-7 fail to give the cloned element
+		// a checked appearance if the defaultChecked value isn't also set
+
+		dest.defaultChecked = dest.checked = src.checked;
+
+		// IE6-7 get confused and end up setting the value of a cloned
+		// checkbox/radio button to an empty string instead of "on"
+		if ( dest.value !== src.value ) {
+			dest.value = src.value;
+		}
+
+	// IE6-8 fails to return the selected option to the default selected
+	// state when cloning options
+	} else if ( nodeName === "option" ) {
+		dest.defaultSelected = dest.selected = src.defaultSelected;
+
+	// IE6-8 fails to set the defaultValue to the correct value when
+	// cloning other types of input fields
+	} else if ( nodeName === "input" || nodeName === "textarea" ) {
+		dest.defaultValue = src.defaultValue;
+	}
+}
+
+jQuery.each({
+	appendTo: "append",
+	prependTo: "prepend",
+	insertBefore: "before",
+	insertAfter: "after",
+	replaceAll: "replaceWith"
+}, function( name, original ) {
+	jQuery.fn[ name ] = function( selector ) {
+		var elems,
+			i = 0,
+			ret = [],
+			insert = jQuery( selector ),
+			last = insert.length - 1;
+
+		for ( ; i <= last; i++ ) {
+			elems = i === last ? this : this.clone(true);
+			jQuery( insert[i] )[ original ]( elems );
+
+			// Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get()
+			core_push.apply( ret, elems.get() );
+		}
+
+		return this.pushStack( ret );
+	};
+});
+
+function getAll( context, tag ) {
+	var elems, elem,
+		i = 0,
+		found = typeof context.getElementsByTagName !== core_strundefined ? context.getElementsByTagName( tag || "*" ) :
+			typeof context.querySelectorAll !== core_strundefined ? context.querySelectorAll( tag || "*" ) :
+			undefined;
+
+	if ( !found ) {
+		for ( found = [], elems = context.childNodes || context; (elem = elems[i]) != null; i++ ) {
+			if ( !tag || jQuery.nodeName( elem, tag ) ) {
+				found.push( elem );
+			} else {
+				jQuery.merge( found, getAll( elem, tag ) );
+			}
+		}
+	}
+
+	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
+		jQuery.merge( [ context ], found ) :
+		found;
+}
+
+// Used in buildFragment, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+	if ( manipulation_rcheckableType.test( elem.type ) ) {
+		elem.defaultChecked = elem.checked;
+	}
+}
+
+jQuery.extend({
+	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+		var destElements, node, clone, i, srcElements,
+			inPage = jQuery.contains( elem.ownerDocument, elem );
+
+		if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+			clone = elem.cloneNode( true );
+
+		// IE<=8 does not properly clone detached, unknown element nodes
+		} else {
+			fragmentDiv.innerHTML = elem.outerHTML;
+			fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+		}
+
+		if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+				(elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+
+			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
+			destElements = getAll( clone );
+			srcElements = getAll( elem );
+
+			// Fix all IE cloning issues
+			for ( i = 0; (node = srcElements[i]) != null; ++i ) {
+				// Ensure that the destination node is not null; Fixes #9587
+				if ( destElements[i] ) {
+					fixCloneNodeIssues( node, destElements[i] );
+				}
+			}
+		}
+
+		// Copy the events from the original to the clone
+		if ( dataAndEvents ) {
+			if ( deepDataAndEvents ) {
+				srcElements = srcElements || getAll( elem );
+				destElements = destElements || getAll( clone );
+
+				for ( i = 0; (node = srcElements[i]) != null; i++ ) {
+					cloneCopyEvent( node, destElements[i] );
+				}
+			} else {
+				cloneCopyEvent( elem, clone );
+			}
+		}
+
+		// Preserve script evaluation history
+		destElements = getAll( clone, "script" );
+		if ( destElements.length > 0 ) {
+			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
+		}
+
+		destElements = srcElements = node = null;
+
+		// Return the cloned set
+		return clone;
+	},
+
+	buildFragment: function( elems, context, scripts, selection ) {
+		var j, elem, contains,
+			tmp, tag, tbody, wrap,
+			l = elems.length,
+
+			// Ensure a safe fragment
+			safe = createSafeFragment( context ),
+
+			nodes = [],
+			i = 0;
+
+		for ( ; i < l; i++ ) {
+			elem = elems[ i ];
+
+			if ( elem || elem === 0 ) {
+
+				// Add nodes directly
+				if ( jQuery.type( elem ) === "object" ) {
+					jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );
+
+				// Convert non-html into a text node
+				} else if ( !rhtml.test( elem ) ) {
+					nodes.push( context.createTextNode( elem ) );
+
+				// Convert html into DOM nodes
+				} else {
+					tmp = tmp || safe.appendChild( context.createElement("div") );
+
+					// Deserialize a standard representation
+					tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+					wrap = wrapMap[ tag ] || wrapMap._default;
+
+					tmp.innerHTML = wrap[1] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[2];
+
+					// Descend through wrappers to the right content
+					j = wrap[0];
+					while ( j-- ) {
+						tmp = tmp.lastChild;
+					}
+
+					// Manually add leading whitespace removed by IE
+					if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+						nodes.push( context.createTextNode( rleadingWhitespace.exec( elem )[0] ) );
+					}
+
+					// Remove IE's autoinserted <tbody> from table fragments
+					if ( !jQuery.support.tbody ) {
+
+						// String was a <table>, *may* have spurious <tbody>
+						elem = tag === "table" && !rtbody.test( elem ) ?
+							tmp.firstChild :
+
+							// String was a bare <thead> or <tfoot>
+							wrap[1] === "<table>" && !rtbody.test( elem ) ?
+								tmp :
+								0;
+
+						j = elem && elem.childNodes.length;
+						while ( j-- ) {
+							if ( jQuery.nodeName( (tbody = elem.childNodes[j]), "tbody" ) && !tbody.childNodes.length ) {
+								elem.removeChild( tbody );
+							}
+						}
+					}
+
+					jQuery.merge( nodes, tmp.childNodes );
+
+					// Fix #12392 for WebKit and IE > 9
+					tmp.textContent = "";
+
+					// Fix #12392 for oldIE
+					while ( tmp.firstChild ) {
+						tmp.removeChild( tmp.firstChild );
+					}
+
+					// Remember the top-level container for proper cleanup
+					tmp = safe.lastChild;
+				}
+			}
+		}
+
+		// Fix #11356: Clear elements from fragment
+		if ( tmp ) {
+			safe.removeChild( tmp );
+		}
+
+		// Reset defaultChecked for any radios and checkboxes
+		// about to be appended to the DOM in IE 6/7 (#8060)
+		if ( !jQuery.support.appendChecked ) {
+			jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked );
+		}
+
+		i = 0;
+		while ( (elem = nodes[ i++ ]) ) {
+
+			// #4087 - If origin and destination elements are the same, and this is
+			// that element, do not do anything
+			if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {
+				continue;
+			}
+
+			contains = jQuery.contains( elem.ownerDocument, elem );
+
+			// Append to fragment
+			tmp = getAll( safe.appendChild( elem ), "script" );
+
+			// Preserve script evaluation history
+			if ( contains ) {
+				setGlobalEval( tmp );
+			}
+
+			// Capture executables
+			if ( scripts ) {
+				j = 0;
+				while ( (elem = tmp[ j++ ]) ) {
+					if ( rscriptType.test( elem.type || "" ) ) {
+						scripts.push( elem );
+					}
+				}
+			}
+		}
+
+		tmp = null;
+
+		return safe;
+	},
+
+	cleanData: function( elems, /* internal */ acceptData ) {
+		var elem, type, id, data,
+			i = 0,
+			internalKey = jQuery.expando,
+			cache = jQuery.cache,
+			deleteExpando = jQuery.support.deleteExpando,
+			special = jQuery.event.special;
+
+		for ( ; (elem = elems[i]) != null; i++ ) {
+
+			if ( acceptData || jQuery.acceptData( elem ) ) {
+
+				id = elem[ internalKey ];
+				data = id && cache[ id ];
+
+				if ( data ) {
+					if ( data.events ) {
+						for ( type in data.events ) {
+							if ( special[ type ] ) {
+								jQuery.event.remove( elem, type );
+
+							// This is a shortcut to avoid jQuery.event.remove's overhead
+							} else {
+								jQuery.removeEvent( elem, type, data.handle );
+							}
+						}
+					}
+
+					// Remove cache only if it was not already removed by jQuery.event.remove
+					if ( cache[ id ] ) {
+
+						delete cache[ id ];
+
+						// IE does not allow us to delete expando properties from nodes,
+						// nor does it have a removeAttribute function on Document nodes;
+						// we must handle all of these cases
+						if ( deleteExpando ) {
+							delete elem[ internalKey ];
+
+						} else if ( typeof elem.removeAttribute !== core_strundefined ) {
+							elem.removeAttribute( internalKey );
+
+						} else {
+							elem[ internalKey ] = null;
+						}
+
+						core_deletedIds.push( id );
+					}
+				}
+			}
+		}
+	}
+});
+var iframe, getStyles, curCSS,
+	ralpha = /alpha\([^)]*\)/i,
+	ropacity = /opacity\s*=\s*([^)]*)/,
+	rposition = /^(top|right|bottom|left)$/,
+	// swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+	// see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+	rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+	rmargin = /^margin/,
+	rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+	rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+	rrelNum = new RegExp( "^([+-])=(" + core_pnum + ")", "i" ),
+	elemdisplay = { BODY: "block" },
+
+	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+	cssNormalTransform = {
+		letterSpacing: 0,
+		fontWeight: 400
+	},
+
+	cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+	// shortcut for names that are not vendor prefixed
+	if ( name in style ) {
+		return name;
+	}
+
+	// check for vendor prefixed names
+	var capName = name.charAt(0).toUpperCase() + name.slice(1),
+		origName = name,
+		i = cssPrefixes.length;
+
+	while ( i-- ) {
+		name = cssPrefixes[ i ] + capName;
+		if ( name in style ) {
+			return name;
+		}
+	}
+
+	return origName;
+}
+
+function isHidden( elem, el ) {
+	// isHidden might be called from jQuery#filter function;
+	// in that case, element will be second argument
+	elem = el || elem;
+	return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
+
+function showHide( elements, show ) {
+	var display, elem, hidden,
+		values = [],
+		index = 0,
+		length = elements.length;
+
+	for ( ; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+
+		values[ index ] = jQuery._data( elem, "olddisplay" );
+		display = elem.style.display;
+		if ( show ) {
+			// Reset the inline display of this element to learn if it is
+			// being hidden by cascaded rules or not
+			if ( !values[ index ] && display === "none" ) {
+				elem.style.display = "";
+			}
+
+			// Set elements which have been overridden with display: none
+			// in a stylesheet to whatever the default browser style is
+			// for such an element
+			if ( elem.style.display === "" && isHidden( elem ) ) {
+				values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+			}
+		} else {
+
+			if ( !values[ index ] ) {
+				hidden = isHidden( elem );
+
+				if ( display && display !== "none" || !hidden ) {
+					jQuery._data( elem, "olddisplay", hidden ? display : jQuery.css( elem, "display" ) );
+				}
+			}
+		}
+	}
+
+	// Set the display of most of the elements in a second loop
+	// to avoid the constant reflow
+	for ( index = 0; index < length; index++ ) {
+		elem = elements[ index ];
+		if ( !elem.style ) {
+			continue;
+		}
+		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+			elem.style.display = show ? values[ index ] || "" : "none";
+		}
+	}
+
+	return elements;
+}
+
+jQuery.fn.extend({
+	css: function( name, value ) {
+		return jQuery.access( this, function( elem, name, value ) {
+			var len, styles,
+				map = {},
+				i = 0;
+
+			if ( jQuery.isArray( name ) ) {
+				styles = getStyles( elem );
+				len = name.length;
+
+				for ( ; i < len; i++ ) {
+					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
+				}
+
+				return map;
+			}
+
+			return value !== undefined ?
+				jQuery.style( elem, name, value ) :
+				jQuery.css( elem, name );
+		}, name, value, arguments.length > 1 );
+	},
+	show: function() {
+		return showHide( this, true );
+	},
+	hide: function() {
+		return showHide( this );
+	},
+	toggle: function( state ) {
+		var bool = typeof state === "boolean";
+
+		return this.each(function() {
+			if ( bool ? state : isHidden( this ) ) {
+				jQuery( this ).show();
+			} else {
+				jQuery( this ).hide();
+			}
+		});
+	}
+});
+
+jQuery.extend({
+	// Add in style property hooks for overriding the default
+	// behavior of getting and setting a style property
+	cssHooks: {
+		opacity: {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// We should always get a number back from opacity
+					var ret = curCSS( elem, "opacity" );
+					return ret === "" ? "1" : ret;
+				}
+			}
+		}
+	},
+
+	// Exclude the following css properties to add px
+	cssNumber: {
+		"columnCount": true,
+		"fillOpacity": true,
+		"fontWeight": true,
+		"lineHeight": true,
+		"opacity": true,
+		"orphans": true,
+		"widows": true,
+		"zIndex": true,
+		"zoom": true
+	},
+
+	// Add in properties whose names you wish to fix before
+	// setting or getting the value
+	cssProps: {
+		// normalize float css property
+		"float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+	},
+
+	// Get and set the style property on a DOM Node
+	style: function( elem, name, value, extra ) {
+		// Don't set styles on text and comment nodes
+		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+			return;
+		}
+
+		// Make sure that we're working with the right name
+		var ret, type, hooks,
+			origName = jQuery.camelCase( name ),
+			style = elem.style;
+
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// Check if we're setting a value
+		if ( value !== undefined ) {
+			type = typeof value;
+
+			// convert relative number strings (+= or -=) to relative numbers. #7345
+			if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+				value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+				// Fixes bug #9237
+				type = "number";
+			}
+
+			// Make sure that NaN and null values aren't set. See: #7116
+			if ( value == null || type === "number" && isNaN( value ) ) {
+				return;
+			}
+
+			// If a number was passed in, add 'px' to the (except for certain CSS properties)
+			if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+				value += "px";
+			}
+
+			// Fixes #8908, it can be done more correctly by specifing setters in cssHooks,
+			// but it would mean to define eight (for every problematic property) identical functions
+			if ( !jQuery.support.clearCloneStyle && value === "" && name.indexOf("background") === 0 ) {
+				style[ name ] = "inherit";
+			}
+
+			// If a hook was provided, use that value, otherwise just set the specified value
+			if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+
+				// Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+				// Fixes bug #5509
+				try {
+					style[ name ] = value;
+				} catch(e) {}
+			}
+
+		} else {
+			// If a hook was provided get the non-computed value from there
+			if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+				return ret;
+			}
+
+			// Otherwise just get the value from the style object
+			return style[ name ];
+		}
+	},
+
+	css: function( elem, name, extra, styles ) {
+		var num, val, hooks,
+			origName = jQuery.camelCase( name );
+
+		// Make sure that we're working with the right name
+		name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
+
+		// gets hook for the prefixed version
+		// followed by the unprefixed version
+		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
+
+		// If a hook was provided get the computed value from there
+		if ( hooks && "get" in hooks ) {
+			val = hooks.get( elem, true, extra );
+		}
+
+		// Otherwise, if a way to get the computed value exists, use that
+		if ( val === undefined ) {
+			val = curCSS( elem, name, styles );
+		}
+
+		//convert "normal" to computed value
+		if ( val === "normal" && name in cssNormalTransform ) {
+			val = cssNormalTransform[ name ];
+		}
+
+		// Return, converting to number if forced or a qualifier was provided and val looks numeric
+		if ( extra === "" || extra ) {
+			num = parseFloat( val );
+			return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;
+		}
+		return val;
+	},
+
+	// A method for quickly swapping in/out CSS properties to get correct calculations
+	swap: function( elem, options, callback, args ) {
+		var ret, name,
+			old = {};
+
+		// Remember the old values, and insert the new ones
+		for ( name in options ) {
+			old[ name ] = elem.style[ name ];
+			elem.style[ name ] = options[ name ];
+		}
+
+		ret = callback.apply( elem, args || [] );
+
+		// Revert the old values
+		for ( name in options ) {
+			elem.style[ name ] = old[ name ];
+		}
+
+		return ret;
+	}
+});
+
+// NOTE: we've included the "window" in window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+	getStyles = function( elem ) {
+		return window.getComputedStyle( elem, null );
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var width, minWidth, maxWidth,
+			computed = _computed || getStyles( elem ),
+
+			// getPropertyValue is only needed for .css('filter') in IE9, see #12537
+			ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined,
+			style = elem.style;
+
+		if ( computed ) {
+
+			if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+				ret = jQuery.style( elem, name );
+			}
+
+			// A tribute to the "awesome hack by Dean Edwards"
+			// Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+			// Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+			// this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+			if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+
+				// Remember the original values
+				width = style.width;
+				minWidth = style.minWidth;
+				maxWidth = style.maxWidth;
+
+				// Put in the new values to get a computed value out
+				style.minWidth = style.maxWidth = style.width = ret;
+				ret = computed.width;
+
+				// Revert the changed values
+				style.width = width;
+				style.minWidth = minWidth;
+				style.maxWidth = maxWidth;
+			}
+		}
+
+		return ret;
+	};
+} else if ( document.documentElement.currentStyle ) {
+	getStyles = function( elem ) {
+		return elem.currentStyle;
+	};
+
+	curCSS = function( elem, name, _computed ) {
+		var left, rs, rsLeft,
+			computed = _computed || getStyles( elem ),
+			ret = computed ? computed[ name ] : undefined,
+			style = elem.style;
+
+		// Avoid setting ret to empty string here
+		// so we don't default to auto
+		if ( ret == null && style && style[ name ] ) {
+			ret = style[ name ];
+		}
+
+		// From the awesome hack by Dean Edwards
+		// http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+
+		// If we're not dealing with a regular pixel number
+		// but a number that has a weird ending, we need to convert it to pixels
+		// but not position css attributes, as those are proportional to the parent element instead
+		// and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+		if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
+
+			// Remember the original values
+			left = style.left;
+			rs = elem.runtimeStyle;
+			rsLeft = rs && rs.left;
+
+			// Put in the new values to get a computed value out
+			if ( rsLeft ) {
+				rs.left = elem.currentStyle.left;
+			}
+			style.left = name === "fontSize" ? "1em" : ret;
+			ret = style.pixelLeft + "px";
+
+			// Revert the changed values
+			style.left = left;
+			if ( rsLeft ) {
+				rs.left = rsLeft;
+			}
+		}
+
+		return ret === "" ? "auto" : ret;
+	};
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+	var matches = rnumsplit.exec( value );
+	return matches ?
+		// Guard against undefined "subtract", e.g., when used as in cssHooks
+		Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+		value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
+	var i = extra === ( isBorderBox ? "border" : "content" ) ?
+		// If we already have the right measurement, avoid augmentation
+		4 :
+		// Otherwise initialize for horizontal or vertical properties
+		name === "width" ? 1 : 0,
+
+		val = 0;
+
+	for ( ; i < 4; i += 2 ) {
+		// both box models exclude margin, so add it if we want it
+		if ( extra === "margin" ) {
+			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
+		}
+
+		if ( isBorderBox ) {
+			// border-box includes padding, so remove it if we want content
+			if ( extra === "content" ) {
+				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+			}
+
+			// at this point, extra isn't border nor margin, so remove border
+			if ( extra !== "margin" ) {
+				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		} else {
+			// at this point, extra isn't content, so add padding
+			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
+
+			// at this point, extra isn't content nor padding, so add border
+			if ( extra !== "padding" ) {
+				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
+			}
+		}
+	}
+
+	return val;
+}
+
+function getWidthOrHeight( elem, name, extra ) {
+
+	// Start with offset property, which is equivalent to the border-box value
+	var valueIsBorderBox = true,
+		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+		styles = getStyles( elem ),
+		isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box";
+
+	// some non-html elements return undefined for offsetWidth, so check for null/undefined
+	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+	if ( val <= 0 || val == null ) {
+		// Fall back to computed then uncomputed css if necessary
+		val = curCSS( elem, name, styles );
+		if ( val < 0 || val == null ) {
+			val = elem.style[ name ];
+		}
+
+		// Computed unit is not pixels. Stop here and return.
+		if ( rnumnonpx.test(val) ) {
+			return val;
+		}
+
+		// we need the check for style in case a browser which returns unreliable values
+		// for getComputedStyle silently falls back to the reliable elem.style
+		valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
+
+		// Normalize "", auto, and prepare for extra
+		val = parseFloat( val ) || 0;
+	}
+
+	// use the active box-sizing model to add/subtract irrelevant styles
+	return ( val +
+		augmentWidthOrHeight(
+			elem,
+			name,
+			extra || ( isBorderBox ? "border" : "content" ),
+			valueIsBorderBox,
+			styles
+		)
+	) + "px";
+}
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+	var doc = document,
+		display = elemdisplay[ nodeName ];
+
+	if ( !display ) {
+		display = actualDisplay( nodeName, doc );
+
+		// If the simple way fails, read from inside an iframe
+		if ( display === "none" || !display ) {
+			// Use the already-created iframe if possible
+			iframe = ( iframe ||
+				jQuery("<iframe frameborder='0' width='0' height='0'/>")
+				.css( "cssText", "display:block !important" )
+			).appendTo( doc.documentElement );
+
+			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
+			doc = ( iframe[0].contentWindow || iframe[0].contentDocument ).document;
+			doc.write("<!doctype html><html><body>");
+			doc.close();
+
+			display = actualDisplay( nodeName, doc );
+			iframe.detach();
+		}
+
+		// Store the correct default display
+		elemdisplay[ nodeName ] = display;
+	}
+
+	return display;
+}
+
+// Called ONLY from within css_defaultDisplay
+function actualDisplay( name, doc ) {
+	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),
+		display = jQuery.css( elem[0], "display" );
+	elem.remove();
+	return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+	jQuery.cssHooks[ name ] = {
+		get: function( elem, computed, extra ) {
+			if ( computed ) {
+				// certain elements can have dimension info if we invisibly show them
+				// however, it must have a current display style that would benefit from this
+				return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?
+					jQuery.swap( elem, cssShow, function() {
+						return getWidthOrHeight( elem, name, extra );
+					}) :
+					getWidthOrHeight( elem, name, extra );
+			}
+		},
+
+		set: function( elem, value, extra ) {
+			var styles = extra && getStyles( elem );
+			return setPositiveNumber( elem, value, extra ?
+				augmentWidthOrHeight(
+					elem,
+					name,
+					extra,
+					jQuery.support.boxSizing && jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
+					styles
+				) : 0
+			);
+		}
+	};
+});
+
+if ( !jQuery.support.opacity ) {
+	jQuery.cssHooks.opacity = {
+		get: function( elem, computed ) {
+			// IE uses filters for opacity
+			return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+				( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+				computed ? "1" : "";
+		},
+
+		set: function( elem, value ) {
+			var style = elem.style,
+				currentStyle = elem.currentStyle,
+				opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+				filter = currentStyle && currentStyle.filter || style.filter || "";
+
+			// IE has trouble with opacity if it does not have layout
+			// Force it by setting the zoom level
+			style.zoom = 1;
+
+			// if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+			// if value === "", then remove inline opacity #12685
+			if ( ( value >= 1 || value === "" ) &&
+					jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+					style.removeAttribute ) {
+
+				// Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+				// if "filter:" is present at all, clearType is disabled, we want to avoid this
+				// style.removeAttribute is IE Only, but so apparently is this code path...
+				style.removeAttribute( "filter" );
+
+				// if there is no filter style applied in a css rule or unset inline opacity, we are done
+				if ( value === "" || currentStyle && !currentStyle.filter ) {
+					return;
+				}
+			}
+
+			// otherwise, set new filter values
+			style.filter = ralpha.test( filter ) ?
+				filter.replace( ralpha, opacity ) :
+				filter + " " + opacity;
+		}
+	};
+}
+
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+	if ( !jQuery.support.reliableMarginRight ) {
+		jQuery.cssHooks.marginRight = {
+			get: function( elem, computed ) {
+				if ( computed ) {
+					// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+					// Work around by temporarily setting element display to inline-block
+					return jQuery.swap( elem, { "display": "inline-block" },
+						curCSS, [ elem, "marginRight" ] );
+				}
+			}
+		};
+	}
+
+	// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+	// getComputedStyle returns percent when specified for top/left/bottom/right
+	// rather than make the css module depend on the offset module, we just check for it here
+	if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+		jQuery.each( [ "top", "left" ], function( i, prop ) {
+			jQuery.cssHooks[ prop ] = {
+				get: function( elem, computed ) {
+					if ( computed ) {
+						computed = curCSS( elem, prop );
+						// if curCSS returns percentage, fallback to offset
+						return rnumnonpx.test( computed ) ?
+							jQuery( elem ).position()[ prop ] + "px" :
+							computed;
+					}
+				}
+			};
+		});
+	}
+
+});
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.hidden = function( elem ) {
+		// Support: Opera <= 12.12
+		// Opera reports offsetWidths and offsetHeights less than zero on some elements
+		return elem.offsetWidth <= 0 && elem.offsetHeight <= 0 ||
+			(!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
+	};
+
+	jQuery.expr.filters.visible = function( elem ) {
+		return !jQuery.expr.filters.hidden( elem );
+	};
+}
+
+// These hooks are used by animate to expand properties
+jQuery.each({
+	margin: "",
+	padding: "",
+	border: "Width"
+}, function( prefix, suffix ) {
+	jQuery.cssHooks[ prefix + suffix ] = {
+		expand: function( value ) {
+			var i = 0,
+				expanded = {},
+
+				// assumes a single number if not a string
+				parts = typeof value === "string" ? value.split(" ") : [ value ];
+
+			for ( ; i < 4; i++ ) {
+				expanded[ prefix + cssExpand[ i ] + suffix ] =
+					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
+			}
+
+			return expanded;
+		}
+	};
+
+	if ( !rmargin.test( prefix ) ) {
+		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+	}
+});
+var r20 = /%20/g,
+	rbracket = /\[\]$/,
+	rCRLF = /\r?\n/g,
+	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+	rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+jQuery.fn.extend({
+	serialize: function() {
+		return jQuery.param( this.serializeArray() );
+	},
+	serializeArray: function() {
+		return this.map(function(){
+			// Can add propHook for "elements" to filter or add form elements
+			var elements = jQuery.prop( this, "elements" );
+			return elements ? jQuery.makeArray( elements ) : this;
+		})
+		.filter(function(){
+			var type = this.type;
+			// Use .is(":disabled") so that fieldset[disabled] works
+			return this.name && !jQuery( this ).is( ":disabled" ) &&
+				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
+				( this.checked || !manipulation_rcheckableType.test( type ) );
+		})
+		.map(function( i, elem ){
+			var val = jQuery( this ).val();
+
+			return val == null ?
+				null :
+				jQuery.isArray( val ) ?
+					jQuery.map( val, function( val ){
+						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+					}) :
+					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+		}).get();
+	}
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+	var prefix,
+		s = [],
+		add = function( key, value ) {
+			// If value is a function, invoke it and return its value
+			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+		};
+
+	// Set traditional to true for jQuery <= 1.3.2 behavior.
+	if ( traditional === undefined ) {
+		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+	}
+
+	// If an array was passed in, assume that it is an array of form elements.
+	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+		// Serialize the form elements
+		jQuery.each( a, function() {
+			add( this.name, this.value );
+		});
+
+	} else {
+		// If traditional, encode the "old" way (the way 1.3.2 or older
+		// did it), otherwise encode params recursively.
+		for ( prefix in a ) {
+			buildParams( prefix, a[ prefix ], traditional, add );
+		}
+	}
+
+	// Return the resulting serialization
+	return s.join( "&" ).replace( r20, "+" );
+};
+
+function buildParams( prefix, obj, traditional, add ) {
+	var name;
+
+	if ( jQuery.isArray( obj ) ) {
+		// Serialize array item.
+		jQuery.each( obj, function( i, v ) {
+			if ( traditional || rbracket.test( prefix ) ) {
+				// Treat each array item as a scalar.
+				add( prefix, v );
+
+			} else {
+				// Item is non-scalar (array or object), encode its numeric index.
+				buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+			}
+		});
+
+	} else if ( !traditional && jQuery.type( obj ) === "object" ) {
+		// Serialize object item.
+		for ( name in obj ) {
+			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+		}
+
+	} else {
+		// Serialize scalar item.
+		add( prefix, obj );
+	}
+}
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+	"change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+	// Handle event binding
+	jQuery.fn[ name ] = function( data, fn ) {
+		return arguments.length > 0 ?
+			this.on( name, null, data, fn ) :
+			this.trigger( name );
+	};
+});
+
+jQuery.fn.hover = function( fnOver, fnOut ) {
+	return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
+};
+var
+	// Document location
+	ajaxLocParts,
+	ajaxLocation,
+	ajax_nonce = jQuery.now(),
+
+	ajax_rquery = /\?/,
+	rhash = /#.*$/,
+	rts = /([?&])_=[^&]*/,
+	rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+	// #7653, #8125, #8152: local protocol detection
+	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+	rnoContent = /^(?:GET|HEAD)$/,
+	rprotocol = /^\/\//,
+	rurl = /^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
+
+	// Keep a copy of the old load method
+	_load = jQuery.fn.load,
+
+	/* Prefilters
+	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+	 * 2) These are called:
+	 *    - BEFORE asking for a transport
+	 *    - AFTER param serialization (s.data is a string if s.processData is true)
+	 * 3) key is the dataType
+	 * 4) the catchall symbol "*" can be used
+	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+	 */
+	prefilters = {},
+
+	/* Transports bindings
+	 * 1) key is the dataType
+	 * 2) the catchall symbol "*" can be used
+	 * 3) selection will start with transport dataType and THEN go to "*" if needed
+	 */
+	transports = {},
+
+	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+	allTypes = "*/".concat("*");
+
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+	ajaxLocation = location.href;
+} catch( e ) {
+	// Use the href attribute of an A element
+	// since IE will modify it given document.location
+	ajaxLocation = document.createElement( "a" );
+	ajaxLocation.href = "";
+	ajaxLocation = ajaxLocation.href;
+}
+
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+	// dataTypeExpression is optional and defaults to "*"
+	return function( dataTypeExpression, func ) {
+
+		if ( typeof dataTypeExpression !== "string" ) {
+			func = dataTypeExpression;
+			dataTypeExpression = "*";
+		}
+
+		var dataType,
+			i = 0,
+			dataTypes = dataTypeExpression.toLowerCase().match( core_rnotwhite ) || [];
+
+		if ( jQuery.isFunction( func ) ) {
+			// For each dataType in the dataTypeExpression
+			while ( (dataType = dataTypes[i++]) ) {
+				// Prepend if requested
+				if ( dataType[0] === "+" ) {
+					dataType = dataType.slice( 1 ) || "*";
+					(structure[ dataType ] = structure[ dataType ] || []).unshift( func );
+
+				// Otherwise append
+				} else {
+					(structure[ dataType ] = structure[ dataType ] || []).push( func );
+				}
+			}
+		}
+	};
+}
+
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {
+
+	var inspected = {},
+		seekingTransport = ( structure === transports );
+
+	function inspect( dataType ) {
+		var selected;
+		inspected[ dataType ] = true;
+		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
+			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
+			if( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {
+				options.dataTypes.unshift( dataTypeOrTransport );
+				inspect( dataTypeOrTransport );
+				return false;
+			} else if ( seekingTransport ) {
+				return !( selected = dataTypeOrTransport );
+			}
+		});
+		return selected;
+	}
+
+	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
+}
+
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+	var deep, key,
+		flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+	for ( key in src ) {
+		if ( src[ key ] !== undefined ) {
+			( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];
+		}
+	}
+	if ( deep ) {
+		jQuery.extend( true, target, deep );
+	}
+
+	return target;
+}
+
+jQuery.fn.load = function( url, params, callback ) {
+	if ( typeof url !== "string" && _load ) {
+		return _load.apply( this, arguments );
+	}
+
+	var selector, response, type,
+		self = this,
+		off = url.indexOf(" ");
+
+	if ( off >= 0 ) {
+		selector = url.slice( off, url.length );
+		url = url.slice( 0, off );
+	}
+
+	// If it's a function
+	if ( jQuery.isFunction( params ) ) {
+
+		// We assume that it's the callback
+		callback = params;
+		params = undefined;
+
+	// Otherwise, build a param string
+	} else if ( params && typeof params === "object" ) {
+		type = "POST";
+	}
+
+	// If we have elements to modify, make the request
+	if ( self.length > 0 ) {
+		jQuery.ajax({
+			url: url,
+
+			// if "type" variable is undefined, then "GET" method will be used
+			type: type,
+			dataType: "html",
+			data: params
+		}).done(function( responseText ) {
+
+			// Save response for use in complete callback
+			response = arguments;
+
+			self.html( selector ?
+
+				// If a selector was specified, locate the right elements in a dummy div
+				// Exclude scripts to avoid IE 'Permission Denied' errors
+				jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :
+
+				// Otherwise use the full result
+				responseText );
+
+		}).complete( callback && function( jqXHR, status ) {
+			self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+		});
+	}
+
+	return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ){
+	jQuery.fn[ type ] = function( fn ){
+		return this.on( type, fn );
+	};
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+	jQuery[ method ] = function( url, data, callback, type ) {
+		// shift arguments if data argument was omitted
+		if ( jQuery.isFunction( data ) ) {
+			type = type || callback;
+			callback = data;
+			data = undefined;
+		}
+
+		return jQuery.ajax({
+			url: url,
+			type: method,
+			dataType: type,
+			data: data,
+			success: callback
+		});
+	};
+});
+
+jQuery.extend({
+
+	// Counter for holding the number of active queries
+	active: 0,
+
+	// Last-Modified header cache for next request
+	lastModified: {},
+	etag: {},
+
+	ajaxSettings: {
+		url: ajaxLocation,
+		type: "GET",
+		isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+		global: true,
+		processData: true,
+		async: true,
+		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+		/*
+		timeout: 0,
+		data: null,
+		dataType: null,
+		username: null,
+		password: null,
+		cache: null,
+		throws: false,
+		traditional: false,
+		headers: {},
+		*/
+
+		accepts: {
+			"*": allTypes,
+			text: "text/plain",
+			html: "text/html",
+			xml: "application/xml, text/xml",
+			json: "application/json, text/javascript"
+		},
+
+		contents: {
+			xml: /xml/,
+			html: /html/,
+			json: /json/
+		},
+
+		responseFields: {
+			xml: "responseXML",
+			text: "responseText"
+		},
+
+		// Data converters
+		// Keys separate source (or catchall "*") and destination types with a single space
+		converters: {
+
+			// Convert anything to text
+			"* text": window.String,
+
+			// Text to html (true = no transformation)
+			"text html": true,
+
+			// Evaluate text as a json expression
+			"text json": jQuery.parseJSON,
+
+			// Parse text as xml
+			"text xml": jQuery.parseXML
+		},
+
+		// For options that shouldn't be deep extended:
+		// you can add your own custom options here if
+		// and when you create one that shouldn't be
+		// deep extended (see ajaxExtend)
+		flatOptions: {
+			url: true,
+			context: true
+		}
+	},
+
+	// Creates a full fledged settings object into target
+	// with both ajaxSettings and settings fields.
+	// If target is omitted, writes into ajaxSettings.
+	ajaxSetup: function( target, settings ) {
+		return settings ?
+
+			// Building a settings object
+			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :
+
+			// Extending ajaxSettings
+			ajaxExtend( jQuery.ajaxSettings, target );
+	},
+
+	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+	ajaxTransport: addToPrefiltersOrTransports( transports ),
+
+	// Main method
+	ajax: function( url, options ) {
+
+		// If url is an object, simulate pre-1.5 signature
+		if ( typeof url === "object" ) {
+			options = url;
+			url = undefined;
+		}
+
+		// Force options to be an object
+		options = options || {};
+
+		var // Cross-domain detection vars
+			parts,
+			// Loop variable
+			i,
+			// URL without anti-cache param
+			cacheURL,
+			// Response headers as string
+			responseHeadersString,
+			// timeout handle
+			timeoutTimer,
+
+			// To know if global events are to be dispatched
+			fireGlobals,
+
+			transport,
+			// Response headers
+			responseHeaders,
+			// Create the final options object
+			s = jQuery.ajaxSetup( {}, options ),
+			// Callbacks context
+			callbackContext = s.context || s,
+			// Context for global events is callbackContext if it is a DOM node or jQuery collection
+			globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?
+				jQuery( callbackContext ) :
+				jQuery.event,
+			// Deferreds
+			deferred = jQuery.Deferred(),
+			completeDeferred = jQuery.Callbacks("once memory"),
+			// Status-dependent callbacks
+			statusCode = s.statusCode || {},
+			// Headers (they are sent all at once)
+			requestHeaders = {},
+			requestHeadersNames = {},
+			// The jqXHR state
+			state = 0,
+			// Default abort message
+			strAbort = "canceled",
+			// Fake xhr
+			jqXHR = {
+				readyState: 0,
+
+				// Builds headers hashtable if needed
+				getResponseHeader: function( key ) {
+					var match;
+					if ( state === 2 ) {
+						if ( !responseHeaders ) {
+							responseHeaders = {};
+							while ( (match = rheaders.exec( responseHeadersString )) ) {
+								responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
+							}
+						}
+						match = responseHeaders[ key.toLowerCase() ];
+					}
+					return match == null ? null : match;
+				},
+
+				// Raw string
+				getAllResponseHeaders: function() {
+					return state === 2 ? responseHeadersString : null;
+				},
+
+				// Caches the header
+				setRequestHeader: function( name, value ) {
+					var lname = name.toLowerCase();
+					if ( !state ) {
+						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+						requestHeaders[ name ] = value;
+					}
+					return this;
+				},
+
+				// Overrides response content-type header
+				overrideMimeType: function( type ) {
+					if ( !state ) {
+						s.mimeType = type;
+					}
+					return this;
+				},
+
+				// Status-dependent callbacks
+				statusCode: function( map ) {
+					var code;
+					if ( map ) {
+						if ( state < 2 ) {
+							for ( code in map ) {
+								// Lazy-add the new callback in a way that preserves old ones
+								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
+							}
+						} else {
+							// Execute the appropriate callbacks
+							jqXHR.always( map[ jqXHR.status ] );
+						}
+					}
+					return this;
+				},
+
+				// Cancel the request
+				abort: function( statusText ) {
+					var finalText = statusText || strAbort;
+					if ( transport ) {
+						transport.abort( finalText );
+					}
+					done( 0, finalText );
+					return this;
+				}
+			};
+
+		// Attach deferreds
+		deferred.promise( jqXHR ).complete = completeDeferred.add;
+		jqXHR.success = jqXHR.done;
+		jqXHR.error = jqXHR.fail;
+
+		// Remove hash character (#7531: and string promotion)
+		// Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+		// Handle falsy url in the settings object (#10093: consistency with old signature)
+		// We also use the url parameter if available
+		s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+		// Alias method option to type as per ticket #12004
+		s.type = options.method || options.type || s.method || s.type;
+
+		// Extract dataTypes list
+		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( core_rnotwhite ) || [""];
+
+		// A cross-domain request is in order when we have a protocol:host:port mismatch
+		if ( s.crossDomain == null ) {
+			parts = rurl.exec( s.url.toLowerCase() );
+			s.crossDomain = !!( parts &&
+				( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||
+					( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+						( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+			);
+		}
+
+		// Convert data if not already a string
+		if ( s.data && s.processData && typeof s.data !== "string" ) {
+			s.data = jQuery.param( s.data, s.traditional );
+		}
+
+		// Apply prefilters
+		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
+
+		// If request was aborted inside a prefilter, stop there
+		if ( state === 2 ) {
+			return jqXHR;
+		}
+
+		// We can fire global events as of now if asked to
+		fireGlobals = s.global;
+
+		// Watch for a new set of requests
+		if ( fireGlobals && jQuery.active++ === 0 ) {
+			jQuery.event.trigger("ajaxStart");
+		}
+
+		// Uppercase the type
+		s.type = s.type.toUpperCase();
+
+		// Determine if request has content
+		s.hasContent = !rnoContent.test( s.type );
+
+		// Save the URL in case we're toying with the If-Modified-Since
+		// and/or If-None-Match header later on
+		cacheURL = s.url;
+
+		// More options handling for requests with no content
+		if ( !s.hasContent ) {
+
+			// If data is available, append data to url
+			if ( s.data ) {
+				cacheURL = ( s.url += ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + s.data );
+				// #9682: remove data so that it's not used in an eventual retry
+				delete s.data;
+			}
+
+			// Add anti-cache in url if needed
+			if ( s.cache === false ) {
+				s.url = rts.test( cacheURL ) ?
+
+					// If there is already a '_' parameter, set its value
+					cacheURL.replace( rts, "$1_=" + ajax_nonce++ ) :
+
+					// Otherwise add one to the end
+					cacheURL + ( ajax_rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ajax_nonce++;
+			}
+		}
+
+		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+		if ( s.ifModified ) {
+			if ( jQuery.lastModified[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
+			}
+			if ( jQuery.etag[ cacheURL ] ) {
+				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
+			}
+		}
+
+		// Set the correct header, if data is being sent
+		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+			jqXHR.setRequestHeader( "Content-Type", s.contentType );
+		}
+
+		// Set the Accepts header for the server, depending on the dataType
+		jqXHR.setRequestHeader(
+			"Accept",
+			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+				s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+				s.accepts[ "*" ]
+		);
+
+		// Check for headers option
+		for ( i in s.headers ) {
+			jqXHR.setRequestHeader( i, s.headers[ i ] );
+		}
+
+		// Allow custom headers/mimetypes and early abort
+		if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+			// Abort if not done already and return
+			return jqXHR.abort();
+		}
+
+		// aborting is no longer a cancellation
+		strAbort = "abort";
+
+		// Install callbacks on deferreds
+		for ( i in { success: 1, error: 1, complete: 1 } ) {
+			jqXHR[ i ]( s[ i ] );
+		}
+
+		// Get transport
+		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+
+		// If no transport, we auto-abort
+		if ( !transport ) {
+			done( -1, "No Transport" );
+		} else {
+			jqXHR.readyState = 1;
+
+			// Send global event
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+			}
+			// Timeout
+			if ( s.async && s.timeout > 0 ) {
+				timeoutTimer = setTimeout(function() {
+					jqXHR.abort("timeout");
+				}, s.timeout );
+			}
+
+			try {
+				state = 1;
+				transport.send( requestHeaders, done );
+			} catch ( e ) {
+				// Propagate exception as error if not done
+				if ( state < 2 ) {
+					done( -1, e );
+				// Simply rethrow otherwise
+				} else {
+					throw e;
+				}
+			}
+		}
+
+		// Callback for when everything is done
+		function done( status, nativeStatusText, responses, headers ) {
+			var isSuccess, success, error, response, modified,
+				statusText = nativeStatusText;
+
+			// Called once
+			if ( state === 2 ) {
+				return;
+			}
+
+			// State is "done" now
+			state = 2;
+
+			// Clear timeout if it exists
+			if ( timeoutTimer ) {
+				clearTimeout( timeoutTimer );
+			}
+
+			// Dereference transport for early garbage collection
+			// (no matter how long the jqXHR object will be used)
+			transport = undefined;
+
+			// Cache response headers
+			responseHeadersString = headers || "";
+
+			// Set readyState
+			jqXHR.readyState = status > 0 ? 4 : 0;
+
+			// Get response data
+			if ( responses ) {
+				response = ajaxHandleResponses( s, jqXHR, responses );
+			}
+
+			// If successful, handle type chaining
+			if ( status >= 200 && status < 300 || status === 304 ) {
+
+				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+				if ( s.ifModified ) {
+					modified = jqXHR.getResponseHeader("Last-Modified");
+					if ( modified ) {
+						jQuery.lastModified[ cacheURL ] = modified;
+					}
+					modified = jqXHR.getResponseHeader("etag");
+					if ( modified ) {
+						jQuery.etag[ cacheURL ] = modified;
+					}
+				}
+
+				// if no content
+				if ( status === 204 ) {
+					isSuccess = true;
+					statusText = "nocontent";
+
+				// if not modified
+				} else if ( status === 304 ) {
+					isSuccess = true;
+					statusText = "notmodified";
+
+				// If we have data, let's convert it
+				} else {
+					isSuccess = ajaxConvert( s, response );
+					statusText = isSuccess.state;
+					success = isSuccess.data;
+					error = isSuccess.error;
+					isSuccess = !error;
+				}
+			} else {
+				// We extract error from statusText
+				// then normalize statusText and status for non-aborts
+				error = statusText;
+				if ( status || !statusText ) {
+					statusText = "error";
+					if ( status < 0 ) {
+						status = 0;
+					}
+				}
+			}
+
+			// Set data for the fake xhr object
+			jqXHR.status = status;
+			jqXHR.statusText = ( nativeStatusText || statusText ) + "";
+
+			// Success/Error
+			if ( isSuccess ) {
+				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+			} else {
+				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+			}
+
+			// Status-dependent callbacks
+			jqXHR.statusCode( statusCode );
+			statusCode = undefined;
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
+					[ jqXHR, s, isSuccess ? success : error ] );
+			}
+
+			// Complete
+			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+
+			if ( fireGlobals ) {
+				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+				// Handle the global AJAX counter
+				if ( !( --jQuery.active ) ) {
+					jQuery.event.trigger("ajaxStop");
+				}
+			}
+		}
+
+		return jqXHR;
+	},
+
+	getScript: function( url, callback ) {
+		return jQuery.get( url, undefined, callback, "script" );
+	},
+
+	getJSON: function( url, data, callback ) {
+		return jQuery.get( url, data, callback, "json" );
+	}
+});
+
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
+	var firstDataType, ct, finalDataType, type,
+		contents = s.contents,
+		dataTypes = s.dataTypes,
+		responseFields = s.responseFields;
+
+	// Fill responseXXX fields
+	for ( type in responseFields ) {
+		if ( type in responses ) {
+			jqXHR[ responseFields[type] ] = responses[ type ];
+		}
+	}
+
+	// Remove auto dataType and get content-type in the process
+	while( dataTypes[ 0 ] === "*" ) {
+		dataTypes.shift();
+		if ( ct === undefined ) {
+			ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+		}
+	}
+
+	// Check if we're dealing with a known content-type
+	if ( ct ) {
+		for ( type in contents ) {
+			if ( contents[ type ] && contents[ type ].test( ct ) ) {
+				dataTypes.unshift( type );
+				break;
+			}
+		}
+	}
+
+	// Check to see if we have a response for the expected dataType
+	if ( dataTypes[ 0 ] in responses ) {
+		finalDataType = dataTypes[ 0 ];
+	} else {
+		// Try convertible dataTypes
+		for ( type in responses ) {
+			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+				finalDataType = type;
+				break;
+			}
+			if ( !firstDataType ) {
+				firstDataType = type;
+			}
+		}
+		// Or just use first one
+		finalDataType = finalDataType || firstDataType;
+	}
+
+	// If we found a dataType
+	// We add the dataType to the list if needed
+	// and return the corresponding response
+	if ( finalDataType ) {
+		if ( finalDataType !== dataTypes[ 0 ] ) {
+			dataTypes.unshift( finalDataType );
+		}
+		return responses[ finalDataType ];
+	}
+}
+
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+	var conv2, current, conv, tmp,
+		converters = {},
+		i = 0,
+		// Work with a copy of dataTypes in case we need to modify it for conversion
+		dataTypes = s.dataTypes.slice(),
+		prev = dataTypes[ 0 ];
+
+	// Apply the dataFilter if provided
+	if ( s.dataFilter ) {
+		response = s.dataFilter( response, s.dataType );
+	}
+
+	// Create converters map with lowercased keys
+	if ( dataTypes[ 1 ] ) {
+		for ( conv in s.converters ) {
+			converters[ conv.toLowerCase() ] = s.converters[ conv ];
+		}
+	}
+
+	// Convert to each sequential dataType, tolerating list modification
+	for ( ; (current = dataTypes[++i]); ) {
+
+		// There's only work to do if current dataType is non-auto
+		if ( current !== "*" ) {
+
+			// Convert response if prev dataType is non-auto and differs from current
+			if ( prev !== "*" && prev !== current ) {
+
+				// Seek a direct converter
+				conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+				// If none found, seek a pair
+				if ( !conv ) {
+					for ( conv2 in converters ) {
+
+						// If conv2 outputs current
+						tmp = conv2.split(" ");
+						if ( tmp[ 1 ] === current ) {
+
+							// If prev can be converted to accepted input
+							conv = converters[ prev + " " + tmp[ 0 ] ] ||
+								converters[ "* " + tmp[ 0 ] ];
+							if ( conv ) {
+								// Condense equivalence converters
+								if ( conv === true ) {
+									conv = converters[ conv2 ];
+
+								// Otherwise, insert the intermediate dataType
+								} else if ( converters[ conv2 ] !== true ) {
+									current = tmp[ 0 ];
+									dataTypes.splice( i--, 0, current );
+								}
+
+								break;
+							}
+						}
+					}
+				}
+
+				// Apply converter (if not an equivalence)
+				if ( conv !== true ) {
+
+					// Unless errors are allowed to bubble, catch and return them
+					if ( conv && s["throws"] ) {
+						response = conv( response );
+					} else {
+						try {
+							response = conv( response );
+						} catch ( e ) {
+							return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+						}
+					}
+				}
+			}
+
+			// Update prev for next iteration
+			prev = current;
+		}
+	}
+
+	return { state: "success", data: response };
+}
+// Install script dataType
+jQuery.ajaxSetup({
+	accepts: {
+		script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+	},
+	contents: {
+		script: /(?:java|ecma)script/
+	},
+	converters: {
+		"text script": function( text ) {
+			jQuery.globalEval( text );
+			return text;
+		}
+	}
+});
+
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+	if ( s.cache === undefined ) {
+		s.cache = false;
+	}
+	if ( s.crossDomain ) {
+		s.type = "GET";
+		s.global = false;
+	}
+});
+
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
+
+	// This transport only deals with cross domain requests
+	if ( s.crossDomain ) {
+
+		var script,
+			head = document.head || jQuery("head")[0] || document.documentElement;
+
+		return {
+
+			send: function( _, callback ) {
+
+				script = document.createElement("script");
+
+				script.async = true;
+
+				if ( s.scriptCharset ) {
+					script.charset = s.scriptCharset;
+				}
+
+				script.src = s.url;
+
+				// Attach handlers for all browsers
+				script.onload = script.onreadystatechange = function( _, isAbort ) {
+
+					if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
+
+						// Handle memory leak in IE
+						script.onload = script.onreadystatechange = null;
+
+						// Remove the script
+						if ( script.parentNode ) {
+							script.parentNode.removeChild( script );
+						}
+
+						// Dereference the script
+						script = null;
+
+						// Callback if not abort
+						if ( !isAbort ) {
+							callback( 200, "success" );
+						}
+					}
+				};
+
+				// Circumvent IE6 bugs with base elements (#2709 and #4378) by prepending
+				// Use native DOM manipulation to avoid our domManip AJAX trickery
+				head.insertBefore( script, head.firstChild );
+			},
+
+			abort: function() {
+				if ( script ) {
+					script.onload( undefined, true );
+				}
+			}
+		};
+	}
+});
+var oldCallbacks = [],
+	rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+// Default jsonp settings
+jQuery.ajaxSetup({
+	jsonp: "callback",
+	jsonpCallback: function() {
+		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( ajax_nonce++ ) );
+		this[ callback ] = true;
+		return callback;
+	}
+});
+
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+	var callbackName, overwritten, responseContainer,
+		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
+			"url" :
+			typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"
+		);
+
+	// Handle iff the expected data type is "jsonp" or we have a parameter to set
+	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {
+
+		// Get callback name, remembering preexisting value associated with it
+		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+			s.jsonpCallback() :
+			s.jsonpCallback;
+
+		// Insert callback into url or form data
+		if ( jsonProp ) {
+			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
+		} else if ( s.jsonp !== false ) {
+			s.url += ( ajax_rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+		}
+
+		// Use data converter to retrieve json after script execution
+		s.converters["script json"] = function() {
+			if ( !responseContainer ) {
+				jQuery.error( callbackName + " was not called" );
+			}
+			return responseContainer[ 0 ];
+		};
+
+		// force json dataType
+		s.dataTypes[ 0 ] = "json";
+
+		// Install callback
+		overwritten = window[ callbackName ];
+		window[ callbackName ] = function() {
+			responseContainer = arguments;
+		};
+
+		// Clean-up function (fires after converters)
+		jqXHR.always(function() {
+			// Restore preexisting value
+			window[ callbackName ] = overwritten;
+
+			// Save back as free
+			if ( s[ callbackName ] ) {
+				// make sure that re-using the options doesn't screw things around
+				s.jsonpCallback = originalSettings.jsonpCallback;
+
+				// save the callback name for future use
+				oldCallbacks.push( callbackName );
+			}
+
+			// Call if it was a function and we have a response
+			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+				overwritten( responseContainer[ 0 ] );
+			}
+
+			responseContainer = overwritten = undefined;
+		});
+
+		// Delegate to script
+		return "script";
+	}
+});
+var xhrCallbacks, xhrSupported,
+	xhrId = 0,
+	// #5280: Internet Explorer will keep connections alive if we don't abort on unload
+	xhrOnUnloadAbort = window.ActiveXObject && function() {
+		// Abort all pending requests
+		var key;
+		for ( key in xhrCallbacks ) {
+			xhrCallbacks[ key ]( undefined, true );
+		}
+	};
+
+// Functions to create xhrs
+function createStandardXHR() {
+	try {
+		return new window.XMLHttpRequest();
+	} catch( e ) {}
+}
+
+function createActiveXHR() {
+	try {
+		return new window.ActiveXObject("Microsoft.XMLHTTP");
+	} catch( e ) {}
+}
+
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+	/* Microsoft failed to properly
+	 * implement the XMLHttpRequest in IE7 (can't request local files),
+	 * so we use the ActiveXObject when it is available
+	 * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+	 * we need a fallback.
+	 */
+	function() {
+		return !this.isLocal && createStandardXHR() || createActiveXHR();
+	} :
+	// For all other browsers, use the standard XMLHttpRequest object
+	createStandardXHR;
+
+// Determine support properties
+xhrSupported = jQuery.ajaxSettings.xhr();
+jQuery.support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
+xhrSupported = jQuery.support.ajax = !!xhrSupported;
+
+// Create transport if the browser can provide an xhr
+if ( xhrSupported ) {
+
+	jQuery.ajaxTransport(function( s ) {
+		// Cross domain only allowed if supported through XMLHttpRequest
+		if ( !s.crossDomain || jQuery.support.cors ) {
+
+			var callback;
+
+			return {
+				send: function( headers, complete ) {
+
+					// Get a new xhr
+					var handle, i,
+						xhr = s.xhr();
+
+					// Open the socket
+					// Passing null username, generates a login popup on Opera (#2865)
+					if ( s.username ) {
+						xhr.open( s.type, s.url, s.async, s.username, s.password );
+					} else {
+						xhr.open( s.type, s.url, s.async );
+					}
+
+					// Apply custom fields if provided
+					if ( s.xhrFields ) {
+						for ( i in s.xhrFields ) {
+							xhr[ i ] = s.xhrFields[ i ];
+						}
+					}
+
+					// Override mime type if needed
+					if ( s.mimeType && xhr.overrideMimeType ) {
+						xhr.overrideMimeType( s.mimeType );
+					}
+
+					// X-Requested-With header
+					// For cross-domain requests, seeing as conditions for a preflight are
+					// akin to a jigsaw puzzle, we simply never set it to be sure.
+					// (it can always be set on a per-request basis or even using ajaxSetup)
+					// For same-domain requests, won't change header if already provided.
+					if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+						headers["X-Requested-With"] = "XMLHttpRequest";
+					}
+
+					// Need an extra try/catch for cross domain requests in Firefox 3
+					try {
+						for ( i in headers ) {
+							xhr.setRequestHeader( i, headers[ i ] );
+						}
+					} catch( err ) {}
+
+					// Do send the request
+					// This may raise an exception which is actually
+					// handled in jQuery.ajax (so no try/catch here)
+					xhr.send( ( s.hasContent && s.data ) || null );
+
+					// Listener
+					callback = function( _, isAbort ) {
+						var status, responseHeaders, statusText, responses;
+
+						// Firefox throws exceptions when accessing properties
+						// of an xhr when a network error occurred
+						// http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+						try {
+
+							// Was never called and is aborted or complete
+							if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
+
+								// Only called once
+								callback = undefined;
+
+								// Do not keep as active anymore
+								if ( handle ) {
+									xhr.onreadystatechange = jQuery.noop;
+									if ( xhrOnUnloadAbort ) {
+										delete xhrCallbacks[ handle ];
+									}
+								}
+
+								// If it's an abort
+								if ( isAbort ) {
+									// Abort it manually if needed
+									if ( xhr.readyState !== 4 ) {
+										xhr.abort();
+									}
+								} else {
+									responses = {};
+									status = xhr.status;
+									responseHeaders = xhr.getAllResponseHeaders();
+
+									// When requesting binary data, IE6-9 will throw an exception
+									// on any attempt to access responseText (#11426)
+									if ( typeof xhr.responseText === "string" ) {
+										responses.text = xhr.responseText;
+									}
+
+									// Firefox throws an exception when accessing
+									// statusText for faulty cross-domain requests
+									try {
+										statusText = xhr.statusText;
+									} catch( e ) {
+										// We normalize with Webkit giving an empty statusText
+										statusText = "";
+									}
+
+									// Filter status for non standard behaviors
+
+									// If the request is local and we have data: assume a success
+									// (success with no data won't get notified, that's the best we
+									// can do given current implementations)
+									if ( !status && s.isLocal && !s.crossDomain ) {
+										status = responses.text ? 200 : 404;
+									// IE - #1450: sometimes returns 1223 when it should be 204
+									} else if ( status === 1223 ) {
+										status = 204;
+									}
+								}
+							}
+						} catch( firefoxAccessException ) {
+							if ( !isAbort ) {
+								complete( -1, firefoxAccessException );
+							}
+						}
+
+						// Call complete if needed
+						if ( responses ) {
+							complete( status, statusText, responses, responseHeaders );
+						}
+					};
+
+					if ( !s.async ) {
+						// if we're in sync mode we fire the callback
+						callback();
+					} else if ( xhr.readyState === 4 ) {
+						// (IE6 & IE7) if it's in cache and has been
+						// retrieved directly we need to fire the callback
+						setTimeout( callback );
+					} else {
+						handle = ++xhrId;
+						if ( xhrOnUnloadAbort ) {
+							// Create the active xhrs callbacks list if needed
+							// and attach the unload handler
+							if ( !xhrCallbacks ) {
+								xhrCallbacks = {};
+								jQuery( window ).unload( xhrOnUnloadAbort );
+							}
+							// Add to list of active xhrs callbacks
+							xhrCallbacks[ handle ] = callback;
+						}
+						xhr.onreadystatechange = callback;
+					}
+				},
+
+				abort: function() {
+					if ( callback ) {
+						callback( undefined, true );
+					}
+				}
+			};
+		}
+	});
+}
+var fxNow, timerId,
+	rfxtypes = /^(?:toggle|show|hide)$/,
+	rfxnum = new RegExp( "^(?:([+-])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+	rrun = /queueHooks$/,
+	animationPrefilters = [ defaultPrefilter ],
+	tweeners = {
+		"*": [function( prop, value ) {
+			var end, unit,
+				tween = this.createTween( prop, value ),
+				parts = rfxnum.exec( value ),
+				target = tween.cur(),
+				start = +target || 0,
+				scale = 1,
+				maxIterations = 20;
+
+			if ( parts ) {
+				end = +parts[2];
+				unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+				// We need to compute starting value
+				if ( unit !== "px" && start ) {
+					// Iteratively approximate from a nonzero starting point
+					// Prefer the current property, because this process will be trivial if it uses the same units
+					// Fallback to end or a simple constant
+					start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+					do {
+						// If previous iteration zeroed out, double until we get *something*
+						// Use a string for doubling factor so we don't accidentally see scale as unchanged below
+						scale = scale || ".5";
+
+						// Adjust and apply
+						start = start / scale;
+						jQuery.style( tween.elem, prop, start + unit );
+
+					// Update scale, tolerating zero or NaN from tween.cur()
+					// And breaking the loop if scale is unchanged or perfect, or if we've just had enough
+					} while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );
+				}
+
+				tween.unit = unit;
+				tween.start = start;
+				// If a +=/-= token was provided, we're doing a relative animation
+				tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+			}
+			return tween;
+		}]
+	};
+
+// Animations created synchronously will run synchronously
+function createFxNow() {
+	setTimeout(function() {
+		fxNow = undefined;
+	});
+	return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+	jQuery.each( props, function( prop, value ) {
+		var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+			index = 0,
+			length = collection.length;
+		for ( ; index < length; index++ ) {
+			if ( collection[ index ].call( animation, prop, value ) ) {
+
+				// we're done with this property
+				return;
+			}
+		}
+	});
+}
+
+function Animation( elem, properties, options ) {
+	var result,
+		stopped,
+		index = 0,
+		length = animationPrefilters.length,
+		deferred = jQuery.Deferred().always( function() {
+			// don't match elem in the :animated selector
+			delete tick.elem;
+		}),
+		tick = function() {
+			if ( stopped ) {
+				return false;
+			}
+			var currentTime = fxNow || createFxNow(),
+				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+				// archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)
+				temp = remaining / animation.duration || 0,
+				percent = 1 - temp,
+				index = 0,
+				length = animation.tweens.length;
+
+			for ( ; index < length ; index++ ) {
+				animation.tweens[ index ].run( percent );
+			}
+
+			deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+			if ( percent < 1 && length ) {
+				return remaining;
+			} else {
+				deferred.resolveWith( elem, [ animation ] );
+				return false;
+			}
+		},
+		animation = deferred.promise({
+			elem: elem,
+			props: jQuery.extend( {}, properties ),
+			opts: jQuery.extend( true, { specialEasing: {} }, options ),
+			originalProperties: properties,
+			originalOptions: options,
+			startTime: fxNow || createFxNow(),
+			duration: options.duration,
+			tweens: [],
+			createTween: function( prop, end ) {
+				var tween = jQuery.Tween( elem, animation.opts, prop, end,
+						animation.opts.specialEasing[ prop ] || animation.opts.easing );
+				animation.tweens.push( tween );
+				return tween;
+			},
+			stop: function( gotoEnd ) {
+				var index = 0,
+					// if we are going to the end, we want to run all the tweens
+					// otherwise we skip this part
+					length = gotoEnd ? animation.tweens.length : 0;
+				if ( stopped ) {
+					return this;
+				}
+				stopped = true;
+				for ( ; index < length ; index++ ) {
+					animation.tweens[ index ].run( 1 );
+				}
+
+				// resolve when we played the last frame
+				// otherwise, reject
+				if ( gotoEnd ) {
+					deferred.resolveWith( elem, [ animation, gotoEnd ] );
+				} else {
+					deferred.rejectWith( elem, [ animation, gotoEnd ] );
+				}
+				return this;
+			}
+		}),
+		props = animation.props;
+
+	propFilter( props, animation.opts.specialEasing );
+
+	for ( ; index < length ; index++ ) {
+		result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+		if ( result ) {
+			return result;
+		}
+	}
+
+	createTweens( animation, props );
+
+	if ( jQuery.isFunction( animation.opts.start ) ) {
+		animation.opts.start.call( elem, animation );
+	}
+
+	jQuery.fx.timer(
+		jQuery.extend( tick, {
+			elem: elem,
+			anim: animation,
+			queue: animation.opts.queue
+		})
+	);
+
+	// attach callbacks from options
+	return animation.progress( animation.opts.progress )
+		.done( animation.opts.done, animation.opts.complete )
+		.fail( animation.opts.fail )
+		.always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+	var value, name, index, easing, hooks;
+
+	// camelCase, specialEasing and expand cssHook pass
+	for ( index in props ) {
+		name = jQuery.camelCase( index );
+		easing = specialEasing[ name ];
+		value = props[ index ];
+		if ( jQuery.isArray( value ) ) {
+			easing = value[ 1 ];
+			value = props[ index ] = value[ 0 ];
+		}
+
+		if ( index !== name ) {
+			props[ name ] = value;
+			delete props[ index ];
+		}
+
+		hooks = jQuery.cssHooks[ name ];
+		if ( hooks && "expand" in hooks ) {
+			value = hooks.expand( value );
+			delete props[ name ];
+
+			// not quite $.extend, this wont overwrite keys already present.
+			// also - reusing 'index' from above because we have the correct "name"
+			for ( index in value ) {
+				if ( !( index in props ) ) {
+					props[ index ] = value[ index ];
+					specialEasing[ index ] = easing;
+				}
+			}
+		} else {
+			specialEasing[ name ] = easing;
+		}
+	}
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+	tweener: function( props, callback ) {
+		if ( jQuery.isFunction( props ) ) {
+			callback = props;
+			props = [ "*" ];
+		} else {
+			props = props.split(" ");
+		}
+
+		var prop,
+			index = 0,
+			length = props.length;
+
+		for ( ; index < length ; index++ ) {
+			prop = props[ index ];
+			tweeners[ prop ] = tweeners[ prop ] || [];
+			tweeners[ prop ].unshift( callback );
+		}
+	},
+
+	prefilter: function( callback, prepend ) {
+		if ( prepend ) {
+			animationPrefilters.unshift( callback );
+		} else {
+			animationPrefilters.push( callback );
+		}
+	}
+});
+
+function defaultPrefilter( elem, props, opts ) {
+	/*jshint validthis:true */
+	var prop, index, length,
+		value, dataShow, toggle,
+		tween, hooks, oldfire,
+		anim = this,
+		style = elem.style,
+		orig = {},
+		handled = [],
+		hidden = elem.nodeType && isHidden( elem );
+
+	// handle queue: false promises
+	if ( !opts.queue ) {
+		hooks = jQuery._queueHooks( elem, "fx" );
+		if ( hooks.unqueued == null ) {
+			hooks.unqueued = 0;
+			oldfire = hooks.empty.fire;
+			hooks.empty.fire = function() {
+				if ( !hooks.unqueued ) {
+					oldfire();
+				}
+			};
+		}
+		hooks.unqueued++;
+
+		anim.always(function() {
+			// doing this makes sure that the complete handler will be called
+			// before this completes
+			anim.always(function() {
+				hooks.unqueued--;
+				if ( !jQuery.queue( elem, "fx" ).length ) {
+					hooks.empty.fire();
+				}
+			});
+		});
+	}
+
+	// height/width overflow pass
+	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+		// Make sure that nothing sneaks out
+		// Record all 3 overflow attributes because IE does not
+		// change the overflow attribute when overflowX and
+		// overflowY are set to the same value
+		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
+
+		// Set display property to inline-block for height/width
+		// animations on inline elements that are having width/height animated
+		if ( jQuery.css( elem, "display" ) === "inline" &&
+				jQuery.css( elem, "float" ) === "none" ) {
+
+			// inline-level elements accept inline-block;
+			// block-level elements need to be inline with layout
+			if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+				style.display = "inline-block";
+
+			} else {
+				style.zoom = 1;
+			}
+		}
+	}
+
+	if ( opts.overflow ) {
+		style.overflow = "hidden";
+		if ( !jQuery.support.shrinkWrapBlocks ) {
+			anim.always(function() {
+				style.overflow = opts.overflow[ 0 ];
+				style.overflowX = opts.overflow[ 1 ];
+				style.overflowY = opts.overflow[ 2 ];
+			});
+		}
+	}
+
+
+	// show/hide pass
+	for ( index in props ) {
+		value = props[ index ];
+		if ( rfxtypes.exec( value ) ) {
+			delete props[ index ];
+			toggle = toggle || value === "toggle";
+			if ( value === ( hidden ? "hide" : "show" ) ) {
+				continue;
+			}
+			handled.push( index );
+		}
+	}
+
+	length = handled.length;
+	if ( length ) {
+		dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+		if ( "hidden" in dataShow ) {
+			hidden = dataShow.hidden;
+		}
+
+		// store state if its toggle - enables .stop().toggle() to "reverse"
+		if ( toggle ) {
+			dataShow.hidden = !hidden;
+		}
+		if ( hidden ) {
+			jQuery( elem ).show();
+		} else {
+			anim.done(function() {
+				jQuery( elem ).hide();
+			});
+		}
+		anim.done(function() {
+			var prop;
+			jQuery._removeData( elem, "fxshow" );
+			for ( prop in orig ) {
+				jQuery.style( elem, prop, orig[ prop ] );
+			}
+		});
+		for ( index = 0 ; index < length ; index++ ) {
+			prop = handled[ index ];
+			tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+			orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
+
+			if ( !( prop in dataShow ) ) {
+				dataShow[ prop ] = tween.start;
+				if ( hidden ) {
+					tween.end = tween.start;
+					tween.start = prop === "width" || prop === "height" ? 1 : 0;
+				}
+			}
+		}
+	}
+}
+
+function Tween( elem, options, prop, end, easing ) {
+	return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+	constructor: Tween,
+	init: function( elem, options, prop, end, easing, unit ) {
+		this.elem = elem;
+		this.prop = prop;
+		this.easing = easing || "swing";
+		this.options = options;
+		this.start = this.now = this.cur();
+		this.end = end;
+		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+	},
+	cur: function() {
+		var hooks = Tween.propHooks[ this.prop ];
+
+		return hooks && hooks.get ?
+			hooks.get( this ) :
+			Tween.propHooks._default.get( this );
+	},
+	run: function( percent ) {
+		var eased,
+			hooks = Tween.propHooks[ this.prop ];
+
+		if ( this.options.duration ) {
+			this.pos = eased = jQuery.easing[ this.easing ](
+				percent, this.options.duration * percent, 0, 1, this.options.duration
+			);
+		} else {
+			this.pos = eased = percent;
+		}
+		this.now = ( this.end - this.start ) * eased + this.start;
+
+		if ( this.options.step ) {
+			this.options.step.call( this.elem, this.now, this );
+		}
+
+		if ( hooks && hooks.set ) {
+			hooks.set( this );
+		} else {
+			Tween.propHooks._default.set( this );
+		}
+		return this;
+	}
+};
+
+Tween.prototype.init.prototype = Tween.prototype;
+
+Tween.propHooks = {
+	_default: {
+		get: function( tween ) {
+			var result;
+
+			if ( tween.elem[ tween.prop ] != null &&
+				(!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+				return tween.elem[ tween.prop ];
+			}
+
+			// passing an empty string as a 3rd parameter to .css will automatically
+			// attempt a parseFloat and fallback to a string if the parse fails
+			// so, simple values such as "10px" are parsed to Float.
+			// complex values such as "rotate(1rad)" are returned as is.
+			result = jQuery.css( tween.elem, tween.prop, "" );
+			// Empty strings, null, undefined and "auto" are converted to 0.
+			return !result || result === "auto" ? 0 : result;
+		},
+		set: function( tween ) {
+			// use step hook for back compat - use cssHook if its there - use .style if its
+			// available and use plain properties where available
+			if ( jQuery.fx.step[ tween.prop ] ) {
+				jQuery.fx.step[ tween.prop ]( tween );
+			} else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+			} else {
+				tween.elem[ tween.prop ] = tween.now;
+			}
+		}
+	}
+};
+
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
+
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+	set: function( tween ) {
+		if ( tween.elem.nodeType && tween.elem.parentNode ) {
+			tween.elem[ tween.prop ] = tween.now;
+		}
+	}
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+	var cssFn = jQuery.fn[ name ];
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return speed == null || typeof speed === "boolean" ?
+			cssFn.apply( this, arguments ) :
+			this.animate( genFx( name, true ), speed, easing, callback );
+	};
+});
+
+jQuery.fn.extend({
+	fadeTo: function( speed, to, easing, callback ) {
+
+		// show any hidden elements after setting opacity to 0
+		return this.filter( isHidden ).css( "opacity", 0 ).show()
+
+			// animate to the value specified
+			.end().animate({ opacity: to }, speed, easing, callback );
+	},
+	animate: function( prop, speed, easing, callback ) {
+		var empty = jQuery.isEmptyObject( prop ),
+			optall = jQuery.speed( speed, easing, callback ),
+			doAnimation = function() {
+				// Operate on a copy of prop so per-property easing won't be lost
+				var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+				doAnimation.finish = function() {
+					anim.stop( true );
+				};
+				// Empty animations, or finishing resolves immediately
+				if ( empty || jQuery._data( this, "finish" ) ) {
+					anim.stop( true );
+				}
+			};
+			doAnimation.finish = doAnimation;
+
+		return empty || optall.queue === false ?
+			this.each( doAnimation ) :
+			this.queue( optall.queue, doAnimation );
+	},
+	stop: function( type, clearQueue, gotoEnd ) {
+		var stopQueue = function( hooks ) {
+			var stop = hooks.stop;
+			delete hooks.stop;
+			stop( gotoEnd );
+		};
+
+		if ( typeof type !== "string" ) {
+			gotoEnd = clearQueue;
+			clearQueue = type;
+			type = undefined;
+		}
+		if ( clearQueue && type !== false ) {
+			this.queue( type || "fx", [] );
+		}
+
+		return this.each(function() {
+			var dequeue = true,
+				index = type != null && type + "queueHooks",
+				timers = jQuery.timers,
+				data = jQuery._data( this );
+
+			if ( index ) {
+				if ( data[ index ] && data[ index ].stop ) {
+					stopQueue( data[ index ] );
+				}
+			} else {
+				for ( index in data ) {
+					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+						stopQueue( data[ index ] );
+					}
+				}
+			}
+
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+					timers[ index ].anim.stop( gotoEnd );
+					dequeue = false;
+					timers.splice( index, 1 );
+				}
+			}
+
+			// start the next in the queue if the last step wasn't forced
+			// timers currently will call their complete callbacks, which will dequeue
+			// but only if they were gotoEnd
+			if ( dequeue || !gotoEnd ) {
+				jQuery.dequeue( this, type );
+			}
+		});
+	},
+	finish: function( type ) {
+		if ( type !== false ) {
+			type = type || "fx";
+		}
+		return this.each(function() {
+			var index,
+				data = jQuery._data( this ),
+				queue = data[ type + "queue" ],
+				hooks = data[ type + "queueHooks" ],
+				timers = jQuery.timers,
+				length = queue ? queue.length : 0;
+
+			// enable finishing flag on private data
+			data.finish = true;
+
+			// empty the queue first
+			jQuery.queue( this, type, [] );
+
+			if ( hooks && hooks.cur && hooks.cur.finish ) {
+				hooks.cur.finish.call( this );
+			}
+
+			// look for any active animations, and finish them
+			for ( index = timers.length; index--; ) {
+				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
+					timers[ index ].anim.stop( true );
+					timers.splice( index, 1 );
+				}
+			}
+
+			// look for any animations in the old queue and finish them
+			for ( index = 0; index < length; index++ ) {
+				if ( queue[ index ] && queue[ index ].finish ) {
+					queue[ index ].finish.call( this );
+				}
+			}
+
+			// turn off finishing flag
+			delete data.finish;
+		});
+	}
+});
+
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+	var which,
+		attrs = { height: type },
+		i = 0;
+
+	// if we include width, step value is 1 to do all cssExpand values,
+	// if we don't include width, step value is 2 to skip over Left and Right
+	includeWidth = includeWidth? 1 : 0;
+	for( ; i < 4 ; i += 2 - includeWidth ) {
+		which = cssExpand[ i ];
+		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
+	}
+
+	if ( includeWidth ) {
+		attrs.opacity = attrs.width = type;
+	}
+
+	return attrs;
+}
+
+// Generate shortcuts for custom animations
+jQuery.each({
+	slideDown: genFx("show"),
+	slideUp: genFx("hide"),
+	slideToggle: genFx("toggle"),
+	fadeIn: { opacity: "show" },
+	fadeOut: { opacity: "hide" },
+	fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+	jQuery.fn[ name ] = function( speed, easing, callback ) {
+		return this.animate( props, speed, easing, callback );
+	};
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+		complete: fn || !fn && easing ||
+			jQuery.isFunction( speed ) && speed,
+		duration: speed,
+		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+	};
+
+	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+		opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+
+	// normalize opt.queue - true/undefined/null -> "fx"
+	if ( opt.queue == null || opt.queue === true ) {
+		opt.queue = "fx";
+	}
+
+	// Queueing
+	opt.old = opt.complete;
+
+	opt.complete = function() {
+		if ( jQuery.isFunction( opt.old ) ) {
+			opt.old.call( this );
+		}
+
+		if ( opt.queue ) {
+			jQuery.dequeue( this, opt.queue );
+		}
+	};
+
+	return opt;
+};
+
+jQuery.easing = {
+	linear: function( p ) {
+		return p;
+	},
+	swing: function( p ) {
+		return 0.5 - Math.cos( p*Math.PI ) / 2;
+	}
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+	var timer,
+		timers = jQuery.timers,
+		i = 0;
+
+	fxNow = jQuery.now();
+
+	for ( ; i < timers.length; i++ ) {
+		timer = timers[ i ];
+		// Checks the timer has not already been removed
+		if ( !timer() && timers[ i ] === timer ) {
+			timers.splice( i--, 1 );
+		}
+	}
+
+	if ( !timers.length ) {
+		jQuery.fx.stop();
+	}
+	fxNow = undefined;
+};
+
+jQuery.fx.timer = function( timer ) {
+	if ( timer() && jQuery.timers.push( timer ) ) {
+		jQuery.fx.start();
+	}
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.start = function() {
+	if ( !timerId ) {
+		timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+	}
+};
+
+jQuery.fx.stop = function() {
+	clearInterval( timerId );
+	timerId = null;
+};
+
+jQuery.fx.speeds = {
+	slow: 600,
+	fast: 200,
+	// Default speed
+	_default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+	jQuery.expr.filters.animated = function( elem ) {
+		return jQuery.grep(jQuery.timers, function( fn ) {
+			return elem === fn.elem;
+		}).length;
+	};
+}
+jQuery.fn.offset = function( options ) {
+	if ( arguments.length ) {
+		return options === undefined ?
+			this :
+			this.each(function( i ) {
+				jQuery.offset.setOffset( this, options, i );
+			});
+	}
+
+	var docElem, win,
+		box = { top: 0, left: 0 },
+		elem = this[ 0 ],
+		doc = elem && elem.ownerDocument;
+
+	if ( !doc ) {
+		return;
+	}
+
+	docElem = doc.documentElement;
+
+	// Make sure it's not a disconnected DOM node
+	if ( !jQuery.contains( docElem, elem ) ) {
+		return box;
+	}
+
+	// If we don't have gBCR, just use 0,0 rather than error
+	// BlackBerry 5, iOS 3 (original iPhone)
+	if ( typeof elem.getBoundingClientRect !== core_strundefined ) {
+		box = elem.getBoundingClientRect();
+	}
+	win = getWindow( doc );
+	return {
+		top: box.top  + ( win.pageYOffset || docElem.scrollTop )  - ( docElem.clientTop  || 0 ),
+		left: box.left + ( win.pageXOffset || docElem.scrollLeft ) - ( docElem.clientLeft || 0 )
+	};
+};
+
+jQuery.offset = {
+
+	setOffset: function( elem, options, i ) {
+		var position = jQuery.css( elem, "position" );
+
+		// set position first, in-case top/left are set even on static elem
+		if ( position === "static" ) {
+			elem.style.position = "relative";
+		}
+
+		var curElem = jQuery( elem ),
+			curOffset = curElem.offset(),
+			curCSSTop = jQuery.css( elem, "top" ),
+			curCSSLeft = jQuery.css( elem, "left" ),
+			calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+			props = {}, curPosition = {}, curTop, curLeft;
+
+		// need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+		if ( calculatePosition ) {
+			curPosition = curElem.position();
+			curTop = curPosition.top;
+			curLeft = curPosition.left;
+		} else {
+			curTop = parseFloat( curCSSTop ) || 0;
+			curLeft = parseFloat( curCSSLeft ) || 0;
+		}
+
+		if ( jQuery.isFunction( options ) ) {
+			options = options.call( elem, i, curOffset );
+		}
+
+		if ( options.top != null ) {
+			props.top = ( options.top - curOffset.top ) + curTop;
+		}
+		if ( options.left != null ) {
+			props.left = ( options.left - curOffset.left ) + curLeft;
+		}
+
+		if ( "using" in options ) {
+			options.using.call( elem, props );
+		} else {
+			curElem.css( props );
+		}
+	}
+};
+
+
+jQuery.fn.extend({
+
+	position: function() {
+		if ( !this[ 0 ] ) {
+			return;
+		}
+
+		var offsetParent, offset,
+			parentOffset = { top: 0, left: 0 },
+			elem = this[ 0 ];
+
+		// fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is it's only offset parent
+		if ( jQuery.css( elem, "position" ) === "fixed" ) {
+			// we assume that getBoundingClientRect is available when computed position is fixed
+			offset = elem.getBoundingClientRect();
+		} else {
+			// Get *real* offsetParent
+			offsetParent = this.offsetParent();
+
+			// Get correct offsets
+			offset = this.offset();
+			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
+				parentOffset = offsetParent.offset();
+			}
+
+			// Add offsetParent borders
+			parentOffset.top  += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
+			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
+		}
+
+		// Subtract parent offsets and element margins
+		// note: when an element has margin: auto the offsetLeft and marginLeft
+		// are the same in Safari causing offset.left to incorrectly be 0
+		return {
+			top:  offset.top  - parentOffset.top - jQuery.css( elem, "marginTop", true ),
+			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true)
+		};
+	},
+
+	offsetParent: function() {
+		return this.map(function() {
+			var offsetParent = this.offsetParent || document.documentElement;
+			while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position") === "static" ) ) {
+				offsetParent = offsetParent.offsetParent;
+			}
+			return offsetParent || document.documentElement;
+		});
+	}
+});
+
+
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+	var top = /Y/.test( prop );
+
+	jQuery.fn[ method ] = function( val ) {
+		return jQuery.access( this, function( elem, method, val ) {
+			var win = getWindow( elem );
+
+			if ( val === undefined ) {
+				return win ? (prop in win) ? win[ prop ] :
+					win.document.documentElement[ method ] :
+					elem[ method ];
+			}
+
+			if ( win ) {
+				win.scrollTo(
+					!top ? val : jQuery( win ).scrollLeft(),
+					top ? val : jQuery( win ).scrollTop()
+				);
+
+			} else {
+				elem[ method ] = val;
+			}
+		}, method, val, arguments.length, null );
+	};
+});
+
+function getWindow( elem ) {
+	return jQuery.isWindow( elem ) ?
+		elem :
+		elem.nodeType === 9 ?
+			elem.defaultView || elem.parentWindow :
+			false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+		// margin is only for outerHeight, outerWidth
+		jQuery.fn[ funcName ] = function( margin, value ) {
+			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
+
+			return jQuery.access( this, function( elem, type, value ) {
+				var doc;
+
+				if ( jQuery.isWindow( elem ) ) {
+					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+					// isn't a whole lot we can do. See pull request at this URL for discussion:
+					// https://github.com/jquery/jquery/pull/764
+					return elem.document.documentElement[ "client" + name ];
+				}
+
+				// Get document width or height
+				if ( elem.nodeType === 9 ) {
+					doc = elem.documentElement;
+
+					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+					// unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
+					return Math.max(
+						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+						elem.body[ "offset" + name ], doc[ "offset" + name ],
+						doc[ "client" + name ]
+					);
+				}
+
+				return value === undefined ?
+					// Get width or height on the element, requesting but not forcing parseFloat
+					jQuery.css( elem, type, extra ) :
+
+					// Set width or height on the element
+					jQuery.style( elem, type, value, extra );
+			}, type, chainable ? margin : undefined, chainable, null );
+		};
+	});
+});
+// Limit scope pollution from any deprecated API
+// (function() {
+
+// })();
+// Expose jQuery to the global object
+window.jQuery = window.$ = jQuery;
+
+// Expose jQuery as an AMD module, but only for AMD loaders that
+// understand the issues with loading multiple versions of jQuery
+// in a page that all might call define(). The loader will indicate
+// they have special allowances for multiple jQuery versions by
+// specifying define.amd.jQuery = true. Register as a named module,
+// since jQuery can be concatenated with other files that may use define,
+// but not use a proper concatenation script that understands anonymous
+// AMD modules. A named AMD is safest and most robust way to register.
+// Lowercase jquery is used because AMD module names are derived from
+// file names, and jQuery is normally delivered in a lowercase file name.
+// Do this after creating the global so that if an AMD module wants to call
+// noConflict to hide this version of jQuery, it will work.
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+	define( "jquery", [], function () { return jQuery; } );
+}
+
+})( window );
new file mode 100644
index 0000000000000000000000000000000000000000..75cdf246af2ce175e72b45314052203fd04a4428
GIT binary patch
literal 4503519
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%0AE|lDow#J%s%Bd5nFyOi-}VuRlHVVs<zt
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
Z^$ic<G3AKY1wQCLTWOGug;RR@{{iN8=`R2P
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/frameworks/jquery.mobile-1.4.js
@@ -0,0 +1,15056 @@
+/*!
+* jQuery Mobile 1.4.2
+* Git HEAD hash: 9d9a42a27d0c693e8b5569c3a10d771916af5045 <> Date: Fri Feb 28 2014 17:32:01 UTC
+* http://jquerymobile.com
+*
+* Copyright 2010, 2014 jQuery Foundation, Inc. and other contributors
+* Released under the MIT license.
+* http://jquery.org/license
+*
+*/
+
+
+(function ( root, doc, factory ) {
+	if ( typeof define === "function" && define.amd ) {
+		// AMD. Register as an anonymous module.
+		define( [ "jquery" ], function ( $ ) {
+			factory( $, root, doc );
+			return $.mobile;
+		});
+	} else {
+		// Browser globals
+		factory( root.jQuery, root, doc );
+	}
+}( this, document, function ( jQuery, window, document, undefined ) {
+(function( $ ) {
+	$.mobile = {};
+}( jQuery ));
+
+(function( $, window, undefined ) {
+	$.extend( $.mobile, {
+
+		// Version of the jQuery Mobile Framework
+		version: "1.4.2",
+
+		// Deprecated and no longer used in 1.4 remove in 1.5
+		// Define the url parameter used for referencing widget-generated sub-pages.
+		// Translates to example.html&ui-page=subpageIdentifier
+		// hash segment before &ui-page= is used to make Ajax request
+		subPageUrlKey: "ui-page",
+
+		hideUrlBar: true,
+
+		// Keepnative Selector
+		keepNative: ":jqmData(role='none'), :jqmData(role='nojs')",
+
+		// Deprecated in 1.4 remove in 1.5
+		// Class assigned to page currently in view, and during transitions
+		activePageClass: "ui-page-active",
+
+		// Deprecated in 1.4 remove in 1.5
+		// Class used for "active" button state, from CSS framework
+		activeBtnClass: "ui-btn-active",
+
+		// Deprecated in 1.4 remove in 1.5
+		// Class used for "focus" form element state, from CSS framework
+		focusClass: "ui-focus",
+
+		// Automatically handle clicks and form submissions through Ajax, when same-domain
+		ajaxEnabled: true,
+
+		// Automatically load and show pages based on location.hash
+		hashListeningEnabled: true,
+
+		// disable to prevent jquery from bothering with links
+		linkBindingEnabled: true,
+
+		// Set default page transition - 'none' for no transitions
+		defaultPageTransition: "fade",
+
+		// Set maximum window width for transitions to apply - 'false' for no limit
+		maxTransitionWidth: false,
+
+		// Minimum scroll distance that will be remembered when returning to a page
+		// Deprecated remove in 1.5
+		minScrollBack: 0,
+
+		// Set default dialog transition - 'none' for no transitions
+		defaultDialogTransition: "pop",
+
+		// Error response message - appears when an Ajax page request fails
+		pageLoadErrorMessage: "Error Loading Page",
+
+		// For error messages, which theme does the box uses?
+		pageLoadErrorMessageTheme: "a",
+
+		// replace calls to window.history.back with phonegaps navigation helper
+		// where it is provided on the window object
+		phonegapNavigationEnabled: false,
+
+		//automatically initialize the DOM when it's ready
+		autoInitializePage: true,
+
+		pushStateEnabled: true,
+
+		// allows users to opt in to ignoring content by marking a parent element as
+		// data-ignored
+		ignoreContentEnabled: false,
+
+		buttonMarkup: {
+			hoverDelay: 200
+		},
+
+		// disable the alteration of the dynamic base tag or links in the case
+		// that a dynamic base tag isn't supported
+		dynamicBaseEnabled: true,
+
+		// default the property to remove dependency on assignment in init module
+		pageContainer: $(),
+
+		//enable cross-domain page support
+		allowCrossDomainPages: false,
+
+		dialogHashKey: "&ui-state=dialog"
+	});
+})( jQuery, this );
+
+(function( $, window, undefined ) {
+	var nsNormalizeDict = {},
+		oldFind = $.find,
+		rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+		jqmDataRE = /:jqmData\(([^)]*)\)/g;
+
+	$.extend( $.mobile, {
+
+		// Namespace used framework-wide for data-attrs. Default is no namespace
+
+		ns: "",
+
+		// Retrieve an attribute from an element and perform some massaging of the value
+
+		getAttribute: function( element, key ) {
+			var data;
+
+			element = element.jquery ? element[0] : element;
+
+			if ( element && element.getAttribute ) {
+				data = element.getAttribute( "data-" + $.mobile.ns + key );
+			}
+
+			// Copied from core's src/data.js:dataAttr()
+			// Convert from a string to a proper data type
+			try {
+				data = data === "true" ? true :
+					data === "false" ? false :
+					data === "null" ? null :
+					// Only convert to a number if it doesn't change the string
+					+data + "" === data ? +data :
+					rbrace.test( data ) ? JSON.parse( data ) :
+					data;
+			} catch( err ) {}
+
+			return data;
+		},
+
+		// Expose our cache for testing purposes.
+		nsNormalizeDict: nsNormalizeDict,
+
+		// Take a data attribute property, prepend the namespace
+		// and then camel case the attribute string. Add the result
+		// to our nsNormalizeDict so we don't have to do this again.
+		nsNormalize: function( prop ) {
+			return nsNormalizeDict[ prop ] ||
+				( nsNormalizeDict[ prop ] = $.camelCase( $.mobile.ns + prop ) );
+		},
+
+		// Find the closest javascript page element to gather settings data jsperf test
+		// http://jsperf.com/single-complex-selector-vs-many-complex-selectors/edit
+		// possibly naive, but it shows that the parsing overhead for *just* the page selector vs
+		// the page and dialog selector is negligable. This could probably be speed up by
+		// doing a similar parent node traversal to the one found in the inherited theme code above
+		closestPageData: function( $target ) {
+			return $target
+				.closest( ":jqmData(role='page'), :jqmData(role='dialog')" )
+				.data( "mobile-page" );
+		}
+
+	});
+
+	// Mobile version of data and removeData and hasData methods
+	// ensures all data is set and retrieved using jQuery Mobile's data namespace
+	$.fn.jqmData = function( prop, value ) {
+		var result;
+		if ( typeof prop !== "undefined" ) {
+			if ( prop ) {
+				prop = $.mobile.nsNormalize( prop );
+			}
+
+			// undefined is permitted as an explicit input for the second param
+			// in this case it returns the value and does not set it to undefined
+			if ( arguments.length < 2 || value === undefined ) {
+				result = this.data( prop );
+			} else {
+				result = this.data( prop, value );
+			}
+		}
+		return result;
+	};
+
+	$.jqmData = function( elem, prop, value ) {
+		var result;
+		if ( typeof prop !== "undefined" ) {
+			result = $.data( elem, prop ? $.mobile.nsNormalize( prop ) : prop, value );
+		}
+		return result;
+	};
+
+	$.fn.jqmRemoveData = function( prop ) {
+		return this.removeData( $.mobile.nsNormalize( prop ) );
+	};
+
+	$.jqmRemoveData = function( elem, prop ) {
+		return $.removeData( elem, $.mobile.nsNormalize( prop ) );
+	};
+
+	$.find = function( selector, context, ret, extra ) {
+		if ( selector.indexOf( ":jqmData" ) > -1 ) {
+			selector = selector.replace( jqmDataRE, "[data-" + ( $.mobile.ns || "" ) + "$1]" );
+		}
+
+		return oldFind.call( this, selector, context, ret, extra );
+	};
+
+	$.extend( $.find, oldFind );
+
+})( jQuery, this );
+
+/*!
+ * jQuery UI Core c0ab71056b936627e8a7821f03c044aec6280a40
+ * http://jqueryui.com
+ *
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/category/ui-core/
+ */
+(function( $, undefined ) {
+
+var uuid = 0,
+	runiqueId = /^ui-id-\d+$/;
+
+// $.ui might exist from components with no dependencies, e.g., $.ui.position
+$.ui = $.ui || {};
+
+$.extend( $.ui, {
+	version: "c0ab71056b936627e8a7821f03c044aec6280a40",
+
+	keyCode: {
+		BACKSPACE: 8,
+		COMMA: 188,
+		DELETE: 46,
+		DOWN: 40,
+		END: 35,
+		ENTER: 13,
+		ESCAPE: 27,
+		HOME: 36,
+		LEFT: 37,
+		PAGE_DOWN: 34,
+		PAGE_UP: 33,
+		PERIOD: 190,
+		RIGHT: 39,
+		SPACE: 32,
+		TAB: 9,
+		UP: 38
+	}
+});
+
+// plugins
+$.fn.extend({
+	focus: (function( orig ) {
+		return function( delay, fn ) {
+			return typeof delay === "number" ?
+				this.each(function() {
+					var elem = this;
+					setTimeout(function() {
+						$( elem ).focus();
+						if ( fn ) {
+							fn.call( elem );
+						}
+					}, delay );
+				}) :
+				orig.apply( this, arguments );
+		};
+	})( $.fn.focus ),
+
+	scrollParent: function() {
+		var scrollParent;
+		if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {
+			scrollParent = this.parents().filter(function() {
+				return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
+			}).eq(0);
+		} else {
+			scrollParent = this.parents().filter(function() {
+				return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));
+			}).eq(0);
+		}
+
+		return ( /fixed/ ).test( this.css( "position") ) || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent;
+	},
+
+	uniqueId: function() {
+		return this.each(function() {
+			if ( !this.id ) {
+				this.id = "ui-id-" + (++uuid);
+			}
+		});
+	},
+
+	removeUniqueId: function() {
+		return this.each(function() {
+			if ( runiqueId.test( this.id ) ) {
+				$( this ).removeAttr( "id" );
+			}
+		});
+	}
+});
+
+// selectors
+function focusable( element, isTabIndexNotNaN ) {
+	var map, mapName, img,
+		nodeName = element.nodeName.toLowerCase();
+	if ( "area" === nodeName ) {
+		map = element.parentNode;
+		mapName = map.name;
+		if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {
+			return false;
+		}
+		img = $( "img[usemap=#" + mapName + "]" )[0];
+		return !!img && visible( img );
+	}
+	return ( /input|select|textarea|button|object/.test( nodeName ) ?
+		!element.disabled :
+		"a" === nodeName ?
+			element.href || isTabIndexNotNaN :
+			isTabIndexNotNaN) &&
+		// the element and all of its ancestors must be visible
+		visible( element );
+}
+
+function visible( element ) {
+	return $.expr.filters.visible( element ) &&
+		!$( element ).parents().addBack().filter(function() {
+			return $.css( this, "visibility" ) === "hidden";
+		}).length;
+}
+
+$.extend( $.expr[ ":" ], {
+	data: $.expr.createPseudo ?
+		$.expr.createPseudo(function( dataName ) {
+			return function( elem ) {
+				return !!$.data( elem, dataName );
+			};
+		}) :
+		// support: jQuery <1.8
+		function( elem, i, match ) {
+			return !!$.data( elem, match[ 3 ] );
+		},
+
+	focusable: function( element ) {
+		return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );
+	},
+
+	tabbable: function( element ) {
+		var tabIndex = $.attr( element, "tabindex" ),
+			isTabIndexNaN = isNaN( tabIndex );
+		return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );
+	}
+});
+
+// support: jQuery <1.8
+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {
+	$.each( [ "Width", "Height" ], function( i, name ) {
+		var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],
+			type = name.toLowerCase(),
+			orig = {
+				innerWidth: $.fn.innerWidth,
+				innerHeight: $.fn.innerHeight,
+				outerWidth: $.fn.outerWidth,
+				outerHeight: $.fn.outerHeight
+			};
+
+		function reduce( elem, size, border, margin ) {
+			$.each( side, function() {
+				size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;
+				if ( border ) {
+					size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;
+				}
+				if ( margin ) {
+					size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;
+				}
+			});
+			return size;
+		}
+
+		$.fn[ "inner" + name ] = function( size ) {
+			if ( size === undefined ) {
+				return orig[ "inner" + name ].call( this );
+			}
+
+			return this.each(function() {
+				$( this ).css( type, reduce( this, size ) + "px" );
+			});
+		};
+
+		$.fn[ "outer" + name] = function( size, margin ) {
+			if ( typeof size !== "number" ) {
+				return orig[ "outer" + name ].call( this, size );
+			}
+
+			return this.each(function() {
+				$( this).css( type, reduce( this, size, true, margin ) + "px" );
+			});
+		};
+	});
+}
+
+// support: jQuery <1.8
+if ( !$.fn.addBack ) {
+	$.fn.addBack = function( selector ) {
+		return this.add( selector == null ?
+			this.prevObject : this.prevObject.filter( selector )
+		);
+	};
+}
+
+// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)
+if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {
+	$.fn.removeData = (function( removeData ) {
+		return function( key ) {
+			if ( arguments.length ) {
+				return removeData.call( this, $.camelCase( key ) );
+			} else {
+				return removeData.call( this );
+			}
+		};
+	})( $.fn.removeData );
+}
+
+
+
+
+
+// deprecated
+$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );
+
+$.support.selectstart = "onselectstart" in document.createElement( "div" );
+$.fn.extend({
+	disableSelection: function() {
+		return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +
+			".ui-disableSelection", function( event ) {
+				event.preventDefault();
+			});
+	},
+
+	enableSelection: function() {
+		return this.unbind( ".ui-disableSelection" );
+	},
+
+	zIndex: function( zIndex ) {
+		if ( zIndex !== undefined ) {
+			return this.css( "zIndex", zIndex );
+		}
+
+		if ( this.length ) {
+			var elem = $( this[ 0 ] ), position, value;
+			while ( elem.length && elem[ 0 ] !== document ) {
+				// Ignore z-index if position is set to a value where z-index is ignored by the browser
+				// This makes behavior of this function consistent across browsers
+				// WebKit always returns auto if the element is positioned
+				position = elem.css( "position" );
+				if ( position === "absolute" || position === "relative" || position === "fixed" ) {
+					// IE returns 0 when zIndex is not specified
+					// other browsers return a string
+					// we ignore the case of nested elements with an explicit value of 0
+					// <div style="z-index: -10;"><div style="z-index: 0;"></div></div>
+					value = parseInt( elem.css( "zIndex" ), 10 );
+					if ( !isNaN( value ) && value !== 0 ) {
+						return value;
+					}
+				}
+				elem = elem.parent();
+			}
+		}
+
+		return 0;
+	}
+});
+
+// $.ui.plugin is deprecated. Use $.widget() extensions instead.
+$.ui.plugin = {
+	add: function( module, option, set ) {
+		var i,
+			proto = $.ui[ module ].prototype;
+		for ( i in set ) {
+			proto.plugins[ i ] = proto.plugins[ i ] || [];
+			proto.plugins[ i ].push( [ option, set[ i ] ] );
+		}
+	},
+	call: function( instance, name, args, allowDisconnected ) {
+		var i,
+			set = instance.plugins[ name ];
+
+		if ( !set ) {
+			return;
+		}
+
+		if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) {
+			return;
+		}
+
+		for ( i = 0; i < set.length; i++ ) {
+			if ( instance.options[ set[ i ][ 0 ] ] ) {
+				set[ i ][ 1 ].apply( instance.element, args );
+			}
+		}
+	}
+};
+
+})( jQuery );
+
+(function( $, window, undefined ) {
+
+	// Subtract the height of external toolbars from the page height, if the page does not have
+	// internal toolbars of the same type
+	var compensateToolbars = function( page, desiredHeight ) {
+		var pageParent = page.parent(),
+			toolbarsAffectingHeight = [],
+			externalHeaders = pageParent.children( ":jqmData(role='header')" ),
+			internalHeaders = page.children( ":jqmData(role='header')" ),
+			externalFooters = pageParent.children( ":jqmData(role='footer')" ),
+			internalFooters = page.children( ":jqmData(role='footer')" );
+
+		// If we have no internal headers, but we do have external headers, then their height
+		// reduces the page height
+		if ( internalHeaders.length === 0 && externalHeaders.length > 0 ) {
+			toolbarsAffectingHeight = toolbarsAffectingHeight.concat( externalHeaders.toArray() );
+		}
+
+		// If we have no internal footers, but we do have external footers, then their height
+		// reduces the page height
+		if ( internalFooters.length === 0 && externalFooters.length > 0 ) {
+			toolbarsAffectingHeight = toolbarsAffectingHeight.concat( externalFooters.toArray() );
+		}
+
+		$.each( toolbarsAffectingHeight, function( index, value ) {
+			desiredHeight -= $( value ).outerHeight();
+		});
+
+		// Height must be at least zero
+		return Math.max( 0, desiredHeight );
+	};
+
+	$.extend( $.mobile, {
+		// define the window and the document objects
+		window: $( window ),
+		document: $( document ),
+
+		// TODO: Remove and use $.ui.keyCode directly
+		keyCode: $.ui.keyCode,
+
+		// Place to store various widget extensions
+		behaviors: {},
+
+		// Scroll page vertically: scroll to 0 to hide iOS address bar, or pass a Y value
+		silentScroll: function( ypos ) {
+			if ( $.type( ypos ) !== "number" ) {
+				ypos = $.mobile.defaultHomeScroll;
+			}
+
+			// prevent scrollstart and scrollstop events
+			$.event.special.scrollstart.enabled = false;
+
+			setTimeout(function() {
+				window.scrollTo( 0, ypos );
+				$.mobile.document.trigger( "silentscroll", { x: 0, y: ypos });
+			}, 20 );
+
+			setTimeout(function() {
+				$.event.special.scrollstart.enabled = true;
+			}, 150 );
+		},
+
+		getClosestBaseUrl: function( ele )	{
+			// Find the closest page and extract out its url.
+			var url = $( ele ).closest( ".ui-page" ).jqmData( "url" ),
+				base = $.mobile.path.documentBase.hrefNoHash;
+
+			if ( !$.mobile.dynamicBaseEnabled || !url || !$.mobile.path.isPath( url ) ) {
+				url = base;
+			}
+
+			return $.mobile.path.makeUrlAbsolute( url, base );
+		},
+		removeActiveLinkClass: function( forceRemoval ) {
+			if ( !!$.mobile.activeClickedLink &&
+				( !$.mobile.activeClickedLink.closest( "." + $.mobile.activePageClass ).length ||
+					forceRemoval ) ) {
+
+				$.mobile.activeClickedLink.removeClass( $.mobile.activeBtnClass );
+			}
+			$.mobile.activeClickedLink = null;
+		},
+
+		// DEPRECATED in 1.4
+		// Find the closest parent with a theme class on it. Note that
+		// we are not using $.fn.closest() on purpose here because this
+		// method gets called quite a bit and we need it to be as fast
+		// as possible.
+		getInheritedTheme: function( el, defaultTheme ) {
+			var e = el[ 0 ],
+				ltr = "",
+				re = /ui-(bar|body|overlay)-([a-z])\b/,
+				c, m;
+			while ( e ) {
+				c = e.className || "";
+				if ( c && ( m = re.exec( c ) ) && ( ltr = m[ 2 ] ) ) {
+					// We found a parent with a theme class
+					// on it so bail from this loop.
+					break;
+				}
+
+				e = e.parentNode;
+			}
+			// Return the theme letter we found, if none, return the
+			// specified default.
+			return ltr || defaultTheme || "a";
+		},
+
+		enhanceable: function( elements ) {
+			return this.haveParents( elements, "enhance" );
+		},
+
+		hijackable: function( elements ) {
+			return this.haveParents( elements, "ajax" );
+		},
+
+		haveParents: function( elements, attr ) {
+			if ( !$.mobile.ignoreContentEnabled ) {
+				return elements;
+			}
+
+			var count = elements.length,
+				$newSet = $(),
+				e, $element, excluded,
+				i, c;
+
+			for ( i = 0; i < count; i++ ) {
+				$element = elements.eq( i );
+				excluded = false;
+				e = elements[ i ];
+
+				while ( e ) {
+					c = e.getAttribute ? e.getAttribute( "data-" + $.mobile.ns + attr ) : "";
+
+					if ( c === "false" ) {
+						excluded = true;
+						break;
+					}
+
+					e = e.parentNode;
+				}
+
+				if ( !excluded ) {
+					$newSet = $newSet.add( $element );
+				}
+			}
+
+			return $newSet;
+		},
+
+		getScreenHeight: function() {
+			// Native innerHeight returns more accurate value for this across platforms,
+			// jQuery version is here as a normalized fallback for platforms like Symbian
+			return window.innerHeight || $.mobile.window.height();
+		},
+
+		//simply set the active page's minimum height to screen height, depending on orientation
+		resetActivePageHeight: function( height ) {
+			var page = $( "." + $.mobile.activePageClass ),
+				pageHeight = page.height(),
+				pageOuterHeight = page.outerHeight( true );
+
+			height = compensateToolbars( page,
+				( typeof height === "number" ) ? height : $.mobile.getScreenHeight() );
+
+			page.css( "min-height", height - ( pageOuterHeight - pageHeight ) );
+		},
+
+		loading: function() {
+			// If this is the first call to this function, instantiate a loader widget
+			var loader = this.loading._widget || $( $.mobile.loader.prototype.defaultHtml ).loader(),
+
+				// Call the appropriate method on the loader
+				returnValue = loader.loader.apply( loader, arguments );
+
+			// Make sure the loader is retained for future calls to this function.
+			this.loading._widget = loader;
+
+			return returnValue;
+		}
+	});
+
+	$.addDependents = function( elem, newDependents ) {
+		var $elem = $( elem ),
+			dependents = $elem.jqmData( "dependents" ) || $();
+
+		$elem.jqmData( "dependents", $( dependents ).add( newDependents ) );
+	};
+
+	// plugins
+	$.fn.extend({
+		removeWithDependents: function() {
+			$.removeWithDependents( this );
+		},
+
+		// Enhance child elements
+		enhanceWithin: function() {
+			var index,
+				widgetElements = {},
+				keepNative = $.mobile.page.prototype.keepNativeSelector(),
+				that = this;
+
+			// Add no js class to elements
+			if ( $.mobile.nojs ) {
+				$.mobile.nojs( this );
+			}
+
+			// Bind links for ajax nav
+			if ( $.mobile.links ) {
+				$.mobile.links( this );
+			}
+
+			// Degrade inputs for styleing
+			if ( $.mobile.degradeInputsWithin ) {
+				$.mobile.degradeInputsWithin( this );
+			}
+
+			// Run buttonmarkup
+			if ( $.fn.buttonMarkup ) {
+				this.find( $.fn.buttonMarkup.initSelector ).not( keepNative )
+				.jqmEnhanceable().buttonMarkup();
+			}
+
+			// Add classes for fieldContain
+			if ( $.fn.fieldcontain ) {
+				this.find( ":jqmData(role='fieldcontain')" ).not( keepNative )
+				.jqmEnhanceable().fieldcontain();
+			}
+
+			// Enhance widgets
+			$.each( $.mobile.widgets, function( name, constructor ) {
+
+				// If initSelector not false find elements
+				if ( constructor.initSelector ) {
+
+					// Filter elements that should not be enhanced based on parents
+					var elements = $.mobile.enhanceable( that.find( constructor.initSelector ) );
+
+					// If any matching elements remain filter ones with keepNativeSelector
+					if ( elements.length > 0 ) {
+
+						// $.mobile.page.prototype.keepNativeSelector is deprecated this is just for backcompat
+						// Switch to $.mobile.keepNative in 1.5 which is just a value not a function
+						elements = elements.not( keepNative );
+					}
+
+					// Enhance whatever is left
+					if ( elements.length > 0 ) {
+						widgetElements[ constructor.prototype.widgetName ] = elements;
+					}
+				}
+			});
+
+			for ( index in widgetElements ) {
+				widgetElements[ index ][ index ]();
+			}
+
+			return this;
+		},
+
+		addDependents: function( newDependents ) {
+			$.addDependents( this, newDependents );
+		},
+
+		// note that this helper doesn't attempt to handle the callback
+		// or setting of an html element's text, its only purpose is
+		// to return the html encoded version of the text in all cases. (thus the name)
+		getEncodedText: function() {
+			return $( "<a>" ).text( this.text() ).html();
+		},
+
+		// fluent helper function for the mobile namespaced equivalent
+		jqmEnhanceable: function() {
+			return $.mobile.enhanceable( this );
+		},
+
+		jqmHijackable: function() {
+			return $.mobile.hijackable( this );
+		}
+	});
+
+	$.removeWithDependents = function( nativeElement ) {
+		var element = $( nativeElement );
+
+		( element.jqmData( "dependents" ) || $() ).remove();
+		element.remove();
+	};
+	$.addDependents = function( nativeElement, newDependents ) {
+		var element = $( nativeElement ),
+			dependents = element.jqmData( "dependents" ) || $();
+
+		element.jqmData( "dependents", $( dependents ).add( newDependents ) );
+	};
+
+	$.find.matches = function( expr, set ) {
+		return $.find( expr, null, null, set );
+	};
+
+	$.find.matchesSelector = function( node, expr ) {
+		return $.find( expr, null, null, [ node ] ).length > 0;
+	};
+
+})( jQuery, this );
+
+
+/*!
+ * jQuery UI Widget c0ab71056b936627e8a7821f03c044aec6280a40
+ * http://jqueryui.com
+ *
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/jQuery.widget/
+ */
+(function( $, undefined ) {
+
+var uuid = 0,
+	slice = Array.prototype.slice,
+	_cleanData = $.cleanData;
+$.cleanData = function( elems ) {
+	for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
+		try {
+			$( elem ).triggerHandler( "remove" );
+		// http://bugs.jquery.com/ticket/8235
+		} catch( e ) {}
+	}
+	_cleanData( elems );
+};
+
+$.widget = function( name, base, prototype ) {
+	var fullName, existingConstructor, constructor, basePrototype,
+		// proxiedPrototype allows the provided prototype to remain unmodified
+		// so that it can be used as a mixin for multiple widgets (#8876)
+		proxiedPrototype = {},
+		namespace = name.split( "." )[ 0 ];
+
+	name = name.split( "." )[ 1 ];
+	fullName = namespace + "-" + name;
+
+	if ( !prototype ) {
+		prototype = base;
+		base = $.Widget;
+	}
+
+	// create selector for plugin
+	$.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {
+		return !!$.data( elem, fullName );
+	};
+
+	$[ namespace ] = $[ namespace ] || {};
+	existingConstructor = $[ namespace ][ name ];
+	constructor = $[ namespace ][ name ] = function( options, element ) {
+		// allow instantiation without "new" keyword
+		if ( !this._createWidget ) {
+			return new constructor( options, element );
+		}
+
+		// allow instantiation without initializing for simple inheritance
+		// must use "new" keyword (the code above always passes args)
+		if ( arguments.length ) {
+			this._createWidget( options, element );
+		}
+	};
+	// extend with the existing constructor to carry over any static properties
+	$.extend( constructor, existingConstructor, {
+		version: prototype.version,
+		// copy the object used to create the prototype in case we need to
+		// redefine the widget later
+		_proto: $.extend( {}, prototype ),
+		// track widgets that inherit from this widget in case this widget is
+		// redefined after a widget inherits from it
+		_childConstructors: []
+	});
+
+	basePrototype = new base();
+	// we need to make the options hash a property directly on the new instance
+	// otherwise we'll modify the options hash on the prototype that we're
+	// inheriting from
+	basePrototype.options = $.widget.extend( {}, basePrototype.options );
+	$.each( prototype, function( prop, value ) {
+		if ( !$.isFunction( value ) ) {
+			proxiedPrototype[ prop ] = value;
+			return;
+		}
+		proxiedPrototype[ prop ] = (function() {
+			var _super = function() {
+					return base.prototype[ prop ].apply( this, arguments );
+				},
+				_superApply = function( args ) {
+					return base.prototype[ prop ].apply( this, args );
+				};
+			return function() {
+				var __super = this._super,
+					__superApply = this._superApply,
+					returnValue;
+
+				this._super = _super;
+				this._superApply = _superApply;
+
+				returnValue = value.apply( this, arguments );
+
+				this._super = __super;
+				this._superApply = __superApply;
+
+				return returnValue;
+			};
+		})();
+	});
+	constructor.prototype = $.widget.extend( basePrototype, {
+		// TODO: remove support for widgetEventPrefix
+		// always use the name + a colon as the prefix, e.g., draggable:start
+		// don't prefix for widgets that aren't DOM-based
+		widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name
+	}, proxiedPrototype, {
+		constructor: constructor,
+		namespace: namespace,
+		widgetName: name,
+		widgetFullName: fullName
+	});
+
+	// If this widget is being redefined then we need to find all widgets that
+	// are inheriting from it and redefine all of them so that they inherit from
+	// the new version of this widget. We're essentially trying to replace one
+	// level in the prototype chain.
+	if ( existingConstructor ) {
+		$.each( existingConstructor._childConstructors, function( i, child ) {
+			var childPrototype = child.prototype;
+
+			// redefine the child widget using the same prototype that was
+			// originally used, but inherit from the new version of the base
+			$.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );
+		});
+		// remove the list of existing child constructors from the old constructor
+		// so the old child constructors can be garbage collected
+		delete existingConstructor._childConstructors;
+	} else {
+		base._childConstructors.push( constructor );
+	}
+
+	$.widget.bridge( name, constructor );
+
+	return constructor;
+};
+
+$.widget.extend = function( target ) {
+	var input = slice.call( arguments, 1 ),
+		inputIndex = 0,
+		inputLength = input.length,
+		key,
+		value;
+	for ( ; inputIndex < inputLength; inputIndex++ ) {
+		for ( key in input[ inputIndex ] ) {
+			value = input[ inputIndex ][ key ];
+			if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {
+				// Clone objects
+				if ( $.isPlainObject( value ) ) {
+					target[ key ] = $.isPlainObject( target[ key ] ) ?
+						$.widget.extend( {}, target[ key ], value ) :
+						// Don't extend strings, arrays, etc. with objects
+						$.widget.extend( {}, value );
+				// Copy everything else by reference
+				} else {
+					target[ key ] = value;
+				}
+			}
+		}
+	}
+	return target;
+};
+
+$.widget.bridge = function( name, object ) {
+	var fullName = object.prototype.widgetFullName || name;
+	$.fn[ name ] = function( options ) {
+		var isMethodCall = typeof options === "string",
+			args = slice.call( arguments, 1 ),
+			returnValue = this;
+
+		// allow multiple hashes to be passed on init
+		options = !isMethodCall && args.length ?
+			$.widget.extend.apply( null, [ options ].concat(args) ) :
+			options;
+
+		if ( isMethodCall ) {
+			this.each(function() {
+				var methodValue,
+					instance = $.data( this, fullName );
+				if ( options === "instance" ) {
+					returnValue = instance;
+					return false;
+				}
+				if ( !instance ) {
+					return $.error( "cannot call methods on " + name + " prior to initialization; " +
+						"attempted to call method '" + options + "'" );
+				}
+				if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {
+					return $.error( "no such method '" + options + "' for " + name + " widget instance" );
+				}
+				methodValue = instance[ options ].apply( instance, args );
+				if ( methodValue !== instance && methodValue !== undefined ) {
+					returnValue = methodValue && methodValue.jquery ?
+						returnValue.pushStack( methodValue.get() ) :
+						methodValue;
+					return false;
+				}
+			});
+		} else {
+			this.each(function() {
+				var instance = $.data( this, fullName );
+				if ( instance ) {
+					instance.option( options || {} )._init();
+				} else {
+					$.data( this, fullName, new object( options, this ) );
+				}
+			});
+		}
+
+		return returnValue;
+	};
+};
+
+$.Widget = function( /* options, element */ ) {};
+$.Widget._childConstructors = [];
+
+$.Widget.prototype = {
+	widgetName: "widget",
+	widgetEventPrefix: "",
+	defaultElement: "<div>",
+	options: {
+		disabled: false,
+
+		// callbacks
+		create: null
+	},
+	_createWidget: function( options, element ) {
+		element = $( element || this.defaultElement || this )[ 0 ];
+		this.element = $( element );
+		this.uuid = uuid++;
+		this.eventNamespace = "." + this.widgetName + this.uuid;
+		this.options = $.widget.extend( {},
+			this.options,
+			this._getCreateOptions(),
+			options );
+
+		this.bindings = $();
+		this.hoverable = $();
+		this.focusable = $();
+
+		if ( element !== this ) {
+			$.data( element, this.widgetFullName, this );
+			this._on( true, this.element, {
+				remove: function( event ) {
+					if ( event.target === element ) {
+						this.destroy();
+					}
+				}
+			});
+			this.document = $( element.style ?
+				// element within the document
+				element.ownerDocument :
+				// element is window or document
+				element.document || element );
+			this.window = $( this.document[0].defaultView || this.document[0].parentWindow );
+		}
+
+		this._create();
+		this._trigger( "create", null, this._getCreateEventData() );
+		this._init();
+	},
+	_getCreateOptions: $.noop,
+	_getCreateEventData: $.noop,
+	_create: $.noop,
+	_init: $.noop,
+
+	destroy: function() {
+		this._destroy();
+		// we can probably remove the unbind calls in 2.0
+		// all event bindings should go through this._on()
+		this.element
+			.unbind( this.eventNamespace )
+			.removeData( this.widgetFullName )
+			// support: jquery <1.6.3
+			// http://bugs.jquery.com/ticket/9413
+			.removeData( $.camelCase( this.widgetFullName ) );
+		this.widget()
+			.unbind( this.eventNamespace )
+			.removeAttr( "aria-disabled" )
+			.removeClass(
+				this.widgetFullName + "-disabled " +
+				"ui-state-disabled" );
+
+		// clean up events and states
+		this.bindings.unbind( this.eventNamespace );
+		this.hoverable.removeClass( "ui-state-hover" );
+		this.focusable.removeClass( "ui-state-focus" );
+	},
+	_destroy: $.noop,
+
+	widget: function() {
+		return this.element;
+	},
+
+	option: function( key, value ) {
+		var options = key,
+			parts,
+			curOption,
+			i;
+
+		if ( arguments.length === 0 ) {
+			// don't return a reference to the internal hash
+			return $.widget.extend( {}, this.options );
+		}
+
+		if ( typeof key === "string" ) {
+			// handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }
+			options = {};
+			parts = key.split( "." );
+			key = parts.shift();
+			if ( parts.length ) {
+				curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );
+				for ( i = 0; i < parts.length - 1; i++ ) {
+					curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};
+					curOption = curOption[ parts[ i ] ];
+				}
+				key = parts.pop();
+				if ( value === undefined ) {
+					return curOption[ key ] === undefined ? null : curOption[ key ];
+				}
+				curOption[ key ] = value;
+			} else {
+				if ( value === undefined ) {
+					return this.options[ key ] === undefined ? null : this.options[ key ];
+				}
+				options[ key ] = value;
+			}
+		}
+
+		this._setOptions( options );
+
+		return this;
+	},
+	_setOptions: function( options ) {
+		var key;
+
+		for ( key in options ) {
+			this._setOption( key, options[ key ] );
+		}
+
+		return this;
+	},
+	_setOption: function( key, value ) {
+		this.options[ key ] = value;
+
+		if ( key === "disabled" ) {
+			this.widget()
+				.toggleClass( this.widgetFullName + "-disabled", !!value );
+			this.hoverable.removeClass( "ui-state-hover" );
+			this.focusable.removeClass( "ui-state-focus" );
+		}
+
+		return this;
+	},
+
+	enable: function() {
+		return this._setOptions({ disabled: false });
+	},
+	disable: function() {
+		return this._setOptions({ disabled: true });
+	},
+
+	_on: function( suppressDisabledCheck, element, handlers ) {
+		var delegateElement,
+			instance = this;
+
+		// no suppressDisabledCheck flag, shuffle arguments
+		if ( typeof suppressDisabledCheck !== "boolean" ) {
+			handlers = element;
+			element = suppressDisabledCheck;
+			suppressDisabledCheck = false;
+		}
+
+		// no element argument, shuffle and use this.element
+		if ( !handlers ) {
+			handlers = element;
+			element = this.element;
+			delegateElement = this.widget();
+		} else {
+			// accept selectors, DOM elements
+			element = delegateElement = $( element );
+			this.bindings = this.bindings.add( element );
+		}
+
+		$.each( handlers, function( event, handler ) {
+			function handlerProxy() {
+				// allow widgets to customize the disabled handling
+				// - disabled as an array instead of boolean
+				// - disabled class as method for disabling individual parts
+				if ( !suppressDisabledCheck &&
+						( instance.options.disabled === true ||
+							$( this ).hasClass( "ui-state-disabled" ) ) ) {
+					return;
+				}
+				return ( typeof handler === "string" ? instance[ handler ] : handler )
+					.apply( instance, arguments );
+			}
+
+			// copy the guid so direct unbinding works
+			if ( typeof handler !== "string" ) {
+				handlerProxy.guid = handler.guid =
+					handler.guid || handlerProxy.guid || $.guid++;
+			}
+
+			var match = event.match( /^(\w+)\s*(.*)$/ ),
+				eventName = match[1] + instance.eventNamespace,
+				selector = match[2];
+			if ( selector ) {
+				delegateElement.delegate( selector, eventName, handlerProxy );
+			} else {
+				element.bind( eventName, handlerProxy );
+			}
+		});
+	},
+
+	_off: function( element, eventName ) {
+		eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;
+		element.unbind( eventName ).undelegate( eventName );
+	},
+
+	_delay: function( handler, delay ) {
+		function handlerProxy() {
+			return ( typeof handler === "string" ? instance[ handler ] : handler )
+				.apply( instance, arguments );
+		}
+		var instance = this;
+		return setTimeout( handlerProxy, delay || 0 );
+	},
+
+	_hoverable: function( element ) {
+		this.hoverable = this.hoverable.add( element );
+		this._on( element, {
+			mouseenter: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-hover" );
+			},
+			mouseleave: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-hover" );
+			}
+		});
+	},
+
+	_focusable: function( element ) {
+		this.focusable = this.focusable.add( element );
+		this._on( element, {
+			focusin: function( event ) {
+				$( event.currentTarget ).addClass( "ui-state-focus" );
+			},
+			focusout: function( event ) {
+				$( event.currentTarget ).removeClass( "ui-state-focus" );
+			}
+		});
+	},
+
+	_trigger: function( type, event, data ) {
+		var prop, orig,
+			callback = this.options[ type ];
+
+		data = data || {};
+		event = $.Event( event );
+		event.type = ( type === this.widgetEventPrefix ?
+			type :
+			this.widgetEventPrefix + type ).toLowerCase();
+		// the original event may come from any element
+		// so we need to reset the target on the new event
+		event.target = this.element[ 0 ];
+
+		// copy original event properties over to the new event
+		orig = event.originalEvent;
+		if ( orig ) {
+			for ( prop in orig ) {
+				if ( !( prop in event ) ) {
+					event[ prop ] = orig[ prop ];
+				}
+			}
+		}
+
+		this.element.trigger( event, data );
+		return !( $.isFunction( callback ) &&
+			callback.apply( this.element[0], [ event ].concat( data ) ) === false ||
+			event.isDefaultPrevented() );
+	}
+};
+
+$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {
+	$.Widget.prototype[ "_" + method ] = function( element, options, callback ) {
+		if ( typeof options === "string" ) {
+			options = { effect: options };
+		}
+		var hasOptions,
+			effectName = !options ?
+				method :
+				options === true || typeof options === "number" ?
+					defaultEffect :
+					options.effect || defaultEffect;
+		options = options || {};
+		if ( typeof options === "number" ) {
+			options = { duration: options };
+		}
+		hasOptions = !$.isEmptyObject( options );
+		options.complete = callback;
+		if ( options.delay ) {
+			element.delay( options.delay );
+		}
+		if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {
+			element[ method ]( options );
+		} else if ( effectName !== method && element[ effectName ] ) {
+			element[ effectName ]( options.duration, options.easing, callback );
+		} else {
+			element.queue(function( next ) {
+				$( this )[ method ]();
+				if ( callback ) {
+					callback.call( element[ 0 ] );
+				}
+				next();
+			});
+		}
+	};
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+var rcapitals = /[A-Z]/g,
+	replaceFunction = function( c ) {
+		return "-" + c.toLowerCase();
+	};
+
+$.extend( $.Widget.prototype, {
+	_getCreateOptions: function() {
+		var option, value,
+			elem = this.element[ 0 ],
+			options = {};
+
+		//
+		if ( !$.mobile.getAttribute( elem, "defaults" ) ) {
+			for ( option in this.options ) {
+				value = $.mobile.getAttribute( elem, option.replace( rcapitals, replaceFunction ) );
+
+				if ( value != null ) {
+					options[ option ] = value;
+				}
+			}
+		}
+
+		return options;
+	}
+});
+
+//TODO: Remove in 1.5 for backcompat only
+$.mobile.widget = $.Widget;
+
+})( jQuery );
+
+
+(function( $ ) {
+	// TODO move loader class down into the widget settings
+	var loaderClass = "ui-loader", $html = $( "html" );
+
+	$.widget( "mobile.loader", {
+		// NOTE if the global config settings are defined they will override these
+		//      options
+		options: {
+			// the theme for the loading message
+			theme: "a",
+
+			// whether the text in the loading message is shown
+			textVisible: false,
+
+			// custom html for the inner content of the loading message
+			html: "",
+
+			// the text to be displayed when the popup is shown
+			text: "loading"
+		},
+
+		defaultHtml: "<div class='" + loaderClass + "'>" +
+			"<span class='ui-icon-loading'></span>" +
+			"<h1></h1>" +
+			"</div>",
+
+		// For non-fixed supportin browsers. Position at y center (if scrollTop supported), above the activeBtn (if defined), or just 100px from top
+		fakeFixLoader: function() {
+			var activeBtn = $( "." + $.mobile.activeBtnClass ).first();
+
+			this.element
+				.css({
+					top: $.support.scrollTop && this.window.scrollTop() + this.window.height() / 2 ||
+						activeBtn.length && activeBtn.offset().top || 100
+				});
+		},
+
+		// check position of loader to see if it appears to be "fixed" to center
+		// if not, use abs positioning
+		checkLoaderPosition: function() {
+			var offset = this.element.offset(),
+				scrollTop = this.window.scrollTop(),
+				screenHeight = $.mobile.getScreenHeight();
+
+			if ( offset.top < scrollTop || ( offset.top - scrollTop ) > screenHeight ) {
+				this.element.addClass( "ui-loader-fakefix" );
+				this.fakeFixLoader();
+				this.window
+					.unbind( "scroll", this.checkLoaderPosition )
+					.bind( "scroll", $.proxy( this.fakeFixLoader, this ) );
+			}
+		},
+
+		resetHtml: function() {
+			this.element.html( $( this.defaultHtml ).html() );
+		},
+
+		// Turn on/off page loading message. Theme doubles as an object argument
+		// with the following shape: { theme: '', text: '', html: '', textVisible: '' }
+		// NOTE that the $.mobile.loading* settings and params past the first are deprecated
+		// TODO sweet jesus we need to break some of this out
+		show: function( theme, msgText, textonly ) {
+			var textVisible, message, loadSettings;
+
+			this.resetHtml();
+
+			// use the prototype options so that people can set them globally at
+			// mobile init. Consistency, it's what's for dinner
+			if ( $.type( theme ) === "object" ) {
+				loadSettings = $.extend( {}, this.options, theme );
+
+				theme = loadSettings.theme;
+			} else {
+				loadSettings = this.options;
+
+				// here we prefer the theme value passed as a string argument, then
+				// we prefer the global option because we can't use undefined default
+				// prototype options, then the prototype option
+				theme = theme || loadSettings.theme;
+			}
+
+			// set the message text, prefer the param, then the settings object
+			// then loading message
+			message = msgText || ( loadSettings.text === false ? "" : loadSettings.text );
+
+			// prepare the dom
+			$html.addClass( "ui-loading" );
+
+			textVisible = loadSettings.textVisible;
+
+			// add the proper css given the options (theme, text, etc)
+			// Force text visibility if the second argument was supplied, or
+			// if the text was explicitly set in the object args
+			this.element.attr("class", loaderClass +
+				" ui-corner-all ui-body-" + theme +
+				" ui-loader-" + ( textVisible || msgText || theme.text ? "verbose" : "default" ) +
+				( loadSettings.textonly || textonly ? " ui-loader-textonly" : "" ) );
+
+			// TODO verify that jquery.fn.html is ok to use in both cases here
+			//      this might be overly defensive in preventing unknowing xss
+			// if the html attribute is defined on the loading settings, use that
+			// otherwise use the fallbacks from above
+			if ( loadSettings.html ) {
+				this.element.html( loadSettings.html );
+			} else {
+				this.element.find( "h1" ).text( message );
+			}
+
+			// attach the loader to the DOM
+			this.element.appendTo( $.mobile.pageContainer );
+
+			// check that the loader is visible
+			this.checkLoaderPosition();
+
+			// on scroll check the loader position
+			this.window.bind( "scroll", $.proxy( this.checkLoaderPosition, this ) );
+		},
+
+		hide: function() {
+			$html.removeClass( "ui-loading" );
+
+			if ( this.options.text ) {
+				this.element.removeClass( "ui-loader-fakefix" );
+			}
+
+			$.mobile.window.unbind( "scroll", this.fakeFixLoader );
+			$.mobile.window.unbind( "scroll", this.checkLoaderPosition );
+		}
+	});
+
+})(jQuery, this);
+
+
+/*!
+ * jQuery hashchange event - v1.3 - 7/21/2010
+ * http://benalman.com/projects/jquery-hashchange-plugin/
+ * 
+ * Copyright (c) 2010 "Cowboy" Ben Alman
+ * Dual licensed under the MIT and GPL licenses.
+ * http://benalman.com/about/license/
+ */
+
+// Script: jQuery hashchange event
+//
+// *Version: 1.3, Last updated: 7/21/2010*
+// 
+// Project Home - http://benalman.com/projects/jquery-hashchange-plugin/
+// GitHub       - http://github.com/cowboy/jquery-hashchange/
+// Source       - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.js
+// (Minified)   - http://github.com/cowboy/jquery-hashchange/raw/master/jquery.ba-hashchange.min.js (0.8kb gzipped)
+// 
+// About: License
+// 
+// Copyright (c) 2010 "Cowboy" Ben Alman,
+// Dual licensed under the MIT and GPL licenses.
+// http://benalman.com/about/license/
+// 
+// About: Examples
+// 
+// These working examples, complete with fully commented code, illustrate a few
+// ways in which this plugin can be used.
+// 
+// hashchange event - http://benalman.com/code/projects/jquery-hashchange/examples/hashchange/
+// document.domain - http://benalman.com/code/projects/jquery-hashchange/examples/document_domain/
+// 
+// About: Support and Testing
+// 
+// Information about what version or versions of jQuery this plugin has been
+// tested with, what browsers it has been tested in, and where the unit tests
+// reside (so you can test it yourself).
+// 
+// jQuery Versions - 1.2.6, 1.3.2, 1.4.1, 1.4.2
+// Browsers Tested - Internet Explorer 6-8, Firefox 2-4, Chrome 5-6, Safari 3.2-5,
+//                   Opera 9.6-10.60, iPhone 3.1, Android 1.6-2.2, BlackBerry 4.6-5.
+// Unit Tests      - http://benalman.com/code/projects/jquery-hashchange/unit/
+// 
+// About: Known issues
+// 
+// While this jQuery hashchange event implementation is quite stable and
+// robust, there are a few unfortunate browser bugs surrounding expected
+// hashchange event-based behaviors, independent of any JavaScript
+// window.onhashchange abstraction. See the following examples for more
+// information:
+// 
+// Chrome: Back Button - http://benalman.com/code/projects/jquery-hashchange/examples/bug-chrome-back-button/
+// Firefox: Remote XMLHttpRequest - http://benalman.com/code/projects/jquery-hashchange/examples/bug-firefox-remote-xhr/
+// WebKit: Back Button in an Iframe - http://benalman.com/code/projects/jquery-hashchange/examples/bug-webkit-hash-iframe/
+// Safari: Back Button from a different domain - http://benalman.com/code/projects/jquery-hashchange/examples/bug-safari-back-from-diff-domain/
+// 
+// Also note that should a browser natively support the window.onhashchange 
+// event, but not report that it does, the fallback polling loop will be used.
+// 
+// About: Release History
+// 
+// 1.3   - (7/21/2010) Reorganized IE6/7 Iframe code to make it more
+//         "removable" for mobile-only development. Added IE6/7 document.title
+//         support. Attempted to make Iframe as hidden as possible by using
+//         techniques from http://www.paciellogroup.com/blog/?p=604. Added 
+//         support for the "shortcut" format $(window).hashchange( fn ) and
+//         $(window).hashchange() like jQuery provides for built-in events.
+//         Renamed jQuery.hashchangeDelay to <jQuery.fn.hashchange.delay> and
+//         lowered its default value to 50. Added <jQuery.fn.hashchange.domain>
+//         and <jQuery.fn.hashchange.src> properties plus document-domain.html
+//         file to address access denied issues when setting document.domain in
+//         IE6/7.
+// 1.2   - (2/11/2010) Fixed a bug where coming back to a page using this plugin
+//         from a page on another domain would cause an error in Safari 4. Also,
+//         IE6/7 Iframe is now inserted after the body (this actually works),
+//         which prevents the page from scrolling when the event is first bound.
+//         Event can also now be bound before DOM ready, but it won't be usable
+//         before then in IE6/7.
+// 1.1   - (1/21/2010) Incorporated document.documentMode test to fix IE8 bug
+//         where browser version is incorrectly reported as 8.0, despite
+//         inclusion of the X-UA-Compatible IE=EmulateIE7 meta tag.
+// 1.0   - (1/9/2010) Initial Release. Broke out the jQuery BBQ event.special
+//         window.onhashchange functionality into a separate plugin for users
+//         who want just the basic event & back button support, without all the
+//         extra awesomeness that BBQ provides. This plugin will be included as
+//         part of jQuery BBQ, but also be available separately.
+
+(function($,window,undefined){
+  '$:nomunge'; // Used by YUI compressor.
+  
+  // Reused string.
+  var str_hashchange = 'hashchange',
+    
+    // Method / object references.
+    doc = document,
+    fake_onhashchange,
+    special = $.event.special,
+    
+    // Does the browser support window.onhashchange? Note that IE8 running in
+    // IE7 compatibility mode reports true for 'onhashchange' in window, even
+    // though the event isn't supported, so also test document.documentMode.
+    doc_mode = doc.documentMode,
+    supports_onhashchange = 'on' + str_hashchange in window && ( doc_mode === undefined || doc_mode > 7 );
+  
+  // Get location.hash (or what you'd expect location.hash to be) sans any
+  // leading #. Thanks for making this necessary, Firefox!
+  function get_fragment( url ) {
+    url = url || location.href;
+    return '#' + url.replace( /^[^#]*#?(.*)$/, '$1' );
+  };
+  
+  // Method: jQuery.fn.hashchange
+  // 
+  // Bind a handler to the window.onhashchange event or trigger all bound
+  // window.onhashchange event handlers. This behavior is consistent with
+  // jQuery's built-in event handlers.
+  // 
+  // Usage:
+  // 
+  // > jQuery(window).hashchange( [ handler ] );
+  // 
+  // Arguments:
+  // 
+  //  handler - (Function) Optional handler to be bound to the hashchange
+  //    event. This is a "shortcut" for the more verbose form:
+  //    jQuery(window).bind( 'hashchange', handler ). If handler is omitted,
+  //    all bound window.onhashchange event handlers will be triggered. This
+  //    is a shortcut for the more verbose
+  //    jQuery(window).trigger( 'hashchange' ). These forms are described in
+  //    the <hashchange event> section.
+  // 
+  // Returns:
+  // 
+  //  (jQuery) The initial jQuery collection of elements.
+  
+  // Allow the "shortcut" format $(elem).hashchange( fn ) for binding and
+  // $(elem).hashchange() for triggering, like jQuery does for built-in events.
+  $.fn[ str_hashchange ] = function( fn ) {
+    return fn ? this.bind( str_hashchange, fn ) : this.trigger( str_hashchange );
+  };
+  
+  // Property: jQuery.fn.hashchange.delay
+  // 
+  // The numeric interval (in milliseconds) at which the <hashchange event>
+  // polling loop executes. Defaults to 50.
+  
+  // Property: jQuery.fn.hashchange.domain
+  // 
+  // If you're setting document.domain in your JavaScript, and you want hash
+  // history to work in IE6/7, not only must this property be set, but you must
+  // also set document.domain BEFORE jQuery is loaded into the page. This
+  // property is only applicable if you are supporting IE6/7 (or IE8 operating
+  // in "IE7 compatibility" mode).
+  // 
+  // In addition, the <jQuery.fn.hashchange.src> property must be set to the
+  // path of the included "document-domain.html" file, which can be renamed or
+  // modified if necessary (note that the document.domain specified must be the
+  // same in both your main JavaScript as well as in this file).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.domain = document.domain;
+  
+  // Property: jQuery.fn.hashchange.src
+  // 
+  // If, for some reason, you need to specify an Iframe src file (for example,
+  // when setting document.domain as in <jQuery.fn.hashchange.domain>), you can
+  // do so using this property. Note that when using this property, history
+  // won't be recorded in IE6/7 until the Iframe src file loads. This property
+  // is only applicable if you are supporting IE6/7 (or IE8 operating in "IE7
+  // compatibility" mode).
+  // 
+  // Usage:
+  // 
+  // jQuery.fn.hashchange.src = 'path/to/file.html';
+  
+  $.fn[ str_hashchange ].delay = 50;
+  /*
+  $.fn[ str_hashchange ].domain = null;
+  $.fn[ str_hashchange ].src = null;
+  */
+  
+  // Event: hashchange event
+  // 
+  // Fired when location.hash changes. In browsers that support it, the native
+  // HTML5 window.onhashchange event is used, otherwise a polling loop is
+  // initialized, running every <jQuery.fn.hashchange.delay> milliseconds to
+  // see if the hash has changed. In IE6/7 (and IE8 operating in "IE7
+  // compatibility" mode), a hidden Iframe is created to allow the back button
+  // and hash-based history to work.
+  // 
+  // Usage as described in <jQuery.fn.hashchange>:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).hashchange( function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).hashchange();
+  // 
+  // A more verbose usage that allows for event namespacing:
+  // 
+  // > // Bind an event handler.
+  // > jQuery(window).bind( 'hashchange', function(e) {
+  // >   var hash = location.hash;
+  // >   ...
+  // > });
+  // > 
+  // > // Manually trigger the event handler.
+  // > jQuery(window).trigger( 'hashchange' );
+  // 
+  // Additional Notes:
+  // 
+  // * The polling loop and Iframe are not created until at least one handler
+  //   is actually bound to the 'hashchange' event.
+  // * If you need the bound handler(s) to execute immediately, in cases where
+  //   a location.hash exists on page load, via bookmark or page refresh for
+  //   example, use jQuery(window).hashchange() or the more verbose 
+  //   jQuery(window).trigger( 'hashchange' ).
+  // * The event can be bound before DOM ready, but since it won't be usable
+  //   before then in IE6/7 (due to the necessary Iframe), recommended usage is
+  //   to bind it inside a DOM ready handler.
+  
+  // Override existing $.event.special.hashchange methods (allowing this plugin
+  // to be defined after jQuery BBQ in BBQ's source code).
+  special[ str_hashchange ] = $.extend( special[ str_hashchange ], {
+    
+    // Called only when the first 'hashchange' event is bound to window.
+    setup: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to create our own. And we don't want to call this
+      // until the user binds to the event, just in case they never do, since it
+      // will create a polling loop and possibly even a hidden Iframe.
+      $( fake_onhashchange.start );
+    },
+    
+    // Called only when the last 'hashchange' event is unbound from window.
+    teardown: function() {
+      // If window.onhashchange is supported natively, there's nothing to do..
+      if ( supports_onhashchange ) { return false; }
+      
+      // Otherwise, we need to stop ours (if possible).
+      $( fake_onhashchange.stop );
+    }
+    
+  });
+  
+  // fake_onhashchange does all the work of triggering the window.onhashchange
+  // event for browsers that don't natively support it, including creating a
+  // polling loop to watch for hash changes and in IE 6/7 creating a hidden
+  // Iframe to enable back and forward.
+  fake_onhashchange = (function(){
+    var self = {},
+      timeout_id,
+      
+      // Remember the initial hash so it doesn't get triggered immediately.
+      last_hash = get_fragment(),
+      
+      fn_retval = function(val){ return val; },
+      history_set = fn_retval,
+      history_get = fn_retval;
+    
+    // Start the polling loop.
+    self.start = function() {
+      timeout_id || poll();
+    };
+    
+    // Stop the polling loop.
+    self.stop = function() {
+      timeout_id && clearTimeout( timeout_id );
+      timeout_id = undefined;
+    };
+    
+    // This polling loop checks every $.fn.hashchange.delay milliseconds to see
+    // if location.hash has changed, and triggers the 'hashchange' event on
+    // window when necessary.
+    function poll() {
+      var hash = get_fragment(),
+        history_hash = history_get( last_hash );
+      
+      if ( hash !== last_hash ) {
+        history_set( last_hash = hash, history_hash );
+        
+        $(window).trigger( str_hashchange );
+        
+      } else if ( history_hash !== last_hash ) {
+        location.href = location.href.replace( /#.*/, '' ) + history_hash;
+      }
+      
+      timeout_id = setTimeout( poll, $.fn[ str_hashchange ].delay );
+    };
+    
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvv REMOVE IF NOT SUPPORTING IE6/7/8 vvvvvvvvvvvvvvvvvvv
+    // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
+    window.attachEvent && !window.addEventListener && !supports_onhashchange && (function(){
+      // Not only do IE6/7 need the "magical" Iframe treatment, but so does IE8
+      // when running in "IE7 compatibility" mode.
+      
+      var iframe,
+        iframe_src;
+      
+      // When the event is bound and polling starts in IE 6/7, create a hidden
+      // Iframe for history handling.
+      self.start = function(){
+        if ( !iframe ) {
+          iframe_src = $.fn[ str_hashchange ].src;
+          iframe_src = iframe_src && iframe_src + get_fragment();
+          
+          // Create hidden Iframe. Attempt to make Iframe as hidden as possible
+          // by using techniques from http://www.paciellogroup.com/blog/?p=604.
+          iframe = $('<iframe tabindex="-1" title="empty"/>').hide()
+            
+            // When Iframe has completely loaded, initialize the history and
+            // start polling.
+            .one( 'load', function(){
+              iframe_src || history_set( get_fragment() );
+              poll();
+            })
+            
+            // Load Iframe src if specified, otherwise nothing.
+            .attr( 'src', iframe_src || 'javascript:0' )
+            
+            // Append Iframe after the end of the body to prevent unnecessary
+            // initial page scrolling (yes, this works).
+            .insertAfter( 'body' )[0].contentWindow;
+          
+          // Whenever `document.title` changes, update the Iframe's title to
+          // prettify the back/next history menu entries. Since IE sometimes
+          // errors with "Unspecified error" the very first time this is set
+          // (yes, very useful) wrap this with a try/catch block.
+          doc.onpropertychange = function(){
+            try {
+              if ( event.propertyName === 'title' ) {
+                iframe.document.title = doc.title;
+              }
+            } catch(e) {}
+          };
+          
+        }
+      };
+      
+      // Override the "stop" method since an IE6/7 Iframe was created. Even
+      // if there are no longer any bound event handlers, the polling loop
+      // is still necessary for back/next to work at all!
+      self.stop = fn_retval;
+      
+      // Get history by looking at the hidden Iframe's location.hash.
+      history_get = function() {
+        return get_fragment( iframe.location.href );
+      };
+      
+      // Set a new history item by opening and then closing the Iframe
+      // document, *then* setting its location.hash. If document.domain has
+      // been set, update that as well.
+      history_set = function( hash, history_hash ) {
+        var iframe_doc = iframe.document,
+          domain = $.fn[ str_hashchange ].domain;
+        
+        if ( hash !== history_hash ) {
+          // Update Iframe with any initial `document.title` that might be set.
+          iframe_doc.title = doc.title;
+          
+          // Opening the Iframe's document after it has been closed is what
+          // actually adds a history entry.
+          iframe_doc.open();
+          
+          // Set document.domain for the Iframe document as well, if necessary.
+          domain && iframe_doc.write( '<script>document.domain="' + domain + '"</script>' );
+          
+          iframe_doc.close();
+          
+          // Update the Iframe's hash, for great justice.
+          iframe.location.hash = hash;
+        }
+      };
+      
+    })();
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^ REMOVE IF NOT SUPPORTING IE6/7/8 ^^^^^^^^^^^^^^^^^^^
+    // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+    
+    return self;
+  })();
+  
+})(jQuery,this);
+
+(function( $, undefined ) {
+
+	/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas. Dual MIT/BSD license */
+	window.matchMedia = window.matchMedia || (function( doc, undefined ) {
+
+		var bool,
+			docElem = doc.documentElement,
+			refNode = docElem.firstElementChild || docElem.firstChild,
+			// fakeBody required for <FF4 when executed in <head>
+			fakeBody = doc.createElement( "body" ),
+			div = doc.createElement( "div" );
+
+		div.id = "mq-test-1";
+		div.style.cssText = "position:absolute;top:-100em";
+		fakeBody.style.background = "none";
+		fakeBody.appendChild(div);
+
+		return function(q){
+
+			div.innerHTML = "&shy;<style media=\"" + q + "\"> #mq-test-1 { width: 42px; }</style>";
+
+			docElem.insertBefore( fakeBody, refNode );
+			bool = div.offsetWidth === 42;
+			docElem.removeChild( fakeBody );
+
+			return {
+				matches: bool,
+				media: q
+			};
+
+		};
+
+	}( document ));
+
+	// $.mobile.media uses matchMedia to return a boolean.
+	$.mobile.media = function( q ) {
+		return window.matchMedia( q ).matches;
+	};
+
+})(jQuery);
+
+	(function( $, undefined ) {
+		var support = {
+			touch: "ontouchend" in document
+		};
+
+		$.mobile.support = $.mobile.support || {};
+		$.extend( $.support, support );
+		$.extend( $.mobile.support, support );
+	}( jQuery ));
+
+	(function( $, undefined ) {
+		$.extend( $.support, {
+			orientation: "orientation" in window && "onorientationchange" in window
+		});
+	}( jQuery ));
+
+(function( $, undefined ) {
+
+// thx Modernizr
+function propExists( prop ) {
+	var uc_prop = prop.charAt( 0 ).toUpperCase() + prop.substr( 1 ),
+		props = ( prop + " " + vendors.join( uc_prop + " " ) + uc_prop ).split( " " ),
+		v;
+
+	for ( v in props ) {
+		if ( fbCSS[ props[ v ] ] !== undefined ) {
+			return true;
+		}
+	}
+}
+
+var fakeBody = $( "<body>" ).prependTo( "html" ),
+	fbCSS = fakeBody[ 0 ].style,
+	vendors = [ "Webkit", "Moz", "O" ],
+	webos = "palmGetResource" in window, //only used to rule out scrollTop
+	operamini = window.operamini && ({}).toString.call( window.operamini ) === "[object OperaMini]",
+	bb = window.blackberry && !propExists( "-webkit-transform" ), //only used to rule out box shadow, as it's filled opaque on BB 5 and lower
+	nokiaLTE7_3;
+
+// inline SVG support test
+function inlineSVG() {
+	// Thanks Modernizr & Erik Dahlstrom
+	var w = window,
+		svg = !!w.document.createElementNS && !!w.document.createElementNS( "http://www.w3.org/2000/svg", "svg" ).createSVGRect && !( w.opera && navigator.userAgent.indexOf( "Chrome" ) === -1 ),
+		support = function( data ) {
+			if ( !( data && svg ) ) {
+				$( "html" ).addClass( "ui-nosvg" );
+			}
+		},
+		img = new w.Image();
+
+	img.onerror = function() {
+		support( false );
+	};
+	img.onload = function() {
+		support( img.width === 1 && img.height === 1 );
+	};
+	img.src = "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///ywAAAAAAQABAAACAUwAOw==";
+}
+
+function transform3dTest() {
+	var mqProp = "transform-3d",
+		// Because the `translate3d` test below throws false positives in Android:
+		ret = $.mobile.media( "(-" + vendors.join( "-" + mqProp + "),(-" ) + "-" + mqProp + "),(" + mqProp + ")" ),
+		el, transforms, t;
+
+	if ( ret ) {
+		return !!ret;
+	}
+
+	el = document.createElement( "div" );
+	transforms = {
+		// We’re omitting Opera for the time being; MS uses unprefixed.
+		"MozTransform": "-moz-transform",
+		"transform": "transform"
+	};
+
+	fakeBody.append( el );
+
+	for ( t in transforms ) {
+		if ( el.style[ t ] !== undefined ) {
+			el.style[ t ] = "translate3d( 100px, 1px, 1px )";
+			ret = window.getComputedStyle( el ).getPropertyValue( transforms[ t ] );
+		}
+	}
+	return ( !!ret && ret !== "none" );
+}
+
+// Test for dynamic-updating base tag support ( allows us to avoid href,src attr rewriting )
+function baseTagTest() {
+	var fauxBase = location.protocol + "//" + location.host + location.pathname + "ui-dir/",
+		base = $( "head base" ),
+		fauxEle = null,
+		href = "",
+		link, rebase;
+
+	if ( !base.length ) {
+		base = fauxEle = $( "<base>", { "href": fauxBase }).appendTo( "head" );
+	} else {
+		href = base.attr( "href" );
+	}
+
+	link = $( "<a href='testurl' />" ).prependTo( fakeBody );
+	rebase = link[ 0 ].href;
+	base[ 0 ].href = href || location.pathname;
+
+	if ( fauxEle ) {
+		fauxEle.remove();
+	}
+	return rebase.indexOf( fauxBase ) === 0;
+}
+
+// Thanks Modernizr
+function cssPointerEventsTest() {
+	var element = document.createElement( "x" ),
+		documentElement = document.documentElement,
+		getComputedStyle = window.getComputedStyle,
+		supports;
+
+	if ( !( "pointerEvents" in element.style ) ) {
+		return false;
+	}
+
+	element.style.pointerEvents = "auto";
+	element.style.pointerEvents = "x";
+	documentElement.appendChild( element );
+	supports = getComputedStyle &&
+	getComputedStyle( element, "" ).pointerEvents === "auto";
+	documentElement.removeChild( element );
+	return !!supports;
+}
+
+function boundingRect() {
+	var div = document.createElement( "div" );
+	return typeof div.getBoundingClientRect !== "undefined";
+}
+
+// non-UA-based IE version check by James Padolsey, modified by jdalton - from http://gist.github.com/527683
+// allows for inclusion of IE 6+, including Windows Mobile 7
+$.extend( $.mobile, { browser: {} } );
+$.mobile.browser.oldIE = (function() {
+	var v = 3,
+		div = document.createElement( "div" ),
+		a = div.all || [];
+
+	do {
+		div.innerHTML = "<!--[if gt IE " + ( ++v ) + "]><br><![endif]-->";
+	} while( a[0] );
+
+	return v > 4 ? v : !v;
+})();
+
+function fixedPosition() {
+	var w = window,
+		ua = navigator.userAgent,
+		platform = navigator.platform,
+		// Rendering engine is Webkit, and capture major version
+		wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
+		wkversion = !!wkmatch && wkmatch[ 1 ],
+		ffmatch = ua.match( /Fennec\/([0-9]+)/ ),
+		ffversion = !!ffmatch && ffmatch[ 1 ],
+		operammobilematch = ua.match( /Opera Mobi\/([0-9]+)/ ),
+		omversion = !!operammobilematch && operammobilematch[ 1 ];
+
+	if (
+		// iOS 4.3 and older : Platform is iPhone/Pad/Touch and Webkit version is less than 534 (ios5)
+		( ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1  || platform.indexOf( "iPod" ) > -1 ) && wkversion && wkversion < 534 ) ||
+		// Opera Mini
+		( w.operamini && ({}).toString.call( w.operamini ) === "[object OperaMini]" ) ||
+		( operammobilematch && omversion < 7458 )	||
+		//Android lte 2.1: Platform is Android and Webkit version is less than 533 (Android 2.2)
+		( ua.indexOf( "Android" ) > -1 && wkversion && wkversion < 533 ) ||
+		// Firefox Mobile before 6.0 -
+		( ffversion && ffversion < 6 ) ||
+		// WebOS less than 3
+		( "palmGetResource" in window && wkversion && wkversion < 534 )	||
+		// MeeGo
+		( ua.indexOf( "MeeGo" ) > -1 && ua.indexOf( "NokiaBrowser/8.5.0" ) > -1 ) ) {
+		return false;
+	}
+
+	return true;
+}
+
+$.extend( $.support, {
+	// Note, Chrome for iOS has an extremely quirky implementation of popstate.
+	// We've chosen to take the shortest path to a bug fix here for issue #5426
+	// See the following link for information about the regex chosen
+	// https://developers.google.com/chrome/mobile/docs/user-agent#chrome_for_ios_user-agent
+	pushState: "pushState" in history &&
+		"replaceState" in history &&
+		// When running inside a FF iframe, calling replaceState causes an error
+		!( window.navigator.userAgent.indexOf( "Firefox" ) >= 0 && window.top !== window ) &&
+		( window.navigator.userAgent.search(/CriOS/) === -1 ),
+
+	mediaquery: $.mobile.media( "only all" ),
+	cssPseudoElement: !!propExists( "content" ),
+	touchOverflow: !!propExists( "overflowScrolling" ),
+	cssTransform3d: transform3dTest(),
+	boxShadow: !!propExists( "boxShadow" ) && !bb,
+	fixedPosition: fixedPosition(),
+	scrollTop: ("pageXOffset" in window ||
+		"scrollTop" in document.documentElement ||
+		"scrollTop" in fakeBody[ 0 ]) && !webos && !operamini,
+
+	dynamicBaseTag: baseTagTest(),
+	cssPointerEvents: cssPointerEventsTest(),
+	boundingRect: boundingRect(),
+	inlineSVG: inlineSVG
+});
+
+fakeBody.remove();
+
+// $.mobile.ajaxBlacklist is used to override ajaxEnabled on platforms that have known conflicts with hash history updates (BB5, Symbian)
+// or that generally work better browsing in regular http for full page refreshes (Opera Mini)
+// Note: This detection below is used as a last resort.
+// We recommend only using these detection methods when all other more reliable/forward-looking approaches are not possible
+nokiaLTE7_3 = (function() {
+
+	var ua = window.navigator.userAgent;
+
+	//The following is an attempt to match Nokia browsers that are running Symbian/s60, with webkit, version 7.3 or older
+	return ua.indexOf( "Nokia" ) > -1 &&
+			( ua.indexOf( "Symbian/3" ) > -1 || ua.indexOf( "Series60/5" ) > -1 ) &&
+			ua.indexOf( "AppleWebKit" ) > -1 &&
+			ua.match( /(BrowserNG|NokiaBrowser)\/7\.[0-3]/ );
+})();
+
+// Support conditions that must be met in order to proceed
+// default enhanced qualifications are media query support OR IE 7+
+
+$.mobile.gradeA = function() {
+	return ( ( $.support.mediaquery && $.support.cssPseudoElement ) || $.mobile.browser.oldIE && $.mobile.browser.oldIE >= 8 ) && ( $.support.boundingRect || $.fn.jquery.match(/1\.[0-7+]\.[0-9+]?/) !== null );
+};
+
+$.mobile.ajaxBlacklist =
+			// BlackBerry browsers, pre-webkit
+			window.blackberry && !window.WebKitPoint ||
+			// Opera Mini
+			operamini ||
+			// Symbian webkits pre 7.3
+			nokiaLTE7_3;
+
+// Lastly, this workaround is the only way we've found so far to get pre 7.3 Symbian webkit devices
+// to render the stylesheets when they're referenced before this script, as we'd recommend doing.
+// This simply reappends the CSS in place, which for some reason makes it apply
+if ( nokiaLTE7_3 ) {
+	$(function() {
+		$( "head link[rel='stylesheet']" ).attr( "rel", "alternate stylesheet" ).attr( "rel", "stylesheet" );
+	});
+}
+
+// For ruling out shadows via css
+if ( !$.support.boxShadow ) {
+	$( "html" ).addClass( "ui-noboxshadow" );
+}
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+	var $win = $.mobile.window, self,
+		dummyFnToInitNavigate = function() {
+		};
+
+	$.event.special.beforenavigate = {
+		setup: function() {
+			$win.on( "navigate", dummyFnToInitNavigate );
+		},
+
+		teardown: function() {
+			$win.off( "navigate", dummyFnToInitNavigate );
+		}
+	};
+
+	$.event.special.navigate = self = {
+		bound: false,
+
+		pushStateEnabled: true,
+
+		originalEventName: undefined,
+
+		// If pushstate support is present and push state support is defined to
+		// be true on the mobile namespace.
+		isPushStateEnabled: function() {
+			return $.support.pushState &&
+				$.mobile.pushStateEnabled === true &&
+				this.isHashChangeEnabled();
+		},
+
+		// !! assumes mobile namespace is present
+		isHashChangeEnabled: function() {
+			return $.mobile.hashListeningEnabled === true;
+		},
+
+		// TODO a lot of duplication between popstate and hashchange
+		popstate: function( event ) {
+			var newEvent = new $.Event( "navigate" ),
+				beforeNavigate = new $.Event( "beforenavigate" ),
+				state = event.originalEvent.state || {};
+
+			beforeNavigate.originalEvent = event;
+			$win.trigger( beforeNavigate );
+
+			if ( beforeNavigate.isDefaultPrevented() ) {
+				return;
+			}
+
+			if ( event.historyState ) {
+				$.extend(state, event.historyState);
+			}
+
+			// Make sure the original event is tracked for the end
+			// user to inspect incase they want to do something special
+			newEvent.originalEvent = event;
+
+			// NOTE we let the current stack unwind because any assignment to
+			//      location.hash will stop the world and run this event handler. By
+			//      doing this we create a similar behavior to hashchange on hash
+			//      assignment
+			setTimeout(function() {
+				$win.trigger( newEvent, {
+					state: state
+				});
+			}, 0);
+		},
+
+		hashchange: function( event /*, data */ ) {
+			var newEvent = new $.Event( "navigate" ),
+				beforeNavigate = new $.Event( "beforenavigate" );
+
+			beforeNavigate.originalEvent = event;
+			$win.trigger( beforeNavigate );
+
+			if ( beforeNavigate.isDefaultPrevented() ) {
+				return;
+			}
+
+			// Make sure the original event is tracked for the end
+			// user to inspect incase they want to do something special
+			newEvent.originalEvent = event;
+
+			// Trigger the hashchange with state provided by the user
+			// that altered the hash
+			$win.trigger( newEvent, {
+				// Users that want to fully normalize the two events
+				// will need to do history management down the stack and
+				// add the state to the event before this binding is fired
+				// TODO consider allowing for the explicit addition of callbacks
+				//      to be fired before this value is set to avoid event timing issues
+				state: event.hashchangeState || {}
+			});
+		},
+
+		// TODO We really only want to set this up once
+		//      but I'm not clear if there's a beter way to achieve
+		//      this with the jQuery special event structure
+		setup: function( /* data, namespaces */ ) {
+			if ( self.bound ) {
+				return;
+			}
+
+			self.bound = true;
+
+			if ( self.isPushStateEnabled() ) {
+				self.originalEventName = "popstate";
+				$win.bind( "popstate.navigate", self.popstate );
+			} else if ( self.isHashChangeEnabled() ) {
+				self.originalEventName = "hashchange";
+				$win.bind( "hashchange.navigate", self.hashchange );
+			}
+		}
+	};
+})( jQuery );
+
+
+
+(function( $, undefined ) {
+		var path, $base, dialogHashKey = "&ui-state=dialog";
+
+		$.mobile.path = path = {
+			uiStateKey: "&ui-state",
+
+			// This scary looking regular expression parses an absolute URL or its relative
+			// variants (protocol, site, document, query, and hash), into the various
+			// components (protocol, host, path, query, fragment, etc that make up the
+			// URL as well as some other commonly used sub-parts. When used with RegExp.exec()
+			// or String.match, it parses the URL into a results array that looks like this:
+			//
+			//     [0]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread#msg-content
+			//     [1]: http://jblas:password@mycompany.com:8080/mail/inbox?msg=1234&type=unread
+			//     [2]: http://jblas:password@mycompany.com:8080/mail/inbox
+			//     [3]: http://jblas:password@mycompany.com:8080
+			//     [4]: http:
+			//     [5]: //
+			//     [6]: jblas:password@mycompany.com:8080
+			//     [7]: jblas:password
+			//     [8]: jblas
+			//     [9]: password
+			//    [10]: mycompany.com:8080
+			//    [11]: mycompany.com
+			//    [12]: 8080
+			//    [13]: /mail/inbox
+			//    [14]: /mail/
+			//    [15]: inbox
+			//    [16]: ?msg=1234&type=unread
+			//    [17]: #msg-content
+			//
+			urlParseRE: /^\s*(((([^:\/#\?]+:)?(?:(\/\/)((?:(([^:@\/#\?]+)(?:\:([^:@\/#\?]+))?)@)?(([^:\/#\?\]\[]+|\[[^\/\]@#?]+\])(?:\:([0-9]+))?))?)?)?((\/?(?:[^\/\?#]+\/+)*)([^\?#]*)))?(\?[^#]+)?)(#.*)?/,
+
+			// Abstraction to address xss (Issue #4787) by removing the authority in
+			// browsers that auto	decode it. All references to location.href should be
+			// replaced with a call to this method so that it can be dealt with properly here
+			getLocation: function( url ) {
+				var uri = url ? this.parseUrl( url ) : location,
+					hash = this.parseUrl( url || location.href ).hash;
+
+				// mimic the browser with an empty string when the hash is empty
+				hash = hash === "#" ? "" : hash;
+
+				// Make sure to parse the url or the location object for the hash because using location.hash
+				// is autodecoded in firefox, the rest of the url should be from the object (location unless
+				// we're testing) to avoid the inclusion of the authority
+				return uri.protocol + "//" + uri.host + uri.pathname + uri.search + hash;
+			},
+
+			//return the original document url
+			getDocumentUrl: function( asParsedObject ) {
+				return asParsedObject ? $.extend( {}, path.documentUrl ) : path.documentUrl.href;
+			},
+
+			parseLocation: function() {
+				return this.parseUrl( this.getLocation() );
+			},
+
+			//Parse a URL into a structure that allows easy access to
+			//all of the URL components by name.
+			parseUrl: function( url ) {
+				// If we're passed an object, we'll assume that it is
+				// a parsed url object and just return it back to the caller.
+				if ( $.type( url ) === "object" ) {
+					return url;
+				}
+
+				var matches = path.urlParseRE.exec( url || "" ) || [];
+
+					// Create an object that allows the caller to access the sub-matches
+					// by name. Note that IE returns an empty string instead of undefined,
+					// like all other browsers do, so we normalize everything so its consistent
+					// no matter what browser we're running on.
+					return {
+						href:         matches[  0 ] || "",
+						hrefNoHash:   matches[  1 ] || "",
+						hrefNoSearch: matches[  2 ] || "",
+						domain:       matches[  3 ] || "",
+						protocol:     matches[  4 ] || "",
+						doubleSlash:  matches[  5 ] || "",
+						authority:    matches[  6 ] || "",
+						username:     matches[  8 ] || "",
+						password:     matches[  9 ] || "",
+						host:         matches[ 10 ] || "",
+						hostname:     matches[ 11 ] || "",
+						port:         matches[ 12 ] || "",
+						pathname:     matches[ 13 ] || "",
+						directory:    matches[ 14 ] || "",
+						filename:     matches[ 15 ] || "",
+						search:       matches[ 16 ] || "",
+						hash:         matches[ 17 ] || ""
+					};
+			},
+
+			//Turn relPath into an asbolute path. absPath is
+			//an optional absolute path which describes what
+			//relPath is relative to.
+			makePathAbsolute: function( relPath, absPath ) {
+				var absStack,
+					relStack,
+					i, d;
+
+				if ( relPath && relPath.charAt( 0 ) === "/" ) {
+					return relPath;
+				}
+
+				relPath = relPath || "";
+				absPath = absPath ? absPath.replace( /^\/|(\/[^\/]*|[^\/]+)$/g, "" ) : "";
+
+				absStack = absPath ? absPath.split( "/" ) : [];
+				relStack = relPath.split( "/" );
+
+				for ( i = 0; i < relStack.length; i++ ) {
+					d = relStack[ i ];
+					switch ( d ) {
+						case ".":
+							break;
+						case "..":
+							if ( absStack.length ) {
+								absStack.pop();
+							}
+							break;
+						default:
+							absStack.push( d );
+							break;
+					}
+				}
+				return "/" + absStack.join( "/" );
+			},
+
+			//Returns true if both urls have the same domain.
+			isSameDomain: function( absUrl1, absUrl2 ) {
+				return path.parseUrl( absUrl1 ).domain === path.parseUrl( absUrl2 ).domain;
+			},
+
+			//Returns true for any relative variant.
+			isRelativeUrl: function( url ) {
+				// All relative Url variants have one thing in common, no protocol.
+				return path.parseUrl( url ).protocol === "";
+			},
+
+			//Returns true for an absolute url.
+			isAbsoluteUrl: function( url ) {
+				return path.parseUrl( url ).protocol !== "";
+			},
+
+			//Turn the specified realtive URL into an absolute one. This function
+			//can handle all relative variants (protocol, site, document, query, fragment).
+			makeUrlAbsolute: function( relUrl, absUrl ) {
+				if ( !path.isRelativeUrl( relUrl ) ) {
+					return relUrl;
+				}
+
+				if ( absUrl === undefined ) {
+					absUrl = this.documentBase;
+				}
+
+				var relObj = path.parseUrl( relUrl ),
+					absObj = path.parseUrl( absUrl ),
+					protocol = relObj.protocol || absObj.protocol,
+					doubleSlash = relObj.protocol ? relObj.doubleSlash : ( relObj.doubleSlash || absObj.doubleSlash ),
+					authority = relObj.authority || absObj.authority,
+					hasPath = relObj.pathname !== "",
+					pathname = path.makePathAbsolute( relObj.pathname || absObj.filename, absObj.pathname ),
+					search = relObj.search || ( !hasPath && absObj.search ) || "",
+					hash = relObj.hash;
+
+				return protocol + doubleSlash + authority + pathname + search + hash;
+			},
+
+			//Add search (aka query) params to the specified url.
+			addSearchParams: function( url, params ) {
+				var u = path.parseUrl( url ),
+					p = ( typeof params === "object" ) ? $.param( params ) : params,
+					s = u.search || "?";
+				return u.hrefNoSearch + s + ( s.charAt( s.length - 1 ) !== "?" ? "&" : "" ) + p + ( u.hash || "" );
+			},
+
+			convertUrlToDataUrl: function( absUrl ) {
+				var u = path.parseUrl( absUrl );
+				if ( path.isEmbeddedPage( u ) ) {
+					// For embedded pages, remove the dialog hash key as in getFilePath(),
+					// and remove otherwise the Data Url won't match the id of the embedded Page.
+					return u.hash
+						.split( dialogHashKey )[0]
+						.replace( /^#/, "" )
+						.replace( /\?.*$/, "" );
+				} else if ( path.isSameDomain( u, this.documentBase ) ) {
+					return u.hrefNoHash.replace( this.documentBase.domain, "" ).split( dialogHashKey )[0];
+				}
+
+				return window.decodeURIComponent(absUrl);
+			},
+
+			//get path from current hash, or from a file path
+			get: function( newPath ) {
+				if ( newPath === undefined ) {
+					newPath = path.parseLocation().hash;
+				}
+				return path.stripHash( newPath ).replace( /[^\/]*\.[^\/*]+$/, "" );
+			},
+
+			//set location hash to path
+			set: function( path ) {
+				location.hash = path;
+			},
+
+			//test if a given url (string) is a path
+			//NOTE might be exceptionally naive
+			isPath: function( url ) {
+				return ( /\// ).test( url );
+			},
+
+			//return a url path with the window's location protocol/hostname/pathname removed
+			clean: function( url ) {
+				return url.replace( this.documentBase.domain, "" );
+			},
+
+			//just return the url without an initial #
+			stripHash: function( url ) {
+				return url.replace( /^#/, "" );
+			},
+
+			stripQueryParams: function( url ) {
+				return url.replace( /\?.*$/, "" );
+			},
+
+			//remove the preceding hash, any query params, and dialog notations
+			cleanHash: function( hash ) {
+				return path.stripHash( hash.replace( /\?.*$/, "" ).replace( dialogHashKey, "" ) );
+			},
+
+			isHashValid: function( hash ) {
+				return ( /^#[^#]+$/ ).test( hash );
+			},
+
+			//check whether a url is referencing the same domain, or an external domain or different protocol
+			//could be mailto, etc
+			isExternal: function( url ) {
+				var u = path.parseUrl( url );
+				return u.protocol && u.domain !== this.documentUrl.domain ? true : false;
+			},
+
+			hasProtocol: function( url ) {
+				return ( /^(:?\w+:)/ ).test( url );
+			},
+
+			isEmbeddedPage: function( url ) {
+				var u = path.parseUrl( url );
+
+				//if the path is absolute, then we need to compare the url against
+				//both the this.documentUrl and the documentBase. The main reason for this
+				//is that links embedded within external documents will refer to the
+				//application document, whereas links embedded within the application
+				//document will be resolved against the document base.
+				if ( u.protocol !== "" ) {
+					return ( !this.isPath(u.hash) && u.hash && ( u.hrefNoHash === this.documentUrl.hrefNoHash || ( this.documentBaseDiffers && u.hrefNoHash === this.documentBase.hrefNoHash ) ) );
+				}
+				return ( /^#/ ).test( u.href );
+			},
+
+			squash: function( url, resolutionUrl ) {
+				var href, cleanedUrl, search, stateIndex,
+					isPath = this.isPath( url ),
+					uri = this.parseUrl( url ),
+					preservedHash = uri.hash,
+					uiState = "";
+
+				// produce a url against which we can resole the provided path
+				resolutionUrl = resolutionUrl || (path.isPath(url) ? path.getLocation() : path.getDocumentUrl());
+
+				// If the url is anything but a simple string, remove any preceding hash
+				// eg #foo/bar -> foo/bar
+				//    #foo -> #foo
+				cleanedUrl = isPath ? path.stripHash( url ) : url;
+
+				// If the url is a full url with a hash check if the parsed hash is a path
+				// if it is, strip the #, and use it otherwise continue without change
+				cleanedUrl = path.isPath( uri.hash ) ? path.stripHash( uri.hash ) : cleanedUrl;
+
+				// Split the UI State keys off the href
+				stateIndex = cleanedUrl.indexOf( this.uiStateKey );
+
+				// store the ui state keys for use
+				if ( stateIndex > -1 ) {
+					uiState = cleanedUrl.slice( stateIndex );
+					cleanedUrl = cleanedUrl.slice( 0, stateIndex );
+				}
+
+				// make the cleanedUrl absolute relative to the resolution url
+				href = path.makeUrlAbsolute( cleanedUrl, resolutionUrl );
+
+				// grab the search from the resolved url since parsing from
+				// the passed url may not yield the correct result
+				search = this.parseUrl( href ).search;
+
+				// TODO all this crap is terrible, clean it up
+				if ( isPath ) {
+					// reject the hash if it's a path or it's just a dialog key
+					if ( path.isPath( preservedHash ) || preservedHash.replace("#", "").indexOf( this.uiStateKey ) === 0) {
+						preservedHash = "";
+					}
+
+					// Append the UI State keys where it exists and it's been removed
+					// from the url
+					if ( uiState && preservedHash.indexOf( this.uiStateKey ) === -1) {
+						preservedHash += uiState;
+					}
+
+					// make sure that pound is on the front of the hash
+					if ( preservedHash.indexOf( "#" ) === -1 && preservedHash !== "" ) {
+						preservedHash = "#" + preservedHash;
+					}
+
+					// reconstruct each of the pieces with the new search string and hash
+					href = path.parseUrl( href );
+					href = href.protocol + "//" + href.host + href.pathname + search + preservedHash;
+				} else {
+					href += href.indexOf( "#" ) > -1 ? uiState : "#" + uiState;
+				}
+
+				return href;
+			},
+
+			isPreservableHash: function( hash ) {
+				return hash.replace( "#", "" ).indexOf( this.uiStateKey ) === 0;
+			},
+
+			// Escape weird characters in the hash if it is to be used as a selector
+			hashToSelector: function( hash ) {
+				var hasHash = ( hash.substring( 0, 1 ) === "#" );
+				if ( hasHash ) {
+					hash = hash.substring( 1 );
+				}
+				return ( hasHash ? "#" : "" ) + hash.replace( /([!"#$%&'()*+,./:;<=>?@[\]^`{|}~])/g, "\\$1" );
+			},
+
+			// return the substring of a filepath before the sub-page key, for making
+			// a server request
+			getFilePath: function( path ) {
+				var splitkey = "&" + $.mobile.subPageUrlKey;
+				return path && path.split( splitkey )[0].split( dialogHashKey )[0];
+			},
+
+			// check if the specified url refers to the first page in the main
+			// application document.
+			isFirstPageUrl: function( url ) {
+				// We only deal with absolute paths.
+				var u = path.parseUrl( path.makeUrlAbsolute( url, this.documentBase ) ),
+
+					// Does the url have the same path as the document?
+					samePath = u.hrefNoHash === this.documentUrl.hrefNoHash ||
+						( this.documentBaseDiffers &&
+							u.hrefNoHash === this.documentBase.hrefNoHash ),
+
+					// Get the first page element.
+					fp = $.mobile.firstPage,
+
+					// Get the id of the first page element if it has one.
+					fpId = fp && fp[0] ? fp[0].id : undefined;
+
+				// The url refers to the first page if the path matches the document and
+				// it either has no hash value, or the hash is exactly equal to the id
+				// of the first page element.
+				return samePath &&
+					( !u.hash ||
+						u.hash === "#" ||
+						( fpId && u.hash.replace( /^#/, "" ) === fpId ) );
+			},
+
+			// Some embedded browsers, like the web view in Phone Gap, allow
+			// cross-domain XHR requests if the document doing the request was loaded
+			// via the file:// protocol. This is usually to allow the application to
+			// "phone home" and fetch app specific data. We normally let the browser
+			// handle external/cross-domain urls, but if the allowCrossDomainPages
+			// option is true, we will allow cross-domain http/https requests to go
+			// through our page loading logic.
+			isPermittedCrossDomainRequest: function( docUrl, reqUrl ) {
+				return $.mobile.allowCrossDomainPages &&
+					(docUrl.protocol === "file:" || docUrl.protocol === "content:") &&
+					reqUrl.search( /^https?:/ ) !== -1;
+			}
+		};
+
+		path.documentUrl = path.parseLocation();
+
+		$base = $( "head" ).find( "base" );
+
+		path.documentBase = $base.length ?
+			path.parseUrl( path.makeUrlAbsolute( $base.attr( "href" ), path.documentUrl.href ) ) :
+			path.documentUrl;
+
+		path.documentBaseDiffers = (path.documentUrl.hrefNoHash !== path.documentBase.hrefNoHash);
+
+		//return the original document base url
+		path.getDocumentBase = function( asParsedObject ) {
+			return asParsedObject ? $.extend( {}, path.documentBase ) : path.documentBase.href;
+		};
+
+		// DEPRECATED as of 1.4.0 - remove in 1.5.0
+		$.extend( $.mobile, {
+
+			//return the original document url
+			getDocumentUrl: path.getDocumentUrl,
+
+			//return the original document base url
+			getDocumentBase: path.getDocumentBase
+		});
+})( jQuery );
+
+
+
+(function( $, undefined ) {
+	$.mobile.History = function( stack, index ) {
+		this.stack = stack || [];
+		this.activeIndex = index || 0;
+	};
+
+	$.extend($.mobile.History.prototype, {
+		getActive: function() {
+			return this.stack[ this.activeIndex ];
+		},
+
+		getLast: function() {
+			return this.stack[ this.previousIndex ];
+		},
+
+		getNext: function() {
+			return this.stack[ this.activeIndex + 1 ];
+		},
+
+		getPrev: function() {
+			return this.stack[ this.activeIndex - 1 ];
+		},
+
+		// addNew is used whenever a new page is added
+		add: function( url, data ) {
+			data = data || {};
+
+			//if there's forward history, wipe it
+			if ( this.getNext() ) {
+				this.clearForward();
+			}
+
+			// if the hash is included in the data make sure the shape
+			// is consistent for comparison
+			if ( data.hash && data.hash.indexOf( "#" ) === -1) {
+				data.hash = "#" + data.hash;
+			}
+
+			data.url = url;
+			this.stack.push( data );
+			this.activeIndex = this.stack.length - 1;
+		},
+
+		//wipe urls ahead of active index
+		clearForward: function() {
+			this.stack = this.stack.slice( 0, this.activeIndex + 1 );
+		},
+
+		find: function( url, stack, earlyReturn ) {
+			stack = stack || this.stack;
+
+			var entry, i, length = stack.length, index;
+
+			for ( i = 0; i < length; i++ ) {
+				entry = stack[i];
+
+				if ( decodeURIComponent(url) === decodeURIComponent(entry.url) ||
+					decodeURIComponent(url) === decodeURIComponent(entry.hash) ) {
+					index = i;
+
+					if ( earlyReturn ) {
+						return index;
+					}
+				}
+			}
+
+			return index;
+		},
+
+		closest: function( url ) {
+			var closest, a = this.activeIndex;
+
+			// First, take the slice of the history stack before the current index and search
+			// for a url match. If one is found, we'll avoid avoid looking through forward history
+			// NOTE the preference for backward history movement is driven by the fact that
+			//      most mobile browsers only have a dedicated back button, and users rarely use
+			//      the forward button in desktop browser anyhow
+			closest = this.find( url, this.stack.slice(0, a) );
+
+			// If nothing was found in backward history check forward. The `true`
+			// value passed as the third parameter causes the find method to break
+			// on the first match in the forward history slice. The starting index
+			// of the slice must then be added to the result to get the element index
+			// in the original history stack :( :(
+			//
+			// TODO this is hyper confusing and should be cleaned up (ugh so bad)
+			if ( closest === undefined ) {
+				closest = this.find( url, this.stack.slice(a), true );
+				closest = closest === undefined ? closest : closest + a;
+			}
+
+			return closest;
+		},
+
+		direct: function( opts ) {
+			var newActiveIndex = this.closest( opts.url ), a = this.activeIndex;
+
+			// save new page index, null check to prevent falsey 0 result
+			// record the previous index for reference
+			if ( newActiveIndex !== undefined ) {
+				this.activeIndex = newActiveIndex;
+				this.previousIndex = a;
+			}
+
+			// invoke callbacks where appropriate
+			//
+			// TODO this is also convoluted and confusing
+			if ( newActiveIndex < a ) {
+				( opts.present || opts.back || $.noop )( this.getActive(), "back" );
+			} else if ( newActiveIndex > a ) {
+				( opts.present || opts.forward || $.noop )( this.getActive(), "forward" );
+			} else if ( newActiveIndex === undefined && opts.missing ) {
+				opts.missing( this.getActive() );
+			}
+		}
+	});
+})( jQuery );
+
+
+
+(function( $, undefined ) {
+	var path = $.mobile.path,
+		initialHref = location.href;
+
+	$.mobile.Navigator = function( history ) {
+		this.history = history;
+		this.ignoreInitialHashChange = true;
+
+		$.mobile.window.bind({
+			"popstate.history": $.proxy( this.popstate, this ),
+			"hashchange.history": $.proxy( this.hashchange, this )
+		});
+	};
+
+	$.extend($.mobile.Navigator.prototype, {
+		squash: function( url, data ) {
+			var state, href, hash = path.isPath(url) ? path.stripHash(url) : url;
+
+			href = path.squash( url );
+
+			// make sure to provide this information when it isn't explicitly set in the
+			// data object that was passed to the squash method
+			state = $.extend({
+				hash: hash,
+				url: href
+			}, data);
+
+			// replace the current url with the new href and store the state
+			// Note that in some cases we might be replacing an url with the
+			// same url. We do this anyways because we need to make sure that
+			// all of our history entries have a state object associated with
+			// them. This allows us to work around the case where $.mobile.back()
+			// is called to transition from an external page to an embedded page.
+			// In that particular case, a hashchange event is *NOT* generated by the browser.
+			// Ensuring each history entry has a state object means that onPopState()
+			// will always trigger our hashchange callback even when a hashchange event
+			// is not fired.
+			window.history.replaceState( state, state.title || document.title, href );
+
+			return state;
+		},
+
+		hash: function( url, href ) {
+			var parsed, loc, hash, resolved;
+
+			// Grab the hash for recording. If the passed url is a path
+			// we used the parsed version of the squashed url to reconstruct,
+			// otherwise we assume it's a hash and store it directly
+			parsed = path.parseUrl( url );
+			loc = path.parseLocation();
+
+			if ( loc.pathname + loc.search === parsed.pathname + parsed.search ) {
+				// If the pathname and search of the passed url is identical to the current loc
+				// then we must use the hash. Otherwise there will be no event
+				// eg, url = "/foo/bar?baz#bang", location.href = "http://example.com/foo/bar?baz"
+				hash = parsed.hash ? parsed.hash : parsed.pathname + parsed.search;
+			} else if ( path.isPath(url) ) {
+				resolved = path.parseUrl( href );
+				// If the passed url is a path, make it domain relative and remove any trailing hash
+				hash = resolved.pathname + resolved.search + (path.isPreservableHash( resolved.hash )? resolved.hash.replace( "#", "" ) : "");
+			} else {
+				hash = url;
+			}
+
+			return hash;
+		},
+
+		// TODO reconsider name
+		go: function( url, data, noEvents ) {
+			var state, href, hash, popstateEvent,
+				isPopStateEvent = $.event.special.navigate.isPushStateEnabled();
+
+			// Get the url as it would look squashed on to the current resolution url
+			href = path.squash( url );
+
+			// sort out what the hash sould be from the url
+			hash = this.hash( url, href );
+
+			// Here we prevent the next hash change or popstate event from doing any
+			// history management. In the case of hashchange we don't swallow it
+			// if there will be no hashchange fired (since that won't reset the value)
+			// and will swallow the following hashchange
+			if ( noEvents && hash !== path.stripHash(path.parseLocation().hash) ) {
+				this.preventNextHashChange = noEvents;
+			}
+
+			// IMPORTANT in the case where popstate is supported the event will be triggered
+			//      directly, stopping further execution - ie, interupting the flow of this
+			//      method call to fire bindings at this expression. Below the navigate method
+			//      there is a binding to catch this event and stop its propagation.
+			//
+			//      We then trigger a new popstate event on the window with a null state
+			//      so that the navigate events can conclude their work properly
+			//
+			// if the url is a path we want to preserve the query params that are available on
+			// the current url.
+			this.preventHashAssignPopState = true;
+			window.location.hash = hash;
+
+			// If popstate is enabled and the browser triggers `popstate` events when the hash
+			// is set (this often happens immediately in browsers like Chrome), then the
+			// this flag will be set to false already. If it's a browser that does not trigger
+			// a `popstate` on hash assignement or `replaceState` then we need avoid the branch
+			// that swallows the event created by the popstate generated by the hash assignment
+			// At the time of this writing this happens with Opera 12 and some version of IE
+			this.preventHashAssignPopState = false;
+
+			state = $.extend({
+				url: href,
+				hash: hash,
+				title: document.title
+			}, data);
+
+			if ( isPopStateEvent ) {
+				popstateEvent = new $.Event( "popstate" );
+				popstateEvent.originalEvent = {
+					type: "popstate",
+					state: null
+				};
+
+				this.squash( url, state );
+
+				// Trigger a new faux popstate event to replace the one that we
+				// caught that was triggered by the hash setting above.
+				if ( !noEvents ) {
+					this.ignorePopState = true;
+					$.mobile.window.trigger( popstateEvent );
+				}
+			}
+
+			// record the history entry so that the information can be included
+			// in hashchange event driven navigate events in a similar fashion to
+			// the state that's provided by popstate
+			this.history.add( state.url, state );
+		},
+
+		// This binding is intended to catch the popstate events that are fired
+		// when execution of the `$.navigate` method stops at window.location.hash = url;
+		// and completely prevent them from propagating. The popstate event will then be
+		// retriggered after execution resumes
+		//
+		// TODO grab the original event here and use it for the synthetic event in the
+		//      second half of the navigate execution that will follow this binding
+		popstate: function( event ) {
+			var hash, state;
+
+			// Partly to support our test suite which manually alters the support
+			// value to test hashchange. Partly to prevent all around weirdness
+			if ( !$.event.special.navigate.isPushStateEnabled() ) {
+				return;
+			}
+
+			// If this is the popstate triggered by the actual alteration of the hash
+			// prevent it completely. History is tracked manually
+			if ( this.preventHashAssignPopState ) {
+				this.preventHashAssignPopState = false;
+				event.stopImmediatePropagation();
+				return;
+			}
+
+			// if this is the popstate triggered after the `replaceState` call in the go
+			// method, then simply ignore it. The history entry has already been captured
+			if ( this.ignorePopState ) {
+				this.ignorePopState = false;
+				return;
+			}
+
+			// If there is no state, and the history stack length is one were
+			// probably getting the page load popstate fired by browsers like chrome
+			// avoid it and set the one time flag to false.
+			// TODO: Do we really need all these conditions? Comparing location hrefs
+			// should be sufficient.
+			if ( !event.originalEvent.state &&
+				this.history.stack.length === 1 &&
+				this.ignoreInitialHashChange ) {
+				this.ignoreInitialHashChange = false;
+
+				if ( location.href === initialHref ) {
+					event.preventDefault();
+					return;
+				}
+			}
+
+			// account for direct manipulation of the hash. That is, we will receive a popstate
+			// when the hash is changed by assignment, and it won't have a state associated. We
+			// then need to squash the hash. See below for handling of hash assignment that
+			// matches an existing history entry
+			// TODO it might be better to only add to the history stack
+			//      when the hash is adjacent to the active history entry
+			hash = path.parseLocation().hash;
+			if ( !event.originalEvent.state && hash ) {
+				// squash the hash that's been assigned on the URL with replaceState
+				// also grab the resulting state object for storage
+				state = this.squash( hash );
+
+				// record the new hash as an additional history entry
+				// to match the browser's treatment of hash assignment
+				this.history.add( state.url, state );
+
+				// pass the newly created state information
+				// along with the event
+				event.historyState = state;
+
+				// do not alter history, we've added a new history entry
+				// so we know where we are
+				return;
+			}
+
+			// If all else fails this is a popstate that comes from the back or forward buttons
+			// make sure to set the state of our history stack properly, and record the directionality
+			this.history.direct({
+				url: (event.originalEvent.state || {}).url || hash,
+
+				// When the url is either forward or backward in history include the entry
+				// as data on the event object for merging as data in the navigate event
+				present: function( historyEntry, direction ) {
+					// make sure to create a new object to pass down as the navigate event data
+					event.historyState = $.extend({}, historyEntry);
+					event.historyState.direction = direction;
+				}
+			});
+		},
+
+		// NOTE must bind before `navigate` special event hashchange binding otherwise the
+		//      navigation data won't be attached to the hashchange event in time for those
+		//      bindings to attach it to the `navigate` special event
+		// TODO add a check here that `hashchange.navigate` is bound already otherwise it's
+		//      broken (exception?)
+		hashchange: function( event ) {
+			var history, hash;
+
+			// If hashchange listening is explicitly disabled or pushstate is supported
+			// avoid making use of the hashchange handler.
+			if (!$.event.special.navigate.isHashChangeEnabled() ||
+				$.event.special.navigate.isPushStateEnabled() ) {
+				return;
+			}
+
+			// On occasion explicitly want to prevent the next hash from propogating because we only
+			// with to alter the url to represent the new state do so here
+			if ( this.preventNextHashChange ) {
+				this.preventNextHashChange = false;
+				event.stopImmediatePropagation();
+				return;
+			}
+
+			history = this.history;
+			hash = path.parseLocation().hash;
+
+			// If this is a hashchange caused by the back or forward button
+			// make sure to set the state of our history stack properly
+			this.history.direct({
+				url: hash,
+
+				// When the url is either forward or backward in history include the entry
+				// as data on the event object for merging as data in the navigate event
+				present: function( historyEntry, direction ) {
+					// make sure to create a new object to pass down as the navigate event data
+					event.hashchangeState = $.extend({}, historyEntry);
+					event.hashchangeState.direction = direction;
+				},
+
+				// When we don't find a hash in our history clearly we're aiming to go there
+				// record the entry as new for future traversal
+				//
+				// NOTE it's not entirely clear that this is the right thing to do given that we
+				//      can't know the users intention. It might be better to explicitly _not_
+				//      support location.hash assignment in preference to $.navigate calls
+				// TODO first arg to add should be the href, but it causes issues in identifying
+				//      embeded pages
+				missing: function() {
+					history.add( hash, {
+						hash: hash,
+						title: document.title
+					});
+				}
+			});
+		}
+	});
+})( jQuery );
+
+
+
+(function( $, undefined ) {
+	// TODO consider queueing navigation activity until previous activities have completed
+	//      so that end users don't have to think about it. Punting for now
+	// TODO !! move the event bindings into callbacks on the navigate event
+	$.mobile.navigate = function( url, data, noEvents ) {
+		$.mobile.navigate.navigator.go( url, data, noEvents );
+	};
+
+	// expose the history on the navigate method in anticipation of full integration with
+	// existing navigation functionalty that is tightly coupled to the history information
+	$.mobile.navigate.history = new $.mobile.History();
+
+	// instantiate an instance of the navigator for use within the $.navigate method
+	$.mobile.navigate.navigator = new $.mobile.Navigator( $.mobile.navigate.history );
+
+	var loc = $.mobile.path.parseLocation();
+	$.mobile.navigate.history.add( loc.href, {hash: loc.hash} );
+})( jQuery );
+
+
+(function( $, undefined ) {
+	var props = {
+			"animation": {},
+			"transition": {}
+		},
+		testElement = document.createElement( "a" ),
+		vendorPrefixes = [ "", "webkit-", "moz-", "o-" ];
+
+	$.each( [ "animation", "transition" ], function( i, test ) {
+
+		// Get correct name for test
+		var testName = ( i === 0 ) ? test + "-" + "name" : test;
+
+		$.each( vendorPrefixes, function( j, prefix ) {
+			if ( testElement.style[ $.camelCase( prefix + testName ) ] !== undefined ) {
+				 props[ test ][ "prefix" ] = prefix;
+				return false;
+			}
+		});
+
+		// Set event and duration names for later use
+		props[ test ][ "duration" ] =
+			$.camelCase( props[ test ][ "prefix" ] + test + "-" + "duration" );
+		props[ test ][ "event" ] =
+			$.camelCase( props[ test ][ "prefix" ] + test + "-" + "end" );
+
+		// All lower case if not a vendor prop
+		if ( props[ test ][ "prefix" ] === "" ) {
+			props[ test ][ "event" ] = props[ test ][ "event" ].toLowerCase();
+		}
+	});
+
+	// If a valid prefix was found then the it is supported by the browser
+	$.support.cssTransitions = ( props[ "transition" ][ "prefix" ] !== undefined );
+	$.support.cssAnimations = ( props[ "animation" ][ "prefix" ] !== undefined );
+
+	// Remove the testElement
+	$( testElement ).remove();
+
+	// Animation complete callback
+	$.fn.animationComplete = function( callback, type, fallbackTime ) {
+		var timer, duration,
+			that = this,
+			animationType = ( !type || type === "animation" ) ? "animation" : "transition";
+
+		// Make sure selected type is supported by browser
+		if ( ( $.support.cssTransitions && animationType === "transition" ) ||
+			( $.support.cssAnimations && animationType === "animation" ) ) {
+
+			// If a fallback time was not passed set one
+			if ( fallbackTime === undefined ) {
+
+				// Make sure the was not bound to document before checking .css
+				if ( $( this ).context !== document ) {
+
+					// Parse the durration since its in second multiple by 1000 for milliseconds
+					// Multiply by 3 to make sure we give the animation plenty of time.
+					duration = parseFloat(
+						$( this ).css( props[ animationType ].duration )
+					) * 3000;
+				}
+
+				// If we could not read a duration use the default
+				if ( duration === 0 || duration === undefined || isNaN( duration ) ) {
+					duration = $.fn.animationComplete.defaultDuration;
+				}
+			}
+
+			// Sets up the fallback if event never comes
+			timer = setTimeout( function() {
+				$( that ).off( props[ animationType ].event );
+				callback.apply( that );
+			}, duration );
+
+			// Bind the event
+			return $( this ).one( props[ animationType ].event, function() {
+
+				// Clear the timer so we dont call callback twice
+				clearTimeout( timer );
+				callback.call( this, arguments );
+			});
+		} else {
+
+			// CSS animation / transitions not supported
+			// Defer execution for consistency between webkit/non webkit
+			setTimeout( $.proxy( callback, this ), 0 );
+			return $( this );
+		}
+	};
+
+	// Allow default callback to be configured on mobileInit
+	$.fn.animationComplete.defaultDuration = 1000;
+})( jQuery );
+
+// This plugin is an experiment for abstracting away the touch and mouse
+// events so that developers don't have to worry about which method of input
+// the device their document is loaded on supports.
+//
+// The idea here is to allow the developer to register listeners for the
+// basic mouse events, such as mousedown, mousemove, mouseup, and click,
+// and the plugin will take care of registering the correct listeners
+// behind the scenes to invoke the listener at the fastest possible time
+// for that device, while still retaining the order of event firing in
+// the traditional mouse environment, should multiple handlers be registered
+// on the same element for different events.
+//
+// The current version exposes the following virtual events to jQuery bind methods:
+// "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel"
+
+(function( $, window, document, undefined ) {
+
+var dataPropertyName = "virtualMouseBindings",
+	touchTargetPropertyName = "virtualTouchID",
+	virtualEventNames = "vmouseover vmousedown vmousemove vmouseup vclick vmouseout vmousecancel".split( " " ),
+	touchEventProps = "clientX clientY pageX pageY screenX screenY".split( " " ),
+	mouseHookProps = $.event.mouseHooks ? $.event.mouseHooks.props : [],
+	mouseEventProps = $.event.props.concat( mouseHookProps ),
+	activeDocHandlers = {},
+	resetTimerID = 0,
+	startX = 0,
+	startY = 0,
+	didScroll = false,
+	clickBlockList = [],
+	blockMouseTriggers = false,
+	blockTouchTriggers = false,
+	eventCaptureSupported = "addEventListener" in document,
+	$document = $( document ),
+	nextTouchID = 1,
+	lastTouchID = 0, threshold,
+	i;
+
+$.vmouse = {
+	moveDistanceThreshold: 10,
+	clickDistanceThreshold: 10,
+	resetTimerDuration: 1500
+};
+
+function getNativeEvent( event ) {
+
+	while ( event && typeof event.originalEvent !== "undefined" ) {
+		event = event.originalEvent;
+	}
+	return event;
+}
+
+function createVirtualEvent( event, eventType ) {
+
+	var t = event.type,
+		oe, props, ne, prop, ct, touch, i, j, len;
+
+	event = $.Event( event );
+	event.type = eventType;
+
+	oe = event.originalEvent;
+	props = $.event.props;
+
+	// addresses separation of $.event.props in to $.event.mouseHook.props and Issue 3280
+	// https://github.com/jquery/jquery-mobile/issues/3280
+	if ( t.search( /^(mouse|click)/ ) > -1 ) {
+		props = mouseEventProps;
+	}
+
+	// copy original event properties over to the new event
+	// this would happen if we could call $.event.fix instead of $.Event
+	// but we don't have a way to force an event to be fixed multiple times
+	if ( oe ) {
+		for ( i = props.length, prop; i; ) {
+			prop = props[ --i ];
+			event[ prop ] = oe[ prop ];
+		}
+	}
+
+	// make sure that if the mouse and click virtual events are generated
+	// without a .which one is defined
+	if ( t.search(/mouse(down|up)|click/) > -1 && !event.which ) {
+		event.which = 1;
+	}
+
+	if ( t.search(/^touch/) !== -1 ) {
+		ne = getNativeEvent( oe );
+		t = ne.touches;
+		ct = ne.changedTouches;
+		touch = ( t && t.length ) ? t[0] : ( ( ct && ct.length ) ? ct[ 0 ] : undefined );
+
+		if ( touch ) {
+			for ( j = 0, len = touchEventProps.length; j < len; j++) {
+				prop = touchEventProps[ j ];
+				event[ prop ] = touch[ prop ];
+			}
+		}
+	}
+
+	return event;
+}
+
+function getVirtualBindingFlags( element ) {
+
+	var flags = {},
+		b, k;
+
+	while ( element ) {
+
+		b = $.data( element, dataPropertyName );
+
+		for (  k in b ) {
+			if ( b[ k ] ) {
+				flags[ k ] = flags.hasVirtualBinding = true;
+			}
+		}
+		element = element.parentNode;
+	}
+	return flags;
+}
+
+function getClosestElementWithVirtualBinding( element, eventType ) {
+	var b;
+	while ( element ) {
+
+		b = $.data( element, dataPropertyName );
+
+		if ( b && ( !eventType || b[ eventType ] ) ) {
+			return element;
+		}
+		element = element.parentNode;
+	}
+	return null;
+}
+
+function enableTouchBindings() {
+	blockTouchTriggers = false;
+}
+
+function disableTouchBindings() {
+	blockTouchTriggers = true;
+}
+
+function enableMouseBindings() {
+	lastTouchID = 0;
+	clickBlockList.length = 0;
+	blockMouseTriggers = false;
+
+	// When mouse bindings are enabled, our
+	// touch bindings are disabled.
+	disableTouchBindings();
+}
+
+function disableMouseBindings() {
+	// When mouse bindings are disabled, our
+	// touch bindings are enabled.
+	enableTouchBindings();
+}
+
+function startResetTimer() {
+	clearResetTimer();
+	resetTimerID = setTimeout( function() {
+		resetTimerID = 0;
+		enableMouseBindings();
+	}, $.vmouse.resetTimerDuration );
+}
+
+function clearResetTimer() {
+	if ( resetTimerID ) {
+		clearTimeout( resetTimerID );
+		resetTimerID = 0;
+	}
+}
+
+function triggerVirtualEvent( eventType, event, flags ) {
+	var ve;
+
+	if ( ( flags && flags[ eventType ] ) ||
+				( !flags && getClosestElementWithVirtualBinding( event.target, eventType ) ) ) {
+
+		ve = createVirtualEvent( event, eventType );
+
+		$( event.target).trigger( ve );
+	}
+
+	return ve;
+}
+
+function mouseEventCallback( event ) {
+	var touchID = $.data( event.target, touchTargetPropertyName ),
+		ve;
+
+	if ( !blockMouseTriggers && ( !lastTouchID || lastTouchID !== touchID ) ) {
+		ve = triggerVirtualEvent( "v" + event.type, event );
+		if ( ve ) {
+			if ( ve.isDefaultPrevented() ) {
+				event.preventDefault();
+			}
+			if ( ve.isPropagationStopped() ) {
+				event.stopPropagation();
+			}
+			if ( ve.isImmediatePropagationStopped() ) {
+				event.stopImmediatePropagation();
+			}
+		}
+	}
+}
+
+function handleTouchStart( event ) {
+
+	var touches = getNativeEvent( event ).touches,
+		target, flags, t;
+
+	if ( touches && touches.length === 1 ) {
+
+		target = event.target;
+		flags = getVirtualBindingFlags( target );
+
+		if ( flags.hasVirtualBinding ) {
+
+			lastTouchID = nextTouchID++;
+			$.data( target, touchTargetPropertyName, lastTouchID );
+
+			clearResetTimer();
+
+			disableMouseBindings();
+			didScroll = false;
+
+			t = getNativeEvent( event ).touches[ 0 ];
+			startX = t.pageX;
+			startY = t.pageY;
+
+			triggerVirtualEvent( "vmouseover", event, flags );
+			triggerVirtualEvent( "vmousedown", event, flags );
+		}
+	}
+}
+
+function handleScroll( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	if ( !didScroll ) {
+		triggerVirtualEvent( "vmousecancel", event, getVirtualBindingFlags( event.target ) );
+	}
+
+	didScroll = true;
+	startResetTimer();
+}
+
+function handleTouchMove( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	var t = getNativeEvent( event ).touches[ 0 ],
+		didCancel = didScroll,
+		moveThreshold = $.vmouse.moveDistanceThreshold,
+		flags = getVirtualBindingFlags( event.target );
+
+		didScroll = didScroll ||
+			( Math.abs( t.pageX - startX ) > moveThreshold ||
+				Math.abs( t.pageY - startY ) > moveThreshold );
+
+	if ( didScroll && !didCancel ) {
+		triggerVirtualEvent( "vmousecancel", event, flags );
+	}
+
+	triggerVirtualEvent( "vmousemove", event, flags );
+	startResetTimer();
+}
+
+function handleTouchEnd( event ) {
+	if ( blockTouchTriggers ) {
+		return;
+	}
+
+	disableTouchBindings();
+
+	var flags = getVirtualBindingFlags( event.target ),
+		ve, t;
+	triggerVirtualEvent( "vmouseup", event, flags );
+
+	if ( !didScroll ) {
+		ve = triggerVirtualEvent( "vclick", event, flags );
+		if ( ve && ve.isDefaultPrevented() ) {
+			// The target of the mouse events that follow the touchend
+			// event don't necessarily match the target used during the
+			// touch. This means we need to rely on coordinates for blocking
+			// any click that is generated.
+			t = getNativeEvent( event ).changedTouches[ 0 ];
+			clickBlockList.push({
+				touchID: lastTouchID,
+				x: t.clientX,
+				y: t.clientY
+			});
+
+			// Prevent any mouse events that follow from triggering
+			// virtual event notifications.
+			blockMouseTriggers = true;
+		}
+	}
+	triggerVirtualEvent( "vmouseout", event, flags);
+	didScroll = false;
+
+	startResetTimer();
+}
+
+function hasVirtualBindings( ele ) {
+	var bindings = $.data( ele, dataPropertyName ),
+		k;
+
+	if ( bindings ) {
+		for ( k in bindings ) {
+			if ( bindings[ k ] ) {
+				return true;
+			}
+		}
+	}
+	return false;
+}
+
+function dummyMouseHandler() {}
+
+function getSpecialEventObject( eventType ) {
+	var realType = eventType.substr( 1 );
+
+	return {
+		setup: function(/* data, namespace */) {
+			// If this is the first virtual mouse binding for this element,
+			// add a bindings object to its data.
+
+			if ( !hasVirtualBindings( this ) ) {
+				$.data( this, dataPropertyName, {} );
+			}
+
+			// If setup is called, we know it is the first binding for this
+			// eventType, so initialize the count for the eventType to zero.
+			var bindings = $.data( this, dataPropertyName );
+			bindings[ eventType ] = true;
+
+			// If this is the first virtual mouse event for this type,
+			// register a global handler on the document.
+
+			activeDocHandlers[ eventType ] = ( activeDocHandlers[ eventType ] || 0 ) + 1;
+
+			if ( activeDocHandlers[ eventType ] === 1 ) {
+				$document.bind( realType, mouseEventCallback );
+			}
+
+			// Some browsers, like Opera Mini, won't dispatch mouse/click events
+			// for elements unless they actually have handlers registered on them.
+			// To get around this, we register dummy handlers on the elements.
+
+			$( this ).bind( realType, dummyMouseHandler );
+
+			// For now, if event capture is not supported, we rely on mouse handlers.
+			if ( eventCaptureSupported ) {
+				// If this is the first virtual mouse binding for the document,
+				// register our touchstart handler on the document.
+
+				activeDocHandlers[ "touchstart" ] = ( activeDocHandlers[ "touchstart" ] || 0) + 1;
+
+				if ( activeDocHandlers[ "touchstart" ] === 1 ) {
+					$document.bind( "touchstart", handleTouchStart )
+						.bind( "touchend", handleTouchEnd )
+
+						// On touch platforms, touching the screen and then dragging your finger
+						// causes the window content to scroll after some distance threshold is
+						// exceeded. On these platforms, a scroll prevents a click event from being
+						// dispatched, and on some platforms, even the touchend is suppressed. To
+						// mimic the suppression of the click event, we need to watch for a scroll
+						// event. Unfortunately, some platforms like iOS don't dispatch scroll
+						// events until *AFTER* the user lifts their finger (touchend). This means
+						// we need to watch both scroll and touchmove events to figure out whether
+						// or not a scroll happenens before the touchend event is fired.
+
+						.bind( "touchmove", handleTouchMove )
+						.bind( "scroll", handleScroll );
+				}
+			}
+		},
+
+		teardown: function(/* data, namespace */) {
+			// If this is the last virtual binding for this eventType,
+			// remove its global handler from the document.
+
+			--activeDocHandlers[ eventType ];
+
+			if ( !activeDocHandlers[ eventType ] ) {
+				$document.unbind( realType, mouseEventCallback );
+			}
+
+			if ( eventCaptureSupported ) {
+				// If this is the last virtual mouse binding in existence,
+				// remove our document touchstart listener.
+
+				--activeDocHandlers[ "touchstart" ];
+
+				if ( !activeDocHandlers[ "touchstart" ] ) {
+					$document.unbind( "touchstart", handleTouchStart )
+						.unbind( "touchmove", handleTouchMove )
+						.unbind( "touchend", handleTouchEnd )
+						.unbind( "scroll", handleScroll );
+				}
+			}
+
+			var $this = $( this ),
+				bindings = $.data( this, dataPropertyName );
+
+			// teardown may be called when an element was
+			// removed from the DOM. If this is the case,
+			// jQuery core may have already stripped the element
+			// of any data bindings so we need to check it before
+			// using it.
+			if ( bindings ) {
+				bindings[ eventType ] = false;
+			}
+
+			// Unregister the dummy event handler.
+
+			$this.unbind( realType, dummyMouseHandler );
+
+			// If this is the last virtual mouse binding on the
+			// element, remove the binding data from the element.
+
+			if ( !hasVirtualBindings( this ) ) {
+				$this.removeData( dataPropertyName );
+			}
+		}
+	};
+}
+
+// Expose our custom events to the jQuery bind/unbind mechanism.
+
+for ( i = 0; i < virtualEventNames.length; i++ ) {
+	$.event.special[ virtualEventNames[ i ] ] = getSpecialEventObject( virtualEventNames[ i ] );
+}
+
+// Add a capture click handler to block clicks.
+// Note that we require event capture support for this so if the device
+// doesn't support it, we punt for now and rely solely on mouse events.
+if ( eventCaptureSupported ) {
+	document.addEventListener( "click", function( e ) {
+		var cnt = clickBlockList.length,
+			target = e.target,
+			x, y, ele, i, o, touchID;
+
+		if ( cnt ) {
+			x = e.clientX;
+			y = e.clientY;
+			threshold = $.vmouse.clickDistanceThreshold;
+
+			// The idea here is to run through the clickBlockList to see if
+			// the current click event is in the proximity of one of our
+			// vclick events that had preventDefault() called on it. If we find
+			// one, then we block the click.
+			//
+			// Why do we have to rely on proximity?
+			//
+			// Because the target of the touch event that triggered the vclick
+			// can be different from the target of the click event synthesized
+			// by the browser. The target of a mouse/click event that is synthesized
+			// from a touch event seems to be implementation specific. For example,
+			// some browsers will fire mouse/click events for a link that is near
+			// a touch event, even though the target of the touchstart/touchend event
+			// says the user touched outside the link. Also, it seems that with most
+			// browsers, the target of the mouse/click event is not calculated until the
+			// time it is dispatched, so if you replace an element that you touched
+			// with another element, the target of the mouse/click will be the new
+			// element underneath that point.
+			//
+			// Aside from proximity, we also check to see if the target and any
+			// of its ancestors were the ones that blocked a click. This is necessary
+			// because of the strange mouse/click target calculation done in the
+			// Android 2.1 browser, where if you click on an element, and there is a
+			// mouse/click handler on one of its ancestors, the target will be the
+			// innermost child of the touched element, even if that child is no where
+			// near the point of touch.
+
+			ele = target;
+
+			while ( ele ) {
+				for ( i = 0; i < cnt; i++ ) {
+					o = clickBlockList[ i ];
+					touchID = 0;
+
+					if ( ( ele === target && Math.abs( o.x - x ) < threshold && Math.abs( o.y - y ) < threshold ) ||
+								$.data( ele, touchTargetPropertyName ) === o.touchID ) {
+						// XXX: We may want to consider removing matches from the block list
+						//      instead of waiting for the reset timer to fire.
+						e.preventDefault();
+						e.stopPropagation();
+						return;
+					}
+				}
+				ele = ele.parentNode;
+			}
+		}
+	}, true);
+}
+})( jQuery, window, document );
+
+
+(function( $, window, undefined ) {
+	var $document = $( document ),
+		supportTouch = $.mobile.support.touch,
+		scrollEvent = "touchmove scroll",
+		touchStartEvent = supportTouch ? "touchstart" : "mousedown",
+		touchStopEvent = supportTouch ? "touchend" : "mouseup",
+		touchMoveEvent = supportTouch ? "touchmove" : "mousemove";
+
+	// setup new event shortcuts
+	$.each( ( "touchstart touchmove touchend " +
+		"tap taphold " +
+		"swipe swipeleft swiperight " +
+		"scrollstart scrollstop" ).split( " " ), function( i, name ) {
+
+		$.fn[ name ] = function( fn ) {
+			return fn ? this.bind( name, fn ) : this.trigger( name );
+		};
+
+		// jQuery < 1.8
+		if ( $.attrFn ) {
+			$.attrFn[ name ] = true;
+		}
+	});
+
+	function triggerCustomEvent( obj, eventType, event, bubble ) {
+		var originalType = event.type;
+		event.type = eventType;
+		if ( bubble ) {
+			$.event.trigger( event, undefined, obj );
+		} else {
+			$.event.dispatch.call( obj, event );
+		}
+		event.type = originalType;
+	}
+
+	// also handles scrollstop
+	$.event.special.scrollstart = {
+
+		enabled: true,
+		setup: function() {
+
+			var thisObject = this,
+				$this = $( thisObject ),
+				scrolling,
+				timer;
+
+			function trigger( event, state ) {
+				scrolling = state;
+				triggerCustomEvent( thisObject, scrolling ? "scrollstart" : "scrollstop", event );
+			}
+
+			// iPhone triggers scroll after a small delay; use touchmove instead
+			$this.bind( scrollEvent, function( event ) {
+
+				if ( !$.event.special.scrollstart.enabled ) {
+					return;
+				}
+
+				if ( !scrolling ) {
+					trigger( event, true );
+				}
+
+				clearTimeout( timer );
+				timer = setTimeout( function() {
+					trigger( event, false );
+				}, 50 );
+			});
+		},
+		teardown: function() {
+			$( this ).unbind( scrollEvent );
+		}
+	};
+
+	// also handles taphold
+	$.event.special.tap = {
+		tapholdThreshold: 750,
+		emitTapOnTaphold: true,
+		setup: function() {
+			var thisObject = this,
+				$this = $( thisObject ),
+				isTaphold = false;
+
+			$this.bind( "vmousedown", function( event ) {
+				isTaphold = false;
+				if ( event.which && event.which !== 1 ) {
+					return false;
+				}
+
+				var origTarget = event.target,
+					timer;
+
+				function clearTapTimer() {
+					clearTimeout( timer );
+				}
+
+				function clearTapHandlers() {
+					clearTapTimer();
+
+					$this.unbind( "vclick", clickHandler )
+						.unbind( "vmouseup", clearTapTimer );
+					$document.unbind( "vmousecancel", clearTapHandlers );
+				}
+
+				function clickHandler( event ) {
+					clearTapHandlers();
+
+					// ONLY trigger a 'tap' event if the start target is
+					// the same as the stop target.
+					if ( !isTaphold && origTarget === event.target ) {
+						triggerCustomEvent( thisObject, "tap", event );
+					} else if ( isTaphold ) {
+						event.stopPropagation();
+					}
+				}
+
+				$this.bind( "vmouseup", clearTapTimer )
+					.bind( "vclick", clickHandler );
+				$document.bind( "vmousecancel", clearTapHandlers );
+
+				timer = setTimeout( function() {
+					if ( !$.event.special.tap.emitTapOnTaphold ) {
+						isTaphold = true;
+					}
+					triggerCustomEvent( thisObject, "taphold", $.Event( "taphold", { target: origTarget } ) );
+				}, $.event.special.tap.tapholdThreshold );
+			});
+		},
+		teardown: function() {
+			$( this ).unbind( "vmousedown" ).unbind( "vclick" ).unbind( "vmouseup" );
+			$document.unbind( "vmousecancel" );
+		}
+	};
+
+	// Also handles swipeleft, swiperight
+	$.event.special.swipe = {
+
+		// More than this horizontal displacement, and we will suppress scrolling.
+		scrollSupressionThreshold: 30,
+
+		// More time than this, and it isn't a swipe.
+		durationThreshold: 1000,
+
+		// Swipe horizontal displacement must be more than this.
+		horizontalDistanceThreshold: 30,
+
+		// Swipe vertical displacement must be less than this.
+		verticalDistanceThreshold: 30,
+
+		getLocation: function ( event ) {
+			var winPageX = window.pageXOffset,
+				winPageY = window.pageYOffset,
+				x = event.clientX,
+				y = event.clientY;
+
+			if ( event.pageY === 0 && Math.floor( y ) > Math.floor( event.pageY ) ||
+				event.pageX === 0 && Math.floor( x ) > Math.floor( event.pageX ) ) {
+
+				// iOS4 clientX/clientY have the value that should have been
+				// in pageX/pageY. While pageX/page/ have the value 0
+				x = x - winPageX;
+				y = y - winPageY;
+			} else if ( y < ( event.pageY - winPageY) || x < ( event.pageX - winPageX ) ) {
+
+				// Some Android browsers have totally bogus values for clientX/Y
+				// when scrolling/zooming a page. Detectable since clientX/clientY
+				// should never be smaller than pageX/pageY minus page scroll
+				x = event.pageX - winPageX;
+				y = event.pageY - winPageY;
+			}
+
+			return {
+				x: x,
+				y: y
+			};
+		},
+
+		start: function( event ) {
+			var data = event.originalEvent.touches ?
+					event.originalEvent.touches[ 0 ] : event,
+				location = $.event.special.swipe.getLocation( data );
+			return {
+						time: ( new Date() ).getTime(),
+						coords: [ location.x, location.y ],
+						origin: $( event.target )
+					};
+		},
+
+		stop: function( event ) {
+			var data = event.originalEvent.touches ?
+					event.originalEvent.touches[ 0 ] : event,
+				location = $.event.special.swipe.getLocation( data );
+			return {
+						time: ( new Date() ).getTime(),
+						coords: [ location.x, location.y ]
+					};
+		},
+
+		handleSwipe: function( start, stop, thisObject, origTarget ) {
+			if ( stop.time - start.time < $.event.special.swipe.durationThreshold &&
+				Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.horizontalDistanceThreshold &&
+				Math.abs( start.coords[ 1 ] - stop.coords[ 1 ] ) < $.event.special.swipe.verticalDistanceThreshold ) {
+				var direction = start.coords[0] > stop.coords[ 0 ] ? "swipeleft" : "swiperight";
+
+				triggerCustomEvent( thisObject, "swipe", $.Event( "swipe", { target: origTarget, swipestart: start, swipestop: stop }), true );
+				triggerCustomEvent( thisObject, direction,$.Event( direction, { target: origTarget, swipestart: start, swipestop: stop } ), true );
+				return true;
+			}
+			return false;
+
+		},
+
+		// This serves as a flag to ensure that at most one swipe event event is
+		// in work at any given time
+		eventInProgress: false,
+
+		setup: function() {
+			var events,
+				thisObject = this,
+				$this = $( thisObject ),
+				context = {};
+
+			// Retrieve the events data for this element and add the swipe context
+			events = $.data( this, "mobile-events" );
+			if ( !events ) {
+				events = { length: 0 };
+				$.data( this, "mobile-events", events );
+			}
+			events.length++;
+			events.swipe = context;
+
+			context.start = function( event ) {
+
+				// Bail if we're already working on a swipe event
+				if ( $.event.special.swipe.eventInProgress ) {
+					return;
+				}
+				$.event.special.swipe.eventInProgress = true;
+
+				var stop,
+					start = $.event.special.swipe.start( event ),
+					origTarget = event.target,
+					emitted = false;
+
+				context.move = function( event ) {
+					if ( !start ) {
+						return;
+					}
+
+					stop = $.event.special.swipe.stop( event );
+					if ( !emitted ) {
+						emitted = $.event.special.swipe.handleSwipe( start, stop, thisObject, origTarget );
+						if ( emitted ) {
+
+							// Reset the context to make way for the next swipe event
+							$.event.special.swipe.eventInProgress = false;
+						}
+					}
+					// prevent scrolling
+					if ( Math.abs( start.coords[ 0 ] - stop.coords[ 0 ] ) > $.event.special.swipe.scrollSupressionThreshold ) {
+						event.preventDefault();
+					}
+				};
+
+				context.stop = function() {
+						emitted = true;
+
+						// Reset the context to make way for the next swipe event
+						$.event.special.swipe.eventInProgress = false;
+						$document.off( touchMoveEvent, context.move );
+						context.move = null;
+				};
+
+				$document.on( touchMoveEvent, context.move )
+					.one( touchStopEvent, context.stop );
+			};
+			$this.on( touchStartEvent, context.start );
+		},
+
+		teardown: function() {
+			var events, context;
+
+			events = $.data( this, "mobile-events" );
+			if ( events ) {
+				context = events.swipe;
+				delete events.swipe;
+				events.length--;
+				if ( events.length === 0 ) {
+					$.removeData( this, "mobile-events" );
+				}
+			}
+
+			if ( context ) {
+				if ( context.start ) {
+					$( this ).off( touchStartEvent, context.start );
+				}
+				if ( context.move ) {
+					$document.off( touchMoveEvent, context.move );
+				}
+				if ( context.stop ) {
+					$document.off( touchStopEvent, context.stop );
+				}
+			}
+		}
+	};
+	$.each({
+		scrollstop: "scrollstart",
+		taphold: "tap",
+		swipeleft: "swipe",
+		swiperight: "swipe"
+	}, function( event, sourceEvent ) {
+
+		$.event.special[ event ] = {
+			setup: function() {
+				$( this ).bind( sourceEvent, $.noop );
+			},
+			teardown: function() {
+				$( this ).unbind( sourceEvent );
+			}
+		};
+	});
+
+})( jQuery, this );
+
+
+	// throttled resize event
+	(function( $ ) {
+		$.event.special.throttledresize = {
+			setup: function() {
+				$( this ).bind( "resize", handler );
+			},
+			teardown: function() {
+				$( this ).unbind( "resize", handler );
+			}
+		};
+
+		var throttle = 250,
+			handler = function() {
+				curr = ( new Date() ).getTime();
+				diff = curr - lastCall;
+
+				if ( diff >= throttle ) {
+
+					lastCall = curr;
+					$( this ).trigger( "throttledresize" );
+
+				} else {
+
+					if ( heldCall ) {
+						clearTimeout( heldCall );
+					}
+
+					// Promise a held call will still execute
+					heldCall = setTimeout( handler, throttle - diff );
+				}
+			},
+			lastCall = 0,
+			heldCall,
+			curr,
+			diff;
+	})( jQuery );
+
+
+(function( $, window ) {
+	var win = $( window ),
+		event_name = "orientationchange",
+		get_orientation,
+		last_orientation,
+		initial_orientation_is_landscape,
+		initial_orientation_is_default,
+		portrait_map = { "0": true, "180": true },
+		ww, wh, landscape_threshold;
+
+	// It seems that some device/browser vendors use window.orientation values 0 and 180 to
+	// denote the "default" orientation. For iOS devices, and most other smart-phones tested,
+	// the default orientation is always "portrait", but in some Android and RIM based tablets,
+	// the default orientation is "landscape". The following code attempts to use the window
+	// dimensions to figure out what the current orientation is, and then makes adjustments
+	// to the to the portrait_map if necessary, so that we can properly decode the
+	// window.orientation value whenever get_orientation() is called.
+	//
+	// Note that we used to use a media query to figure out what the orientation the browser
+	// thinks it is in:
+	//
+	//     initial_orientation_is_landscape = $.mobile.media("all and (orientation: landscape)");
+	//
+	// but there was an iPhone/iPod Touch bug beginning with iOS 4.2, up through iOS 5.1,
+	// where the browser *ALWAYS* applied the landscape media query. This bug does not
+	// happen on iPad.
+
+	if ( $.support.orientation ) {
+
+		// Check the window width and height to figure out what the current orientation
+		// of the device is at this moment. Note that we've initialized the portrait map
+		// values to 0 and 180, *AND* we purposely check for landscape so that if we guess
+		// wrong, , we default to the assumption that portrait is the default orientation.
+		// We use a threshold check below because on some platforms like iOS, the iPhone
+		// form-factor can report a larger width than height if the user turns on the
+		// developer console. The actual threshold value is somewhat arbitrary, we just
+		// need to make sure it is large enough to exclude the developer console case.
+
+		ww = window.innerWidth || win.width();
+		wh = window.innerHeight || win.height();
+		landscape_threshold = 50;
+
+		initial_orientation_is_landscape = ww > wh && ( ww - wh ) > landscape_threshold;
+
+		// Now check to see if the current window.orientation is 0 or 180.
+		initial_orientation_is_default = portrait_map[ window.orientation ];
+
+		// If the initial orientation is landscape, but window.orientation reports 0 or 180, *OR*
+		// if the initial orientation is portrait, but window.orientation reports 90 or -90, we
+		// need to flip our portrait_map values because landscape is the default orientation for
+		// this device/browser.
+		if ( ( initial_orientation_is_landscape && initial_orientation_is_default ) || ( !initial_orientation_is_landscape && !initial_orientation_is_default ) ) {
+			portrait_map = { "-90": true, "90": true };
+		}
+	}
+
+	$.event.special.orientationchange = $.extend( {}, $.event.special.orientationchange, {
+		setup: function() {
+			// If the event is supported natively, return false so that jQuery
+			// will bind to the event using DOM methods.
+			if ( $.support.orientation && !$.event.special.orientationchange.disabled ) {
+				return false;
+			}
+
+			// Get the current orientation to avoid initial double-triggering.
+			last_orientation = get_orientation();
+
+			// Because the orientationchange event doesn't exist, simulate the
+			// event by testing window dimensions on resize.
+			win.bind( "throttledresize", handler );
+		},
+		teardown: function() {
+			// If the event is not supported natively, return false so that
+			// jQuery will unbind the event using DOM methods.
+			if ( $.support.orientation && !$.event.special.orientationchange.disabled ) {
+				return false;
+			}
+
+			// Because the orientationchange event doesn't exist, unbind the
+			// resize event handler.
+			win.unbind( "throttledresize", handler );
+		},
+		add: function( handleObj ) {
+			// Save a reference to the bound event handler.
+			var old_handler = handleObj.handler;
+
+			handleObj.handler = function( event ) {
+				// Modify event object, adding the .orientation property.
+				event.orientation = get_orientation();
+
+				// Call the originally-bound event handler and return its result.
+				return old_handler.apply( this, arguments );
+			};
+		}
+	});
+
+	// If the event is not supported natively, this handler will be bound to
+	// the window resize event to simulate the orientationchange event.
+	function handler() {
+		// Get the current orientation.
+		var orientation = get_orientation();
+
+		if ( orientation !== last_orientation ) {
+			// The orientation has changed, so trigger the orientationchange event.
+			last_orientation = orientation;
+			win.trigger( event_name );
+		}
+	}
+
+	// Get the current page orientation. This method is exposed publicly, should it
+	// be needed, as jQuery.event.special.orientationchange.orientation()
+	$.event.special.orientationchange.orientation = get_orientation = function() {
+		var isPortrait = true, elem = document.documentElement;
+
+		// prefer window orientation to the calculation based on screensize as
+		// the actual screen resize takes place before or after the orientation change event
+		// has been fired depending on implementation (eg android 2.3 is before, iphone after).
+		// More testing is required to determine if a more reliable method of determining the new screensize
+		// is possible when orientationchange is fired. (eg, use media queries + element + opacity)
+		if ( $.support.orientation ) {
+			// if the window orientation registers as 0 or 180 degrees report
+			// portrait, otherwise landscape
+			isPortrait = portrait_map[ window.orientation ];
+		} else {
+			isPortrait = elem && elem.clientWidth / elem.clientHeight < 1.1;
+		}
+
+		return isPortrait ? "portrait" : "landscape";
+	};
+
+	$.fn[ event_name ] = function( fn ) {
+		return fn ? this.bind( event_name, fn ) : this.trigger( event_name );
+	};
+
+	// jQuery < 1.8
+	if ( $.attrFn ) {
+		$.attrFn[ event_name ] = true;
+	}
+
+}( jQuery, this ));
+
+
+
+
+(function( $, undefined ) {
+
+	// existing base tag?
+	var baseElement = $( "head" ).children( "base" ),
+
+	// base element management, defined depending on dynamic base tag support
+	// TODO move to external widget
+	base = {
+
+		// define base element, for use in routing asset urls that are referenced
+		// in Ajax-requested markup
+		element: ( baseElement.length ? baseElement :
+			$( "<base>", { href: $.mobile.path.documentBase.hrefNoHash } ).prependTo( $( "head" ) ) ),
+
+		linkSelector: "[src], link[href], a[rel='external'], :jqmData(ajax='false'), a[target]",
+
+		// set the generated BASE element's href to a new page's base path
+		set: function( href ) {
+
+			// we should do nothing if the user wants to manage their url base
+			// manually
+			if ( !$.mobile.dynamicBaseEnabled ) {
+				return;
+			}
+
+			// we should use the base tag if we can manipulate it dynamically
+			if ( $.support.dynamicBaseTag ) {
+				base.element.attr( "href",
+					$.mobile.path.makeUrlAbsolute( href, $.mobile.path.documentBase ) );
+			}
+		},
+
+		rewrite: function( href, page ) {
+			var newPath = $.mobile.path.get( href );
+
+			page.find( base.linkSelector ).each(function( i, link ) {
+				var thisAttr = $( link ).is( "[href]" ) ? "href" :
+					$( link ).is( "[src]" ) ? "src" : "action",
+				thisUrl = $( link ).attr( thisAttr );
+
+				// XXX_jblas: We need to fix this so that it removes the document
+				//            base URL, and then prepends with the new page URL.
+				// if full path exists and is same, chop it - helps IE out
+				thisUrl = thisUrl.replace( location.protocol + "//" +
+					location.host + location.pathname, "" );
+
+				if ( !/^(\w+:|#|\/)/.test( thisUrl ) ) {
+					$( link ).attr( thisAttr, newPath + thisUrl );
+				}
+			});
+		},
+
+		// set the generated BASE element's href to a new page's base path
+		reset: function(/* href */) {
+			base.element.attr( "href", $.mobile.path.documentBase.hrefNoSearch );
+		}
+	};
+
+	$.mobile.base = base;
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+$.mobile.widgets = {};
+
+var originalWidget = $.widget,
+
+	// Record the original, non-mobileinit-modified version of $.mobile.keepNative
+	// so we can later determine whether someone has modified $.mobile.keepNative
+	keepNativeFactoryDefault = $.mobile.keepNative;
+
+$.widget = (function( orig ) {
+	return function() {
+		var constructor = orig.apply( this, arguments ),
+			name = constructor.prototype.widgetName;
+
+		constructor.initSelector = ( ( constructor.prototype.initSelector !== undefined ) ?
+			constructor.prototype.initSelector : ":jqmData(role='" + name + "')" );
+
+		$.mobile.widgets[ name ] = constructor;
+
+		return constructor;
+	};
+})( $.widget );
+
+// Make sure $.widget still has bridge and extend methods
+$.extend( $.widget, originalWidget );
+
+// For backcompat remove in 1.5
+$.mobile.document.on( "create", function( event ) {
+	$( event.target ).enhanceWithin();
+});
+
+$.widget( "mobile.page", {
+	options: {
+		theme: "a",
+		domCache: false,
+
+		// Deprecated in 1.4 remove in 1.5
+		keepNativeDefault: $.mobile.keepNative,
+
+		// Deprecated in 1.4 remove in 1.5
+		contentTheme: null,
+		enhanced: false
+	},
+
+	// DEPRECATED for > 1.4
+	// TODO remove at 1.5
+	_createWidget: function() {
+		$.Widget.prototype._createWidget.apply( this, arguments );
+		this._trigger( "init" );
+	},
+
+	_create: function() {
+		// If false is returned by the callbacks do not create the page
+		if ( this._trigger( "beforecreate" ) === false ) {
+			return false;
+		}
+
+		if ( !this.options.enhanced ) {
+			this._enhance();
+		}
+
+		this._on( this.element, {
+			pagebeforehide: "removeContainerBackground",
+			pagebeforeshow: "_handlePageBeforeShow"
+		});
+
+		this.element.enhanceWithin();
+		// Dialog widget is deprecated in 1.4 remove this in 1.5
+		if ( $.mobile.getAttribute( this.element[0], "role" ) === "dialog" && $.mobile.dialog ) {
+			this.element.dialog();
+		}
+	},
+
+	_enhance: function () {
+		var attrPrefix = "data-" + $.mobile.ns,
+			self = this;
+
+		if ( this.options.role ) {
+			this.element.attr( "data-" + $.mobile.ns + "role", this.options.role );
+		}
+
+		this.element
+			.attr( "tabindex", "0" )
+			.addClass( "ui-page ui-page-theme-" + this.options.theme );
+
+		// Manipulation of content os Deprecated as of 1.4 remove in 1.5
+		this.element.find( "[" + attrPrefix + "role='content']" ).each( function() {
+			var $this = $( this ),
+				theme = this.getAttribute( attrPrefix + "theme" ) || undefined;
+				self.options.contentTheme = theme || self.options.contentTheme || ( self.options.dialog && self.options.theme ) || ( self.element.jqmData("role") === "dialog" &&  self.options.theme );
+				$this.addClass( "ui-content" );
+				if ( self.options.contentTheme ) {
+					$this.addClass( "ui-body-" + ( self.options.contentTheme ) );
+				}
+				// Add ARIA role
+				$this.attr( "role", "main" ).addClass( "ui-content" );
+		});
+	},
+
+	bindRemove: function( callback ) {
+		var page = this.element;
+
+		// when dom caching is not enabled or the page is embedded bind to remove the page on hide
+		if ( !page.data( "mobile-page" ).options.domCache &&
+			page.is( ":jqmData(external-page='true')" ) ) {
+
+			// TODO use _on - that is, sort out why it doesn't work in this case
+			page.bind( "pagehide.remove", callback || function( e, data ) {
+
+				//check if this is a same page transition and if so don't remove the page
+				if( !data.samePage ){
+					var $this = $( this ),
+						prEvent = new $.Event( "pageremove" );
+
+					$this.trigger( prEvent );
+
+					if ( !prEvent.isDefaultPrevented() ) {
+						$this.removeWithDependents();
+					}
+				}
+			});
+		}
+	},
+
+	_setOptions: function( o ) {
+		if ( o.theme !== undefined ) {
+			this.element.removeClass( "ui-page-theme-" + this.options.theme ).addClass( "ui-page-theme-" + o.theme );
+		}
+
+		if ( o.contentTheme !== undefined ) {
+			this.element.find( "[data-" + $.mobile.ns + "='content']" ).removeClass( "ui-body-" + this.options.contentTheme )
+				.addClass( "ui-body-" + o.contentTheme );
+		}
+	},
+
+	_handlePageBeforeShow: function(/* e */) {
+		this.setContainerBackground();
+	},
+	// Deprecated in 1.4 remove in 1.5
+	removeContainerBackground: function() {
+		this.element.closest( ":mobile-pagecontainer" ).pagecontainer({ "theme": "none" });
+	},
+	// Deprecated in 1.4 remove in 1.5
+	// set the page container background to the page theme
+	setContainerBackground: function( theme ) {
+		this.element.parent().pagecontainer( { "theme": theme || this.options.theme } );
+	},
+	// Deprecated in 1.4 remove in 1.5
+	keepNativeSelector: function() {
+		var options = this.options,
+			keepNative = $.trim( options.keepNative || "" ),
+			globalValue = $.trim( $.mobile.keepNative ),
+			optionValue = $.trim( options.keepNativeDefault ),
+
+			// Check if $.mobile.keepNative has changed from the factory default
+			newDefault = ( keepNativeFactoryDefault === globalValue ?
+				"" : globalValue ),
+
+			// If $.mobile.keepNative has not changed, use options.keepNativeDefault
+			oldDefault = ( newDefault === "" ? optionValue : "" );
+
+		// Concatenate keepNative selectors from all sources where the value has
+		// changed or, if nothing has changed, return the default
+		return ( ( keepNative ? [ keepNative ] : [] )
+			.concat( newDefault ? [ newDefault ] : [] )
+			.concat( oldDefault ? [ oldDefault ] : [] )
+			.join( ", " ) );
+	}
+});
+})( jQuery );
+
+(function( $, undefined ) {
+
+	$.widget( "mobile.pagecontainer", {
+		options: {
+			theme: "a"
+		},
+
+		initSelector: false,
+
+		_create: function() {
+			this.setLastScrollEnabled = true;
+
+			this._on( this.window, {
+				// disable an scroll setting when a hashchange has been fired,
+				// this only works because the recording of the scroll position
+				// is delayed for 100ms after the browser might have changed the
+				// position because of the hashchange
+				navigate: "_disableRecordScroll",
+
+				// bind to scrollstop for the first page, "pagechange" won't be
+				// fired in that case
+				scrollstop: "_delayedRecordScroll"
+			});
+
+			// TODO consider moving the navigation handler OUT of widget into
+			//      some other object as glue between the navigate event and the
+			//      content widget load and change methods
+			this._on( this.window, { navigate: "_filterNavigateEvents" });
+
+			// TODO move from page* events to content* events
+			this._on({ pagechange: "_afterContentChange" });
+
+			// handle initial hashchange from chrome :(
+			this.window.one( "navigate", $.proxy(function() {
+				this.setLastScrollEnabled = true;
+			}, this));
+		},
+
+		_setOptions: function( options ) {
+			if ( options.theme !== undefined && options.theme !== "none" ) {
+				this.element.removeClass( "ui-overlay-" + this.options.theme )
+					.addClass( "ui-overlay-" + options.theme );
+			} else if ( options.theme !== undefined ) {
+				this.element.removeClass( "ui-overlay-" + this.options.theme );
+			}
+
+			this._super( options );
+		},
+
+		_disableRecordScroll: function() {
+			this.setLastScrollEnabled = false;
+		},
+
+		_enableRecordScroll: function() {
+			this.setLastScrollEnabled = true;
+		},
+
+		// TODO consider the name here, since it's purpose specific
+		_afterContentChange: function() {
+			// once the page has changed, re-enable the scroll recording
+			this.setLastScrollEnabled = true;
+
+			// remove any binding that previously existed on the get scroll
+			// which may or may not be different than the scroll element
+			// determined for this page previously
+			this._off( this.window, "scrollstop" );
+
+			// determine and bind to the current scoll element which may be the
+			// window or in the case of touch overflow the element touch overflow
+			this._on( this.window, { scrollstop: "_delayedRecordScroll" });
+		},
+
+		_recordScroll: function() {
+			// this barrier prevents setting the scroll value based on
+			// the browser scrolling the window based on a hashchange
+			if ( !this.setLastScrollEnabled ) {
+				return;
+			}
+
+			var active = this._getActiveHistory(),
+				currentScroll, minScroll, defaultScroll;
+
+			if ( active ) {
+				currentScroll = this._getScroll();
+				minScroll = this._getMinScroll();
+				defaultScroll = this._getDefaultScroll();
+
+				// Set active page's lastScroll prop. If the location we're
+				// scrolling to is less than minScrollBack, let it go.
+				active.lastScroll = currentScroll < minScroll ? defaultScroll : currentScroll;
+			}
+		},
+
+		_delayedRecordScroll: function() {
+			setTimeout( $.proxy(this, "_recordScroll"), 100 );
+		},
+
+		_getScroll: function() {
+			return this.window.scrollTop();
+		},
+
+		_getMinScroll: function() {
+			return $.mobile.minScrollBack;
+		},
+
+		_getDefaultScroll: function() {
+			return $.mobile.defaultHomeScroll;
+		},
+
+		_filterNavigateEvents: function( e, data ) {
+			var url;
+
+			if ( e.originalEvent && e.originalEvent.isDefaultPrevented() ) {
+				return;
+			}
+
+			url = e.originalEvent.type.indexOf( "hashchange" ) > -1 ? data.state.hash : data.state.url;
+
+			if ( !url ) {
+				url = this._getHash();
+			}
+
+			if ( !url || url === "#" || url.indexOf( "#" + $.mobile.path.uiStateKey ) === 0 ) {
+				url = location.href;
+			}
+
+			this._handleNavigate( url, data.state );
+		},
+
+		_getHash: function() {
+			return $.mobile.path.parseLocation().hash;
+		},
+
+		// TODO active page should be managed by the container (ie, it should be a property)
+		getActivePage: function() {
+			return this.activePage;
+		},
+
+		// TODO the first page should be a property set during _create using the logic
+		//      that currently resides in init
+		_getInitialContent: function() {
+			return $.mobile.firstPage;
+		},
+
+		// TODO each content container should have a history object
+		_getHistory: function() {
+			return $.mobile.navigate.history;
+		},
+
+		// TODO use _getHistory
+		_getActiveHistory: function() {
+			return $.mobile.navigate.history.getActive();
+		},
+
+		// TODO the document base should be determined at creation
+		_getDocumentBase: function() {
+			return $.mobile.path.documentBase;
+		},
+
+		back: function() {
+			this.go( -1 );
+		},
+
+		forward: function() {
+			this.go( 1 );
+		},
+
+		go: function( steps ) {
+
+			//if hashlistening is enabled use native history method
+			if ( $.mobile.hashListeningEnabled ) {
+				window.history.go( steps );
+			} else {
+
+				//we are not listening to the hash so handle history internally
+				var activeIndex = $.mobile.navigate.history.activeIndex,
+					index = activeIndex + parseInt( steps, 10 ),
+					url = $.mobile.navigate.history.stack[ index ].url,
+					direction = ( steps >= 1 )? "forward" : "back";
+
+				//update the history object
+				$.mobile.navigate.history.activeIndex = index;
+				$.mobile.navigate.history.previousIndex = activeIndex;
+
+				//change to the new page
+				this.change( url, { direction: direction, changeHash: false, fromHashChange: true } );
+			}
+		},
+
+		// TODO rename _handleDestination
+		_handleDestination: function( to ) {
+			var history;
+
+			// clean the hash for comparison if it's a url
+			if ( $.type(to) === "string" ) {
+				to = $.mobile.path.stripHash( to );
+			}
+
+			if ( to ) {
+				history = this._getHistory();
+
+				// At this point, 'to' can be one of 3 things, a cached page
+				// element from a history stack entry, an id, or site-relative /
+				// absolute URL. If 'to' is an id, we need to resolve it against
+				// the documentBase, not the location.href, since the hashchange
+				// could've been the result of a forward/backward navigation
+				// that crosses from an external page/dialog to an internal
+				// page/dialog.
+				//
+				// TODO move check to history object or path object?
+				to = !$.mobile.path.isPath( to ) ? ( $.mobile.path.makeUrlAbsolute( "#" + to, this._getDocumentBase() ) ) : to;
+
+				// If we're about to go to an initial URL that contains a
+				// reference to a non-existent internal page, go to the first
+				// page instead. We know that the initial hash refers to a
+				// non-existent page, because the initial hash did not end
+				// up in the initial history entry
+				// TODO move check to history object?
+				if ( to === $.mobile.path.makeUrlAbsolute( "#" + history.initialDst, this._getDocumentBase() ) &&
+					history.stack.length &&
+					history.stack[0].url !== history.initialDst.replace( $.mobile.dialogHashKey, "" ) ) {
+					to = this._getInitialContent();
+				}
+			}
+			return to || this._getInitialContent();
+		},
+
+		_handleDialog: function( changePageOptions, data ) {
+			var to, active, activeContent = this.getActivePage();
+
+			// If current active page is not a dialog skip the dialog and continue
+			// in the same direction
+			if ( activeContent && !activeContent.hasClass( "ui-dialog" ) ) {
+				// determine if we're heading forward or backward and continue
+				// accordingly past the current dialog
+				if ( data.direction === "back" ) {
+					this.back();
+				} else {
+					this.forward();
+				}
+
+				// prevent changePage call
+				return false;
+			} else {
+				// if the current active page is a dialog and we're navigating
+				// to a dialog use the dialog objected saved in the stack
+				to = data.pageUrl;
+				active = this._getActiveHistory();
+
+				// make sure to set the role, transition and reversal
+				// as most of this is lost by the domCache cleaning
+				$.extend( changePageOptions, {
+					role: active.role,
+					transition: active.transition,
+					reverse: data.direction === "back"
+				});
+			}
+
+			return to;
+		},
+
+		_handleNavigate: function( url, data ) {
+			//find first page via hash
+			// TODO stripping the hash twice with handleUrl
+			var to = $.mobile.path.stripHash( url ), history = this._getHistory(),
+
+				// transition is false if it's the first page, undefined
+				// otherwise (and may be overridden by default)
+				transition = history.stack.length === 0 ? "none" : undefined,
+
+				// default options for the changPage calls made after examining
+				// the current state of the page and the hash, NOTE that the
+				// transition is derived from the previous history entry
+				changePageOptions = {
+					changeHash: false,
+					fromHashChange: true,
+					reverse: data.direction === "back"
+				};
+
+			$.extend( changePageOptions, data, {
+				transition: ( history.getLast() || {} ).transition || transition
+			});
+
+			// TODO move to _handleDestination ?
+			// If this isn't the first page, if the current url is a dialog hash
+			// key, and the initial destination isn't equal to the current target
+			// page, use the special dialog handling
+			if ( history.activeIndex > 0 &&
+				to.indexOf( $.mobile.dialogHashKey ) > -1 &&
+				history.initialDst !== to ) {
+
+				to = this._handleDialog( changePageOptions, data );
+
+				if ( to === false ) {
+					return;
+				}
+			}
+
+			this._changeContent( this._handleDestination( to ), changePageOptions );
+		},
+
+		_changeContent: function( to, opts ) {
+			$.mobile.changePage( to, opts );
+		},
+
+		_getBase: function() {
+			return $.mobile.base;
+		},
+
+		_getNs: function() {
+			return $.mobile.ns;
+		},
+
+		_enhance: function( content, role ) {
+			// TODO consider supporting a custom callback, and passing in
+			// the settings which includes the role
+			return content.page({ role: role });
+		},
+
+		_include: function( page, settings ) {
+			// append to page and enhance
+			page.appendTo( this.element );
+
+			// use the page widget to enhance
+			this._enhance( page, settings.role );
+
+			// remove page on hide
+			page.page( "bindRemove" );
+		},
+
+		_find: function( absUrl ) {
+			// TODO consider supporting a custom callback
+			var fileUrl = this._createFileUrl( absUrl ),
+				dataUrl = this._createDataUrl( absUrl ),
+				page, initialContent = this._getInitialContent();
+
+			// Check to see if the page already exists in the DOM.
+			// NOTE do _not_ use the :jqmData pseudo selector because parenthesis
+			//      are a valid url char and it breaks on the first occurence
+			page = this.element
+				.children( "[data-" + this._getNs() +"url='" + dataUrl + "']" );
+
+			// If we failed to find the page, check to see if the url is a
+			// reference to an embedded page. If so, it may have been dynamically
+			// injected by a developer, in which case it would be lacking a
+			// data-url attribute and in need of enhancement.
+			if ( page.length === 0 && dataUrl && !$.mobile.path.isPath( dataUrl ) ) {
+				page = this.element.children( $.mobile.path.hashToSelector("#" + dataUrl) )
+					.attr( "data-" + this._getNs() + "url", dataUrl )
+					.jqmData( "url", dataUrl );
+			}
+
+			// If we failed to find a page in the DOM, check the URL to see if it
+			// refers to the first page in the application. Also check to make sure
+			// our cached-first-page is actually in the DOM. Some user deployed
+			// apps are pruning the first page from the DOM for various reasons.
+			// We check for this case here because we don't want a first-page with
+			// an id falling through to the non-existent embedded page error case.
+			if ( page.length === 0 &&
+				$.mobile.path.isFirstPageUrl( fileUrl ) &&
+				initialContent &&
+				initialContent.parent().length ) {
+				page = $( initialContent );
+			}
+
+			return page;
+		},
+
+		_getLoader: function() {
+			return $.mobile.loading();
+		},
+
+		_showLoading: function( delay, theme, msg, textonly ) {
+			// This configurable timeout allows cached pages a brief
+			// delay to load without showing a message
+			if ( this._loadMsg ) {
+				return;
+			}
+
+			this._loadMsg = setTimeout($.proxy(function() {
+				this._getLoader().loader( "show", theme, msg, textonly );
+				this._loadMsg = 0;
+			}, this), delay );
+		},
+
+		_hideLoading: function() {
+			// Stop message show timer
+			clearTimeout( this._loadMsg );
+			this._loadMsg = 0;
+
+			// Hide loading message
+			this._getLoader().loader( "hide" );
+		},
+
+		_showError: function() {
+			// make sure to remove the current loading message
+			this._hideLoading();
+
+			// show the error message
+			this._showLoading( 0, $.mobile.pageLoadErrorMessageTheme, $.mobile.pageLoadErrorMessage, true );
+
+			// hide the error message after a delay
+			// TODO configuration
+			setTimeout( $.proxy(this, "_hideLoading"), 1500 );
+		},
+
+		_parse: function( html, fileUrl ) {
+			// TODO consider allowing customization of this method. It's very JQM specific
+			var page, all = $( "<div></div>" );
+
+			//workaround to allow scripts to execute when included in page divs
+			all.get( 0 ).innerHTML = html;
+
+			page = all.find( ":jqmData(role='page'), :jqmData(role='dialog')" ).first();
+
+			//if page elem couldn't be found, create one and insert the body element's contents
+			if ( !page.length ) {
+				page = $( "<div data-" + this._getNs() + "role='page'>" +
+					( html.split( /<\/?body[^>]*>/gmi )[1] || "" ) +
+					"</div>" );
+			}
+
+			// TODO tagging a page with external to make sure that embedded pages aren't
+			// removed by the various page handling code is bad. Having page handling code
+			// in many places is bad. Solutions post 1.0
+			page.attr( "data-" + this._getNs() + "url", $.mobile.path.convertUrlToDataUrl(fileUrl) )
+				.attr( "data-" + this._getNs() + "external-page", true );
+
+			return page;
+		},
+
+		_setLoadedTitle: function( page, html ) {
+			//page title regexp
+			var newPageTitle = html.match( /<title[^>]*>([^<]*)/ ) && RegExp.$1;
+
+			if ( newPageTitle && !page.jqmData("title") ) {
+				newPageTitle = $( "<div>" + newPageTitle + "</div>" ).text();
+				page.jqmData( "title", newPageTitle );
+			}
+		},
+
+		_isRewritableBaseTag: function() {
+			return $.mobile.dynamicBaseEnabled && !$.support.dynamicBaseTag;
+		},
+
+		_createDataUrl: function( absoluteUrl ) {
+			return $.mobile.path.convertUrlToDataUrl( absoluteUrl );
+		},
+
+		_createFileUrl: function( absoluteUrl ) {
+			return $.mobile.path.getFilePath( absoluteUrl );
+		},
+
+		_triggerWithDeprecated: function( name, data, page ) {
+			var deprecatedEvent = $.Event( "page" + name ),
+				newEvent = $.Event( this.widgetName + name );
+
+			// DEPRECATED
+			// trigger the old deprecated event on the page if it's provided
+			( page || this.element ).trigger( deprecatedEvent, data );
+
+			// use the widget trigger method for the new content* event
+			this.element.trigger( newEvent, data );
+
+			return {
+				deprecatedEvent: deprecatedEvent,
+				event: newEvent
+			};
+		},
+
+		// TODO it would be nice to split this up more but everything appears to be "one off"
+		//      or require ordering such that other bits are sprinkled in between parts that
+		//      could be abstracted out as a group
+		_loadSuccess: function( absUrl, triggerData, settings, deferred ) {
+			var fileUrl = this._createFileUrl( absUrl ),
+				dataUrl = this._createDataUrl( absUrl );
+
+			return $.proxy(function( html, textStatus, xhr ) {
+				//pre-parse html to check for a data-url,
+				//use it as the new fileUrl, base path, etc
+				var content,
+
+					// TODO handle dialogs again
+					pageElemRegex = new RegExp( "(<[^>]+\\bdata-" + this._getNs() + "role=[\"']?page[\"']?[^>]*>)" ),
+
+					dataUrlRegex = new RegExp( "\\bdata-" + this._getNs() + "url=[\"']?([^\"'>]*)[\"']?" );
+
+				// data-url must be provided for the base tag so resource requests
+				// can be directed to the correct url. loading into a temprorary
+				// element makes these requests immediately
+				if ( pageElemRegex.test( html ) &&
+					RegExp.$1 &&
+					dataUrlRegex.test( RegExp.$1 ) &&
+					RegExp.$1 ) {
+					fileUrl = $.mobile.path.getFilePath( $("<div>" + RegExp.$1 + "</div>").text() );
+				}
+
+				//dont update the base tag if we are prefetching
+				if ( settings.prefetch === undefined ) {
+					this._getBase().set( fileUrl );
+				}
+
+				content = this._parse( html, fileUrl );
+
+				this._setLoadedTitle( content, html );
+
+				// Add the content reference and xhr to our triggerData.
+				triggerData.xhr = xhr;
+				triggerData.textStatus = textStatus;
+
+				// DEPRECATED
+				triggerData.page = content;
+
+				triggerData.content = content;
+
+				// If the default behavior is prevented, stop here!
+				// Note that it is the responsibility of the listener/handler
+				// that called preventDefault(), to resolve/reject the
+				// deferred object within the triggerData.
+				if ( !this._trigger( "load", undefined, triggerData ) ) {
+					return;
+				}
+
+				// rewrite src and href attrs to use a base url if the base tag won't work
+				if ( this._isRewritableBaseTag() && content ) {
+					this._getBase().rewrite( fileUrl, content );
+				}
+
+				this._include( content, settings );
+
+				// Enhancing the content may result in new dialogs/sub content being inserted
+				// into the DOM. If the original absUrl refers to a sub-content, that is the
+				// real content we are interested in.
+				if ( absUrl.indexOf( "&" + $.mobile.subPageUrlKey ) > -1 ) {
+					content = this.element.children( "[data-" + this._getNs() +"url='" + dataUrl + "']" );
+				}
+
+				// Remove loading message.
+				if ( settings.showLoadMsg ) {
+					this._hideLoading();
+				}
+
+				// BEGIN DEPRECATED ---------------------------------------------------
+				// Let listeners know the content loaded successfully.
+				this.element.trigger( "pageload" );
+				// END DEPRECATED -----------------------------------------------------
+
+				deferred.resolve( absUrl, settings, content );
+			}, this);
+		},
+
+		_loadDefaults: {
+			type: "get",
+			data: undefined,
+
+			// DEPRECATED
+			reloadPage: false,
+
+			reload: false,
+
+			// By default we rely on the role defined by the @data-role attribute.
+			role: undefined,
+
+			showLoadMsg: false,
+
+			// This delay allows loads that pull from browser cache to
+			// occur without showing the loading message.
+			loadMsgDelay: 50
+		},
+
+		load: function( url, options ) {
+			// This function uses deferred notifications to let callers
+			// know when the content is done loading, or if an error has occurred.
+			var deferred = ( options && options.deferred ) || $.Deferred(),
+
+				// The default load options with overrides specified by the caller.
+				settings = $.extend( {}, this._loadDefaults, options ),
+
+				// The DOM element for the content after it has been loaded.
+				content = null,
+
+				// The absolute version of the URL passed into the function. This
+				// version of the URL may contain dialog/subcontent params in it.
+				absUrl = $.mobile.path.makeUrlAbsolute( url, this._findBaseWithDefault() ),
+				fileUrl, dataUrl, pblEvent, triggerData;
+
+			// DEPRECATED reloadPage
+			settings.reload = settings.reloadPage;
+
+			// If the caller provided data, and we're using "get" request,
+			// append the data to the URL.
+			if ( settings.data && settings.type === "get" ) {
+				absUrl = $.mobile.path.addSearchParams( absUrl, settings.data );
+				settings.data = undefined;
+			}
+
+			// If the caller is using a "post" request, reload must be true
+			if ( settings.data && settings.type === "post" ) {
+				settings.reload = true;
+			}
+
+			// The absolute version of the URL minus any dialog/subcontent params.
+			// In otherwords the real URL of the content to be loaded.
+			fileUrl = this._createFileUrl( absUrl );
+
+			// The version of the Url actually stored in the data-url attribute of
+			// the content. For embedded content, it is just the id of the page. For
+			// content within the same domain as the document base, it is the site
+			// relative path. For cross-domain content (Phone Gap only) the entire
+			// absolute Url is used to load the content.
+			dataUrl = this._createDataUrl( absUrl );
+
+			content = this._find( absUrl );
+
+			// If it isn't a reference to the first content and refers to missing
+			// embedded content reject the deferred and return
+			if ( content.length === 0 &&
+				$.mobile.path.isEmbeddedPage(fileUrl) &&
+				!$.mobile.path.isFirstPageUrl(fileUrl) ) {
+				deferred.reject( absUrl, settings );
+				return;
+			}
+
+			// Reset base to the default document base
+			// TODO figure out why we doe this
+			this._getBase().reset();
+
+			// If the content we are interested in is already in the DOM,
+			// and the caller did not indicate that we should force a
+			// reload of the file, we are done. Resolve the deferrred so that
+			// users can bind to .done on the promise
+			if ( content.length && !settings.reload ) {
+				this._enhance( content, settings.role );
+				deferred.resolve( absUrl, settings, content );
+
+				//if we are reloading the content make sure we update
+				// the base if its not a prefetch
+				if ( !settings.prefetch ) {
+					this._getBase().set(url);
+				}
+
+				return;
+			}
+
+			triggerData = {
+				url: url,
+				absUrl: absUrl,
+				dataUrl: dataUrl,
+				deferred: deferred,
+				options: settings
+			};
+
+			// Let listeners know we're about to load content.
+			pblEvent = this._triggerWithDeprecated( "beforeload", triggerData );
+
+			// If the default behavior is prevented, stop here!
+			if ( pblEvent.deprecatedEvent.isDefaultPrevented() ||
+				pblEvent.event.isDefaultPrevented() ) {
+				return;
+			}
+
+			if ( settings.showLoadMsg ) {
+				this._showLoading( settings.loadMsgDelay );
+			}
+
+			// Reset base to the default document base.
+			// only reset if we are not prefetching
+			if ( settings.prefetch === undefined ) {
+				this._getBase().reset();
+			}
+
+			if ( !( $.mobile.allowCrossDomainPages ||
+				$.mobile.path.isSameDomain($.mobile.path.documentUrl, absUrl ) ) ) {
+				deferred.reject( absUrl, settings );
+				return;
+			}
+
+			// Load the new content.
+			$.ajax({
+				url: fileUrl,
+				type: settings.type,
+				data: settings.data,
+				contentType: settings.contentType,
+				dataType: "html",
+				success: this._loadSuccess( absUrl, triggerData, settings, deferred ),
+				error: this._loadError( absUrl, triggerData, settings, deferred )
+			});
+		},
+
+		_loadError: function( absUrl, triggerData, settings, deferred ) {
+			return $.proxy(function( xhr, textStatus, errorThrown ) {
+				//set base back to current path
+				this._getBase().set( $.mobile.path.get() );
+
+				// Add error info to our triggerData.
+				triggerData.xhr = xhr;
+				triggerData.textStatus = textStatus;
+				triggerData.errorThrown = errorThrown;
+
+				// Let listeners know the page load failed.
+				var plfEvent = this._triggerWithDeprecated( "loadfailed", triggerData );
+
+				// If the default behavior is prevented, stop here!
+				// Note that it is the responsibility of the listener/handler
+				// that called preventDefault(), to resolve/reject the
+				// deferred object within the triggerData.
+				if ( plfEvent.deprecatedEvent.isDefaultPrevented() ||
+					plfEvent.event.isDefaultPrevented() ) {
+					return;
+				}
+
+				// Remove loading message.
+				if ( settings.showLoadMsg ) {
+					this._showError();
+				}
+
+				deferred.reject( absUrl, settings );
+			}, this);
+		},
+
+		_getTransitionHandler: function( transition ) {
+			transition = $.mobile._maybeDegradeTransition( transition );
+
+			//find the transition handler for the specified transition. If there
+			//isn't one in our transitionHandlers dictionary, use the default one.
+			//call the handler immediately to kick-off the transition.
+			return $.mobile.transitionHandlers[ transition ] || $.mobile.defaultTransitionHandler;
+		},
+
+		// TODO move into transition handlers?
+		_triggerCssTransitionEvents: function( to, from, prefix ) {
+			var samePage = false;
+
+			prefix = prefix || "";
+
+			// TODO decide if these events should in fact be triggered on the container
+			if ( from ) {
+
+				//Check if this is a same page transition and tell the handler in page
+				if( to[0] === from[0] ){
+					samePage = true;
+				}
+
+				//trigger before show/hide events
+				// TODO deprecate nextPage in favor of next
+				this._triggerWithDeprecated( prefix + "hide", { nextPage: to, samePage: samePage }, from );
+			}
+
+			// TODO deprecate prevPage in favor of previous
+			this._triggerWithDeprecated( prefix + "show", { prevPage: from || $( "" ) }, to );
+		},
+
+		// TODO make private once change has been defined in the widget
+		_cssTransition: function( to, from, options ) {
+			var transition = options.transition,
+				reverse = options.reverse,
+				deferred = options.deferred,
+				TransitionHandler,
+				promise;
+
+			this._triggerCssTransitionEvents( to, from, "before" );
+
+			// TODO put this in a binding to events *outside* the widget
+			this._hideLoading();
+
+			TransitionHandler = this._getTransitionHandler( transition );
+
+			promise = ( new TransitionHandler( transition, reverse, to, from ) ).transition();
+
+			// TODO temporary accomodation of argument deferred
+			promise.done(function() {
+				deferred.resolve.apply( deferred, arguments );
+			});
+
+			promise.done($.proxy(function() {
+				this._triggerCssTransitionEvents( to, from );
+			}, this));
+		},
+
+		_releaseTransitionLock: function() {
+			//release transition lock so navigation is free again
+			isPageTransitioning = false;
+			if ( pageTransitionQueue.length > 0 ) {
+				$.mobile.changePage.apply( null, pageTransitionQueue.pop() );
+			}
+		},
+
+		_removeActiveLinkClass: function( force ) {
+			//clear out the active button state
+			$.mobile.removeActiveLinkClass( force );
+		},
+
+		_loadUrl: function( to, triggerData, settings ) {
+			// preserve the original target as the dataUrl value will be
+			// simplified eg, removing ui-state, and removing query params
+			// from the hash this is so that users who want to use query
+			// params have access to them in the event bindings for the page
+			// life cycle See issue #5085
+			settings.target = to;
+			settings.deferred = $.Deferred();
+
+			this.load( to, settings );
+
+			settings.deferred.done($.proxy(function( url, options, content ) {
+				isPageTransitioning = false;
+
+				// store the original absolute url so that it can be provided
+				// to events in the triggerData of the subsequent changePage call
+				options.absUrl = triggerData.absUrl;
+
+				this.transition( content, triggerData, options );
+			}, this));
+
+			settings.deferred.fail($.proxy(function(/* url, options */) {
+				this._removeActiveLinkClass( true );
+				this._releaseTransitionLock();
+				this._triggerWithDeprecated( "changefailed", triggerData );
+			}, this));
+		},
+
+		_triggerPageBeforeChange: function( to, triggerData, settings ) {
+			var pbcEvent = new $.Event( "pagebeforechange" );
+
+			$.extend(triggerData, { toPage: to, options: settings });
+
+			// NOTE: preserve the original target as the dataUrl value will be
+			// simplified eg, removing ui-state, and removing query params from
+			// the hash this is so that users who want to use query params have
+			// access to them in the event bindings for the page life cycle
+			// See issue #5085
+			if ( $.type(to) === "string" ) {
+				// if the toPage is a string simply convert it
+				triggerData.absUrl = $.mobile.path.makeUrlAbsolute( to, this._findBaseWithDefault() );
+			} else {
+				// if the toPage is a jQuery object grab the absolute url stored
+				// in the loadPage callback where it exists
+				triggerData.absUrl = settings.absUrl;
+			}
+
+			// Let listeners know we're about to change the current page.
+			this.element.trigger( pbcEvent, triggerData );
+
+			// If the default behavior is prevented, stop here!
+			if ( pbcEvent.isDefaultPrevented() ) {
+				return false;
+			}
+
+			return true;
+		},
+
+		change: function( to, options ) {
+			// If we are in the midst of a transition, queue the current request.
+			// We'll call changePage() once we're done with the current transition
+			// to service the request.
+			if ( isPageTransitioning ) {
+				pageTransitionQueue.unshift( arguments );
+				return;
+			}
+
+			var settings = $.extend( {}, $.mobile.changePage.defaults, options ),
+				triggerData = {};
+
+			// Make sure we have a fromPage.
+			settings.fromPage = settings.fromPage || this.activePage;
+
+			// if the page beforechange default is prevented return early
+			if ( !this._triggerPageBeforeChange(to, triggerData, settings) ) {
+				return;
+			}
+
+			// We allow "pagebeforechange" observers to modify the to in
+			// the trigger data to allow for redirects. Make sure our to is
+			// updated. We also need to re-evaluate whether it is a string,
+			// because an object can also be replaced by a string
+			to = triggerData.toPage;
+
+			// If the caller passed us a url, call loadPage()
+			// to make sure it is loaded into the DOM. We'll listen
+			// to the promise object it returns so we know when
+			// it is done loading or if an error ocurred.
+			if ( $.type(to) === "string" ) {
+				// Set the isPageTransitioning flag to prevent any requests from
+				// entering this method while we are in the midst of loading a page
+				// or transitioning.
+				isPageTransitioning = true;
+
+				this._loadUrl( to, triggerData, settings );
+			} else {
+				this.transition( to, triggerData, settings );
+			}
+		},
+
+		transition: function( toPage, triggerData, settings ) {
+			var fromPage, url, pageUrl, fileUrl,
+				active, activeIsInitialPage,
+				historyDir, pageTitle, isDialog,
+				alreadyThere, newPageTitle,
+				params,	cssTransitionDeferred,
+				beforeTransition;
+
+			// If we are in the midst of a transition, queue the current request.
+			// We'll call changePage() once we're done with the current transition
+			// to service the request.
+			if ( isPageTransitioning ) {
+				// make sure to only queue the to and settings values so the arguments
+				// work with a call to the change method
+				pageTransitionQueue.unshift( [toPage, settings] );
+				return;
+			}
+
+			// DEPRECATED - this call only, in favor of the before transition
+			// if the page beforechange default is prevented return early
+			if ( !this._triggerPageBeforeChange(toPage, triggerData, settings) ) {
+				return;
+			}
+
+			// if the (content|page)beforetransition default is prevented return early
+			// Note, we have to check for both the deprecated and new events
+			beforeTransition = this._triggerWithDeprecated( "beforetransition", triggerData );
+			if (beforeTransition.deprecatedEvent.isDefaultPrevented() ||
+				beforeTransition.event.isDefaultPrevented() ) {
+				return;
+			}
+
+			// Set the isPageTransitioning flag to prevent any requests from
+			// entering this method while we are in the midst of loading a page
+			// or transitioning.
+			isPageTransitioning = true;
+
+			// If we are going to the first-page of the application, we need to make
+			// sure settings.dataUrl is set to the application document url. This allows
+			// us to avoid generating a document url with an id hash in the case where the
+			// first-page of the document has an id attribute specified.
+			if ( toPage[ 0 ] === $.mobile.firstPage[ 0 ] && !settings.dataUrl ) {
+				settings.dataUrl = $.mobile.path.documentUrl.hrefNoHash;
+			}
+
+			// The caller passed us a real page DOM element. Update our
+			// internal state and then trigger a transition to the page.
+			fromPage = settings.fromPage;
+			url = ( settings.dataUrl && $.mobile.path.convertUrlToDataUrl(settings.dataUrl) ) ||
+				toPage.jqmData( "url" );
+
+			// The pageUrl var is usually the same as url, except when url is obscured
+			// as a dialog url. pageUrl always contains the file path
+			pageUrl = url;
+			fileUrl = $.mobile.path.getFilePath( url );
+			active = $.mobile.navigate.history.getActive();
+			activeIsInitialPage = $.mobile.navigate.history.activeIndex === 0;
+			historyDir = 0;
+			pageTitle = document.title;
+			isDialog = ( settings.role === "dialog" ||
+				toPage.jqmData( "role" ) === "dialog" ) &&
+				toPage.jqmData( "dialog" ) !== true;
+
+			// By default, we prevent changePage requests when the fromPage and toPage
+			// are the same element, but folks that generate content
+			// manually/dynamically and reuse pages want to be able to transition to
+			// the same page. To allow this, they will need to change the default
+			// value of allowSamePageTransition to true, *OR*, pass it in as an
+			// option when they manually call changePage(). It should be noted that
+			// our default transition animations assume that the formPage and toPage
+			// are different elements, so they may behave unexpectedly. It is up to
+			// the developer that turns on the allowSamePageTransitiona option to
+			// either turn off transition animations, or make sure that an appropriate
+			// animation transition is used.
+			if ( fromPage && fromPage[0] === toPage[0] &&
+				!settings.allowSamePageTransition ) {
+
+				isPageTransitioning = false;
+				this._triggerWithDeprecated( "transition", triggerData );
+				this.element.trigger( "pagechange", triggerData );
+
+				// Even if there is no page change to be done, we should keep the
+				// urlHistory in sync with the hash changes
+				if ( settings.fromHashChange ) {
+					$.mobile.navigate.history.direct({ url: url });
+				}
+
+				return;
+			}
+
+			// We need to make sure the page we are given has already been enhanced.
+			toPage.page({ role: settings.role });
+
+			// If the changePage request was sent from a hashChange event, check to
+			// see if the page is already within the urlHistory stack. If so, we'll
+			// assume the user hit the forward/back button and will try to match the
+			// transition accordingly.
+			if ( settings.fromHashChange ) {
+				historyDir = settings.direction === "back" ? -1 : 1;
+			}
+
+			// Kill the keyboard.
+			// XXX_jblas: We need to stop crawling the entire document to kill focus.
+			//            Instead, we should be tracking focus with a delegate()
+			//            handler so we already have the element in hand at this
+			//            point.
+			// Wrap this in a try/catch block since IE9 throw "Unspecified error" if
+			// document.activeElement is undefined when we are in an IFrame.
+			try {
+				if ( document.activeElement &&
+					document.activeElement.nodeName.toLowerCase() !== "body" ) {
+
+					$( document.activeElement ).blur();
+				} else {
+					$( "input:focus, textarea:focus, select:focus" ).blur();
+				}
+			} catch( e ) {}
+
+			// Record whether we are at a place in history where a dialog used to be -
+			// if so, do not add a new history entry and do not change the hash either
+			alreadyThere = false;
+
+			// If we're displaying the page as a dialog, we don't want the url
+			// for the dialog content to be used in the hash. Instead, we want
+			// to append the dialogHashKey to the url of the current page.
+			if ( isDialog && active ) {
+				// on the initial page load active.url is undefined and in that case
+				// should be an empty string. Moving the undefined -> empty string back
+				// into urlHistory.addNew seemed imprudent given undefined better
+				// represents the url state
+
+				// If we are at a place in history that once belonged to a dialog, reuse
+				// this state without adding to urlHistory and without modifying the
+				// hash. However, if a dialog is already displayed at this point, and
+				// we're about to display another dialog, then we must add another hash
+				// and history entry on top so that one may navigate back to the
+				// original dialog
+				if ( active.url &&
+					active.url.indexOf( $.mobile.dialogHashKey ) > -1 &&
+					this.activePage &&
+					!this.activePage.hasClass( "ui-dialog" ) &&
+					$.mobile.navigate.history.activeIndex > 0 ) {
+
+					settings.changeHash = false;
+					alreadyThere = true;
+				}
+
+				// Normally, we tack on a dialog hash key, but if this is the location
+				// of a stale dialog, we reuse the URL from the entry
+				url = ( active.url || "" );
+
+				// account for absolute urls instead of just relative urls use as hashes
+				if ( !alreadyThere && url.indexOf("#") > -1 ) {
+					url += $.mobile.dialogHashKey;
+				} else {
+					url += "#" + $.mobile.dialogHashKey;
+				}
+
+				// tack on another dialogHashKey if this is the same as the initial hash
+				// this makes sure that a history entry is created for this dialog
+				if ( $.mobile.navigate.history.activeIndex === 0 && url === $.mobile.navigate.history.initialDst ) {
+					url += $.mobile.dialogHashKey;
+				}
+			}
+
+			// if title element wasn't found, try the page div data attr too
+			// If this is a deep-link or a reload ( active === undefined ) then just
+			// use pageTitle
+			newPageTitle = ( !active ) ? pageTitle : toPage.jqmData( "title" ) ||
+				toPage.children( ":jqmData(role='header')" ).find( ".ui-title" ).text();
+			if ( !!newPageTitle && pageTitle === document.title ) {
+				pageTitle = newPageTitle;
+			}
+			if ( !toPage.jqmData( "title" ) ) {
+				toPage.jqmData( "title", pageTitle );
+			}
+
+			// Make sure we have a transition defined.
+			settings.transition = settings.transition ||
+				( ( historyDir && !activeIsInitialPage ) ? active.transition : undefined ) ||
+				( isDialog ? $.mobile.defaultDialogTransition : $.mobile.defaultPageTransition );
+
+			//add page to history stack if it's not back or forward
+			if ( !historyDir && alreadyThere ) {
+				$.mobile.navigate.history.getActive().pageUrl = pageUrl;
+			}
+
+			// Set the location hash.
+			if ( url && !settings.fromHashChange ) {
+
+				// rebuilding the hash here since we loose it earlier on
+				// TODO preserve the originally passed in path
+				if ( !$.mobile.path.isPath( url ) && url.indexOf( "#" ) < 0 ) {
+					url = "#" + url;
+				}
+
+				// TODO the property names here are just silly
+				params = {
+					transition: settings.transition,
+					title: pageTitle,
+					pageUrl: pageUrl,
+					role: settings.role
+				};
+
+				if ( settings.changeHash !== false && $.mobile.hashListeningEnabled ) {
+					$.mobile.navigate( url, params, true);
+				} else if ( toPage[ 0 ] !== $.mobile.firstPage[ 0 ] ) {
+					$.mobile.navigate.history.add( url, params );
+				}
+			}
+
+			//set page title
+			document.title = pageTitle;
+
+			//set "toPage" as activePage deprecated in 1.4 remove in 1.5
+			$.mobile.activePage = toPage;
+
+			//new way to handle activePage
+			this.activePage = toPage;
+
+			// If we're navigating back in the URL history, set reverse accordingly.
+			settings.reverse = settings.reverse || historyDir < 0;
+
+			cssTransitionDeferred = $.Deferred();
+
+			this._cssTransition(toPage, fromPage, {
+				transition: settings.transition,
+				reverse: settings.reverse,
+				deferred: cssTransitionDeferred
+			});
+
+			cssTransitionDeferred.done($.proxy(function( name, reverse, $to, $from, alreadyFocused ) {
+				$.mobile.removeActiveLinkClass();
+
+				//if there's a duplicateCachedPage, remove it from the DOM now that it's hidden
+				if ( settings.duplicateCachedPage ) {
+					settings.duplicateCachedPage.remove();
+				}
+
+				// despite visibility: hidden addresses issue #2965
+				// https://github.com/jquery/jquery-mobile/issues/2965
+				if ( !alreadyFocused ) {
+					$.mobile.focusPage( toPage );
+				}
+
+				this._releaseTransitionLock();
+				this.element.trigger( "pagechange", triggerData );
+				this._triggerWithDeprecated( "transition", triggerData );
+			}, this));
+		},
+
+		// determine the current base url
+		_findBaseWithDefault: function() {
+			var closestBase = ( this.activePage &&
+			$.mobile.getClosestBaseUrl( this.activePage ) );
+		return closestBase || $.mobile.path.documentBase.hrefNoHash;
+		}
+	});
+
+	// The following handlers should be bound after mobileinit has been triggered
+	// the following deferred is resolved in the init file
+	$.mobile.navreadyDeferred = $.Deferred();
+
+	//these variables make all page containers use the same queue and only navigate one at a time
+	// queue to hold simultanious page transitions
+	var pageTransitionQueue = [],
+
+		// indicates whether or not page is in process of transitioning
+		isPageTransitioning = false;
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+		// resolved on domready
+	var domreadyDeferred = $.Deferred(),
+
+		// resolved and nulled on window.load()
+		loadDeferred = $.Deferred(),
+		documentUrl = $.mobile.path.documentUrl,
+
+		// used to track last vclicked element to make sure its value is added to form data
+		$lastVClicked = null;
+
+	/* Event Bindings - hashchange, submit, and click */
+	function findClosestLink( ele )	{
+		while ( ele ) {
+			// Look for the closest element with a nodeName of "a".
+			// Note that we are checking if we have a valid nodeName
+			// before attempting to access it. This is because the
+			// node we get called with could have originated from within
+			// an embedded SVG document where some symbol instance elements
+			// don't have nodeName defined on them, or strings are of type
+			// SVGAnimatedString.
+			if ( ( typeof ele.nodeName === "string" ) && ele.nodeName.toLowerCase() === "a" ) {
+				break;
+			}
+			ele = ele.parentNode;
+		}
+		return ele;
+	}
+
+	$.mobile.loadPage = function( url, opts ) {
+		var container;
+
+		opts = opts || {};
+		container = ( opts.pageContainer || $.mobile.pageContainer );
+
+		// create the deferred that will be supplied to loadPage callers
+		// and resolved by the content widget's load method
+		opts.deferred = $.Deferred();
+
+		// Preferring to allow exceptions for uninitialized opts.pageContainer
+		// widgets so we know if we need to force init here for users
+		container.pagecontainer( "load", url, opts );
+
+		// provide the deferred
+		return opts.deferred.promise();
+	};
+
+	//define vars for interal use
+
+	/* internal utility functions */
+
+	// NOTE Issue #4950 Android phonegap doesn't navigate back properly
+	//      when a full page refresh has taken place. It appears that hashchange
+	//      and replacestate history alterations work fine but we need to support
+	//      both forms of history traversal in our code that uses backward history
+	//      movement
+	$.mobile.back = function() {
+		var nav = window.navigator;
+
+		// if the setting is on and the navigator object is
+		// available use the phonegap navigation capability
+		if ( this.phonegapNavigationEnabled &&
+			nav &&
+			nav.app &&
+			nav.app.backHistory ) {
+			nav.app.backHistory();
+		} else {
+			$.mobile.pageContainer.pagecontainer( "back" );
+		}
+	};
+
+	// Direct focus to the page title, or otherwise first focusable element
+	$.mobile.focusPage = function ( page ) {
+		var autofocus = page.find( "[autofocus]" ),
+			pageTitle = page.find( ".ui-title:eq(0)" );
+
+		if ( autofocus.length ) {
+			autofocus.focus();
+			return;
+		}
+
+		if ( pageTitle.length ) {
+			pageTitle.focus();
+		} else{
+			page.focus();
+		}
+	};
+
+	// No-op implementation of transition degradation
+	$.mobile._maybeDegradeTransition = $.mobile._maybeDegradeTransition || function( transition ) {
+		return transition;
+	};
+
+	// Exposed $.mobile methods
+
+	$.mobile.changePage = function( to, options ) {
+		$.mobile.pageContainer.pagecontainer( "change", to, options );
+	};
+
+	$.mobile.changePage.defaults = {
+		transition: undefined,
+		reverse: false,
+		changeHash: true,
+		fromHashChange: false,
+		role: undefined, // By default we rely on the role defined by the @data-role attribute.
+		duplicateCachedPage: undefined,
+		pageContainer: undefined,
+		showLoadMsg: true, //loading message shows by default when pages are being fetched during changePage
+		dataUrl: undefined,
+		fromPage: undefined,
+		allowSamePageTransition: false
+	};
+
+	$.mobile._registerInternalEvents = function() {
+		var getAjaxFormData = function( $form, calculateOnly ) {
+			var url, ret = true, formData, vclickedName, method;
+			if ( !$.mobile.ajaxEnabled ||
+					// test that the form is, itself, ajax false
+					$form.is( ":jqmData(ajax='false')" ) ||
+					// test that $.mobile.ignoreContentEnabled is set and
+					// the form or one of it's parents is ajax=false
+					!$form.jqmHijackable().length ||
+					$form.attr( "target" ) ) {
+				return false;
+			}
+
+			url = ( $lastVClicked && $lastVClicked.attr( "formaction" ) ) ||
+				$form.attr( "action" );
+			method = ( $form.attr( "method" ) || "get" ).toLowerCase();
+
+			// If no action is specified, browsers default to using the
+			// URL of the document containing the form. Since we dynamically
+			// pull in pages from external documents, the form should submit
+			// to the URL for the source document of the page containing
+			// the form.
+			if ( !url ) {
+				// Get the @data-url for the page containing the form.
+				url = $.mobile.getClosestBaseUrl( $form );
+
+				// NOTE: If the method is "get", we need to strip off the query string
+				// because it will get replaced with the new form data. See issue #5710.
+				if ( method === "get" ) {
+					url = $.mobile.path.parseUrl( url ).hrefNoSearch;
+				}
+
+				if ( url === $.mobile.path.documentBase.hrefNoHash ) {
+					// The url we got back matches the document base,
+					// which means the page must be an internal/embedded page,
+					// so default to using the actual document url as a browser
+					// would.
+					url = documentUrl.hrefNoSearch;
+				}
+			}
+
+			url = $.mobile.path.makeUrlAbsolute(  url, $.mobile.getClosestBaseUrl( $form ) );
+
+			if ( ( $.mobile.path.isExternal( url ) && !$.mobile.path.isPermittedCrossDomainRequest( documentUrl, url ) ) ) {
+				return false;
+			}
+
+			if ( !calculateOnly ) {
+				formData = $form.serializeArray();
+
+				if ( $lastVClicked && $lastVClicked[ 0 ].form === $form[ 0 ] ) {
+					vclickedName = $lastVClicked.attr( "name" );
+					if ( vclickedName ) {
+						// Make sure the last clicked element is included in the form
+						$.each( formData, function( key, value ) {
+							if ( value.name === vclickedName ) {
+								// Unset vclickedName - we've found it in the serialized data already
+								vclickedName = "";
+								return false;
+							}
+						});
+						if ( vclickedName ) {
+							formData.push( { name: vclickedName, value: $lastVClicked.attr( "value" ) } );
+						}
+					}
+				}
+
+				ret = {
+					url: url,
+					options: {
+						type:		method,
+						data:		$.param( formData ),
+						transition:	$form.jqmData( "transition" ),
+						reverse:	$form.jqmData( "direction" ) === "reverse",
+						reloadPage:	true
+					}
+				};
+			}
+
+			return ret;
+		};
+
+		//bind to form submit events, handle with Ajax
+		$.mobile.document.delegate( "form", "submit", function( event ) {
+			var formData;
+
+			if ( !event.isDefaultPrevented() ) {
+				formData = getAjaxFormData( $( this ) );
+				if ( formData ) {
+					$.mobile.changePage( formData.url, formData.options );
+					event.preventDefault();
+				}
+			}
+		});
+
+		//add active state on vclick
+		$.mobile.document.bind( "vclick", function( event ) {
+			var $btn, btnEls, target = event.target, needClosest = false;
+			// if this isn't a left click we don't care. Its important to note
+			// that when the virtual event is generated it will create the which attr
+			if ( event.which > 1 || !$.mobile.linkBindingEnabled ) {
+				return;
+			}
+
+			// Record that this element was clicked, in case we need it for correct
+			// form submission during the "submit" handler above
+			$lastVClicked = $( target );
+
+			// Try to find a target element to which the active class will be applied
+			if ( $.data( target, "mobile-button" ) ) {
+				// If the form will not be submitted via AJAX, do not add active class
+				if ( !getAjaxFormData( $( target ).closest( "form" ), true ) ) {
+					return;
+				}
+				// We will apply the active state to this button widget - the parent
+				// of the input that was clicked will have the associated data
+				if ( target.parentNode ) {
+					target = target.parentNode;
+				}
+			} else {
+				target = findClosestLink( target );
+				if ( !( target && $.mobile.path.parseUrl( target.getAttribute( "href" ) || "#" ).hash !== "#" ) ) {
+					return;
+				}
+
+				// TODO teach $.mobile.hijackable to operate on raw dom elements so the
+				// link wrapping can be avoided
+				if ( !$( target ).jqmHijackable().length ) {
+					return;
+				}
+			}
+
+			// Avoid calling .closest by using the data set during .buttonMarkup()
+			// List items have the button data in the parent of the element clicked
+			if ( !!~target.className.indexOf( "ui-link-inherit" ) ) {
+				if ( target.parentNode ) {
+					btnEls = $.data( target.parentNode, "buttonElements" );
+				}
+			// Otherwise, look for the data on the target itself
+			} else {
+				btnEls = $.data( target, "buttonElements" );
+			}
+			// If found, grab the button's outer element
+			if ( btnEls ) {
+				target = btnEls.outer;
+			} else {
+				needClosest = true;
+			}
+
+			$btn = $( target );
+			// If the outer element wasn't found by the our heuristics, use .closest()
+			if ( needClosest ) {
+				$btn = $btn.closest( ".ui-btn" );
+			}
+
+			if ( $btn.length > 0 &&
+				!( $btn.hasClass( "ui-state-disabled" ||
+
+					// DEPRECATED as of 1.4.0 - remove after 1.4.0 release
+					// only ui-state-disabled should be present thereafter
+					$btn.hasClass( "ui-disabled" ) ) ) ) {
+				$.mobile.removeActiveLinkClass( true );
+				$.mobile.activeClickedLink = $btn;
+				$.mobile.activeClickedLink.addClass( $.mobile.activeBtnClass );
+			}
+		});
+
+		// click routing - direct to HTTP or Ajax, accordingly
+		$.mobile.document.bind( "click", function( event ) {
+			if ( !$.mobile.linkBindingEnabled || event.isDefaultPrevented() ) {
+				return;
+			}
+
+			var link = findClosestLink( event.target ),
+				$link = $( link ),
+
+				//remove active link class if external (then it won't be there if you come back)
+				httpCleanup = function() {
+					window.setTimeout(function() { $.mobile.removeActiveLinkClass( true ); }, 200 );
+				},
+				baseUrl, href,
+				useDefaultUrlHandling, isExternal,
+				transition, reverse, role;
+
+			// If a button was clicked, clean up the active class added by vclick above
+			if ( $.mobile.activeClickedLink &&
+				$.mobile.activeClickedLink[ 0 ] === event.target.parentNode ) {
+				httpCleanup();
+			}
+
+			// If there is no link associated with the click or its not a left
+			// click we want to ignore the click
+			// TODO teach $.mobile.hijackable to operate on raw dom elements so the link wrapping
+			// can be avoided
+			if ( !link || event.which > 1 || !$link.jqmHijackable().length ) {
+				return;
+			}
+
+			//if there's a data-rel=back attr, go back in history
+			if ( $link.is( ":jqmData(rel='back')" ) ) {
+				$.mobile.back();
+				return false;
+			}
+
+			baseUrl = $.mobile.getClosestBaseUrl( $link );
+
+			//get href, if defined, otherwise default to empty hash
+			href = $.mobile.path.makeUrlAbsolute( $link.attr( "href" ) || "#", baseUrl );
+
+			//if ajax is disabled, exit early
+			if ( !$.mobile.ajaxEnabled && !$.mobile.path.isEmbeddedPage( href ) ) {
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			// XXX_jblas: Ideally links to application pages should be specified as
+			//            an url to the application document with a hash that is either
+			//            the site relative path or id to the page. But some of the
+			//            internal code that dynamically generates sub-pages for nested
+			//            lists and select dialogs, just write a hash in the link they
+			//            create. This means the actual URL path is based on whatever
+			//            the current value of the base tag is at the time this code
+			//            is called. For now we are just assuming that any url with a
+			//            hash in it is an application page reference.
+			if ( href.search( "#" ) !== -1 ) {
+				href = href.replace( /[^#]*#/, "" );
+				if ( !href ) {
+					//link was an empty hash meant purely
+					//for interaction, so we ignore it.
+					event.preventDefault();
+					return;
+				} else if ( $.mobile.path.isPath( href ) ) {
+					//we have apath so make it the href we want to load.
+					href = $.mobile.path.makeUrlAbsolute( href, baseUrl );
+				} else {
+					//we have a simple id so use the documentUrl as its base.
+					href = $.mobile.path.makeUrlAbsolute( "#" + href, documentUrl.hrefNoHash );
+				}
+			}
+
+			// Should we handle this link, or let the browser deal with it?
+			useDefaultUrlHandling = $link.is( "[rel='external']" ) || $link.is( ":jqmData(ajax='false')" ) || $link.is( "[target]" );
+
+			// Some embedded browsers, like the web view in Phone Gap, allow cross-domain XHR
+			// requests if the document doing the request was loaded via the file:// protocol.
+			// This is usually to allow the application to "phone home" and fetch app specific
+			// data. We normally let the browser handle external/cross-domain urls, but if the
+			// allowCrossDomainPages option is true, we will allow cross-domain http/https
+			// requests to go through our page loading logic.
+
+			//check for protocol or rel and its not an embedded page
+			//TODO overlap in logic from isExternal, rel=external check should be
+			//     moved into more comprehensive isExternalLink
+			isExternal = useDefaultUrlHandling || ( $.mobile.path.isExternal( href ) && !$.mobile.path.isPermittedCrossDomainRequest( documentUrl, href ) );
+
+			if ( isExternal ) {
+				httpCleanup();
+				//use default click handling
+				return;
+			}
+
+			//use ajax
+			transition = $link.jqmData( "transition" );
+			reverse = $link.jqmData( "direction" ) === "reverse" ||
+						// deprecated - remove by 1.0
+						$link.jqmData( "back" );
+
+			//this may need to be more specific as we use data-rel more
+			role = $link.attr( "data-" + $.mobile.ns + "rel" ) || undefined;
+
+			$.mobile.changePage( href, { transition: transition, reverse: reverse, role: role, link: $link } );
+			event.preventDefault();
+		});
+
+		//prefetch pages when anchors with data-prefetch are encountered
+		$.mobile.document.delegate( ".ui-page", "pageshow.prefetch", function() {
+			var urls = [];
+			$( this ).find( "a:jqmData(prefetch)" ).each(function() {
+				var $link = $( this ),
+					url = $link.attr( "href" );
+
+				if ( url && $.inArray( url, urls ) === -1 ) {
+					urls.push( url );
+
+					$.mobile.loadPage( url, { role: $link.attr( "data-" + $.mobile.ns + "rel" ),prefetch: true } );
+				}
+			});
+		});
+
+		// TODO ensure that the navigate binding in the content widget happens at the right time
+		$.mobile.pageContainer.pagecontainer();
+
+		//set page min-heights to be device specific
+		$.mobile.document.bind( "pageshow", function() {
+
+			// We need to wait for window.load to make sure that styles have already been rendered,
+			// otherwise heights of external toolbars will have the wrong value
+			if ( loadDeferred ) {
+				loadDeferred.done( $.mobile.resetActivePageHeight );
+			} else {
+				$.mobile.resetActivePageHeight();
+			}
+		});
+		$.mobile.window.bind( "throttledresize", $.mobile.resetActivePageHeight );
+
+	};//navreadyDeferred done callback
+
+	$( function() { domreadyDeferred.resolve(); } );
+
+	$.mobile.window.load( function() {
+
+		// Resolve and null the deferred
+		loadDeferred.resolve();
+		loadDeferred = null;
+	});
+
+	$.when( domreadyDeferred, $.mobile.navreadyDeferred ).done( function() { $.mobile._registerInternalEvents(); } );
+})( jQuery );
+
+
+(function( $, window, undefined ) {
+
+	// TODO remove direct references to $.mobile and properties, we should
+	//      favor injection with params to the constructor
+	$.mobile.Transition = function() {
+		this.init.apply( this, arguments );
+	};
+
+	$.extend($.mobile.Transition.prototype, {
+		toPreClass: " ui-page-pre-in",
+
+		init: function( name, reverse, $to, $from ) {
+			$.extend(this, {
+				name: name,
+				reverse: reverse,
+				$to: $to,
+				$from: $from,
+				deferred: new $.Deferred()
+			});
+		},
+
+		cleanFrom: function() {
+			this.$from
+				.removeClass( $.mobile.activePageClass + " out in reverse " + this.name )
+				.height( "" );
+		},
+
+		// NOTE overridden by child object prototypes, noop'd here as defaults
+		beforeDoneIn: function() {},
+		beforeDoneOut: function() {},
+		beforeStartOut: function() {},
+
+		doneIn: function() {
+			this.beforeDoneIn();
+
+			this.$to.removeClass( "out in reverse " + this.name ).height( "" );
+
+			this.toggleViewportClass();
+
+			// In some browsers (iOS5), 3D transitions block the ability to scroll to the desired location during transition
+			// This ensures we jump to that spot after the fact, if we aren't there already.
+			if ( $.mobile.window.scrollTop() !== this.toScroll ) {
+				this.scrollPage();
+			}
+			if ( !this.sequential ) {
+				this.$to.addClass( $.mobile.activePageClass );
+			}
+			this.deferred.resolve( this.name, this.reverse, this.$to, this.$from, true );
+		},
+
+		doneOut: function( screenHeight, reverseClass, none, preventFocus ) {
+			this.beforeDoneOut();
+			this.startIn( screenHeight, reverseClass, none, preventFocus );
+		},
+
+		hideIn: function( callback ) {
+			// Prevent flickering in phonegap container: see comments at #4024 regarding iOS
+			this.$to.css( "z-index", -10 );
+			callback.call( this );
+			this.$to.css( "z-index", "" );
+		},
+
+		scrollPage: function() {
+			// By using scrollTo instead of silentScroll, we can keep things better in order
+			// Just to be precautios, disable scrollstart listening like silentScroll would
+			$.event.special.scrollstart.enabled = false;
+			//if we are hiding the url bar or the page was previously scrolled scroll to hide or return to position
+			if ( $.mobile.hideUrlBar || this.toScroll !== $.mobile.defaultHomeScroll ) {
+				window.scrollTo( 0, this.toScroll );
+			}
+
+			// reenable scrollstart listening like silentScroll would
+			setTimeout( function() {
+				$.event.special.scrollstart.enabled = true;
+			}, 150 );
+		},
+
+		startIn: function( screenHeight, reverseClass, none, preventFocus ) {
+			this.hideIn(function() {
+				this.$to.addClass( $.mobile.activePageClass + this.toPreClass );
+
+				// Send focus to page as it is now display: block
+				if ( !preventFocus ) {
+					$.mobile.focusPage( this.$to );
+				}
+
+				// Set to page height
+				this.$to.height( screenHeight + this.toScroll );
+
+                if ( !none ) {
+                    this.scrollPage();
+                }
+			});
+
+			this.$to
+				.removeClass( this.toPreClass )
+				.addClass( this.name + " in " + reverseClass );
+
+			if ( !none ) {
+				this.$to.animationComplete( $.proxy(function() {
+					this.doneIn();
+				}, this ));
+			} else {
+				this.doneIn();
+			}
+
+		},
+
+		startOut: function( screenHeight, reverseClass, none ) {
+			this.beforeStartOut( screenHeight, reverseClass, none );
+
+			// Set the from page's height and start it transitioning out
+			// Note: setting an explicit height helps eliminate tiling in the transitions
+			this.$from
+				.height( screenHeight + $.mobile.window.scrollTop() )
+				.addClass( this.name + " out" + reverseClass );
+		},
+
+		toggleViewportClass: function() {
+			$.mobile.pageContainer.toggleClass( "ui-mobile-viewport-transitioning viewport-" + this.name );
+		},
+
+		transition: function() {
+			// NOTE many of these could be calculated/recorded in the constructor, it's my
+			//      opinion that binding them as late as possible has value with regards to
+			//      better transitions with fewer bugs. Ie, it's not guaranteed that the
+			//      object will be created and transition will be run immediately after as
+			//      it is today. So we wait until transition is invoked to gather the following
+			var none,
+				reverseClass = this.reverse ? " reverse" : "",
+				screenHeight = $.mobile.getScreenHeight(),
+				maxTransitionOverride = $.mobile.maxTransitionWidth !== false &&
+					$.mobile.window.width() > $.mobile.maxTransitionWidth;
+
+			this.toScroll = $.mobile.navigate.history.getActive().lastScroll || $.mobile.defaultHomeScroll;
+
+			none = !$.support.cssTransitions || !$.support.cssAnimations ||
+				maxTransitionOverride || !this.name || this.name === "none" ||
+				Math.max( $.mobile.window.scrollTop(), this.toScroll ) >
+					$.mobile.getMaxScrollForTransition();
+
+			this.toggleViewportClass();
+
+			if ( this.$from && !none ) {
+				this.startOut( screenHeight, reverseClass, none );
+			} else {
+				this.doneOut( screenHeight, reverseClass, none, true );
+			}
+
+			return this.deferred.promise();
+		}
+	});
+})( jQuery, this );
+
+
+(function( $ ) {
+
+	$.mobile.SerialTransition = function() {
+		this.init.apply(this, arguments);
+	};
+
+	$.extend($.mobile.SerialTransition.prototype, $.mobile.Transition.prototype, {
+		sequential: true,
+
+		beforeDoneOut: function() {
+			if ( this.$from ) {
+				this.cleanFrom();
+			}
+		},
+
+		beforeStartOut: function( screenHeight, reverseClass, none ) {
+			this.$from.animationComplete($.proxy(function() {
+				this.doneOut( screenHeight, reverseClass, none );
+			}, this ));
+		}
+	});
+
+})( jQuery );
+
+
+(function( $ ) {
+
+	$.mobile.ConcurrentTransition = function() {
+		this.init.apply(this, arguments);
+	};
+
+	$.extend($.mobile.ConcurrentTransition.prototype, $.mobile.Transition.prototype, {
+		sequential: false,
+
+		beforeDoneIn: function() {
+			if ( this.$from ) {
+				this.cleanFrom();
+			}
+		},
+
+		beforeStartOut: function( screenHeight, reverseClass, none ) {
+			this.doneOut( screenHeight, reverseClass, none );
+		}
+	});
+
+})( jQuery );
+
+
+(function( $ ) {
+
+	// generate the handlers from the above
+	var defaultGetMaxScrollForTransition = function() {
+		return $.mobile.getScreenHeight() * 3;
+	};
+
+	//transition handler dictionary for 3rd party transitions
+	$.mobile.transitionHandlers = {
+		"sequential": $.mobile.SerialTransition,
+		"simultaneous": $.mobile.ConcurrentTransition
+	};
+
+	// Make our transition handler the public default.
+	$.mobile.defaultTransitionHandler = $.mobile.transitionHandlers.sequential;
+
+	$.mobile.transitionFallbacks = {};
+
+	// If transition is defined, check if css 3D transforms are supported, and if not, if a fallback is specified
+	$.mobile._maybeDegradeTransition = function( transition ) {
+		if ( transition && !$.support.cssTransform3d && $.mobile.transitionFallbacks[ transition ] ) {
+			transition = $.mobile.transitionFallbacks[ transition ];
+		}
+
+		return transition;
+	};
+
+	// Set the getMaxScrollForTransition to default if no implementation was set by user
+	$.mobile.getMaxScrollForTransition = $.mobile.getMaxScrollForTransition || defaultGetMaxScrollForTransition;
+
+})( jQuery );
+
+/*
+* fallback transition for flip in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.flip = "fade";
+
+})( jQuery, this );
+
+/*
+* fallback transition for flow in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.flow = "fade";
+
+})( jQuery, this );
+
+/*
+* fallback transition for pop in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.pop = "fade";
+
+})( jQuery, this );
+
+/*
+* fallback transition for slide in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+// Use the simultaneous transitions handler for slide transitions
+$.mobile.transitionHandlers.slide = $.mobile.transitionHandlers.simultaneous;
+
+// Set the slide transitions's fallback to "fade"
+$.mobile.transitionFallbacks.slide = "fade";
+
+})( jQuery, this );
+
+/*
+* fallback transition for slidedown in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.slidedown = "fade";
+
+})( jQuery, this );
+
+/*
+* fallback transition for slidefade in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+// Set the slide transitions's fallback to "fade"
+$.mobile.transitionFallbacks.slidefade = "fade";
+
+})( jQuery, this );
+
+/*
+* fallback transition for slideup in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.slideup = "fade";
+
+})( jQuery, this );
+
+/*
+* fallback transition for turn in non-3D supporting browsers (which tend to handle complex transitions poorly in general
+*/
+
+(function( $, window, undefined ) {
+
+$.mobile.transitionFallbacks.turn = "fade";
+
+})( jQuery, this );
+
+
+(function( $, undefined ) {
+
+$.mobile.degradeInputs = {
+	color: false,
+	date: false,
+	datetime: false,
+	"datetime-local": false,
+	email: false,
+	month: false,
+	number: false,
+	range: "number",
+	search: "text",
+	tel: false,
+	time: false,
+	url: false,
+	week: false
+};
+// Backcompat remove in 1.5
+$.mobile.page.prototype.options.degradeInputs = $.mobile.degradeInputs;
+
+// Auto self-init widgets
+$.mobile.degradeInputsWithin = function( target ) {
+
+	target = $( target );
+
+	// Degrade inputs to avoid poorly implemented native functionality
+	target.find( "input" ).not( $.mobile.page.prototype.keepNativeSelector() ).each(function() {
+		var element = $( this ),
+			type = this.getAttribute( "type" ),
+			optType = $.mobile.degradeInputs[ type ] || "text",
+			html, hasType, findstr, repstr;
+
+		if ( $.mobile.degradeInputs[ type ] ) {
+			html = $( "<div>" ).html( element.clone() ).html();
+			// In IE browsers, the type sometimes doesn't exist in the cloned markup, so we replace the closing tag instead
+			hasType = html.indexOf( " type=" ) > -1;
+			findstr = hasType ? /\s+type=["']?\w+['"]?/ : /\/?>/;
+			repstr = " type=\"" + optType + "\" data-" + $.mobile.ns + "type=\"" + type + "\"" + ( hasType ? "" : ">" );
+
+			element.replaceWith( html.replace( findstr, repstr ) );
+		}
+	});
+
+};
+
+})( jQuery );
+
+(function( $, window, undefined ) {
+
+$.widget( "mobile.page", $.mobile.page, {
+	options: {
+
+		// Accepts left, right and none
+		closeBtn: "left",
+		closeBtnText: "Close",
+		overlayTheme: "a",
+		corners: true,
+		dialog: false
+	},
+
+	_create: function() {
+		this._super();
+		if ( this.options.dialog ) {
+
+			$.extend( this, {
+				_inner: this.element.children(),
+				_headerCloseButton: null
+			});
+
+			if ( !this.options.enhanced ) {
+				this._setCloseBtn( this.options.closeBtn );
+			}
+		}
+	},
+
+	_enhance: function() {
+		this._super();
+
+		// Class the markup for dialog styling and wrap interior
+		if ( this.options.dialog ) {
+			this.element.addClass( "ui-dialog" )
+				.wrapInner( $( "<div/>", {
+
+					// ARIA role
+					"role" : "dialog",
+					"class" : "ui-dialog-contain ui-overlay-shadow" +
+						( this.options.corners ? " ui-corner-all" : "" )
+				}));
+		}
+	},
+
+	_setOptions: function( options ) {
+		var closeButtonLocation, closeButtonText,
+			currentOpts = this.options;
+
+		if ( options.corners !== undefined ) {
+			this._inner.toggleClass( "ui-corner-all", !!options.corners );
+		}
+
+		if ( options.overlayTheme !== undefined ) {
+			if ( $.mobile.activePage[ 0 ] === this.element[ 0 ] ) {
+				currentOpts.overlayTheme = options.overlayTheme;
+				this._handlePageBeforeShow();
+			}
+		}
+
+		if ( options.closeBtnText !== undefined ) {
+			closeButtonLocation = currentOpts.closeBtn;
+			closeButtonText = options.closeBtnText;
+		}
+
+		if ( options.closeBtn !== undefined ) {
+			closeButtonLocation = options.closeBtn;
+		}
+
+		if ( closeButtonLocation ) {
+			this._setCloseBtn( closeButtonLocation, closeButtonText );
+		}
+
+		this._super( options );
+	},
+
+	_handlePageBeforeShow: function () {
+		if ( this.options.overlayTheme && this.options.dialog ) {
+			this.removeContainerBackground();
+			this.setContainerBackground( this.options.overlayTheme );
+		} else {
+			this._super();
+		}
+	},
+
+	_setCloseBtn: function( location, text ) {
+		var dst,
+			btn = this._headerCloseButton;
+
+		// Sanitize value
+		location = "left" === location ? "left" : "right" === location ? "right" : "none";
+
+		if ( "none" === location ) {
+			if ( btn ) {
+				btn.remove();
+				btn = null;
+			}
+		} else if ( btn ) {
+			btn.removeClass( "ui-btn-left ui-btn-right" ).addClass( "ui-btn-" + location );
+			if ( text ) {
+				btn.text( text );
+			}
+		} else {
+			dst = this._inner.find( ":jqmData(role='header')" ).first();
+			btn = $( "<a></a>", {
+					"href": "#",
+					"class": "ui-btn ui-corner-all ui-icon-delete ui-btn-icon-notext ui-btn-" + location
+				})
+				.attr( "data-" + $.mobile.ns + "rel", "back" )
+				.text( text || this.options.closeBtnText || "" )
+				.prependTo( dst );
+		}
+
+		this._headerCloseButton = btn;
+	}
+});
+
+})( jQuery, this );
+
+(function( $, window, undefined ) {
+
+$.widget( "mobile.dialog", {
+	options: {
+
+		// Accepts left, right and none
+		closeBtn: "left",
+		closeBtnText: "Close",
+		overlayTheme: "a",
+		corners: true
+	},
+
+	// Override the theme set by the page plugin on pageshow
+	_handlePageBeforeShow: function() {
+		this._isCloseable = true;
+		if ( this.options.overlayTheme ) {
+			this.element
+				.page( "removeContainerBackground" )
+				.page( "setContainerBackground", this.options.overlayTheme );
+		}
+	},
+
+	_handlePageBeforeHide: function() {
+		this._isCloseable = false;
+	},
+
+	// click and submit events:
+	// - clicks and submits should use the closing transition that the dialog
+	//   opened with unless a data-transition is specified on the link/form
+	// - if the click was on the close button, or the link has a data-rel="back"
+	//   it'll go back in history naturally
+	_handleVClickSubmit: function( event ) {
+		var attrs,
+			$target = $( event.target ).closest( event.type === "vclick" ? "a" : "form" );
+
+		if ( $target.length && !$target.jqmData( "transition" ) ) {
+			attrs = {};
+			attrs[ "data-" + $.mobile.ns + "transition" ] =
+				( $.mobile.navigate.history.getActive() || {} )[ "transition" ] ||
+				$.mobile.defaultDialogTransition;
+			attrs[ "data-" + $.mobile.ns + "direction" ] = "reverse";
+			$target.attr( attrs );
+		}
+	},
+
+	_create: function() {
+		var elem = this.element,
+			opts = this.options;
+
+		// Class the markup for dialog styling and wrap interior
+		elem.addClass( "ui-dialog" )
+			.wrapInner( $( "<div/>", {
+
+				// ARIA role
+				"role" : "dialog",
+				"class" : "ui-dialog-contain ui-overlay-shadow" +
+					( !!opts.corners ? " ui-corner-all" : "" )
+			}));
+
+		$.extend( this, {
+			_isCloseable: false,
+			_inner: elem.children(),
+			_headerCloseButton: null
+		});
+
+		this._on( elem, {
+			vclick: "_handleVClickSubmit",
+			submit: "_handleVClickSubmit",
+			pagebeforeshow: "_handlePageBeforeShow",
+			pagebeforehide: "_handlePageBeforeHide"
+		});
+
+		this._setCloseBtn( opts.closeBtn );
+	},
+
+	_setOptions: function( options ) {
+		var closeButtonLocation, closeButtonText,
+			currentOpts = this.options;
+
+		if ( options.corners !== undefined ) {
+			this._inner.toggleClass( "ui-corner-all", !!options.corners );
+		}
+
+		if ( options.overlayTheme !== undefined ) {
+			if ( $.mobile.activePage[ 0 ] === this.element[ 0 ] ) {
+				currentOpts.overlayTheme = options.overlayTheme;
+				this._handlePageBeforeShow();
+			}
+		}
+
+		if ( options.closeBtnText !== undefined ) {
+			closeButtonLocation = currentOpts.closeBtn;
+			closeButtonText = options.closeBtnText;
+		}
+
+		if ( options.closeBtn !== undefined ) {
+			closeButtonLocation = options.closeBtn;
+		}
+
+		if ( closeButtonLocation ) {
+			this._setCloseBtn( closeButtonLocation, closeButtonText );
+		}
+
+		this._super( options );
+	},
+
+	_setCloseBtn: function( location, text ) {
+		var dst,
+			btn = this._headerCloseButton;
+
+		// Sanitize value
+		location = "left" === location ? "left" : "right" === location ? "right" : "none";
+
+		if ( "none" === location ) {
+			if ( btn ) {
+				btn.remove();
+				btn = null;
+			}
+		} else if ( btn ) {
+			btn.removeClass( "ui-btn-left ui-btn-right" ).addClass( "ui-btn-" + location );
+			if ( text ) {
+				btn.text( text );
+			}
+		} else {
+			dst = this._inner.find( ":jqmData(role='header')" ).first();
+			btn = $( "<a></a>", {
+					"role": "button",
+					"href": "#",
+					"class": "ui-btn ui-corner-all ui-icon-delete ui-btn-icon-notext ui-btn-" + location
+				})
+				.text( text || this.options.closeBtnText || "" )
+				.prependTo( dst );
+			this._on( btn, { click: "close" } );
+		}
+
+		this._headerCloseButton = btn;
+	},
+
+	// Close method goes back in history
+	close: function() {
+		var hist = $.mobile.navigate.history;
+
+		if ( this._isCloseable ) {
+			this._isCloseable = false;
+			// If the hash listening is enabled and there is at least one preceding history
+			// entry it's ok to go back. Initial pages with the dialog hash state are an example
+			// where the stack check is necessary
+			if ( $.mobile.hashListeningEnabled && hist.activeIndex > 0 ) {
+				$.mobile.back();
+			} else {
+				$.mobile.pageContainer.pagecontainer( "back" );
+			}
+		}
+	}
+});
+
+})( jQuery, this );
+
+(function( $, undefined ) {
+
+var rInitialLetter = /([A-Z])/g,
+
+	// Construct iconpos class from iconpos value
+	iconposClass = function( iconpos ) {
+		return ( "ui-btn-icon-" + ( iconpos === null ? "left" : iconpos ) );
+	};
+
+$.widget( "mobile.collapsible", {
+	options: {
+		enhanced: false,
+		expandCueText: null,
+		collapseCueText: null,
+		collapsed: true,
+		heading: "h1,h2,h3,h4,h5,h6,legend",
+		collapsedIcon: null,
+		expandedIcon: null,
+		iconpos: null,
+		theme: null,
+		contentTheme: null,
+		inset: null,
+		corners: null,
+		mini: null
+	},
+
+	_create: function() {
+		var elem = this.element,
+			ui = {
+				accordion: elem
+					.closest( ":jqmData(role='collapsible-set')," +
+						":jqmData(role='collapsibleset')" +
+						( $.mobile.collapsibleset ? ", :mobile-collapsibleset" :
+							"" ) )
+					.addClass( "ui-collapsible-set" )
+			};
+
+		this._ui = ui;
+		this._renderedOptions = this._getOptions( this.options );
+
+		if ( this.options.enhanced ) {
+			ui.heading = $( ".ui-collapsible-heading", this.element[ 0 ] );
+			ui.content = ui.heading.next();
+			ui.anchor = $( "a", ui.heading[ 0 ] ).first();
+			ui.status = ui.anchor.children( ".ui-collapsible-heading-status" );
+		} else {
+			this._enhance( elem, ui );
+		}
+
+		this._on( ui.heading, {
+			"tap": function() {
+				ui.heading.find( "a" ).first().addClass( $.mobile.activeBtnClass );
+			},
+
+			"click": function( event ) {
+				this._handleExpandCollapse( !ui.heading.hasClass( "ui-collapsible-heading-collapsed" ) );
+				event.preventDefault();
+				event.stopPropagation();
+			}
+		});
+	},
+
+	// Adjust the keys inside options for inherited values
+	_getOptions: function( options ) {
+		var key,
+			accordion = this._ui.accordion,
+			accordionWidget = this._ui.accordionWidget;
+
+		// Copy options
+		options = $.extend( {}, options );
+
+		if ( accordion.length && !accordionWidget ) {
+			this._ui.accordionWidget =
+			accordionWidget = accordion.data( "mobile-collapsibleset" );
+		}
+
+		for ( key in options ) {
+
+			// Retrieve the option value first from the options object passed in and, if
+			// null, from the parent accordion or, if that's null too, or if there's no
+			// parent accordion, then from the defaults.
+			options[ key ] =
+				( options[ key ] != null ) ? options[ key ] :
+				( accordionWidget ) ? accordionWidget.options[ key ] :
+				accordion.length ? $.mobile.getAttribute( accordion[ 0 ],
+					key.replace( rInitialLetter, "-$1" ).toLowerCase() ):
+				null;
+
+			if ( null == options[ key ] ) {
+				options[ key ] = $.mobile.collapsible.defaults[ key ];
+			}
+		}
+
+		return options;
+	},
+
+	_themeClassFromOption: function( prefix, value ) {
+		return ( value ? ( value === "none" ? "" : prefix + value ) : "" );
+	},
+
+	_enhance: function( elem, ui ) {
+		var iconclass,
+			opts = this._renderedOptions,
+			contentThemeClass = this._themeClassFromOption( "ui-body-", opts.contentTheme );
+
+		elem.addClass( "ui-collapsible " +
+			( opts.inset ? "ui-collapsible-inset " : "" ) +
+			( opts.inset && opts.corners ? "ui-corner-all " : "" ) +
+			( contentThemeClass ? "ui-collapsible-themed-content " : "" ) );
+		ui.originalHeading = elem.children( this.options.heading ).first(),
+		ui.content = elem
+			.wrapInner( "<div " +
+				"class='ui-collapsible-content " +
+				contentThemeClass + "'></div>" )
+			.children( ".ui-collapsible-content" ),
+		ui.heading = ui.originalHeading;
+
+		// Replace collapsibleHeading if it's a legend
+		if ( ui.heading.is( "legend" ) ) {
+			ui.heading = $( "<div role='heading'>"+ ui.heading.html() +"</div>" );
+			ui.placeholder = $( "<div><!-- placeholder for legend --></div>" ).insertBefore( ui.originalHeading );
+			ui.originalHeading.remove();
+		}
+
+		iconclass = ( opts.collapsed ? ( opts.collapsedIcon ? "ui-icon-" + opts.collapsedIcon : "" ):
+			( opts.expandedIcon ? "ui-icon-" + opts.expandedIcon : "" ) );
+
+		ui.status = $( "<span class='ui-collapsible-heading-status'></span>" );
+		ui.anchor = ui.heading
+			.detach()
+			//modify markup & attributes
+			.addClass( "ui-collapsible-heading" )
+			.append( ui.status )
+			.wrapInner( "<a href='#' class='ui-collapsible-heading-toggle'></a>" )
+			.find( "a" )
+				.first()
+				.addClass( "ui-btn " +
+					( iconclass ? iconclass + " " : "" ) +
+					( iconclass ? iconposClass( opts.iconpos ) +
+						" " : "" ) +
+					this._themeClassFromOption( "ui-btn-", opts.theme ) + " " +
+					( opts.mini ? "ui-mini " : "" ) );
+
+		//drop heading in before content
+		ui.heading.insertBefore( ui.content );
+
+		this._handleExpandCollapse( this.options.collapsed );
+
+		return ui;
+	},
+
+	refresh: function() {
+		this._applyOptions( this.options );
+		this._renderedOptions = this._getOptions( this.options );
+	},
+
+	_applyOptions: function( options ) {
+		var isCollapsed, newTheme, oldTheme, hasCorners, hasIcon,
+			elem = this.element,
+			currentOpts = this._renderedOptions,
+			ui = this._ui,
+			anchor = ui.anchor,
+			status = ui.status,
+			opts = this._getOptions( options );
+
+		// First and foremost we need to make sure the collapsible is in the proper
+		// state, in case somebody decided to change the collapsed option at the
+		// same time as another option
+		if ( options.collapsed !== undefined ) {
+			this._handleExpandCollapse( options.collapsed );
+		}
+
+		isCollapsed = elem.hasClass( "ui-collapsible-collapsed" );
+
+		// We only need to apply the cue text for the current state right away.
+		// The cue text for the alternate state will be stored in the options
+		// and applied the next time the collapsible's state is toggled
+		if ( isCollapsed ) {
+			if ( opts.expandCueText !== undefined ) {
+				status.text( opts.expandCueText );
+			}
+		} else {
+			if ( opts.collapseCueText !== undefined ) {
+				status.text( opts.collapseCueText );
+			}
+		}
+
+		// Update icon
+
+		// Is it supposed to have an icon?
+		hasIcon =
+
+			// If the collapsedIcon is being set, consult that
+			( opts.collapsedIcon !== undefined ? opts.collapsedIcon !== false :
+
+				// Otherwise consult the existing option value
+				currentOpts.collapsedIcon !== false );
+
+
+		// If any icon-related options have changed, make sure the new icon
+		// state is reflected by first removing all icon-related classes
+		// reflecting the current state and then adding all icon-related
+		// classes for the new state
+		if ( !( opts.iconpos === undefined &&
+			opts.collapsedIcon === undefined &&
+			opts.expandedIcon === undefined ) ) {
+
+			// Remove all current icon-related classes
+			anchor.removeClass( [ iconposClass( currentOpts.iconpos ) ]
+				.concat( ( currentOpts.expandedIcon ?
+					[ "ui-icon-" + currentOpts.expandedIcon ] : [] ) )
+				.concat( ( currentOpts.collapsedIcon ?
+					[ "ui-icon-" + currentOpts.collapsedIcon ] : [] ) )
+				.join( " " ) );
+
+			// Add new classes if an icon is supposed to be present
+			if ( hasIcon ) {
+				anchor.addClass(
+					[ iconposClass( opts.iconpos !== undefined ?
+						opts.iconpos : currentOpts.iconpos ) ]
+						.concat( isCollapsed ?
+							[ "ui-icon-" + ( opts.collapsedIcon !== undefined ?
+								opts.collapsedIcon :
+								currentOpts.collapsedIcon ) ] :
+							[ "ui-icon-" + ( opts.expandedIcon !== undefined ?
+								opts.expandedIcon :
+								currentOpts.expandedIcon ) ] )
+						.join( " " ) );
+			}
+		}
+
+		if ( opts.theme !== undefined ) {
+			oldTheme = this._themeClassFromOption( "ui-btn-", currentOpts.theme );
+			newTheme = this._themeClassFromOption( "ui-btn-", opts.theme );
+			anchor.removeClass( oldTheme ).addClass( newTheme );
+		}
+
+		if ( opts.contentTheme !== undefined ) {
+			oldTheme = this._themeClassFromOption( "ui-body-",
+				currentOpts.contentTheme );
+			newTheme = this._themeClassFromOption( "ui-body-",
+				opts.contentTheme );
+			ui.content.removeClass( oldTheme ).addClass( newTheme );
+		}
+
+		if ( opts.inset !== undefined ) {
+			elem.toggleClass( "ui-collapsible-inset", opts.inset );
+			hasCorners = !!( opts.inset && ( opts.corners || currentOpts.corners ) );
+		}
+
+		if ( opts.corners !== undefined ) {
+			hasCorners = !!( opts.corners && ( opts.inset || currentOpts.inset ) );
+		}
+
+		if ( hasCorners !== undefined ) {
+			elem.toggleClass( "ui-corner-all", hasCorners );
+		}
+
+		if ( opts.mini !== undefined ) {
+			anchor.toggleClass( "ui-mini", opts.mini );
+		}
+	},
+
+	_setOptions: function( options ) {
+		this._applyOptions( options );
+		this._super( options );
+		this._renderedOptions = this._getOptions( this.options );
+	},
+
+	_handleExpandCollapse: function( isCollapse ) {
+		var opts = this._renderedOptions,
+			ui = this._ui;
+
+		ui.status.text( isCollapse ? opts.expandCueText : opts.collapseCueText );
+		ui.heading
+			.toggleClass( "ui-collapsible-heading-collapsed", isCollapse )
+			.find( "a" ).first()
+			.toggleClass( "ui-icon-" + opts.expandedIcon, !isCollapse )
+
+			// logic or cause same icon for expanded/collapsed state would remove the ui-icon-class
+			.toggleClass( "ui-icon-" + opts.collapsedIcon, ( isCollapse || opts.expandedIcon === opts.collapsedIcon ) )
+			.removeClass( $.mobile.activeBtnClass );
+
+		this.element.toggleClass( "ui-collapsible-collapsed", isCollapse );
+		ui.content
+			.toggleClass( "ui-collapsible-content-collapsed", isCollapse )
+			.attr( "aria-hidden", isCollapse )
+			.trigger( "updatelayout" );
+		this.options.collapsed = isCollapse;
+		this._trigger( isCollapse ? "collapse" : "expand" );
+	},
+
+	expand: function() {
+		this._handleExpandCollapse( false );
+	},
+
+	collapse: function() {
+		this._handleExpandCollapse( true );
+	},
+
+	_destroy: function() {
+		var ui = this._ui,
+			opts = this.options;
+
+		if ( opts.enhanced ) {
+			return;
+		}
+
+		if ( ui.placeholder ) {
+			ui.originalHeading.insertBefore( ui.placeholder );
+			ui.placeholder.remove();
+			ui.heading.remove();
+		} else {
+			ui.status.remove();
+			ui.heading
+				.removeClass( "ui-collapsible-heading ui-collapsible-heading-collapsed" )
+				.children()
+					.contents()
+						.unwrap();
+		}
+
+		ui.anchor.contents().unwrap();
+		ui.content.contents().unwrap();
+		this.element
+			.removeClass( "ui-collapsible ui-collapsible-collapsed " +
+				"ui-collapsible-themed-content ui-collapsible-inset ui-corner-all" );
+	}
+});
+
+// Defaults to be used by all instances of collapsible if per-instance values
+// are unset or if nothing is specified by way of inheritance from an accordion.
+// Note that this hash does not contain options "collapsed" or "heading",
+// because those are not inheritable.
+$.mobile.collapsible.defaults = {
+	expandCueText: " click to expand contents",
+	collapseCueText: " click to collapse contents",
+	collapsedIcon: "plus",
+	contentTheme: "inherit",
+	expandedIcon: "minus",
+	iconpos: "left",
+	inset: true,
+	corners: true,
+	theme: "inherit",
+	mini: false
+};
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.behaviors.addFirstLastClasses = {
+	_getVisibles: function( $els, create ) {
+		var visibles;
+
+		if ( create ) {
+			visibles = $els.not( ".ui-screen-hidden" );
+		} else {
+			visibles = $els.filter( ":visible" );
+			if ( visibles.length === 0 ) {
+				visibles = $els.not( ".ui-screen-hidden" );
+			}
+		}
+
+		return visibles;
+	},
+
+	_addFirstLastClasses: function( $els, $visibles, create ) {
+		$els.removeClass( "ui-first-child ui-last-child" );
+		$visibles.eq( 0 ).addClass( "ui-first-child" ).end().last().addClass( "ui-last-child" );
+		if ( !create ) {
+			this.element.trigger( "updatelayout" );
+		}
+	},
+
+	_removeFirstLastClasses: function( $els ) {
+		$els.removeClass( "ui-first-child ui-last-child" );
+	}
+};
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+var childCollapsiblesSelector = ":mobile-collapsible, " + $.mobile.collapsible.initSelector;
+
+$.widget( "mobile.collapsibleset", $.extend( {
+
+	// The initSelector is deprecated as of 1.4.0. In 1.5.0 we will use
+	// :jqmData(role='collapsibleset') which will allow us to get rid of the line
+	// below altogether, because the autoinit will generate such an initSelector
+	initSelector: ":jqmData(role='collapsible-set'),:jqmData(role='collapsibleset')",
+
+	options: $.extend( {
+		enhanced: false
+	}, $.mobile.collapsible.defaults ),
+
+	_handleCollapsibleExpand: function( event ) {
+		var closestCollapsible = $( event.target ).closest( ".ui-collapsible" );
+
+		if ( closestCollapsible.parent().is( ":mobile-collapsibleset, :jqmData(role='collapsible-set')" ) ) {
+			closestCollapsible
+				.siblings( ".ui-collapsible:not(.ui-collapsible-collapsed)" )
+				.collapsible( "collapse" );
+		}
+	},
+
+	_create: function() {
+		var elem = this.element,
+			opts = this.options;
+
+		$.extend( this, {
+			_classes: ""
+		});
+
+		if ( !opts.enhanced ) {
+			elem.addClass( "ui-collapsible-set " +
+				this._themeClassFromOption( "ui-group-theme-", opts.theme ) + " " +
+				( opts.corners && opts.inset ? "ui-corner-all " : "" ) );
+			this.element.find( $.mobile.collapsible.initSelector ).collapsible();
+		}
+
+		this._on( elem, { collapsibleexpand: "_handleCollapsibleExpand" } );
+	},
+
+	_themeClassFromOption: function( prefix, value ) {
+		return ( value ? ( value === "none" ? "" : prefix + value ) : "" );
+	},
+
+	_init: function() {
+		this._refresh( true );
+
+		// Because the corners are handled by the collapsible itself and the default state is collapsed
+		// That was causing https://github.com/jquery/jquery-mobile/issues/4116
+		this.element
+			.children( childCollapsiblesSelector )
+			.filter( ":jqmData(collapsed='false')" )
+			.collapsible( "expand" );
+	},
+
+	_setOptions: function( options ) {
+		var ret, hasCorners,
+			elem = this.element,
+			themeClass = this._themeClassFromOption( "ui-group-theme-", options.theme );
+
+		if ( themeClass ) {
+			elem
+				.removeClass( this._themeClassFromOption( "ui-group-theme-", this.options.theme ) )
+				.addClass( themeClass );
+		}
+
+		if ( options.inset !== undefined ) {
+			hasCorners = !!( options.inset && ( options.corners || this.options.corners ) );
+		}
+
+		if ( options.corners !== undefined ) {
+			hasCorners = !!( options.corners && ( options.inset || this.options.inset ) );
+		}
+
+		if ( hasCorners !== undefined ) {
+			elem.toggleClass( "ui-corner-all", hasCorners );
+		}
+
+		ret = this._super( options );
+		this.element.children( ":mobile-collapsible" ).collapsible( "refresh" );
+		return ret;
+	},
+
+	_destroy: function() {
+		var el = this.element;
+
+		this._removeFirstLastClasses( el.children( childCollapsiblesSelector ) );
+		el
+			.removeClass( "ui-collapsible-set ui-corner-all " +
+				this._themeClassFromOption( "ui-group-theme-", this.options.theme ) )
+			.children( ":mobile-collapsible" )
+			.collapsible( "destroy" );
+	},
+
+	_refresh: function( create ) {
+		var collapsiblesInSet = this.element.children( childCollapsiblesSelector );
+
+		this.element.find( $.mobile.collapsible.initSelector ).not( ".ui-collapsible" ).collapsible();
+
+		this._addFirstLastClasses( collapsiblesInSet, this._getVisibles( collapsiblesInSet, create ), create );
+	},
+
+	refresh: function() {
+		this._refresh( false );
+	}
+}, $.mobile.behaviors.addFirstLastClasses ) );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+// Deprecated in 1.4
+$.fn.fieldcontain = function(/* options */) {
+	return this.addClass( "ui-field-contain" );
+};
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.fn.grid = function( options ) {
+	return this.each(function() {
+
+		var $this = $( this ),
+			o = $.extend({
+				grid: null
+			}, options ),
+			$kids = $this.children(),
+			gridCols = { solo:1, a:2, b:3, c:4, d:5 },
+			grid = o.grid,
+			iterator,
+			letter;
+
+			if ( !grid ) {
+				if ( $kids.length <= 5 ) {
+					for ( letter in gridCols ) {
+						if ( gridCols[ letter ] === $kids.length ) {
+							grid = letter;
+						}
+					}
+				} else {
+					grid = "a";
+					$this.addClass( "ui-grid-duo" );
+				}
+			}
+			iterator = gridCols[grid];
+
+		$this.addClass( "ui-grid-" + grid );
+
+		$kids.filter( ":nth-child(" + iterator + "n+1)" ).addClass( "ui-block-a" );
+
+		if ( iterator > 1 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+2)" ).addClass( "ui-block-b" );
+		}
+		if ( iterator > 2 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+3)" ).addClass( "ui-block-c" );
+		}
+		if ( iterator > 3 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+4)" ).addClass( "ui-block-d" );
+		}
+		if ( iterator > 4 ) {
+			$kids.filter( ":nth-child(" + iterator + "n+5)" ).addClass( "ui-block-e" );
+		}
+	});
+};
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.navbar", {
+	options: {
+		iconpos: "top",
+		grid: null
+	},
+
+	_create: function() {
+
+		var $navbar = this.element,
+			$navbtns = $navbar.find( "a" ),
+			iconpos = $navbtns.filter( ":jqmData(icon)" ).length ? this.options.iconpos : undefined;
+
+		$navbar.addClass( "ui-navbar" )
+			.attr( "role", "navigation" )
+			.find( "ul" )
+			.jqmEnhanceable()
+			.grid({ grid: this.options.grid });
+
+		$navbtns
+			.each( function() {
+				var icon = $.mobile.getAttribute( this, "icon" ),
+					theme = $.mobile.getAttribute( this, "theme" ),
+					classes = "ui-btn";
+
+				if ( theme ) {
+					classes += " ui-btn-" + theme;
+				}
+				if ( icon ) {
+					classes += " ui-icon-" + icon + " ui-btn-icon-" + iconpos;
+				}
+				$( this ).addClass( classes );
+			});
+
+		$navbar.delegate( "a", "vclick", function( /* event */ ) {
+			var activeBtn = $( this );
+
+			if ( !( activeBtn.hasClass( "ui-state-disabled" ) ||
+
+				// DEPRECATED as of 1.4.0 - remove after 1.4.0 release
+				// only ui-state-disabled should be present thereafter
+				activeBtn.hasClass( "ui-disabled" ) ||
+				activeBtn.hasClass( $.mobile.activeBtnClass ) ) ) {
+
+				$navbtns.removeClass( $.mobile.activeBtnClass );
+				activeBtn.addClass( $.mobile.activeBtnClass );
+
+				// The code below is a workaround to fix #1181
+				$( document ).one( "pagehide", function() {
+					activeBtn.removeClass( $.mobile.activeBtnClass );
+				});
+			}
+		});
+
+		// Buttons in the navbar with ui-state-persist class should regain their active state before page show
+		$navbar.closest( ".ui-page" ).bind( "pagebeforeshow", function() {
+			$navbtns.filter( ".ui-state-persist" ).addClass( $.mobile.activeBtnClass );
+		});
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+var getAttr = $.mobile.getAttribute;
+
+$.widget( "mobile.listview", $.extend( {
+
+	options: {
+		theme: null,
+		countTheme: null, /* Deprecated in 1.4 */
+		dividerTheme: null,
+		icon: "carat-r",
+		splitIcon: "carat-r",
+		splitTheme: null,
+		corners: true,
+		shadow: true,
+		inset: false
+	},
+
+	_create: function() {
+		var t = this,
+			listviewClasses = "";
+
+		listviewClasses += t.options.inset ? " ui-listview-inset" : "";
+
+		if ( !!t.options.inset ) {
+			listviewClasses += t.options.corners ? " ui-corner-all" : "";
+			listviewClasses += t.options.shadow ? " ui-shadow" : "";
+		}
+
+		// create listview markup
+		t.element.addClass( " ui-listview" + listviewClasses );
+
+		t.refresh( true );
+	},
+
+	// TODO: Remove in 1.5
+	_findFirstElementByTagName: function( ele, nextProp, lcName, ucName ) {
+		var dict = {};
+		dict[ lcName ] = dict[ ucName ] = true;
+		while ( ele ) {
+			if ( dict[ ele.nodeName ] ) {
+				return ele;
+			}
+			ele = ele[ nextProp ];
+		}
+		return null;
+	},
+	// TODO: Remove in 1.5
+	_addThumbClasses: function( containers ) {
+		var i, img, len = containers.length;
+		for ( i = 0; i < len; i++ ) {
+			img = $( this._findFirstElementByTagName( containers[ i ].firstChild, "nextSibling", "img", "IMG" ) );
+			if ( img.length ) {
+				$( this._findFirstElementByTagName( img[ 0 ].parentNode, "parentNode", "li", "LI" ) ).addClass( img.hasClass( "ui-li-icon" ) ? "ui-li-has-icon" : "ui-li-has-thumb" );
+			}
+		}
+	},
+
+	_getChildrenByTagName: function( ele, lcName, ucName ) {
+		var results = [],
+			dict = {};
+		dict[ lcName ] = dict[ ucName ] = true;
+		ele = ele.firstChild;
+		while ( ele ) {
+			if ( dict[ ele.nodeName ] ) {
+				results.push( ele );
+			}
+			ele = ele.nextSibling;
+		}
+		return $( results );
+	},
+
+	_beforeListviewRefresh: $.noop,
+	_afterListviewRefresh: $.noop,
+
+	refresh: function( create ) {
+		var buttonClass, pos, numli, item, itemClass, itemTheme, itemIcon, icon, a,
+			isDivider, startCount, newStartCount, value, last, splittheme, splitThemeClass, spliticon,
+			altButtonClass, dividerTheme, li,
+			o = this.options,
+			$list = this.element,
+			ol = !!$.nodeName( $list[ 0 ], "ol" ),
+			start = $list.attr( "start" ),
+			itemClassDict = {},
+			countBubbles = $list.find( ".ui-li-count" ),
+			countTheme = getAttr( $list[ 0 ], "counttheme" ) || this.options.countTheme,
+			countThemeClass = countTheme ? "ui-body-" + countTheme : "ui-body-inherit";
+
+		if ( o.theme ) {
+			$list.addClass( "ui-group-theme-" + o.theme );
+		}
+
+		// Check if a start attribute has been set while taking a value of 0 into account
+		if ( ol && ( start || start === 0 ) ) {
+			startCount = parseInt( start, 10 ) - 1;
+			$list.css( "counter-reset", "listnumbering " + startCount );
+		}
+
+		this._beforeListviewRefresh();
+
+		li = this._getChildrenByTagName( $list[ 0 ], "li", "LI" );
+
+		for ( pos = 0, numli = li.length; pos < numli; pos++ ) {
+			item = li.eq( pos );
+			itemClass = "";
+
+			if ( create || item[ 0 ].className.search( /\bui-li-static\b|\bui-li-divider\b/ ) < 0 ) {
+				a = this._getChildrenByTagName( item[ 0 ], "a", "A" );
+				isDivider = ( getAttr( item[ 0 ], "role" ) === "list-divider" );
+				value = item.attr( "value" );
+				itemTheme = getAttr( item[ 0 ], "theme" );
+
+				if ( a.length && a[ 0 ].className.search( /\bui-btn\b/ ) < 0 && !isDivider ) {
+					itemIcon = getAttr( item[ 0 ], "icon" );
+					icon = ( itemIcon === false ) ? false : ( itemIcon || o.icon );
+
+					// TODO: Remove in 1.5 together with links.js (links.js / .ui-link deprecated in 1.4)
+					a.removeClass( "ui-link" );
+
+					buttonClass = "ui-btn";
+
+					if ( itemTheme ) {
+						buttonClass += " ui-btn-" + itemTheme;
+					}
+
+					if ( a.length > 1 ) {
+						itemClass = "ui-li-has-alt";
+
+						last = a.last();
+						splittheme = getAttr( last[ 0 ], "theme" ) || o.splitTheme || getAttr( item[ 0 ], "theme", true );
+						splitThemeClass = splittheme ? " ui-btn-" + splittheme : "";
+						spliticon = getAttr( last[ 0 ], "icon" ) || getAttr( item[ 0 ], "icon" ) || o.splitIcon;
+						altButtonClass = "ui-btn ui-btn-icon-notext ui-icon-" + spliticon + splitThemeClass;
+
+						last
+							.attr( "title", $.trim( last.getEncodedText() ) )
+							.addClass( altButtonClass )
+							.empty();
+					} else if ( icon ) {
+						buttonClass += " ui-btn-icon-right ui-icon-" + icon;
+					}
+
+					a.first().addClass( buttonClass );
+				} else if ( isDivider ) {
+					dividerTheme = ( getAttr( item[ 0 ], "theme" ) || o.dividerTheme || o.theme );
+
+					itemClass = "ui-li-divider ui-bar-" + ( dividerTheme ? dividerTheme : "inherit" );
+
+					item.attr( "role", "heading" );
+				} else if ( a.length <= 0 ) {
+					itemClass = "ui-li-static ui-body-" + ( itemTheme ? itemTheme : "inherit" );
+				}
+				if ( ol && value ) {
+					newStartCount = parseInt( value , 10 ) - 1;
+
+					item.css( "counter-reset", "listnumbering " + newStartCount );
+				}
+			}
+
+			// Instead of setting item class directly on the list item
+			// at this point in time, push the item into a dictionary
+			// that tells us what class to set on it so we can do this after this
+			// processing loop is finished.
+
+			if ( !itemClassDict[ itemClass ] ) {
+				itemClassDict[ itemClass ] = [];
+			}
+
+			itemClassDict[ itemClass ].push( item[ 0 ] );
+		}
+
+		// Set the appropriate listview item classes on each list item.
+		// The main reason we didn't do this
+		// in the for-loop above is because we can eliminate per-item function overhead
+		// by calling addClass() and children() once or twice afterwards. This
+		// can give us a significant boost on platforms like WP7.5.
+
+		for ( itemClass in itemClassDict ) {
+			$( itemClassDict[ itemClass ] ).addClass( itemClass );
+		}
+
+		countBubbles.each( function() {
+			$( this ).closest( "li" ).addClass( "ui-li-has-count" );
+		});
+		if ( countThemeClass ) {
+			countBubbles.addClass( countThemeClass );
+		}
+
+		// Deprecated in 1.4. From 1.5 you have to add class ui-li-has-thumb or ui-li-has-icon to the LI.
+		this._addThumbClasses( li );
+		this._addThumbClasses( li.find( ".ui-btn" ) );
+
+		this._afterListviewRefresh();
+
+		this._addFirstLastClasses( li, this._getVisibles( li, create ), create );
+	}
+}, $.mobile.behaviors.addFirstLastClasses ) );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+function defaultAutodividersSelector( elt ) {
+	// look for the text in the given element
+	var text = $.trim( elt.text() ) || null;
+
+	if ( !text ) {
+		return null;
+	}
+
+	// create the text for the divider (first uppercased letter)
+	text = text.slice( 0, 1 ).toUpperCase();
+
+	return text;
+}
+
+$.widget( "mobile.listview", $.mobile.listview, {
+	options: {
+		autodividers: false,
+		autodividersSelector: defaultAutodividersSelector
+	},
+
+	_beforeListviewRefresh: function() {
+		if ( this.options.autodividers ) {
+			this._replaceDividers();
+			this._superApply( arguments );
+		}
+	},
+
+	_replaceDividers: function() {
+		var i, lis, li, dividerText,
+			lastDividerText = null,
+			list = this.element,
+			divider;
+
+		list.children( "li:jqmData(role='list-divider')" ).remove();
+
+		lis = list.children( "li" );
+
+		for ( i = 0; i < lis.length ; i++ ) {
+			li = lis[ i ];
+			dividerText = this.options.autodividersSelector( $( li ) );
+
+			if ( dividerText && lastDividerText !== dividerText ) {
+				divider = document.createElement( "li" );
+				divider.appendChild( document.createTextNode( dividerText ) );
+				divider.setAttribute( "data-" + $.mobile.ns + "role", "list-divider" );
+				li.parentNode.insertBefore( divider, li );
+			}
+
+			lastDividerText = dividerText;
+		}
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+var rdivider = /(^|\s)ui-li-divider($|\s)/,
+	rhidden = /(^|\s)ui-screen-hidden($|\s)/;
+
+$.widget( "mobile.listview", $.mobile.listview, {
+	options: {
+		hideDividers: false
+	},
+
+	_afterListviewRefresh: function() {
+		var items, idx, item, hideDivider = true;
+
+		this._superApply( arguments );
+
+		if ( this.options.hideDividers ) {
+			items = this._getChildrenByTagName( this.element[ 0 ], "li", "LI" );
+			for ( idx = items.length - 1 ; idx > -1 ; idx-- ) {
+				item = items[ idx ];
+				if ( item.className.match( rdivider ) ) {
+					if ( hideDivider ) {
+						item.className = item.className + " ui-screen-hidden";
+					}
+					hideDivider = true;
+				} else {
+					if ( !item.className.match( rhidden ) ) {
+						hideDivider = false;
+					}
+				}
+			}
+		}
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.nojs = function( target ) {
+	$( ":jqmData(role='nojs')", target ).addClass( "ui-nojs" );
+};
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.behaviors.formReset = {
+	_handleFormReset: function() {
+		this._on( this.element.closest( "form" ), {
+			reset: function() {
+				this._delay( "_reset" );
+			}
+		});
+	}
+};
+
+})( jQuery );
+
+/*
+* "checkboxradio" plugin
+*/
+
+(function( $, undefined ) {
+
+var escapeId = $.mobile.path.hashToSelector;
+
+$.widget( "mobile.checkboxradio", $.extend( {
+
+	initSelector: "input:not( :jqmData(role='flipswitch' ) )[type='checkbox'],input[type='radio']:not( :jqmData(role='flipswitch' ))",
+
+	options: {
+		theme: "inherit",
+		mini: false,
+		wrapperClass: null,
+		enhanced: false,
+		iconpos: "left"
+
+	},
+	_create: function() {
+		var input = this.element,
+			o = this.options,
+			inheritAttr = function( input, dataAttr ) {
+				return input.jqmData( dataAttr ) ||
+					input.closest( "form, fieldset" ).jqmData( dataAttr );
+			},
+			// NOTE: Windows Phone could not find the label through a selector
+			// filter works though.
+			parentLabel = input.closest( "label" ),
+			label = parentLabel.length ? parentLabel :
+				input
+					.closest( "form, fieldset, :jqmData(role='page'), :jqmData(role='dialog')" )
+					.find( "label" )
+					.filter( "[for='" + escapeId( input[0].id ) + "']" )
+					.first(),
+			inputtype = input[0].type,
+			checkedClass = "ui-" + inputtype + "-on",
+			uncheckedClass = "ui-" + inputtype + "-off";
+
+		if ( inputtype !== "checkbox" && inputtype !== "radio" ) {
+			return;
+		}
+
+		if ( this.element[0].disabled ) {
+			this.options.disabled = true;
+		}
+
+		o.iconpos = inheritAttr( input, "iconpos" ) || label.attr( "data-" + $.mobile.ns + "iconpos" ) || o.iconpos,
+
+		// Establish options
+		o.mini = inheritAttr( input, "mini" ) || o.mini;
+
+		// Expose for other methods
+		$.extend( this, {
+			input: input,
+			label: label,
+			parentLabel: parentLabel,
+			inputtype: inputtype,
+			checkedClass: checkedClass,
+			uncheckedClass: uncheckedClass
+		});
+
+		if ( !this.options.enhanced ) {
+			this._enhance();
+		}
+
+		this._on( label, {
+			vmouseover: "_handleLabelVMouseOver",
+			vclick: "_handleLabelVClick"
+		});
+
+		this._on( input, {
+			vmousedown: "_cacheVals",
+			vclick: "_handleInputVClick",
+			focus: "_handleInputFocus",
+			blur: "_handleInputBlur"
+		});
+
+		this._handleFormReset();
+		this.refresh();
+	},
+
+	_enhance: function() {
+		this.label.addClass( "ui-btn ui-corner-all");
+
+		if ( this.parentLabel.length > 0 ) {
+			this.input.add( this.label ).wrapAll( this._wrapper() );
+		} else {
+			//this.element.replaceWith( this.input.add( this.label ).wrapAll( this._wrapper() ) );
+			this.element.wrap( this._wrapper() );
+			this.element.parent().prepend( this.label );
+		}
+
+		// Wrap the input + label in a div
+
+		this._setOptions({
+			"theme": this.options.theme,
+			"iconpos": this.options.iconpos,
+			"mini": this.options.mini
+		});
+
+	},
+
+	_wrapper: function() {
+		return $( "<div class='"  +
+			( this.options.wrapperClass ? this.options.wrapperClass : "" ) +
+			" ui-" + this.inputtype +
+			( this.options.disabled ? " ui-state-disabled" : "" ) + "' ></div>" );
+	},
+
+	_handleInputFocus: function() {
+		this.label.addClass( $.mobile.focusClass );
+	},
+
+	_handleInputBlur: function() {
+		this.label.removeClass( $.mobile.focusClass );
+	},
+
+	_handleInputVClick: function() {
+		// Adds checked attribute to checked input when keyboard is used
+		this.element.prop( "checked", this.element.is( ":checked" ) );
+		this._getInputSet().not( this.element ).prop( "checked", false );
+		this._updateAll();
+	},
+
+	_handleLabelVMouseOver: function( event ) {
+		if ( this.label.parent().hasClass( "ui-state-disabled" ) ) {
+			event.stopPropagation();
+		}
+	},
+
+	_handleLabelVClick: function( event ) {
+		var input = this.element;
+
+		if ( input.is( ":disabled" ) ) {
+			event.preventDefault();
+			return;
+		}
+
+		this._cacheVals();
+
+		input.prop( "checked", this.inputtype === "radio" && true || !input.prop( "checked" ) );
+
+		// trigger click handler's bound directly to the input as a substitute for
+		// how label clicks behave normally in the browsers
+		// TODO: it would be nice to let the browser's handle the clicks and pass them
+		//       through to the associate input. we can swallow that click at the parent
+		//       wrapper element level
+		input.triggerHandler( "click" );
+
+		// Input set for common radio buttons will contain all the radio
+		// buttons, but will not for checkboxes. clearing the checked status
+		// of other radios ensures the active button state is applied properly
+		this._getInputSet().not( input ).prop( "checked", false );
+
+		this._updateAll();
+		return false;
+	},
+
+	_cacheVals: function() {
+		this._getInputSet().each( function() {
+			$( this ).attr("data-" + $.mobile.ns + "cacheVal", this.checked );
+		});
+	},
+
+	// Returns those radio buttons that are supposed to be in the same group as
+	// this radio button. In the case of a checkbox or a radio lacking a name
+	// attribute, it returns this.element.
+	_getInputSet: function() {
+		var selector, formId,
+			radio = this.element[ 0 ],
+			name = radio.name,
+			form = radio.form,
+			doc = this.element.parents().last().get( 0 ),
+
+			// A radio is always a member of its own group
+			radios = this.element;
+
+		// Only start running selectors if this is an attached radio button with a name
+		if ( name && this.inputtype === "radio" && doc ) {
+			selector = "input[type='radio'][name='" + escapeId( name ) + "']";
+
+			// If we're inside a form
+			if ( form ) {
+				formId = form.id;
+
+				// If the form has an ID, collect radios scattered throught the document which
+				// nevertheless are part of the form by way of the value of their form attribute
+				if ( formId ) {
+					radios = $( selector + "[form='" + escapeId( formId ) + "']", doc );
+				}
+
+				// Also add to those the radios in the form itself
+				radios = $( form ).find( selector ).filter( function() {
+
+					// Some radios inside the form may belong to some other form by virtue of
+					// having a form attribute defined on them, so we must filter them out here
+					return ( this.form === form );
+				}).add( radios );
+
+			// If we're outside a form
+			} else {
+
+				// Collect all those radios which are also outside of a form and match our name
+				radios = $( selector, doc ).filter( function() {
+					return !this.form;
+				});
+			}
+		}
+		return radios;
+	},
+
+	_updateAll: function() {
+		var self = this;
+
+		this._getInputSet().each( function() {
+			var $this = $( this );
+
+			if ( this.checked || self.inputtype === "checkbox" ) {
+				$this.trigger( "change" );
+			}
+		})
+		.checkboxradio( "refresh" );
+	},
+
+	_reset: function() {
+		this.refresh();
+	},
+
+	// Is the widget supposed to display an icon?
+	_hasIcon: function() {
+		var controlgroup, controlgroupWidget,
+			controlgroupConstructor = $.mobile.controlgroup;
+
+		// If the controlgroup widget is defined ...
+		if ( controlgroupConstructor ) {
+			controlgroup = this.element.closest(
+				":mobile-controlgroup," +
+				controlgroupConstructor.prototype.initSelector );
+
+			// ... and the checkbox is in a controlgroup ...
+			if ( controlgroup.length > 0 ) {
+
+				// ... look for a controlgroup widget instance, and ...
+				controlgroupWidget = $.data( controlgroup[ 0 ], "mobile-controlgroup" );
+
+				// ... if found, decide based on the option value, ...
+				return ( ( controlgroupWidget ? controlgroupWidget.options.type :
+
+					// ... otherwise decide based on the "type" data attribute.
+					controlgroup.attr( "data-" + $.mobile.ns + "type" ) ) !== "horizontal" );
+			}
+		}
+
+		// Normally, the widget displays an icon.
+		return true;
+	},
+
+	refresh: function() {
+		var hasIcon = this._hasIcon(),
+			isChecked = this.element[ 0 ].checked,
+			active = $.mobile.activeBtnClass,
+			iconposClass = "ui-btn-icon-" + this.options.iconpos,
+			addClasses = [],
+			removeClasses = [];
+
+		if ( hasIcon ) {
+			removeClasses.push( active );
+			addClasses.push( iconposClass );
+		} else {
+			removeClasses.push( iconposClass );
+			( isChecked ? addClasses : removeClasses ).push( active );
+		}
+
+		if ( isChecked ) {
+			addClasses.push( this.checkedClass );
+			removeClasses.push( this.uncheckedClass );
+		} else {
+			addClasses.push( this.uncheckedClass );
+			removeClasses.push( this.checkedClass );
+		}
+
+		this.label
+			.addClass( addClasses.join( " " ) )
+			.removeClass( removeClasses.join( " " ) );
+	},
+
+	widget: function() {
+		return this.label.parent();
+	},
+
+	_setOptions: function( options ) {
+		var label = this.label,
+			currentOptions = this.options,
+			outer = this.widget(),
+			hasIcon = this._hasIcon();
+
+		if ( options.disabled !== undefined ) {
+			this.input.prop( "disabled", !!options.disabled );
+			outer.toggleClass( "ui-state-disabled", !!options.disabled );
+		}
+		if ( options.mini !== undefined ) {
+			outer.toggleClass( "ui-mini", !!options.mini );
+		}
+		if ( options.theme !== undefined ) {
+			label
+				.removeClass( "ui-btn-" + currentOptions.theme )
+				.addClass( "ui-btn-" + options.theme );
+		}
+		if ( options.wrapperClass !== undefined ) {
+			outer
+				.removeClass( currentOptions.wrapperClass )
+				.addClass( options.wrapperClass );
+		}
+		if ( options.iconpos !== undefined && hasIcon ) {
+			label.removeClass( "ui-btn-icon-" + currentOptions.iconpos ).addClass( "ui-btn-icon-" + options.iconpos );
+		} else if ( !hasIcon ) {
+			label.removeClass( "ui-btn-icon-" + currentOptions.iconpos );
+		}
+		this._super( options );
+	}
+
+}, $.mobile.behaviors.formReset ) );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.button", {
+
+	initSelector: "input[type='button'], input[type='submit'], input[type='reset']",
+
+	options: {
+		theme: null,
+		icon: null,
+		iconpos: "left",
+		iconshadow: false, /* TODO: Deprecated in 1.4, remove in 1.5. */
+		corners: true,
+		shadow: true,
+		inline: null,
+		mini: null,
+		wrapperClass: null,
+		enhanced: false
+	},
+
+	_create: function() {
+
+		if ( this.element.is( ":disabled" ) ) {
+			this.options.disabled = true;
+		}
+
+		if ( !this.options.enhanced ) {
+			this._enhance();
+		}
+
+		$.extend( this, {
+			wrapper: this.element.parent()
+		});
+
+		this._on( {
+			focus: function() {
+				this.widget().addClass( $.mobile.focusClass );
+			},
+
+			blur: function() {
+				this.widget().removeClass( $.mobile.focusClass );
+			}
+		});
+
+		this.refresh( true );
+	},
+
+	_enhance: function() {
+		this.element.wrap( this._button() );
+	},
+
+	_button: function() {
+		var options = this.options,
+			iconClasses = this._getIconClasses( this.options );
+
+		return $("<div class='ui-btn ui-input-btn" +
+			( options.wrapperClass ? " " + options.wrapperClass : "" ) +
+			( options.theme ? " ui-btn-" + options.theme : "" ) +
+			( options.corners ? " ui-corner-all" : "" ) +
+			( options.shadow ? " ui-shadow" : "" ) +
+			( options.inline ? " ui-btn-inline" : "" ) +
+			( options.mini ? " ui-mini" : "" ) +
+			( options.disabled ? " ui-state-disabled" : "" ) +
+			( iconClasses ? ( " " + iconClasses ) : "" ) +
+			"' >" + this.element.val() + "</div>" );
+	},
+
+	widget: function() {
+		return this.wrapper;
+	},
+
+	_destroy: function() {
+			this.element.insertBefore( this.button );
+			this.button.remove();
+	},
+
+	_getIconClasses: function( options ) {
+		return ( options.icon ? ( "ui-icon-" + options.icon +
+			( options.iconshadow ? " ui-shadow-icon" : "" ) + /* TODO: Deprecated in 1.4, remove in 1.5. */
+			" ui-btn-icon-" + options.iconpos ) : "" );
+	},
+
+	_setOptions: function( options ) {
+		var outer = this.widget();
+
+		if ( options.theme !== undefined ) {
+			outer
+				.removeClass( this.options.theme )
+				.addClass( "ui-btn-" + options.theme );
+		}
+		if ( options.corners !== undefined ) {
+			outer.toggleClass( "ui-corner-all", options.corners );
+		}
+		if ( options.shadow !== undefined ) {
+			outer.toggleClass( "ui-shadow", options.shadow );
+		}
+		if ( options.inline !== undefined ) {
+			outer.toggleClass( "ui-btn-inline", options.inline );
+		}
+		if ( options.mini !== undefined ) {
+			outer.toggleClass( "ui-mini", options.mini );
+		}
+		if ( options.disabled !== undefined ) {
+			this.element.prop( "disabled", options.disabled );
+			outer.toggleClass( "ui-state-disabled", options.disabled );
+		}
+
+		if ( options.icon !== undefined ||
+				options.iconshadow !== undefined || /* TODO: Deprecated in 1.4, remove in 1.5. */
+				options.iconpos !== undefined ) {
+			outer
+				.removeClass( this._getIconClasses( this.options ) )
+				.addClass( this._getIconClasses(
+					$.extend( {}, this.options, options ) ) );
+		}
+
+		this._super( options );
+	},
+
+	refresh: function( create ) {
+		var originalElement,
+			isDisabled = this.element.prop( "disabled" );
+
+		if ( this.options.icon && this.options.iconpos === "notext" && this.element.attr( "title" ) ) {
+			this.element.attr( "title", this.element.val() );
+		}
+		if ( !create ) {
+			originalElement = this.element.detach();
+			$( this.wrapper ).text( this.element.val() ).append( originalElement );
+		}
+		if ( this.options.disabled !== isDisabled ) {
+			this._setOptions({ disabled: isDisabled });
+		}
+	}
+});
+
+})( jQuery );
+
+(function( $ ) {
+	var	meta = $( "meta[name=viewport]" ),
+		initialContent = meta.attr( "content" ),
+		disabledZoom = initialContent + ",maximum-scale=1, user-scalable=no",
+		enabledZoom = initialContent + ",maximum-scale=10, user-scalable=yes",
+		disabledInitially = /(user-scalable[\s]*=[\s]*no)|(maximum-scale[\s]*=[\s]*1)[$,\s]/.test( initialContent );
+
+	$.mobile.zoom = $.extend( {}, {
+		enabled: !disabledInitially,
+		locked: false,
+		disable: function( lock ) {
+			if ( !disabledInitially && !$.mobile.zoom.locked ) {
+				meta.attr( "content", disabledZoom );
+				$.mobile.zoom.enabled = false;
+				$.mobile.zoom.locked = lock || false;
+			}
+		},
+		enable: function( unlock ) {
+			if ( !disabledInitially && ( !$.mobile.zoom.locked || unlock === true ) ) {
+				meta.attr( "content", enabledZoom );
+				$.mobile.zoom.enabled = true;
+				$.mobile.zoom.locked = false;
+			}
+		},
+		restore: function() {
+			if ( !disabledInitially ) {
+				meta.attr( "content", initialContent );
+				$.mobile.zoom.enabled = true;
+			}
+		}
+	});
+
+}( jQuery ));
+
+(function( $, undefined ) {
+
+$.widget( "mobile.textinput", {
+	initSelector: "input[type='text']," +
+		"input[type='search']," +
+		":jqmData(type='search')," +
+		"input[type='number']," +
+		":jqmData(type='number')," +
+		"input[type='password']," +
+		"input[type='email']," +
+		"input[type='url']," +
+		"input[type='tel']," +
+		"textarea," +
+		"input[type='time']," +
+		"input[type='date']," +
+		"input[type='month']," +
+		"input[type='week']," +
+		"input[type='datetime']," +
+		"input[type='datetime-local']," +
+		"input[type='color']," +
+		"input:not([type])," +
+		"input[type='file']",
+
+	options: {
+		theme: null,
+		corners: true,
+		mini: false,
+		// This option defaults to true on iOS devices.
+		preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
+		wrapperClass: "",
+		enhanced: false
+	},
+
+	_create: function() {
+
+		var options = this.options,
+			isSearch = this.element.is( "[type='search'], :jqmData(type='search')" ),
+			isTextarea = this.element[ 0 ].tagName === "TEXTAREA",
+			isRange = this.element.is( "[data-" + ( $.mobile.ns || "" ) + "type='range']" ),
+			inputNeedsWrap = ( (this.element.is( "input" ) ||
+				this.element.is( "[data-" + ( $.mobile.ns || "" ) + "type='search']" ) ) &&
+					!isRange );
+
+		if ( this.element.prop( "disabled" ) ) {
+			options.disabled = true;
+		}
+
+		$.extend( this, {
+			classes: this._classesFromOptions(),
+			isSearch: isSearch,
+			isTextarea: isTextarea,
+			isRange: isRange,
+			inputNeedsWrap: inputNeedsWrap
+		});
+
+		this._autoCorrect();
+
+		if ( !options.enhanced ) {
+			this._enhance();
+		}
+
+		this._on( {
+			"focus": "_handleFocus",
+			"blur": "_handleBlur"
+		});
+
+	},
+
+	refresh: function() {
+		this.setOptions({
+			"disabled" : this.element.is( ":disabled" )
+		});
+	},
+
+	_enhance: function() {
+		var elementClasses = [];
+
+		if ( this.isTextarea ) {
+			elementClasses.push( "ui-input-text" );
+		}
+
+		if ( this.isTextarea || this.isRange ) {
+			elementClasses.push( "ui-shadow-inset" );
+		}
+
+		//"search" and "text" input widgets
+		if ( this.inputNeedsWrap ) {
+			this.element.wrap( this._wrap() );
+		} else {
+			elementClasses = elementClasses.concat( this.classes );
+		}
+
+		this.element.addClass( elementClasses.join( " " ) );
+	},
+
+	widget: function() {
+		return ( this.inputNeedsWrap ) ? this.element.parent() : this.element;
+	},
+
+	_classesFromOptions: function() {
+		var options = this.options,
+			classes = [];
+
+		classes.push( "ui-body-" + ( ( options.theme === null ) ? "inherit" : options.theme ) );
+		if ( options.corners ) {
+			classes.push( "ui-corner-all" );
+		}
+		if ( options.mini ) {
+			classes.push( "ui-mini" );
+		}
+		if ( options.disabled ) {
+			classes.push( "ui-state-disabled" );
+		}
+		if ( options.wrapperClass ) {
+			classes.push( options.wrapperClass );
+		}
+
+		return classes;
+	},
+
+	_wrap: function() {
+		return $( "<div class='" +
+			( this.isSearch ? "ui-input-search " : "ui-input-text " ) +
+			this.classes.join( " " ) + " " +
+			"ui-shadow-inset'></div>" );
+	},
+
+	_autoCorrect: function() {
+		// XXX: Temporary workaround for issue 785 (Apple bug 8910589).
+		//      Turn off autocorrect and autocomplete on non-iOS 5 devices
+		//      since the popup they use can't be dismissed by the user. Note
+		//      that we test for the presence of the feature by looking for
+		//      the autocorrect property on the input element. We currently
+		//      have no test for iOS 5 or newer so we're temporarily using
+		//      the touchOverflow support flag for jQM 1.0. Yes, I feel dirty.
+		//      - jblas
+		if ( typeof this.element[0].autocorrect !== "undefined" &&
+			!$.support.touchOverflow ) {
+
+			// Set the attribute instead of the property just in case there
+			// is code that attempts to make modifications via HTML.
+			this.element[0].setAttribute( "autocorrect", "off" );
+			this.element[0].setAttribute( "autocomplete", "off" );
+		}
+	},
+
+	_handleBlur: function() {
+		this.widget().removeClass( $.mobile.focusClass );
+		if ( this.options.preventFocusZoom ) {
+			$.mobile.zoom.enable( true );
+		}
+	},
+
+	_handleFocus: function() {
+		// In many situations, iOS will zoom into the input upon tap, this
+		// prevents that from happening
+		if ( this.options.preventFocusZoom ) {
+			$.mobile.zoom.disable( true );
+		}
+		this.widget().addClass( $.mobile.focusClass );
+	},
+
+	_setOptions: function ( options ) {
+		var outer = this.widget();
+
+		this._super( options );
+
+		if ( !( options.disabled === undefined &&
+			options.mini === undefined &&
+			options.corners === undefined &&
+			options.theme === undefined &&
+			options.wrapperClass === undefined ) ) {
+
+			outer.removeClass( this.classes.join( " " ) );
+			this.classes = this._classesFromOptions();
+			outer.addClass( this.classes.join( " " ) );
+		}
+
+		if ( options.disabled !== undefined ) {
+			this.element.prop( "disabled", !!options.disabled );
+		}
+	},
+
+	_destroy: function() {
+		if ( this.options.enhanced ) {
+			return;
+		}
+		if ( this.inputNeedsWrap ) {
+			this.element.unwrap();
+		}
+		this.element.removeClass( "ui-input-text " + this.classes.join( " " ) );
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.slider", $.extend( {
+	initSelector: "input[type='range'], :jqmData(type='range'), :jqmData(role='slider')",
+
+	widgetEventPrefix: "slide",
+
+	options: {
+		theme: null,
+		trackTheme: null,
+		corners: true,
+		mini: false,
+		highlight: false
+	},
+
+	_create: function() {
+
+		// TODO: Each of these should have comments explain what they're for
+		var self = this,
+			control = this.element,
+			trackTheme = this.options.trackTheme || $.mobile.getAttribute( control[ 0 ], "theme" ),
+			trackThemeClass = trackTheme ? " ui-bar-" + trackTheme : " ui-bar-inherit",
+			cornerClass = ( this.options.corners || control.jqmData( "corners" ) ) ? " ui-corner-all" : "",
+			miniClass = ( this.options.mini || control.jqmData( "mini" ) ) ? " ui-mini" : "",
+			cType = control[ 0 ].nodeName.toLowerCase(),
+			isToggleSwitch = ( cType === "select" ),
+			isRangeslider = control.parent().is( ":jqmData(role='rangeslider')" ),
+			selectClass = ( isToggleSwitch ) ? "ui-slider-switch" : "",
+			controlID = control.attr( "id" ),
+			$label = $( "[for='" + controlID + "']" ),
+			labelID = $label.attr( "id" ) || controlID + "-label",
+			min = !isToggleSwitch ? parseFloat( control.attr( "min" ) ) : 0,
+			max =  !isToggleSwitch ? parseFloat( control.attr( "max" ) ) : control.find( "option" ).length-1,
+			step = window.parseFloat( control.attr( "step" ) || 1 ),
+			domHandle = document.createElement( "a" ),
+			handle = $( domHandle ),
+			domSlider = document.createElement( "div" ),
+			slider = $( domSlider ),
+			valuebg = this.options.highlight && !isToggleSwitch ? (function() {
+				var bg = document.createElement( "div" );
+				bg.className = "ui-slider-bg " + $.mobile.activeBtnClass;
+				return $( bg ).prependTo( slider );
+			})() : false,
+			options,
+			wrapper,
+			j, length,
+			i, optionsCount, origTabIndex,
+			side, activeClass, sliderImg;
+
+		$label.attr( "id", labelID );
+		this.isToggleSwitch = isToggleSwitch;
+
+		domHandle.setAttribute( "href", "#" );
+		domSlider.setAttribute( "role", "application" );
+		domSlider.className = [ this.isToggleSwitch ? "ui-slider ui-slider-track ui-shadow-inset " : "ui-slider-track ui-shadow-inset ", selectClass, trackThemeClass, cornerClass, miniClass ].join( "" );
+		domHandle.className = "ui-slider-handle";
+		domSlider.appendChild( domHandle );
+
+		handle.attr({
+			"role": "slider",
+			"aria-valuemin": min,
+			"aria-valuemax": max,
+			"aria-valuenow": this._value(),
+			"aria-valuetext": this._value(),
+			"title": this._value(),
+			"aria-labelledby": labelID
+		});
+
+		$.extend( this, {
+			slider: slider,
+			handle: handle,
+			control: control,
+			type: cType,
+			step: step,
+			max: max,
+			min: min,
+			valuebg: valuebg,
+			isRangeslider: isRangeslider,
+			dragging: false,
+			beforeStart: null,
+			userModified: false,
+			mouseMoved: false
+		});
+
+		if ( isToggleSwitch ) {
+			// TODO: restore original tabindex (if any) in a destroy method
+			origTabIndex = control.attr( "tabindex" );
+			if ( origTabIndex ) {
+				handle.attr( "tabindex", origTabIndex );
+			}
+			control.attr( "tabindex", "-1" ).focus(function() {
+				$( this ).blur();
+				handle.focus();
+			});
+
+			wrapper = document.createElement( "div" );
+			wrapper.className = "ui-slider-inneroffset";
+
+			for ( j = 0, length = domSlider.childNodes.length; j < length; j++ ) {
+				wrapper.appendChild( domSlider.childNodes[j] );
+			}
+
+			domSlider.appendChild( wrapper );
+
+			// slider.wrapInner( "<div class='ui-slider-inneroffset'></div>" );
+
+			// make the handle move with a smooth transition
+			handle.addClass( "ui-slider-handle-snapping" );
+
+			options = control.find( "option" );
+
+			for ( i = 0, optionsCount = options.length; i < optionsCount; i++ ) {
+				side = !i ? "b" : "a";
+				activeClass = !i ? "" : " " + $.mobile.activeBtnClass;
+				sliderImg = document.createElement( "span" );
+
+				sliderImg.className = [ "ui-slider-label ui-slider-label-", side, activeClass ].join( "" );
+				sliderImg.setAttribute( "role", "img" );
+				sliderImg.appendChild( document.createTextNode( options[i].innerHTML ) );
+				$( sliderImg ).prependTo( slider );
+			}
+
+			self._labels = $( ".ui-slider-label", slider );
+
+		}
+
+		// monitor the input for updated values
+		control.addClass( isToggleSwitch ? "ui-slider-switch" : "ui-slider-input" );
+
+		this._on( control, {
+			"change": "_controlChange",
+			"keyup": "_controlKeyup",
+			"blur": "_controlBlur",
+			"vmouseup": "_controlVMouseUp"
+		});
+
+		slider.bind( "vmousedown", $.proxy( this._sliderVMouseDown, this ) )
+			.bind( "vclick", false );
+
+		// We have to instantiate a new function object for the unbind to work properly
+		// since the method itself is defined in the prototype (causing it to unbind everything)
+		this._on( document, { "vmousemove": "_preventDocumentDrag" });
+		this._on( slider.add( document ), { "vmouseup": "_sliderVMouseUp" });
+
+		slider.insertAfter( control );
+
+		// wrap in a div for styling purposes
+		if ( !isToggleSwitch && !isRangeslider ) {
+			wrapper = this.options.mini ? "<div class='ui-slider ui-mini'>" : "<div class='ui-slider'>";
+
+			control.add( slider ).wrapAll( wrapper );
+		}
+
+		// bind the handle event callbacks and set the context to the widget instance
+		this._on( this.handle, {
+			"vmousedown": "_handleVMouseDown",
+			"keydown": "_handleKeydown",
+			"keyup": "_handleKeyup"
+		});
+
+		this.handle.bind( "vclick", false );
+
+		this._handleFormReset();
+
+		this.refresh( undefined, undefined, true );
+	},
+
+	_setOptions: function( options ) {
+		if ( options.theme !== undefined ) {
+			this._setTheme( options.theme );
+		}
+
+		if ( options.trackTheme !== undefined ) {
+			this._setTrackTheme( options.trackTheme );
+		}
+
+		if ( options.corners !== undefined ) {
+			this._setCorners( options.corners );
+		}
+
+		if ( options.mini !== undefined ) {
+			this._setMini( options.mini );
+		}
+
+		if ( options.highlight !== undefined ) {
+			this._setHighlight( options.highlight );
+		}
+
+		if ( options.disabled !== undefined ) {
+			this._setDisabled( options.disabled );
+		}
+		this._super( options );
+	},
+
+	_controlChange: function( event ) {
+		// if the user dragged the handle, the "change" event was triggered from inside refresh(); don't call refresh() again
+		if ( this._trigger( "controlchange", event ) === false ) {
+			return false;
+		}
+		if ( !this.mouseMoved ) {
+			this.refresh( this._value(), true );
+		}
+	},
+
+	_controlKeyup: function(/* event */) { // necessary?
+		this.refresh( this._value(), true, true );
+	},
+
+	_controlBlur: function(/* event */) {
+		this.refresh( this._value(), true );
+	},
+
+	// it appears the clicking the up and down buttons in chrome on
+	// range/number inputs doesn't trigger a change until the field is
+	// blurred. Here we check thif the value has changed and refresh
+	_controlVMouseUp: function(/* event */) {
+		this._checkedRefresh();
+	},
+
+	// NOTE force focus on handle
+	_handleVMouseDown: function(/* event */) {
+		this.handle.focus();
+	},
+
+	_handleKeydown: function( event ) {
+		var index = this._value();
+		if ( this.options.disabled ) {
+			return;
+		}
+
+		// In all cases prevent the default and mark the handle as active
+		switch ( event.keyCode ) {
+			case $.mobile.keyCode.HOME:
+			case $.mobile.keyCode.END:
+			case $.mobile.keyCode.PAGE_UP:
+			case $.mobile.keyCode.PAGE_DOWN:
+			case $.mobile.keyCode.UP:
+			case $.mobile.keyCode.RIGHT:
+			case $.mobile.keyCode.DOWN:
+			case $.mobile.keyCode.LEFT:
+				event.preventDefault();
+
+				if ( !this._keySliding ) {
+					this._keySliding = true;
+					this.handle.addClass( "ui-state-active" ); /* TODO: We don't use this class for styling. Do we need to add it? */
+				}
+
+				break;
+		}
+
+		// move the slider according to the keypress
+		switch ( event.keyCode ) {
+			case $.mobile.keyCode.HOME:
+				this.refresh( this.min );
+				break;
+			case $.mobile.keyCode.END:
+				this.refresh( this.max );
+				break;
+			case $.mobile.keyCode.PAGE_UP:
+			case $.mobile.keyCode.UP:
+			case $.mobile.keyCode.RIGHT:
+				this.refresh( index + this.step );
+				break;
+			case $.mobile.keyCode.PAGE_DOWN:
+			case $.mobile.keyCode.DOWN:
+			case $.mobile.keyCode.LEFT:
+				this.refresh( index - this.step );
+				break;
+		}
+	}, // remove active mark
+
+	_handleKeyup: function(/* event */) {
+		if ( this._keySliding ) {
+			this._keySliding = false;
+			this.handle.removeClass( "ui-state-active" ); /* See comment above. */
+		}
+	},
+
+	_sliderVMouseDown: function( event ) {
+		// NOTE: we don't do this in refresh because we still want to
+		//       support programmatic alteration of disabled inputs
+		if ( this.options.disabled || !( event.which === 1 || event.which === 0 || event.which === undefined ) ) {
+			return false;
+		}
+		if ( this._trigger( "beforestart", event ) === false ) {
+			return false;
+		}
+		this.dragging = true;
+		this.userModified = false;
+		this.mouseMoved = false;
+
+		if ( this.isToggleSwitch ) {
+			this.beforeStart = this.element[0].selectedIndex;
+		}
+
+		this.refresh( event );
+		this._trigger( "start" );
+		return false;
+	},
+
+	_sliderVMouseUp: function() {
+		if ( this.dragging ) {
+			this.dragging = false;
+
+			if ( this.isToggleSwitch ) {
+				// make the handle move with a smooth transition
+				this.handle.addClass( "ui-slider-handle-snapping" );
+
+				if ( this.mouseMoved ) {
+					// this is a drag, change the value only if user dragged enough
+					if ( this.userModified ) {
+						this.refresh( this.beforeStart === 0 ? 1 : 0 );
+					} else {
+						this.refresh( this.beforeStart );
+					}
+				} else {
+					// this is just a click, change the value
+					this.refresh( this.beforeStart === 0 ? 1 : 0 );
+				}
+			}
+
+			this.mouseMoved = false;
+			this._trigger( "stop" );
+			return false;
+		}
+	},
+
+	_preventDocumentDrag: function( event ) {
+			// NOTE: we don't do this in refresh because we still want to
+			//       support programmatic alteration of disabled inputs
+			if ( this._trigger( "drag", event ) === false) {
+				return false;
+			}
+			if ( this.dragging && !this.options.disabled ) {
+
+				// this.mouseMoved must be updated before refresh() because it will be used in the control "change" event
+				this.mouseMoved = true;
+
+				if ( this.isToggleSwitch ) {
+					// make the handle move in sync with the mouse
+					this.handle.removeClass( "ui-slider-handle-snapping" );
+				}
+
+				this.refresh( event );
+
+				// only after refresh() you can calculate this.userModified
+				this.userModified = this.beforeStart !== this.element[0].selectedIndex;
+				return false;
+			}
+		},
+
+	_checkedRefresh: function() {
+		if ( this.value !== this._value() ) {
+			this.refresh( this._value() );
+		}
+	},
+
+	_value: function() {
+		return  this.isToggleSwitch ? this.element[0].selectedIndex : parseFloat( this.element.val() ) ;
+	},
+
+	_reset: function() {
+		this.refresh( undefined, false, true );
+	},
+
+	refresh: function( val, isfromControl, preventInputUpdate ) {
+		// NOTE: we don't return here because we want to support programmatic
+		//       alteration of the input value, which should still update the slider
+
+		var self = this,
+			parentTheme = $.mobile.getAttribute( this.element[ 0 ], "theme" ),
+			theme = this.options.theme || parentTheme,
+			themeClass =  theme ? " ui-btn-" + theme : "",
+			trackTheme = this.options.trackTheme || parentTheme,
+			trackThemeClass = trackTheme ? " ui-bar-" + trackTheme : " ui-bar-inherit",
+			cornerClass = this.options.corners ? " ui-corner-all" : "",
+			miniClass = this.options.mini ? " ui-mini" : "",
+			left, width, data, tol,
+			pxStep, percent,
+			control, isInput, optionElements, min, max, step,
+			newval, valModStep, alignValue, percentPerStep,
+			handlePercent, aPercent, bPercent,
+			valueChanged;
+
+		self.slider[0].className = [ this.isToggleSwitch ? "ui-slider ui-slider-switch ui-slider-track ui-shadow-inset" : "ui-slider-track ui-shadow-inset", trackThemeClass, cornerClass, miniClass ].join( "" );
+		if ( this.options.disabled || this.element.prop( "disabled" ) ) {
+			this.disable();
+		}
+
+		// set the stored value for comparison later
+		this.value = this._value();
+		if ( this.options.highlight && !this.isToggleSwitch && this.slider.find( ".ui-slider-bg" ).length === 0 ) {
+			this.valuebg = (function() {
+				var bg = document.createElement( "div" );
+				bg.className = "ui-slider-bg " + $.mobile.activeBtnClass;
+				return $( bg ).prependTo( self.slider );
+			})();
+		}
+		this.handle.addClass( "ui-btn" + themeClass + " ui-shadow" );
+
+		control = this.element;
+		isInput = !this.isToggleSwitch;
+		optionElements = isInput ? [] : control.find( "option" );
+		min =  isInput ? parseFloat( control.attr( "min" ) ) : 0;
+		max = isInput ? parseFloat( control.attr( "max" ) ) : optionElements.length - 1;
+		step = ( isInput && parseFloat( control.attr( "step" ) ) > 0 ) ? parseFloat( control.attr( "step" ) ) : 1;
+
+		if ( typeof val === "object" ) {
+			data = val;
+			// a slight tolerance helped get to the ends of the slider
+			tol = 8;
+
+			left = this.slider.offset().left;
+			width = this.slider.width();
+			pxStep = width/((max-min)/step);
+			if ( !this.dragging ||
+					data.pageX < left - tol ||
+					data.pageX > left + width + tol ) {
+				return;
+			}
+			if ( pxStep > 1 ) {
+				percent = ( ( data.pageX - left ) / width ) * 100;
+			} else {
+				percent = Math.round( ( ( data.pageX - left ) / width ) * 100 );
+			}
+		} else {
+			if ( val == null ) {
+				val = isInput ? parseFloat( control.val() || 0 ) : control[0].selectedIndex;
+			}
+			percent = ( parseFloat( val ) - min ) / ( max - min ) * 100;
+		}
+
+		if ( isNaN( percent ) ) {
+			return;
+		}
+
+		newval = ( percent / 100 ) * ( max - min ) + min;
+
+		//from jQuery UI slider, the following source will round to the nearest step
+		valModStep = ( newval - min ) % step;
+		alignValue = newval - valModStep;
+
+		if ( Math.abs( valModStep ) * 2 >= step ) {
+			alignValue += ( valModStep > 0 ) ? step : ( -step );
+		}
+
+		percentPerStep = 100/((max-min)/step);
+		// Since JavaScript has problems with large floats, round
+		// the final value to 5 digits after the decimal point (see jQueryUI: #4124)
+		newval = parseFloat( alignValue.toFixed(5) );
+
+		if ( typeof pxStep === "undefined" ) {
+			pxStep = width / ( (max-min) / step );
+		}
+		if ( pxStep > 1 && isInput ) {
+			percent = ( newval - min ) * percentPerStep * ( 1 / step );
+		}
+		if ( percent < 0 ) {
+			percent = 0;
+		}
+
+		if ( percent > 100 ) {
+			percent = 100;
+		}
+
+		if ( newval < min ) {
+			newval = min;
+		}
+
+		if ( newval > max ) {
+			newval = max;
+		}
+
+		this.handle.css( "left", percent + "%" );
+
+		this.handle[0].setAttribute( "aria-valuenow", isInput ? newval : optionElements.eq( newval ).attr( "value" ) );
+
+		this.handle[0].setAttribute( "aria-valuetext", isInput ? newval : optionElements.eq( newval ).getEncodedText() );
+
+		this.handle[0].setAttribute( "title", isInput ? newval : optionElements.eq( newval ).getEncodedText() );
+
+		if ( this.valuebg ) {
+			this.valuebg.css( "width", percent + "%" );
+		}
+
+		// drag the label widths
+		if ( this._labels ) {
+			handlePercent = this.handle.width() / this.slider.width() * 100;
+			aPercent = percent && handlePercent + ( 100 - handlePercent ) * percent / 100;
+			bPercent = percent === 100 ? 0 : Math.min( handlePercent + 100 - aPercent, 100 );
+
+			this._labels.each(function() {
+				var ab = $( this ).hasClass( "ui-slider-label-a" );
+				$( this ).width( ( ab ? aPercent : bPercent  ) + "%" );
+			});
+		}
+
+		if ( !preventInputUpdate ) {
+			valueChanged = false;
+
+			// update control"s value
+			if ( isInput ) {
+				valueChanged = control.val() !== newval;
+				control.val( newval );
+			} else {
+				valueChanged = control[ 0 ].selectedIndex !== newval;
+				control[ 0 ].selectedIndex = newval;
+			}
+			if ( this._trigger( "beforechange", val ) === false) {
+					return false;
+			}
+			if ( !isfromControl && valueChanged ) {
+				control.trigger( "change" );
+			}
+		}
+	},
+
+	_setHighlight: function( value ) {
+		value = !!value;
+		if ( value ) {
+			this.options.highlight = !!value;
+			this.refresh();
+		} else if ( this.valuebg ) {
+			this.valuebg.remove();
+			this.valuebg = false;
+		}
+	},
+
+	_setTheme: function( value ) {
+		this.handle
+			.removeClass( "ui-btn-" + this.options.theme )
+			.addClass( "ui-btn-" + value );
+
+		var currentTheme = this.options.theme ? this.options.theme : "inherit",
+			newTheme = value ? value : "inherit";
+
+		this.control
+			.removeClass( "ui-body-" + currentTheme )
+			.addClass( "ui-body-" + newTheme );
+	},
+
+	_setTrackTheme: function( value ) {
+		var currentTrackTheme = this.options.trackTheme ? this.options.trackTheme : "inherit",
+			newTrackTheme = value ? value : "inherit";
+
+		this.slider
+			.removeClass( "ui-body-" + currentTrackTheme )
+			.addClass( "ui-body-" + newTrackTheme );
+	},
+
+	_setMini: function( value ) {
+		value = !!value;
+		if ( !this.isToggleSwitch && !this.isRangeslider ) {
+			this.slider.parent().toggleClass( "ui-mini", value );
+			this.element.toggleClass( "ui-mini", value );
+		}
+		this.slider.toggleClass( "ui-mini", value );
+	},
+
+	_setCorners: function( value ) {
+		this.slider.toggleClass( "ui-corner-all", value );
+
+		if ( !this.isToggleSwitch ) {
+			this.control.toggleClass( "ui-corner-all", value );
+		}
+	},
+
+	_setDisabled: function( value ) {
+		value = !!value;
+		this.element.prop( "disabled", value );
+		this.slider
+			.toggleClass( "ui-state-disabled", value )
+			.attr( "aria-disabled", value );
+	}
+
+}, $.mobile.behaviors.formReset ) );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+var popup;
+
+function getPopup() {
+	if ( !popup ) {
+		popup = $( "<div></div>", {
+			"class": "ui-slider-popup ui-shadow ui-corner-all"
+		});
+	}
+	return popup.clone();
+}
+
+$.widget( "mobile.slider", $.mobile.slider, {
+	options: {
+		popupEnabled: false,
+		showValue: false
+	},
+
+	_create: function() {
+		this._super();
+
+		$.extend( this, {
+			_currentValue: null,
+			_popup: null,
+			_popupVisible: false
+		});
+
+		this._setOption( "popupEnabled", this.options.popupEnabled );
+
+		this._on( this.handle, { "vmousedown" : "_showPopup" } );
+		this._on( this.slider.add( this.document ), { "vmouseup" : "_hidePopup" } );
+		this._refresh();
+	},
+
+	// position the popup centered 5px above the handle
+	_positionPopup: function() {
+		var dstOffset = this.handle.offset();
+
+		this._popup.offset( {
+			left: dstOffset.left + ( this.handle.width() - this._popup.width() ) / 2,
+			top: dstOffset.top - this._popup.outerHeight() - 5
+		});
+	},
+
+	_setOption: function( key, value ) {
+		this._super( key, value );
+
+		if ( key === "showValue" ) {
+			this.handle.html( value && !this.options.mini ? this._value() : "" );
+		} else if ( key === "popupEnabled" ) {
+			if ( value && !this._popup ) {
+				this._popup = getPopup()
+					.addClass( "ui-body-" + ( this.options.theme || "a" ) )
+					.hide()
+					.insertBefore( this.element );
+			}
+		}
+	},
+
+	// show value on the handle and in popup
+	refresh: function() {
+		this._super.apply( this, arguments );
+		this._refresh();
+	},
+
+	_refresh: function() {
+		var o = this.options, newValue;
+
+		if ( o.popupEnabled ) {
+			// remove the title attribute from the handle (which is
+			// responsible for the annoying tooltip); NB we have
+			// to do it here as the jqm slider sets it every time
+			// the slider's value changes :(
+			this.handle.removeAttr( "title" );
+		}
+
+		newValue = this._value();
+		if ( newValue === this._currentValue ) {
+			return;
+		}
+		this._currentValue = newValue;
+
+		if ( o.popupEnabled && this._popup ) {
+			this._positionPopup();
+			this._popup.html( newValue );
+		} else if ( o.showValue && !this.options.mini ) {
+			this.handle.html( newValue );
+		}
+	},
+
+	_showPopup: function() {
+		if ( this.options.popupEnabled && !this._popupVisible ) {
+			this.handle.html( "" );
+			this._popup.show();
+			this._positionPopup();
+			this._popupVisible = true;
+		}
+	},
+
+	_hidePopup: function() {
+		var o = this.options;
+
+		if ( o.popupEnabled && this._popupVisible ) {
+			if ( o.showValue && !o.mini ) {
+				this.handle.html( this._value() );
+			}
+			this._popup.hide();
+			this._popupVisible = false;
+		}
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.flipswitch", $.extend({
+
+	options: {
+		onText: "On",
+		offText: "Off",
+		theme: null,
+		enhanced: false,
+		wrapperClass: null,
+		corners: true,
+		mini: false
+	},
+
+	_create: function() {
+			if ( !this.options.enhanced ) {
+				this._enhance();
+			} else {
+				$.extend( this, {
+					flipswitch: this.element.parent(),
+					on: this.element.find( ".ui-flipswitch-on" ).eq( 0 ),
+					off: this.element.find( ".ui-flipswitch-off" ).eq(0),
+					type: this.element.get( 0 ).tagName
+				});
+			}
+
+			this._handleFormReset();
+
+			// Transfer tabindex to "on" element and make input unfocusable
+			this._originalTabIndex = this.element.attr( "tabindex" );
+			if ( this._originalTabIndex != null ) {
+				this.on.attr( "tabindex", this._originalTabIndex );
+			}
+			this.element.attr( "tabindex", "-1" );
+			this._on({
+				"focus" : "_handleInputFocus"
+			});
+
+			if ( this.element.is( ":disabled" ) ) {
+				this._setOptions({
+					"disabled": true
+				});
+			}
+
+			this._on( this.flipswitch, {
+				"click": "_toggle",
+				"swipeleft": "_left",
+				"swiperight": "_right"
+			});
+
+			this._on( this.on, {
+				"keydown": "_keydown"
+			});
+
+			this._on( {
+				"change": "refresh"
+			});
+	},
+
+	_handleInputFocus: function() {
+		this.on.focus();
+	},
+
+	widget: function() {
+		return this.flipswitch;
+	},
+
+	_left: function() {
+		this.flipswitch.removeClass( "ui-flipswitch-active" );
+		if ( this.type === "SELECT" ) {
+			this.element.get( 0 ).selectedIndex = 0;
+		} else {
+			this.element.prop( "checked", false );
+		}
+		this.element.trigger( "change" );
+	},
+
+	_right: function() {
+		this.flipswitch.addClass( "ui-flipswitch-active" );
+		if ( this.type === "SELECT" ) {
+			this.element.get( 0 ).selectedIndex = 1;
+		} else {
+			this.element.prop( "checked", true );
+		}
+		this.element.trigger( "change" );
+	},
+
+	_enhance: function() {
+		var flipswitch = $( "<div>" ),
+			options = this.options,
+			element = this.element,
+			theme = options.theme ? options.theme : "inherit",
+
+			// The "on" button is an anchor so it's focusable
+			on = $( "<a></a>", {
+				"href": "#"
+			}),
+			off = $( "<span></span>" ),
+			type = element.get( 0 ).tagName,
+			onText = ( type === "INPUT" ) ?
+				options.onText : element.find( "option" ).eq( 1 ).text(),
+			offText = ( type === "INPUT" ) ?
+				options.offText : element.find( "option" ).eq( 0 ).text();
+
+			on
+				.addClass( "ui-flipswitch-on ui-btn ui-shadow ui-btn-inherit" )
+				.text( onText );
+			off
+				.addClass( "ui-flipswitch-off" )
+				.text( offText );
+
+			flipswitch
+				.addClass( "ui-flipswitch ui-shadow-inset " +
+					"ui-bar-" + theme + " " +
+					( options.wrapperClass ? options.wrapperClass : "" ) + " " +
+					( ( element.is( ":checked" ) ||
+						element
+							.find( "option" )
+							.eq( 1 )
+							.is( ":selected" ) ) ? "ui-flipswitch-active" : "" ) +
+					( element.is(":disabled") ? " ui-state-disabled": "") +
+					( options.corners ? " ui-corner-all": "" ) +
+					( options.mini ? " ui-mini": "" ) )
+				.append( on, off );
+
+			element
+				.addClass( "ui-flipswitch-input" )
+				.after( flipswitch )
+				.appendTo( flipswitch );
+
+		$.extend( this, {
+			flipswitch: flipswitch,
+			on: on,
+			off: off,
+			type: type
+		});
+	},
+
+	_reset: function() {
+		this.refresh();
+	},
+
+	refresh: function() {
+		var direction,
+			existingDirection = this.flipswitch.hasClass( "ui-flipswitch-active" ) ? "_right" : "_left";
+
+		if ( this.type === "SELECT" ) {
+			direction = ( this.element.get( 0 ).selectedIndex > 0 ) ? "_right": "_left";
+		} else {
+			direction = this.element.prop( "checked" ) ? "_right": "_left";
+		}
+
+		if ( direction !== existingDirection ) {
+			this[ direction ]();
+		}
+	},
+
+	_toggle: function() {
+		var direction = this.flipswitch.hasClass( "ui-flipswitch-active" ) ? "_left" : "_right";
+
+		this[ direction ]();
+	},
+
+	_keydown: function( e ) {
+		if ( e.which === $.mobile.keyCode.LEFT ) {
+			this._left();
+		} else if ( e.which === $.mobile.keyCode.RIGHT ) {
+			this._right();
+		} else if ( e.which === $.mobile.keyCode.SPACE ) {
+			this._toggle();
+			e.preventDefault();
+		}
+	},
+
+	_setOptions: function( options ) {
+		if ( options.theme !== undefined ) {
+			var currentTheme = options.theme ? options.theme : "inherit",
+				newTheme = options.theme ? options.theme : "inherit";
+
+			this.widget()
+				.removeClass( "ui-bar-" + currentTheme )
+				.addClass( "ui-bar-" + newTheme );
+		}
+		if ( options.onText !== undefined ) {
+			this.on.text( options.onText );
+		}
+		if ( options.offText !== undefined ) {
+			this.off.text( options.offText );
+		}
+		if ( options.disabled !== undefined ) {
+			this.widget().toggleClass( "ui-state-disabled", options.disabled );
+		}
+		if ( options.mini !== undefined ) {
+			this.widget().toggleClass( "ui-mini", options.mini );
+		}
+		if ( options.corners !== undefined ) {
+			this.widget().toggleClass( "ui-corner-all", options.corners );
+		}
+
+		this._super( options );
+	},
+
+	_destroy: function() {
+		if ( this.options.enhanced ) {
+			return;
+		}
+		if ( this._originalTabIndex != null ) {
+			this.element.attr( "tabindex", this._originalTabIndex );
+		} else {
+			this.element.removeAttr( "tabindex" );
+		}
+		this.on.remove();
+		this.off.remove();
+		this.element.unwrap();
+		this.flipswitch.remove();
+		this.removeClass( "ui-flipswitch-input" );
+	}
+
+}, $.mobile.behaviors.formReset ) );
+
+})( jQuery );
+
+(function( $, undefined ) {
+	$.widget( "mobile.rangeslider", $.extend( {
+
+		options: {
+			theme: null,
+			trackTheme: null,
+			corners: true,
+			mini: false,
+			highlight: true
+		},
+
+		_create: function() {
+			var $el = this.element,
+			elClass = this.options.mini ? "ui-rangeslider ui-mini" : "ui-rangeslider",
+			_inputFirst = $el.find( "input" ).first(),
+			_inputLast = $el.find( "input" ).last(),
+			_label = $el.find( "label" ).first(),
+			_sliderWidgetFirst = $.data( _inputFirst.get( 0 ), "mobile-slider" ) ||
+				$.data( _inputFirst.slider().get( 0 ), "mobile-slider" ),
+			_sliderWidgetLast = $.data( _inputLast.get(0), "mobile-slider" ) ||
+				$.data( _inputLast.slider().get( 0 ), "mobile-slider" ),
+			_sliderFirst = _sliderWidgetFirst.slider,
+			_sliderLast = _sliderWidgetLast.slider,
+			firstHandle = _sliderWidgetFirst.handle,
+			_sliders = $( "<div class='ui-rangeslider-sliders' />" ).appendTo( $el );
+
+			_inputFirst.addClass( "ui-rangeslider-first" );
+			_inputLast.addClass( "ui-rangeslider-last" );
+			$el.addClass( elClass );
+
+			_sliderFirst.appendTo( _sliders );
+			_sliderLast.appendTo( _sliders );
+			_label.insertBefore( $el );
+			firstHandle.prependTo( _sliderLast );
+
+			$.extend( this, {
+				_inputFirst: _inputFirst,
+				_inputLast: _inputLast,
+				_sliderFirst: _sliderFirst,
+				_sliderLast: _sliderLast,
+				_label: _label,
+				_targetVal: null,
+				_sliderTarget: false,
+				_sliders: _sliders,
+				_proxy: false
+			});
+
+			this.refresh();
+			this._on( this.element.find( "input.ui-slider-input" ), {
+				"slidebeforestart": "_slidebeforestart",
+				"slidestop": "_slidestop",
+				"slidedrag": "_slidedrag",
+				"slidebeforechange": "_change",
+				"blur": "_change",
+				"keyup": "_change"
+			});
+			this._on({
+				"mousedown":"_change"
+			});
+			this._on( this.element.closest( "form" ), {
+				"reset":"_handleReset"
+			});
+			this._on( firstHandle, {
+				"vmousedown": "_dragFirstHandle"
+			});
+		},
+		_handleReset: function() {
+			var self = this;
+			//we must wait for the stack to unwind before updateing other wise sliders will not have updated yet
+			setTimeout( function() {
+				self._updateHighlight();
+			},0);
+		},
+
+		_dragFirstHandle: function( event ) {
+			//if the first handle is dragged send the event to the first slider
+			$.data( this._inputFirst.get(0), "mobile-slider" ).dragging = true;
+			$.data( this._inputFirst.get(0), "mobile-slider" ).refresh( event );
+			return false;
+		},
+
+		_slidedrag: function( event ) {
+			var first = $( event.target ).is( this._inputFirst ),
+				otherSlider = ( first ) ? this._inputLast : this._inputFirst;
+
+			this._sliderTarget = false;
+			//if the drag was initiated on an extreme and the other handle is focused send the events to
+			//the closest handle
+			if ( ( this._proxy === "first" && first ) || ( this._proxy === "last" && !first ) ) {
+				$.data( otherSlider.get(0), "mobile-slider" ).dragging = true;
+				$.data( otherSlider.get(0), "mobile-slider" ).refresh( event );
+				return false;
+			}
+		},
+
+		_slidestop: function( event ) {
+			var first = $( event.target ).is( this._inputFirst );
+
+			this._proxy = false;
+			//this stops dragging of the handle and brings the active track to the front
+			//this makes clicks on the track go the the last handle used
+			this.element.find( "input" ).trigger( "vmouseup" );
+			this._sliderFirst.css( "z-index", first ? 1 : "" );
+		},
+
+		_slidebeforestart: function( event ) {
+			this._sliderTarget = false;
+			//if the track is the target remember this and the original value
+			if ( $( event.originalEvent.target ).hasClass( "ui-slider-track" ) ) {
+				this._sliderTarget = true;
+				this._targetVal = $( event.target ).val();
+			}
+		},
+
+		_setOptions: function( options ) {
+			if ( options.theme !== undefined ) {
+				this._setTheme( options.theme );
+			}
+
+			if ( options.trackTheme !== undefined ) {
+				this._setTrackTheme( options.trackTheme );
+			}
+
+			if ( options.mini !== undefined ) {
+				this._setMini( options.mini );
+			}
+
+			if ( options.highlight !== undefined ) {
+				this._setHighlight( options.highlight );
+			}
+			this._super( options );
+			this.refresh();
+		},
+
+		refresh: function() {
+			var $el = this.element,
+				o = this.options;
+
+			if ( this._inputFirst.is( ":disabled" ) || this._inputLast.is( ":disabled" ) ) {
+				this.options.disabled = true;
+			}
+
+			$el.find( "input" ).slider({
+				theme: o.theme,
+				trackTheme: o.trackTheme,
+				disabled: o.disabled,
+				corners: o.corners,
+				mini: o.mini,
+				highlight: o.highlight
+			}).slider( "refresh" );
+			this._updateHighlight();
+		},
+
+		_change: function( event ) {
+			if ( event.type === "keyup" ) {
+				this._updateHighlight();
+				return false;
+			}
+
+			var self = this,
+				min = parseFloat( this._inputFirst.val(), 10 ),
+				max = parseFloat( this._inputLast.val(), 10 ),
+				first = $( event.target ).hasClass( "ui-rangeslider-first" ),
+				thisSlider = first ? this._inputFirst : this._inputLast,
+				otherSlider = first ? this._inputLast : this._inputFirst;
+
+			if ( ( this._inputFirst.val() > this._inputLast.val() && event.type === "mousedown" && !$(event.target).hasClass("ui-slider-handle")) ) {
+				thisSlider.blur();
+			} else if ( event.type === "mousedown" ) {
+				return;
+			}
+			if ( min > max && !this._sliderTarget ) {
+				//this prevents min from being greater then max
+				thisSlider.val( first ? max: min ).slider( "refresh" );
+				this._trigger( "normalize" );
+			} else if ( min > max ) {
+				//this makes it so clicks on the target on either extreme go to the closest handle
+				thisSlider.val( this._targetVal ).slider( "refresh" );
+
+				//You must wait for the stack to unwind so first slider is updated before updating second
+				setTimeout( function() {
+					otherSlider.val( first ? min: max ).slider( "refresh" );
+					$.data( otherSlider.get(0), "mobile-slider" ).handle.focus();
+					self._sliderFirst.css( "z-index", first ? "" : 1 );
+					self._trigger( "normalize" );
+				}, 0 );
+				this._proxy = ( first ) ? "first" : "last";
+			}
+			//fixes issue where when both _sliders are at min they cannot be adjusted
+			if ( min === max ) {
+				$.data( thisSlider.get(0), "mobile-slider" ).handle.css( "z-index", 1 );
+				$.data( otherSlider.get(0), "mobile-slider" ).handle.css( "z-index", 0 );
+			} else {
+				$.data( otherSlider.get(0), "mobile-slider" ).handle.css( "z-index", "" );
+				$.data( thisSlider.get(0), "mobile-slider" ).handle.css( "z-index", "" );
+			}
+
+			this._updateHighlight();
+
+			if ( min >= max ) {
+				return false;
+			}
+		},
+
+		_updateHighlight: function() {
+			var min = parseInt( $.data( this._inputFirst.get(0), "mobile-slider" ).handle.get(0).style.left, 10 ),
+				max = parseInt( $.data( this._inputLast.get(0), "mobile-slider" ).handle.get(0).style.left, 10 ),
+				width = (max - min);
+
+			this.element.find( ".ui-slider-bg" ).css({
+				"margin-left": min + "%",
+				"width": width + "%"
+			});
+		},
+
+		_setTheme: function( value ) {
+			this._inputFirst.slider( "option", "theme", value );
+			this._inputLast.slider( "option", "theme", value );
+		},
+
+		_setTrackTheme: function( value ) {
+			this._inputFirst.slider( "option", "trackTheme", value );
+			this._inputLast.slider( "option", "trackTheme", value );
+		},
+
+		_setMini: function( value ) {
+			this._inputFirst.slider( "option", "mini", value );
+			this._inputLast.slider( "option", "mini", value );
+			this.element.toggleClass( "ui-mini", !!value );
+		},
+
+		_setHighlight: function( value ) {
+			this._inputFirst.slider( "option", "highlight", value );
+			this._inputLast.slider( "option", "highlight", value );
+		},
+
+		_destroy: function() {
+			this._label.prependTo( this.element );
+			this.element.removeClass( "ui-rangeslider ui-mini" );
+			this._inputFirst.after( this._sliderFirst );
+			this._inputLast.after( this._sliderLast );
+			this._sliders.remove();
+			this.element.find( "input" ).removeClass( "ui-rangeslider-first ui-rangeslider-last" ).slider( "destroy" );
+		}
+
+	}, $.mobile.behaviors.formReset ) );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+	$.widget( "mobile.textinput", $.mobile.textinput, {
+		options: {
+			clearBtn: false,
+			clearBtnText: "Clear text"
+		},
+
+		_create: function() {
+			this._super();
+
+			if ( !!this.options.clearBtn || this.isSearch ) {
+				this._addClearBtn();
+			}
+		},
+
+		clearButton: function() {
+
+			return $( "<a href='#' class='ui-input-clear ui-btn ui-icon-delete ui-btn-icon-notext ui-corner-all" +
+    "' title='" + this.options.clearBtnText + "'>" + this.options.clearBtnText + "</a>" );
+
+		},
+
+		_clearBtnClick: function( event ) {
+			this.element.val( "" )
+					.focus()
+					.trigger( "change" );
+
+			this._clearBtn.addClass( "ui-input-clear-hidden" );
+			event.preventDefault();
+		},
+
+		_addClearBtn: function() {
+
+			if ( !this.options.enhanced ) {
+				this._enhanceClear();
+			}
+
+			$.extend( this, {
+				_clearBtn: this.widget().find("a.ui-input-clear")
+			});
+
+			this._bindClearEvents();
+
+			this._toggleClear();
+
+		},
+
+		_enhanceClear: function() {
+
+			this.clearButton().appendTo( this.widget() );
+			this.widget().addClass( "ui-input-has-clear" );
+
+		},
+
+		_bindClearEvents: function() {
+
+			this._on( this._clearBtn, {
+				"click": "_clearBtnClick"
+			});
+
+			this._on({
+				"keyup": "_toggleClear",
+				"change": "_toggleClear",
+				"input": "_toggleClear",
+				"focus": "_toggleClear",
+				"blur": "_toggleClear",
+				"cut": "_toggleClear",
+				"paste": "_toggleClear"
+
+			});
+
+		},
+
+		_unbindClear: function() {
+			this._off( this._clearBtn, "click");
+			this._off( this.element, "keyup change input focus blur cut paste" );
+		},
+
+		_setOptions: function( options ) {
+			this._super( options );
+
+			if ( options.clearBtn !== undefined &&
+				!this.element.is( "textarea, :jqmData(type='range')" ) ) {
+				if ( options.clearBtn ) {
+					this._addClearBtn();
+				} else {
+					this._destroyClear();
+				}
+			}
+
+			if ( options.clearBtnText !== undefined && this._clearBtn !== undefined ) {
+				this._clearBtn.text( options.clearBtnText )
+					.attr("title", options.clearBtnText);
+			}
+		},
+
+		_toggleClear: function() {
+			this._delay( "_toggleClearClass", 0 );
+		},
+
+		_toggleClearClass: function() {
+			this._clearBtn.toggleClass( "ui-input-clear-hidden", !this.element.val() );
+		},
+
+		_destroyClear: function() {
+			this.widget().removeClass( "ui-input-has-clear" );
+			this._unbindClear();
+			this._clearBtn.remove();
+		},
+
+		_destroy: function() {
+			this._super();
+			this._destroyClear();
+		}
+
+	});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+	$.widget( "mobile.textinput", $.mobile.textinput, {
+		options: {
+			autogrow:true,
+			keyupTimeoutBuffer: 100
+		},
+
+		_create: function() {
+			this._super();
+
+			if ( this.options.autogrow && this.isTextarea ) {
+				this._autogrow();
+			}
+		},
+
+		_autogrow: function() {
+			this.element.addClass( "ui-textinput-autogrow" );
+
+			this._on({
+				"keyup": "_timeout",
+				"change": "_timeout",
+				"input": "_timeout",
+				"paste": "_timeout"
+			});
+
+			// Attach to the various you-have-become-visible notifications that the
+			// various framework elements emit.
+			// TODO: Remove all but the updatelayout handler once #6426 is fixed.
+			this._on( true, this.document, {
+
+				// TODO: Move to non-deprecated event
+				"pageshow": "_handleShow",
+				"popupbeforeposition": "_handleShow",
+				"updatelayout": "_handleShow",
+				"panelopen": "_handleShow"
+			});
+		},
+
+		// Synchronously fix the widget height if this widget's parents are such
+		// that they show/hide content at runtime. We still need to check whether
+		// the widget is actually visible in case it is contained inside multiple
+		// such containers. For example: panel contains collapsible contains
+		// autogrow textinput. The panel may emit "panelopen" indicating that its
+		// content has become visible, but the collapsible is still collapsed, so
+		// the autogrow textarea is still not visible.
+		_handleShow: function( event ) {
+			if ( $.contains( event.target, this.element[ 0 ] ) &&
+				this.element.is( ":visible" ) ) {
+
+				if ( event.type !== "popupbeforeposition" ) {
+					this.element
+						.addClass( "ui-textinput-autogrow-resize" )
+						.animationComplete(
+							$.proxy( function() {
+								this.element.removeClass( "ui-textinput-autogrow-resize" );
+							}, this ),
+						"transition" );
+				}
+				this._timeout();
+			}
+		},
+
+		_unbindAutogrow: function() {
+			this.element.removeClass( "ui-textinput-autogrow" );
+			this._off( this.element, "keyup change input paste" );
+			this._off( this.document,
+				"pageshow popupbeforeposition updatelayout panelopen" );
+		},
+
+		keyupTimeout: null,
+
+		_prepareHeightUpdate: function( delay ) {
+			if ( this.keyupTimeout ) {
+				clearTimeout( this.keyupTimeout );
+			}
+			if ( delay === undefined ) {
+				this._updateHeight();
+			} else {
+				this.keyupTimeout = this._delay( "_updateHeight", delay );
+			}
+		},
+
+		_timeout: function() {
+			this._prepareHeightUpdate( this.options.keyupTimeoutBuffer );
+		},
+
+		_updateHeight: function() {
+			var paddingTop, paddingBottom, paddingHeight, scrollHeight, clientHeight,
+				borderTop, borderBottom, borderHeight, height,
+				scrollTop = this.window.scrollTop();
+			this.keyupTimeout = 0;
+
+			// IE8 textareas have the onpage property - others do not
+			if ( !( "onpage" in this.element[ 0 ] ) ) {
+				this.element.css({
+					"height": 0,
+					"min-height": 0,
+					"max-height": 0
+				});
+			}
+
+			scrollHeight = this.element[ 0 ].scrollHeight;
+			clientHeight = this.element[ 0 ].clientHeight;
+			borderTop = parseFloat( this.element.css( "border-top-width" ) );
+			borderBottom = parseFloat( this.element.css( "border-bottom-width" ) );
+			borderHeight = borderTop + borderBottom;
+			height = scrollHeight + borderHeight + 15;
+
+			// Issue 6179: Padding is not included in scrollHeight and
+			// clientHeight by Firefox if no scrollbar is visible. Because
+			// textareas use the border-box box-sizing model, padding should be
+			// included in the new (assigned) height. Because the height is set
+			// to 0, clientHeight == 0 in Firefox. Therefore, we can use this to
+			// check if padding must be added.
+			if ( clientHeight === 0 ) {
+				paddingTop = parseFloat( this.element.css( "padding-top" ) );
+				paddingBottom = parseFloat( this.element.css( "padding-bottom" ) );
+				paddingHeight = paddingTop + paddingBottom;
+
+				height += paddingHeight;
+			}
+
+			this.element.css({
+				"height": height,
+				"min-height": "",
+				"max-height": ""
+			});
+
+			this.window.scrollTop( scrollTop );
+		},
+
+		refresh: function() {
+			if ( this.options.autogrow && this.isTextarea ) {
+				this._updateHeight();
+			}
+		},
+
+		_setOptions: function( options ) {
+
+			this._super( options );
+
+			if ( options.autogrow !== undefined && this.isTextarea ) {
+				if ( options.autogrow ) {
+					this._autogrow();
+				} else {
+					this._unbindAutogrow();
+				}
+			}
+		}
+
+	});
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.selectmenu", $.extend( {
+	initSelector: "select:not( :jqmData(role='slider')):not( :jqmData(role='flipswitch') )",
+
+	options: {
+		theme: null,
+		icon: "carat-d",
+		iconpos: "right",
+		inline: false,
+		corners: true,
+		shadow: true,
+		iconshadow: false, /* TODO: Deprecated in 1.4, remove in 1.5. */
+		overlayTheme: null,
+		dividerTheme: null,
+		hidePlaceholderMenuItems: true,
+		closeText: "Close",
+		nativeMenu: true,
+		// This option defaults to true on iOS devices.
+		preventFocusZoom: /iPhone|iPad|iPod/.test( navigator.platform ) && navigator.userAgent.indexOf( "AppleWebKit" ) > -1,
+		mini: false
+	},
+
+	_button: function() {
+		return $( "<div/>" );
+	},
+
+	_setDisabled: function( value ) {
+		this.element.attr( "disabled", value );
+		this.button.attr( "aria-disabled", value );
+		return this._setOption( "disabled", value );
+	},
+
+	_focusButton : function() {
+		var self = this;
+
+		setTimeout( function() {
+			self.button.focus();
+		}, 40);
+	},
+
+	_selectOptions: function() {
+		return this.select.find( "option" );
+	},
+
+	// setup items that are generally necessary for select menu extension
+	_preExtension: function() {
+		var inline = this.options.inline || this.element.jqmData( "inline" ),
+			mini = this.options.mini || this.element.jqmData( "mini" ),
+			classes = "";
+		// TODO: Post 1.1--once we have time to test thoroughly--any classes manually applied to the original element should be carried over to the enhanced element, with an `-enhanced` suffix. See https://github.com/jquery/jquery-mobile/issues/3577
+		/* if ( $el[0].className.length ) {
+			classes = $el[0].className;
+		} */
+		if ( !!~this.element[0].className.indexOf( "ui-btn-left" ) ) {
+			classes = " ui-btn-left";
+		}
+
+		if (  !!~this.element[0].className.indexOf( "ui-btn-right" ) ) {
+			classes = " ui-btn-right";
+		}
+
+		if ( inline ) {
+			classes += " ui-btn-inline";
+		}
+		if ( mini ) {
+			classes += " ui-mini";
+		}
+
+		this.select = this.element.removeClass( "ui-btn-left ui-btn-right" ).wrap( "<div class='ui-select" + classes + "'>" );
+		this.selectId  = this.select.attr( "id" ) || ( "select-" + this.uuid );
+		this.buttonId = this.selectId + "-button";
+		this.label = $( "label[for='"+ this.selectId +"']" );
+		this.isMultiple = this.select[ 0 ].multiple;
+	},
+
+	_destroy: function() {
+		var wrapper = this.element.parents( ".ui-select" );
+		if ( wrapper.length > 0 ) {
+			if ( wrapper.is( ".ui-btn-left, .ui-btn-right" ) ) {
+				this.element.addClass( wrapper.hasClass( "ui-btn-left" ) ? "ui-btn-left" : "ui-btn-right" );
+			}
+			this.element.insertAfter( wrapper );
+			wrapper.remove();
+		}
+	},
+
+	_create: function() {
+		this._preExtension();
+
+		this.button = this._button();
+
+		var self = this,
+
+			options = this.options,
+
+			iconpos = options.icon ? ( options.iconpos || this.select.jqmData( "iconpos" ) ) : false,
+
+			button = this.button
+				.insertBefore( this.select )
+				.attr( "id", this.buttonId )
+				.addClass( "ui-btn" +
+					( options.icon ? ( " ui-icon-" + options.icon + " ui-btn-icon-" + iconpos +
+					( options.iconshadow ? " ui-shadow-icon" : "" ) ) :	"" ) + /* TODO: Remove in 1.5. */
+					( options.theme ? " ui-btn-" + options.theme : "" ) +
+					( options.corners ? " ui-corner-all" : "" ) +
+					( options.shadow ? " ui-shadow" : "" ) );
+
+		this.setButtonText();
+
+		// Opera does not properly support opacity on select elements
+		// In Mini, it hides the element, but not its text
+		// On the desktop,it seems to do the opposite
+		// for these reasons, using the nativeMenu option results in a full native select in Opera
+		if ( options.nativeMenu && window.opera && window.opera.version ) {
+			button.addClass( "ui-select-nativeonly" );
+		}
+
+		// Add counter for multi selects
+		if ( this.isMultiple ) {
+			this.buttonCount = $( "<span>" )
+				.addClass( "ui-li-count ui-body-inherit" )
+				.hide()
+				.appendTo( button.addClass( "ui-li-has-count" ) );
+		}
+
+		// Disable if specified
+		if ( options.disabled || this.element.attr( "disabled" )) {
+			this.disable();
+		}
+
+		// Events on native select
+		this.select.change(function() {
+			self.refresh();
+
+			if ( !!options.nativeMenu ) {
+				this.blur();
+			}
+		});
+
+		this._handleFormReset();
+
+		this._on( this.button, {
+			keydown: "_handleKeydown"
+		});
+
+		this.build();
+	},
+
+	build: function() {
+		var self = this;
+
+		this.select
+			.appendTo( self.button )
+			.bind( "vmousedown", function() {
+				// Add active class to button
+				self.button.addClass( $.mobile.activeBtnClass );
+			})
+			.bind( "focus", function() {
+				self.button.addClass( $.mobile.focusClass );
+			})
+			.bind( "blur", function() {
+				self.button.removeClass( $.mobile.focusClass );
+			})
+			.bind( "focus vmouseover", function() {
+				self.button.trigger( "vmouseover" );
+			})
+			.bind( "vmousemove", function() {
+				// Remove active class on scroll/touchmove
+				self.button.removeClass( $.mobile.activeBtnClass );
+			})
+			.bind( "change blur vmouseout", function() {
+				self.button.trigger( "vmouseout" )
+					.removeClass( $.mobile.activeBtnClass );
+			});
+
+		// In many situations, iOS will zoom into the select upon tap, this prevents that from happening
+		self.button.bind( "vmousedown", function() {
+			if ( self.options.preventFocusZoom ) {
+					$.mobile.zoom.disable( true );
+			}
+		});
+		self.label.bind( "click focus", function() {
+			if ( self.options.preventFocusZoom ) {
+					$.mobile.zoom.disable( true );
+			}
+		});
+		self.select.bind( "focus", function() {
+			if ( self.options.preventFocusZoom ) {
+					$.mobile.zoom.disable( true );
+			}
+		});
+		self.button.bind( "mouseup", function() {
+			if ( self.options.preventFocusZoom ) {
+				setTimeout(function() {
+					$.mobile.zoom.enable( true );
+				}, 0 );
+			}
+		});
+		self.select.bind( "blur", function() {
+			if ( self.options.preventFocusZoom ) {
+				$.mobile.zoom.enable( true );
+			}
+		});
+
+	},
+
+	selected: function() {
+		return this._selectOptions().filter( ":selected" );
+	},
+
+	selectedIndices: function() {
+		var self = this;
+
+		return this.selected().map(function() {
+			return self._selectOptions().index( this );
+		}).get();
+	},
+
+	setButtonText: function() {
+		var self = this,
+			selected = this.selected(),
+			text = this.placeholder,
+			span = $( document.createElement( "span" ) );
+
+		this.button.children( "span" ).not( ".ui-li-count" ).remove().end().end().prepend( (function() {
+			if ( selected.length ) {
+				text = selected.map(function() {
+					return $( this ).text();
+				}).get().join( ", " );
+			} else {
+				text = self.placeholder;
+			}
+
+			if ( text ) {
+				span.text( text );
+			} else {
+
+				// Set the contents to &nbsp; which we write as &#160; to be XHTML compliant - see gh-6699
+				span.html( "&#160;" );
+			}
+
+			// TODO possibly aggregate multiple select option classes
+			return span
+				.addClass( self.select.attr( "class" ) )
+				.addClass( selected.attr( "class" ) )
+				.removeClass( "ui-screen-hidden" );
+		})());
+	},
+
+	setButtonCount: function() {
+		var selected = this.selected();
+
+		// multiple count inside button
+		if ( this.isMultiple ) {
+			this.buttonCount[ selected.length > 1 ? "show" : "hide" ]().text( selected.length );
+		}
+	},
+
+	_handleKeydown: function( /* event */ ) {
+		this._delay( "_refreshButton" );
+	},
+
+	_reset: function() {
+		this.refresh();
+	},
+
+	_refreshButton: function() {
+		this.setButtonText();
+		this.setButtonCount();
+	},
+
+	refresh: function() {
+		this._refreshButton();
+	},
+
+	// open and close preserved in native selects
+	// to simplify users code when looping over selects
+	open: $.noop,
+	close: $.noop,
+
+	disable: function() {
+		this._setDisabled( true );
+		this.button.addClass( "ui-state-disabled" );
+	},
+
+	enable: function() {
+		this._setDisabled( false );
+		this.button.removeClass( "ui-state-disabled" );
+	}
+}, $.mobile.behaviors.formReset ) );
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.mobile.links = function( target ) {
+
+	//links within content areas, tests included with page
+	$( target )
+		.find( "a" )
+		.jqmEnhanceable()
+		.filter( ":jqmData(rel='popup')[href][href!='']" )
+		.each( function() {
+			// Accessibility info for popups
+			var element = this,
+				idref = element.getAttribute( "href" ).substring( 1 );
+
+			if ( idref ) {
+				element.setAttribute( "aria-haspopup", true );
+				element.setAttribute( "aria-owns", idref );
+				element.setAttribute( "aria-expanded", false );
+			}
+		})
+		.end()
+		.not( ".ui-btn, :jqmData(role='none'), :jqmData(role='nojs')" )
+		.addClass( "ui-link" );
+
+};
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+
+function fitSegmentInsideSegment( windowSize, segmentSize, offset, desired ) {
+	var returnValue = desired;
+
+	if ( windowSize < segmentSize ) {
+		// Center segment if it's bigger than the window
+		returnValue = offset + ( windowSize - segmentSize ) / 2;
+	} else {
+		// Otherwise center it at the desired coordinate while keeping it completely inside the window
+		returnValue = Math.min( Math.max( offset, desired - segmentSize / 2 ), offset + windowSize - segmentSize );
+	}
+
+	return returnValue;
+}
+
+function getWindowCoordinates( theWindow ) {
+	return {
+		x: theWindow.scrollLeft(),
+		y: theWindow.scrollTop(),
+		cx: ( theWindow[ 0 ].innerWidth || theWindow.width() ),
+		cy: ( theWindow[ 0 ].innerHeight || theWindow.height() )
+	};
+}
+
+$.widget( "mobile.popup", {
+	options: {
+		wrapperClass: null,
+		theme: null,
+		overlayTheme: null,
+		shadow: true,
+		corners: true,
+		transition: "none",
+		positionTo: "origin",
+		tolerance: null,
+		closeLinkSelector: "a:jqmData(rel='back')",
+		closeLinkEvents: "click.popup",
+		navigateEvents: "navigate.popup",
+		closeEvents: "navigate.popup pagebeforechange.popup",
+		dismissible: true,
+		enhanced: false,
+
+		// NOTE Windows Phone 7 has a scroll position caching issue that
+		//      requires us to disable popup history management by default
+		//      https://github.com/jquery/jquery-mobile/issues/4784
+		//
+		// NOTE this option is modified in _create!
+		history: !$.mobile.browser.oldIE
+	},
+
+	_create: function() {
+		var theElement = this.element,
+			myId = theElement.attr( "id" ),
+			currentOptions = this.options;
+
+		// We need to adjust the history option to be false if there's no AJAX nav.
+		// We can't do it in the option declarations because those are run before
+		// it is determined whether there shall be AJAX nav.
+		currentOptions.history = currentOptions.history && $.mobile.ajaxEnabled && $.mobile.hashListeningEnabled;
+
+		// Define instance variables
+		$.extend( this, {
+			_scrollTop: 0,
+			_page: theElement.closest( ".ui-page" ),
+			_ui: null,
+			_fallbackTransition: "",
+			_currentTransition: false,
+			_prerequisites: null,
+			_isOpen: false,
+			_tolerance: null,
+			_resizeData: null,
+			_ignoreResizeTo: 0,
+			_orientationchangeInProgress: false
+		});
+
+		if ( this._page.length === 0 ) {
+			this._page = $( "body" );
+		}
+
+		if ( currentOptions.enhanced ) {
+			this._ui = {
+				container: theElement.parent(),
+				screen: theElement.parent().prev(),
+				placeholder: $( this.document[ 0 ].getElementById( myId + "-placeholder" ) )
+			};
+		} else {
+			this._ui = this._enhance( theElement, myId );
+			this._applyTransition( currentOptions.transition );
+		}
+		this
+			._setTolerance( currentOptions.tolerance )
+			._ui.focusElement = this._ui.container;
+
+		// Event handlers
+		this._on( this._ui.screen, { "vclick": "_eatEventAndClose" } );
+		this._on( this.window, {
+			orientationchange: $.proxy( this, "_handleWindowOrientationchange" ),
+			resize: $.proxy( this, "_handleWindowResize" ),
+			keyup: $.proxy( this, "_handleWindowKeyUp" )
+		});
+		this._on( this.document, { "focusin": "_handleDocumentFocusIn" } );
+	},
+
+	_enhance: function( theElement, myId ) {
+		var currentOptions = this.options,
+			wrapperClass = currentOptions.wrapperClass,
+			ui = {
+				screen: $( "<div class='ui-screen-hidden ui-popup-screen " +
+				this._themeClassFromOption( "ui-overlay-", currentOptions.overlayTheme ) + "'></div>" ),
+				placeholder: $( "<div style='display: none;'><!-- placeholder --></div>" ),
+				container: $( "<div class='ui-popup-container ui-popup-hidden ui-popup-truncate" +
+					( wrapperClass ? ( " " + wrapperClass ) : "" ) + "'></div>" )
+			},
+			fragment = this.document[ 0 ].createDocumentFragment();
+
+		fragment.appendChild( ui.screen[ 0 ] );
+		fragment.appendChild( ui.container[ 0 ] );
+
+		if ( myId ) {
+			ui.screen.attr( "id", myId + "-screen" );
+			ui.container.attr( "id", myId + "-popup" );
+			ui.placeholder
+				.attr( "id", myId + "-placeholder" )
+				.html( "<!-- placeholder for " + myId + " -->" );
+		}
+
+		// Apply the proto
+		this._page[ 0 ].appendChild( fragment );
+		// Leave a placeholder where the element used to be
+		ui.placeholder.insertAfter( theElement );
+		theElement
+			.detach()
+			.addClass( "ui-popup " +
+				this._themeClassFromOption( "ui-body-", currentOptions.theme ) + " " +
+				( currentOptions.shadow ? "ui-overlay-shadow " : "" ) +
+				( currentOptions.corners ? "ui-corner-all " : "" ) )
+			.appendTo( ui.container );
+
+		return ui;
+	},
+
+	_eatEventAndClose: function( theEvent ) {
+		theEvent.preventDefault();
+		theEvent.stopImmediatePropagation();
+		if ( this.options.dismissible ) {
+			this.close();
+		}
+		return false;
+	},
+
+	// Make sure the screen covers the entire document - CSS is sometimes not
+	// enough to accomplish this.
+	_resizeScreen: function() {
+		var screen = this._ui.screen,
+			popupHeight = this._ui.container.outerHeight( true ),
+			screenHeight = screen.removeAttr( "style" ).height(),
+
+			// Subtracting 1 here is necessary for an obscure Andrdoid 4.0 bug where
+			// the browser hangs if the screen covers the entire document :/
+			documentHeight = this.document.height() - 1;
+
+		if ( screenHeight < documentHeight ) {
+			screen.height( documentHeight );
+		} else if ( popupHeight > screenHeight ) {
+			screen.height( popupHeight );
+		}
+	},
+
+	_handleWindowKeyUp: function( theEvent ) {
+		if ( this._isOpen && theEvent.keyCode === $.mobile.keyCode.ESCAPE ) {
+			return this._eatEventAndClose( theEvent );
+		}
+	},
+
+	_expectResizeEvent: function() {
+		var windowCoordinates = getWindowCoordinates( this.window );
+
+		if ( this._resizeData ) {
+			if ( windowCoordinates.x === this._resizeData.windowCoordinates.x &&
+				windowCoordinates.y === this._resizeData.windowCoordinates.y &&
+				windowCoordinates.cx === this._resizeData.windowCoordinates.cx &&
+				windowCoordinates.cy === this._resizeData.windowCoordinates.cy ) {
+				// timeout not refreshed
+				return false;
+			} else {
+				// clear existing timeout - it will be refreshed below
+				clearTimeout( this._resizeData.timeoutId );
+			}
+		}
+
+		this._resizeData = {
+			timeoutId: this._delay( "_resizeTimeout", 200 ),
+			windowCoordinates: windowCoordinates
+		};
+
+		return true;
+	},
+
+	_resizeTimeout: function() {
+		if ( this._isOpen ) {
+			if ( !this._expectResizeEvent() ) {
+				if ( this._ui.container.hasClass( "ui-popup-hidden" ) ) {
+					// effectively rapid-open the popup while leaving the screen intact
+					this._ui.container.removeClass( "ui-popup-hidden ui-popup-truncate" );
+					this.reposition( { positionTo: "window" } );
+					this._ignoreResizeEvents();
+				}
+
+				this._resizeScreen();
+				this._resizeData = null;
+				this._orientationchangeInProgress = false;
+			}
+		} else {
+			this._resizeData = null;
+			this._orientationchangeInProgress = false;
+		}
+	},
+
+	_stopIgnoringResizeEvents: function() {
+		this._ignoreResizeTo = 0;
+	},
+
+	_ignoreResizeEvents: function() {
+		if ( this._ignoreResizeTo ) {
+			clearTimeout( this._ignoreResizeTo );
+		}
+		this._ignoreResizeTo = this._delay( "_stopIgnoringResizeEvents", 1000 );
+	},
+
+	_handleWindowResize: function(/* theEvent */) {
+		if ( this._isOpen && this._ignoreResizeTo === 0 ) {
+			if ( ( this._expectResizeEvent() || this._orientationchangeInProgress ) &&
+				!this._ui.container.hasClass( "ui-popup-hidden" ) ) {
+				// effectively rapid-close the popup while leaving the screen intact
+				this._ui.container
+					.addClass( "ui-popup-hidden ui-popup-truncate" )
+					.removeAttr( "style" );
+			}
+		}
+	},
+
+	_handleWindowOrientationchange: function(/* theEvent */) {
+		if ( !this._orientationchangeInProgress && this._isOpen && this._ignoreResizeTo === 0 ) {
+			this._expectResizeEvent();
+			this._orientationchangeInProgress = true;
+		}
+	},
+
+	// When the popup is open, attempting to focus on an element that is not a
+	// child of the popup will redirect focus to the popup
+	_handleDocumentFocusIn: function( theEvent ) {
+		var target,
+			targetElement = theEvent.target,
+			ui = this._ui;
+
+		if ( !this._isOpen ) {
+			return;
+		}
+
+		if ( targetElement !== ui.container[ 0 ] ) {
+			target = $( targetElement );
+			if ( 0 === target.parents().filter( ui.container[ 0 ] ).length ) {
+				$( this.document[ 0 ].activeElement ).one( "focus", function(/* theEvent */) {
+					target.blur();
+				});
+				ui.focusElement.focus();
+				theEvent.preventDefault();
+				theEvent.stopImmediatePropagation();
+				return false;
+			} else if ( ui.focusElement[ 0 ] === ui.container[ 0 ] ) {
+				ui.focusElement = target;
+			}
+		}
+
+		this._ignoreResizeEvents();
+	},
+
+	_themeClassFromOption: function( prefix, value ) {
+		return ( value ? ( value === "none" ? "" : ( prefix + value ) ) : ( prefix + "inherit" ) );
+	},
+
+	_applyTransition: function( value ) {
+		if ( value ) {
+			this._ui.container.removeClass( this._fallbackTransition );
+			if ( value !== "none" ) {
+				this._fallbackTransition = $.mobile._maybeDegradeTransition( value );
+				if ( this._fallbackTransition === "none" ) {
+					this._fallbackTransition = "";
+				}
+				this._ui.container.addClass( this._fallbackTransition );
+			}
+		}
+
+		return this;
+	},
+
+	_setOptions: function( newOptions ) {
+		var currentOptions = this.options,
+			theElement = this.element,
+			screen = this._ui.screen;
+
+		if ( newOptions.wrapperClass !== undefined ) {
+			this._ui.container
+				.removeClass( currentOptions.wrapperClass )
+				.addClass( newOptions.wrapperClass );
+		}
+
+		if ( newOptions.theme !== undefined ) {
+			theElement
+				.removeClass( this._themeClassFromOption( "ui-body-", currentOptions.theme ) )
+				.addClass( this._themeClassFromOption( "ui-body-", newOptions.theme ) );
+		}
+
+		if ( newOptions.overlayTheme !== undefined ) {
+			screen
+				.removeClass( this._themeClassFromOption( "ui-overlay-", currentOptions.overlayTheme ) )
+				.addClass( this._themeClassFromOption( "ui-overlay-", newOptions.overlayTheme ) );
+
+			if ( this._isOpen ) {
+				screen.addClass( "in" );
+			}
+		}
+
+		if ( newOptions.shadow !== undefined ) {
+			theElement.toggleClass( "ui-overlay-shadow", newOptions.shadow );
+		}
+
+		if ( newOptions.corners !== undefined ) {
+			theElement.toggleClass( "ui-corner-all", newOptions.corners );
+		}
+
+		if ( newOptions.transition !== undefined ) {
+			if ( !this._currentTransition ) {
+				this._applyTransition( newOptions.transition );
+			}
+		}
+
+		if ( newOptions.tolerance !== undefined ) {
+			this._setTolerance( newOptions.tolerance );
+		}
+
+		if ( newOptions.disabled !== undefined ) {
+			if ( newOptions.disabled ) {
+				this.close();
+			}
+		}
+
+		return this._super( newOptions );
+	},
+
+	_setTolerance: function( value ) {
+		var tol = { t: 30, r: 15, b: 30, l: 15 },
+			ar;
+
+		if ( value !== undefined ) {
+			ar = String( value ).split( "," );
+
+			$.each( ar, function( idx, val ) { ar[ idx ] = parseInt( val, 10 ); } );
+
+			switch( ar.length ) {
+				// All values are to be the same
+				case 1:
+					if ( !isNaN( ar[ 0 ] ) ) {
+						tol.t = tol.r = tol.b = tol.l = ar[ 0 ];
+					}
+					break;
+
+				// The first value denotes top/bottom tolerance, and the second value denotes left/right tolerance
+				case 2:
+					if ( !isNaN( ar[ 0 ] ) ) {
+						tol.t = tol.b = ar[ 0 ];
+					}
+					if ( !isNaN( ar[ 1 ] ) ) {
+						tol.l = tol.r = ar[ 1 ];
+					}
+					break;
+
+				// The array contains values in the order top, right, bottom, left
+				case 4:
+					if ( !isNaN( ar[ 0 ] ) ) {
+						tol.t = ar[ 0 ];
+					}
+					if ( !isNaN( ar[ 1 ] ) ) {
+						tol.r = ar[ 1 ];
+					}
+					if ( !isNaN( ar[ 2 ] ) ) {
+						tol.b = ar[ 2 ];
+					}
+					if ( !isNaN( ar[ 3 ] ) ) {
+						tol.l = ar[ 3 ];
+					}
+					break;
+
+				default:
+					break;
+			}
+		}
+
+		this._tolerance = tol;
+		return this;
+	},
+
+	_clampPopupWidth: function( infoOnly ) {
+		var menuSize,
+			windowCoordinates = getWindowCoordinates( this.window ),
+			// rectangle within which the popup must fit
+			rectangle = {
+				x: this._tolerance.l,
+				y: windowCoordinates.y + this._tolerance.t,
+				cx: windowCoordinates.cx - this._tolerance.l - this._tolerance.r,
+				cy: windowCoordinates.cy - this._tolerance.t - this._tolerance.b
+			};
+
+		if ( !infoOnly ) {
+			// Clamp the width of the menu before grabbing its size
+			this._ui.container.css( "max-width", rectangle.cx );
+		}
+
+		menuSize = {
+			cx: this._ui.container.outerWidth( true ),
+			cy: this._ui.container.outerHeight( true )
+		};
+
+		return { rc: rectangle, menuSize: menuSize };
+	},
+
+	_calculateFinalLocation: function( desired, clampInfo ) {
+		var returnValue,
+			rectangle = clampInfo.rc,
+			menuSize = clampInfo.menuSize;
+
+		// Center the menu over the desired coordinates, while not going outside
+		// the window tolerances. This will center wrt. the window if the popup is
+		// too large.
+		returnValue = {
+			left: fitSegmentInsideSegment( rectangle.cx, menuSize.cx, rectangle.x, desired.x ),
+			top: fitSegmentInsideSegment( rectangle.cy, menuSize.cy, rectangle.y, desired.y )
+		};
+
+		// Make sure the top of the menu is visible
+		returnValue.top = Math.max( 0, returnValue.top );
+
+		// If the height of the menu is smaller than the height of the document
+		// align the bottom with the bottom of the document
+
+		returnValue.top -= Math.min( returnValue.top,
+			Math.max( 0, returnValue.top + menuSize.cy - this.document.height() ) );
+
+		return returnValue;
+	},
+
+	// Try and center the overlay over the given coordinates
+	_placementCoords: function( desired ) {
+		return this._calculateFinalLocation( desired, this._clampPopupWidth() );
+	},
+
+	_createPrerequisites: function( screenPrerequisite, containerPrerequisite, whenDone ) {
+		var prerequisites,
+			self = this;
+
+		// It is important to maintain both the local variable prerequisites and
+		// self._prerequisites. The local variable remains in the closure of the
+		// functions which call the callbacks passed in. The comparison between the
+		// local variable and self._prerequisites is necessary, because once a
+		// function has been passed to .animationComplete() it will be called next
+		// time an animation completes, even if that's not the animation whose end
+		// the function was supposed to catch (for example, if an abort happens
+		// during the opening animation, the .animationComplete handler is not
+		// called for that animation anymore, but the handler remains attached, so
+		// it is called the next time the popup is opened - making it stale.
+		// Comparing the local variable prerequisites to the widget-level variable
+		// self._prerequisites ensures that callbacks triggered by a stale
+		// .animationComplete will be ignored.
+
+		prerequisites = {
+			screen: $.Deferred(),
+			container: $.Deferred()
+		};
+
+		prerequisites.screen.then( function() {
+			if ( prerequisites === self._prerequisites ) {
+				screenPrerequisite();
+			}
+		});
+
+		prerequisites.container.then( function() {
+			if ( prerequisites === self._prerequisites ) {
+				containerPrerequisite();
+			}
+		});
+
+		$.when( prerequisites.screen, prerequisites.container ).done( function() {
+			if ( prerequisites === self._prerequisites ) {
+				self._prerequisites = null;
+				whenDone();
+			}
+		});
+
+		self._prerequisites = prerequisites;
+	},
+
+	_animate: function( args ) {
+		// NOTE before removing the default animation of the screen
+		//      this had an animate callback that would resolve the deferred
+		//      now the deferred is resolved immediately
+		// TODO remove the dependency on the screen deferred
+		this._ui.screen
+			.removeClass( args.classToRemove )
+			.addClass( args.screenClassToAdd );
+
+		args.prerequisites.screen.resolve();
+
+		if ( args.transition && args.transition !== "none" ) {
+			if ( args.applyTransition ) {
+				this._applyTransition( args.transition );
+			}
+			if ( this._fallbackTransition ) {
+				this._ui.container
+					.addClass( args.containerClassToAdd )
+					.removeClass( args.classToRemove )
+					.animationComplete( $.proxy( args.prerequisites.container, "resolve" ) );
+				return;
+			}
+		}
+		this._ui.container.removeClass( args.classToRemove );
+		args.prerequisites.container.resolve();
+	},
+
+	// The desired coordinates passed in will be returned untouched if no reference element can be identified via
+	// desiredPosition.positionTo. Nevertheless, this function ensures that its return value always contains valid
+	// x and y coordinates by specifying the center middle of the window if the coordinates are absent.
+	// options: { x: coordinate, y: coordinate, positionTo: string: "origin", "window", or jQuery selector
+	_desiredCoords: function( openOptions ) {
+		var offset,
+			dst = null,
+			windowCoordinates = getWindowCoordinates( this.window ),
+			x = openOptions.x,
+			y = openOptions.y,
+			pTo = openOptions.positionTo;
+
+		// Establish which element will serve as the reference
+		if ( pTo && pTo !== "origin" ) {
+			if ( pTo === "window" ) {
+				x = windowCoordinates.cx / 2 + windowCoordinates.x;
+				y = windowCoordinates.cy / 2 + windowCoordinates.y;
+			} else {
+				try {
+					dst = $( pTo );
+				} catch( err ) {
+					dst = null;
+				}
+				if ( dst ) {
+					dst.filter( ":visible" );
+					if ( dst.length === 0 ) {
+						dst = null;
+					}
+				}
+			}
+		}
+
+		// If an element was found, center over it
+		if ( dst ) {
+			offset = dst.offset();
+			x = offset.left + dst.outerWidth() / 2;
+			y = offset.top + dst.outerHeight() / 2;
+		}
+
+		// Make sure x and y are valid numbers - center over the window
+		if ( $.type( x ) !== "number" || isNaN( x ) ) {
+			x = windowCoordinates.cx / 2 + windowCoordinates.x;
+		}
+		if ( $.type( y ) !== "number" || isNaN( y ) ) {
+			y = windowCoordinates.cy / 2 + windowCoordinates.y;
+		}
+
+		return { x: x, y: y };
+	},
+
+	_reposition: function( openOptions ) {
+		// We only care about position-related parameters for repositioning
+		openOptions = {
+			x: openOptions.x,
+			y: openOptions.y,
+			positionTo: openOptions.positionTo
+		};
+		this._trigger( "beforeposition", undefined, openOptions );
+		this._ui.container.offset( this._placementCoords( this._desiredCoords( openOptions ) ) );
+	},
+
+	reposition: function( openOptions ) {
+		if ( this._isOpen ) {
+			this._reposition( openOptions );
+		}
+	},
+
+	_openPrerequisitesComplete: function() {
+		var id = this.element.attr( "id" );
+
+		this._ui.container.addClass( "ui-popup-active" );
+		this._isOpen = true;
+		this._resizeScreen();
+		this._ui.container.attr( "tabindex", "0" ).focus();
+		this._ignoreResizeEvents();
+		if ( id ) {
+			this.document.find( "[aria-haspopup='true'][aria-owns='" +  id + "']" ).attr( "aria-expanded", true );
+		}
+		this._trigger( "afteropen" );
+	},
+
+	_open: function( options ) {
+		var openOptions = $.extend( {}, this.options, options ),
+			// TODO move blacklist to private method
+			androidBlacklist = ( function() {
+				var ua = navigator.userAgent,
+					// Rendering engine is Webkit, and capture major version
+					wkmatch = ua.match( /AppleWebKit\/([0-9\.]+)/ ),
+					wkversion = !!wkmatch && wkmatch[ 1 ],
+					androidmatch = ua.match( /Android (\d+(?:\.\d+))/ ),
+					andversion = !!androidmatch && androidmatch[ 1 ],
+					chromematch = ua.indexOf( "Chrome" ) > -1;
+
+				// Platform is Android, WebKit version is greater than 534.13 ( Android 3.2.1 ) and not Chrome.
+				if ( androidmatch !== null && andversion === "4.0" && wkversion && wkversion > 534.13 && !chromematch ) {
+					return true;
+				}
+				return false;
+			}());
+
+		// Count down to triggering "popupafteropen" - we have two prerequisites:
+		// 1. The popup window animation completes (container())
+		// 2. The screen opacity animation completes (screen())
+		this._createPrerequisites(
+			$.noop,
+			$.noop,
+			$.proxy( this, "_openPrerequisitesComplete" ) );
+
+		this._currentTransition = openOptions.transition;
+		this._applyTransition( openOptions.transition );
+
+		this._ui.screen.removeClass( "ui-screen-hidden" );
+		this._ui.container.removeClass( "ui-popup-truncate" );
+
+		// Give applications a chance to modify the contents of the container before it appears
+		this._reposition( openOptions );
+
+		this._ui.container.removeClass( "ui-popup-hidden" );
+
+		if ( this.options.overlayTheme && androidBlacklist ) {
+			/* TODO: The native browser on Android 4.0.X ("Ice Cream Sandwich") suffers from an issue where the popup overlay appears to be z-indexed above the popup itself when certain other styles exist on the same page -- namely, any element set to `position: fixed` and certain types of input. These issues are reminiscent of previously uncovered bugs in older versions of Android's native browser: https://github.com/scottjehl/Device-Bugs/issues/3
+			This fix closes the following bugs ( I use "closes" with reluctance, and stress that this issue should be revisited as soon as possible ):
+			https://github.com/jquery/jquery-mobile/issues/4816
+			https://github.com/jquery/jquery-mobile/issues/4844
+			https://github.com/jquery/jquery-mobile/issues/4874
+			*/
+
+			// TODO sort out why this._page isn't working
+			this.element.closest( ".ui-page" ).addClass( "ui-popup-open" );
+		}
+		this._animate({
+			additionalCondition: true,
+			transition: openOptions.transition,
+			classToRemove: "",
+			screenClassToAdd: "in",
+			containerClassToAdd: "in",
+			applyTransition: false,
+			prerequisites: this._prerequisites
+		});
+	},
+
+	_closePrerequisiteScreen: function() {
+		this._ui.screen
+			.removeClass( "out" )
+			.addClass( "ui-screen-hidden" );
+	},
+
+	_closePrerequisiteContainer: function() {
+		this._ui.container
+			.removeClass( "reverse out" )
+			.addClass( "ui-popup-hidden ui-popup-truncate" )
+			.removeAttr( "style" );
+	},
+
+	_closePrerequisitesDone: function() {
+		var container = this._ui.container,
+			id = this.element.attr( "id" );
+
+		container.removeAttr( "tabindex" );
+
+		// remove the global mutex for popups
+		$.mobile.popup.active = undefined;
+
+		// Blur elements inside the container, including the container
+		$( ":focus", container[ 0 ] ).add( container[ 0 ] ).blur();
+
+		if ( id ) {
+			this.document.find( "[aria-haspopup='true'][aria-owns='" +  id + "']" ).attr( "aria-expanded", false );
+		}
+
+		// alert users that the popup is closed
+		this._trigger( "afterclose" );
+	},
+
+	_close: function( immediate ) {
+		this._ui.container.removeClass( "ui-popup-active" );
+		this._page.removeClass( "ui-popup-open" );
+
+		this._isOpen = false;
+
+		// Count down to triggering "popupafterclose" - we have two prerequisites:
+		// 1. The popup window reverse animation completes (container())
+		// 2. The screen opacity animation completes (screen())
+		this._createPrerequisites(
+			$.proxy( this, "_closePrerequisiteScreen" ),
+			$.proxy( this, "_closePrerequisiteContainer" ),
+			$.proxy( this, "_closePrerequisitesDone" ) );
+
+		this._animate( {
+			additionalCondition: this._ui.screen.hasClass( "in" ),
+			transition: ( immediate ? "none" : ( this._currentTransition ) ),
+			classToRemove: "in",
+			screenClassToAdd: "out",
+			containerClassToAdd: "reverse out",
+			applyTransition: true,
+			prerequisites: this._prerequisites
+		});
+	},
+
+	_unenhance: function() {
+		if ( this.options.enhanced ) {
+			return;
+		}
+
+		// Put the element back to where the placeholder was and remove the "ui-popup" class
+		this._setOptions( { theme: $.mobile.popup.prototype.options.theme } );
+		this.element
+			// Cannot directly insertAfter() - we need to detach() first, because
+			// insertAfter() will do nothing if the payload div was not attached
+			// to the DOM at the time the widget was created, and so the payload
+			// will remain inside the container even after we call insertAfter().
+			// If that happens and we remove the container a few lines below, we
+			// will cause an infinite recursion - #5244
+			.detach()
+			.insertAfter( this._ui.placeholder )
+			.removeClass( "ui-popup ui-overlay-shadow ui-corner-all ui-body-inherit" );
+		this._ui.screen.remove();
+		this._ui.container.remove();
+		this._ui.placeholder.remove();
+	},
+
+	_destroy: function() {
+		if ( $.mobile.popup.active === this ) {
+			this.element.one( "popupafterclose", $.proxy( this, "_unenhance" ) );
+			this.close();
+		} else {
+			this._unenhance();
+		}
+
+		return this;
+	},
+
+	_closePopup: function( theEvent, data ) {
+		var parsedDst, toUrl,
+			currentOptions = this.options,
+			immediate = false;
+
+		if ( ( theEvent && theEvent.isDefaultPrevented() ) || $.mobile.popup.active !== this ) {
+			return;
+		}
+
+		// restore location on screen
+		window.scrollTo( 0, this._scrollTop );
+
+		if ( theEvent && theEvent.type === "pagebeforechange" && data ) {
+			// Determine whether we need to rapid-close the popup, or whether we can
+			// take the time to run the closing transition
+			if ( typeof data.toPage === "string" ) {
+				parsedDst = data.toPage;
+			} else {
+				parsedDst = data.toPage.jqmData( "url" );
+			}
+			parsedDst = $.mobile.path.parseUrl( parsedDst );
+			toUrl = parsedDst.pathname + parsedDst.search + parsedDst.hash;
+
+			if ( this._myUrl !== $.mobile.path.makeUrlAbsolute( toUrl ) ) {
+				// Going to a different page - close immediately
+				immediate = true;
+			} else {
+				theEvent.preventDefault();
+			}
+		}
+
+		// remove nav bindings
+		this.window.off( currentOptions.closeEvents );
+		// unbind click handlers added when history is disabled
+		this.element.undelegate( currentOptions.closeLinkSelector, currentOptions.closeLinkEvents );
+
+		this._close( immediate );
+	},
+
+	// any navigation event after a popup is opened should close the popup
+	// NOTE the pagebeforechange is bound to catch navigation events that don't
+	//      alter the url (eg, dialogs from popups)
+	_bindContainerClose: function() {
+		this.window
+			.on( this.options.closeEvents, $.proxy( this, "_closePopup" ) );
+	},
+
+	widget: function() {
+		return this._ui.container;
+	},
+
+	// TODO no clear deliniation of what should be here and
+	// what should be in _open. Seems to be "visual" vs "history" for now
+	open: function( options ) {
+		var url, hashkey, activePage, currentIsDialog, hasHash, urlHistory,
+			self = this,
+			currentOptions = this.options;
+
+		// make sure open is idempotent
+		if ( $.mobile.popup.active || currentOptions.disabled ) {
+			return this;
+		}
+
+		// set the global popup mutex
+		$.mobile.popup.active = this;
+		this._scrollTop = this.window.scrollTop();
+
+		// if history alteration is disabled close on navigate events
+		// and leave the url as is
+		if ( !( currentOptions.history ) ) {
+			self._open( options );
+			self._bindContainerClose();
+
+			// When histoy is disabled we have to grab the data-rel
+			// back link clicks so we can close the popup instead of
+			// relying on history to do it for us
+			self.element
+				.delegate( currentOptions.closeLinkSelector, currentOptions.closeLinkEvents, function( theEvent ) {
+					self.close();
+					theEvent.preventDefault();
+				});
+
+			return this;
+		}
+
+		// cache some values for min/readability
+		urlHistory = $.mobile.navigate.history;
+		hashkey = $.mobile.dialogHashKey;
+		activePage = $.mobile.activePage;
+		currentIsDialog = ( activePage ? activePage.hasClass( "ui-dialog" ) : false );
+		this._myUrl = url = urlHistory.getActive().url;
+		hasHash = ( url.indexOf( hashkey ) > -1 ) && !currentIsDialog && ( urlHistory.activeIndex > 0 );
+
+		if ( hasHash ) {
+			self._open( options );
+			self._bindContainerClose();
+			return this;
+		}
+
+		// if the current url has no dialog hash key proceed as normal
+		// otherwise, if the page is a dialog simply tack on the hash key
+		if ( url.indexOf( hashkey ) === -1 && !currentIsDialog ) {
+			url = url + (url.indexOf( "#" ) > -1 ? hashkey : "#" + hashkey);
+		} else {
+			url = $.mobile.path.parseLocation().hash + hashkey;
+		}
+
+		// Tack on an extra hashkey if this is the first page and we've just reconstructed the initial hash
+		if ( urlHistory.activeIndex === 0 && url === urlHistory.initialDst ) {
+			url += hashkey;
+		}
+
+		// swallow the the initial navigation event, and bind for the next
+		this.window.one( "beforenavigate", function( theEvent ) {
+			theEvent.preventDefault();
+			self._open( options );
+			self._bindContainerClose();
+		});
+
+		this.urlAltered = true;
+		$.mobile.navigate( url, { role: "dialog" } );
+
+		return this;
+	},
+
+	close: function() {
+		// make sure close is idempotent
+		if ( $.mobile.popup.active !== this ) {
+			return this;
+		}
+
+		this._scrollTop = this.window.scrollTop();
+
+		if ( this.options.history && this.urlAltered ) {
+			$.mobile.back();
+			this.urlAltered = false;
+		} else {
+			// simulate the nav bindings having fired
+			this._closePopup();
+		}
+
+		return this;
+	}
+});
+
+// TODO this can be moved inside the widget
+$.mobile.popup.handleLink = function( $link ) {
+	var offset,
+		path = $.mobile.path,
+
+		// NOTE make sure to get only the hash from the href because ie7 (wp7)
+		//      returns the absolute href in this case ruining the element selection
+		popup = $( path.hashToSelector( path.parseUrl( $link.attr( "href" ) ).hash ) ).first();
+
+	if ( popup.length > 0 && popup.data( "mobile-popup" ) ) {
+		offset = $link.offset();
+		popup.popup( "open", {
+			x: offset.left + $link.outerWidth() / 2,
+			y: offset.top + $link.outerHeight() / 2,
+			transition: $link.jqmData( "transition" ),
+			positionTo: $link.jqmData( "position-to" )
+		});
+	}
+
+	//remove after delay
+	setTimeout( function() {
+		$link.removeClass( $.mobile.activeBtnClass );
+	}, 300 );
+};
+
+// TODO move inside _create
+$.mobile.document.on( "pagebeforechange", function( theEvent, data ) {
+	if ( data.options.role === "popup" ) {
+		$.mobile.popup.handleLink( data.options.link );
+		theEvent.preventDefault();
+	}
+});
+
+})( jQuery );
+
+/*
+* custom "selectmenu" plugin
+*/
+
+(function( $, undefined ) {
+
+var unfocusableItemSelector = ".ui-disabled,.ui-state-disabled,.ui-li-divider,.ui-screen-hidden,:jqmData(role='placeholder')",
+	goToAdjacentItem = function( item, target, direction ) {
+		var adjacent = item[ direction + "All" ]()
+			.not( unfocusableItemSelector )
+			.first();
+
+		// if there's a previous option, focus it
+		if ( adjacent.length ) {
+			target
+				.blur()
+				.attr( "tabindex", "-1" );
+
+			adjacent.find( "a" ).first().focus();
+		}
+	};
+
+$.widget( "mobile.selectmenu", $.mobile.selectmenu, {
+	_create: function() {
+		var o = this.options;
+
+		// Custom selects cannot exist inside popups, so revert the "nativeMenu"
+		// option to true if a parent is a popup
+		o.nativeMenu = o.nativeMenu || ( this.element.parents( ":jqmData(role='popup'),:mobile-popup" ).length > 0 );
+
+		return this._super();
+	},
+
+	_handleSelectFocus: function() {
+		this.element.blur();
+		this.button.focus();
+	},
+
+	_handleKeydown: function( event ) {
+		this._super( event );
+		this._handleButtonVclickKeydown( event );
+	},
+
+	_handleButtonVclickKeydown: function( event ) {
+		if ( this.options.disabled || this.isOpen ) {
+			return;
+		}
+
+		if (event.type === "vclick" ||
+				event.keyCode && (event.keyCode === $.mobile.keyCode.ENTER || event.keyCode === $.mobile.keyCode.SPACE)) {
+
+			this._decideFormat();
+			if ( this.menuType === "overlay" ) {
+				this.button.attr( "href", "#" + this.popupId ).attr( "data-" + ( $.mobile.ns || "" ) + "rel", "popup" );
+			} else {
+				this.button.attr( "href", "#" + this.dialogId ).attr( "data-" + ( $.mobile.ns || "" ) + "rel", "dialog" );
+			}
+			this.isOpen = true;
+			// Do not prevent default, so the navigation may have a chance to actually open the chosen format
+		}
+	},
+
+	_handleListFocus: function( e ) {
+		var params = ( e.type === "focusin" ) ?
+			{ tabindex: "0", event: "vmouseover" }:
+			{ tabindex: "-1", event: "vmouseout" };
+
+		$( e.target )
+			.attr( "tabindex", params.tabindex )
+			.trigger( params.event );
+	},
+
+	_handleListKeydown: function( event ) {
+		var target = $( event.target ),
+			li = target.closest( "li" );
+
+		// switch logic based on which key was pressed
+		switch ( event.keyCode ) {
+			// up or left arrow keys
+		case 38:
+			goToAdjacentItem( li, target, "prev" );
+			return false;
+			// down or right arrow keys
+		case 40:
+			goToAdjacentItem( li, target, "next" );
+			return false;
+			// If enter or space is pressed, trigger click
+		case 13:
+		case 32:
+			target.trigger( "click" );
+			return false;
+		}
+	},
+
+	_handleMenuPageHide: function() {
+		// TODO centralize page removal binding / handling in the page plugin.
+		// Suggestion from @jblas to do refcounting
+		//
+		// TODO extremely confusing dependency on the open method where the pagehide.remove
+		// bindings are stripped to prevent the parent page from disappearing. The way
+		// we're keeping pages in the DOM right now sucks
+		//
+		// rebind the page remove that was unbound in the open function
+		// to allow for the parent page removal from actions other than the use
+		// of a dialog sized custom select
+		//
+		// doing this here provides for the back button on the custom select dialog
+		this.thisPage.page( "bindRemove" );
+	},
+
+	_handleHeaderCloseClick: function() {
+		if ( this.menuType === "overlay" ) {
+			this.close();
+			return false;
+		}
+	},
+
+	build: function() {
+		var selectId, popupId, dialogId, label, thisPage, isMultiple, menuId,
+			themeAttr, overlayTheme, overlayThemeAttr, dividerThemeAttr,
+			menuPage, listbox, list, header, headerTitle, menuPageContent,
+			menuPageClose, headerClose, self,
+			o = this.options;
+
+		if ( o.nativeMenu ) {
+			return this._super();
+		}
+
+		self = this;
+		selectId = this.selectId;
+		popupId = selectId + "-listbox";
+		dialogId = selectId + "-dialog";
+		label = this.label;
+		thisPage = this.element.closest( ".ui-page" );
+		isMultiple = this.element[ 0 ].multiple;
+		menuId = selectId + "-menu";
+		themeAttr = o.theme ? ( " data-" + $.mobile.ns + "theme='" + o.theme + "'" ) : "";
+		overlayTheme = o.overlayTheme || o.theme || null;
+		overlayThemeAttr = overlayTheme ? ( " data-" + $.mobile.ns +
+			"overlay-theme='" + overlayTheme + "'" ) : "";
+		dividerThemeAttr = ( o.dividerTheme && isMultiple ) ? ( " data-" + $.mobile.ns + "divider-theme='" + o.dividerTheme + "'" ) : "";
+		menuPage = $( "<div data-" + $.mobile.ns + "role='dialog' class='ui-selectmenu' id='" + dialogId + "'" + themeAttr + overlayThemeAttr + ">" +
+			"<div data-" + $.mobile.ns + "role='header'>" +
+			"<div class='ui-title'>" + label.getEncodedText() + "</div>"+
+			"</div>"+
+			"<div data-" + $.mobile.ns + "role='content'></div>"+
+			"</div>" );
+		listbox = $( "<div id='" + popupId + "' class='ui-selectmenu'></div>" ).insertAfter( this.select ).popup({ theme: o.overlayTheme });
+		list = $( "<ul class='ui-selectmenu-list' id='" + menuId + "' role='listbox' aria-labelledby='" + this.buttonId + "'" + themeAttr + dividerThemeAttr + "></ul>" ).appendTo( listbox );
+		header = $( "<div class='ui-header ui-bar-" + ( o.theme ? o.theme : "inherit" ) + "'></div>" ).prependTo( listbox );
+		headerTitle = $( "<h1 class='ui-title'></h1>" ).appendTo( header );
+
+		if ( this.isMultiple ) {
+			headerClose = $( "<a>", {
+				"role": "button",
+				"text": o.closeText,
+				"href": "#",
+				"class": "ui-btn ui-corner-all ui-btn-left ui-btn-icon-notext ui-icon-delete"
+			}).appendTo( header );
+		}
+
+		$.extend( this, {
+			selectId: selectId,
+			menuId: menuId,
+			popupId: popupId,
+			dialogId: dialogId,
+			thisPage: thisPage,
+			menuPage: menuPage,
+			label: label,
+			isMultiple: isMultiple,
+			theme: o.theme,
+			listbox: listbox,
+			list: list,
+			header: header,
+			headerTitle: headerTitle,
+			headerClose: headerClose,
+			menuPageContent: menuPageContent,
+			menuPageClose: menuPageClose,
+			placeholder: ""
+		});
+
+		// Create list from select, update state
+		this.refresh();
+
+		if ( this._origTabIndex === undefined ) {
+			// Map undefined to false, because this._origTabIndex === undefined
+			// indicates that we have not yet checked whether the select has
+			// originally had a tabindex attribute, whereas false indicates that
+			// we have checked the select for such an attribute, and have found
+			// none present.
+			this._origTabIndex = ( this.select[ 0 ].getAttribute( "tabindex" ) === null ) ? false : this.select.attr( "tabindex" );
+		}
+		this.select.attr( "tabindex", "-1" );
+		this._on( this.select, { focus : "_handleSelectFocus" } );
+
+		// Button events
+		this._on( this.button, {
+			vclick: "_handleButtonVclickKeydown"
+		});
+
+		// Events for list items
+		this.list.attr( "role", "listbox" );
+		this._on( this.list, {
+			focusin : "_handleListFocus",
+			focusout : "_handleListFocus",
+			keydown: "_handleListKeydown"
+		});
+		this.list
+			.delegate( "li:not(.ui-disabled,.ui-state-disabled,.ui-li-divider)", "click", function( event ) {
+
+				// index of option tag to be selected
+				var oldIndex = self.select[ 0 ].selectedIndex,
+					newIndex = $.mobile.getAttribute( this, "option-index" ),
+					option = self._selectOptions().eq( newIndex )[ 0 ];
+
+				// toggle selected status on the tag for multi selects
+				option.selected = self.isMultiple ? !option.selected : true;
+
+				// toggle checkbox class for multiple selects
+				if ( self.isMultiple ) {
+					$( this ).find( "a" )
+						.toggleClass( "ui-checkbox-on", option.selected )
+						.toggleClass( "ui-checkbox-off", !option.selected );
+				}
+
+				// trigger change if value changed
+				if ( self.isMultiple || oldIndex !== newIndex ) {
+					self.select.trigger( "change" );
+				}
+
+				// hide custom select for single selects only - otherwise focus clicked item
+				// We need to grab the clicked item the hard way, because the list may have been rebuilt
+				if ( self.isMultiple ) {
+					self.list.find( "li:not(.ui-li-divider)" ).eq( newIndex )
+						.find( "a" ).first().focus();
+				}
+				else {
+					self.close();
+				}
+
+				event.preventDefault();
+			});
+
+		// button refocus ensures proper height calculation
+		// by removing the inline style and ensuring page inclusion
+		this._on( this.menuPage, { pagehide: "_handleMenuPageHide" } );
+
+		// Events on the popup
+		this._on( this.listbox, { popupafterclose: "close" } );
+
+		// Close button on small overlays
+		if ( this.isMultiple ) {
+			this._on( this.headerClose, { click: "_handleHeaderCloseClick" } );
+		}
+
+		return this;
+	},
+
+	_isRebuildRequired: function() {
+		var list = this.list.find( "li" ),
+			options = this._selectOptions().not( ".ui-screen-hidden" );
+
+		// TODO exceedingly naive method to determine difference
+		// ignores value changes etc in favor of a forcedRebuild
+		// from the user in the refresh method
+		return options.text() !== list.text();
+	},
+
+	selected: function() {
+		return this._selectOptions().filter( ":selected:not( :jqmData(placeholder='true') )" );
+	},
+
+	refresh: function( force ) {
+		var self, indices;
+
+		if ( this.options.nativeMenu ) {
+			return this._super( force );
+		}
+
+		self = this;
+		if ( force || this._isRebuildRequired() ) {
+			self._buildList();
+		}
+
+		indices = this.selectedIndices();
+
+		self.setButtonText();
+		self.setButtonCount();
+
+		self.list.find( "li:not(.ui-li-divider)" )
+			.find( "a" ).removeClass( $.mobile.activeBtnClass ).end()
+			.attr( "aria-selected", false )
+			.each(function( i ) {
+
+				if ( $.inArray( i, indices ) > -1 ) {
+					var item = $( this );
+
+					// Aria selected attr
+					item.attr( "aria-selected", true );
+
+					// Multiple selects: add the "on" checkbox state to the icon
+					if ( self.isMultiple ) {
+						item.find( "a" ).removeClass( "ui-checkbox-off" ).addClass( "ui-checkbox-on" );
+					} else {
+						if ( item.hasClass( "ui-screen-hidden" ) ) {
+							item.next().find( "a" ).addClass( $.mobile.activeBtnClass );
+						} else {
+							item.find( "a" ).addClass( $.mobile.activeBtnClass );
+						}
+					}
+				}
+			});
+	},
+
+	close: function() {
+		if ( this.options.disabled || !this.isOpen ) {
+			return;
+		}
+
+		var self = this;
+
+		if ( self.menuType === "page" ) {
+			self.menuPage.dialog( "close" );
+			self.list.appendTo( self.listbox );
+		} else {
+			self.listbox.popup( "close" );
+		}
+
+		self._focusButton();
+		// allow the dialog to be closed again
+		self.isOpen = false;
+	},
+
+	open: function() {
+		this.button.click();
+	},
+
+	_focusMenuItem: function() {
+		var selector = this.list.find( "a." + $.mobile.activeBtnClass );
+		if ( selector.length === 0 ) {
+			selector = this.list.find( "li:not(" + unfocusableItemSelector + ") a.ui-btn" );
+		}
+		selector.first().focus();
+	},
+
+	_decideFormat: function() {
+		var self = this,
+			$window = this.window,
+			selfListParent = self.list.parent(),
+			menuHeight = selfListParent.outerHeight(),
+			scrollTop = $window.scrollTop(),
+			btnOffset = self.button.offset().top,
+			screenHeight = $window.height();
+
+		if ( menuHeight > screenHeight - 80 || !$.support.scrollTop ) {
+
+			self.menuPage.appendTo( $.mobile.pageContainer ).page();
+			self.menuPageContent = self.menuPage.find( ".ui-content" );
+			self.menuPageClose = self.menuPage.find( ".ui-header a" );
+
+			// prevent the parent page from being removed from the DOM,
+			// otherwise the results of selecting a list item in the dialog
+			// fall into a black hole
+			self.thisPage.unbind( "pagehide.remove" );
+
+			//for WebOS/Opera Mini (set lastscroll using button offset)
+			if ( scrollTop === 0 && btnOffset > screenHeight ) {
+				self.thisPage.one( "pagehide", function() {
+					$( this ).jqmData( "lastScroll", btnOffset );
+				});
+			}
+
+			self.menuPage.one( {
+				pageshow: $.proxy( this, "_focusMenuItem" ),
+				pagehide: $.proxy( this, "close" )
+			});
+
+			self.menuType = "page";
+			self.menuPageContent.append( self.list );
+			self.menuPage.find( "div .ui-title" ).text( self.label.text() );
+		} else {
+			self.menuType = "overlay";
+
+			self.listbox.one( { popupafteropen: $.proxy( this, "_focusMenuItem" ) } );
+		}
+	},
+
+	_buildList: function() {
+		var self = this,
+			o = this.options,
+			placeholder = this.placeholder,
+			needPlaceholder = true,
+			dataIcon = "false",
+			$options, numOptions, select,
+			dataPrefix = "data-" + $.mobile.ns,
+			dataIndexAttr = dataPrefix + "option-index",
+			dataIconAttr = dataPrefix + "icon",
+			dataRoleAttr = dataPrefix + "role",
+			dataPlaceholderAttr = dataPrefix + "placeholder",
+			fragment = document.createDocumentFragment(),
+			isPlaceholderItem = false,
+			optGroup,
+			i,
+			option, $option, parent, text, anchor, classes,
+			optLabel, divider, item;
+
+		self.list.empty().filter( ".ui-listview" ).listview( "destroy" );
+		$options = this._selectOptions();
+		numOptions = $options.length;
+		select = this.select[ 0 ];
+
+		for ( i = 0; i < numOptions;i++, isPlaceholderItem = false) {
+			option = $options[i];
+			$option = $( option );
+
+			// Do not create options based on ui-screen-hidden select options
+			if ( $option.hasClass( "ui-screen-hidden" ) ) {
+				continue;
+			}
+
+			parent = option.parentNode;
+			text = $option.text();
+			anchor  = document.createElement( "a" );
+			classes = [];
+
+			anchor.setAttribute( "href", "#" );
+			anchor.appendChild( document.createTextNode( text ) );
+
+			// Are we inside an optgroup?
+			if ( parent !== select && parent.nodeName.toLowerCase() === "optgroup" ) {
+				optLabel = parent.getAttribute( "label" );
+				if ( optLabel !== optGroup ) {
+					divider = document.createElement( "li" );
+					divider.setAttribute( dataRoleAttr, "list-divider" );
+					divider.setAttribute( "role", "option" );
+					divider.setAttribute( "tabindex", "-1" );
+					divider.appendChild( document.createTextNode( optLabel ) );
+					fragment.appendChild( divider );
+					optGroup = optLabel;
+				}
+			}
+
+			if ( needPlaceholder && ( !option.getAttribute( "value" ) || text.length === 0 || $option.jqmData( "placeholder" ) ) ) {
+				needPlaceholder = false;
+				isPlaceholderItem = true;
+
+				// If we have identified a placeholder, record the fact that it was
+				// us who have added the placeholder to the option and mark it
+				// retroactively in the select as well
+				if ( null === option.getAttribute( dataPlaceholderAttr ) ) {
+					this._removePlaceholderAttr = true;
+				}
+				option.setAttribute( dataPlaceholderAttr, true );
+				if ( o.hidePlaceholderMenuItems ) {
+					classes.push( "ui-screen-hidden" );
+				}
+				if ( placeholder !== text ) {
+					placeholder = self.placeholder = text;
+				}
+			}
+
+			item = document.createElement( "li" );
+			if ( option.disabled ) {
+				classes.push( "ui-state-disabled" );
+				item.setAttribute( "aria-disabled", true );
+			}
+			item.setAttribute( dataIndexAttr, i );
+			item.setAttribute( dataIconAttr, dataIcon );
+			if ( isPlaceholderItem ) {
+				item.setAttribute( dataPlaceholderAttr, true );
+			}
+			item.className = classes.join( " " );
+			item.setAttribute( "role", "option" );
+			anchor.setAttribute( "tabindex", "-1" );
+			if ( this.isMultiple ) {
+				$( anchor ).addClass( "ui-btn ui-checkbox-off ui-btn-icon-right" );
+			}
+
+			item.appendChild( anchor );
+			fragment.appendChild( item );
+		}
+
+		self.list[0].appendChild( fragment );
+
+		// Hide header if it's not a multiselect and there's no placeholder
+		if ( !this.isMultiple && !placeholder.length ) {
+			this.header.addClass( "ui-screen-hidden" );
+		} else {
+			this.headerTitle.text( this.placeholder );
+		}
+
+		// Now populated, create listview
+		self.list.listview();
+	},
+
+	_button: function() {
+		return this.options.nativeMenu ?
+			this._super() :
+			$( "<a>", {
+				"href": "#",
+				"role": "button",
+				// TODO value is undefined at creation
+				"id": this.buttonId,
+				"aria-haspopup": "true",
+
+				// TODO value is undefined at creation
+				"aria-owns": this.menuId
+			});
+	},
+
+	_destroy: function() {
+
+		if ( !this.options.nativeMenu ) {
+			this.close();
+
+			// Restore the tabindex attribute to its original value
+			if ( this._origTabIndex !== undefined ) {
+				if ( this._origTabIndex !== false ) {
+					this.select.attr( "tabindex", this._origTabIndex );
+				} else {
+					this.select.removeAttr( "tabindex" );
+				}
+			}
+
+			// Remove the placeholder attribute if we were the ones to add it
+			if ( this._removePlaceholderAttr ) {
+				this._selectOptions().removeAttr( "data-" + $.mobile.ns + "placeholder" );
+			}
+
+			// Remove the popup
+			this.listbox.remove();
+
+			// Remove the dialog
+			this.menuPage.remove();
+		}
+
+		// Chain up
+		this._super();
+	}
+});
+
+})( jQuery );
+
+
+// buttonMarkup is deprecated as of 1.4.0 and will be removed in 1.5.0.
+
+(function( $, undefined ) {
+
+// General policy: Do not access data-* attributes except during enhancement.
+// In all other cases we determine the state of the button exclusively from its
+// className. That's why optionsToClasses expects a full complement of options,
+// and the jQuery plugin completes the set of options from the default values.
+
+// Map classes to buttonMarkup boolean options - used in classNameToOptions()
+var reverseBoolOptionMap = {
+		"ui-shadow" : "shadow",
+		"ui-corner-all" : "corners",
+		"ui-btn-inline" : "inline",
+		"ui-shadow-icon" : "iconshadow", /* TODO: Remove in 1.5 */
+		"ui-mini" : "mini"
+	},
+	getAttrFixed = function() {
+		var ret = $.mobile.getAttribute.apply( this, arguments );
+
+		return ( ret == null ? undefined : ret );
+	},
+	capitalLettersRE = /[A-Z]/g;
+
+// optionsToClasses:
+// @options: A complete set of options to convert to class names.
+// @existingClasses: extra classes to add to the result
+//
+// Converts @options to buttonMarkup classes and returns the result as an array
+// that can be converted to an element's className with .join( " " ). All
+// possible options must be set inside @options. Use $.fn.buttonMarkup.defaults
+// to get a complete set and use $.extend to override your choice of options
+// from that set.
+function optionsToClasses( options, existingClasses ) {
+	var classes = existingClasses ? existingClasses : [];
+
+	// Add classes to the array - first ui-btn
+	classes.push( "ui-btn" );
+
+	// If there is a theme
+	if ( options.theme ) {
+		classes.push( "ui-btn-" + options.theme );
+	}
+
+	// If there's an icon, add the icon-related classes
+	if ( options.icon ) {
+		classes = classes.concat([
+			"ui-icon-" + options.icon,
+			"ui-btn-icon-" + options.iconpos
+		]);
+		if ( options.iconshadow ) {
+			classes.push( "ui-shadow-icon" ); /* TODO: Remove in 1.5 */
+		}
+	}
+
+	// Add the appropriate class for each boolean option
+	if ( options.inline ) {
+		classes.push( "ui-btn-inline" );
+	}
+	if ( options.shadow ) {
+		classes.push( "ui-shadow" );
+	}
+	if ( options.corners ) {
+		classes.push( "ui-corner-all" );
+	}
+	if ( options.mini ) {
+		classes.push( "ui-mini" );
+	}
+
+	// Create a string from the array and return it
+	return classes;
+}
+
+// classNameToOptions:
+// @classes: A string containing a .className-style space-separated class list
+//
+// Loops over @classes and calculates an options object based on the
+// buttonMarkup-related classes it finds. It records unrecognized classes in an
+// array.
+//
+// Returns: An object containing the following items:
+//
+// "options": buttonMarkup options found to be present because of the
+// presence/absence of corresponding classes
+//
+// "unknownClasses": a string containing all the non-buttonMarkup-related
+// classes found in @classes
+//
+// "alreadyEnhanced": A boolean indicating whether the ui-btn class was among
+// those found to be present
+function classNameToOptions( classes ) {
+	var idx, map, unknownClass,
+		alreadyEnhanced = false,
+		noIcon = true,
+		o = {
+			icon: "",
+			inline: false,
+			shadow: false,
+			corners: false,
+			iconshadow: false,
+			mini: false
+		},
+		unknownClasses = [];
+
+	classes = classes.split( " " );
+
+	// Loop over the classes
+	for ( idx = 0 ; idx < classes.length ; idx++ ) {
+
+		// Assume it's an unrecognized class
+		unknownClass = true;
+
+		// Recognize boolean options from the presence of classes
+		map = reverseBoolOptionMap[ classes[ idx ] ];
+		if ( map !== undefined ) {
+			unknownClass = false;
+			o[ map ] = true;
+
+		// Recognize the presence of an icon and establish the icon position
+		} else if ( classes[ idx ].indexOf( "ui-btn-icon-" ) === 0 ) {
+			unknownClass = false;
+			noIcon = false;
+			o.iconpos = classes[ idx ].substring( 12 );
+
+		// Establish which icon is present
+		} else if ( classes[ idx ].indexOf( "ui-icon-" ) === 0 ) {
+			unknownClass = false;
+			o.icon = classes[ idx ].substring( 8 );
+
+		// Establish the theme - this recognizes one-letter theme swatch names
+		} else if ( classes[ idx ].indexOf( "ui-btn-" ) === 0 && classes[ idx ].length === 8 ) {
+			unknownClass = false;
+			o.theme = classes[ idx ].substring( 7 );
+
+		// Recognize that this element has already been buttonMarkup-enhanced
+		} else if ( classes[ idx ] === "ui-btn" ) {
+			unknownClass = false;
+			alreadyEnhanced = true;
+		}
+
+		// If this class has not been recognized, add it to the list
+		if ( unknownClass ) {
+			unknownClasses.push( classes[ idx ] );
+		}
+	}
+
+	// If a "ui-btn-icon-*" icon position class is absent there cannot be an icon
+	if ( noIcon ) {
+		o.icon = "";
+	}
+
+	return {
+		options: o,
+		unknownClasses: unknownClasses,
+		alreadyEnhanced: alreadyEnhanced
+	};
+}
+
+function camelCase2Hyphenated( c ) {
+	return "-" + c.toLowerCase();
+}
+
+// $.fn.buttonMarkup:
+// DOM: gets/sets .className
+//
+// @options: options to apply to the elements in the jQuery object
+// @overwriteClasses: boolean indicating whether to honour existing classes
+//
+// Calculates the classes to apply to the elements in the jQuery object based on
+// the options passed in. If @overwriteClasses is true, it sets the className
+// property of each element in the jQuery object to the buttonMarkup classes
+// it calculates based on the options passed in.
+//
+// If you wish to preserve any classes that are already present on the elements
+// inside the jQuery object, including buttonMarkup-related classes that were
+// added by a previous call to $.fn.buttonMarkup() or during page enhancement
+// then you should omit @overwriteClasses or set it to false.
+$.fn.buttonMarkup = function( options, overwriteClasses ) {
+	var idx, data, el, retrievedOptions, optionKey,
+		defaults = $.fn.buttonMarkup.defaults;
+
+	for ( idx = 0 ; idx < this.length ; idx++ ) {
+		el = this[ idx ];
+		data = overwriteClasses ?
+
+			// Assume this element is not enhanced and ignore its classes
+			{ alreadyEnhanced: false, unknownClasses: [] } :
+
+			// Otherwise analyze existing classes to establish existing options and
+			// classes
+			classNameToOptions( el.className );
+
+		retrievedOptions = $.extend( {},
+
+			// If the element already has the class ui-btn, then we assume that
+			// it has passed through buttonMarkup before - otherwise, the options
+			// returned by classNameToOptions do not correctly reflect the state of
+			// the element
+			( data.alreadyEnhanced ? data.options : {} ),
+
+			// Finally, apply the options passed in
+			options );
+
+		// If this is the first call on this element, retrieve remaining options
+		// from the data-attributes
+		if ( !data.alreadyEnhanced ) {
+			for ( optionKey in defaults ) {
+				if ( retrievedOptions[ optionKey ] === undefined ) {
+					retrievedOptions[ optionKey ] = getAttrFixed( el,
+						optionKey.replace( capitalLettersRE, camelCase2Hyphenated )
+					);
+				}
+			}
+		}
+
+		el.className = optionsToClasses(
+
+			// Merge all the options and apply them as classes
+			$.extend( {},
+
+				// The defaults form the basis
+				defaults,
+
+				// Add the computed options
+				retrievedOptions
+			),
+
+			// ... and re-apply any unrecognized classes that were found
+			data.unknownClasses ).join( " " );
+		if ( el.tagName.toLowerCase() !== "button" ) {
+			el.setAttribute( "role", "button" );
+		}
+	}
+
+	return this;
+};
+
+// buttonMarkup defaults. This must be a complete set, i.e., a value must be
+// given here for all recognized options
+$.fn.buttonMarkup.defaults = {
+	icon: "",
+	iconpos: "left",
+	theme: null,
+	inline: false,
+	shadow: true,
+	corners: true,
+	iconshadow: false, /* TODO: Remove in 1.5. Option deprecated in 1.4. */
+	mini: false
+};
+
+$.extend( $.fn.buttonMarkup, {
+	initSelector: "a:jqmData(role='button'), .ui-bar > a, .ui-bar > :jqmData(role='controlgroup') > a, button"
+});
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+
+$.widget( "mobile.controlgroup", $.extend( {
+	options: {
+		enhanced: false,
+		theme: null,
+		shadow: false,
+		corners: true,
+		excludeInvisible: true,
+		type: "vertical",
+		mini: false
+	},
+
+	_create: function() {
+		var elem = this.element,
+			opts = this.options;
+
+		// Run buttonmarkup
+		if ( $.fn.buttonMarkup ) {
+			this.element.find( $.fn.buttonMarkup.initSelector ).buttonMarkup();
+		}
+		// Enhance child widgets
+		$.each( this._childWidgets, $.proxy( function( number, widgetName ) {
+			if ( $.mobile[ widgetName ] ) {
+				this.element.find( $.mobile[ widgetName ].initSelector ).not( $.mobile.page.prototype.keepNativeSelector() )[ widgetName ]();
+			}
+		}, this ));
+
+		$.extend( this, {
+			_ui: null,
+			_initialRefresh: true
+		});
+
+		if ( opts.enhanced ) {
+			this._ui = {
+				groupLegend: elem.children( ".ui-controlgroup-label" ).children(),
+				childWrapper: elem.children( ".ui-controlgroup-controls" )
+			};
+		} else {
+			this._ui = this._enhance();
+		}
+
+	},
+
+	_childWidgets: [ "checkboxradio", "selectmenu", "button" ],
+
+	_themeClassFromOption: function( value ) {
+		return ( value ? ( value === "none" ? "" : "ui-group-theme-" + value ) : "" );
+	},
+
+	_enhance: function() {
+		var elem = this.element,
+			opts = this.options,
+			ui = {
+				groupLegend: elem.children( "legend" ),
+				childWrapper: elem
+					.addClass( "ui-controlgroup " +
+						"ui-controlgroup-" +
+							( opts.type === "horizontal" ? "horizontal" : "vertical" ) + " " +
+						this._themeClassFromOption( opts.theme ) + " " +
+						( opts.corners ? "ui-corner-all " : "" ) +
+						( opts.mini ? "ui-mini " : "" ) )
+					.wrapInner( "<div " +
+						"class='ui-controlgroup-controls " +
+							( opts.shadow === true ? "ui-shadow" : "" ) + "'></div>" )
+					.children()
+			};
+
+		if ( ui.groupLegend.length > 0 ) {
+			$( "<div role='heading' class='ui-controlgroup-label'></div>" )
+				.append( ui.groupLegend )
+				.prependTo( elem );
+		}
+
+		return ui;
+	},
+
+	_init: function() {
+		this.refresh();
+	},
+
+	_setOptions: function( options ) {
+		var callRefresh, returnValue,
+			elem = this.element;
+
+		// Must have one of horizontal or vertical
+		if ( options.type !== undefined ) {
+			elem
+				.removeClass( "ui-controlgroup-horizontal ui-controlgroup-vertical" )
+				.addClass( "ui-controlgroup-" + ( options.type === "horizontal" ? "horizontal" : "vertical" ) );
+			callRefresh = true;
+		}
+
+		if ( options.theme !== undefined ) {
+			elem
+				.removeClass( this._themeClassFromOption( this.options.theme ) )
+				.addClass( this._themeClassFromOption( options.theme ) );
+		}
+
+		if ( options.corners !== undefined ) {
+			elem.toggleClass( "ui-corner-all", options.corners );
+		}
+
+		if ( options.mini !== undefined ) {
+			elem.toggleClass( "ui-mini", options.mini );
+		}
+
+		if ( options.shadow !== undefined ) {
+			this._ui.childWrapper.toggleClass( "ui-shadow", options.shadow );
+		}
+
+		if ( options.excludeInvisible !== undefined ) {
+			this.options.excludeInvisible = options.excludeInvisible;
+			callRefresh = true;
+		}
+
+		returnValue = this._super( options );
+
+		if ( callRefresh ) {
+			this.refresh();
+		}
+
+		return returnValue;
+	},
+
+	container: function() {
+		return this._ui.childWrapper;
+	},
+
+	refresh: function() {
+		var $el = this.container(),
+			els = $el.find( ".ui-btn" ).not( ".ui-slider-handle" ),
+			create = this._initialRefresh;
+		if ( $.mobile.checkboxradio ) {
+			$el.find( ":mobile-checkboxradio" ).checkboxradio( "refresh" );
+		}
+		this._addFirstLastClasses( els,
+			this.options.excludeInvisible ? this._getVisibles( els, create ) : els,
+			create );
+		this._initialRefresh = false;
+	},
+
+	// Caveat: If the legend is not the first child of the controlgroup at enhance
+	// time, it will be after _destroy().
+	_destroy: function() {
+		var ui, buttons,
+			opts = this.options;
+
+		if ( opts.enhanced ) {
+			return this;
+		}
+
+		ui = this._ui;
+		buttons = this.element
+			.removeClass( "ui-controlgroup " +
+				"ui-controlgroup-horizontal ui-controlgroup-vertical ui-corner-all ui-mini " +
+				this._themeClassFromOption( opts.theme ) )
+			.find( ".ui-btn" )
+			.not( ".ui-slider-handle" );
+
+		this._removeFirstLastClasses( buttons );
+
+		ui.groupLegend.unwrap();
+		ui.childWrapper.children().unwrap();
+	}
+}, $.mobile.behaviors.addFirstLastClasses ) );
+
+})(jQuery);
+
+(function( $, undefined ) {
+
+	$.widget( "mobile.toolbar", {
+		initSelector: ":jqmData(role='footer'), :jqmData(role='header')",
+
+		options: {
+			theme: null,
+			addBackBtn: false,
+			backBtnTheme: null,
+			backBtnText: "Back"
+		},
+
+		_create: function() {
+			var leftbtn, rightbtn,
+				role =  this.element.is( ":jqmData(role='header')" ) ? "header" : "footer",
+				page = this.element.closest( ".ui-page" );
+			if ( page.length === 0 ) {
+				page = false;
+				this._on( this.document, {
+					"pageshow": "refresh"
+				});
+			}
+			$.extend( this, {
+				role: role,
+				page: page,
+				leftbtn: leftbtn,
+				rightbtn: rightbtn
+			});
+			this.element.attr( "role", role === "header" ? "banner" : "contentinfo" ).addClass( "ui-" + role );
+			this.refresh();
+			this._setOptions( this.options );
+		},
+		_setOptions: function( o ) {
+			if ( o.addBackBtn !== undefined ) {
+				if ( this.options.addBackBtn &&
+					this.role === "header" &&
+					$( ".ui-page" ).length > 1 &&
+					this.page[ 0 ].getAttribute( "data-" + $.mobile.ns + "url" ) !== $.mobile.path.stripHash( location.hash ) &&
+					!this.leftbtn ) {
+						this._addBackButton();
+				} else {
+					this.element.find( ".ui-toolbar-back-btn" ).remove();
+				}
+			}
+			if ( o.backBtnTheme != null ) {
+				this.element
+					.find( ".ui-toolbar-back-btn" )
+					.addClass( "ui-btn ui-btn-" + o.backBtnTheme );
+			}
+			if ( o.backBtnText !== undefined ) {
+				this.element.find( ".ui-toolbar-back-btn .ui-btn-text" ).text( o.backBtnText );
+			}
+			if ( o.theme !== undefined ) {
+				var currentTheme = this.options.theme ? this.options.theme : "inherit",
+					newTheme = o.theme ? o.theme : "inherit";
+
+				this.element.removeClass( "ui-bar-" + currentTheme ).addClass( "ui-bar-" + newTheme );
+			}
+
+			this._super( o );
+		},
+		refresh: function() {
+			if ( this.role === "header" ) {
+				this._addHeaderButtonClasses();
+			}
+			if ( !this.page ) {
+				this._setRelative();
+				if ( this.role === "footer" ) {
+					this.element.appendTo( "body" );
+				}
+			}
+			this._addHeadingClasses();
+			this._btnMarkup();
+		},
+
+		//we only want this to run on non fixed toolbars so make it easy to override
+		_setRelative: function() {
+			$( "[data-"+ $.mobile.ns + "role='page']" ).css({ "position": "relative" });
+		},
+
+		// Deprecated in 1.4. As from 1.5 button classes have to be present in the markup.
+		_btnMarkup: function() {
+			this.element
+				.children( "a" )
+				.filter( ":not([data-" + $.mobile.ns + "role='none'])" )
+				.attr( "data-" + $.mobile.ns + "role", "button" );
+			this.element.trigger( "create" );
+		},
+		// Deprecated in 1.4. As from 1.5 ui-btn-left/right classes have to be present in the markup.
+		_addHeaderButtonClasses: function() {
+			var $headeranchors = this.element.children( "a, button" );
+			this.leftbtn = $headeranchors.hasClass( "ui-btn-left" );
+			this.rightbtn = $headeranchors.hasClass( "ui-btn-right" );
+
+			this.leftbtn = this.leftbtn || $headeranchors.eq( 0 ).not( ".ui-btn-right" ).addClass( "ui-btn-left" ).length;
+
+			this.rightbtn = this.rightbtn || $headeranchors.eq( 1 ).addClass( "ui-btn-right" ).length;
+
+		},
+		_addBackButton: function() {
+			var options = this.options,
+				theme = options.backBtnTheme || options.theme;
+
+			$( "<a role='button' href='javascript:void(0);' " +
+				"class='ui-btn ui-corner-all ui-shadow ui-btn-left " +
+					( theme ? "ui-btn-" + theme + " " : "" ) +
+					"ui-toolbar-back-btn ui-icon-carat-l ui-btn-icon-left' " +
+				"data-" + $.mobile.ns + "rel='back'>" + options.backBtnText + "</a>" )
+					.prependTo( this.element );
+		},
+		_addHeadingClasses: function() {
+			this.element.children( "h1, h2, h3, h4, h5, h6" )
+				.addClass( "ui-title" )
+				// Regardless of h element number in src, it becomes h1 for the enhanced page
+				.attr({
+					"role": "heading",
+					"aria-level": "1"
+				});
+		}
+	});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+	$.widget( "mobile.toolbar", $.mobile.toolbar, {
+		options: {
+			position:null,
+			visibleOnPageShow: true,
+			disablePageZoom: true,
+			transition: "slide", //can be none, fade, slide (slide maps to slideup or slidedown)
+			fullscreen: false,
+			tapToggle: true,
+			tapToggleBlacklist: "a, button, input, select, textarea, .ui-header-fixed, .ui-footer-fixed, .ui-flipswitch, .ui-popup, .ui-panel, .ui-panel-dismiss-open",
+			hideDuringFocus: "input, textarea, select",
+			updatePagePadding: true,
+			trackPersistentToolbars: true,
+
+			// Browser detection! Weeee, here we go...
+			// Unfortunately, position:fixed is costly, not to mention probably impossible, to feature-detect accurately.
+			// Some tests exist, but they currently return false results in critical devices and browsers, which could lead to a broken experience.
+			// Testing fixed positioning is also pretty obtrusive to page load, requiring injected elements and scrolling the window
+			// The following function serves to rule out some popular browsers with known fixed-positioning issues
+			// This is a plugin option like any other, so feel free to improve or overwrite it
+			supportBlacklist: function() {
+				return !$.support.fixedPosition;
+			}
+		},
+
+		_create: function() {
+			this._super();
+			if ( this.options.position === "fixed" && !this.options.supportBlacklist() ) {
+				this._makeFixed();
+			}
+		},
+
+		_makeFixed: function() {
+			this.element.addClass( "ui-"+ this.role +"-fixed" );
+			this.updatePagePadding();
+			this._addTransitionClass();
+			this._bindPageEvents();
+			this._bindToggleHandlers();
+		},
+
+		_setOptions: function( o ) {
+			if ( o.position === "fixed" && this.options.position !== "fixed" ) {
+				this._makeFixed();
+			}
+			if ( this.options.position === "fixed" && !this.options.supportBlacklist() ) {
+				var $page = ( !!this.page )? this.page: ( $(".ui-page-active").length > 0 )? $(".ui-page-active"): $(".ui-page").eq(0);
+
+				if ( o.fullscreen !== undefined) {
+					if ( o.fullscreen ) {
+						this.element.addClass( "ui-"+ this.role +"-fullscreen" );
+						$page.addClass( "ui-page-" + this.role + "-fullscreen" );
+					}
+					// If not fullscreen, add class to page to set top or bottom padding
+					else {
+						this.element.removeClass( "ui-"+ this.role +"-fullscreen" );
+						$page.removeClass( "ui-page-" + this.role + "-fullscreen" ).addClass( "ui-page-" + this.role+ "-fixed" );
+					}
+				}
+			}
+			this._super(o);
+		},
+
+		_addTransitionClass: function() {
+			var tclass = this.options.transition;
+
+			if ( tclass && tclass !== "none" ) {
+				// use appropriate slide for header or footer
+				if ( tclass === "slide" ) {
+					tclass = this.element.hasClass( "ui-header" ) ? "slidedown" : "slideup";
+				}
+
+				this.element.addClass( tclass );
+			}
+		},
+
+		_bindPageEvents: function() {
+			var page = ( !!this.page )? this.element.closest( ".ui-page" ): this.document;
+			//page event bindings
+			// Fixed toolbars require page zoom to be disabled, otherwise usability issues crop up
+			// This method is meant to disable zoom while a fixed-positioned toolbar page is visible
+			this._on( page , {
+				"pagebeforeshow": "_handlePageBeforeShow",
+				"webkitAnimationStart":"_handleAnimationStart",
+				"animationstart":"_handleAnimationStart",
+				"updatelayout": "_handleAnimationStart",
+				"pageshow": "_handlePageShow",
+				"pagebeforehide": "_handlePageBeforeHide"
+			});
+		},
+
+		_handlePageBeforeShow: function( ) {
+			var o = this.options;
+			if ( o.disablePageZoom ) {
+				$.mobile.zoom.disable( true );
+			}
+			if ( !o.visibleOnPageShow ) {
+				this.hide( true );
+			}
+		},
+
+		_handleAnimationStart: function() {
+			if ( this.options.updatePagePadding ) {
+				this.updatePagePadding( ( !!this.page )? this.page: ".ui-page-active" );
+			}
+		},
+
+		_handlePageShow: function() {
+			this.updatePagePadding( ( !!this.page )? this.page: ".ui-page-active" );
+			if ( this.options.updatePagePadding ) {
+				this._on( this.window, { "throttledresize": "updatePagePadding" } );
+			}
+		},
+
+		_handlePageBeforeHide: function( e, ui ) {
+			var o = this.options,
+				thisFooter, thisHeader, nextFooter, nextHeader;
+
+			if ( o.disablePageZoom ) {
+				$.mobile.zoom.enable( true );
+			}
+			if ( o.updatePagePadding ) {
+				this._off( this.window, "throttledresize" );
+			}
+
+			if ( o.trackPersistentToolbars ) {
+				thisFooter = $( ".ui-footer-fixed:jqmData(id)", this.page );
+				thisHeader = $( ".ui-header-fixed:jqmData(id)", this.page );
+				nextFooter = thisFooter.length && ui.nextPage && $( ".ui-footer-fixed:jqmData(id='" + thisFooter.jqmData( "id" ) + "')", ui.nextPage ) || $();
+				nextHeader = thisHeader.length && ui.nextPage && $( ".ui-header-fixed:jqmData(id='" + thisHeader.jqmData( "id" ) + "')", ui.nextPage ) || $();
+
+				if ( nextFooter.length || nextHeader.length ) {
+
+					nextFooter.add( nextHeader ).appendTo( $.mobile.pageContainer );
+
+					ui.nextPage.one( "pageshow", function() {
+						nextHeader.prependTo( this );
+						nextFooter.appendTo( this );
+					});
+				}
+			}
+		},
+
+		_visible: true,
+
+		// This will set the content element's top or bottom padding equal to the toolbar's height
+		updatePagePadding: function( tbPage ) {
+			var $el = this.element,
+				header = ( this.role ==="header" ),
+				pos = parseFloat( $el.css( header ? "top" : "bottom" ) );
+
+			// This behavior only applies to "fixed", not "fullscreen"
+			if ( this.options.fullscreen ) { return; }
+			// tbPage argument can be a Page object or an event, if coming from throttled resize.
+			tbPage = ( tbPage && tbPage.type === undefined && tbPage ) || this.page || $el.closest( ".ui-page" );
+			tbPage = ( !!this.page )? this.page: ".ui-page-active";
+			$( tbPage ).css( "padding-" + ( header ? "top" : "bottom" ), $el.outerHeight() + pos );
+		},
+
+		_useTransition: function( notransition ) {
+			var $win = this.window,
+				$el = this.element,
+				scroll = $win.scrollTop(),
+				elHeight = $el.height(),
+				pHeight = ( !!this.page )? $el.closest( ".ui-page" ).height():$(".ui-page-active").height(),
+				viewportHeight = $.mobile.getScreenHeight();
+
+			return !notransition &&
+				( this.options.transition && this.options.transition !== "none" &&
+				(
+					( this.role === "header" && !this.options.fullscreen && scroll > elHeight ) ||
+					( this.role === "footer" && !this.options.fullscreen && scroll + viewportHeight < pHeight - elHeight )
+				) || this.options.fullscreen
+				);
+		},
+
+		show: function( notransition ) {
+			var hideClass = "ui-fixed-hidden",
+				$el = this.element;
+
+			if ( this._useTransition( notransition ) ) {
+				$el
+					.removeClass( "out " + hideClass )
+					.addClass( "in" )
+					.animationComplete(function () {
+						$el.removeClass( "in" );
+					});
+			}
+			else {
+				$el.removeClass( hideClass );
+			}
+			this._visible = true;
+		},
+
+		hide: function( notransition ) {
+			var hideClass = "ui-fixed-hidden",
+				$el = this.element,
+				// if it's a slide transition, our new transitions need the reverse class as well to slide outward
+				outclass = "out" + ( this.options.transition === "slide" ? " reverse" : "" );
+
+			if ( this._useTransition( notransition ) ) {
+				$el
+					.addClass( outclass )
+					.removeClass( "in" )
+					.animationComplete(function() {
+						$el.addClass( hideClass ).removeClass( outclass );
+					});
+			}
+			else {
+				$el.addClass( hideClass ).removeClass( outclass );
+			}
+			this._visible = false;
+		},
+
+		toggle: function() {
+			this[ this._visible ? "hide" : "show" ]();
+		},
+
+		_bindToggleHandlers: function() {
+			var self = this,
+				o = self.options,
+				delayShow, delayHide,
+				isVisible = true,
+				page = ( !!this.page )? this.page: $(".ui-page");
+
+			// tap toggle
+			page
+				.bind( "vclick", function( e ) {
+					if ( o.tapToggle && !$( e.target ).closest( o.tapToggleBlacklist ).length ) {
+						self.toggle();
+					}
+				})
+				.bind( "focusin focusout", function( e ) {
+					//this hides the toolbars on a keyboard pop to give more screen room and prevent ios bug which
+					//positions fixed toolbars in the middle of the screen on pop if the input is near the top or
+					//bottom of the screen addresses issues #4410 Footer navbar moves up when clicking on a textbox in an Android environment
+					//and issue #4113 Header and footer change their position after keyboard popup - iOS
+					//and issue #4410 Footer navbar moves up when clicking on a textbox in an Android environment
+					if ( screen.width < 1025 && $( e.target ).is( o.hideDuringFocus ) && !$( e.target ).closest( ".ui-header-fixed, .ui-footer-fixed" ).length ) {
+						//Fix for issue #4724 Moving through form in Mobile Safari with "Next" and "Previous" system
+						//controls causes fixed position, tap-toggle false Header to reveal itself
+						// isVisible instead of self._visible because the focusin and focusout events fire twice at the same time
+						// Also use a delay for hiding the toolbars because on Android native browser focusin is direclty followed
+						// by a focusout when a native selects opens and the other way around when it closes.
+						if ( e.type === "focusout" && !isVisible ) {
+							isVisible = true;
+							//wait for the stack to unwind and see if we have jumped to another input
+							clearTimeout( delayHide );
+							delayShow = setTimeout( function() {
+								self.show();
+							}, 0 );
+						} else if ( e.type === "focusin" && !!isVisible ) {
+							//if we have jumped to another input clear the time out to cancel the show.
+							clearTimeout( delayShow );
+							isVisible = false;
+							delayHide = setTimeout( function() {
+								self.hide();
+							}, 0 );
+						}
+					}
+				});
+		},
+
+		_setRelative: function() {
+			if( this.options.position !== "fixed" ){
+				$( "[data-"+ $.mobile.ns + "role='page']" ).css({ "position": "relative" });
+			}
+		},
+
+		_destroy: function() {
+			var $el = this.element,
+				header = $el.hasClass( "ui-header" );
+
+			$el.closest( ".ui-page" ).css( "padding-" + ( header ? "top" : "bottom" ), "" );
+			$el.removeClass( "ui-header-fixed ui-footer-fixed ui-header-fullscreen ui-footer-fullscreen in out fade slidedown slideup ui-fixed-hidden" );
+			$el.closest( ".ui-page" ).removeClass( "ui-page-header-fixed ui-page-footer-fixed ui-page-header-fullscreen ui-page-footer-fullscreen" );
+		}
+
+	});
+})( jQuery );
+
+(function( $, undefined ) {
+	$.widget( "mobile.toolbar", $.mobile.toolbar, {
+
+		_makeFixed: function() {
+			this._super();
+			this._workarounds();
+		},
+
+		//check the browser and version and run needed workarounds
+		_workarounds: function() {
+			var ua = navigator.userAgent,
+			platform = navigator.platform,
+			// Rendering engine is Webkit, and capture major version
+			wkmatch = ua.match( /AppleWebKit\/([0-9]+)/ ),
+			wkversion = !!wkmatch && wkmatch[ 1 ],
+			os = null,
+			self = this;
+			//set the os we are working in if it dosent match one with workarounds return
+			if ( platform.indexOf( "iPhone" ) > -1 || platform.indexOf( "iPad" ) > -1  || platform.indexOf( "iPod" ) > -1 ) {
+				os = "ios";
+			} else if ( ua.indexOf( "Android" ) > -1 ) {
+				os = "android";
+			} else {
+				return;
+			}
+			//check os version if it dosent match one with workarounds return
+			if ( os === "ios" ) {
+				//iOS  workarounds
+				self._bindScrollWorkaround();
+			} else if ( os === "android" && wkversion && wkversion < 534 ) {
+				//Android 2.3 run all Android 2.3 workaround
+				self._bindScrollWorkaround();
+				self._bindListThumbWorkaround();
+			} else {
+				return;
+			}
+		},
+
+		//Utility class for checking header and footer positions relative to viewport
+		_viewportOffset: function() {
+			var $el = this.element,
+				header = $el.hasClass( "ui-header" ),
+				offset = Math.abs( $el.offset().top - this.window.scrollTop() );
+			if ( !header ) {
+				offset = Math.round( offset - this.window.height() + $el.outerHeight() ) - 60;
+			}
+			return offset;
+		},
+
+		//bind events for _triggerRedraw() function
+		_bindScrollWorkaround: function() {
+			var self = this;
+			//bind to scrollstop and check if the toolbars are correctly positioned
+			this._on( this.window, { scrollstop: function() {
+				var viewportOffset = self._viewportOffset();
+				//check if the header is visible and if its in the right place
+				if ( viewportOffset > 2 && self._visible ) {
+					self._triggerRedraw();
+				}
+			}});
+		},
+
+		//this addresses issue #4250 Persistent footer instability in v1.1 with long select lists in Android 2.3.3
+		//and issue #3748 Android 2.x: Page transitions broken when fixed toolbars used
+		//the absolutely positioned thumbnail in a list view causes problems with fixed position buttons above in a nav bar
+		//setting the li's to -webkit-transform:translate3d(0,0,0); solves this problem to avoide potential issues in other
+		//platforms we scope this with the class ui-android-2x-fix
+		_bindListThumbWorkaround: function() {
+			this.element.closest( ".ui-page" ).addClass( "ui-android-2x-fixed" );
+		},
+		//this addresses issues #4337 Fixed header problem after scrolling content on iOS and Android
+		//and device bugs project issue #1 Form elements can lose click hit area in position: fixed containers.
+		//this also addresses not on fixed toolbars page in docs
+		//adding 1px of padding to the bottom then removing it causes a "redraw"
+		//which positions the toolbars correctly (they will always be visually correct)
+		_triggerRedraw: function() {
+			var paddingBottom = parseFloat( $( ".ui-page-active" ).css( "padding-bottom" ) );
+			//trigger page redraw to fix incorrectly positioned fixed elements
+			$( ".ui-page-active" ).css( "padding-bottom", ( paddingBottom + 1 ) + "px" );
+			//if the padding is reset with out a timeout the reposition will not occure.
+			//this is independant of JQM the browser seems to need the time to react.
+			setTimeout( function() {
+				$( ".ui-page-active" ).css( "padding-bottom", paddingBottom + "px" );
+			}, 0 );
+		},
+
+		destroy: function() {
+			this._super();
+			//Remove the class we added to the page previously in android 2.x
+			this.element.closest( ".ui-page-active" ).removeClass( "ui-android-2x-fix" );
+		}
+	});
+
+})( jQuery );
+
+
+( function( $, undefined ) {
+
+var ieHack = ( $.mobile.browser.oldIE && $.mobile.browser.oldIE <= 8 ),
+	uiTemplate = $(
+		"<div class='ui-popup-arrow-guide'></div>" +
+		"<div class='ui-popup-arrow-container" + ( ieHack ? " ie" : "" ) + "'>" +
+			"<div class='ui-popup-arrow'></div>" +
+		"</div>"
+	);
+
+function getArrow() {
+	var clone = uiTemplate.clone(),
+		gd = clone.eq( 0 ),
+		ct = clone.eq( 1 ),
+		ar = ct.children();
+
+	return { arEls: ct.add( gd ), gd: gd, ct: ct, ar: ar };
+}
+
+$.widget( "mobile.popup", $.mobile.popup, {
+	options: {
+
+		arrow: ""
+	},
+
+	_create: function() {
+		var ar,
+			ret = this._super();
+
+		if ( this.options.arrow ) {
+			this._ui.arrow = ar = this._addArrow();
+		}
+
+		return ret;
+	},
+
+	_addArrow: function() {
+		var theme,
+			opts = this.options,
+			ar = getArrow();
+
+		theme = this._themeClassFromOption( "ui-body-", opts.theme );
+		ar.ar.addClass( theme + ( opts.shadow ? " ui-overlay-shadow" : "" ) );
+		ar.arEls.hide().appendTo( this.element );
+
+		return ar;
+	},
+
+	_unenhance: function() {
+		var ar = this._ui.arrow;
+
+		if ( ar ) {
+			ar.arEls.remove();
+		}
+
+		return this._super();
+	},
+
+	// Pretend to show an arrow described by @p and @dir and calculate the
+	// distance from the desired point. If a best-distance is passed in, return
+	// the minimum of the one passed in and the one calculated.
+	_tryAnArrow: function( p, dir, desired, s, best ) {
+		var result, r, diff, desiredForArrow = {}, tip = {};
+
+		// If the arrow has no wiggle room along the edge of the popup, it cannot
+		// be displayed along the requested edge without it sticking out.
+		if ( s.arFull[ p.dimKey ] > s.guideDims[ p.dimKey ] ) {
+			return best;
+		}
+
+		desiredForArrow[ p.fst ] = desired[ p.fst ] +
+			( s.arHalf[ p.oDimKey ] + s.menuHalf[ p.oDimKey ] ) * p.offsetFactor -
+			s.contentBox[ p.fst ] + ( s.clampInfo.menuSize[ p.oDimKey ] - s.contentBox[ p.oDimKey ] ) * p.arrowOffsetFactor;
+		desiredForArrow[ p.snd ] = desired[ p.snd ];
+
+		result = s.result || this._calculateFinalLocation( desiredForArrow, s.clampInfo );
+		r = { x: result.left, y: result.top };
+
+		tip[ p.fst ] = r[ p.fst ] + s.contentBox[ p.fst ] + p.tipOffset;
+		tip[ p.snd ] = Math.max( result[ p.prop ] + s.guideOffset[ p.prop ] + s.arHalf[ p.dimKey ],
+			Math.min( result[ p.prop ] + s.guideOffset[ p.prop ] + s.guideDims[ p.dimKey ] - s.arHalf[ p.dimKey ],
+				desired[ p.snd ] ) );
+
+		diff = Math.abs( desired.x - tip.x ) + Math.abs( desired.y - tip.y );
+		if ( !best || diff < best.diff ) {
+			// Convert tip offset to coordinates inside the popup
+			tip[ p.snd ] -= s.arHalf[ p.dimKey ] + result[ p.prop ] + s.contentBox[ p.snd ];
+			best = { dir: dir, diff: diff, result: result, posProp: p.prop, posVal: tip[ p.snd ] };
+		}
+
+		return best;
+	},
+
+	_getPlacementState: function( clamp ) {
+		var offset, gdOffset,
+			ar = this._ui.arrow,
+			state = {
+				clampInfo: this._clampPopupWidth( !clamp ),
+				arFull: { cx: ar.ct.width(), cy: ar.ct.height() },
+				guideDims: { cx: ar.gd.width(), cy: ar.gd.height() },
+				guideOffset: ar.gd.offset()
+			};
+
+		offset = this.element.offset();
+
+		ar.gd.css( { left: 0, top: 0, right: 0, bottom: 0 } );
+		gdOffset = ar.gd.offset();
+		state.contentBox = {
+			x: gdOffset.left - offset.left,
+			y: gdOffset.top - offset.top,
+			cx: ar.gd.width(),
+			cy: ar.gd.height()
+		};
+		ar.gd.removeAttr( "style" );
+
+		// The arrow box moves between guideOffset and guideOffset + guideDims - arFull
+		state.guideOffset = { left: state.guideOffset.left - offset.left, top: state.guideOffset.top - offset.top };
+		state.arHalf = { cx: state.arFull.cx / 2, cy: state.arFull.cy / 2 };
+		state.menuHalf = { cx: state.clampInfo.menuSize.cx / 2, cy: state.clampInfo.menuSize.cy / 2 };
+
+		return state;
+	},
+
+	_placementCoords: function( desired ) {
+		var state, best, params, elOffset, bgRef,
+			optionValue = this.options.arrow,
+			ar = this._ui.arrow;
+
+		if ( !ar ) {
+			return this._super( desired );
+		}
+
+		ar.arEls.show();
+
+		bgRef = {};
+		state = this._getPlacementState( true );
+		params = {
+			"l": { fst: "x", snd: "y", prop: "top", dimKey: "cy", oDimKey: "cx", offsetFactor: 1, tipOffset:  -state.arHalf.cx, arrowOffsetFactor: 0 },
+			"r": { fst: "x", snd: "y", prop: "top", dimKey: "cy", oDimKey: "cx", offsetFactor: -1, tipOffset: state.arHalf.cx + state.contentBox.cx, arrowOffsetFactor: 1 },
+			"b": { fst: "y", snd: "x", prop: "left", dimKey: "cx", oDimKey: "cy", offsetFactor: -1, tipOffset: state.arHalf.cy + state.contentBox.cy, arrowOffsetFactor: 1 },
+			"t": { fst: "y", snd: "x", prop: "left", dimKey: "cx", oDimKey: "cy", offsetFactor: 1, tipOffset: -state.arHalf.cy, arrowOffsetFactor: 0 }
+		};
+
+		// Try each side specified in the options to see on which one the arrow
+		// should be placed such that the distance between the tip of the arrow and
+		// the desired coordinates is the shortest.
+		$.each( ( optionValue === true ? "l,t,r,b" : optionValue ).split( "," ),
+			$.proxy( function( key, value ) {
+				best = this._tryAnArrow( params[ value ], value, desired, state, best );
+			}, this ) );
+
+		// Could not place the arrow along any of the edges - behave as if showing
+		// the arrow was turned off.
+		if ( !best ) {
+			ar.arEls.hide();
+			return this._super( desired );
+		}
+
+		// Move the arrow into place
+		ar.ct
+			.removeClass( "ui-popup-arrow-l ui-popup-arrow-t ui-popup-arrow-r ui-popup-arrow-b" )
+			.addClass( "ui-popup-arrow-" + best.dir )
+			.removeAttr( "style" ).css( best.posProp, best.posVal )
+			.show();
+
+		// Do not move/size the background div on IE, because we use the arrow div for background as well.
+		if ( !ieHack ) {
+			elOffset = this.element.offset();
+			bgRef[ params[ best.dir ].fst ] = ar.ct.offset();
+			bgRef[ params[ best.dir ].snd ] = {
+				left: elOffset.left + state.contentBox.x,
+				top: elOffset.top + state.contentBox.y
+			};
+		}
+
+		return best.result;
+	},
+
+	_setOptions: function( opts ) {
+		var newTheme,
+			oldTheme = this.options.theme,
+			ar = this._ui.arrow,
+			ret = this._super( opts );
+
+		if ( opts.arrow !== undefined ) {
+			if ( !ar && opts.arrow ) {
+				this._ui.arrow = this._addArrow();
+
+				// Important to return here so we don't set the same options all over
+				// again below.
+				return;
+			} else if ( ar && !opts.arrow ) {
+				ar.arEls.remove();
+				this._ui.arrow = null;
+			}
+		}
+
+		// Reassign with potentially new arrow
+		ar = this._ui.arrow;
+
+		if ( ar ) {
+			if ( opts.theme !== undefined ) {
+				oldTheme = this._themeClassFromOption( "ui-body-", oldTheme );
+				newTheme = this._themeClassFromOption( "ui-body-", opts.theme );
+				ar.ar.removeClass( oldTheme ).addClass( newTheme );
+			}
+
+			if ( opts.shadow !== undefined ) {
+				ar.ar.toggleClass( "ui-overlay-shadow", opts.shadow );
+			}
+		}
+
+		return ret;
+	},
+
+	_destroy: function() {
+		var ar = this._ui.arrow;
+
+		if ( ar ) {
+			ar.arEls.remove();
+		}
+
+		return this._super();
+	}
+});
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+
+$.widget( "mobile.panel", {
+	options: {
+		classes: {
+			panel: "ui-panel",
+			panelOpen: "ui-panel-open",
+			panelClosed: "ui-panel-closed",
+			panelFixed: "ui-panel-fixed",
+			panelInner: "ui-panel-inner",
+			modal: "ui-panel-dismiss",
+			modalOpen: "ui-panel-dismiss-open",
+			pageContainer: "ui-panel-page-container",
+			pageWrapper: "ui-panel-wrapper",
+			pageFixedToolbar: "ui-panel-fixed-toolbar",
+			pageContentPrefix: "ui-panel-page-content", /* Used for wrapper and fixed toolbars position, display and open classes. */
+			animate: "ui-panel-animate"
+		},
+		animate: true,
+		theme: null,
+		position: "left",
+		dismissible: true,
+		display: "reveal", //accepts reveal, push, overlay
+		swipeClose: true,
+		positionFixed: false
+	},
+
+	_closeLink: null,
+	_parentPage: null,
+	_page: null,
+	_modal: null,
+	_panelInner: null,
+	_wrapper: null,
+	_fixedToolbars: null,
+
+	_create: function() {
+		var el = this.element,
+			parentPage = el.closest( ".ui-page, :jqmData(role='page')" );
+
+		// expose some private props to other methods
+		$.extend( this, {
+			_closeLink: el.find( ":jqmData(rel='close')" ),
+			_parentPage: ( parentPage.length > 0 ) ? parentPage : false,
+			_openedPage: null,
+			_page: this._getPage,
+			_panelInner: this._getPanelInner(),
+			_fixedToolbars: this._getFixedToolbars
+		});
+		if ( this.options.display !== "overlay" ){
+			this._getWrapper();
+		}
+		this._addPanelClasses();
+
+		// if animating, add the class to do so
+		if ( $.support.cssTransform3d && !!this.options.animate ) {
+			this.element.addClass( this.options.classes.animate );
+		}
+
+		this._bindUpdateLayout();
+		this._bindCloseEvents();
+		this._bindLinkListeners();
+		this._bindPageEvents();
+
+		if ( !!this.options.dismissible ) {
+			this._createModal();
+		}
+
+		this._bindSwipeEvents();
+	},
+
+	_getPanelInner: function() {
+		var panelInner = this.element.find( "." + this.options.classes.panelInner );
+
+		if ( panelInner.length === 0 ) {
+			panelInner = this.element.children().wrapAll( "<div class='" + this.options.classes.panelInner + "' />" ).parent();
+		}
+
+		return panelInner;
+	},
+
+	_createModal: function() {
+		var self = this,
+			target = self._parentPage ? self._parentPage.parent() : self.element.parent();
+
+		self._modal = $( "<div class='" + self.options.classes.modal + "'></div>" )
+			.on( "mousedown", function() {
+				self.close();
+			})
+			.appendTo( target );
+	},
+
+	_getPage: function() {
+		var page = this._openedPage || this._parentPage || $( "." + $.mobile.activePageClass );
+
+		return page;
+	},
+
+	_getWrapper: function() {
+		var wrapper = this._page().find( "." + this.options.classes.pageWrapper );
+		if ( wrapper.length === 0 ) {
+			wrapper = this._page().children( ".ui-header:not(.ui-header-fixed), .ui-content:not(.ui-popup), .ui-footer:not(.ui-footer-fixed)" )
+				.wrapAll( "<div class='" + this.options.classes.pageWrapper + "'></div>" )
+				.parent();
+		}
+
+		this._wrapper = wrapper;
+	},
+
+	_getFixedToolbars: function() {
+		var extFixedToolbars = $( "body" ).children( ".ui-header-fixed, .ui-footer-fixed" ),
+			intFixedToolbars = this._page().find( ".ui-header-fixed, .ui-footer-fixed" ),
+			fixedToolbars = extFixedToolbars.add( intFixedToolbars ).addClass( this.options.classes.pageFixedToolbar );
+
+		return fixedToolbars;
+	},
+
+	_getPosDisplayClasses: function( prefix ) {
+		return prefix + "-position-" + this.options.position + " " + prefix + "-display-" + this.options.display;
+	},
+
+	_getPanelClasses: function() {
+		var panelClasses = this.options.classes.panel +
+			" " + this._getPosDisplayClasses( this.options.classes.panel ) +
+			" " + this.options.classes.panelClosed +
+			" " + "ui-body-" + ( this.options.theme ? this.options.theme : "inherit" );
+
+		if ( !!this.options.positionFixed ) {
+			panelClasses += " " + this.options.classes.panelFixed;
+		}
+
+		return panelClasses;
+	},
+
+	_addPanelClasses: function() {
+		this.element.addClass( this._getPanelClasses() );
+	},
+
+	_handleCloseClickAndEatEvent: function( event ) {
+		if ( !event.isDefaultPrevented() ) {
+			event.preventDefault();
+			this.close();
+			return false;
+		}
+	},
+
+	_handleCloseClick: function( event ) {
+		if ( !event.isDefaultPrevented() ) {
+			this.close();
+		}
+	},
+
+	_bindCloseEvents: function() {
+		this._on( this._closeLink, {
+			"click": "_handleCloseClick"
+		});
+
+		this._on({
+			"click a:jqmData(ajax='false')": "_handleCloseClick"
+		});
+	},
+
+	_positionPanel: function( scrollToTop ) {
+		var self = this,
+			panelInnerHeight = self._panelInner.outerHeight(),
+			expand = panelInnerHeight > $.mobile.getScreenHeight();
+
+		if ( expand || !self.options.positionFixed ) {
+			if ( expand ) {
+				self._unfixPanel();
+				$.mobile.resetActivePageHeight( panelInnerHeight );
+			}
+			if ( scrollToTop ) {
+				this.window[ 0 ].scrollTo( 0, $.mobile.defaultHomeScroll );
+			}
+		} else {
+			self._fixPanel();
+		}
+	},
+
+	_bindFixListener: function() {
+		this._on( $( window ), { "throttledresize": "_positionPanel" });
+	},
+
+	_unbindFixListener: function() {
+		this._off( $( window ), "throttledresize" );
+	},
+
+	_unfixPanel: function() {
+		if ( !!this.options.positionFixed && $.support.fixedPosition ) {
+			this.element.removeClass( this.options.classes.panelFixed );
+		}
+	},
+
+	_fixPanel: function() {
+		if ( !!this.options.positionFixed && $.support.fixedPosition ) {
+			this.element.addClass( this.options.classes.panelFixed );
+		}
+	},
+
+	_bindUpdateLayout: function() {
+		var self = this;
+
+		self.element.on( "updatelayout", function(/* e */) {
+			if ( self._open ) {
+				self._positionPanel();
+			}
+		});
+	},
+
+	_bindLinkListeners: function() {
+		this._on( "body", {
+			"click a": "_handleClick"
+		});
+
+	},
+
+	_handleClick: function( e ) {
+		var link,
+			panelId = this.element.attr( "id" );
+
+		if ( e.currentTarget.href.split( "#" )[ 1 ] === panelId && panelId !== undefined ) {
+
+			e.preventDefault();
+			link = $( e.target );
+			if ( link.hasClass( "ui-btn" ) ) {
+				link.addClass( $.mobile.activeBtnClass );
+				this.element.one( "panelopen panelclose", function() {
+					link.removeClass( $.mobile.activeBtnClass );
+				});
+			}
+			this.toggle();
+			return false;
+		}
+	},
+
+	_bindSwipeEvents: function() {
+		var self = this,
+			area = self._modal ? self.element.add( self._modal ) : self.element;
+
+		// on swipe, close the panel
+		if ( !!self.options.swipeClose ) {
+			if ( self.options.position === "left" ) {
+				area.on( "swipeleft.panel", function(/* e */) {
+					self.close();
+				});
+			} else {
+				area.on( "swiperight.panel", function(/* e */) {
+					self.close();
+				});
+			}
+		}
+	},
+
+	_bindPageEvents: function() {
+		var self = this;
+
+		this.document
+			// Close the panel if another panel on the page opens
+			.on( "panelbeforeopen", function( e ) {
+				if ( self._open && e.target !== self.element[ 0 ] ) {
+					self.close();
+				}
+			})
+			// On escape, close? might need to have a target check too...
+			.on( "keyup.panel", function( e ) {
+				if ( e.keyCode === 27 && self._open ) {
+					self.close();
+				}
+			});
+		if ( !this._parentPage && this.options.display !== "overlay" ) {
+			this._on( this.document, {
+				"pageshow": "_getWrapper"
+			});
+		}
+		// Clean up open panels after page hide
+		if ( self._parentPage ) {
+			this.document.on( "pagehide", ":jqmData(role='page')", function() {
+				if ( self._open ) {
+					self.close( true );
+				}
+			});
+		} else {
+			this.document.on( "pagebeforehide", function() {
+				if ( self._open ) {
+					self.close( true );
+				}
+			});
+		}
+	},
+
+	// state storage of open or closed
+	_open: false,
+	_pageContentOpenClasses: null,
+	_modalOpenClasses: null,
+
+	open: function( immediate ) {
+		if ( !this._open ) {
+			var self = this,
+				o = self.options,
+
+				_openPanel = function() {
+					self.document.off( "panelclose" );
+					self._page().jqmData( "panel", "open" );
+
+					if ( $.support.cssTransform3d && !!o.animate && o.display !== "overlay" ) {
+						self._wrapper.addClass( o.classes.animate );
+						self._fixedToolbars().addClass( o.classes.animate );
+					}
+
+					if ( !immediate && $.support.cssTransform3d && !!o.animate ) {
+						self.element.animationComplete( complete, "transition" );
+					} else {
+						setTimeout( complete, 0 );
+					}
+
+					if ( o.theme && o.display !== "overlay" ) {
+						self._page().parent()
+							.addClass( o.classes.pageContainer + "-themed " + o.classes.pageContainer + "-" + o.theme );
+					}
+
+					self.element
+						.removeClass( o.classes.panelClosed )
+						.addClass( o.classes.panelOpen );
+
+					self._positionPanel( true );
+
+					self._pageContentOpenClasses = self._getPosDisplayClasses( o.classes.pageContentPrefix );
+
+					if ( o.display !== "overlay" ) {
+						self._page().parent().addClass( o.classes.pageContainer );
+						self._wrapper.addClass( self._pageContentOpenClasses );
+						self._fixedToolbars().addClass( self._pageContentOpenClasses );
+					}
+
+					self._modalOpenClasses = self._getPosDisplayClasses( o.classes.modal ) + " " + o.classes.modalOpen;
+					if ( self._modal ) {
+						self._modal
+							.addClass( self._modalOpenClasses )
+							.height( Math.max( self._modal.height(), self.document.height() ) );
+					}
+				},
+				complete = function() {
+
+					if ( o.display !== "overlay" ) {
+						self._wrapper.addClass( o.classes.pageContentPrefix + "-open" );
+						self._fixedToolbars().addClass( o.classes.pageContentPrefix + "-open" );
+					}
+
+					self._bindFixListener();
+
+					self._trigger( "open" );
+
+					self._openedPage = self._page();
+				};
+
+			self._trigger( "beforeopen" );
+
+			if ( self._page().jqmData( "panel" ) === "open" ) {
+				self.document.on( "panelclose", function() {
+					_openPanel();
+				});
+			} else {
+				_openPanel();
+			}
+
+			self._open = true;
+		}
+	},
+
+	close: function( immediate ) {
+		if ( this._open ) {
+			var self = this,
+				o = this.options,
+
+				_closePanel = function() {
+
+					self.element.removeClass( o.classes.panelOpen );
+
+					if ( o.display !== "overlay" ) {
+						self._wrapper.removeClass( self._pageContentOpenClasses );
+						self._fixedToolbars().removeClass( self._pageContentOpenClasses );
+					}
+
+					if ( !immediate && $.support.cssTransform3d && !!o.animate ) {
+						self.element.animationComplete( complete, "transition" );
+					} else {
+						setTimeout( complete, 0 );
+					}
+
+					if ( self._modal ) {
+						self._modal.removeClass( self._modalOpenClasses );
+					}
+				},
+				complete = function() {
+					if ( o.theme && o.display !== "overlay" ) {
+						self._page().parent().removeClass( o.classes.pageContainer + "-themed " + o.classes.pageContainer + "-" + o.theme );
+					}
+
+					self.element.addClass( o.classes.panelClosed );
+
+					if ( o.display !== "overlay" ) {
+						self._page().parent().removeClass( o.classes.pageContainer );
+						self._wrapper.removeClass( o.classes.pageContentPrefix + "-open" );
+						self._fixedToolbars().removeClass( o.classes.pageContentPrefix + "-open" );
+					}
+
+					if ( $.support.cssTransform3d && !!o.animate && o.display !== "overlay" ) {
+						self._wrapper.removeClass( o.classes.animate );
+						self._fixedToolbars().removeClass( o.classes.animate );
+					}
+
+					self._fixPanel();
+					self._unbindFixListener();
+					$.mobile.resetActivePageHeight();
+
+					self._page().jqmRemoveData( "panel" );
+
+					self._trigger( "close" );
+
+					self._openedPage = null;
+				};
+
+			self._trigger( "beforeclose" );
+
+			_closePanel();
+
+			self._open = false;
+		}
+	},
+
+	toggle: function() {
+		this[ this._open ? "close" : "open" ]();
+	},
+
+	_destroy: function() {
+		var otherPanels,
+		o = this.options,
+		multiplePanels = ( $( "body > :mobile-panel" ).length + $.mobile.activePage.find( ":mobile-panel" ).length ) > 1;
+
+		if ( o.display !== "overlay" ) {
+
+			//  remove the wrapper if not in use by another panel
+			otherPanels = $( "body > :mobile-panel" ).add( $.mobile.activePage.find( ":mobile-panel" ) );
+			if ( otherPanels.not( ".ui-panel-display-overlay" ).not( this.element ).length === 0 ) {
+				this._wrapper.children().unwrap();
+			}
+
+			if ( this._open ) {
+
+				this._fixedToolbars().removeClass( o.classes.pageContentPrefix + "-open" );
+
+				if ( $.support.cssTransform3d && !!o.animate ) {
+					this._fixedToolbars().removeClass( o.classes.animate );
+				}
+
+				this._page().parent().removeClass( o.classes.pageContainer );
+
+				if ( o.theme ) {
+					this._page().parent().removeClass( o.classes.pageContainer + "-themed " + o.classes.pageContainer + "-" + o.theme );
+				}
+			}
+		}
+
+		if ( !multiplePanels ) {
+
+			this.document.off( "panelopen panelclose" );
+
+		}
+
+		if ( this._open ) {
+			this._page().jqmRemoveData( "panel" );
+		}
+
+		this._panelInner.children().unwrap();
+
+		this.element
+			.removeClass( [ this._getPanelClasses(), o.classes.panelOpen, o.classes.animate ].join( " " ) )
+			.off( "swipeleft.panel swiperight.panel" )
+			.off( "panelbeforeopen" )
+			.off( "panelhide" )
+			.off( "keyup.panel" )
+			.off( "updatelayout" );
+
+		if ( this._modal ) {
+			this._modal.remove();
+		}
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.table", {
+	options: {
+		classes: {
+			table: "ui-table"
+		},
+		enhanced: false
+	},
+
+	_create: function() {
+		if ( !this.options.enhanced ) {
+			this.element.addClass( this.options.classes.table );
+		}
+
+		// extend here, assign on refresh > _setHeaders
+		$.extend( this, {
+
+			// Expose headers and allHeaders properties on the widget
+			// headers references the THs within the first TR in the table
+			headers: undefined,
+
+			// allHeaders references headers, plus all THs in the thead, which may
+			// include several rows, or not
+			allHeaders: undefined
+		});
+
+		this._refresh( true );
+	},
+
+	_setHeaders: function() {
+		var trs = this.element.find( "thead tr" );
+
+		this.headers = this.element.find( "tr:eq(0)" ).children();
+		this.allHeaders = this.headers.add( trs.children() );
+	},
+
+	refresh: function() {
+		this._refresh();
+	},
+
+	rebuild: $.noop,
+
+	_refresh: function( /* create */ ) {
+		var table = this.element,
+			trs = table.find( "thead tr" );
+
+		// updating headers on refresh (fixes #5880)
+		this._setHeaders();
+
+		// Iterate over the trs
+		trs.each( function() {
+			var columnCount = 0;
+
+			// Iterate over the children of the tr
+			$( this ).children().each( function() {
+				var span = parseInt( this.getAttribute( "colspan" ), 10 ),
+					selector = ":nth-child(" + ( columnCount + 1 ) + ")",
+					j;
+
+				this.setAttribute( "data-" + $.mobile.ns + "colstart", columnCount + 1 );
+
+				if ( span ) {
+					for( j = 0; j < span - 1; j++ ) {
+						columnCount++;
+						selector += ", :nth-child(" + ( columnCount + 1 ) + ")";
+					}
+				}
+
+				// Store "cells" data on header as a reference to all cells in the
+				// same column as this TH
+				$( this ).jqmData( "cells", table.find( "tr" ).not( trs.eq( 0 ) ).not( this ).children( selector ) );
+
+				columnCount++;
+			});
+		});
+	}
+});
+
+})( jQuery );
+
+
+(function( $, undefined ) {
+
+$.widget( "mobile.table", $.mobile.table, {
+	options: {
+		mode: "columntoggle",
+		columnBtnTheme: null,
+		columnPopupTheme: null,
+		columnBtnText: "Columns...",
+		classes: $.extend( $.mobile.table.prototype.options.classes, {
+			popup: "ui-table-columntoggle-popup",
+			columnBtn: "ui-table-columntoggle-btn",
+			priorityPrefix: "ui-table-priority-",
+			columnToggleTable: "ui-table-columntoggle"
+		})
+	},
+
+	_create: function() {
+		this._super();
+
+		if ( this.options.mode !== "columntoggle" ) {
+			return;
+		}
+
+		$.extend( this, {
+			_menu: null
+		});
+
+		if ( this.options.enhanced ) {
+			this._menu = $( this.document[ 0 ].getElementById( this._id() + "-popup" ) ).children().first();
+			this._addToggles( this._menu, true );
+		} else {
+			this._menu = this._enhanceColToggle();
+			this.element.addClass( this.options.classes.columnToggleTable );
+		}
+
+		this._setupEvents();
+
+		this._setToggleState();
+	},
+
+	_id: function() {
+		return ( this.element.attr( "id" ) || ( this.widgetName + this.uuid ) );
+	},
+
+	_setupEvents: function() {
+		//NOTE: inputs are bound in bindToggles,
+		// so it can be called on refresh, too
+
+		// update column toggles on resize
+		this._on( this.window, {
+			throttledresize: "_setToggleState"
+		});
+		this._on( this._menu, {
+			"change input": "_menuInputChange"
+		});
+	},
+
+	_addToggles: function( menu, keep ) {
+		var inputs,
+			checkboxIndex = 0,
+			opts = this.options,
+			container = menu.controlgroup( "container" );
+
+		// allow update of menu on refresh (fixes #5880)
+		if ( keep ) {
+			inputs = menu.find( "input" );
+		} else {
+			container.empty();
+		}
+
+		// create the hide/show toggles
+		this.headers.not( "td" ).each( function() {
+			var header = $( this ),
+				priority = $.mobile.getAttribute( this, "priority" ),
+				cells = header.add( header.jqmData( "cells" ) );
+
+			if ( priority ) {
+				cells.addClass( opts.classes.priorityPrefix + priority );
+
+				( keep ? inputs.eq( checkboxIndex++ ) :
+					$("<label><input type='checkbox' checked />" +
+						( header.children( "abbr" ).first().attr( "title" ) ||
+							header.text() ) +
+						"</label>" )
+						.appendTo( container )
+						.children( 0 )
+						.checkboxradio( {
+							theme: opts.columnPopupTheme
+						}) )
+					.jqmData( "cells", cells );
+			}
+		});
+
+		// set bindings here
+		if ( !keep ) {
+			menu.controlgroup( "refresh" );
+		}
+	},
+
+	_menuInputChange: function( evt ) {
+		var input = $( evt.target ),
+			checked = input[ 0 ].checked;
+
+		input.jqmData( "cells" )
+			.toggleClass( "ui-table-cell-hidden", !checked )
+			.toggleClass( "ui-table-cell-visible", checked );
+
+		if ( input[ 0 ].getAttribute( "locked" ) ) {
+			input.removeAttr( "locked" );
+
+			this._unlockCells( input.jqmData( "cells" ) );
+		} else {
+			input.attr( "locked", true );
+		}
+	},
+
+	_unlockCells: function( cells ) {
+		// allow hide/show via CSS only = remove all toggle-locks
+		cells.removeClass( "ui-table-cell-hidden ui-table-cell-visible");
+	},
+
+	_enhanceColToggle: function() {
+		var id , menuButton, popup, menu,
+			table = this.element,
+			opts = this.options,
+			ns = $.mobile.ns,
+			fragment = this.document[ 0 ].createDocumentFragment();
+
+		id = this._id() + "-popup";
+		menuButton = $( "<a href='#" + id + "' " +
+			"class='" + opts.classes.columnBtn + " ui-btn " +
+			"ui-btn-" + ( opts.columnBtnTheme || "a" ) +
+			" ui-corner-all ui-shadow ui-mini' " +
+			"data-" + ns + "rel='popup'>" + opts.columnBtnText + "</a>" );
+		popup = $( "<div class='" + opts.classes.popup + "' id='" + id + "'></div>" );
+		menu = $( "<fieldset></fieldset>" ).controlgroup();
+
+		// set extension here, send "false" to trigger build/rebuild
+		this._addToggles( menu, false );
+
+		menu.appendTo( popup );
+
+		fragment.appendChild( popup[ 0 ] );
+		fragment.appendChild( menuButton[ 0 ] );
+		table.before( fragment );
+
+		popup.popup();
+
+		return menu;
+	},
+
+	rebuild: function() {
+		this._super();
+
+		if ( this.options.mode === "columntoggle" ) {
+			// NOTE: rebuild passes "false", while refresh passes "undefined"
+			// both refresh the table, but inside addToggles, !false will be true,
+			// so a rebuild call can be indentified
+			this._refresh( false );
+		}
+	},
+
+	_refresh: function( create ) {
+		this._super( create );
+
+		if ( !create && this.options.mode === "columntoggle" ) {
+			// columns not being replaced must be cleared from input toggle-locks
+			this._unlockCells( this.element.find( ".ui-table-cell-hidden, " +
+				".ui-table-cell-visible" ) );
+
+			// update columntoggles and cells
+			this._addToggles( this._menu, create );
+
+			// check/uncheck
+			this._setToggleState();
+		}
+	},
+
+	_setToggleState: function() {
+		this._menu.find( "input" ).each( function() {
+			var checkbox = $( this );
+
+			this.checked = checkbox.jqmData( "cells" ).eq( 0 ).css( "display" ) === "table-cell";
+			checkbox.checkboxradio( "refresh" );
+		});
+	},
+
+	_destroy: function() {
+		this._super();
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+$.widget( "mobile.table", $.mobile.table, {
+	options: {
+		mode: "reflow",
+		classes: $.extend( $.mobile.table.prototype.options.classes, {
+			reflowTable: "ui-table-reflow",
+			cellLabels: "ui-table-cell-label"
+		})
+	},
+
+	_create: function() {
+		this._super();
+
+		// If it's not reflow mode, return here.
+		if ( this.options.mode !== "reflow" ) {
+			return;
+		}
+
+		if ( !this.options.enhanced ) {
+			this.element.addClass( this.options.classes.reflowTable );
+
+			this._updateReflow();
+		}
+	},
+
+	rebuild: function() {
+		this._super();
+
+		if ( this.options.mode === "reflow" ) {
+			this._refresh( false );
+		}
+	},
+
+	_refresh: function( create ) {
+		this._super( create );
+		if ( !create && this.options.mode === "reflow" ) {
+			this._updateReflow( );
+		}
+	},
+
+	_updateReflow: function() {
+		var table = this,
+			opts = this.options;
+
+		// get headers in reverse order so that top-level headers are appended last
+		$( table.allHeaders.get().reverse() ).each( function() {
+			var cells = $( this ).jqmData( "cells" ),
+				colstart = $.mobile.getAttribute( this, "colstart" ),
+				hierarchyClass = cells.not( this ).filter( "thead th" ).length && " ui-table-cell-label-top",
+				text = $( this ).text(),
+				iteration, filter;
+
+				if ( text !== ""  ) {
+
+					if ( hierarchyClass ) {
+						iteration = parseInt( this.getAttribute( "colspan" ), 10 );
+						filter = "";
+
+						if ( iteration ) {
+							filter = "td:nth-child("+ iteration +"n + " + ( colstart ) +")";
+						}
+
+						table._addLabels( cells.filter( filter ), opts.classes.cellLabels + hierarchyClass, text );
+					} else {
+						table._addLabels( cells, opts.classes.cellLabels, text );
+					}
+
+				}
+		});
+	},
+
+	_addLabels: function( cells, label, text ) {
+		// .not fixes #6006
+		cells.not( ":has(b." + label + ")" ).prepend( "<b class='" + label + "'>" + text + "</b>"  );
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+// TODO rename filterCallback/deprecate and default to the item itself as the first argument
+var defaultFilterCallback = function( index, searchValue ) {
+	return ( ( "" + ( $.mobile.getAttribute( this, "filtertext" ) || $( this ).text() ) )
+		.toLowerCase().indexOf( searchValue ) === -1 );
+};
+
+$.widget( "mobile.filterable", {
+
+	initSelector: ":jqmData(filter='true')",
+
+	options: {
+		filterReveal: false,
+		filterCallback: defaultFilterCallback,
+		enhanced: false,
+		input: null,
+		children: "> li, > option, > optgroup option, > tbody tr, > .ui-controlgroup-controls > .ui-btn, > .ui-controlgroup-controls > .ui-checkbox, > .ui-controlgroup-controls > .ui-radio"
+	},
+
+	_create: function() {
+		var opts = this.options;
+
+		$.extend( this, {
+			_search: null,
+			_timer: 0
+		});
+
+		this._setInput( opts.input );
+		if ( !opts.enhanced ) {
+			this._filterItems( ( ( this._search && this._search.val() ) || "" ).toLowerCase() );
+		}
+	},
+
+	_onKeyUp: function() {
+		var val, lastval,
+			search = this._search;
+
+		if ( search ) {
+			val = search.val().toLowerCase(),
+			lastval = $.mobile.getAttribute( search[ 0 ], "lastval" ) + "";
+
+			if ( lastval && lastval === val ) {
+				// Execute the handler only once per value change
+				return;
+			}
+
+			if ( this._timer ) {
+				window.clearTimeout( this._timer );
+				this._timer = 0;
+			}
+
+			this._timer = this._delay( function() {
+				this._trigger( "beforefilter", null, { input: search } );
+
+				// Change val as lastval for next execution
+				search[ 0 ].setAttribute( "data-" + $.mobile.ns + "lastval", val );
+
+				this._filterItems( val );
+				this._timer = 0;
+			}, 250 );
+		}
+	},
+
+	_getFilterableItems: function() {
+		var elem = this.element,
+			children = this.options.children,
+			items = !children ? { length: 0 }:
+				$.isFunction( children ) ? children():
+				children.nodeName ? $( children ):
+				children.jquery ? children:
+				this.element.find( children );
+
+		if ( items.length === 0 ) {
+			items = elem.children();
+		}
+
+		return items;
+	},
+
+	_filterItems: function( val ) {
+		var idx, callback, length, dst,
+			show = [],
+			hide = [],
+			opts = this.options,
+			filterItems = this._getFilterableItems();
+
+		if ( val != null ) {
+			callback = opts.filterCallback || defaultFilterCallback;
+			length = filterItems.length;
+
+			// Partition the items into those to be hidden and those to be shown
+			for ( idx = 0 ; idx < length ; idx++ ) {
+				dst = ( callback.call( filterItems[ idx ], idx, val ) ) ? hide : show;
+				dst.push( filterItems[ idx ] );
+			}
+		}
+
+		// If nothing is hidden, then the decision whether to hide or show the items
+		// is based on the "filterReveal" option.
+		if ( hide.length === 0 ) {
+			filterItems[ opts.filterReveal ? "addClass" : "removeClass" ]( "ui-screen-hidden" );
+		} else {
+			$( hide ).addClass( "ui-screen-hidden" );
+			$( show ).removeClass( "ui-screen-hidden" );
+		}
+
+		this._refreshChildWidget();
+
+		this._trigger( "filter", null, {
+			items: filterItems
+		});
+	},
+
+	// The Default implementation of _refreshChildWidget attempts to call
+	// refresh on collapsibleset, controlgroup, selectmenu, or listview
+	_refreshChildWidget: function() {
+		var widget, idx,
+			recognizedWidgets = [ "collapsibleset", "selectmenu", "controlgroup", "listview" ];
+
+		for ( idx = recognizedWidgets.length - 1 ; idx > -1 ; idx-- ) {
+			widget = recognizedWidgets[ idx ];
+			if ( $.mobile[ widget ] ) {
+				widget = this.element.data( "mobile-" + widget );
+				if ( widget && $.isFunction( widget.refresh ) ) {
+					widget.refresh();
+				}
+			}
+		}
+	},
+
+	// TODO: When the input is not internal, do not even store it in this._search
+	_setInput: function ( selector ) {
+		var search = this._search;
+
+		// Stop a pending filter operation
+		if ( this._timer ) {
+			window.clearTimeout( this._timer );
+			this._timer = 0;
+		}
+
+		if ( search ) {
+			this._off( search, "keyup change input" );
+			search = null;
+		}
+
+		if ( selector ) {
+			search = selector.jquery ? selector:
+				selector.nodeName ? $( selector ):
+				this.document.find( selector );
+
+			this._on( search, {
+				keyup: "_onKeyUp",
+				change: "_onKeyUp",
+				input: "_onKeyUp"
+			});
+		}
+
+		this._search = search;
+	},
+
+	_setOptions: function( options ) {
+		var refilter = !( ( options.filterReveal === undefined ) &&
+				( options.filterCallback === undefined ) &&
+				( options.children === undefined ) );
+
+		this._super( options );
+
+		if ( options.input !== undefined ) {
+			this._setInput( options.input );
+			refilter = true;
+		}
+
+		if ( refilter ) {
+			this.refresh();
+		}
+	},
+
+	_destroy: function() {
+		var opts = this.options,
+			items = this._getFilterableItems();
+
+		if ( opts.enhanced ) {
+			items.toggleClass( "ui-screen-hidden", opts.filterReveal );
+		} else {
+			items.removeClass( "ui-screen-hidden" );
+		}
+	},
+
+	refresh: function() {
+		if ( this._timer ) {
+			window.clearTimeout( this._timer );
+			this._timer = 0;
+		}
+		this._filterItems( ( ( this._search && this._search.val() ) || "" ).toLowerCase() );
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+// Create a function that will replace the _setOptions function of a widget,
+// and will pass the options on to the input of the filterable.
+var replaceSetOptions = function( self, orig ) {
+		return function( options ) {
+			orig.call( this, options );
+			self._syncTextInputOptions( options );
+		};
+	},
+	rDividerListItem = /(^|\s)ui-li-divider(\s|$)/,
+	origDefaultFilterCallback = $.mobile.filterable.prototype.options.filterCallback;
+
+// Override the default filter callback with one that does not hide list dividers
+$.mobile.filterable.prototype.options.filterCallback = function( index, searchValue ) {
+	return !this.className.match( rDividerListItem ) &&
+		origDefaultFilterCallback.call( this, index, searchValue );
+};
+
+$.widget( "mobile.filterable", $.mobile.filterable, {
+	options: {
+		filterPlaceholder: "Filter items...",
+		filterTheme: null
+	},
+
+	_create: function() {
+		var idx, widgetName,
+			elem = this.element,
+			recognizedWidgets = [ "collapsibleset", "selectmenu", "controlgroup", "listview" ],
+			createHandlers = {};
+
+		this._super();
+
+		$.extend( this, {
+			_widget: null
+		});
+
+		for ( idx = recognizedWidgets.length - 1 ; idx > -1 ; idx-- ) {
+			widgetName = recognizedWidgets[ idx ];
+			if ( $.mobile[ widgetName ] ) {
+				if ( this._setWidget( elem.data( "mobile-" + widgetName ) ) ) {
+					break;
+				} else {
+					createHandlers[ widgetName + "create" ] = "_handleCreate";
+				}
+			}
+		}
+
+		if ( !this._widget ) {
+			this._on( elem, createHandlers );
+		}
+	},
+
+	_handleCreate: function( evt ) {
+		this._setWidget( this.element.data( "mobile-" + evt.type.substring( 0, evt.type.length - 6 ) ) );
+	},
+
+	_trigger: function( type, event, data ) {
+		if ( this._widget && this._widget.widgetFullName === "mobile-listview" &&
+			type === "beforefilter" ) {
+
+			// Also trigger listviewbeforefilter if this widget is also a listview
+			this._widget._trigger( "beforefilter", event, data );
+		}
+		this._super( type, event, data );
+	},
+
+	_setWidget: function( widget ) {
+		if ( !this._widget && widget ) {
+			this._widget = widget;
+			this._widget._setOptions = replaceSetOptions( this, this._widget._setOptions );
+		}
+
+		if ( !!this._widget ) {
+			this._syncTextInputOptions( this._widget.options );
+			if ( this._widget.widgetName === "listview" ) {
+				this._widget.options.hideDividers = true;
+				this._widget.element.listview( "refresh" );
+			}
+		}
+
+		return !!this._widget;
+	},
+
+	_isSearchInternal: function() {
+		return ( this._search && this._search.jqmData( "ui-filterable-" + this.uuid + "-internal" ) );
+	},
+
+	_setInput: function( selector ) {
+		var opts = this.options,
+			updatePlaceholder = true,
+			textinputOpts = {};
+
+		if ( !selector ) {
+			if ( this._isSearchInternal() ) {
+
+				// Ignore the call to set a new input if the selector goes to falsy and
+				// the current textinput is already of the internally generated variety.
+				return;
+			} else {
+
+				// Generating a new textinput widget. No need to set the placeholder
+				// further down the function.
+				updatePlaceholder = false;
+				selector = $( "<input " +
+					"data-" + $.mobile.ns + "type='search' " +
+					"placeholder='" + opts.filterPlaceholder + "'></input>" )
+					.jqmData( "ui-filterable-" + this.uuid + "-internal", true );
+				$( "<form class='ui-filterable'></form>" )
+					.append( selector )
+					.submit( function( evt ) {
+						evt.preventDefault();
+						selector.blur();
+					})
+					.insertBefore( this.element );
+				if ( $.mobile.textinput ) {
+					if ( this.options.filterTheme != null ) {
+						textinputOpts[ "theme" ] = opts.filterTheme;
+					}
+
+					selector.textinput( textinputOpts );
+				}
+			}
+		}
+
+		this._super( selector );
+
+		if ( this._isSearchInternal() && updatePlaceholder ) {
+			this._search.attr( "placeholder", this.options.filterPlaceholder );
+		}
+	},
+
+	_setOptions: function( options ) {
+		var ret = this._super( options );
+
+		// Need to set the filterPlaceholder after having established the search input
+		if ( options.filterPlaceholder !== undefined ) {
+			if ( this._isSearchInternal() ) {
+				this._search.attr( "placeholder", options.filterPlaceholder );
+			}
+		}
+
+		if ( options.filterTheme !== undefined && this._search && $.mobile.textinput ) {
+			this._search.textinput( "option", "theme", options.filterTheme );
+		}
+
+		return ret;
+	},
+
+	_destroy: function() {
+		if ( this._isSearchInternal() ) {
+			this._search.remove();
+		}
+		this._super();
+	},
+
+	_syncTextInputOptions: function( options ) {
+		var idx,
+			textinputOptions = {};
+
+		// We only sync options if the filterable's textinput is of the internally
+		// generated variety, rather than one specified by the user.
+		if ( this._isSearchInternal() && $.mobile.textinput ) {
+
+			// Apply only the options understood by textinput
+			for ( idx in $.mobile.textinput.prototype.options ) {
+				if ( options[ idx ] !== undefined ) {
+					if ( idx === "theme" && this.options.filterTheme != null ) {
+						textinputOptions[ idx ] = this.options.filterTheme;
+					} else {
+						textinputOptions[ idx ] = options[ idx ];
+					}
+				}
+			}
+			this._search.textinput( "option", textinputOptions );
+		}
+	}
+});
+
+})( jQuery );
+
+/*!
+ * jQuery UI Tabs fadf2b312a05040436451c64bbfaf4814bc62c56
+ * http://jqueryui.com
+ *
+ * Copyright 2013 jQuery Foundation and other contributors
+ * Released under the MIT license.
+ * http://jquery.org/license
+ *
+ * http://api.jqueryui.com/tabs/
+ *
+ * Depends:
+ *	jquery.ui.core.js
+ *	jquery.ui.widget.js
+ */
+(function( $, undefined ) {
+
+var tabId = 0,
+	rhash = /#.*$/;
+
+function getNextTabId() {
+	return ++tabId;
+}
+
+function isLocal( anchor ) {
+	return anchor.hash.length > 1 &&
+		decodeURIComponent( anchor.href.replace( rhash, "" ) ) ===
+			decodeURIComponent( location.href.replace( rhash, "" ) );
+}
+
+$.widget( "ui.tabs", {
+	version: "fadf2b312a05040436451c64bbfaf4814bc62c56",
+	delay: 300,
+	options: {
+		active: null,
+		collapsible: false,
+		event: "click",
+		heightStyle: "content",
+		hide: null,
+		show: null,
+
+		// callbacks
+		activate: null,
+		beforeActivate: null,
+		beforeLoad: null,
+		load: null
+	},
+
+	_create: function() {
+		var that = this,
+			options = this.options;
+
+		this.running = false;
+
+		this.element
+			.addClass( "ui-tabs ui-widget ui-widget-content ui-corner-all" )
+			.toggleClass( "ui-tabs-collapsible", options.collapsible )
+			// Prevent users from focusing disabled tabs via click
+			.delegate( ".ui-tabs-nav > li", "mousedown" + this.eventNamespace, function( event ) {
+				if ( $( this ).is( ".ui-state-disabled" ) ) {
+					event.preventDefault();
+				}
+			})
+			// support: IE <9
+			// Preventing the default action in mousedown doesn't prevent IE
+			// from focusing the element, so if the anchor gets focused, blur.
+			// We don't have to worry about focusing the previously focused
+			// element since clicking on a non-focusable element should focus
+			// the body anyway.
+			.delegate( ".ui-tabs-anchor", "focus" + this.eventNamespace, function() {
+				if ( $( this ).closest( "li" ).is( ".ui-state-disabled" ) ) {
+					this.blur();
+				}
+			});
+
+		this._processTabs();
+		options.active = this._initialActive();
+
+		// Take disabling tabs via class attribute from HTML
+		// into account and update option properly.
+		if ( $.isArray( options.disabled ) ) {
+			options.disabled = $.unique( options.disabled.concat(
+				$.map( this.tabs.filter( ".ui-state-disabled" ), function( li ) {
+					return that.tabs.index( li );
+				})
+			) ).sort();
+		}
+
+		// check for length avoids error when initializing empty list
+		if ( this.options.active !== false && this.anchors.length ) {
+			this.active = this._findActive( options.active );
+		} else {
+			this.active = $();
+		}
+
+		this._refresh();
+
+		if ( this.active.length ) {
+			this.load( options.active );
+		}
+	},
+
+	_initialActive: function() {
+		var active = this.options.active,
+			collapsible = this.options.collapsible,
+			locationHash = location.hash.substring( 1 );
+
+		if ( active === null ) {
+			// check the fragment identifier in the URL
+			if ( locationHash ) {
+				this.tabs.each(function( i, tab ) {
+					if ( $( tab ).attr( "aria-controls" ) === locationHash ) {
+						active = i;
+						return false;
+					}
+				});
+			}
+
+			// check for a tab marked active via a class
+			if ( active === null ) {
+				active = this.tabs.index( this.tabs.filter( ".ui-tabs-active" ) );
+			}
+
+			// no active tab, set to false
+			if ( active === null || active === -1 ) {
+				active = this.tabs.length ? 0 : false;
+			}
+		}
+
+		// handle numbers: negative, out of range
+		if ( active !== false ) {
+			active = this.tabs.index( this.tabs.eq( active ) );
+			if ( active === -1 ) {
+				active = collapsible ? false : 0;
+			}
+		}
+
+		// don't allow collapsible: false and active: false
+		if ( !collapsible && active === false && this.anchors.length ) {
+			active = 0;
+		}
+
+		return active;
+	},
+
+	_getCreateEventData: function() {
+		return {
+			tab: this.active,
+			panel: !this.active.length ? $() : this._getPanelForTab( this.active )
+		};
+	},
+
+	_tabKeydown: function( event ) {
+		var focusedTab = $( this.document[0].activeElement ).closest( "li" ),
+			selectedIndex = this.tabs.index( focusedTab ),
+			goingForward = true;
+
+		if ( this._handlePageNav( event ) ) {
+			return;
+		}
+
+		switch ( event.keyCode ) {
+			case $.ui.keyCode.RIGHT:
+			case $.ui.keyCode.DOWN:
+				selectedIndex++;
+				break;
+			case $.ui.keyCode.UP:
+			case $.ui.keyCode.LEFT:
+				goingForward = false;
+				selectedIndex--;
+				break;
+			case $.ui.keyCode.END:
+				selectedIndex = this.anchors.length - 1;
+				break;
+			case $.ui.keyCode.HOME:
+				selectedIndex = 0;
+				break;
+			case $.ui.keyCode.SPACE:
+				// Activate only, no collapsing
+				event.preventDefault();
+				clearTimeout( this.activating );
+				this._activate( selectedIndex );
+				return;
+			case $.ui.keyCode.ENTER:
+				// Toggle (cancel delayed activation, allow collapsing)
+				event.preventDefault();
+				clearTimeout( this.activating );
+				// Determine if we should collapse or activate
+				this._activate( selectedIndex === this.options.active ? false : selectedIndex );
+				return;
+			default:
+				return;
+		}
+
+		// Focus the appropriate tab, based on which key was pressed
+		event.preventDefault();
+		clearTimeout( this.activating );
+		selectedIndex = this._focusNextTab( selectedIndex, goingForward );
+
+		// Navigating with control key will prevent automatic activation
+		if ( !event.ctrlKey ) {
+			// Update aria-selected immediately so that AT think the tab is already selected.
+			// Otherwise AT may confuse the user by stating that they need to activate the tab,
+			// but the tab will already be activated by the time the announcement finishes.
+			focusedTab.attr( "aria-selected", "false" );
+			this.tabs.eq( selectedIndex ).attr( "aria-selected", "true" );
+
+			this.activating = this._delay(function() {
+				this.option( "active", selectedIndex );
+			}, this.delay );
+		}
+	},
+
+	_panelKeydown: function( event ) {
+		if ( this._handlePageNav( event ) ) {
+			return;
+		}
+
+		// Ctrl+up moves focus to the current tab
+		if ( event.ctrlKey && event.keyCode === $.ui.keyCode.UP ) {
+			event.preventDefault();
+			this.active.focus();
+		}
+	},
+
+	// Alt+page up/down moves focus to the previous/next tab (and activates)
+	_handlePageNav: function( event ) {
+		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_UP ) {
+			this._activate( this._focusNextTab( this.options.active - 1, false ) );
+			return true;
+		}
+		if ( event.altKey && event.keyCode === $.ui.keyCode.PAGE_DOWN ) {
+			this._activate( this._focusNextTab( this.options.active + 1, true ) );
+			return true;
+		}
+	},
+
+	_findNextTab: function( index, goingForward ) {
+		var lastTabIndex = this.tabs.length - 1;
+
+		function constrain() {
+			if ( index > lastTabIndex ) {
+				index = 0;
+			}
+			if ( index < 0 ) {
+				index = lastTabIndex;
+			}
+			return index;
+		}
+
+		while ( $.inArray( constrain(), this.options.disabled ) !== -1 ) {
+			index = goingForward ? index + 1 : index - 1;
+		}
+
+		return index;
+	},
+
+	_focusNextTab: function( index, goingForward ) {
+		index = this._findNextTab( index, goingForward );
+		this.tabs.eq( index ).focus();
+		return index;
+	},
+
+	_setOption: function( key, value ) {
+		if ( key === "active" ) {
+			// _activate() will handle invalid values and update this.options
+			this._activate( value );
+			return;
+		}
+
+		if ( key === "disabled" ) {
+			// don't use the widget factory's disabled handling
+			this._setupDisabled( value );
+			return;
+		}
+
+		this._super( key, value);
+
+		if ( key === "collapsible" ) {
+			this.element.toggleClass( "ui-tabs-collapsible", value );
+			// Setting collapsible: false while collapsed; open first panel
+			if ( !value && this.options.active === false ) {
+				this._activate( 0 );
+			}
+		}
+
+		if ( key === "event" ) {
+			this._setupEvents( value );
+		}
+
+		if ( key === "heightStyle" ) {
+			this._setupHeightStyle( value );
+		}
+	},
+
+	_tabId: function( tab ) {
+		return tab.attr( "aria-controls" ) || "ui-tabs-" + getNextTabId();
+	},
+
+	_sanitizeSelector: function( hash ) {
+		return hash ? hash.replace( /[!"$%&'()*+,.\/:;<=>?@\[\]\^`{|}~]/g, "\\$&" ) : "";
+	},
+
+	refresh: function() {
+		var options = this.options,
+			lis = this.tablist.children( ":has(a[href])" );
+
+		// get disabled tabs from class attribute from HTML
+		// this will get converted to a boolean if needed in _refresh()
+		options.disabled = $.map( lis.filter( ".ui-state-disabled" ), function( tab ) {
+			return lis.index( tab );
+		});
+
+		this._processTabs();
+
+		// was collapsed or no tabs
+		if ( options.active === false || !this.anchors.length ) {
+			options.active = false;
+			this.active = $();
+		// was active, but active tab is gone
+		} else if ( this.active.length && !$.contains( this.tablist[ 0 ], this.active[ 0 ] ) ) {
+			// all remaining tabs are disabled
+			if ( this.tabs.length === options.disabled.length ) {
+				options.active = false;
+				this.active = $();
+			// activate previous tab
+			} else {
+				this._activate( this._findNextTab( Math.max( 0, options.active - 1 ), false ) );
+			}
+		// was active, active tab still exists
+		} else {
+			// make sure active index is correct
+			options.active = this.tabs.index( this.active );
+		}
+
+		this._refresh();
+	},
+
+	_refresh: function() {
+		this._setupDisabled( this.options.disabled );
+		this._setupEvents( this.options.event );
+		this._setupHeightStyle( this.options.heightStyle );
+
+		this.tabs.not( this.active ).attr({
+			"aria-selected": "false",
+			tabIndex: -1
+		});
+		this.panels.not( this._getPanelForTab( this.active ) )
+			.hide()
+			.attr({
+				"aria-expanded": "false",
+				"aria-hidden": "true"
+			});
+
+		// Make sure one tab is in the tab order
+		if ( !this.active.length ) {
+			this.tabs.eq( 0 ).attr( "tabIndex", 0 );
+		} else {
+			this.active
+				.addClass( "ui-tabs-active ui-state-active" )
+				.attr({
+					"aria-selected": "true",
+					tabIndex: 0
+				});
+			this._getPanelForTab( this.active )
+				.show()
+				.attr({
+					"aria-expanded": "true",
+					"aria-hidden": "false"
+				});
+		}
+	},
+
+	_processTabs: function() {
+		var that = this;
+
+		this.tablist = this._getList()
+			.addClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+			.attr( "role", "tablist" );
+
+		this.tabs = this.tablist.find( "> li:has(a[href])" )
+			.addClass( "ui-state-default ui-corner-top" )
+			.attr({
+				role: "tab",
+				tabIndex: -1
+			});
+
+		this.anchors = this.tabs.map(function() {
+				return $( "a", this )[ 0 ];
+			})
+			.addClass( "ui-tabs-anchor" )
+			.attr({
+				role: "presentation",
+				tabIndex: -1
+			});
+
+		this.panels = $();
+
+		this.anchors.each(function( i, anchor ) {
+			var selector, panel, panelId,
+				anchorId = $( anchor ).uniqueId().attr( "id" ),
+				tab = $( anchor ).closest( "li" ),
+				originalAriaControls = tab.attr( "aria-controls" );
+
+			// inline tab
+			if ( isLocal( anchor ) ) {
+				selector = anchor.hash;
+				panel = that.element.find( that._sanitizeSelector( selector ) );
+			// remote tab
+			} else {
+				panelId = that._tabId( tab );
+				selector = "#" + panelId;
+				panel = that.element.find( selector );
+				if ( !panel.length ) {
+					panel = that._createPanel( panelId );
+					panel.insertAfter( that.panels[ i - 1 ] || that.tablist );
+				}
+				panel.attr( "aria-live", "polite" );
+			}
+
+			if ( panel.length) {
+				that.panels = that.panels.add( panel );
+			}
+			if ( originalAriaControls ) {
+				tab.data( "ui-tabs-aria-controls", originalAriaControls );
+			}
+			tab.attr({
+				"aria-controls": selector.substring( 1 ),
+				"aria-labelledby": anchorId
+			});
+			panel.attr( "aria-labelledby", anchorId );
+		});
+
+		this.panels
+			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+			.attr( "role", "tabpanel" );
+	},
+
+	// allow overriding how to find the list for rare usage scenarios (#7715)
+	_getList: function() {
+		return this.element.find( "ol,ul" ).eq( 0 );
+	},
+
+	_createPanel: function( id ) {
+		return $( "<div>" )
+			.attr( "id", id )
+			.addClass( "ui-tabs-panel ui-widget-content ui-corner-bottom" )
+			.data( "ui-tabs-destroy", true );
+	},
+
+	_setupDisabled: function( disabled ) {
+		if ( $.isArray( disabled ) ) {
+			if ( !disabled.length ) {
+				disabled = false;
+			} else if ( disabled.length === this.anchors.length ) {
+				disabled = true;
+			}
+		}
+
+		// disable tabs
+		for ( var i = 0, li; ( li = this.tabs[ i ] ); i++ ) {
+			if ( disabled === true || $.inArray( i, disabled ) !== -1 ) {
+				$( li )
+					.addClass( "ui-state-disabled" )
+					.attr( "aria-disabled", "true" );
+			} else {
+				$( li )
+					.removeClass( "ui-state-disabled" )
+					.removeAttr( "aria-disabled" );
+			}
+		}
+
+		this.options.disabled = disabled;
+	},
+
+	_setupEvents: function( event ) {
+		var events = {
+			click: function( event ) {
+				event.preventDefault();
+			}
+		};
+		if ( event ) {
+			$.each( event.split(" "), function( index, eventName ) {
+				events[ eventName ] = "_eventHandler";
+			});
+		}
+
+		this._off( this.anchors.add( this.tabs ).add( this.panels ) );
+		this._on( this.anchors, events );
+		this._on( this.tabs, { keydown: "_tabKeydown" } );
+		this._on( this.panels, { keydown: "_panelKeydown" } );
+
+		this._focusable( this.tabs );
+		this._hoverable( this.tabs );
+	},
+
+	_setupHeightStyle: function( heightStyle ) {
+		var maxHeight,
+			parent = this.element.parent();
+
+		if ( heightStyle === "fill" ) {
+			maxHeight = parent.height();
+			maxHeight -= this.element.outerHeight() - this.element.height();
+
+			this.element.siblings( ":visible" ).each(function() {
+				var elem = $( this ),
+					position = elem.css( "position" );
+
+				if ( position === "absolute" || position === "fixed" ) {
+					return;
+				}
+				maxHeight -= elem.outerHeight( true );
+			});
+
+			this.element.children().not( this.panels ).each(function() {
+				maxHeight -= $( this ).outerHeight( true );
+			});
+
+			this.panels.each(function() {
+				$( this ).height( Math.max( 0, maxHeight -
+					$( this ).innerHeight() + $( this ).height() ) );
+			})
+			.css( "overflow", "auto" );
+		} else if ( heightStyle === "auto" ) {
+			maxHeight = 0;
+			this.panels.each(function() {
+				maxHeight = Math.max( maxHeight, $( this ).height( "" ).height() );
+			}).height( maxHeight );
+		}
+	},
+
+	_eventHandler: function( event ) {
+		var options = this.options,
+			active = this.active,
+			anchor = $( event.currentTarget ),
+			tab = anchor.closest( "li" ),
+			clickedIsActive = tab[ 0 ] === active[ 0 ],
+			collapsing = clickedIsActive && options.collapsible,
+			toShow = collapsing ? $() : this._getPanelForTab( tab ),
+			toHide = !active.length ? $() : this._getPanelForTab( active ),
+			eventData = {
+				oldTab: active,
+				oldPanel: toHide,
+				newTab: collapsing ? $() : tab,
+				newPanel: toShow
+			};
+
+		event.preventDefault();
+
+		if ( tab.hasClass( "ui-state-disabled" ) ||
+				// tab is already loading
+				tab.hasClass( "ui-tabs-loading" ) ||
+				// can't switch durning an animation
+				this.running ||
+				// click on active header, but not collapsible
+				( clickedIsActive && !options.collapsible ) ||
+				// allow canceling activation
+				( this._trigger( "beforeActivate", event, eventData ) === false ) ) {
+			return;
+		}
+
+		options.active = collapsing ? false : this.tabs.index( tab );
+
+		this.active = clickedIsActive ? $() : tab;
+		if ( this.xhr ) {
+			this.xhr.abort();
+		}
+
+		if ( !toHide.length && !toShow.length ) {
+			$.error( "jQuery UI Tabs: Mismatching fragment identifier." );
+		}
+
+		if ( toShow.length ) {
+			this.load( this.tabs.index( tab ), event );
+		}
+		this._toggle( event, eventData );
+	},
+
+	// handles show/hide for selecting tabs
+	_toggle: function( event, eventData ) {
+		var that = this,
+			toShow = eventData.newPanel,
+			toHide = eventData.oldPanel;
+
+		this.running = true;
+
+		function complete() {
+			that.running = false;
+			that._trigger( "activate", event, eventData );
+		}
+
+		function show() {
+			eventData.newTab.closest( "li" ).addClass( "ui-tabs-active ui-state-active" );
+
+			if ( toShow.length && that.options.show ) {
+				that._show( toShow, that.options.show, complete );
+			} else {
+				toShow.show();
+				complete();
+			}
+		}
+
+		// start out by hiding, then showing, then completing
+		if ( toHide.length && this.options.hide ) {
+			this._hide( toHide, this.options.hide, function() {
+				eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+				show();
+			});
+		} else {
+			eventData.oldTab.closest( "li" ).removeClass( "ui-tabs-active ui-state-active" );
+			toHide.hide();
+			show();
+		}
+
+		toHide.attr({
+			"aria-expanded": "false",
+			"aria-hidden": "true"
+		});
+		eventData.oldTab.attr( "aria-selected", "false" );
+		// If we're switching tabs, remove the old tab from the tab order.
+		// If we're opening from collapsed state, remove the previous tab from the tab order.
+		// If we're collapsing, then keep the collapsing tab in the tab order.
+		if ( toShow.length && toHide.length ) {
+			eventData.oldTab.attr( "tabIndex", -1 );
+		} else if ( toShow.length ) {
+			this.tabs.filter(function() {
+				return $( this ).attr( "tabIndex" ) === 0;
+			})
+			.attr( "tabIndex", -1 );
+		}
+
+		toShow.attr({
+			"aria-expanded": "true",
+			"aria-hidden": "false"
+		});
+		eventData.newTab.attr({
+			"aria-selected": "true",
+			tabIndex: 0
+		});
+	},
+
+	_activate: function( index ) {
+		var anchor,
+			active = this._findActive( index );
+
+		// trying to activate the already active panel
+		if ( active[ 0 ] === this.active[ 0 ] ) {
+			return;
+		}
+
+		// trying to collapse, simulate a click on the current active header
+		if ( !active.length ) {
+			active = this.active;
+		}
+
+		anchor = active.find( ".ui-tabs-anchor" )[ 0 ];
+		this._eventHandler({
+			target: anchor,
+			currentTarget: anchor,
+			preventDefault: $.noop
+		});
+	},
+
+	_findActive: function( index ) {
+		return index === false ? $() : this.tabs.eq( index );
+	},
+
+	_getIndex: function( index ) {
+		// meta-function to give users option to provide a href string instead of a numerical index.
+		if ( typeof index === "string" ) {
+			index = this.anchors.index( this.anchors.filter( "[href$='" + index + "']" ) );
+		}
+
+		return index;
+	},
+
+	_destroy: function() {
+		if ( this.xhr ) {
+			this.xhr.abort();
+		}
+
+		this.element.removeClass( "ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible" );
+
+		this.tablist
+			.removeClass( "ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all" )
+			.removeAttr( "role" );
+
+		this.anchors
+			.removeClass( "ui-tabs-anchor" )
+			.removeAttr( "role" )
+			.removeAttr( "tabIndex" )
+			.removeUniqueId();
+
+		this.tabs.add( this.panels ).each(function() {
+			if ( $.data( this, "ui-tabs-destroy" ) ) {
+				$( this ).remove();
+			} else {
+				$( this )
+					.removeClass( "ui-state-default ui-state-active ui-state-disabled " +
+						"ui-corner-top ui-corner-bottom ui-widget-content ui-tabs-active ui-tabs-panel" )
+					.removeAttr( "tabIndex" )
+					.removeAttr( "aria-live" )
+					.removeAttr( "aria-busy" )
+					.removeAttr( "aria-selected" )
+					.removeAttr( "aria-labelledby" )
+					.removeAttr( "aria-hidden" )
+					.removeAttr( "aria-expanded" )
+					.removeAttr( "role" );
+			}
+		});
+
+		this.tabs.each(function() {
+			var li = $( this ),
+				prev = li.data( "ui-tabs-aria-controls" );
+			if ( prev ) {
+				li
+					.attr( "aria-controls", prev )
+					.removeData( "ui-tabs-aria-controls" );
+			} else {
+				li.removeAttr( "aria-controls" );
+			}
+		});
+
+		this.panels.show();
+
+		if ( this.options.heightStyle !== "content" ) {
+			this.panels.css( "height", "" );
+		}
+	},
+
+	enable: function( index ) {
+		var disabled = this.options.disabled;
+		if ( disabled === false ) {
+			return;
+		}
+
+		if ( index === undefined ) {
+			disabled = false;
+		} else {
+			index = this._getIndex( index );
+			if ( $.isArray( disabled ) ) {
+				disabled = $.map( disabled, function( num ) {
+					return num !== index ? num : null;
+				});
+			} else {
+				disabled = $.map( this.tabs, function( li, num ) {
+					return num !== index ? num : null;
+				});
+			}
+		}
+		this._setupDisabled( disabled );
+	},
+
+	disable: function( index ) {
+		var disabled = this.options.disabled;
+		if ( disabled === true ) {
+			return;
+		}
+
+		if ( index === undefined ) {
+			disabled = true;
+		} else {
+			index = this._getIndex( index );
+			if ( $.inArray( index, disabled ) !== -1 ) {
+				return;
+			}
+			if ( $.isArray( disabled ) ) {
+				disabled = $.merge( [ index ], disabled ).sort();
+			} else {
+				disabled = [ index ];
+			}
+		}
+		this._setupDisabled( disabled );
+	},
+
+	load: function( index, event ) {
+		index = this._getIndex( index );
+		var that = this,
+			tab = this.tabs.eq( index ),
+			anchor = tab.find( ".ui-tabs-anchor" ),
+			panel = this._getPanelForTab( tab ),
+			eventData = {
+				tab: tab,
+				panel: panel
+			};
+
+		// not remote
+		if ( isLocal( anchor[ 0 ] ) ) {
+			return;
+		}
+
+		this.xhr = $.ajax( this._ajaxSettings( anchor, event, eventData ) );
+
+		// support: jQuery <1.8
+		// jQuery <1.8 returns false if the request is canceled in beforeSend,
+		// but as of 1.8, $.ajax() always returns a jqXHR object.
+		if ( this.xhr && this.xhr.statusText !== "canceled" ) {
+			tab.addClass( "ui-tabs-loading" );
+			panel.attr( "aria-busy", "true" );
+
+			this.xhr
+				.success(function( response ) {
+					// support: jQuery <1.8
+					// http://bugs.jquery.com/ticket/11778
+					setTimeout(function() {
+						panel.html( response );
+						that._trigger( "load", event, eventData );
+					}, 1 );
+				})
+				.complete(function( jqXHR, status ) {
+					// support: jQuery <1.8
+					// http://bugs.jquery.com/ticket/11778
+					setTimeout(function() {
+						if ( status === "abort" ) {
+							that.panels.stop( false, true );
+						}
+
+						tab.removeClass( "ui-tabs-loading" );
+						panel.removeAttr( "aria-busy" );
+
+						if ( jqXHR === that.xhr ) {
+							delete that.xhr;
+						}
+					}, 1 );
+				});
+		}
+	},
+
+	_ajaxSettings: function( anchor, event, eventData ) {
+		var that = this;
+		return {
+			url: anchor.attr( "href" ),
+			beforeSend: function( jqXHR, settings ) {
+				return that._trigger( "beforeLoad", event,
+					$.extend( { jqXHR : jqXHR, ajaxSettings: settings }, eventData ) );
+			}
+		};
+	},
+
+	_getPanelForTab: function( tab ) {
+		var id = $( tab ).attr( "aria-controls" );
+		return this.element.find( this._sanitizeSelector( "#" + id ) );
+	}
+});
+
+})( jQuery );
+
+(function( $, undefined ) {
+
+})( jQuery );
+
+(function( $, window ) {
+
+	$.mobile.iosorientationfixEnabled = true;
+
+	// This fix addresses an iOS bug, so return early if the UA claims it's something else.
+	var ua = navigator.userAgent,
+		zoom,
+		evt, x, y, z, aig;
+	if ( !( /iPhone|iPad|iPod/.test( navigator.platform ) && /OS [1-5]_[0-9_]* like Mac OS X/i.test( ua ) && ua.indexOf( "AppleWebKit" ) > -1 ) ) {
+		$.mobile.iosorientationfixEnabled = false;
+		return;
+	}
+
+	zoom = $.mobile.zoom;
+
+	function checkTilt( e ) {
+		evt = e.originalEvent;
+		aig = evt.accelerationIncludingGravity;
+
+		x = Math.abs( aig.x );
+		y = Math.abs( aig.y );
+		z = Math.abs( aig.z );
+
+		// If portrait orientation and in one of the danger zones
+		if ( !window.orientation && ( x > 7 || ( ( z > 6 && y < 8 || z < 8 && y > 6 ) && x > 5 ) ) ) {
+				if ( zoom.enabled ) {
+					zoom.disable();
+				}
+		}	else if ( !zoom.enabled ) {
+				zoom.enable();
+		}
+	}
+
+	$.mobile.document.on( "mobileinit", function() {
+		if ( $.mobile.iosorientationfixEnabled ) {
+			$.mobile.window
+				.bind( "orientationchange.iosorientationfix", zoom.enable )
+				.bind( "devicemotion.iosorientationfix", checkTilt );
+		}
+	});
+
+}( jQuery, this ));
+
+(function( $, window, undefined ) {
+	var	$html = $( "html" ),
+		$window = $.mobile.window;
+
+	//remove initial build class (only present on first pageshow)
+	function hideRenderingClass() {
+		$html.removeClass( "ui-mobile-rendering" );
+	}
+
+	// trigger mobileinit event - useful hook for configuring $.mobile settings before they're used
+	$( window.document ).trigger( "mobileinit" );
+
+	// support conditions
+	// if device support condition(s) aren't met, leave things as they are -> a basic, usable experience,
+	// otherwise, proceed with the enhancements
+	if ( !$.mobile.gradeA() ) {
+		return;
+	}
+
+	// override ajaxEnabled on platforms that have known conflicts with hash history updates
+	// or generally work better browsing in regular http for full page refreshes (BB5, Opera Mini)
+	if ( $.mobile.ajaxBlacklist ) {
+		$.mobile.ajaxEnabled = false;
+	}
+
+	// Add mobile, initial load "rendering" classes to docEl
+	$html.addClass( "ui-mobile ui-mobile-rendering" );
+
+	// This is a fallback. If anything goes wrong (JS errors, etc), or events don't fire,
+	// this ensures the rendering class is removed after 5 seconds, so content is visible and accessible
+	setTimeout( hideRenderingClass, 5000 );
+
+	$.extend( $.mobile, {
+		// find and enhance the pages in the dom and transition to the first page.
+		initializePage: function() {
+			// find present pages
+			var path = $.mobile.path,
+				$pages = $( ":jqmData(role='page'), :jqmData(role='dialog')" ),
+				hash = path.stripHash( path.stripQueryParams(path.parseLocation().hash) ),
+				hashPage = document.getElementById( hash );
+
+			// if no pages are found, create one with body's inner html
+			if ( !$pages.length ) {
+				$pages = $( "body" ).wrapInner( "<div data-" + $.mobile.ns + "role='page'></div>" ).children( 0 );
+			}
+
+			// add dialogs, set data-url attrs
+			$pages.each(function() {
+				var $this = $( this );
+
+				// unless the data url is already set set it to the pathname
+				if ( !$this[ 0 ].getAttribute( "data-" + $.mobile.ns + "url" ) ) {
+					$this.attr( "data-" + $.mobile.ns + "url", $this.attr( "id" ) || location.pathname + location.search );
+				}
+			});
+
+			// define first page in dom case one backs out to the directory root (not always the first page visited, but defined as fallback)
+			$.mobile.firstPage = $pages.first();
+
+			// define page container
+			$.mobile.pageContainer = $.mobile.firstPage
+				.parent()
+				.addClass( "ui-mobile-viewport" )
+				.pagecontainer();
+
+			// initialize navigation events now, after mobileinit has occurred and the page container
+			// has been created but before the rest of the library is alerted to that fact
+			$.mobile.navreadyDeferred.resolve();
+
+			// alert listeners that the pagecontainer has been determined for binding
+			// to events triggered on it
+			$window.trigger( "pagecontainercreate" );
+
+			// cue page loading message
+			$.mobile.loading( "show" );
+
+			//remove initial build class (only present on first pageshow)
+			hideRenderingClass();
+
+			// if hashchange listening is disabled, there's no hash deeplink,
+			// the hash is not valid (contains more than one # or does not start with #)
+			// or there is no page with that hash, change to the first page in the DOM
+			// Remember, however, that the hash can also be a path!
+			if ( ! ( $.mobile.hashListeningEnabled &&
+				$.mobile.path.isHashValid( location.hash ) &&
+				( $( hashPage ).is( ":jqmData(role='page')" ) ||
+					$.mobile.path.isPath( hash ) ||
+					hash === $.mobile.dialogHashKey ) ) ) {
+
+				// Store the initial destination
+				if ( $.mobile.path.isHashValid( location.hash ) ) {
+					$.mobile.navigate.history.initialDst = hash.replace( "#", "" );
+				}
+
+				// make sure to set initial popstate state if it exists
+				// so that navigation back to the initial page works properly
+				if ( $.event.special.navigate.isPushStateEnabled() ) {
+					$.mobile.navigate.navigator.squash( path.parseLocation().href );
+				}
+
+				$.mobile.changePage( $.mobile.firstPage, {
+					transition: "none",
+					reverse: true,
+					changeHash: false,
+					fromHashChange: true
+				});
+			} else {
+				// trigger hashchange or navigate to squash and record the correct
+				// history entry for an initial hash path
+				if ( !$.event.special.navigate.isPushStateEnabled() ) {
+					$window.trigger( "hashchange", [true] );
+				} else {
+					// TODO figure out how to simplify this interaction with the initial history entry
+					// at the bottom js/navigate/navigate.js
+					$.mobile.navigate.history.stack = [];
+					$.mobile.navigate( $.mobile.path.isPath( location.hash ) ? location.hash : location.href );
+				}
+			}
+		}
+	});
+
+	$(function() {
+		//Run inlineSVG support test
+		$.support.inlineSVG();
+
+		// check which scrollTop value should be used by scrolling to 1 immediately at domready
+		// then check what the scroll top is. Android will report 0... others 1
+		// note that this initial scroll won't hide the address bar. It's just for the check.
+
+		// hide iOS browser chrome on load if hideUrlBar is true this is to try and do it as soon as possible
+		if ( $.mobile.hideUrlBar ) {
+			window.scrollTo( 0, 1 );
+		}
+
+		// if defaultHomeScroll hasn't been set yet, see if scrollTop is 1
+		// it should be 1 in most browsers, but android treats 1 as 0 (for hiding addr bar)
+		// so if it's 1, use 0 from now on
+		$.mobile.defaultHomeScroll = ( !$.support.scrollTop || $.mobile.window.scrollTop() === 1 ) ? 0 : 1;
+
+		//dom-ready inits
+		if ( $.mobile.autoInitializePage ) {
+			$.mobile.initializePage();
+		}
+
+		// window load event
+		// hide iOS browser chrome on load if hideUrlBar is true this is as fall back incase we were too early before
+		if ( $.mobile.hideUrlBar ) {
+			$window.load( $.mobile.silentScroll );
+		}
+
+		if ( !$.support.cssPointerEvents ) {
+			// IE and Opera don't support CSS pointer-events: none that we use to disable link-based buttons
+			// by adding the 'ui-disabled' class to them. Using a JavaScript workaround for those browser.
+			// https://github.com/jquery/jquery-mobile/issues/3558
+
+			// DEPRECATED as of 1.4.0 - remove ui-disabled after 1.4.0 release
+			// only ui-state-disabled should be present thereafter
+			$.mobile.document.delegate( ".ui-state-disabled,.ui-disabled", "vclick",
+				function( e ) {
+					e.preventDefault();
+					e.stopImmediatePropagation();
+				}
+			);
+		}
+	});
+}( jQuery, this ));
+
+
+}));
new file mode 100644
index 0000000000000000000000000000000000000000..e1a98e1580e465b08ca547ee1466977eb084ef0a
GIT binary patch
literal 2388049
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
LYdB|R?8pBHgU_N9
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/frameworks/mootools-1.4.js
@@ -0,0 +1,6447 @@
+/*
+---
+MooTools: the javascript framework
+
+web build:
+ - http://mootools.net/core/76bf47062d6c1983d66ce47ad66aa0e0
+
+packager build:
+ - packager build Core/Core Core/Array Core/String Core/Number Core/Function Core/Object Core/Event Core/Browser Core/Class Core/Class.Extras Core/Slick.Parser Core/Slick.Finder Core/Element Core/Element.Style Core/Element.Event Core/Element.Delegation Core/Element.Dimensions Core/Fx Core/Fx.CSS Core/Fx.Tween Core/Fx.Morph Core/Fx.Transitions Core/Request Core/Request.HTML Core/Request.JSON Core/Cookie Core/JSON Core/DOMReady Core/Swiff
+
+...
+*/
+
+/*
+---
+
+name: Core
+
+description: The heart of MooTools.
+
+license: MIT-style license.
+
+copyright: Copyright (c) 2006-2012 [Valerio Proietti](http://mad4milk.net/).
+
+authors: The MooTools production team (http://mootools.net/developers/)
+
+inspiration:
+  - Class implementation inspired by [Base.js](http://dean.edwards.name/weblog/2006/03/base/) Copyright (c) 2006 Dean Edwards, [GNU Lesser General Public License](http://opensource.org/licenses/lgpl-license.php)
+  - Some functionality inspired by [Prototype.js](http://prototypejs.org) Copyright (c) 2005-2007 Sam Stephenson, [MIT License](http://opensource.org/licenses/mit-license.php)
+
+provides: [Core, MooTools, Type, typeOf, instanceOf, Native]
+
+...
+*/
+
+(function(){
+
+this.MooTools = {
+	version: '1.4.5',
+	build: 'ab8ea8824dc3b24b6666867a2c4ed58ebb762cf0'
+};
+
+// typeOf, instanceOf
+
+var typeOf = this.typeOf = function(item){
+	if (item == null) return 'null';
+	if (item.$family != null) return item.$family();
+
+	if (item.nodeName){
+		if (item.nodeType == 1) return 'element';
+		if (item.nodeType == 3) return (/\S/).test(item.nodeValue) ? 'textnode' : 'whitespace';
+	} else if (typeof item.length == 'number'){
+		if (item.callee) return 'arguments';
+		if ('item' in item) return 'collection';
+	}
+
+	return typeof item;
+};
+
+var instanceOf = this.instanceOf = function(item, object){
+	if (item == null) return false;
+	var constructor = item.$constructor || item.constructor;
+	while (constructor){
+		if (constructor === object) return true;
+		constructor = constructor.parent;
+	}
+	/*<ltIE8>*/
+	if (!item.hasOwnProperty) return false;
+	/*</ltIE8>*/
+	return item instanceof object;
+};
+
+// Function overloading
+
+var Function = this.Function;
+
+var enumerables = true;
+for (var i in {toString: 1}) enumerables = null;
+if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];
+
+Function.prototype.overloadSetter = function(usePlural){
+	var self = this;
+	return function(a, b){
+		if (a == null) return this;
+		if (usePlural || typeof a != 'string'){
+			for (var k in a) self.call(this, k, a[k]);
+			if (enumerables) for (var i = enumerables.length; i--;){
+				k = enumerables[i];
+				if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
+			}
+		} else {
+			self.call(this, a, b);
+		}
+		return this;
+	};
+};
+
+Function.prototype.overloadGetter = function(usePlural){
+	var self = this;
+	return function(a){
+		var args, result;
+		if (typeof a != 'string') args = a;
+		else if (arguments.length > 1) args = arguments;
+		else if (usePlural) args = [a];
+		if (args){
+			result = {};
+			for (var i = 0; i < args.length; i++) result[args[i]] = self.call(this, args[i]);
+		} else {
+			result = self.call(this, a);
+		}
+		return result;
+	};
+};
+
+Function.prototype.extend = function(key, value){
+	this[key] = value;
+}.overloadSetter();
+
+Function.prototype.implement = function(key, value){
+	this.prototype[key] = value;
+}.overloadSetter();
+
+// From
+
+var slice = Array.prototype.slice;
+
+Function.from = function(item){
+	return (typeOf(item) == 'function') ? item : function(){
+		return item;
+	};
+};
+
+Array.from = function(item){
+	if (item == null) return [];
+	return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
+};
+
+Number.from = function(item){
+	var number = parseFloat(item);
+	return isFinite(number) ? number : null;
+};
+
+String.from = function(item){
+	return item + '';
+};
+
+// hide, protect
+
+Function.implement({
+
+	hide: function(){
+		this.$hidden = true;
+		return this;
+	},
+
+	protect: function(){
+		this.$protected = true;
+		return this;
+	}
+
+});
+
+// Type
+
+var Type = this.Type = function(name, object){
+	if (name){
+		var lower = name.toLowerCase();
+		var typeCheck = function(item){
+			return (typeOf(item) == lower);
+		};
+
+		Type['is' + name] = typeCheck;
+		if (object != null){
+			object.prototype.$family = (function(){
+				return lower;
+			}).hide();
+			//<1.2compat>
+			object.type = typeCheck;
+			//</1.2compat>
+		}
+	}
+
+	if (object == null) return null;
+
+	object.extend(this);
+	object.$constructor = Type;
+	object.prototype.$constructor = object;
+
+	return object;
+};
+
+var toString = Object.prototype.toString;
+
+Type.isEnumerable = function(item){
+	return (item != null && typeof item.length == 'number' && toString.call(item) != '[object Function]' );
+};
+
+var hooks = {};
+
+var hooksOf = function(object){
+	var type = typeOf(object.prototype);
+	return hooks[type] || (hooks[type] = []);
+};
+
+var implement = function(name, method){
+	if (method && method.$hidden) return;
+
+	var hooks = hooksOf(this);
+
+	for (var i = 0; i < hooks.length; i++){
+		var hook = hooks[i];
+		if (typeOf(hook) == 'type') implement.call(hook, name, method);
+		else hook.call(this, name, method);
+	}
+
+	var previous = this.prototype[name];
+	if (previous == null || !previous.$protected) this.prototype[name] = method;
+
+	if (this[name] == null && typeOf(method) == 'function') extend.call(this, name, function(item){
+		return method.apply(item, slice.call(arguments, 1));
+	});
+};
+
+var extend = function(name, method){
+	if (method && method.$hidden) return;
+	var previous = this[name];
+	if (previous == null || !previous.$protected) this[name] = method;
+};
+
+Type.implement({
+
+	implement: implement.overloadSetter(),
+
+	extend: extend.overloadSetter(),
+
+	alias: function(name, existing){
+		implement.call(this, name, this.prototype[existing]);
+	}.overloadSetter(),
+
+	mirror: function(hook){
+		hooksOf(this).push(hook);
+		return this;
+	}
+
+});
+
+new Type('Type', Type);
+
+// Default Types
+
+var force = function(name, object, methods){
+	var isType = (object != Object),
+		prototype = object.prototype;
+
+	if (isType) object = new Type(name, object);
+
+	for (var i = 0, l = methods.length; i < l; i++){
+		var key = methods[i],
+			generic = object[key],
+			proto = prototype[key];
+
+		if (generic) generic.protect();
+		if (isType && proto) object.implement(key, proto.protect());
+	}
+
+	if (isType){
+		var methodsEnumerable = prototype.propertyIsEnumerable(methods[0]);
+		object.forEachMethod = function(fn){
+			if (!methodsEnumerable) for (var i = 0, l = methods.length; i < l; i++){
+				fn.call(prototype, prototype[methods[i]], methods[i]);
+			}
+			for (var key in prototype) fn.call(prototype, prototype[key], key)
+		};
+	}
+
+	return force;
+};
+
+force('String', String, [
+	'charAt', 'charCodeAt', 'concat', 'indexOf', 'lastIndexOf', 'match', 'quote', 'replace', 'search',
+	'slice', 'split', 'substr', 'substring', 'trim', 'toLowerCase', 'toUpperCase'
+])('Array', Array, [
+	'pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice',
+	'indexOf', 'lastIndexOf', 'filter', 'forEach', 'every', 'map', 'some', 'reduce', 'reduceRight'
+])('Number', Number, [
+	'toExponential', 'toFixed', 'toLocaleString', 'toPrecision'
+])('Function', Function, [
+	'apply', 'call', 'bind'
+])('RegExp', RegExp, [
+	'exec', 'test'
+])('Object', Object, [
+	'create', 'defineProperty', 'defineProperties', 'keys',
+	'getPrototypeOf', 'getOwnPropertyDescriptor', 'getOwnPropertyNames',
+	'preventExtensions', 'isExtensible', 'seal', 'isSealed', 'freeze', 'isFrozen'
+])('Date', Date, ['now']);
+
+Object.extend = extend.overloadSetter();
+
+Date.extend('now', function(){
+	return +(new Date);
+});
+
+new Type('Boolean', Boolean);
+
+// fixes NaN returning as Number
+
+Number.prototype.$family = function(){
+	return isFinite(this) ? 'number' : 'null';
+}.hide();
+
+// Number.random
+
+Number.extend('random', function(min, max){
+	return Math.floor(Math.random() * (max - min + 1) + min);
+});
+
+// forEach, each
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+Object.extend('forEach', function(object, fn, bind){
+	for (var key in object){
+		if (hasOwnProperty.call(object, key)) fn.call(bind, object[key], key, object);
+	}
+});
+
+Object.each = Object.forEach;
+
+Array.implement({
+
+	forEach: function(fn, bind){
+		for (var i = 0, l = this.length; i < l; i++){
+			if (i in this) fn.call(bind, this[i], i, this);
+		}
+	},
+
+	each: function(fn, bind){
+		Array.forEach(this, fn, bind);
+		return this;
+	}
+
+});
+
+// Array & Object cloning, Object merging and appending
+
+var cloneOf = function(item){
+	switch (typeOf(item)){
+		case 'array': return item.clone();
+		case 'object': return Object.clone(item);
+		default: return item;
+	}
+};
+
+Array.implement('clone', function(){
+	var i = this.length, clone = new Array(i);
+	while (i--) clone[i] = cloneOf(this[i]);
+	return clone;
+});
+
+var mergeOne = function(source, key, current){
+	switch (typeOf(current)){
+		case 'object':
+			if (typeOf(source[key]) == 'object') Object.merge(source[key], current);
+			else source[key] = Object.clone(current);
+		break;
+		case 'array': source[key] = current.clone(); break;
+		default: source[key] = current;
+	}
+	return source;
+};
+
+Object.extend({
+
+	merge: function(source, k, v){
+		if (typeOf(k) == 'string') return mergeOne(source, k, v);
+		for (var i = 1, l = arguments.length; i < l; i++){
+			var object = arguments[i];
+			for (var key in object) mergeOne(source, key, object[key]);
+		}
+		return source;
+	},
+
+	clone: function(object){
+		var clone = {};
+		for (var key in object) clone[key] = cloneOf(object[key]);
+		return clone;
+	},
+
+	append: function(original){
+		for (var i = 1, l = arguments.length; i < l; i++){
+			var extended = arguments[i] || {};
+			for (var key in extended) original[key] = extended[key];
+		}
+		return original;
+	}
+
+});
+
+// Object-less types
+
+['Object', 'WhiteSpace', 'TextNode', 'Collection', 'Arguments'].each(function(name){
+	new Type(name);
+});
+
+// Unique ID
+
+var UID = Date.now();
+
+String.extend('uniqueID', function(){
+	return (UID++).toString(36);
+});
+
+//<1.2compat>
+
+var Hash = this.Hash = new Type('Hash', function(object){
+	if (typeOf(object) == 'hash') object = Object.clone(object.getClean());
+	for (var key in object) this[key] = object[key];
+	return this;
+});
+
+Hash.implement({
+
+	forEach: function(fn, bind){
+		Object.forEach(this, fn, bind);
+	},
+
+	getClean: function(){
+		var clean = {};
+		for (var key in this){
+			if (this.hasOwnProperty(key)) clean[key] = this[key];
+		}
+		return clean;
+	},
+
+	getLength: function(){
+		var length = 0;
+		for (var key in this){
+			if (this.hasOwnProperty(key)) length++;
+		}
+		return length;
+	}
+
+});
+
+Hash.alias('each', 'forEach');
+
+Object.type = Type.isObject;
+
+var Native = this.Native = function(properties){
+	return new Type(properties.name, properties.initialize);
+};
+
+Native.type = Type.type;
+
+Native.implement = function(objects, methods){
+	for (var i = 0; i < objects.length; i++) objects[i].implement(methods);
+	return Native;
+};
+
+var arrayType = Array.type;
+Array.type = function(item){
+	return instanceOf(item, Array) || arrayType(item);
+};
+
+this.$A = function(item){
+	return Array.from(item).slice();
+};
+
+this.$arguments = function(i){
+	return function(){
+		return arguments[i];
+	};
+};
+
+this.$chk = function(obj){
+	return !!(obj || obj === 0);
+};
+
+this.$clear = function(timer){
+	clearTimeout(timer);
+	clearInterval(timer);
+	return null;
+};
+
+this.$defined = function(obj){
+	return (obj != null);
+};
+
+this.$each = function(iterable, fn, bind){
+	var type = typeOf(iterable);
+	((type == 'arguments' || type == 'collection' || type == 'array' || type == 'elements') ? Array : Object).each(iterable, fn, bind);
+};
+
+this.$empty = function(){};
+
+this.$extend = function(original, extended){
+	return Object.append(original, extended);
+};
+
+this.$H = function(object){
+	return new Hash(object);
+};
+
+this.$merge = function(){
+	var args = Array.slice(arguments);
+	args.unshift({});
+	return Object.merge.apply(null, args);
+};
+
+this.$lambda = Function.from;
+this.$mixin = Object.merge;
+this.$random = Number.random;
+this.$splat = Array.from;
+this.$time = Date.now;
+
+this.$type = function(object){
+	var type = typeOf(object);
+	if (type == 'elements') return 'array';
+	return (type == 'null') ? false : type;
+};
+
+this.$unlink = function(object){
+	switch (typeOf(object)){
+		case 'object': return Object.clone(object);
+		case 'array': return Array.clone(object);
+		case 'hash': return new Hash(object);
+		default: return object;
+	}
+};
+
+//</1.2compat>
+
+})();
+
+
+/*
+---
+
+name: Array
+
+description: Contains Array Prototypes like each, contains, and erase.
+
+license: MIT-style license.
+
+requires: Type
+
+provides: Array
+
+...
+*/
+
+Array.implement({
+
+	/*<!ES5>*/
+	every: function(fn, bind){
+		for (var i = 0, l = this.length >>> 0; i < l; i++){
+			if ((i in this) && !fn.call(bind, this[i], i, this)) return false;
+		}
+		return true;
+	},
+
+	filter: function(fn, bind){
+		var results = [];
+		for (var value, i = 0, l = this.length >>> 0; i < l; i++) if (i in this){
+			value = this[i];
+			if (fn.call(bind, value, i, this)) results.push(value);
+		}
+		return results;
+	},
+
+	indexOf: function(item, from){
+		var length = this.length >>> 0;
+		for (var i = (from < 0) ? Math.max(0, length + from) : from || 0; i < length; i++){
+			if (this[i] === item) return i;
+		}
+		return -1;
+	},
+
+	map: function(fn, bind){
+		var length = this.length >>> 0, results = Array(length);
+		for (var i = 0; i < length; i++){
+			if (i in this) results[i] = fn.call(bind, this[i], i, this);
+		}
+		return results;
+	},
+
+	some: function(fn, bind){
+		for (var i = 0, l = this.length >>> 0; i < l; i++){
+			if ((i in this) && fn.call(bind, this[i], i, this)) return true;
+		}
+		return false;
+	},
+	/*</!ES5>*/
+
+	clean: function(){
+		return this.filter(function(item){
+			return item != null;
+		});
+	},
+
+	invoke: function(methodName){
+		var args = Array.slice(arguments, 1);
+		return this.map(function(item){
+			return item[methodName].apply(item, args);
+		});
+	},
+
+	associate: function(keys){
+		var obj = {}, length = Math.min(this.length, keys.length);
+		for (var i = 0; i < length; i++) obj[keys[i]] = this[i];
+		return obj;
+	},
+
+	link: function(object){
+		var result = {};
+		for (var i = 0, l = this.length; i < l; i++){
+			for (var key in object){
+				if (object[key](this[i])){
+					result[key] = this[i];
+					delete object[key];
+					break;
+				}
+			}
+		}
+		return result;
+	},
+
+	contains: function(item, from){
+		return this.indexOf(item, from) != -1;
+	},
+
+	append: function(array){
+		this.push.apply(this, array);
+		return this;
+	},
+
+	getLast: function(){
+		return (this.length) ? this[this.length - 1] : null;
+	},
+
+	getRandom: function(){
+		return (this.length) ? this[Number.random(0, this.length - 1)] : null;
+	},
+
+	include: function(item){
+		if (!this.contains(item)) this.push(item);
+		return this;
+	},
+
+	combine: function(array){
+		for (var i = 0, l = array.length; i < l; i++) this.include(array[i]);
+		return this;
+	},
+
+	erase: function(item){
+		for (var i = this.length; i--;){
+			if (this[i] === item) this.splice(i, 1);
+		}
+		return this;
+	},
+
+	empty: function(){
+		this.length = 0;
+		return this;
+	},
+
+	flatten: function(){
+		var array = [];
+		for (var i = 0, l = this.length; i < l; i++){
+			var type = typeOf(this[i]);
+			if (type == 'null') continue;
+			array = array.concat((type == 'array' || type == 'collection' || type == 'arguments' || instanceOf(this[i], Array)) ? Array.flatten(this[i]) : this[i]);
+		}
+		return array;
+	},
+
+	pick: function(){
+		for (var i = 0, l = this.length; i < l; i++){
+			if (this[i] != null) return this[i];
+		}
+		return null;
+	},
+
+	hexToRgb: function(array){
+		if (this.length != 3) return null;
+		var rgb = this.map(function(value){
+			if (value.length == 1) value += value;
+			return value.toInt(16);
+		});
+		return (array) ? rgb : 'rgb(' + rgb + ')';
+	},
+
+	rgbToHex: function(array){
+		if (this.length < 3) return null;
+		if (this.length == 4 && this[3] == 0 && !array) return 'transparent';
+		var hex = [];
+		for (var i = 0; i < 3; i++){
+			var bit = (this[i] - 0).toString(16);
+			hex.push((bit.length == 1) ? '0' + bit : bit);
+		}
+		return (array) ? hex : '#' + hex.join('');
+	}
+
+});
+
+//<1.2compat>
+
+Array.alias('extend', 'append');
+
+var $pick = function(){
+	return Array.from(arguments).pick();
+};
+
+//</1.2compat>
+
+
+/*
+---
+
+name: String
+
+description: Contains String Prototypes like camelCase, capitalize, test, and toInt.
+
+license: MIT-style license.
+
+requires: Type
+
+provides: String
+
+...
+*/
+
+String.implement({
+
+	test: function(regex, params){
+		return ((typeOf(regex) == 'regexp') ? regex : new RegExp('' + regex, params)).test(this);
+	},
+
+	contains: function(string, separator){
+		return (separator) ? (separator + this + separator).indexOf(separator + string + separator) > -1 : String(this).indexOf(string) > -1;
+	},
+
+	trim: function(){
+		return String(this).replace(/^\s+|\s+$/g, '');
+	},
+
+	clean: function(){
+		return String(this).replace(/\s+/g, ' ').trim();
+	},
+
+	camelCase: function(){
+		return String(this).replace(/-\D/g, function(match){
+			return match.charAt(1).toUpperCase();
+		});
+	},
+
+	hyphenate: function(){
+		return String(this).replace(/[A-Z]/g, function(match){
+			return ('-' + match.charAt(0).toLowerCase());
+		});
+	},
+
+	capitalize: function(){
+		return String(this).replace(/\b[a-z]/g, function(match){
+			return match.toUpperCase();
+		});
+	},
+
+	escapeRegExp: function(){
+		return String(this).replace(/([-.*+?^${}()|[\]\/\\])/g, '\\$1');
+	},
+
+	toInt: function(base){
+		return parseInt(this, base || 10);
+	},
+
+	toFloat: function(){
+		return parseFloat(this);
+	},
+
+	hexToRgb: function(array){
+		var hex = String(this).match(/^#?(\w{1,2})(\w{1,2})(\w{1,2})$/);
+		return (hex) ? hex.slice(1).hexToRgb(array) : null;
+	},
+
+	rgbToHex: function(array){
+		var rgb = String(this).match(/\d{1,3}/g);
+		return (rgb) ? rgb.rgbToHex(array) : null;
+	},
+
+	substitute: function(object, regexp){
+		return String(this).replace(regexp || (/\\?\{([^{}]+)\}/g), function(match, name){
+			if (match.charAt(0) == '\\') return match.slice(1);
+			return (object[name] != null) ? object[name] : '';
+		});
+	}
+
+});
+
+
+/*
+---
+
+name: Number
+
+description: Contains Number Prototypes like limit, round, times, and ceil.
+
+license: MIT-style license.
+
+requires: Type
+
+provides: Number
+
+...
+*/
+
+Number.implement({
+
+	limit: function(min, max){
+		return Math.min(max, Math.max(min, this));
+	},
+
+	round: function(precision){
+		precision = Math.pow(10, precision || 0).toFixed(precision < 0 ? -precision : 0);
+		return Math.round(this * precision) / precision;
+	},
+
+	times: function(fn, bind){
+		for (var i = 0; i < this; i++) fn.call(bind, i, this);
+	},
+
+	toFloat: function(){
+		return parseFloat(this);
+	},
+
+	toInt: function(base){
+		return parseInt(this, base || 10);
+	}
+
+});
+
+Number.alias('each', 'times');
+
+(function(math){
+	var methods = {};
+	math.each(function(name){
+		if (!Number[name]) methods[name] = function(){
+			return Math[name].apply(null, [this].concat(Array.from(arguments)));
+		};
+	});
+	Number.implement(methods);
+})(['abs', 'acos', 'asin', 'atan', 'atan2', 'ceil', 'cos', 'exp', 'floor', 'log', 'max', 'min', 'pow', 'sin', 'sqrt', 'tan']);
+
+
+/*
+---
+
+name: Function
+
+description: Contains Function Prototypes like create, bind, pass, and delay.
+
+license: MIT-style license.
+
+requires: Type
+
+provides: Function
+
+...
+*/
+
+Function.extend({
+
+	attempt: function(){
+		for (var i = 0, l = arguments.length; i < l; i++){
+			try {
+				return arguments[i]();
+			} catch (e){}
+		}
+		return null;
+	}
+
+});
+
+Function.implement({
+
+	attempt: function(args, bind){
+		try {
+			return this.apply(bind, Array.from(args));
+		} catch (e){}
+
+		return null;
+	},
+
+	/*<!ES5-bind>*/
+	bind: function(that){
+		var self = this,
+			args = arguments.length > 1 ? Array.slice(arguments, 1) : null,
+			F = function(){};
+
+		var bound = function(){
+			var context = that, length = arguments.length;
+			if (this instanceof bound){
+				F.prototype = self.prototype;
+				context = new F;
+			}
+			var result = (!args && !length)
+				? self.call(context)
+				: self.apply(context, args && length ? args.concat(Array.slice(arguments)) : args || arguments);
+			return context == that ? result : context;
+		};
+		return bound;
+	},
+	/*</!ES5-bind>*/
+
+	pass: function(args, bind){
+		var self = this;
+		if (args != null) args = Array.from(args);
+		return function(){
+			return self.apply(bind, args || arguments);
+		};
+	},
+
+	delay: function(delay, bind, args){
+		return setTimeout(this.pass((args == null ? [] : args), bind), delay);
+	},
+
+	periodical: function(periodical, bind, args){
+		return setInterval(this.pass((args == null ? [] : args), bind), periodical);
+	}
+
+});
+
+//<1.2compat>
+
+delete Function.prototype.bind;
+
+Function.implement({
+
+	create: function(options){
+		var self = this;
+		options = options || {};
+		return function(event){
+			var args = options.arguments;
+			args = (args != null) ? Array.from(args) : Array.slice(arguments, (options.event) ? 1 : 0);
+			if (options.event) args = [event || window.event].extend(args);
+			var returns = function(){
+				return self.apply(options.bind || null, args);
+			};
+			if (options.delay) return setTimeout(returns, options.delay);
+			if (options.periodical) return setInterval(returns, options.periodical);
+			if (options.attempt) return Function.attempt(returns);
+			return returns();
+		};
+	},
+
+	bind: function(bind, args){
+		var self = this;
+		if (args != null) args = Array.from(args);
+		return function(){
+			return self.apply(bind, args || arguments);
+		};
+	},
+
+	bindWithEvent: function(bind, args){
+		var self = this;
+		if (args != null) args = Array.from(args);
+		return function(event){
+			return self.apply(bind, (args == null) ? arguments : [event].concat(args));
+		};
+	},
+
+	run: function(args, bind){
+		return this.apply(bind, Array.from(args));
+	}
+
+});
+
+if (Object.create == Function.prototype.create) Object.create = null;
+
+var $try = Function.attempt;
+
+//</1.2compat>
+
+
+/*
+---
+
+name: Object
+
+description: Object generic methods
+
+license: MIT-style license.
+
+requires: Type
+
+provides: [Object, Hash]
+
+...
+*/
+
+(function(){
+
+var hasOwnProperty = Object.prototype.hasOwnProperty;
+
+Object.extend({
+
+	subset: function(object, keys){
+		var results = {};
+		for (var i = 0, l = keys.length; i < l; i++){
+			var k = keys[i];
+			if (k in object) results[k] = object[k];
+		}
+		return results;
+	},
+
+	map: function(object, fn, bind){
+		var results = {};
+		for (var key in object){
+			if (hasOwnProperty.call(object, key)) results[key] = fn.call(bind, object[key], key, object);
+		}
+		return results;
+	},
+
+	filter: function(object, fn, bind){
+		var results = {};
+		for (var key in object){
+			var value = object[key];
+			if (hasOwnProperty.call(object, key) && fn.call(bind, value, key, object)) results[key] = value;
+		}
+		return results;
+	},
+
+	every: function(object, fn, bind){
+		for (var key in object){
+			if (hasOwnProperty.call(object, key) && !fn.call(bind, object[key], key)) return false;
+		}
+		return true;
+	},
+
+	some: function(object, fn, bind){
+		for (var key in object){
+			if (hasOwnProperty.call(object, key) && fn.call(bind, object[key], key)) return true;
+		}
+		return false;
+	},
+
+	keys: function(object){
+		var keys = [];
+		for (var key in object){
+			if (hasOwnProperty.call(object, key)) keys.push(key);
+		}
+		return keys;
+	},
+
+	values: function(object){
+		var values = [];
+		for (var key in object){
+			if (hasOwnProperty.call(object, key)) values.push(object[key]);
+		}
+		return values;
+	},
+
+	getLength: function(object){
+		return Object.keys(object).length;
+	},
+
+	keyOf: function(object, value){
+		for (var key in object){
+			if (hasOwnProperty.call(object, key) && object[key] === value) return key;
+		}
+		return null;
+	},
+
+	contains: function(object, value){
+		return Object.keyOf(object, value) != null;
+	},
+
+	toQueryString: function(object, base){
+		var queryString = [];
+
+		Object.each(object, function(value, key){
+			if (base) key = base + '[' + key + ']';
+			var result;
+			switch (typeOf(value)){
+				case 'object': result = Object.toQueryString(value, key); break;
+				case 'array':
+					var qs = {};
+					value.each(function(val, i){
+						qs[i] = val;
+					});
+					result = Object.toQueryString(qs, key);
+				break;
+				default: result = key + '=' + encodeURIComponent(value);
+			}
+			if (value != null) queryString.push(result);
+		});
+
+		return queryString.join('&');
+	}
+
+});
+
+})();
+
+//<1.2compat>
+
+Hash.implement({
+
+	has: Object.prototype.hasOwnProperty,
+
+	keyOf: function(value){
+		return Object.keyOf(this, value);
+	},
+
+	hasValue: function(value){
+		return Object.contains(this, value);
+	},
+
+	extend: function(properties){
+		Hash.each(properties || {}, function(value, key){
+			Hash.set(this, key, value);
+		}, this);
+		return this;
+	},
+
+	combine: function(properties){
+		Hash.each(properties || {}, function(value, key){
+			Hash.include(this, key, value);
+		}, this);
+		return this;
+	},
+
+	erase: function(key){
+		if (this.hasOwnProperty(key)) delete this[key];
+		return this;
+	},
+
+	get: function(key){
+		return (this.hasOwnProperty(key)) ? this[key] : null;
+	},
+
+	set: function(key, value){
+		if (!this[key] || this.hasOwnProperty(key)) this[key] = value;
+		return this;
+	},
+
+	empty: function(){
+		Hash.each(this, function(value, key){
+			delete this[key];
+		}, this);
+		return this;
+	},
+
+	include: function(key, value){
+		if (this[key] == null) this[key] = value;
+		return this;
+	},
+
+	map: function(fn, bind){
+		return new Hash(Object.map(this, fn, bind));
+	},
+
+	filter: function(fn, bind){
+		return new Hash(Object.filter(this, fn, bind));
+	},
+
+	every: function(fn, bind){
+		return Object.every(this, fn, bind);
+	},
+
+	some: function(fn, bind){
+		return Object.some(this, fn, bind);
+	},
+
+	getKeys: function(){
+		return Object.keys(this);
+	},
+
+	getValues: function(){
+		return Object.values(this);
+	},
+
+	toQueryString: function(base){
+		return Object.toQueryString(this, base);
+	}
+
+});
+
+Hash.extend = Object.append;
+
+Hash.alias({indexOf: 'keyOf', contains: 'hasValue'});
+
+//</1.2compat>
+
+
+/*
+---
+
+name: Browser
+
+description: The Browser Object. Contains Browser initialization, Window and Document, and the Browser Hash.
+
+license: MIT-style license.
+
+requires: [Array, Function, Number, String]
+
+provides: [Browser, Window, Document]
+
+...
+*/
+
+(function(){
+
+var document = this.document;
+var window = document.window = this;
+
+var ua = navigator.userAgent.toLowerCase(),
+	platform = navigator.platform.toLowerCase(),
+	UA = ua.match(/(opera|ie|firefox|chrome|version)[\s\/:]([\w\d\.]+)?.*?(safari|version[\s\/:]([\w\d\.]+)|$)/) || [null, 'unknown', 0],
+	mode = UA[1] == 'ie' && document.documentMode;
+
+var Browser = this.Browser = {
+
+	extend: Function.prototype.extend,
+
+	name: (UA[1] == 'version') ? UA[3] : UA[1],
+
+	version: mode || parseFloat((UA[1] == 'opera' && UA[4]) ? UA[4] : UA[2]),
+
+	Platform: {
+		name: ua.match(/ip(?:ad|od|hone)/) ? 'ios' : (ua.match(/(?:webos|android)/) || platform.match(/mac|win|linux/) || ['other'])[0]
+	},
+
+	Features: {
+		xpath: !!(document.evaluate),
+		air: !!(window.runtime),
+		query: !!(document.querySelector),
+		json: !!(window.JSON)
+	},
+
+	Plugins: {}
+
+};
+
+Browser[Browser.name] = true;
+Browser[Browser.name + parseInt(Browser.version, 10)] = true;
+Browser.Platform[Browser.Platform.name] = true;
+
+// Request
+
+Browser.Request = (function(){
+
+	var XMLHTTP = function(){
+		return new XMLHttpRequest();
+	};
+
+	var MSXML2 = function(){
+		return new ActiveXObject('MSXML2.XMLHTTP');
+	};
+
+	var MSXML = function(){
+		return new ActiveXObject('Microsoft.XMLHTTP');
+	};
+
+	return Function.attempt(function(){
+		XMLHTTP();
+		return XMLHTTP;
+	}, function(){
+		MSXML2();
+		return MSXML2;
+	}, function(){
+		MSXML();
+		return MSXML;
+	});
+
+})();
+
+Browser.Features.xhr = !!(Browser.Request);
+
+// Flash detection
+
+var version = (Function.attempt(function(){
+	return navigator.plugins['Shockwave Flash'].description;
+}, function(){
+	return new ActiveXObject('ShockwaveFlash.ShockwaveFlash').GetVariable('$version');
+}) || '0 r0').match(/\d+/g);
+
+Browser.Plugins.Flash = {
+	version: Number(version[0] || '0.' + version[1]) || 0,
+	build: Number(version[2]) || 0
+};
+
+// String scripts
+
+Browser.exec = function(text){
+	if (!text) return text;
+	if (window.execScript){
+		window.execScript(text);
+	} else {
+		var script = document.createElement('script');
+		script.setAttribute('type', 'text/javascript');
+		script.text = text;
+		document.head.appendChild(script);
+		document.head.removeChild(script);
+	}
+	return text;
+};
+
+String.implement('stripScripts', function(exec){
+	var scripts = '';
+	var text = this.replace(/<script[^>]*>([\s\S]*?)<\/script>/gi, function(all, code){
+		scripts += code + '\n';
+		return '';
+	});
+	if (exec === true) Browser.exec(scripts);
+	else if (typeOf(exec) == 'function') exec(scripts, text);
+	return text;
+});
+
+// Window, Document
+
+Browser.extend({
+	Document: this.Document,
+	Window: this.Window,
+	Element: this.Element,
+	Event: this.Event
+});
+
+this.Window = this.$constructor = new Type('Window', function(){});
+
+this.$family = Function.from('window').hide();
+
+Window.mirror(function(name, method){
+	window[name] = method;
+});
+
+this.Document = document.$constructor = new Type('Document', function(){});
+
+document.$family = Function.from('document').hide();
+
+Document.mirror(function(name, method){
+	document[name] = method;
+});
+
+document.html = document.documentElement;
+if (!document.head) document.head = document.getElementsByTagName('head')[0];
+
+if (document.execCommand) try {
+	document.execCommand("BackgroundImageCache", false, true);
+} catch (e){}
+
+/*<ltIE9>*/
+if (this.attachEvent && !this.addEventListener){
+	var unloadEvent = function(){
+		this.detachEvent('onunload', unloadEvent);
+		document.head = document.html = document.window = null;
+	};
+	this.attachEvent('onunload', unloadEvent);
+}
+
+// IE fails on collections and <select>.options (refers to <select>)
+var arrayFrom = Array.from;
+try {
+	arrayFrom(document.html.childNodes);
+} catch(e){
+	Array.from = function(item){
+		if (typeof item != 'string' && Type.isEnumerable(item) && typeOf(item) != 'array'){
+			var i = item.length, array = new Array(i);
+			while (i--) array[i] = item[i];
+			return array;
+		}
+		return arrayFrom(item);
+	};
+
+	var prototype = Array.prototype,
+		slice = prototype.slice;
+	['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift', 'concat', 'join', 'slice'].each(function(name){
+		var method = prototype[name];
+		Array[name] = function(item){
+			return method.apply(Array.from(item), slice.call(arguments, 1));
+		};
+	});
+}
+/*</ltIE9>*/
+
+//<1.2compat>
+
+if (Browser.Platform.ios) Browser.Platform.ipod = true;
+
+Browser.Engine = {};
+
+var setEngine = function(name, version){
+	Browser.Engine.name = name;
+	Browser.Engine[name + version] = true;
+	Browser.Engine.version = version;
+};
+
+if (Browser.ie){
+	Browser.Engine.trident = true;
+
+	switch (Browser.version){
+		case 6: setEngine('trident', 4); break;
+		case 7: setEngine('trident', 5); break;
+		case 8: setEngine('trident', 6);
+	}
+}
+
+if (Browser.firefox){
+	Browser.Engine.gecko = true;
+
+	if (Browser.version >= 3) setEngine('gecko', 19);
+	else setEngine('gecko', 18);
+}
+
+if (Browser.safari || Browser.chrome){
+	Browser.Engine.webkit = true;
+
+	switch (Browser.version){
+		case 2: setEngine('webkit', 419); break;
+		case 3: setEngine('webkit', 420); break;
+		case 4: setEngine('webkit', 525);
+	}
+}
+
+if (Browser.opera){
+	Browser.Engine.presto = true;
+
+	if (Browser.version >= 9.6) setEngine('presto', 960);
+	else if (Browser.version >= 9.5) setEngine('presto', 950);
+	else setEngine('presto', 925);
+}
+
+if (Browser.name == 'unknown'){
+	switch ((ua.match(/(?:webkit|khtml|gecko)/) || [])[0]){
+		case 'webkit':
+		case 'khtml':
+			Browser.Engine.webkit = true;
+		break;
+		case 'gecko':
+			Browser.Engine.gecko = true;
+	}
+}
+
+this.$exec = Browser.exec;
+
+//</1.2compat>
+
+})();
+
+
+/*
+---
+
+name: Event
+
+description: Contains the Event Type, to make the event object cross-browser.
+
+license: MIT-style license.
+
+requires: [Window, Document, Array, Function, String, Object]
+
+provides: Event
+
+...
+*/
+
+(function() {
+
+var _keys = {};
+
+var DOMEvent = this.DOMEvent = new Type('DOMEvent', function(event, win){
+	if (!win) win = window;
+	event = event || win.event;
+	if (event.$extended) return event;
+	this.event = event;
+	this.$extended = true;
+	this.shift = event.shiftKey;
+	this.control = event.ctrlKey;
+	this.alt = event.altKey;
+	this.meta = event.metaKey;
+	var type = this.type = event.type;
+	var target = event.target || event.srcElement;
+	while (target && target.nodeType == 3) target = target.parentNode;
+	this.target = document.id(target);
+
+	if (type.indexOf('key') == 0){
+		var code = this.code = (event.which || event.keyCode);
+		this.key = _keys[code]/*<1.3compat>*/ || Object.keyOf(Event.Keys, code)/*</1.3compat>*/;
+		if (type == 'keydown'){
+			if (code > 111 && code < 124) this.key = 'f' + (code - 111);
+			else if (code > 95 && code < 106) this.key = code - 96;
+		}
+		if (this.key == null) this.key = String.fromCharCode(code).toLowerCase();
+	} else if (type == 'click' || type == 'dblclick' || type == 'contextmenu' || type == 'DOMMouseScroll' || type.indexOf('mouse') == 0){
+		var doc = win.document;
+		doc = (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
+		this.page = {
+			x: (event.pageX != null) ? event.pageX : event.clientX + doc.scrollLeft,
+			y: (event.pageY != null) ? event.pageY : event.clientY + doc.scrollTop
+		};
+		this.client = {
+			x: (event.pageX != null) ? event.pageX - win.pageXOffset : event.clientX,
+			y: (event.pageY != null) ? event.pageY - win.pageYOffset : event.clientY
+		};
+		if (type == 'DOMMouseScroll' || type == 'mousewheel')
+			this.wheel = (event.wheelDelta) ? event.wheelDelta / 120 : -(event.detail || 0) / 3;
+
+		this.rightClick = (event.which == 3 || event.button == 2);
+		if (type == 'mouseover' || type == 'mouseout'){
+			var related = event.relatedTarget || event[(type == 'mouseover' ? 'from' : 'to') + 'Element'];
+			while (related && related.nodeType == 3) related = related.parentNode;
+			this.relatedTarget = document.id(related);
+		}
+	} else if (type.indexOf('touch') == 0 || type.indexOf('gesture') == 0){
+		this.rotation = event.rotation;
+		this.scale = event.scale;
+		this.targetTouches = event.targetTouches;
+		this.changedTouches = event.changedTouches;
+		var touches = this.touches = event.touches;
+		if (touches && touches[0]){
+			var touch = touches[0];
+			this.page = {x: touch.pageX, y: touch.pageY};
+			this.client = {x: touch.clientX, y: touch.clientY};
+		}
+	}
+
+	if (!this.client) this.client = {};
+	if (!this.page) this.page = {};
+});
+
+DOMEvent.implement({
+
+	stop: function(){
+		return this.preventDefault().stopPropagation();
+	},
+
+	stopPropagation: function(){
+		if (this.event.stopPropagation) this.event.stopPropagation();
+		else this.event.cancelBubble = true;
+		return this;
+	},
+
+	preventDefault: function(){
+		if (this.event.preventDefault) this.event.preventDefault();
+		else this.event.returnValue = false;
+		return this;
+	}
+
+});
+
+DOMEvent.defineKey = function(code, key){
+	_keys[code] = key;
+	return this;
+};
+
+DOMEvent.defineKeys = DOMEvent.defineKey.overloadSetter(true);
+
+DOMEvent.defineKeys({
+	'38': 'up', '40': 'down', '37': 'left', '39': 'right',
+	'27': 'esc', '32': 'space', '8': 'backspace', '9': 'tab',
+	'46': 'delete', '13': 'enter'
+});
+
+})();
+
+/*<1.3compat>*/
+var Event = DOMEvent;
+Event.Keys = {};
+/*</1.3compat>*/
+
+/*<1.2compat>*/
+
+Event.Keys = new Hash(Event.Keys);
+
+/*</1.2compat>*/
+
+
+/*
+---
+
+name: Class
+
+description: Contains the Class Function for easily creating, extending, and implementing reusable Classes.
+
+license: MIT-style license.
+
+requires: [Array, String, Function, Number]
+
+provides: Class
+
+...
+*/
+
+(function(){
+
+var Class = this.Class = new Type('Class', function(params){
+	if (instanceOf(params, Function)) params = {initialize: params};
+
+	var newClass = function(){
+		reset(this);
+		if (newClass.$prototyping) return this;
+		this.$caller = null;
+		var value = (this.initialize) ? this.initialize.apply(this, arguments) : this;
+		this.$caller = this.caller = null;
+		return value;
+	}.extend(this).implement(params);
+
+	newClass.$constructor = Class;
+	newClass.prototype.$constructor = newClass;
+	newClass.prototype.parent = parent;
+
+	return newClass;
+});
+
+var parent = function(){
+	if (!this.$caller) throw new Error('The method "parent" cannot be called.');
+	var name = this.$caller.$name,
+		parent = this.$caller.$owner.parent,
+		previous = (parent) ? parent.prototype[name] : null;
+	if (!previous) throw new Error('The method "' + name + '" has no parent.');
+	return previous.apply(this, arguments);
+};
+
+var reset = function(object){
+	for (var key in object){
+		var value = object[key];
+		switch (typeOf(value)){
+			case 'object':
+				var F = function(){};
+				F.prototype = value;
+				object[key] = reset(new F);
+			break;
+			case 'array': object[key] = value.clone(); break;
+		}
+	}
+	return object;
+};
+
+var wrap = function(self, key, method){
+	if (method.$origin) method = method.$origin;
+	var wrapper = function(){
+		if (method.$protected && this.$caller == null) throw new Error('The method "' + key + '" cannot be called.');
+		var caller = this.caller, current = this.$caller;
+		this.caller = current; this.$caller = wrapper;
+		var result = method.apply(this, arguments);
+		this.$caller = current; this.caller = caller;
+		return result;
+	}.extend({$owner: self, $origin: method, $name: key});
+	return wrapper;
+};
+
+var implement = function(key, value, retain){
+	if (Class.Mutators.hasOwnProperty(key)){
+		value = Class.Mutators[key].call(this, value);
+		if (value == null) return this;
+	}
+
+	if (typeOf(value) == 'function'){
+		if (value.$hidden) return this;
+		this.prototype[key] = (retain) ? value : wrap(this, key, value);
+	} else {
+		Object.merge(this.prototype, key, value);
+	}
+
+	return this;
+};
+
+var getInstance = function(klass){
+	klass.$prototyping = true;
+	var proto = new klass;
+	delete klass.$prototyping;
+	return proto;
+};
+
+Class.implement('implement', implement.overloadSetter());
+
+Class.Mutators = {
+
+	Extends: function(parent){
+		this.parent = parent;
+		this.prototype = getInstance(parent);
+	},
+
+	Implements: function(items){
+		Array.from(items).each(function(item){
+			var instance = new item;
+			for (var key in instance) implement.call(this, key, instance[key], true);
+		}, this);
+	}
+};
+
+})();
+
+
+/*
+---
+
+name: Class.Extras
+
+description: Contains Utility Classes that can be implemented into your own Classes to ease the execution of many common tasks.
+
+license: MIT-style license.
+
+requires: Class
+
+provides: [Class.Extras, Chain, Events, Options]
+
+...
+*/
+
+(function(){
+
+this.Chain = new Class({
+
+	$chain: [],
+
+	chain: function(){
+		this.$chain.append(Array.flatten(arguments));
+		return this;
+	},
+
+	callChain: function(){
+		return (this.$chain.length) ? this.$chain.shift().apply(this, arguments) : false;
+	},
+
+	clearChain: function(){
+		this.$chain.empty();
+		return this;
+	}
+
+});
+
+var removeOn = function(string){
+	return string.replace(/^on([A-Z])/, function(full, first){
+		return first.toLowerCase();
+	});
+};
+
+this.Events = new Class({
+
+	$events: {},
+
+	addEvent: function(type, fn, internal){
+		type = removeOn(type);
+
+		/*<1.2compat>*/
+		if (fn == $empty) return this;
+		/*</1.2compat>*/
+
+		this.$events[type] = (this.$events[type] || []).include(fn);
+		if (internal) fn.internal = true;
+		return this;
+	},
+
+	addEvents: function(events){
+		for (var type in events) this.addEvent(type, events[type]);
+		return this;
+	},
+
+	fireEvent: function(type, args, delay){
+		type = removeOn(type);
+		var events = this.$events[type];
+		if (!events) return this;
+		args = Array.from(args);
+		events.each(function(fn){
+			if (delay) fn.delay(delay, this, args);
+			else fn.apply(this, args);
+		}, this);
+		return this;
+	},
+
+	removeEvent: function(type, fn){
+		type = removeOn(type);
+		var events = this.$events[type];
+		if (events && !fn.internal){
+			var index =  events.indexOf(fn);
+			if (index != -1) delete events[index];
+		}
+		return this;
+	},
+
+	removeEvents: function(events){
+		var type;
+		if (typeOf(events) == 'object'){
+			for (type in events) this.removeEvent(type, events[type]);
+			return this;
+		}
+		if (events) events = removeOn(events);
+		for (type in this.$events){
+			if (events && events != type) continue;
+			var fns = this.$events[type];
+			for (var i = fns.length; i--;) if (i in fns){
+				this.removeEvent(type, fns[i]);
+			}
+		}
+		return this;
+	}
+
+});
+
+this.Options = new Class({
+
+	setOptions: function(){
+		var options = this.options = Object.merge.apply(null, [{}, this.options].append(arguments));
+		if (this.addEvent) for (var option in options){
+			if (typeOf(options[option]) != 'function' || !(/^on[A-Z]/).test(option)) continue;
+			this.addEvent(option, options[option]);
+			delete options[option];
+		}
+		return this;
+	}
+
+});
+
+})();
+
+
+/*
+---
+name: Slick.Parser
+description: Standalone CSS3 Selector parser
+provides: Slick.Parser
+...
+*/
+
+;(function(){
+
+var parsed,
+	separatorIndex,
+	combinatorIndex,
+	reversed,
+	cache = {},
+	reverseCache = {},
+	reUnescape = /\\/g;
+
+var parse = function(expression, isReversed){
+	if (expression == null) return null;
+	if (expression.Slick === true) return expression;
+	expression = ('' + expression).replace(/^\s+|\s+$/g, '');
+	reversed = !!isReversed;
+	var currentCache = (reversed) ? reverseCache : cache;
+	if (currentCache[expression]) return currentCache[expression];
+	parsed = {
+		Slick: true,
+		expressions: [],
+		raw: expression,
+		reverse: function(){
+			return parse(this.raw, true);
+		}
+	};
+	separatorIndex = -1;
+	while (expression != (expression = expression.replace(regexp, parser)));
+	parsed.length = parsed.expressions.length;
+	return currentCache[parsed.raw] = (reversed) ? reverse(parsed) : parsed;
+};
+
+var reverseCombinator = function(combinator){
+	if (combinator === '!') return ' ';
+	else if (combinator === ' ') return '!';
+	else if ((/^!/).test(combinator)) return combinator.replace(/^!/, '');
+	else return '!' + combinator;
+};
+
+var reverse = function(expression){
+	var expressions = expression.expressions;
+	for (var i = 0; i < expressions.length; i++){
+		var exp = expressions[i];
+		var last = {parts: [], tag: '*', combinator: reverseCombinator(exp[0].combinator)};
+
+		for (var j = 0; j < exp.length; j++){
+			var cexp = exp[j];
+			if (!cexp.reverseCombinator) cexp.reverseCombinator = ' ';
+			cexp.combinator = cexp.reverseCombinator;
+			delete cexp.reverseCombinator;
+		}
+
+		exp.reverse().push(last);
+	}
+	return expression;
+};
+
+var escapeRegExp = function(string){// Credit: XRegExp 0.6.1 (c) 2007-2008 Steven Levithan <http://stevenlevithan.com/regex/xregexp/> MIT License
+	return string.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, function(match){
+		return '\\' + match;
+	});
+};
+
+var regexp = new RegExp(
+/*
+#!/usr/bin/env ruby
+puts "\t\t" + DATA.read.gsub(/\(\?x\)|\s+#.*$|\s+|\\$|\\n/,'')
+__END__
+	"(?x)^(?:\
+	  \\s* ( , ) \\s*               # Separator          \n\
+	| \\s* ( <combinator>+ ) \\s*   # Combinator         \n\
+	|      ( \\s+ )                 # CombinatorChildren \n\
+	|      ( <unicode>+ | \\* )     # Tag                \n\
+	| \\#  ( <unicode>+       )     # ID                 \n\
+	| \\.  ( <unicode>+       )     # ClassName          \n\
+	|                               # Attribute          \n\
+	\\[  \
+		\\s* (<unicode1>+)  (?:  \
+			\\s* ([*^$!~|]?=)  (?:  \
+				\\s* (?:\
+					([\"']?)(.*?)\\9 \
+				)\
+			)  \
+		)?  \\s*  \
+	\\](?!\\]) \n\
+	|   :+ ( <unicode>+ )(?:\
+	\\( (?:\
+		(?:([\"'])([^\\12]*)\\12)|((?:\\([^)]+\\)|[^()]*)+)\
+	) \\)\
+	)?\
+	)"
+*/
+	"^(?:\\s*(,)\\s*|\\s*(<combinator>+)\\s*|(\\s+)|(<unicode>+|\\*)|\\#(<unicode>+)|\\.(<unicode>+)|\\[\\s*(<unicode1>+)(?:\\s*([*^$!~|]?=)(?:\\s*(?:([\"']?)(.*?)\\9)))?\\s*\\](?!\\])|(:+)(<unicode>+)(?:\\((?:(?:([\"'])([^\\13]*)\\13)|((?:\\([^)]+\\)|[^()]*)+))\\))?)"
+	.replace(/<combinator>/, '[' + escapeRegExp(">+~`!@$%^&={}\\;</") + ']')
+	.replace(/<unicode>/g, '(?:[\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
+	.replace(/<unicode1>/g, '(?:[:\\w\\u00a1-\\uFFFF-]|\\\\[^\\s0-9a-f])')
+);
+
+function parser(
+	rawMatch,
+
+	separator,
+	combinator,
+	combinatorChildren,
+
+	tagName,
+	id,
+	className,
+
+	attributeKey,
+	attributeOperator,
+	attributeQuote,
+	attributeValue,
+
+	pseudoMarker,
+	pseudoClass,
+	pseudoQuote,
+	pseudoClassQuotedValue,
+	pseudoClassValue
+){
+	if (separator || separatorIndex === -1){
+		parsed.expressions[++separatorIndex] = [];
+		combinatorIndex = -1;
+		if (separator) return '';
+	}
+
+	if (combinator || combinatorChildren || combinatorIndex === -1){
+		combinator = combinator || ' ';
+		var currentSeparator = parsed.expressions[separatorIndex];
+		if (reversed && currentSeparator[combinatorIndex])
+			currentSeparator[combinatorIndex].reverseCombinator = reverseCombinator(combinator);
+		currentSeparator[++combinatorIndex] = {combinator: combinator, tag: '*'};
+	}
+
+	var currentParsed = parsed.expressions[separatorIndex][combinatorIndex];
+
+	if (tagName){
+		currentParsed.tag = tagName.replace(reUnescape, '');
+
+	} else if (id){
+		currentParsed.id = id.replace(reUnescape, '');
+
+	} else if (className){
+		className = className.replace(reUnescape, '');
+
+		if (!currentParsed.classList) currentParsed.classList = [];
+		if (!currentParsed.classes) currentParsed.classes = [];
+		currentParsed.classList.push(className);
+		currentParsed.classes.push({
+			value: className,
+			regexp: new RegExp('(^|\\s)' + escapeRegExp(className) + '(\\s|$)')
+		});
+
+	} else if (pseudoClass){
+		pseudoClassValue = pseudoClassValue || pseudoClassQuotedValue;
+		pseudoClassValue = pseudoClassValue ? pseudoClassValue.replace(reUnescape, '') : null;
+
+		if (!currentParsed.pseudos) currentParsed.pseudos = [];
+		currentParsed.pseudos.push({
+			key: pseudoClass.replace(reUnescape, ''),
+			value: pseudoClassValue,
+			type: pseudoMarker.length == 1 ? 'class' : 'element'
+		});
+
+	} else if (attributeKey){
+		attributeKey = attributeKey.replace(reUnescape, '');
+		attributeValue = (attributeValue || '').replace(reUnescape, '');
+
+		var test, regexp;
+
+		switch (attributeOperator){
+			case '^=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue)            ); break;
+			case '$=' : regexp = new RegExp(            escapeRegExp(attributeValue) +'$'       ); break;
+			case '~=' : regexp = new RegExp( '(^|\\s)'+ escapeRegExp(attributeValue) +'(\\s|$)' ); break;
+			case '|=' : regexp = new RegExp(       '^'+ escapeRegExp(attributeValue) +'(-|$)'   ); break;
+			case  '=' : test = function(value){
+				return attributeValue == value;
+			}; break;
+			case '*=' : test = function(value){
+				return value && value.indexOf(attributeValue) > -1;
+			}; break;
+			case '!=' : test = function(value){
+				return attributeValue != value;
+			}; break;
+			default   : test = function(value){
+				return !!value;
+			};
+		}
+
+		if (attributeValue == '' && (/^[*$^]=$/).test(attributeOperator)) test = function(){
+			return false;
+		};
+
+		if (!test) test = function(value){
+			return value && regexp.test(value);
+		};
+
+		if (!currentParsed.attributes) currentParsed.attributes = [];
+		currentParsed.attributes.push({
+			key: attributeKey,
+			operator: attributeOperator,
+			value: attributeValue,
+			test: test
+		});
+
+	}
+
+	return '';
+};
+
+// Slick NS
+
+var Slick = (this.Slick || {});
+
+Slick.parse = function(expression){
+	return parse(expression);
+};
+
+Slick.escapeRegExp = escapeRegExp;
+
+if (!this.Slick) this.Slick = Slick;
+
+}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
+
+
+/*
+---
+name: Slick.Finder
+description: The new, superfast css selector engine.
+provides: Slick.Finder
+requires: Slick.Parser
+...
+*/
+
+;(function(){
+
+var local = {},
+	featuresCache = {},
+	toString = Object.prototype.toString;
+
+// Feature / Bug detection
+
+local.isNativeCode = function(fn){
+	return (/\{\s*\[native code\]\s*\}/).test('' + fn);
+};
+
+local.isXML = function(document){
+	return (!!document.xmlVersion) || (!!document.xml) || (toString.call(document) == '[object XMLDocument]') ||
+	(document.nodeType == 9 && document.documentElement.nodeName != 'HTML');
+};
+
+local.setDocument = function(document){
+
+	// convert elements / window arguments to document. if document cannot be extrapolated, the function returns.
+	var nodeType = document.nodeType;
+	if (nodeType == 9); // document
+	else if (nodeType) document = document.ownerDocument; // node
+	else if (document.navigator) document = document.document; // window
+	else return;
+
+	// check if it's the old document
+
+	if (this.document === document) return;
+	this.document = document;
+
+	// check if we have done feature detection on this document before
+
+	var root = document.documentElement,
+		rootUid = this.getUIDXML(root),
+		features = featuresCache[rootUid],
+		feature;
+
+	if (features){
+		for (feature in features){
+			this[feature] = features[feature];
+		}
+		return;
+	}
+
+	features = featuresCache[rootUid] = {};
+
+	features.root = root;
+	features.isXMLDocument = this.isXML(document);
+
+	features.brokenStarGEBTN
+	= features.starSelectsClosedQSA
+	= features.idGetsName
+	= features.brokenMixedCaseQSA
+	= features.brokenGEBCN
+	= features.brokenCheckedQSA
+	= features.brokenEmptyAttributeQSA
+	= features.isHTMLDocument
+	= features.nativeMatchesSelector
+	= false;
+
+	var starSelectsClosed, starSelectsComments,
+		brokenSecondClassNameGEBCN, cachedGetElementsByClassName,
+		brokenFormAttributeGetter;
+
+	var selected, id = 'slick_uniqueid';
+	var testNode = document.createElement('div');
+
+	var testRoot = document.body || document.getElementsByTagName('body')[0] || root;
+	testRoot.appendChild(testNode);
+
+	// on non-HTML documents innerHTML and getElementsById doesnt work properly
+	try {
+		testNode.innerHTML = '<a id="'+id+'"></a>';
+		features.isHTMLDocument = !!document.getElementById(id);
+	} catch(e){};
+
+	if (features.isHTMLDocument){
+
+		testNode.style.display = 'none';
+
+		// IE returns comment nodes for getElementsByTagName('*') for some documents
+		testNode.appendChild(document.createComment(''));
+		starSelectsComments = (testNode.getElementsByTagName('*').length > 1);
+
+		// IE returns closed nodes (EG:"</foo>") for getElementsByTagName('*') for some documents
+		try {
+			testNode.innerHTML = 'foo</foo>';
+			selected = testNode.getElementsByTagName('*');
+			starSelectsClosed = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
+		} catch(e){};
+
+		features.brokenStarGEBTN = starSelectsComments || starSelectsClosed;
+
+		// IE returns elements with the name instead of just id for getElementsById for some documents
+		try {
+			testNode.innerHTML = '<a name="'+ id +'"></a><b id="'+ id +'"></b>';
+			features.idGetsName = document.getElementById(id) === testNode.firstChild;
+		} catch(e){};
+
+		if (testNode.getElementsByClassName){
+
+			// Safari 3.2 getElementsByClassName caches results
+			try {
+				testNode.innerHTML = '<a class="f"></a><a class="b"></a>';
+				testNode.getElementsByClassName('b').length;
+				testNode.firstChild.className = 'b';
+				cachedGetElementsByClassName = (testNode.getElementsByClassName('b').length != 2);
+			} catch(e){};
+
+			// Opera 9.6 getElementsByClassName doesnt detects the class if its not the first one
+			try {
+				testNode.innerHTML = '<a class="a"></a><a class="f b a"></a>';
+				brokenSecondClassNameGEBCN = (testNode.getElementsByClassName('a').length != 2);
+			} catch(e){};
+
+			features.brokenGEBCN = cachedGetElementsByClassName || brokenSecondClassNameGEBCN;
+		}
+
+		if (testNode.querySelectorAll){
+			// IE 8 returns closed nodes (EG:"</foo>") for querySelectorAll('*') for some documents
+			try {
+				testNode.innerHTML = 'foo</foo>';
+				selected = testNode.querySelectorAll('*');
+				features.starSelectsClosedQSA = (selected && !!selected.length && selected[0].nodeName.charAt(0) == '/');
+			} catch(e){};
+
+			// Safari 3.2 querySelectorAll doesnt work with mixedcase on quirksmode
+			try {
+				testNode.innerHTML = '<a class="MiX"></a>';
+				features.brokenMixedCaseQSA = !testNode.querySelectorAll('.MiX').length;
+			} catch(e){};
+
+			// Webkit and Opera dont return selected options on querySelectorAll
+			try {
+				testNode.innerHTML = '<select><option selected="selected">a</option></select>';
+				features.brokenCheckedQSA = (testNode.querySelectorAll(':checked').length == 0);
+			} catch(e){};
+
+			// IE returns incorrect results for attr[*^$]="" selectors on querySelectorAll
+			try {
+				testNode.innerHTML = '<a class=""></a>';
+				features.brokenEmptyAttributeQSA = (testNode.querySelectorAll('[class*=""]').length != 0);
+			} catch(e){};
+
+		}
+
+		// IE6-7, if a form has an input of id x, form.getAttribute(x) returns a reference to the input
+		try {
+			testNode.innerHTML = '<form action="s"><input id="action"/></form>';
+			brokenFormAttributeGetter = (testNode.firstChild.getAttribute('action') != 's');
+		} catch(e){};
+
+		// native matchesSelector function
+
+		features.nativeMatchesSelector = root.matchesSelector || /*root.msMatchesSelector ||*/ root.mozMatchesSelector || root.webkitMatchesSelector;
+		if (features.nativeMatchesSelector) try {
+			// if matchesSelector trows errors on incorrect sintaxes we can use it
+			features.nativeMatchesSelector.call(root, ':slick');
+			features.nativeMatchesSelector = null;
+		} catch(e){};
+
+	}
+
+	try {
+		root.slick_expando = 1;
+		delete root.slick_expando;
+		features.getUID = this.getUIDHTML;
+	} catch(e) {
+		features.getUID = this.getUIDXML;
+	}
+
+	testRoot.removeChild(testNode);
+	testNode = selected = testRoot = null;
+
+	// getAttribute
+
+	features.getAttribute = (features.isHTMLDocument && brokenFormAttributeGetter) ? function(node, name){
+		var method = this.attributeGetters[name];
+		if (method) return method.call(node);
+		var attributeNode = node.getAttributeNode(name);
+		return (attributeNode) ? attributeNode.nodeValue : null;
+	} : function(node, name){
+		var method = this.attributeGetters[name];
+		return (method) ? method.call(node) : node.getAttribute(name);
+	};
+
+	// hasAttribute
+
+	features.hasAttribute = (root && this.isNativeCode(root.hasAttribute)) ? function(node, attribute) {
+		return node.hasAttribute(attribute);
+	} : function(node, attribute) {
+		node = node.getAttributeNode(attribute);
+		return !!(node && (node.specified || node.nodeValue));
+	};
+
+	// contains
+	// FIXME: Add specs: local.contains should be different for xml and html documents?
+	var nativeRootContains = root && this.isNativeCode(root.contains),
+		nativeDocumentContains = document && this.isNativeCode(document.contains);
+
+	features.contains = (nativeRootContains && nativeDocumentContains) ? function(context, node){
+		return context.contains(node);
+	} : (nativeRootContains && !nativeDocumentContains) ? function(context, node){
+		// IE8 does not have .contains on document.
+		return context === node || ((context === document) ? document.documentElement : context).contains(node);
+	} : (root && root.compareDocumentPosition) ? function(context, node){
+		return context === node || !!(context.compareDocumentPosition(node) & 16);
+	} : function(context, node){
+		if (node) do {
+			if (node === context) return true;
+		} while ((node = node.parentNode));
+		return false;
+	};
+
+	// document order sorting
+	// credits to Sizzle (http://sizzlejs.com/)
+
+	features.documentSorter = (root.compareDocumentPosition) ? function(a, b){
+		if (!a.compareDocumentPosition || !b.compareDocumentPosition) return 0;
+		return a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1;
+	} : ('sourceIndex' in root) ? function(a, b){
+		if (!a.sourceIndex || !b.sourceIndex) return 0;
+		return a.sourceIndex - b.sourceIndex;
+	} : (document.createRange) ? function(a, b){
+		if (!a.ownerDocument || !b.ownerDocument) return 0;
+		var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange();
+		aRange.setStart(a, 0);
+		aRange.setEnd(a, 0);
+		bRange.setStart(b, 0);
+		bRange.setEnd(b, 0);
+		return aRange.compareBoundaryPoints(Range.START_TO_END, bRange);
+	} : null ;
+
+	root = null;
+
+	for (feature in features){
+		this[feature] = features[feature];
+	}
+};
+
+// Main Method
+
+var reSimpleSelector = /^([#.]?)((?:[\w-]+|\*))$/,
+	reEmptyAttribute = /\[.+[*$^]=(?:""|'')?\]/,
+	qsaFailExpCache = {};
+
+local.search = function(context, expression, append, first){
+
+	var found = this.found = (first) ? null : (append || []);
+
+	if (!context) return found;
+	else if (context.navigator) context = context.document; // Convert the node from a window to a document
+	else if (!context.nodeType) return found;
+
+	// setup
+
+	var parsed, i,
+		uniques = this.uniques = {},
+		hasOthers = !!(append && append.length),
+		contextIsDocument = (context.nodeType == 9);
+
+	if (this.document !== (contextIsDocument ? context : context.ownerDocument)) this.setDocument(context);
+
+	// avoid duplicating items already in the append array
+	if (hasOthers) for (i = found.length; i--;) uniques[this.getUID(found[i])] = true;
+
+	// expression checks
+
+	if (typeof expression == 'string'){ // expression is a string
+
+		/*<simple-selectors-override>*/
+		var simpleSelector = expression.match(reSimpleSelector);
+		simpleSelectors: if (simpleSelector) {
+
+			var symbol = simpleSelector[1],
+				name = simpleSelector[2],
+				node, nodes;
+
+			if (!symbol){
+
+				if (name == '*' && this.brokenStarGEBTN) break simpleSelectors;
+				nodes = context.getElementsByTagName(name);
+				if (first) return nodes[0] || null;
+				for (i = 0; node = nodes[i++];){
+					if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
+				}
+
+			} else if (symbol == '#'){
+
+				if (!this.isHTMLDocument || !contextIsDocument) break simpleSelectors;
+				node = context.getElementById(name);
+				if (!node) return found;
+				if (this.idGetsName && node.getAttributeNode('id').nodeValue != name) break simpleSelectors;
+				if (first) return node || null;
+				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
+
+			} else if (symbol == '.'){
+
+				if (!this.isHTMLDocument || ((!context.getElementsByClassName || this.brokenGEBCN) && context.querySelectorAll)) break simpleSelectors;
+				if (context.getElementsByClassName && !this.brokenGEBCN){
+					nodes = context.getElementsByClassName(name);
+					if (first) return nodes[0] || null;
+					for (i = 0; node = nodes[i++];){
+						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
+					}
+				} else {
+					var matchClass = new RegExp('(^|\\s)'+ Slick.escapeRegExp(name) +'(\\s|$)');
+					nodes = context.getElementsByTagName('*');
+					for (i = 0; node = nodes[i++];){
+						className = node.className;
+						if (!(className && matchClass.test(className))) continue;
+						if (first) return node;
+						if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
+					}
+				}
+
+			}
+
+			if (hasOthers) this.sort(found);
+			return (first) ? null : found;
+
+		}
+		/*</simple-selectors-override>*/
+
+		/*<query-selector-override>*/
+		querySelector: if (context.querySelectorAll) {
+
+			if (!this.isHTMLDocument
+				|| qsaFailExpCache[expression]
+				//TODO: only skip when expression is actually mixed case
+				|| this.brokenMixedCaseQSA
+				|| (this.brokenCheckedQSA && expression.indexOf(':checked') > -1)
+				|| (this.brokenEmptyAttributeQSA && reEmptyAttribute.test(expression))
+				|| (!contextIsDocument //Abort when !contextIsDocument and...
+					//  there are multiple expressions in the selector
+					//  since we currently only fix non-document rooted QSA for single expression selectors
+					&& expression.indexOf(',') > -1
+				)
+				|| Slick.disableQSA
+			) break querySelector;
+
+			var _expression = expression, _context = context;
+			if (!contextIsDocument){
+				// non-document rooted QSA
+				// credits to Andrew Dupont
+				var currentId = _context.getAttribute('id'), slickid = 'slickid__';
+				_context.setAttribute('id', slickid);
+				_expression = '#' + slickid + ' ' + _expression;
+				context = _context.parentNode;
+			}
+
+			try {
+				if (first) return context.querySelector(_expression) || null;
+				else nodes = context.querySelectorAll(_expression);
+			} catch(e) {
+				qsaFailExpCache[expression] = 1;
+				break querySelector;
+			} finally {
+				if (!contextIsDocument){
+					if (currentId) _context.setAttribute('id', currentId);
+					else _context.removeAttribute('id');
+					context = _context;
+				}
+			}
+
+			if (this.starSelectsClosedQSA) for (i = 0; node = nodes[i++];){
+				if (node.nodeName > '@' && !(hasOthers && uniques[this.getUID(node)])) found.push(node);
+			} else for (i = 0; node = nodes[i++];){
+				if (!(hasOthers && uniques[this.getUID(node)])) found.push(node);
+			}
+
+			if (hasOthers) this.sort(found);
+			return found;
+
+		}
+		/*</query-selector-override>*/
+
+		parsed = this.Slick.parse(expression);
+		if (!parsed.length) return found;
+	} else if (expression == null){ // there is no expression
+		return found;
+	} else if (expression.Slick){ // expression is a parsed Slick object
+		parsed = expression;
+	} else if (this.contains(context.documentElement || context, expression)){ // expression is a node
+		(found) ? found.push(expression) : found = expression;
+		return found;
+	} else { // other junk
+		return found;
+	}
+
+	/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
+
+	// cache elements for the nth selectors
+
+	this.posNTH = {};
+	this.posNTHLast = {};
+	this.posNTHType = {};
+	this.posNTHTypeLast = {};
+
+	/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
+
+	// if append is null and there is only a single selector with one expression use pushArray, else use pushUID
+	this.push = (!hasOthers && (first || (parsed.length == 1 && parsed.expressions[0].length == 1))) ? this.pushArray : this.pushUID;
+
+	if (found == null) found = [];
+
+	// default engine
+
+	var j, m, n;
+	var combinator, tag, id, classList, classes, attributes, pseudos;
+	var currentItems, currentExpression, currentBit, lastBit, expressions = parsed.expressions;
+
+	search: for (i = 0; (currentExpression = expressions[i]); i++) for (j = 0; (currentBit = currentExpression[j]); j++){
+
+		combinator = 'combinator:' + currentBit.combinator;
+		if (!this[combinator]) continue search;
+
+		tag        = (this.isXMLDocument) ? currentBit.tag : currentBit.tag.toUpperCase();
+		id         = currentBit.id;
+		classList  = currentBit.classList;
+		classes    = currentBit.classes;
+		attributes = currentBit.attributes;
+		pseudos    = currentBit.pseudos;
+		lastBit    = (j === (currentExpression.length - 1));
+
+		this.bitUniques = {};
+
+		if (lastBit){
+			this.uniques = uniques;
+			this.found = found;
+		} else {
+			this.uniques = {};
+			this.found = [];
+		}
+
+		if (j === 0){
+			this[combinator](context, tag, id, classes, attributes, pseudos, classList);
+			if (first && lastBit && found.length) break search;
+		} else {
+			if (first && lastBit) for (m = 0, n = currentItems.length; m < n; m++){
+				this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
+				if (found.length) break search;
+			} else for (m = 0, n = currentItems.length; m < n; m++) this[combinator](currentItems[m], tag, id, classes, attributes, pseudos, classList);
+		}
+
+		currentItems = this.found;
+	}
+
+	// should sort if there are nodes in append and if you pass multiple expressions.
+	if (hasOthers || (parsed.expressions.length > 1)) this.sort(found);
+
+	return (first) ? (found[0] || null) : found;
+};
+
+// Utils
+
+local.uidx = 1;
+local.uidk = 'slick-uniqueid';
+
+local.getUIDXML = function(node){
+	var uid = node.getAttribute(this.uidk);
+	if (!uid){
+		uid = this.uidx++;
+		node.setAttribute(this.uidk, uid);
+	}
+	return uid;
+};
+
+local.getUIDHTML = function(node){
+	return node.uniqueNumber || (node.uniqueNumber = this.uidx++);
+};
+
+// sort based on the setDocument documentSorter method.
+
+local.sort = function(results){
+	if (!this.documentSorter) return results;
+	results.sort(this.documentSorter);
+	return results;
+};
+
+/*<pseudo-selectors>*//*<nth-pseudo-selectors>*/
+
+local.cacheNTH = {};
+
+local.matchNTH = /^([+-]?\d*)?([a-z]+)?([+-]\d+)?$/;
+
+local.parseNTHArgument = function(argument){
+	var parsed = argument.match(this.matchNTH);
+	if (!parsed) return false;
+	var special = parsed[2] || false;
+	var a = parsed[1] || 1;
+	if (a == '-') a = -1;
+	var b = +parsed[3] || 0;
+	parsed =
+		(special == 'n')	? {a: a, b: b} :
+		(special == 'odd')	? {a: 2, b: 1} :
+		(special == 'even')	? {a: 2, b: 0} : {a: 0, b: a};
+
+	return (this.cacheNTH[argument] = parsed);
+};
+
+local.createNTHPseudo = function(child, sibling, positions, ofType){
+	return function(node, argument){
+		var uid = this.getUID(node);
+		if (!this[positions][uid]){
+			var parent = node.parentNode;
+			if (!parent) return false;
+			var el = parent[child], count = 1;
+			if (ofType){
+				var nodeName = node.nodeName;
+				do {
+					if (el.nodeName != nodeName) continue;
+					this[positions][this.getUID(el)] = count++;
+				} while ((el = el[sibling]));
+			} else {
+				do {
+					if (el.nodeType != 1) continue;
+					this[positions][this.getUID(el)] = count++;
+				} while ((el = el[sibling]));
+			}
+		}
+		argument = argument || 'n';
+		var parsed = this.cacheNTH[argument] || this.parseNTHArgument(argument);
+		if (!parsed) return false;
+		var a = parsed.a, b = parsed.b, pos = this[positions][uid];
+		if (a == 0) return b == pos;
+		if (a > 0){
+			if (pos < b) return false;
+		} else {
+			if (b < pos) return false;
+		}
+		return ((pos - b) % a) == 0;
+	};
+};
+
+/*</nth-pseudo-selectors>*//*</pseudo-selectors>*/
+
+local.pushArray = function(node, tag, id, classes, attributes, pseudos){
+	if (this.matchSelector(node, tag, id, classes, attributes, pseudos)) this.found.push(node);
+};
+
+local.pushUID = function(node, tag, id, classes, attributes, pseudos){
+	var uid = this.getUID(node);
+	if (!this.uniques[uid] && this.matchSelector(node, tag, id, classes, attributes, pseudos)){
+		this.uniques[uid] = true;
+		this.found.push(node);
+	}
+};
+
+local.matchNode = function(node, selector){
+	if (this.isHTMLDocument && this.nativeMatchesSelector){
+		try {
+			return this.nativeMatchesSelector.call(node, selector.replace(/\[([^=]+)=\s*([^'"\]]+?)\s*\]/g, '[$1="$2"]'));
+		} catch(matchError) {}
+	}
+
+	var parsed = this.Slick.parse(selector);
+	if (!parsed) return true;
+
+	// simple (single) selectors
+	var expressions = parsed.expressions, simpleExpCounter = 0, i;
+	for (i = 0; (currentExpression = expressions[i]); i++){
+		if (currentExpression.length == 1){
+			var exp = currentExpression[0];
+			if (this.matchSelector(node, (this.isXMLDocument) ? exp.tag : exp.tag.toUpperCase(), exp.id, exp.classes, exp.attributes, exp.pseudos)) return true;
+			simpleExpCounter++;
+		}
+	}
+
+	if (simpleExpCounter == parsed.length) return false;
+
+	var nodes = this.search(this.document, parsed), item;
+	for (i = 0; item = nodes[i++];){
+		if (item === node) return true;
+	}
+	return false;
+};
+
+local.matchPseudo = function(node, name, argument){
+	var pseudoName = 'pseudo:' + name;
+	if (this[pseudoName]) return this[pseudoName](node, argument);
+	var attribute = this.getAttribute(node, name);
+	return (argument) ? argument == attribute : !!attribute;
+};
+
+local.matchSelector = function(node, tag, id, classes, attributes, pseudos){
+	if (tag){
+		var nodeName = (this.isXMLDocument) ? node.nodeName : node.nodeName.toUpperCase();
+		if (tag == '*'){
+			if (nodeName < '@') return false; // Fix for comment nodes and closed nodes
+		} else {
+			if (nodeName != tag) return false;
+		}
+	}
+
+	if (id && node.getAttribute('id') != id) return false;
+
+	var i, part, cls;
+	if (classes) for (i = classes.length; i--;){
+		cls = this.getAttribute(node, 'class');
+		if (!(cls && classes[i].regexp.test(cls))) return false;
+	}
+	if (attributes) for (i = attributes.length; i--;){
+		part = attributes[i];
+		if (part.operator ? !part.test(this.getAttribute(node, part.key)) : !this.hasAttribute(node, part.key)) return false;
+	}
+	if (pseudos) for (i = pseudos.length; i--;){
+		part = pseudos[i];
+		if (!this.matchPseudo(node, part.key, part.value)) return false;
+	}
+	return true;
+};
+
+var combinators = {
+
+	' ': function(node, tag, id, classes, attributes, pseudos, classList){ // all child nodes, any level
+
+		var i, item, children;
+
+		if (this.isHTMLDocument){
+			getById: if (id){
+				item = this.document.getElementById(id);
+				if ((!item && node.all) || (this.idGetsName && item && item.getAttributeNode('id').nodeValue != id)){
+					// all[id] returns all the elements with that name or id inside node
+					// if theres just one it will return the element, else it will be a collection
+					children = node.all[id];
+					if (!children) return;
+					if (!children[0]) children = [children];
+					for (i = 0; item = children[i++];){
+						var idNode = item.getAttributeNode('id');
+						if (idNode && idNode.nodeValue == id){
+							this.push(item, tag, null, classes, attributes, pseudos);
+							break;
+						}
+					}
+					return;
+				}
+				if (!item){
+					// if the context is in the dom we return, else we will try GEBTN, breaking the getById label
+					if (this.contains(this.root, node)) return;
+					else break getById;
+				} else if (this.document !== node && !this.contains(node, item)) return;
+				this.push(item, tag, null, classes, attributes, pseudos);
+				return;
+			}
+			getByClass: if (classes && node.getElementsByClassName && !this.brokenGEBCN){
+				children = node.getElementsByClassName(classList.join(' '));
+				if (!(children && children.length)) break getByClass;
+				for (i = 0; item = children[i++];) this.push(item, tag, id, null, attributes, pseudos);
+				return;
+			}
+		}
+		getByTag: {
+			children = node.getElementsByTagName(tag);
+			if (!(children && children.length)) break getByTag;
+			if (!this.brokenStarGEBTN) tag = null;
+			for (i = 0; item = children[i++];) this.push(item, tag, id, classes, attributes, pseudos);
+		}
+	},
+
+	'>': function(node, tag, id, classes, attributes, pseudos){ // direct children
+		if ((node = node.firstChild)) do {
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
+		} while ((node = node.nextSibling));
+	},
+
+	'+': function(node, tag, id, classes, attributes, pseudos){ // next sibling
+		while ((node = node.nextSibling)) if (node.nodeType == 1){
+			this.push(node, tag, id, classes, attributes, pseudos);
+			break;
+		}
+	},
+
+	'^': function(node, tag, id, classes, attributes, pseudos){ // first child
+		node = node.firstChild;
+		if (node){
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
+			else this['combinator:+'](node, tag, id, classes, attributes, pseudos);
+		}
+	},
+
+	'~': function(node, tag, id, classes, attributes, pseudos){ // next siblings
+		while ((node = node.nextSibling)){
+			if (node.nodeType != 1) continue;
+			var uid = this.getUID(node);
+			if (this.bitUniques[uid]) break;
+			this.bitUniques[uid] = true;
+			this.push(node, tag, id, classes, attributes, pseudos);
+		}
+	},
+
+	'++': function(node, tag, id, classes, attributes, pseudos){ // next sibling and previous sibling
+		this['combinator:+'](node, tag, id, classes, attributes, pseudos);
+		this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
+	},
+
+	'~~': function(node, tag, id, classes, attributes, pseudos){ // next siblings and previous siblings
+		this['combinator:~'](node, tag, id, classes, attributes, pseudos);
+		this['combinator:!~'](node, tag, id, classes, attributes, pseudos);
+	},
+
+	'!': function(node, tag, id, classes, attributes, pseudos){ // all parent nodes up to document
+		while ((node = node.parentNode)) if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
+	},
+
+	'!>': function(node, tag, id, classes, attributes, pseudos){ // direct parent (one level)
+		node = node.parentNode;
+		if (node !== this.document) this.push(node, tag, id, classes, attributes, pseudos);
+	},
+
+	'!+': function(node, tag, id, classes, attributes, pseudos){ // previous sibling
+		while ((node = node.previousSibling)) if (node.nodeType == 1){
+			this.push(node, tag, id, classes, attributes, pseudos);
+			break;
+		}
+	},
+
+	'!^': function(node, tag, id, classes, attributes, pseudos){ // last child
+		node = node.lastChild;
+		if (node){
+			if (node.nodeType == 1) this.push(node, tag, id, classes, attributes, pseudos);
+			else this['combinator:!+'](node, tag, id, classes, attributes, pseudos);
+		}
+	},
+
+	'!~': function(node, tag, id, classes, attributes, pseudos){ // previous siblings
+		while ((node = node.previousSibling)){
+			if (node.nodeType != 1) continue;
+			var uid = this.getUID(node);
+			if (this.bitUniques[uid]) break;
+			this.bitUniques[uid] = true;
+			this.push(node, tag, id, classes, attributes, pseudos);
+		}
+	}
+
+};
+
+for (var c in combinators) local['combinator:' + c] = combinators[c];
+
+var pseudos = {
+
+	/*<pseudo-selectors>*/
+
+	'empty': function(node){
+		var child = node.firstChild;
+		return !(child && child.nodeType == 1) && !(node.innerText || node.textContent || '').length;
+	},
+
+	'not': function(node, expression){
+		return !this.matchNode(node, expression);
+	},
+
+	'contains': function(node, text){
+		return (node.innerText || node.textContent || '').indexOf(text) > -1;
+	},
+
+	'first-child': function(node){
+		while ((node = node.previousSibling)) if (node.nodeType == 1) return false;
+		return true;
+	},
+
+	'last-child': function(node){
+		while ((node = node.nextSibling)) if (node.nodeType == 1) return false;
+		return true;
+	},
+
+	'only-child': function(node){
+		var prev = node;
+		while ((prev = prev.previousSibling)) if (prev.nodeType == 1) return false;
+		var next = node;
+		while ((next = next.nextSibling)) if (next.nodeType == 1) return false;
+		return true;
+	},
+
+	/*<nth-pseudo-selectors>*/
+
+	'nth-child': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTH'),
+
+	'nth-last-child': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHLast'),
+
+	'nth-of-type': local.createNTHPseudo('firstChild', 'nextSibling', 'posNTHType', true),
+
+	'nth-last-of-type': local.createNTHPseudo('lastChild', 'previousSibling', 'posNTHTypeLast', true),
+
+	'index': function(node, index){
+		return this['pseudo:nth-child'](node, '' + (index + 1));
+	},
+
+	'even': function(node){
+		return this['pseudo:nth-child'](node, '2n');
+	},
+
+	'odd': function(node){
+		return this['pseudo:nth-child'](node, '2n+1');
+	},
+
+	/*</nth-pseudo-selectors>*/
+
+	/*<of-type-pseudo-selectors>*/
+
+	'first-of-type': function(node){
+		var nodeName = node.nodeName;
+		while ((node = node.previousSibling)) if (node.nodeName == nodeName) return false;
+		return true;
+	},
+
+	'last-of-type': function(node){
+		var nodeName = node.nodeName;
+		while ((node = node.nextSibling)) if (node.nodeName == nodeName) return false;
+		return true;
+	},
+
+	'only-of-type': function(node){
+		var prev = node, nodeName = node.nodeName;
+		while ((prev = prev.previousSibling)) if (prev.nodeName == nodeName) return false;
+		var next = node;
+		while ((next = next.nextSibling)) if (next.nodeName == nodeName) return false;
+		return true;
+	},
+
+	/*</of-type-pseudo-selectors>*/
+
+	// custom pseudos
+
+	'enabled': function(node){
+		return !node.disabled;
+	},
+
+	'disabled': function(node){
+		return node.disabled;
+	},
+
+	'checked': function(node){
+		return node.checked || node.selected;
+	},
+
+	'focus': function(node){
+		return this.isHTMLDocument && this.document.activeElement === node && (node.href || node.type || this.hasAttribute(node, 'tabindex'));
+	},
+
+	'root': function(node){
+		return (node === this.root);
+	},
+
+	'selected': function(node){
+		return node.selected;
+	}
+
+	/*</pseudo-selectors>*/
+};
+
+for (var p in pseudos) local['pseudo:' + p] = pseudos[p];
+
+// attributes methods
+
+var attributeGetters = local.attributeGetters = {
+
+	'for': function(){
+		return ('htmlFor' in this) ? this.htmlFor : this.getAttribute('for');
+	},
+
+	'href': function(){
+		return ('href' in this) ? this.getAttribute('href', 2) : this.getAttribute('href');
+	},
+
+	'style': function(){
+		return (this.style) ? this.style.cssText : this.getAttribute('style');
+	},
+
+	'tabindex': function(){
+		var attributeNode = this.getAttributeNode('tabindex');
+		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
+	},
+
+	'type': function(){
+		return this.getAttribute('type');
+	},
+
+	'maxlength': function(){
+		var attributeNode = this.getAttributeNode('maxLength');
+		return (attributeNode && attributeNode.specified) ? attributeNode.nodeValue : null;
+	}
+
+};
+
+attributeGetters.MAXLENGTH = attributeGetters.maxLength = attributeGetters.maxlength;
+
+// Slick
+
+var Slick = local.Slick = (this.Slick || {});
+
+Slick.version = '1.1.7';
+
+// Slick finder
+
+Slick.search = function(context, expression, append){
+	return local.search(context, expression, append);
+};
+
+Slick.find = function(context, expression){
+	return local.search(context, expression, null, true);
+};
+
+// Slick containment checker
+
+Slick.contains = function(container, node){
+	local.setDocument(container);
+	return local.contains(container, node);
+};
+
+// Slick attribute getter
+
+Slick.getAttribute = function(node, name){
+	local.setDocument(node);
+	return local.getAttribute(node, name);
+};
+
+Slick.hasAttribute = function(node, name){
+	local.setDocument(node);
+	return local.hasAttribute(node, name);
+};
+
+// Slick matcher
+
+Slick.match = function(node, selector){
+	if (!(node && selector)) return false;
+	if (!selector || selector === node) return true;
+	local.setDocument(node);
+	return local.matchNode(node, selector);
+};
+
+// Slick attribute accessor
+
+Slick.defineAttributeGetter = function(name, fn){
+	local.attributeGetters[name] = fn;
+	return this;
+};
+
+Slick.lookupAttributeGetter = function(name){
+	return local.attributeGetters[name];
+};
+
+// Slick pseudo accessor
+
+Slick.definePseudo = function(name, fn){
+	local['pseudo:' + name] = function(node, argument){
+		return fn.call(node, argument);
+	};
+	return this;
+};
+
+Slick.lookupPseudo = function(name){
+	var pseudo = local['pseudo:' + name];
+	if (pseudo) return function(argument){
+		return pseudo.call(this, argument);
+	};
+	return null;
+};
+
+// Slick overrides accessor
+
+Slick.override = function(regexp, fn){
+	local.override(regexp, fn);
+	return this;
+};
+
+Slick.isXML = local.isXML;
+
+Slick.uidOf = function(node){
+	return local.getUIDHTML(node);
+};
+
+if (!this.Slick) this.Slick = Slick;
+
+}).apply(/*<CommonJS>*/(typeof exports != 'undefined') ? exports : /*</CommonJS>*/this);
+
+
+/*
+---
+
+name: Element
+
+description: One of the most important items in MooTools. Contains the dollar function, the dollars function, and an handful of cross-browser, time-saver methods to let you easily work with HTML Elements.
+
+license: MIT-style license.
+
+requires: [Window, Document, Array, String, Function, Object, Number, Slick.Parser, Slick.Finder]
+
+provides: [Element, Elements, $, $$, Iframe, Selectors]
+
+...
+*/
+
+var Element = function(tag, props){
+	var konstructor = Element.Constructors[tag];
+	if (konstructor) return konstructor(props);
+	if (typeof tag != 'string') return document.id(tag).set(props);
+
+	if (!props) props = {};
+
+	if (!(/^[\w-]+$/).test(tag)){
+		var parsed = Slick.parse(tag).expressions[0][0];
+		tag = (parsed.tag == '*') ? 'div' : parsed.tag;
+		if (parsed.id && props.id == null) props.id = parsed.id;
+
+		var attributes = parsed.attributes;
+		if (attributes) for (var attr, i = 0, l = attributes.length; i < l; i++){
+			attr = attributes[i];
+			if (props[attr.key] != null) continue;
+
+			if (attr.value != null && attr.operator == '=') props[attr.key] = attr.value;
+			else if (!attr.value && !attr.operator) props[attr.key] = true;
+		}
+
+		if (parsed.classList && props['class'] == null) props['class'] = parsed.classList.join(' ');
+	}
+
+	return document.newElement(tag, props);
+};
+
+
+if (Browser.Element){
+	Element.prototype = Browser.Element.prototype;
+	// IE8 and IE9 require the wrapping.
+	Element.prototype._fireEvent = (function(fireEvent){
+		return function(type, event){
+			return fireEvent.call(this, type, event);
+		};
+	})(Element.prototype.fireEvent);
+}
+
+new Type('Element', Element).mirror(function(name){
+	if (Array.prototype[name]) return;
+
+	var obj = {};
+	obj[name] = function(){
+		var results = [], args = arguments, elements = true;
+		for (var i = 0, l = this.length; i < l; i++){
+			var element = this[i], result = results[i] = element[name].apply(element, args);
+			elements = (elements && typeOf(result) == 'element');
+		}
+		return (elements) ? new Elements(results) : results;
+	};
+
+	Elements.implement(obj);
+});
+
+if (!Browser.Element){
+	Element.parent = Object;
+
+	Element.Prototype = {
+		'$constructor': Element,
+		'$family': Function.from('element').hide()
+	};
+
+	Element.mirror(function(name, method){
+		Element.Prototype[name] = method;
+	});
+}
+
+Element.Constructors = {};
+
+//<1.2compat>
+
+Element.Constructors = new Hash;
+
+//</1.2compat>
+
+var IFrame = new Type('IFrame', function(){
+	var params = Array.link(arguments, {
+		properties: Type.isObject,
+		iframe: function(obj){
+			return (obj != null);
+		}
+	});
+
+	var props = params.properties || {}, iframe;
+	if (params.iframe) iframe = document.id(params.iframe);
+	var onload = props.onload || function(){};
+	delete props.onload;
+	props.id = props.name = [props.id, props.name, iframe ? (iframe.id || iframe.name) : 'IFrame_' + String.uniqueID()].pick();
+	iframe = new Element(iframe || 'iframe', props);
+
+	var onLoad = function(){
+		onload.call(iframe.contentWindow);
+	};
+
+	if (window.frames[props.id]) onLoad();
+	else iframe.addListener('load', onLoad);
+	return iframe;
+});
+
+var Elements = this.Elements = function(nodes){
+	if (nodes && nodes.length){
+		var uniques = {}, node;
+		for (var i = 0; node = nodes[i++];){
+			var uid = Slick.uidOf(node);
+			if (!uniques[uid]){
+				uniques[uid] = true;
+				this.push(node);
+			}
+		}
+	}
+};
+
+Elements.prototype = {length: 0};
+Elements.parent = Array;
+
+new Type('Elements', Elements).implement({
+
+	filter: function(filter, bind){
+		if (!filter) return this;
+		return new Elements(Array.filter(this, (typeOf(filter) == 'string') ? function(item){
+			return item.match(filter);
+		} : filter, bind));
+	}.protect(),
+
+	push: function(){
+		var length = this.length;
+		for (var i = 0, l = arguments.length; i < l; i++){
+			var item = document.id(arguments[i]);
+			if (item) this[length++] = item;
+		}
+		return (this.length = length);
+	}.protect(),
+
+	unshift: function(){
+		var items = [];
+		for (var i = 0, l = arguments.length; i < l; i++){
+			var item = document.id(arguments[i]);
+			if (item) items.push(item);
+		}
+		return Array.prototype.unshift.apply(this, items);
+	}.protect(),
+
+	concat: function(){
+		var newElements = new Elements(this);
+		for (var i = 0, l = arguments.length; i < l; i++){
+			var item = arguments[i];
+			if (Type.isEnumerable(item)) newElements.append(item);
+			else newElements.push(item);
+		}
+		return newElements;
+	}.protect(),
+
+	append: function(collection){
+		for (var i = 0, l = collection.length; i < l; i++) this.push(collection[i]);
+		return this;
+	}.protect(),
+
+	empty: function(){
+		while (this.length) delete this[--this.length];
+		return this;
+	}.protect()
+
+});
+
+//<1.2compat>
+
+Elements.alias('extend', 'append');
+
+//</1.2compat>
+
+(function(){
+
+// FF, IE
+var splice = Array.prototype.splice, object = {'0': 0, '1': 1, length: 2};
+
+splice.call(object, 1, 1);
+if (object[1] == 1) Elements.implement('splice', function(){
+	var length = this.length;
+	var result = splice.apply(this, arguments);
+	while (length >= this.length) delete this[length--];
+	return result;
+}.protect());
+
+Array.forEachMethod(function(method, name){
+	Elements.implement(name, method);
+});
+
+Array.mirror(Elements);
+
+/*<ltIE8>*/
+var createElementAcceptsHTML;
+try {
+    createElementAcceptsHTML = (document.createElement('<input name=x>').name == 'x');
+} catch (e){}
+
+var escapeQuotes = function(html){
+	return ('' + html).replace(/&/g, '&amp;').replace(/"/g, '&quot;');
+};
+/*</ltIE8>*/
+
+Document.implement({
+
+	newElement: function(tag, props){
+		if (props && props.checked != null) props.defaultChecked = props.checked;
+		/*<ltIE8>*/// Fix for readonly name and type properties in IE < 8
+		if (createElementAcceptsHTML && props){
+			tag = '<' + tag;
+			if (props.name) tag += ' name="' + escapeQuotes(props.name) + '"';
+			if (props.type) tag += ' type="' + escapeQuotes(props.type) + '"';
+			tag += '>';
+			delete props.name;
+			delete props.type;
+		}
+		/*</ltIE8>*/
+		return this.id(this.createElement(tag)).set(props);
+	}
+
+});
+
+})();
+
+(function(){
+
+Slick.uidOf(window);
+Slick.uidOf(document);
+
+Document.implement({
+
+	newTextNode: function(text){
+		return this.createTextNode(text);
+	},
+
+	getDocument: function(){
+		return this;
+	},
+
+	getWindow: function(){
+		return this.window;
+	},
+
+	id: (function(){
+
+		var types = {
+
+			string: function(id, nocash, doc){
+				id = Slick.find(doc, '#' + id.replace(/(\W)/g, '\\$1'));
+				return (id) ? types.element(id, nocash) : null;
+			},
+
+			element: function(el, nocash){
+				Slick.uidOf(el);
+				if (!nocash && !el.$family && !(/^(?:object|embed)$/i).test(el.tagName)){
+					var fireEvent = el.fireEvent;
+					// wrapping needed in IE7, or else crash
+					el._fireEvent = function(type, event){
+						return fireEvent(type, event);
+					};
+					Object.append(el, Element.Prototype);
+				}
+				return el;
+			},
+
+			object: function(obj, nocash, doc){
+				if (obj.toElement) return types.element(obj.toElement(doc), nocash);
+				return null;
+			}
+
+		};
+
+		types.textnode = types.whitespace = types.window = types.document = function(zero){
+			return zero;
+		};
+
+		return function(el, nocash, doc){
+			if (el && el.$family && el.uniqueNumber) return el;
+			var type = typeOf(el);
+			return (types[type]) ? types[type](el, nocash, doc || document) : null;
+		};
+
+	})()
+
+});
+
+if (window.$ == null) Window.implement('$', function(el, nc){
+	return document.id(el, nc, this.document);
+});
+
+Window.implement({
+
+	getDocument: function(){
+		return this.document;
+	},
+
+	getWindow: function(){
+		return this;
+	}
+
+});
+
+[Document, Element].invoke('implement', {
+
+	getElements: function(expression){
+		return Slick.search(this, expression, new Elements);
+	},
+
+	getElement: function(expression){
+		return document.id(Slick.find(this, expression));
+	}
+
+});
+
+var contains = {contains: function(element){
+	return Slick.contains(this, element);
+}};
+
+if (!document.contains) Document.implement(contains);
+if (!document.createElement('div').contains) Element.implement(contains);
+
+//<1.2compat>
+
+Element.implement('hasChild', function(element){
+	return this !== element && this.contains(element);
+});
+
+(function(search, find, match){
+
+	this.Selectors = {};
+	var pseudos = this.Selectors.Pseudo = new Hash();
+
+	var addSlickPseudos = function(){
+		for (var name in pseudos) if (pseudos.hasOwnProperty(name)){
+			Slick.definePseudo(name, pseudos[name]);
+			delete pseudos[name];
+		}
+	};
+
+	Slick.search = function(context, expression, append){
+		addSlickPseudos();
+		return search.call(this, context, expression, append);
+	};
+
+	Slick.find = function(context, expression){
+		addSlickPseudos();
+		return find.call(this, context, expression);
+	};
+
+	Slick.match = function(node, selector){
+		addSlickPseudos();
+		return match.call(this, node, selector);
+	};
+
+})(Slick.search, Slick.find, Slick.match);
+
+//</1.2compat>
+
+// tree walking
+
+var injectCombinator = function(expression, combinator){
+	if (!expression) return combinator;
+
+	expression = Object.clone(Slick.parse(expression));
+
+	var expressions = expression.expressions;
+	for (var i = expressions.length; i--;)
+		expressions[i][0].combinator = combinator;
+
+	return expression;
+};
+
+Object.forEach({
+	getNext: '~',
+	getPrevious: '!~',
+	getParent: '!'
+}, function(combinator, method){
+	Element.implement(method, function(expression){
+		return this.getElement(injectCombinator(expression, combinator));
+	});
+});
+
+Object.forEach({
+	getAllNext: '~',
+	getAllPrevious: '!~',
+	getSiblings: '~~',
+	getChildren: '>',
+	getParents: '!'
+}, function(combinator, method){
+	Element.implement(method, function(expression){
+		return this.getElements(injectCombinator(expression, combinator));
+	});
+});
+
+Element.implement({
+
+	getFirst: function(expression){
+		return document.id(Slick.search(this, injectCombinator(expression, '>'))[0]);
+	},
+
+	getLast: function(expression){
+		return document.id(Slick.search(this, injectCombinator(expression, '>')).getLast());
+	},
+
+	getWindow: function(){
+		return this.ownerDocument.window;
+	},
+
+	getDocument: function(){
+		return this.ownerDocument;
+	},
+
+	getElementById: function(id){
+		return document.id(Slick.find(this, '#' + ('' + id).replace(/(\W)/g, '\\$1')));
+	},
+
+	match: function(expression){
+		return !expression || Slick.match(this, expression);
+	}
+
+});
+
+//<1.2compat>
+
+if (window.$$ == null) Window.implement('$$', function(selector){
+	var elements = new Elements;
+	if (arguments.length == 1 && typeof selector == 'string') return Slick.search(this.document, selector, elements);
+	var args = Array.flatten(arguments);
+	for (var i = 0, l = args.length; i < l; i++){
+		var item = args[i];
+		switch (typeOf(item)){
+			case 'element': elements.push(item); break;
+			case 'string': Slick.search(this.document, item, elements);
+		}
+	}
+	return elements;
+});
+
+//</1.2compat>
+
+if (window.$$ == null) Window.implement('$$', function(selector){
+	if (arguments.length == 1){
+		if (typeof selector == 'string') return Slick.search(this.document, selector, new Elements);
+		else if (Type.isEnumerable(selector)) return new Elements(selector);
+	}
+	return new Elements(arguments);
+});
+
+// Inserters
+
+var inserters = {
+
+	before: function(context, element){
+		var parent = element.parentNode;
+		if (parent) parent.insertBefore(context, element);
+	},
+
+	after: function(context, element){
+		var parent = element.parentNode;
+		if (parent) parent.insertBefore(context, element.nextSibling);
+	},
+
+	bottom: function(context, element){
+		element.appendChild(context);
+	},
+
+	top: function(context, element){
+		element.insertBefore(context, element.firstChild);
+	}
+
+};
+
+inserters.inside = inserters.bottom;
+
+//<1.2compat>
+
+Object.each(inserters, function(inserter, where){
+
+	where = where.capitalize();
+
+	var methods = {};
+
+	methods['inject' + where] = function(el){
+		inserter(this, document.id(el, true));
+		return this;
+	};
+
+	methods['grab' + where] = function(el){
+		inserter(document.id(el, true), this);
+		return this;
+	};
+
+	Element.implement(methods);
+
+});
+
+//</1.2compat>
+
+// getProperty / setProperty
+
+var propertyGetters = {}, propertySetters = {};
+
+// properties
+
+var properties = {};
+Array.forEach([
+	'type', 'value', 'defaultValue', 'accessKey', 'cellPadding', 'cellSpacing', 'colSpan',
+	'frameBorder', 'rowSpan', 'tabIndex', 'useMap'
+], function(property){
+	properties[property.toLowerCase()] = property;
+});
+
+properties.html = 'innerHTML';
+properties.text = (document.createElement('div').textContent == null) ? 'innerText': 'textContent';
+
+Object.forEach(properties, function(real, key){
+	propertySetters[key] = function(node, value){
+		node[real] = value;
+	};
+	propertyGetters[key] = function(node){
+		return node[real];
+	};
+});
+
+// Booleans
+
+var bools = [
+	'compact', 'nowrap', 'ismap', 'declare', 'noshade', 'checked',
+	'disabled', 'readOnly', 'multiple', 'selected', 'noresize',
+	'defer', 'defaultChecked', 'autofocus', 'controls', 'autoplay',
+	'loop'
+];
+
+var booleans = {};
+Array.forEach(bools, function(bool){
+	var lower = bool.toLowerCase();
+	booleans[lower] = bool;
+	propertySetters[lower] = function(node, value){
+		node[bool] = !!value;
+	};
+	propertyGetters[lower] = function(node){
+		return !!node[bool];
+	};
+});
+
+// Special cases
+
+Object.append(propertySetters, {
+
+	'class': function(node, value){
+		('className' in node) ? node.className = (value || '') : node.setAttribute('class', value);
+	},
+
+	'for': function(node, value){
+		('htmlFor' in node) ? node.htmlFor = value : node.setAttribute('for', value);
+	},
+
+	'style': function(node, value){
+		(node.style) ? node.style.cssText = value : node.setAttribute('style', value);
+	},
+
+	'value': function(node, value){
+		node.value = (value != null) ? value : '';
+	}
+
+});
+
+propertyGetters['class'] = function(node){
+	return ('className' in node) ? node.className || null : node.getAttribute('class');
+};
+
+/* <webkit> */
+var el = document.createElement('button');
+// IE sets type as readonly and throws
+try { el.type = 'button'; } catch(e){}
+if (el.type != 'button') propertySetters.type = function(node, value){
+	node.setAttribute('type', value);
+};
+el = null;
+/* </webkit> */
+
+/*<IE>*/
+var input = document.createElement('input');
+input.value = 't';
+input.type = 'submit';
+if (input.value != 't') propertySetters.type = function(node, type){
+	var value = node.value;
+	node.type = type;
+	node.value = value;
+};
+input = null;
+/*</IE>*/
+
+/* getProperty, setProperty */
+
+/* <ltIE9> */
+var pollutesGetAttribute = (function(div){
+	div.random = 'attribute';
+	return (div.getAttribute('random') == 'attribute');
+})(document.createElement('div'));
+
+/* <ltIE9> */
+
+Element.implement({
+
+	setProperty: function(name, value){
+		var setter = propertySetters[name.toLowerCase()];
+		if (setter){
+			setter(this, value);
+		} else {
+			/* <ltIE9> */
+			if (pollutesGetAttribute) var attributeWhiteList = this.retrieve('$attributeWhiteList', {});
+			/* </ltIE9> */
+
+			if (value == null){
+				this.removeAttribute(name);
+				/* <ltIE9> */
+				if (pollutesGetAttribute) delete attributeWhiteList[name];
+				/* </ltIE9> */
+			} else {
+				this.setAttribute(name, '' + value);
+				/* <ltIE9> */
+				if (pollutesGetAttribute) attributeWhiteList[name] = true;
+				/* </ltIE9> */
+			}
+		}
+		return this;
+	},
+
+	setProperties: function(attributes){
+		for (var attribute in attributes) this.setProperty(attribute, attributes[attribute]);
+		return this;
+	},
+
+	getProperty: function(name){
+		var getter = propertyGetters[name.toLowerCase()];
+		if (getter) return getter(this);
+		/* <ltIE9> */
+		if (pollutesGetAttribute){
+			var attr = this.getAttributeNode(name), attributeWhiteList = this.retrieve('$attributeWhiteList', {});
+			if (!attr) return null;
+			if (attr.expando && !attributeWhiteList[name]){
+				var outer = this.outerHTML;
+				// segment by the opening tag and find mention of attribute name
+				if (outer.substr(0, outer.search(/\/?['"]?>(?![^<]*<['"])/)).indexOf(name) < 0) return null;
+				attributeWhiteList[name] = true;
+			}
+		}
+		/* </ltIE9> */
+		var result = Slick.getAttribute(this, name);
+		return (!result && !Slick.hasAttribute(this, name)) ? null : result;
+	},
+
+	getProperties: function(){
+		var args = Array.from(arguments);
+		return args.map(this.getProperty, this).associate(args);
+	},
+
+	removeProperty: function(name){
+		return this.setProperty(name, null);
+	},
+
+	removeProperties: function(){
+		Array.each(arguments, this.removeProperty, this);
+		return this;
+	},
+
+	set: function(prop, value){
+		var property = Element.Properties[prop];
+		(property && property.set) ? property.set.call(this, value) : this.setProperty(prop, value);
+	}.overloadSetter(),
+
+	get: function(prop){
+		var property = Element.Properties[prop];
+		return (property && property.get) ? property.get.apply(this) : this.getProperty(prop);
+	}.overloadGetter(),
+
+	erase: function(prop){
+		var property = Element.Properties[prop];
+		(property && property.erase) ? property.erase.apply(this) : this.removeProperty(prop);
+		return this;
+	},
+
+	hasClass: function(className){
+		return this.className.clean().contains(className, ' ');
+	},
+
+	addClass: function(className){
+		if (!this.hasClass(className)) this.className = (this.className + ' ' + className).clean();
+		return this;
+	},
+
+	removeClass: function(className){
+		this.className = this.className.replace(new RegExp('(^|\\s)' + className + '(?:\\s|$)'), '$1');
+		return this;
+	},
+
+	toggleClass: function(className, force){
+		if (force == null) force = !this.hasClass(className);
+		return (force) ? this.addClass(className) : this.removeClass(className);
+	},
+
+	adopt: function(){
+		var parent = this, fragment, elements = Array.flatten(arguments), length = elements.length;
+		if (length > 1) parent = fragment = document.createDocumentFragment();
+
+		for (var i = 0; i < length; i++){
+			var element = document.id(elements[i], true);
+			if (element) parent.appendChild(element);
+		}
+
+		if (fragment) this.appendChild(fragment);
+
+		return this;
+	},
+
+	appendText: function(text, where){
+		return this.grab(this.getDocument().newTextNode(text), where);
+	},
+
+	grab: function(el, where){
+		inserters[where || 'bottom'](document.id(el, true), this);
+		return this;
+	},
+
+	inject: function(el, where){
+		inserters[where || 'bottom'](this, document.id(el, true));
+		return this;
+	},
+
+	replaces: function(el){
+		el = document.id(el, true);
+		el.parentNode.replaceChild(this, el);
+		return this;
+	},
+
+	wraps: function(el, where){
+		el = document.id(el, true);
+		return this.replaces(el).grab(el, where);
+	},
+
+	getSelected: function(){
+		this.selectedIndex; // Safari 3.2.1
+		return new Elements(Array.from(this.options).filter(function(option){
+			return option.selected;
+		}));
+	},
+
+	toQueryString: function(){
+		var queryString = [];
+		this.getElements('input, select, textarea').each(function(el){
+			var type = el.type;
+			if (!el.name || el.disabled || type == 'submit' || type == 'reset' || type == 'file' || type == 'image') return;
+
+			var value = (el.get('tag') == 'select') ? el.getSelected().map(function(opt){
+				// IE
+				return document.id(opt).get('value');
+			}) : ((type == 'radio' || type == 'checkbox') && !el.checked) ? null : el.get('value');
+
+			Array.from(value).each(function(val){
+				if (typeof val != 'undefined') queryString.push(encodeURIComponent(el.name) + '=' + encodeURIComponent(val));
+			});
+		});
+		return queryString.join('&');
+	}
+
+});
+
+var collected = {}, storage = {};
+
+var get = function(uid){
+	return (storage[uid] || (storage[uid] = {}));
+};
+
+var clean = function(item){
+	var uid = item.uniqueNumber;
+	if (item.removeEvents) item.removeEvents();
+	if (item.clearAttributes) item.clearAttributes();
+	if (uid != null){
+		delete collected[uid];
+		delete storage[uid];
+	}
+	return item;
+};
+
+var formProps = {input: 'checked', option: 'selected', textarea: 'value'};
+
+Element.implement({
+
+	destroy: function(){
+		var children = clean(this).getElementsByTagName('*');
+		Array.each(children, clean);
+		Element.dispose(this);
+		return null;
+	},
+
+	empty: function(){
+		Array.from(this.childNodes).each(Element.dispose);
+		return this;
+	},
+
+	dispose: function(){
+		return (this.parentNode) ? this.parentNode.removeChild(this) : this;
+	},
+
+	clone: function(contents, keepid){
+		contents = contents !== false;
+		var clone = this.cloneNode(contents), ce = [clone], te = [this], i;
+
+		if (contents){
+			ce.append(Array.from(clone.getElementsByTagName('*')));
+			te.append(Array.from(this.getElementsByTagName('*')));
+		}
+
+		for (i = ce.length; i--;){
+			var node = ce[i], element = te[i];
+			if (!keepid) node.removeAttribute('id');
+			/*<ltIE9>*/
+			if (node.clearAttributes){
+				node.clearAttributes();
+				node.mergeAttributes(element);
+				node.removeAttribute('uniqueNumber');
+				if (node.options){
+					var no = node.options, eo = element.options;
+					for (var j = no.length; j--;) no[j].selected = eo[j].selected;
+				}
+			}
+			/*</ltIE9>*/
+			var prop = formProps[element.tagName.toLowerCase()];
+			if (prop && element[prop]) node[prop] = element[prop];
+		}
+
+		/*<ltIE9>*/
+		if (Browser.ie){
+			var co = clone.getElementsByTagName('object'), to = this.getElementsByTagName('object');
+			for (i = co.length; i--;) co[i].outerHTML = to[i].outerHTML;
+		}
+		/*</ltIE9>*/
+		return document.id(clone);
+	}
+
+});
+
+[Element, Window, Document].invoke('implement', {
+
+	addListener: function(type, fn){
+		if (type == 'unload'){
+			var old = fn, self = this;
+			fn = function(){
+				self.removeListener('unload', fn);
+				old();
+			};
+		} else {
+			collected[Slick.uidOf(this)] = this;
+		}
+		if (this.addEventListener) this.addEventListener(type, fn, !!arguments[2]);
+		else this.attachEvent('on' + type, fn);
+		return this;
+	},
+
+	removeListener: function(type, fn){
+		if (this.removeEventListener) this.removeEventListener(type, fn, !!arguments[2]);
+		else this.detachEvent('on' + type, fn);
+		return this;
+	},
+
+	retrieve: function(property, dflt){
+		var storage = get(Slick.uidOf(this)), prop = storage[property];
+		if (dflt != null && prop == null) prop = storage[property] = dflt;
+		return prop != null ? prop : null;
+	},
+
+	store: function(property, value){
+		var storage = get(Slick.uidOf(this));
+		storage[property] = value;
+		return this;
+	},
+
+	eliminate: function(property){
+		var storage = get(Slick.uidOf(this));
+		delete storage[property];
+		return this;
+	}
+
+});
+
+/*<ltIE9>*/
+if (window.attachEvent && !window.addEventListener) window.addListener('unload', function(){
+	Object.each(collected, clean);
+	if (window.CollectGarbage) CollectGarbage();
+});
+/*</ltIE9>*/
+
+Element.Properties = {};
+
+//<1.2compat>
+
+Element.Properties = new Hash;
+
+//</1.2compat>
+
+Element.Properties.style = {
+
+	set: function(style){
+		this.style.cssText = style;
+	},
+
+	get: function(){
+		return this.style.cssText;
+	},
+
+	erase: function(){
+		this.style.cssText = '';
+	}
+
+};
+
+Element.Properties.tag = {
+
+	get: function(){
+		return this.tagName.toLowerCase();
+	}
+
+};
+
+Element.Properties.html = {
+
+	set: function(html){
+		if (html == null) html = '';
+		else if (typeOf(html) == 'array') html = html.join('');
+		this.innerHTML = html;
+	},
+
+	erase: function(){
+		this.innerHTML = '';
+	}
+
+};
+
+/*<ltIE9>*/
+// technique by jdbarlett - http://jdbartlett.com/innershiv/
+var div = document.createElement('div');
+div.innerHTML = '<nav></nav>';
+var supportsHTML5Elements = (div.childNodes.length == 1);
+if (!supportsHTML5Elements){
+	var tags = 'abbr article aside audio canvas datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video'.split(' '),
+		fragment = document.createDocumentFragment(), l = tags.length;
+	while (l--) fragment.createElement(tags[l]);
+}
+div = null;
+/*</ltIE9>*/
+
+/*<IE>*/
+var supportsTableInnerHTML = Function.attempt(function(){
+	var table = document.createElement('table');
+	table.innerHTML = '<tr><td></td></tr>';
+	return true;
+});
+
+/*<ltFF4>*/
+var tr = document.createElement('tr'), html = '<td></td>';
+tr.innerHTML = html;
+var supportsTRInnerHTML = (tr.innerHTML == html);
+tr = null;
+/*</ltFF4>*/
+
+if (!supportsTableInnerHTML || !supportsTRInnerHTML || !supportsHTML5Elements){
+
+	Element.Properties.html.set = (function(set){
+
+		var translations = {
+			table: [1, '<table>', '</table>'],
+			select: [1, '<select>', '</select>'],
+			tbody: [2, '<table><tbody>', '</tbody></table>'],
+			tr: [3, '<table><tbody><tr>', '</tr></tbody></table>']
+		};
+
+		translations.thead = translations.tfoot = translations.tbody;
+
+		return function(html){
+			var wrap = translations[this.get('tag')];
+			if (!wrap && !supportsHTML5Elements) wrap = [0, '', ''];
+			if (!wrap) return set.call(this, html);
+
+			var level = wrap[0], wrapper = document.createElement('div'), target = wrapper;
+			if (!supportsHTML5Elements) fragment.appendChild(wrapper);
+			wrapper.innerHTML = [wrap[1], html, wrap[2]].flatten().join('');
+			while (level--) target = target.firstChild;
+			this.empty().adopt(target.childNodes);
+			if (!supportsHTML5Elements) fragment.removeChild(wrapper);
+			wrapper = null;
+		};
+
+	})(Element.Properties.html.set);
+}
+/*</IE>*/
+
+/*<ltIE9>*/
+var testForm = document.createElement('form');
+testForm.innerHTML = '<select><option>s</option></select>';
+
+if (testForm.firstChild.value != 's') Element.Properties.value = {
+
+	set: function(value){
+		var tag = this.get('tag');
+		if (tag != 'select') return this.setProperty('value', value);
+		var options = this.getElements('option');
+		for (var i = 0; i < options.length; i++){
+			var option = options[i],
+				attr = option.getAttributeNode('value'),
+				optionValue = (attr && attr.specified) ? option.value : option.get('text');
+			if (optionValue == value) return option.selected = true;
+		}
+	},
+
+	get: function(){
+		var option = this, tag = option.get('tag');
+
+		if (tag != 'select' && tag != 'option') return this.getProperty('value');
+
+		if (tag == 'select' && !(option = option.getSelected()[0])) return '';
+
+		var attr = option.getAttributeNode('value');
+		return (attr && attr.specified) ? option.value : option.get('text');
+	}
+
+};
+testForm = null;
+/*</ltIE9>*/
+
+/*<IE>*/
+if (document.createElement('div').getAttributeNode('id')) Element.Properties.id = {
+	set: function(id){
+		this.id = this.getAttributeNode('id').value = id;
+	},
+	get: function(){
+		return this.id || null;
+	},
+	erase: function(){
+		this.id = this.getAttributeNode('id').value = '';
+	}
+};
+/*</IE>*/
+
+})();
+
+
+/*
+---
+
+name: Element.Style
+
+description: Contains methods for interacting with the styles of Elements in a fashionable way.
+
+license: MIT-style license.
+
+requires: Element
+
+provides: Element.Style
+
+...
+*/
+
+(function(){
+
+var html = document.html;
+
+//<ltIE9>
+// Check for oldIE, which does not remove styles when they're set to null
+var el = document.createElement('div');
+el.style.color = 'red';
+el.style.color = null;
+var doesNotRemoveStyles = el.style.color == 'red';
+el = null;
+//</ltIE9>
+
+Element.Properties.styles = {set: function(styles){
+	this.setStyles(styles);
+}};
+
+var hasOpacity = (html.style.opacity != null),
+	hasFilter = (html.style.filter != null),
+	reAlpha = /alpha\(opacity=([\d.]+)\)/i;
+
+var setVisibility = function(element, opacity){
+	element.store('$opacity', opacity);
+	element.style.visibility = opacity > 0 || opacity == null ? 'visible' : 'hidden';
+};
+
+var setOpacity = (hasOpacity ? function(element, opacity){
+	element.style.opacity = opacity;
+} : (hasFilter ? function(element, opacity){
+	var style = element.style;
+	if (!element.currentStyle || !element.currentStyle.hasLayout) style.zoom = 1;
+	if (opacity == null || opacity == 1) opacity = '';
+	else opacity = 'alpha(opacity=' + (opacity * 100).limit(0, 100).round() + ')';
+	var filter = style.filter || element.getComputedStyle('filter') || '';
+	style.filter = reAlpha.test(filter) ? filter.replace(reAlpha, opacity) : filter + opacity;
+	if (!style.filter) style.removeAttribute('filter');
+} : setVisibility));
+
+var getOpacity = (hasOpacity ? function(element){
+	var opacity = element.style.opacity || element.getComputedStyle('opacity');
+	return (opacity == '') ? 1 : opacity.toFloat();
+} : (hasFilter ? function(element){
+	var filter = (element.style.filter || element.getComputedStyle('filter')),
+		opacity;
+	if (filter) opacity = filter.match(reAlpha);
+	return (opacity == null || filter == null) ? 1 : (opacity[1] / 100);
+} : function(element){
+	var opacity = element.retrieve('$opacity');
+	if (opacity == null) opacity = (element.style.visibility == 'hidden' ? 0 : 1);
+	return opacity;
+}));
+
+var floatName = (html.style.cssFloat == null) ? 'styleFloat' : 'cssFloat';
+
+Element.implement({
+
+	getComputedStyle: function(property){
+		if (this.currentStyle) return this.currentStyle[property.camelCase()];
+		var defaultView = Element.getDocument(this).defaultView,
+			computed = defaultView ? defaultView.getComputedStyle(this, null) : null;
+		return (computed) ? computed.getPropertyValue((property == floatName) ? 'float' : property.hyphenate()) : null;
+	},
+
+	setStyle: function(property, value){
+		if (property == 'opacity'){
+			if (value != null) value = parseFloat(value);
+			setOpacity(this, value);
+			return this;
+		}
+		property = (property == 'float' ? floatName : property).camelCase();
+		if (typeOf(value) != 'string'){
+			var map = (Element.Styles[property] || '@').split(' ');
+			value = Array.from(value).map(function(val, i){
+				if (!map[i]) return '';
+				return (typeOf(val) == 'number') ? map[i].replace('@', Math.round(val)) : val;
+			}).join(' ');
+		} else if (value == String(Number(value))){
+			value = Math.round(value);
+		}
+		this.style[property] = value;
+		//<ltIE9>
+		if ((value == '' || value == null) && doesNotRemoveStyles && this.style.removeAttribute){
+			this.style.removeAttribute(property);
+		}
+		//</ltIE9>
+		return this;
+	},
+
+	getStyle: function(property){
+		if (property == 'opacity') return getOpacity(this);
+		property = (property == 'float' ? floatName : property).camelCase();
+		var result = this.style[property];
+		if (!result || property == 'zIndex'){
+			result = [];
+			for (var style in Element.ShortStyles){
+				if (property != style) continue;
+				for (var s in Element.ShortStyles[style]) result.push(this.getStyle(s));
+				return result.join(' ');
+			}
+			result = this.getComputedStyle(property);
+		}
+		if (result){
+			result = String(result);
+			var color = result.match(/rgba?\([\d\s,]+\)/);
+			if (color) result = result.replace(color[0], color[0].rgbToHex());
+		}
+		if (Browser.opera || Browser.ie){
+			if ((/^(height|width)$/).test(property) && !(/px$/.test(result))){
+				var values = (property == 'width') ? ['left', 'right'] : ['top', 'bottom'], size = 0;
+				values.each(function(value){
+					size += this.getStyle('border-' + value + '-width').toInt() + this.getStyle('padding-' + value).toInt();
+				}, this);
+				return this['offset' + property.capitalize()] - size + 'px';
+			}
+			if (Browser.ie && (/^border(.+)Width|margin|padding/).test(property) && isNaN(parseFloat(result))){
+				return '0px';
+			}
+		}
+		return result;
+	},
+
+	setStyles: function(styles){
+		for (var style in styles) this.setStyle(style, styles[style]);
+		return this;
+	},
+
+	getStyles: function(){
+		var result = {};
+		Array.flatten(arguments).each(function(key){
+			result[key] = this.getStyle(key);
+		}, this);
+		return result;
+	}
+
+});
+
+Element.Styles = {
+	left: '@px', top: '@px', bottom: '@px', right: '@px',
+	width: '@px', height: '@px', maxWidth: '@px', maxHeight: '@px', minWidth: '@px', minHeight: '@px',
+	backgroundColor: 'rgb(@, @, @)', backgroundPosition: '@px @px', color: 'rgb(@, @, @)',
+	fontSize: '@px', letterSpacing: '@px', lineHeight: '@px', clip: 'rect(@px @px @px @px)',
+	margin: '@px @px @px @px', padding: '@px @px @px @px', border: '@px @ rgb(@, @, @) @px @ rgb(@, @, @) @px @ rgb(@, @, @)',
+	borderWidth: '@px @px @px @px', borderStyle: '@ @ @ @', borderColor: 'rgb(@, @, @) rgb(@, @, @) rgb(@, @, @) rgb(@, @, @)',
+	zIndex: '@', 'zoom': '@', fontWeight: '@', textIndent: '@px', opacity: '@'
+};
+
+//<1.3compat>
+
+Element.implement({
+
+	setOpacity: function(value){
+		setOpacity(this, value);
+		return this;
+	},
+
+	getOpacity: function(){
+		return getOpacity(this);
+	}
+
+});
+
+Element.Properties.opacity = {
+
+	set: function(opacity){
+		setOpacity(this, opacity);
+		setVisibility(this, opacity);
+	},
+
+	get: function(){
+		return getOpacity(this);
+	}
+
+};
+
+//</1.3compat>
+
+//<1.2compat>
+
+Element.Styles = new Hash(Element.Styles);
+
+//</1.2compat>
+
+Element.ShortStyles = {margin: {}, padding: {}, border: {}, borderWidth: {}, borderStyle: {}, borderColor: {}};
+
+['Top', 'Right', 'Bottom', 'Left'].each(function(direction){
+	var Short = Element.ShortStyles;
+	var All = Element.Styles;
+	['margin', 'padding'].each(function(style){
+		var sd = style + direction;
+		Short[style][sd] = All[sd] = '@px';
+	});
+	var bd = 'border' + direction;
+	Short.border[bd] = All[bd] = '@px @ rgb(@, @, @)';
+	var bdw = bd + 'Width', bds = bd + 'Style', bdc = bd + 'Color';
+	Short[bd] = {};
+	Short.borderWidth[bdw] = Short[bd][bdw] = All[bdw] = '@px';
+	Short.borderStyle[bds] = Short[bd][bds] = All[bds] = '@';
+	Short.borderColor[bdc] = Short[bd][bdc] = All[bdc] = 'rgb(@, @, @)';
+});
+
+})();
+
+
+/*
+---
+
+name: Element.Event
+
+description: Contains Element methods for dealing with events. This file also includes mouseenter and mouseleave custom Element Events, if necessary.
+
+license: MIT-style license.
+
+requires: [Element, Event]
+
+provides: Element.Event
+
+...
+*/
+
+(function(){
+
+Element.Properties.events = {set: function(events){
+	this.addEvents(events);
+}};
+
+[Element, Window, Document].invoke('implement', {
+
+	addEvent: function(type, fn){
+		var events = this.retrieve('events', {});
+		if (!events[type]) events[type] = {keys: [], values: []};
+		if (events[type].keys.contains(fn)) return this;
+		events[type].keys.push(fn);
+		var realType = type,
+			custom = Element.Events[type],
+			condition = fn,
+			self = this;
+		if (custom){
+			if (custom.onAdd) custom.onAdd.call(this, fn, type);
+			if (custom.condition){
+				condition = function(event){
+					if (custom.condition.call(this, event, type)) return fn.call(this, event);
+					return true;
+				};
+			}
+			if (custom.base) realType = Function.from(custom.base).call(this, type);
+		}
+		var defn = function(){
+			return fn.call(self);
+		};
+		var nativeEvent = Element.NativeEvents[realType];
+		if (nativeEvent){
+			if (nativeEvent == 2){
+				defn = function(event){
+					event = new DOMEvent(event, self.getWindow());
+					if (condition.call(self, event) === false) event.stop();
+				};
+			}
+			this.addListener(realType, defn, arguments[2]);
+		}
+		events[type].values.push(defn);
+		return this;
+	},
+
+	removeEvent: function(type, fn){
+		var events = this.retrieve('events');
+		if (!events || !events[type]) return this;
+		var list = events[type];
+		var index = list.keys.indexOf(fn);
+		if (index == -1) return this;
+		var value = list.values[index];
+		delete list.keys[index];
+		delete list.values[index];
+		var custom = Element.Events[type];
+		if (custom){
+			if (custom.onRemove) custom.onRemove.call(this, fn, type);
+			if (custom.base) type = Function.from(custom.base).call(this, type);
+		}
+		return (Element.NativeEvents[type]) ? this.removeListener(type, value, arguments[2]) : this;
+	},
+
+	addEvents: function(events){
+		for (var event in events) this.addEvent(event, events[event]);
+		return this;
+	},
+
+	removeEvents: function(events){
+		var type;
+		if (typeOf(events) == 'object'){
+			for (type in events) this.removeEvent(type, events[type]);
+			return this;
+		}
+		var attached = this.retrieve('events');
+		if (!attached) return this;
+		if (!events){
+			for (type in attached) this.removeEvents(type);
+			this.eliminate('events');
+		} else if (attached[events]){
+			attached[events].keys.each(function(fn){
+				this.removeEvent(events, fn);
+			}, this);
+			delete attached[events];
+		}
+		return this;
+	},
+
+	fireEvent: function(type, args, delay){
+		var events = this.retrieve('events');
+		if (!events || !events[type]) return this;
+		args = Array.from(args);
+
+		events[type].keys.each(function(fn){
+			if (delay) fn.delay(delay, this, args);
+			else fn.apply(this, args);
+		}, this);
+		return this;
+	},
+
+	cloneEvents: function(from, type){
+		from = document.id(from);
+		var events = from.retrieve('events');
+		if (!events) return this;
+		if (!type){
+			for (var eventType in events) this.cloneEvents(from, eventType);
+		} else if (events[type]){
+			events[type].keys.each(function(fn){
+				this.addEvent(type, fn);
+			}, this);
+		}
+		return this;
+	}
+
+});
+
+Element.NativeEvents = {
+	click: 2, dblclick: 2, mouseup: 2, mousedown: 2, contextmenu: 2, //mouse buttons
+	mousewheel: 2, DOMMouseScroll: 2, //mouse wheel
+	mouseover: 2, mouseout: 2, mousemove: 2, selectstart: 2, selectend: 2, //mouse movement
+	keydown: 2, keypress: 2, keyup: 2, //keyboard
+	orientationchange: 2, // mobile
+	touchstart: 2, touchmove: 2, touchend: 2, touchcancel: 2, // touch
+	gesturestart: 2, gesturechange: 2, gestureend: 2, // gesture
+	focus: 2, blur: 2, change: 2, reset: 2, select: 2, submit: 2, paste: 2, input: 2, //form elements
+	load: 2, unload: 1, beforeunload: 2, resize: 1, move: 1, DOMContentLoaded: 1, readystatechange: 1, //window
+	error: 1, abort: 1, scroll: 1 //misc
+};
+
+Element.Events = {mousewheel: {
+	base: (Browser.firefox) ? 'DOMMouseScroll' : 'mousewheel'
+}};
+
+if ('onmouseenter' in document.documentElement){
+	Element.NativeEvents.mouseenter = Element.NativeEvents.mouseleave = 2;
+} else {
+	var check = function(event){
+		var related = event.relatedTarget;
+		if (related == null) return true;
+		if (!related) return false;
+		return (related != this && related.prefix != 'xul' && typeOf(this) != 'document' && !this.contains(related));
+	};
+
+	Element.Events.mouseenter = {
+		base: 'mouseover',
+		condition: check
+	};
+
+	Element.Events.mouseleave = {
+		base: 'mouseout',
+		condition: check
+	};
+}
+
+/*<ltIE9>*/
+if (!window.addEventListener){
+	Element.NativeEvents.propertychange = 2;
+	Element.Events.change = {
+		base: function(){
+			var type = this.type;
+			return (this.get('tag') == 'input' && (type == 'radio' || type == 'checkbox')) ? 'propertychange' : 'change'
+		},
+		condition: function(event){
+			return this.type != 'radio' || (event.event.propertyName == 'checked' && this.checked);
+		}
+	}
+}
+/*</ltIE9>*/
+
+//<1.2compat>
+
+Element.Events = new Hash(Element.Events);
+
+//</1.2compat>
+
+})();
+
+
+/*
+---
+
+name: Element.Delegation
+
+description: Extends the Element native object to include the delegate method for more efficient event management.
+
+license: MIT-style license.
+
+requires: [Element.Event]
+
+provides: [Element.Delegation]
+
+...
+*/
+
+(function(){
+
+var eventListenerSupport = !!window.addEventListener;
+
+Element.NativeEvents.focusin = Element.NativeEvents.focusout = 2;
+
+var bubbleUp = function(self, match, fn, event, target){
+	while (target && target != self){
+		if (match(target, event)) return fn.call(target, event, target);
+		target = document.id(target.parentNode);
+	}
+};
+
+var map = {
+	mouseenter: {
+		base: 'mouseover'
+	},
+	mouseleave: {
+		base: 'mouseout'
+	},
+	focus: {
+		base: 'focus' + (eventListenerSupport ? '' : 'in'),
+		capture: true
+	},
+	blur: {
+		base: eventListenerSupport ? 'blur' : 'focusout',
+		capture: true
+	}
+};
+
+/*<ltIE9>*/
+var _key = '$delegation:';
+var formObserver = function(type){
+
+	return {
+
+		base: 'focusin',
+
+		remove: function(self, uid){
+			var list = self.retrieve(_key + type + 'listeners', {})[uid];
+			if (list && list.forms) for (var i = list.forms.length; i--;){
+				list.forms[i].removeEvent(type, list.fns[i]);
+			}
+		},
+
+		listen: function(self, match, fn, event, target, uid){
+			var form = (target.get('tag') == 'form') ? target : event.target.getParent('form');
+			if (!form) return;
+
+			var listeners = self.retrieve(_key + type + 'listeners', {}),
+				listener = listeners[uid] || {forms: [], fns: []},
+				forms = listener.forms, fns = listener.fns;
+
+			if (forms.indexOf(form) != -1) return;
+			forms.push(form);
+
+			var _fn = function(event){
+				bubbleUp(self, match, fn, event, target);
+			};
+			form.addEvent(type, _fn);
+			fns.push(_fn);
+
+			listeners[uid] = listener;
+			self.store(_key + type + 'listeners', listeners);
+		}
+	};
+};
+
+var inputObserver = function(type){
+	return {
+		base: 'focusin',
+		listen: function(self, match, fn, event, target){
+			var events = {blur: function(){
+				this.removeEvents(events);
+			}};
+			events[type] = function(event){
+				bubbleUp(self, match, fn, event, target);
+			};
+			event.target.addEvents(events);
+		}
+	};
+};
+
+if (!eventListenerSupport) Object.append(map, {
+	submit: formObserver('submit'),
+	reset: formObserver('reset'),
+	change: inputObserver('change'),
+	select: inputObserver('select')
+});
+/*</ltIE9>*/
+
+var proto = Element.prototype,
+	addEvent = proto.addEvent,
+	removeEvent = proto.removeEvent;
+
+var relay = function(old, method){
+	return function(type, fn, useCapture){
+		if (type.indexOf(':relay') == -1) return old.call(this, type, fn, useCapture);
+		var parsed = Slick.parse(type).expressions[0][0];
+		if (parsed.pseudos[0].key != 'relay') return old.call(this, type, fn, useCapture);
+		var newType = parsed.tag;
+		parsed.pseudos.slice(1).each(function(pseudo){
+			newType += ':' + pseudo.key + (pseudo.value ? '(' + pseudo.value + ')' : '');
+		});
+		old.call(this, type, fn);
+		return method.call(this, newType, parsed.pseudos[0].value, fn);
+	};
+};
+
+var delegation = {
+
+	addEvent: function(type, match, fn){
+		var storage = this.retrieve('$delegates', {}), stored = storage[type];
+		if (stored) for (var _uid in stored){
+			if (stored[_uid].fn == fn && stored[_uid].match == match) return this;
+		}
+
+		var _type = type, _match = match, _fn = fn, _map = map[type] || {};
+		type = _map.base || _type;
+
+		match = function(target){
+			return Slick.match(target, _match);
+		};
+
+		var elementEvent = Element.Events[_type];
+		if (elementEvent && elementEvent.condition){
+			var __match = match, condition = elementEvent.condition;
+			match = function(target, event){
+				return __match(target, event) && condition.call(target, event, type);
+			};
+		}
+
+		var self = this, uid = String.uniqueID();
+		var delegator = _map.listen ? function(event, target){
+			if (!target && event && event.target) target = event.target;
+			if (target) _map.listen(self, match, fn, event, target, uid);
+		} : function(event, target){
+			if (!target && event && event.target) target = event.target;
+			if (target) bubbleUp(self, match, fn, event, target);
+		};
+
+		if (!stored) stored = {};
+		stored[uid] = {
+			match: _match,
+			fn: _fn,
+			delegator: delegator
+		};
+		storage[_type] = stored;
+		return addEvent.call(this, type, delegator, _map.capture);
+	},
+
+	removeEvent: function(type, match, fn, _uid){
+		var storage = this.retrieve('$delegates', {}), stored = storage[type];
+		if (!stored) return this;
+
+		if (_uid){
+			var _type = type, delegator = stored[_uid].delegator, _map = map[type] || {};
+			type = _map.base || _type;
+			if (_map.remove) _map.remove(this, _uid);
+			delete stored[_uid];
+			storage[_type] = stored;
+			return removeEvent.call(this, type, delegator);
+		}
+
+		var __uid, s;
+		if (fn) for (__uid in stored){
+			s = stored[__uid];
+			if (s.match == match && s.fn == fn) return delegation.removeEvent.call(this, type, match, fn, __uid);
+		} else for (__uid in stored){
+			s = stored[__uid];
+			if (s.match == match) delegation.removeEvent.call(this, type, match, s.fn, __uid);
+		}
+		return this;
+	}
+
+};
+
+[Element, Window, Document].invoke('implement', {
+	addEvent: relay(addEvent, delegation.addEvent),
+	removeEvent: relay(removeEvent, delegation.removeEvent)
+});
+
+})();
+
+
+/*
+---
+
+name: Element.Dimensions
+
+description: Contains methods to work with size, scroll, or positioning of Elements and the window object.
+
+license: MIT-style license.
+
+credits:
+  - Element positioning based on the [qooxdoo](http://qooxdoo.org/) code and smart browser fixes, [LGPL License](http://www.gnu.org/licenses/lgpl.html).
+  - Viewport dimensions based on [YUI](http://developer.yahoo.com/yui/) code, [BSD License](http://developer.yahoo.com/yui/license.html).
+
+requires: [Element, Element.Style]
+
+provides: [Element.Dimensions]
+
+...
+*/
+
+(function(){
+
+var element = document.createElement('div'),
+	child = document.createElement('div');
+element.style.height = '0';
+element.appendChild(child);
+var brokenOffsetParent = (child.offsetParent === element);
+element = child = null;
+
+var isOffset = function(el){
+	return styleString(el, 'position') != 'static' || isBody(el);
+};
+
+var isOffsetStatic = function(el){
+	return isOffset(el) || (/^(?:table|td|th)$/i).test(el.tagName);
+};
+
+Element.implement({
+
+	scrollTo: function(x, y){
+		if (isBody(this)){
+			this.getWindow().scrollTo(x, y);
+		} else {
+			this.scrollLeft = x;
+			this.scrollTop = y;
+		}
+		return this;
+	},
+
+	getSize: function(){
+		if (isBody(this)) return this.getWindow().getSize();
+		return {x: this.offsetWidth, y: this.offsetHeight};
+	},
+
+	getScrollSize: function(){
+		if (isBody(this)) return this.getWindow().getScrollSize();
+		return {x: this.scrollWidth, y: this.scrollHeight};
+	},
+
+	getScroll: function(){
+		if (isBody(this)) return this.getWindow().getScroll();
+		return {x: this.scrollLeft, y: this.scrollTop};
+	},
+
+	getScrolls: function(){
+		var element = this.parentNode, position = {x: 0, y: 0};
+		while (element && !isBody(element)){
+			position.x += element.scrollLeft;
+			position.y += element.scrollTop;
+			element = element.parentNode;
+		}
+		return position;
+	},
+
+	getOffsetParent: brokenOffsetParent ? function(){
+		var element = this;
+		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
+
+		var isOffsetCheck = (styleString(element, 'position') == 'static') ? isOffsetStatic : isOffset;
+		while ((element = element.parentNode)){
+			if (isOffsetCheck(element)) return element;
+		}
+		return null;
+	} : function(){
+		var element = this;
+		if (isBody(element) || styleString(element, 'position') == 'fixed') return null;
+
+		try {
+			return element.offsetParent;
+		} catch(e) {}
+		return null;
+	},
+
+	getOffsets: function(){
+		if (this.getBoundingClientRect && !Browser.Platform.ios){
+			var bound = this.getBoundingClientRect(),
+				html = document.id(this.getDocument().documentElement),
+				htmlScroll = html.getScroll(),
+				elemScrolls = this.getScrolls(),
+				isFixed = (styleString(this, 'position') == 'fixed');
+
+			return {
+				x: bound.left.toInt() + elemScrolls.x + ((isFixed) ? 0 : htmlScroll.x) - html.clientLeft,
+				y: bound.top.toInt()  + elemScrolls.y + ((isFixed) ? 0 : htmlScroll.y) - html.clientTop
+			};
+		}
+
+		var element = this, position = {x: 0, y: 0};
+		if (isBody(this)) return position;
+
+		while (element && !isBody(element)){
+			position.x += element.offsetLeft;
+			position.y += element.offsetTop;
+
+			if (Browser.firefox){
+				if (!borderBox(element)){
+					position.x += leftBorder(element);
+					position.y += topBorder(element);
+				}
+				var parent = element.parentNode;
+				if (parent && styleString(parent, 'overflow') != 'visible'){
+					position.x += leftBorder(parent);
+					position.y += topBorder(parent);
+				}
+			} else if (element != this && Browser.safari){
+				position.x += leftBorder(element);
+				position.y += topBorder(element);
+			}
+
+			element = element.offsetParent;
+		}
+		if (Browser.firefox && !borderBox(this)){
+			position.x -= leftBorder(this);
+			position.y -= topBorder(this);
+		}
+		return position;
+	},
+
+	getPosition: function(relative){
+		var offset = this.getOffsets(),
+			scroll = this.getScrolls();
+		var position = {
+			x: offset.x - scroll.x,
+			y: offset.y - scroll.y
+		};
+
+		if (relative && (relative = document.id(relative))){
+			var relativePosition = relative.getPosition();
+			return {x: position.x - relativePosition.x - leftBorder(relative), y: position.y - relativePosition.y - topBorder(relative)};
+		}
+		return position;
+	},
+
+	getCoordinates: function(element){
+		if (isBody(this)) return this.getWindow().getCoordinates();
+		var position = this.getPosition(element),
+			size = this.getSize();
+		var obj = {
+			left: position.x,
+			top: position.y,
+			width: size.x,
+			height: size.y
+		};
+		obj.right = obj.left + obj.width;
+		obj.bottom = obj.top + obj.height;
+		return obj;
+	},
+
+	computePosition: function(obj){
+		return {
+			left: obj.x - styleNumber(this, 'margin-left'),
+			top: obj.y - styleNumber(this, 'margin-top')
+		};
+	},
+
+	setPosition: function(obj){
+		return this.setStyles(this.computePosition(obj));
+	}
+
+});
+
+
+[Document, Window].invoke('implement', {
+
+	getSize: function(){
+		var doc = getCompatElement(this);
+		return {x: doc.clientWidth, y: doc.clientHeight};
+	},
+
+	getScroll: function(){
+		var win = this.getWindow(), doc = getCompatElement(this);
+		return {x: win.pageXOffset || doc.scrollLeft, y: win.pageYOffset || doc.scrollTop};
+	},
+
+	getScrollSize: function(){
+		var doc = getCompatElement(this),
+			min = this.getSize(),
+			body = this.getDocument().body;
+
+		return {x: Math.max(doc.scrollWidth, body.scrollWidth, min.x), y: Math.max(doc.scrollHeight, body.scrollHeight, min.y)};
+	},
+
+	getPosition: function(){
+		return {x: 0, y: 0};
+	},
+
+	getCoordinates: function(){
+		var size = this.getSize();
+		return {top: 0, left: 0, bottom: size.y, right: size.x, height: size.y, width: size.x};
+	}
+
+});
+
+// private methods
+
+var styleString = Element.getComputedStyle;
+
+function styleNumber(element, style){
+	return styleString(element, style).toInt() || 0;
+}
+
+function borderBox(element){
+	return styleString(element, '-moz-box-sizing') == 'border-box';
+}
+
+function topBorder(element){
+	return styleNumber(element, 'border-top-width');
+}
+
+function leftBorder(element){
+	return styleNumber(element, 'border-left-width');
+}
+
+function isBody(element){
+	return (/^(?:body|html)$/i).test(element.tagName);
+}
+
+function getCompatElement(element){
+	var doc = element.getDocument();
+	return (!doc.compatMode || doc.compatMode == 'CSS1Compat') ? doc.html : doc.body;
+}
+
+})();
+
+//aliases
+Element.alias({position: 'setPosition'}); //compatability
+
+[Window, Document, Element].invoke('implement', {
+
+	getHeight: function(){
+		return this.getSize().y;
+	},
+
+	getWidth: function(){
+		return this.getSize().x;
+	},
+
+	getScrollTop: function(){
+		return this.getScroll().y;
+	},
+
+	getScrollLeft: function(){
+		return this.getScroll().x;
+	},
+
+	getScrollHeight: function(){
+		return this.getScrollSize().y;
+	},
+
+	getScrollWidth: function(){
+		return this.getScrollSize().x;
+	},
+
+	getTop: function(){
+		return this.getPosition().y;
+	},
+
+	getLeft: function(){
+		return this.getPosition().x;
+	}
+
+});
+
+
+/*
+---
+
+name: Fx
+
+description: Contains the basic animation logic to be extended by all other Fx Classes.
+
+license: MIT-style license.
+
+requires: [Chain, Events, Options]
+
+provides: Fx
+
+...
+*/
+
+(function(){
+
+var Fx = this.Fx = new Class({
+
+	Implements: [Chain, Events, Options],
+
+	options: {
+		/*
+		onStart: nil,
+		onCancel: nil,
+		onComplete: nil,
+		*/
+		fps: 60,
+		unit: false,
+		duration: 500,
+		frames: null,
+		frameSkip: true,
+		link: 'ignore'
+	},
+
+	initialize: function(options){
+		this.subject = this.subject || this;
+		this.setOptions(options);
+	},
+
+	getTransition: function(){
+		return function(p){
+			return -(Math.cos(Math.PI * p) - 1) / 2;
+		};
+	},
+
+	step: function(now){
+		if (this.options.frameSkip){
+			var diff = (this.time != null) ? (now - this.time) : 0, frames = diff / this.frameInterval;
+			this.time = now;
+			this.frame += frames;
+		} else {
+			this.frame++;
+		}
+
+		if (this.frame < this.frames){
+			var delta = this.transition(this.frame / this.frames);
+			this.set(this.compute(this.from, this.to, delta));
+		} else {
+			this.frame = this.frames;
+			this.set(this.compute(this.from, this.to, 1));
+			this.stop();
+		}
+	},
+
+	set: function(now){
+		return now;
+	},
+
+	compute: function(from, to, delta){
+		return Fx.compute(from, to, delta);
+	},
+
+	check: function(){
+		if (!this.isRunning()) return true;
+		switch (this.options.link){
+			case 'cancel': this.cancel(); return true;
+			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
+		}
+		return false;
+	},
+
+	start: function(from, to){
+		if (!this.check(from, to)) return this;
+		this.from = from;
+		this.to = to;
+		this.frame = (this.options.frameSkip) ? 0 : -1;
+		this.time = null;
+		this.transition = this.getTransition();
+		var frames = this.options.frames, fps = this.options.fps, duration = this.options.duration;
+		this.duration = Fx.Durations[duration] || duration.toInt();
+		this.frameInterval = 1000 / fps;
+		this.frames = frames || Math.round(this.duration / this.frameInterval);
+		this.fireEvent('start', this.subject);
+		pushInstance.call(this, fps);
+		return this;
+	},
+
+	stop: function(){
+		if (this.isRunning()){
+			this.time = null;
+			pullInstance.call(this, this.options.fps);
+			if (this.frames == this.frame){
+				this.fireEvent('complete', this.subject);
+				if (!this.callChain()) this.fireEvent('chainComplete', this.subject);
+			} else {
+				this.fireEvent('stop', this.subject);
+			}
+		}
+		return this;
+	},
+
+	cancel: function(){
+		if (this.isRunning()){
+			this.time = null;
+			pullInstance.call(this, this.options.fps);
+			this.frame = this.frames;
+			this.fireEvent('cancel', this.subject).clearChain();
+		}
+		return this;
+	},
+
+	pause: function(){
+		if (this.isRunning()){
+			this.time = null;
+			pullInstance.call(this, this.options.fps);
+		}
+		return this;
+	},
+
+	resume: function(){
+		if ((this.frame < this.frames) && !this.isRunning()) pushInstance.call(this, this.options.fps);
+		return this;
+	},
+
+	isRunning: function(){
+		var list = instances[this.options.fps];
+		return list && list.contains(this);
+	}
+
+});
+
+Fx.compute = function(from, to, delta){
+	return (to - from) * delta + from;
+};
+
+Fx.Durations = {'short': 250, 'normal': 500, 'long': 1000};
+
+// global timers
+
+var instances = {}, timers = {};
+
+var loop = function(){
+	var now = Date.now();
+	for (var i = this.length; i--;){
+		var instance = this[i];
+		if (instance) instance.step(now);
+	}
+};
+
+var pushInstance = function(fps){
+	var list = instances[fps] || (instances[fps] = []);
+	list.push(this);
+	if (!timers[fps]) timers[fps] = loop.periodical(Math.round(1000 / fps), list);
+};
+
+var pullInstance = function(fps){
+	var list = instances[fps];
+	if (list){
+		list.erase(this);
+		if (!list.length && timers[fps]){
+			delete instances[fps];
+			timers[fps] = clearInterval(timers[fps]);
+		}
+	}
+};
+
+})();
+
+
+/*
+---
+
+name: Fx.CSS
+
+description: Contains the CSS animation logic. Used by Fx.Tween, Fx.Morph, Fx.Elements.
+
+license: MIT-style license.
+
+requires: [Fx, Element.Style]
+
+provides: Fx.CSS
+
+...
+*/
+
+Fx.CSS = new Class({
+
+	Extends: Fx,
+
+	//prepares the base from/to object
+
+	prepare: function(element, property, values){
+		values = Array.from(values);
+		var from = values[0], to = values[1];
+		if (to == null){
+			to = from;
+			from = element.getStyle(property);
+			var unit = this.options.unit;
+			// adapted from: https://github.com/ryanmorr/fx/blob/master/fx.js#L299
+			if (unit && from.slice(-unit.length) != unit && parseFloat(from) != 0){
+				element.setStyle(property, to + unit);
+				var value = element.getComputedStyle(property);
+				// IE and Opera support pixelLeft or pixelWidth
+				if (!(/px$/.test(value))){
+					value = element.style[('pixel-' + property).camelCase()];
+					if (value == null){
+						// adapted from Dean Edwards' http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+						var left = element.style.left;
+						element.style.left = to + unit;
+						value = element.style.pixelLeft;
+						element.style.left = left;
+					}
+				}
+				from = (to || 1) / (parseFloat(value) || 1) * (parseFloat(from) || 0);
+				element.setStyle(property, from + unit);
+			}
+		}
+		return {from: this.parse(from), to: this.parse(to)};
+	},
+
+	//parses a value into an array
+
+	parse: function(value){
+		value = Function.from(value)();
+		value = (typeof value == 'string') ? value.split(' ') : Array.from(value);
+		return value.map(function(val){
+			val = String(val);
+			var found = false;
+			Object.each(Fx.CSS.Parsers, function(parser, key){
+				if (found) return;
+				var parsed = parser.parse(val);
+				if (parsed || parsed === 0) found = {value: parsed, parser: parser};
+			});
+			found = found || {value: val, parser: Fx.CSS.Parsers.String};
+			return found;
+		});
+	},
+
+	//computes by a from and to prepared objects, using their parsers.
+
+	compute: function(from, to, delta){
+		var computed = [];
+		(Math.min(from.length, to.length)).times(function(i){
+			computed.push({value: from[i].parser.compute(from[i].value, to[i].value, delta), parser: from[i].parser});
+		});
+		computed.$family = Function.from('fx:css:value');
+		return computed;
+	},
+
+	//serves the value as settable
+
+	serve: function(value, unit){
+		if (typeOf(value) != 'fx:css:value') value = this.parse(value);
+		var returned = [];
+		value.each(function(bit){
+			returned = returned.concat(bit.parser.serve(bit.value, unit));
+		});
+		return returned;
+	},
+
+	//renders the change to an element
+
+	render: function(element, property, value, unit){
+		element.setStyle(property, this.serve(value, unit));
+	},
+
+	//searches inside the page css to find the values for a selector
+
+	search: function(selector){
+		if (Fx.CSS.Cache[selector]) return Fx.CSS.Cache[selector];
+		var to = {}, selectorTest = new RegExp('^' + selector.escapeRegExp() + '$');
+		Array.each(document.styleSheets, function(sheet, j){
+			var href = sheet.href;
+			if (href && href.contains('://') && !href.contains(document.domain)) return;
+			var rules = sheet.rules || sheet.cssRules;
+			Array.each(rules, function(rule, i){
+				if (!rule.style) return;
+				var selectorText = (rule.selectorText) ? rule.selectorText.replace(/^\w+/, function(m){
+					return m.toLowerCase();
+				}) : null;
+				if (!selectorText || !selectorTest.test(selectorText)) return;
+				Object.each(Element.Styles, function(value, style){
+					if (!rule.style[style] || Element.ShortStyles[style]) return;
+					value = String(rule.style[style]);
+					to[style] = ((/^rgb/).test(value)) ? value.rgbToHex() : value;
+				});
+			});
+		});
+		return Fx.CSS.Cache[selector] = to;
+	}
+
+});
+
+Fx.CSS.Cache = {};
+
+Fx.CSS.Parsers = {
+
+	Color: {
+		parse: function(value){
+			if (value.match(/^#[0-9a-f]{3,6}$/i)) return value.hexToRgb(true);
+			return ((value = value.match(/(\d+),\s*(\d+),\s*(\d+)/))) ? [value[1], value[2], value[3]] : false;
+		},
+		compute: function(from, to, delta){
+			return from.map(function(value, i){
+				return Math.round(Fx.compute(from[i], to[i], delta));
+			});
+		},
+		serve: function(value){
+			return value.map(Number);
+		}
+	},
+
+	Number: {
+		parse: parseFloat,
+		compute: Fx.compute,
+		serve: function(value, unit){
+			return (unit) ? value + unit : value;
+		}
+	},
+
+	String: {
+		parse: Function.from(false),
+		compute: function(zero, one){
+			return one;
+		},
+		serve: function(zero){
+			return zero;
+		}
+	}
+
+};
+
+//<1.2compat>
+
+Fx.CSS.Parsers = new Hash(Fx.CSS.Parsers);
+
+//</1.2compat>
+
+
+/*
+---
+
+name: Fx.Tween
+
+description: Formerly Fx.Style, effect to transition any CSS property for an element.
+
+license: MIT-style license.
+
+requires: Fx.CSS
+
+provides: [Fx.Tween, Element.fade, Element.highlight]
+
+...
+*/
+
+Fx.Tween = new Class({
+
+	Extends: Fx.CSS,
+
+	initialize: function(element, options){
+		this.element = this.subject = document.id(element);
+		this.parent(options);
+	},
+
+	set: function(property, now){
+		if (arguments.length == 1){
+			now = property;
+			property = this.property || this.options.property;
+		}
+		this.render(this.element, property, now, this.options.unit);
+		return this;
+	},
+
+	start: function(property, from, to){
+		if (!this.check(property, from, to)) return this;
+		var args = Array.flatten(arguments);
+		this.property = this.options.property || args.shift();
+		var parsed = this.prepare(this.element, this.property, args);
+		return this.parent(parsed.from, parsed.to);
+	}
+
+});
+
+Element.Properties.tween = {
+
+	set: function(options){
+		this.get('tween').cancel().setOptions(options);
+		return this;
+	},
+
+	get: function(){
+		var tween = this.retrieve('tween');
+		if (!tween){
+			tween = new Fx.Tween(this, {link: 'cancel'});
+			this.store('tween', tween);
+		}
+		return tween;
+	}
+
+};
+
+Element.implement({
+
+	tween: function(property, from, to){
+		this.get('tween').start(property, from, to);
+		return this;
+	},
+
+	fade: function(how){
+		var fade = this.get('tween'), method, args = ['opacity'].append(arguments), toggle;
+		if (args[1] == null) args[1] = 'toggle';
+		switch (args[1]){
+			case 'in': method = 'start'; args[1] = 1; break;
+			case 'out': method = 'start'; args[1] = 0; break;
+			case 'show': method = 'set'; args[1] = 1; break;
+			case 'hide': method = 'set'; args[1] = 0; break;
+			case 'toggle':
+				var flag = this.retrieve('fade:flag', this.getStyle('opacity') == 1);
+				method = 'start';
+				args[1] = flag ? 0 : 1;
+				this.store('fade:flag', !flag);
+				toggle = true;
+			break;
+			default: method = 'start';
+		}
+		if (!toggle) this.eliminate('fade:flag');
+		fade[method].apply(fade, args);
+		var to = args[args.length - 1];
+		if (method == 'set' || to != 0) this.setStyle('visibility', to == 0 ? 'hidden' : 'visible');
+		else fade.chain(function(){
+			this.element.setStyle('visibility', 'hidden');
+			this.callChain();
+		});
+		return this;
+	},
+
+	highlight: function(start, end){
+		if (!end){
+			end = this.retrieve('highlight:original', this.getStyle('background-color'));
+			end = (end == 'transparent') ? '#fff' : end;
+		}
+		var tween = this.get('tween');
+		tween.start('background-color', start || '#ffff88', end).chain(function(){
+			this.setStyle('background-color', this.retrieve('highlight:original'));
+			tween.callChain();
+		}.bind(this));
+		return this;
+	}
+
+});
+
+
+/*
+---
+
+name: Fx.Morph
+
+description: Formerly Fx.Styles, effect to transition any number of CSS properties for an element using an object of rules, or CSS based selector rules.
+
+license: MIT-style license.
+
+requires: Fx.CSS
+
+provides: Fx.Morph
+
+...
+*/
+
+Fx.Morph = new Class({
+
+	Extends: Fx.CSS,
+
+	initialize: function(element, options){
+		this.element = this.subject = document.id(element);
+		this.parent(options);
+	},
+
+	set: function(now){
+		if (typeof now == 'string') now = this.search(now);
+		for (var p in now) this.render(this.element, p, now[p], this.options.unit);
+		return this;
+	},
+
+	compute: function(from, to, delta){
+		var now = {};
+		for (var p in from) now[p] = this.parent(from[p], to[p], delta);
+		return now;
+	},
+
+	start: function(properties){
+		if (!this.check(properties)) return this;
+		if (typeof properties == 'string') properties = this.search(properties);
+		var from = {}, to = {};
+		for (var p in properties){
+			var parsed = this.prepare(this.element, p, properties[p]);
+			from[p] = parsed.from;
+			to[p] = parsed.to;
+		}
+		return this.parent(from, to);
+	}
+
+});
+
+Element.Properties.morph = {
+
+	set: function(options){
+		this.get('morph').cancel().setOptions(options);
+		return this;
+	},
+
+	get: function(){
+		var morph = this.retrieve('morph');
+		if (!morph){
+			morph = new Fx.Morph(this, {link: 'cancel'});
+			this.store('morph', morph);
+		}
+		return morph;
+	}
+
+};
+
+Element.implement({
+
+	morph: function(props){
+		this.get('morph').start(props);
+		return this;
+	}
+
+});
+
+
+/*
+---
+
+name: Fx.Transitions
+
+description: Contains a set of advanced transitions to be used with any of the Fx Classes.
+
+license: MIT-style license.
+
+credits:
+  - Easing Equations by Robert Penner, <http://www.robertpenner.com/easing/>, modified and optimized to be used with MooTools.
+
+requires: Fx
+
+provides: Fx.Transitions
+
+...
+*/
+
+Fx.implement({
+
+	getTransition: function(){
+		var trans = this.options.transition || Fx.Transitions.Sine.easeInOut;
+		if (typeof trans == 'string'){
+			var data = trans.split(':');
+			trans = Fx.Transitions;
+			trans = trans[data[0]] || trans[data[0].capitalize()];
+			if (data[1]) trans = trans['ease' + data[1].capitalize() + (data[2] ? data[2].capitalize() : '')];
+		}
+		return trans;
+	}
+
+});
+
+Fx.Transition = function(transition, params){
+	params = Array.from(params);
+	var easeIn = function(pos){
+		return transition(pos, params);
+	};
+	return Object.append(easeIn, {
+		easeIn: easeIn,
+		easeOut: function(pos){
+			return 1 - transition(1 - pos, params);
+		},
+		easeInOut: function(pos){
+			return (pos <= 0.5 ? transition(2 * pos, params) : (2 - transition(2 * (1 - pos), params))) / 2;
+		}
+	});
+};
+
+Fx.Transitions = {
+
+	linear: function(zero){
+		return zero;
+	}
+
+};
+
+//<1.2compat>
+
+Fx.Transitions = new Hash(Fx.Transitions);
+
+//</1.2compat>
+
+Fx.Transitions.extend = function(transitions){
+	for (var transition in transitions) Fx.Transitions[transition] = new Fx.Transition(transitions[transition]);
+};
+
+Fx.Transitions.extend({
+
+	Pow: function(p, x){
+		return Math.pow(p, x && x[0] || 6);
+	},
+
+	Expo: function(p){
+		return Math.pow(2, 8 * (p - 1));
+	},
+
+	Circ: function(p){
+		return 1 - Math.sin(Math.acos(p));
+	},
+
+	Sine: function(p){
+		return 1 - Math.cos(p * Math.PI / 2);
+	},
+
+	Back: function(p, x){
+		x = x && x[0] || 1.618;
+		return Math.pow(p, 2) * ((x + 1) * p - x);
+	},
+
+	Bounce: function(p){
+		var value;
+		for (var a = 0, b = 1; 1; a += b, b /= 2){
+			if (p >= (7 - 4 * a) / 11){
+				value = b * b - Math.pow((11 - 6 * a - 11 * p) / 4, 2);
+				break;
+			}
+		}
+		return value;
+	},
+
+	Elastic: function(p, x){
+		return Math.pow(2, 10 * --p) * Math.cos(20 * p * Math.PI * (x && x[0] || 1) / 3);
+	}
+
+});
+
+['Quad', 'Cubic', 'Quart', 'Quint'].each(function(transition, i){
+	Fx.Transitions[transition] = new Fx.Transition(function(p){
+		return Math.pow(p, i + 2);
+	});
+});
+
+
+/*
+---
+
+name: Request
+
+description: Powerful all purpose Request Class. Uses XMLHTTPRequest.
+
+license: MIT-style license.
+
+requires: [Object, Element, Chain, Events, Options, Browser]
+
+provides: Request
+
+...
+*/
+
+(function(){
+
+var empty = function(){},
+	progressSupport = ('onprogress' in new Browser.Request);
+
+var Request = this.Request = new Class({
+
+	Implements: [Chain, Events, Options],
+
+	options: {/*
+		onRequest: function(){},
+		onLoadstart: function(event, xhr){},
+		onProgress: function(event, xhr){},
+		onComplete: function(){},
+		onCancel: function(){},
+		onSuccess: function(responseText, responseXML){},
+		onFailure: function(xhr){},
+		onException: function(headerName, value){},
+		onTimeout: function(){},
+		user: '',
+		password: '',*/
+		url: '',
+		data: '',
+		headers: {
+			'X-Requested-With': 'XMLHttpRequest',
+			'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+		},
+		async: true,
+		format: false,
+		method: 'post',
+		link: 'ignore',
+		isSuccess: null,
+		emulation: true,
+		urlEncoded: true,
+		encoding: 'utf-8',
+		evalScripts: false,
+		evalResponse: false,
+		timeout: 0,
+		noCache: false
+	},
+
+	initialize: function(options){
+		this.xhr = new Browser.Request();
+		this.setOptions(options);
+		this.headers = this.options.headers;
+	},
+
+	onStateChange: function(){
+		var xhr = this.xhr;
+		if (xhr.readyState != 4 || !this.running) return;
+		this.running = false;
+		this.status = 0;
+		Function.attempt(function(){
+			var status = xhr.status;
+			this.status = (status == 1223) ? 204 : status;
+		}.bind(this));
+		xhr.onreadystatechange = empty;
+		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
+		clearTimeout(this.timer);
+
+		this.response = {text: this.xhr.responseText || '', xml: this.xhr.responseXML};
+		if (this.options.isSuccess.call(this, this.status))
+			this.success(this.response.text, this.response.xml);
+		else
+			this.failure();
+	},
+
+	isSuccess: function(){
+		var status = this.status;
+		return (status >= 200 && status < 300);
+	},
+
+	isRunning: function(){
+		return !!this.running;
+	},
+
+	processScripts: function(text){
+		if (this.options.evalResponse || (/(ecma|java)script/).test(this.getHeader('Content-type'))) return Browser.exec(text);
+		return text.stripScripts(this.options.evalScripts);
+	},
+
+	success: function(text, xml){
+		this.onSuccess(this.processScripts(text), xml);
+	},
+
+	onSuccess: function(){
+		this.fireEvent('complete', arguments).fireEvent('success', arguments).callChain();
+	},
+
+	failure: function(){
+		this.onFailure();
+	},
+
+	onFailure: function(){
+		this.fireEvent('complete').fireEvent('failure', this.xhr);
+	},
+
+	loadstart: function(event){
+		this.fireEvent('loadstart', [event, this.xhr]);
+	},
+
+	progress: function(event){
+		this.fireEvent('progress', [event, this.xhr]);
+	},
+
+	timeout: function(){
+		this.fireEvent('timeout', this.xhr);
+	},
+
+	setHeader: function(name, value){
+		this.headers[name] = value;
+		return this;
+	},
+
+	getHeader: function(name){
+		return Function.attempt(function(){
+			return this.xhr.getResponseHeader(name);
+		}.bind(this));
+	},
+
+	check: function(){
+		if (!this.running) return true;
+		switch (this.options.link){
+			case 'cancel': this.cancel(); return true;
+			case 'chain': this.chain(this.caller.pass(arguments, this)); return false;
+		}
+		return false;
+	},
+
+	send: function(options){
+		if (!this.check(options)) return this;
+
+		this.options.isSuccess = this.options.isSuccess || this.isSuccess;
+		this.running = true;
+
+		var type = typeOf(options);
+		if (type == 'string' || type == 'element') options = {data: options};
+
+		var old = this.options;
+		options = Object.append({data: old.data, url: old.url, method: old.method}, options);
+		var data = options.data, url = String(options.url), method = options.method.toLowerCase();
+
+		switch (typeOf(data)){
+			case 'element': data = document.id(data).toQueryString(); break;
+			case 'object': case 'hash': data = Object.toQueryString(data);
+		}
+
+		if (this.options.format){
+			var format = 'format=' + this.options.format;
+			data = (data) ? format + '&' + data : format;
+		}
+
+		if (this.options.emulation && !['get', 'post'].contains(method)){
+			var _method = '_method=' + method;
+			data = (data) ? _method + '&' + data : _method;
+			method = 'post';
+		}
+
+		if (this.options.urlEncoded && ['post', 'put'].contains(method)){
+			var encoding = (this.options.encoding) ? '; charset=' + this.options.encoding : '';
+			this.headers['Content-type'] = 'application/x-www-form-urlencoded' + encoding;
+		}
+
+		if (!url) url = document.location.pathname;
+
+		var trimPosition = url.lastIndexOf('/');
+		if (trimPosition > -1 && (trimPosition = url.indexOf('#')) > -1) url = url.substr(0, trimPosition);
+
+		if (this.options.noCache)
+			url += (url.contains('?') ? '&' : '?') + String.uniqueID();
+
+		if (data && method == 'get'){
+			url += (url.contains('?') ? '&' : '?') + data;
+			data = null;
+		}
+
+		var xhr = this.xhr;
+		if (progressSupport){
+			xhr.onloadstart = this.loadstart.bind(this);
+			xhr.onprogress = this.progress.bind(this);
+		}
+
+		xhr.open(method.toUpperCase(), url, this.options.async, this.options.user, this.options.password);
+		if (this.options.user && 'withCredentials' in xhr) xhr.withCredentials = true;
+
+		xhr.onreadystatechange = this.onStateChange.bind(this);
+
+		Object.each(this.headers, function(value, key){
+			try {
+				xhr.setRequestHeader(key, value);
+			} catch (e){
+				this.fireEvent('exception', [key, value]);
+			}
+		}, this);
+
+		this.fireEvent('request');
+		xhr.send(data);
+		if (!this.options.async) this.onStateChange();
+		else if (this.options.timeout) this.timer = this.timeout.delay(this.options.timeout, this);
+		return this;
+	},
+
+	cancel: function(){
+		if (!this.running) return this;
+		this.running = false;
+		var xhr = this.xhr;
+		xhr.abort();
+		clearTimeout(this.timer);
+		xhr.onreadystatechange = empty;
+		if (progressSupport) xhr.onprogress = xhr.onloadstart = empty;
+		this.xhr = new Browser.Request();
+		this.fireEvent('cancel');
+		return this;
+	}
+
+});
+
+var methods = {};
+['get', 'post', 'put', 'delete', 'GET', 'POST', 'PUT', 'DELETE'].each(function(method){
+	methods[method] = function(data){
+		var object = {
+			method: method
+		};
+		if (data != null) object.data = data;
+		return this.send(object);
+	};
+});
+
+Request.implement(methods);
+
+Element.Properties.send = {
+
+	set: function(options){
+		var send = this.get('send').cancel();
+		send.setOptions(options);
+		return this;
+	},
+
+	get: function(){
+		var send = this.retrieve('send');
+		if (!send){
+			send = new Request({
+				data: this, link: 'cancel', method: this.get('method') || 'post', url: this.get('action')
+			});
+			this.store('send', send);
+		}
+		return send;
+	}
+
+};
+
+Element.implement({
+
+	send: function(url){
+		var sender = this.get('send');
+		sender.send({data: this, url: url || sender.options.url});
+		return this;
+	}
+
+});
+
+})();
+
+
+/*
+---
+
+name: Request.HTML
+
+description: Extends the basic Request Class with additional methods for interacting with HTML responses.
+
+license: MIT-style license.
+
+requires: [Element, Request]
+
+provides: Request.HTML
+
+...
+*/
+
+Request.HTML = new Class({
+
+	Extends: Request,
+
+	options: {
+		update: false,
+		append: false,
+		evalScripts: true,
+		filter: false,
+		headers: {
+			Accept: 'text/html, application/xml, text/xml, */*'
+		}
+	},
+
+	success: function(text){
+		var options = this.options, response = this.response;
+
+		response.html = text.stripScripts(function(script){
+			response.javascript = script;
+		});
+
+		var match = response.html.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
+		if (match) response.html = match[1];
+		var temp = new Element('div').set('html', response.html);
+
+		response.tree = temp.childNodes;
+		response.elements = temp.getElements(options.filter || '*');
+
+		if (options.filter) response.tree = response.elements;
+		if (options.update){
+			var update = document.id(options.update).empty();
+			if (options.filter) update.adopt(response.elements);
+			else update.set('html', response.html);
+		} else if (options.append){
+			var append = document.id(options.append);
+			if (options.filter) response.elements.reverse().inject(append);
+			else append.adopt(temp.getChildren());
+		}
+		if (options.evalScripts) Browser.exec(response.javascript);
+
+		this.onSuccess(response.tree, response.elements, response.html, response.javascript);
+	}
+
+});
+
+Element.Properties.load = {
+
+	set: function(options){
+		var load = this.get('load').cancel();
+		load.setOptions(options);
+		return this;
+	},
+
+	get: function(){
+		var load = this.retrieve('load');
+		if (!load){
+			load = new Request.HTML({data: this, link: 'cancel', update: this, method: 'get'});
+			this.store('load', load);
+		}
+		return load;
+	}
+
+};
+
+Element.implement({
+
+	load: function(){
+		this.get('load').send(Array.link(arguments, {data: Type.isObject, url: Type.isString}));
+		return this;
+	}
+
+});
+
+
+/*
+---
+
+name: JSON
+
+description: JSON encoder and decoder.
+
+license: MIT-style license.
+
+SeeAlso: <http://www.json.org/>
+
+requires: [Array, String, Number, Function]
+
+provides: JSON
+
+...
+*/
+
+if (typeof JSON == 'undefined') this.JSON = {};
+
+//<1.2compat>
+
+JSON = new Hash({
+	stringify: JSON.stringify,
+	parse: JSON.parse
+});
+
+//</1.2compat>
+
+(function(){
+
+var special = {'\b': '\\b', '\t': '\\t', '\n': '\\n', '\f': '\\f', '\r': '\\r', '"' : '\\"', '\\': '\\\\'};
+
+var escape = function(chr){
+	return special[chr] || '\\u' + ('0000' + chr.charCodeAt(0).toString(16)).slice(-4);
+};
+
+JSON.validate = function(string){
+	string = string.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@').
+					replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']').
+					replace(/(?:^|:|,)(?:\s*\[)+/g, '');
+
+	return (/^[\],:{}\s]*$/).test(string);
+};
+
+JSON.encode = JSON.stringify ? function(obj){
+	return JSON.stringify(obj);
+} : function(obj){
+	if (obj && obj.toJSON) obj = obj.toJSON();
+
+	switch (typeOf(obj)){
+		case 'string':
+			return '"' + obj.replace(/[\x00-\x1f\\"]/g, escape) + '"';
+		case 'array':
+			return '[' + obj.map(JSON.encode).clean() + ']';
+		case 'object': case 'hash':
+			var string = [];
+			Object.each(obj, function(value, key){
+				var json = JSON.encode(value);
+				if (json) string.push(JSON.encode(key) + ':' + json);
+			});
+			return '{' + string + '}';
+		case 'number': case 'boolean': return '' + obj;
+		case 'null': return 'null';
+	}
+
+	return null;
+};
+
+JSON.decode = function(string, secure){
+	if (!string || typeOf(string) != 'string') return null;
+
+	if (secure || JSON.secure){
+		if (JSON.parse) return JSON.parse(string);
+		if (!JSON.validate(string)) throw new Error('JSON could not decode the input; security is enabled and the value is not secure.');
+	}
+
+	return eval('(' + string + ')');
+};
+
+})();
+
+
+/*
+---
+
+name: Request.JSON
+
+description: Extends the basic Request Class with additional methods for sending and receiving JSON data.
+
+license: MIT-style license.
+
+requires: [Request, JSON]
+
+provides: Request.JSON
+
+...
+*/
+
+Request.JSON = new Class({
+
+	Extends: Request,
+
+	options: {
+		/*onError: function(text, error){},*/
+		secure: true
+	},
+
+	initialize: function(options){
+		this.parent(options);
+		Object.append(this.headers, {
+			'Accept': 'application/json',
+			'X-Request': 'JSON'
+		});
+	},
+
+	success: function(text){
+		var json;
+		try {
+			json = this.response.json = JSON.decode(text, this.options.secure);
+		} catch (error){
+			this.fireEvent('error', [text, error]);
+			return;
+		}
+		if (json == null) this.onFailure();
+		else this.onSuccess(json, text);
+	}
+
+});
+
+
+/*
+---
+
+name: Cookie
+
+description: Class for creating, reading, and deleting browser Cookies.
+
+license: MIT-style license.
+
+credits:
+  - Based on the functions by Peter-Paul Koch (http://quirksmode.org).
+
+requires: [Options, Browser]
+
+provides: Cookie
+
+...
+*/
+
+var Cookie = new Class({
+
+	Implements: Options,
+
+	options: {
+		path: '/',
+		domain: false,
+		duration: false,
+		secure: false,
+		document: document,
+		encode: true
+	},
+
+	initialize: function(key, options){
+		this.key = key;
+		this.setOptions(options);
+	},
+
+	write: function(value){
+		if (this.options.encode) value = encodeURIComponent(value);
+		if (this.options.domain) value += '; domain=' + this.options.domain;
+		if (this.options.path) value += '; path=' + this.options.path;
+		if (this.options.duration){
+			var date = new Date();
+			date.setTime(date.getTime() + this.options.duration * 24 * 60 * 60 * 1000);
+			value += '; expires=' + date.toGMTString();
+		}
+		if (this.options.secure) value += '; secure';
+		this.options.document.cookie = this.key + '=' + value;
+		return this;
+	},
+
+	read: function(){
+		var value = this.options.document.cookie.match('(?:^|;)\\s*' + this.key.escapeRegExp() + '=([^;]*)');
+		return (value) ? decodeURIComponent(value[1]) : null;
+	},
+
+	dispose: function(){
+		new Cookie(this.key, Object.merge({}, this.options, {duration: -1})).write('');
+		return this;
+	}
+
+});
+
+Cookie.write = function(key, value, options){
+	return new Cookie(key, options).write(value);
+};
+
+Cookie.read = function(key){
+	return new Cookie(key).read();
+};
+
+Cookie.dispose = function(key, options){
+	return new Cookie(key, options).dispose();
+};
+
+
+/*
+---
+
+name: DOMReady
+
+description: Contains the custom event domready.
+
+license: MIT-style license.
+
+requires: [Browser, Element, Element.Event]
+
+provides: [DOMReady, DomReady]
+
+...
+*/
+
+(function(window, document){
+
+var ready,
+	loaded,
+	checks = [],
+	shouldPoll,
+	timer,
+	testElement = document.createElement('div');
+
+var domready = function(){
+	clearTimeout(timer);
+	if (ready) return;
+	Browser.loaded = ready = true;
+	document.removeListener('DOMContentLoaded', domready).removeListener('readystatechange', check);
+
+	document.fireEvent('domready');
+	window.fireEvent('domready');
+};
+
+var check = function(){
+	for (var i = checks.length; i--;) if (checks[i]()){
+		domready();
+		return true;
+	}
+	return false;
+};
+
+var poll = function(){
+	clearTimeout(timer);
+	if (!check()) timer = setTimeout(poll, 10);
+};
+
+document.addListener('DOMContentLoaded', domready);
+
+/*<ltIE8>*/
+// doScroll technique by Diego Perini http://javascript.nwbox.com/IEContentLoaded/
+// testElement.doScroll() throws when the DOM is not ready, only in the top window
+var doScrollWorks = function(){
+	try {
+		testElement.doScroll();
+		return true;
+	} catch (e){}
+	return false;
+};
+// If doScroll works already, it can't be used to determine domready
+//   e.g. in an iframe
+if (testElement.doScroll && !doScrollWorks()){
+	checks.push(doScrollWorks);
+	shouldPoll = true;
+}
+/*</ltIE8>*/
+
+if (document.readyState) checks.push(function(){
+	var state = document.readyState;
+	return (state == 'loaded' || state == 'complete');
+});
+
+if ('onreadystatechange' in document) document.addListener('readystatechange', check);
+else shouldPoll = true;
+
+if (shouldPoll) poll();
+
+Element.Events.domready = {
+	onAdd: function(fn){
+		if (ready) fn.call(this);
+	}
+};
+
+// Make sure that domready fires before load
+Element.Events.load = {
+	base: 'load',
+	onAdd: function(fn){
+		if (loaded && this == window) fn.call(this);
+	},
+	condition: function(){
+		if (this == window){
+			domready();
+			delete Element.Events.load;
+		}
+		return true;
+	}
+};
+
+// This is based on the custom load event
+window.addEvent('load', function(){
+	loaded = true;
+});
+
+})(window, document);
+
+
+/*
+---
+
+name: Swiff
+
+description: Wrapper for embedding SWF movies. Supports External Interface Communication.
+
+license: MIT-style license.
+
+credits:
+  - Flash detection & Internet Explorer + Flash Player 9 fix inspired by SWFObject.
+
+requires: [Options, Object, Element]
+
+provides: Swiff
+
+...
+*/
+
+(function(){
+
+var Swiff = this.Swiff = new Class({
+
+	Implements: Options,
+
+	options: {
+		id: null,
+		height: 1,
+		width: 1,
+		container: null,
+		properties: {},
+		params: {
+			quality: 'high',
+			allowScriptAccess: 'always',
+			wMode: 'window',
+			swLiveConnect: true
+		},
+		callBacks: {},
+		vars: {}
+	},
+
+	toElement: function(){
+		return this.object;
+	},
+
+	initialize: function(path, options){
+		this.instance = 'Swiff_' + String.uniqueID();
+
+		this.setOptions(options);
+		options = this.options;
+		var id = this.id = options.id || this.instance;
+		var container = document.id(options.container);
+
+		Swiff.CallBacks[this.instance] = {};
+
+		var params = options.params, vars = options.vars, callBacks = options.callBacks;
+		var properties = Object.append({height: options.height, width: options.width}, options.properties);
+
+		var self = this;
+
+		for (var callBack in callBacks){
+			Swiff.CallBacks[this.instance][callBack] = (function(option){
+				return function(){
+					return option.apply(self.object, arguments);
+				};
+			})(callBacks[callBack]);
+			vars[callBack] = 'Swiff.CallBacks.' + this.instance + '.' + callBack;
+		}
+
+		params.flashVars = Object.toQueryString(vars);
+		if (Browser.ie){
+			properties.classid = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';
+			params.movie = path;
+		} else {
+			properties.type = 'application/x-shockwave-flash';
+		}
+		properties.data = path;
+
+		var build = '<object id="' + id + '"';
+		for (var property in properties) build += ' ' + property + '="' + properties[property] + '"';
+		build += '>';
+		for (var param in params){
+			if (params[param]) build += '<param name="' + param + '" value="' + params[param] + '" />';
+		}
+		build += '</object>';
+		this.object = ((container) ? container.empty() : new Element('div')).set('html', build).firstChild;
+	},
+
+	replaces: function(element){
+		element = document.id(element, true);
+		element.parentNode.replaceChild(this.toElement(), element);
+		return this;
+	},
+
+	inject: function(element){
+		document.id(element, true).appendChild(this.toElement());
+		return this;
+	},
+
+	remote: function(){
+		return Swiff.remote.apply(Swiff, [this.toElement()].append(arguments));
+	}
+
+});
+
+Swiff.CallBacks = {};
+
+Swiff.remote = function(obj, fn){
+	var rs = obj.CallFunction('<invoke name="' + fn + '" returntype="javascript">' + __flash__argumentsToXML(arguments, 2) + '</invoke>');
+	return eval(rs);
+};
+
+})();
+
new file mode 100644
index 0000000000000000000000000000000000000000..98ac4a54818a74ededaeed76adad802034071c41
GIT binary patch
literal 491891
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
Pjc<Vn%X8Ct*7E-W6dUN;
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/frameworks/underscore-1.5.js
@@ -0,0 +1,1276 @@
+//     Underscore.js 1.5.2
+//     http://underscorejs.org
+//     (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+//     Underscore may be freely distributed under the MIT license.
+
+(function() {
+
+  // Baseline setup
+  // --------------
+
+  // Establish the root object, `window` in the browser, or `exports` on the server.
+  var root = this;
+
+  // Save the previous value of the `_` variable.
+  var previousUnderscore = root._;
+
+  // Establish the object that gets returned to break out of a loop iteration.
+  var breaker = {};
+
+  // Save bytes in the minified (but not gzipped) version:
+  var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype;
+
+  // Create quick reference variables for speed access to core prototypes.
+  var
+    push             = ArrayProto.push,
+    slice            = ArrayProto.slice,
+    concat           = ArrayProto.concat,
+    toString         = ObjProto.toString,
+    hasOwnProperty   = ObjProto.hasOwnProperty;
+
+  // All **ECMAScript 5** native function implementations that we hope to use
+  // are declared here.
+  var
+    nativeForEach      = ArrayProto.forEach,
+    nativeMap          = ArrayProto.map,
+    nativeReduce       = ArrayProto.reduce,
+    nativeReduceRight  = ArrayProto.reduceRight,
+    nativeFilter       = ArrayProto.filter,
+    nativeEvery        = ArrayProto.every,
+    nativeSome         = ArrayProto.some,
+    nativeIndexOf      = ArrayProto.indexOf,
+    nativeLastIndexOf  = ArrayProto.lastIndexOf,
+    nativeIsArray      = Array.isArray,
+    nativeKeys         = Object.keys,
+    nativeBind         = FuncProto.bind;
+
+  // Create a safe reference to the Underscore object for use below.
+  var _ = function(obj) {
+    if (obj instanceof _) return obj;
+    if (!(this instanceof _)) return new _(obj);
+    this._wrapped = obj;
+  };
+
+  // Export the Underscore object for **Node.js**, with
+  // backwards-compatibility for the old `require()` API. If we're in
+  // the browser, add `_` as a global object via a string identifier,
+  // for Closure Compiler "advanced" mode.
+  if (typeof exports !== 'undefined') {
+    if (typeof module !== 'undefined' && module.exports) {
+      exports = module.exports = _;
+    }
+    exports._ = _;
+  } else {
+    root._ = _;
+  }
+
+  // Current version.
+  _.VERSION = '1.5.2';
+
+  // Collection Functions
+  // --------------------
+
+  // The cornerstone, an `each` implementation, aka `forEach`.
+  // Handles objects with the built-in `forEach`, arrays, and raw objects.
+  // Delegates to **ECMAScript 5**'s native `forEach` if available.
+  var each = _.each = _.forEach = function(obj, iterator, context) {
+    if (obj == null) return;
+    if (nativeForEach && obj.forEach === nativeForEach) {
+      obj.forEach(iterator, context);
+    } else if (obj.length === +obj.length) {
+      for (var i = 0, length = obj.length; i < length; i++) {
+        if (iterator.call(context, obj[i], i, obj) === breaker) return;
+      }
+    } else {
+      var keys = _.keys(obj);
+      for (var i = 0, length = keys.length; i < length; i++) {
+        if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return;
+      }
+    }
+  };
+
+  // Return the results of applying the iterator to each element.
+  // Delegates to **ECMAScript 5**'s native `map` if available.
+  _.map = _.collect = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context);
+    each(obj, function(value, index, list) {
+      results.push(iterator.call(context, value, index, list));
+    });
+    return results;
+  };
+
+  var reduceError = 'Reduce of empty array with no initial value';
+
+  // **Reduce** builds up a single result from a list of values, aka `inject`,
+  // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available.
+  _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) {
+    var initial = arguments.length > 2;
+    if (obj == null) obj = [];
+    if (nativeReduce && obj.reduce === nativeReduce) {
+      if (context) iterator = _.bind(iterator, context);
+      return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator);
+    }
+    each(obj, function(value, index, list) {
+      if (!initial) {
+        memo = value;
+        initial = true;
+      } else {
+        memo = iterator.call(context, memo, value, index, list);
+      }
+    });
+    if (!initial) throw new TypeError(reduceError);
+    return memo;
+  };
+
+  // The right-associative version of reduce, also known as `foldr`.
+  // Delegates to **ECMAScript 5**'s native `reduceRight` if available.
+  _.reduceRight = _.foldr = function(obj, iterator, memo, context) {
+    var initial = arguments.length > 2;
+    if (obj == null) obj = [];
+    if (nativeReduceRight && obj.reduceRight === nativeReduceRight) {
+      if (context) iterator = _.bind(iterator, context);
+      return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator);
+    }
+    var length = obj.length;
+    if (length !== +length) {
+      var keys = _.keys(obj);
+      length = keys.length;
+    }
+    each(obj, function(value, index, list) {
+      index = keys ? keys[--length] : --length;
+      if (!initial) {
+        memo = obj[index];
+        initial = true;
+      } else {
+        memo = iterator.call(context, memo, obj[index], index, list);
+      }
+    });
+    if (!initial) throw new TypeError(reduceError);
+    return memo;
+  };
+
+  // Return the first value which passes a truth test. Aliased as `detect`.
+  _.find = _.detect = function(obj, iterator, context) {
+    var result;
+    any(obj, function(value, index, list) {
+      if (iterator.call(context, value, index, list)) {
+        result = value;
+        return true;
+      }
+    });
+    return result;
+  };
+
+  // Return all the elements that pass a truth test.
+  // Delegates to **ECMAScript 5**'s native `filter` if available.
+  // Aliased as `select`.
+  _.filter = _.select = function(obj, iterator, context) {
+    var results = [];
+    if (obj == null) return results;
+    if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context);
+    each(obj, function(value, index, list) {
+      if (iterator.call(context, value, index, list)) results.push(value);
+    });
+    return results;
+  };
+
+  // Return all the elements for which a truth test fails.
+  _.reject = function(obj, iterator, context) {
+    return _.filter(obj, function(value, index, list) {
+      return !iterator.call(context, value, index, list);
+    }, context);
+  };
+
+  // Determine whether all of the elements match a truth test.
+  // Delegates to **ECMAScript 5**'s native `every` if available.
+  // Aliased as `all`.
+  _.every = _.all = function(obj, iterator, context) {
+    iterator || (iterator = _.identity);
+    var result = true;
+    if (obj == null) return result;
+    if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context);
+    each(obj, function(value, index, list) {
+      if (!(result = result && iterator.call(context, value, index, list))) return breaker;
+    });
+    return !!result;
+  };
+
+  // Determine if at least one element in the object matches a truth test.
+  // Delegates to **ECMAScript 5**'s native `some` if available.
+  // Aliased as `any`.
+  var any = _.some = _.any = function(obj, iterator, context) {
+    iterator || (iterator = _.identity);
+    var result = false;
+    if (obj == null) return result;
+    if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context);
+    each(obj, function(value, index, list) {
+      if (result || (result = iterator.call(context, value, index, list))) return breaker;
+    });
+    return !!result;
+  };
+
+  // Determine if the array or object contains a given value (using `===`).
+  // Aliased as `include`.
+  _.contains = _.include = function(obj, target) {
+    if (obj == null) return false;
+    if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1;
+    return any(obj, function(value) {
+      return value === target;
+    });
+  };
+
+  // Invoke a method (with arguments) on every item in a collection.
+  _.invoke = function(obj, method) {
+    var args = slice.call(arguments, 2);
+    var isFunc = _.isFunction(method);
+    return _.map(obj, function(value) {
+      return (isFunc ? method : value[method]).apply(value, args);
+    });
+  };
+
+  // Convenience version of a common use case of `map`: fetching a property.
+  _.pluck = function(obj, key) {
+    return _.map(obj, function(value){ return value[key]; });
+  };
+
+  // Convenience version of a common use case of `filter`: selecting only objects
+  // containing specific `key:value` pairs.
+  _.where = function(obj, attrs, first) {
+    if (_.isEmpty(attrs)) return first ? void 0 : [];
+    return _[first ? 'find' : 'filter'](obj, function(value) {
+      for (var key in attrs) {
+        if (attrs[key] !== value[key]) return false;
+      }
+      return true;
+    });
+  };
+
+  // Convenience version of a common use case of `find`: getting the first object
+  // containing specific `key:value` pairs.
+  _.findWhere = function(obj, attrs) {
+    return _.where(obj, attrs, true);
+  };
+
+  // Return the maximum element or (element-based computation).
+  // Can't optimize arrays of integers longer than 65,535 elements.
+  // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797)
+  _.max = function(obj, iterator, context) {
+    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+      return Math.max.apply(Math, obj);
+    }
+    if (!iterator && _.isEmpty(obj)) return -Infinity;
+    var result = {computed : -Infinity, value: -Infinity};
+    each(obj, function(value, index, list) {
+      var computed = iterator ? iterator.call(context, value, index, list) : value;
+      computed > result.computed && (result = {value : value, computed : computed});
+    });
+    return result.value;
+  };
+
+  // Return the minimum element (or element-based computation).
+  _.min = function(obj, iterator, context) {
+    if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) {
+      return Math.min.apply(Math, obj);
+    }
+    if (!iterator && _.isEmpty(obj)) return Infinity;
+    var result = {computed : Infinity, value: Infinity};
+    each(obj, function(value, index, list) {
+      var computed = iterator ? iterator.call(context, value, index, list) : value;
+      computed < result.computed && (result = {value : value, computed : computed});
+    });
+    return result.value;
+  };
+
+  // Shuffle an array, using the modern version of the 
+  // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle).
+  _.shuffle = function(obj) {
+    var rand;
+    var index = 0;
+    var shuffled = [];
+    each(obj, function(value) {
+      rand = _.random(index++);
+      shuffled[index - 1] = shuffled[rand];
+      shuffled[rand] = value;
+    });
+    return shuffled;
+  };
+
+  // Sample **n** random values from an array.
+  // If **n** is not specified, returns a single random element from the array.
+  // The internal `guard` argument allows it to work with `map`.
+  _.sample = function(obj, n, guard) {
+    if (arguments.length < 2 || guard) {
+      return obj[_.random(obj.length - 1)];
+    }
+    return _.shuffle(obj).slice(0, Math.max(0, n));
+  };
+
+  // An internal function to generate lookup iterators.
+  var lookupIterator = function(value) {
+    return _.isFunction(value) ? value : function(obj){ return obj[value]; };
+  };
+
+  // Sort the object's values by a criterion produced by an iterator.
+  _.sortBy = function(obj, value, context) {
+    var iterator = lookupIterator(value);
+    return _.pluck(_.map(obj, function(value, index, list) {
+      return {
+        value: value,
+        index: index,
+        criteria: iterator.call(context, value, index, list)
+      };
+    }).sort(function(left, right) {
+      var a = left.criteria;
+      var b = right.criteria;
+      if (a !== b) {
+        if (a > b || a === void 0) return 1;
+        if (a < b || b === void 0) return -1;
+      }
+      return left.index - right.index;
+    }), 'value');
+  };
+
+  // An internal function used for aggregate "group by" operations.
+  var group = function(behavior) {
+    return function(obj, value, context) {
+      var result = {};
+      var iterator = value == null ? _.identity : lookupIterator(value);
+      each(obj, function(value, index) {
+        var key = iterator.call(context, value, index, obj);
+        behavior(result, key, value);
+      });
+      return result;
+    };
+  };
+
+  // Groups the object's values by a criterion. Pass either a string attribute
+  // to group by, or a function that returns the criterion.
+  _.groupBy = group(function(result, key, value) {
+    (_.has(result, key) ? result[key] : (result[key] = [])).push(value);
+  });
+
+  // Indexes the object's values by a criterion, similar to `groupBy`, but for
+  // when you know that your index values will be unique.
+  _.indexBy = group(function(result, key, value) {
+    result[key] = value;
+  });
+
+  // Counts instances of an object that group by a certain criterion. Pass
+  // either a string attribute to count by, or a function that returns the
+  // criterion.
+  _.countBy = group(function(result, key) {
+    _.has(result, key) ? result[key]++ : result[key] = 1;
+  });
+
+  // Use a comparator function to figure out the smallest index at which
+  // an object should be inserted so as to maintain order. Uses binary search.
+  _.sortedIndex = function(array, obj, iterator, context) {
+    iterator = iterator == null ? _.identity : lookupIterator(iterator);
+    var value = iterator.call(context, obj);
+    var low = 0, high = array.length;
+    while (low < high) {
+      var mid = (low + high) >>> 1;
+      iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid;
+    }
+    return low;
+  };
+
+  // Safely create a real, live array from anything iterable.
+  _.toArray = function(obj) {
+    if (!obj) return [];
+    if (_.isArray(obj)) return slice.call(obj);
+    if (obj.length === +obj.length) return _.map(obj, _.identity);
+    return _.values(obj);
+  };
+
+  // Return the number of elements in an object.
+  _.size = function(obj) {
+    if (obj == null) return 0;
+    return (obj.length === +obj.length) ? obj.length : _.keys(obj).length;
+  };
+
+  // Array Functions
+  // ---------------
+
+  // Get the first element of an array. Passing **n** will return the first N
+  // values in the array. Aliased as `head` and `take`. The **guard** check
+  // allows it to work with `_.map`.
+  _.first = _.head = _.take = function(array, n, guard) {
+    if (array == null) return void 0;
+    return (n == null) || guard ? array[0] : slice.call(array, 0, n);
+  };
+
+  // Returns everything but the last entry of the array. Especially useful on
+  // the arguments object. Passing **n** will return all the values in
+  // the array, excluding the last N. The **guard** check allows it to work with
+  // `_.map`.
+  _.initial = function(array, n, guard) {
+    return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n));
+  };
+
+  // Get the last element of an array. Passing **n** will return the last N
+  // values in the array. The **guard** check allows it to work with `_.map`.
+  _.last = function(array, n, guard) {
+    if (array == null) return void 0;
+    if ((n == null) || guard) {
+      return array[array.length - 1];
+    } else {
+      return slice.call(array, Math.max(array.length - n, 0));
+    }
+  };
+
+  // Returns everything but the first entry of the array. Aliased as `tail` and `drop`.
+  // Especially useful on the arguments object. Passing an **n** will return
+  // the rest N values in the array. The **guard**
+  // check allows it to work with `_.map`.
+  _.rest = _.tail = _.drop = function(array, n, guard) {
+    return slice.call(array, (n == null) || guard ? 1 : n);
+  };
+
+  // Trim out all falsy values from an array.
+  _.compact = function(array) {
+    return _.filter(array, _.identity);
+  };
+
+  // Internal implementation of a recursive `flatten` function.
+  var flatten = function(input, shallow, output) {
+    if (shallow && _.every(input, _.isArray)) {
+      return concat.apply(output, input);
+    }
+    each(input, function(value) {
+      if (_.isArray(value) || _.isArguments(value)) {
+        shallow ? push.apply(output, value) : flatten(value, shallow, output);
+      } else {
+        output.push(value);
+      }
+    });
+    return output;
+  };
+
+  // Flatten out an array, either recursively (by default), or just one level.
+  _.flatten = function(array, shallow) {
+    return flatten(array, shallow, []);
+  };
+
+  // Return a version of the array that does not contain the specified value(s).
+  _.without = function(array) {
+    return _.difference(array, slice.call(arguments, 1));
+  };
+
+  // Produce a duplicate-free version of the array. If the array has already
+  // been sorted, you have the option of using a faster algorithm.
+  // Aliased as `unique`.
+  _.uniq = _.unique = function(array, isSorted, iterator, context) {
+    if (_.isFunction(isSorted)) {
+      context = iterator;
+      iterator = isSorted;
+      isSorted = false;
+    }
+    var initial = iterator ? _.map(array, iterator, context) : array;
+    var results = [];
+    var seen = [];
+    each(initial, function(value, index) {
+      if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) {
+        seen.push(value);
+        results.push(array[index]);
+      }
+    });
+    return results;
+  };
+
+  // Produce an array that contains the union: each distinct element from all of
+  // the passed-in arrays.
+  _.union = function() {
+    return _.uniq(_.flatten(arguments, true));
+  };
+
+  // Produce an array that contains every item shared between all the
+  // passed-in arrays.
+  _.intersection = function(array) {
+    var rest = slice.call(arguments, 1);
+    return _.filter(_.uniq(array), function(item) {
+      return _.every(rest, function(other) {
+        return _.indexOf(other, item) >= 0;
+      });
+    });
+  };
+
+  // Take the difference between one array and a number of other arrays.
+  // Only the elements present in just the first array will remain.
+  _.difference = function(array) {
+    var rest = concat.apply(ArrayProto, slice.call(arguments, 1));
+    return _.filter(array, function(value){ return !_.contains(rest, value); });
+  };
+
+  // Zip together multiple lists into a single array -- elements that share
+  // an index go together.
+  _.zip = function() {
+    var length = _.max(_.pluck(arguments, "length").concat(0));
+    var results = new Array(length);
+    for (var i = 0; i < length; i++) {
+      results[i] = _.pluck(arguments, '' + i);
+    }
+    return results;
+  };
+
+  // Converts lists into objects. Pass either a single array of `[key, value]`
+  // pairs, or two parallel arrays of the same length -- one of keys, and one of
+  // the corresponding values.
+  _.object = function(list, values) {
+    if (list == null) return {};
+    var result = {};
+    for (var i = 0, length = list.length; i < length; i++) {
+      if (values) {
+        result[list[i]] = values[i];
+      } else {
+        result[list[i][0]] = list[i][1];
+      }
+    }
+    return result;
+  };
+
+  // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**),
+  // we need this function. Return the position of the first occurrence of an
+  // item in an array, or -1 if the item is not included in the array.
+  // Delegates to **ECMAScript 5**'s native `indexOf` if available.
+  // If the array is large and already in sort order, pass `true`
+  // for **isSorted** to use binary search.
+  _.indexOf = function(array, item, isSorted) {
+    if (array == null) return -1;
+    var i = 0, length = array.length;
+    if (isSorted) {
+      if (typeof isSorted == 'number') {
+        i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted);
+      } else {
+        i = _.sortedIndex(array, item);
+        return array[i] === item ? i : -1;
+      }
+    }
+    if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);
+    for (; i < length; i++) if (array[i] === item) return i;
+    return -1;
+  };
+
+  // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available.
+  _.lastIndexOf = function(array, item, from) {
+    if (array == null) return -1;
+    var hasIndex = from != null;
+    if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) {
+      return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item);
+    }
+    var i = (hasIndex ? from : array.length);
+    while (i--) if (array[i] === item) return i;
+    return -1;
+  };
+
+  // Generate an integer Array containing an arithmetic progression. A port of
+  // the native Python `range()` function. See
+  // [the Python documentation](http://docs.python.org/library/functions.html#range).
+  _.range = function(start, stop, step) {
+    if (arguments.length <= 1) {
+      stop = start || 0;
+      start = 0;
+    }
+    step = arguments[2] || 1;
+
+    var length = Math.max(Math.ceil((stop - start) / step), 0);
+    var idx = 0;
+    var range = new Array(length);
+
+    while(idx < length) {
+      range[idx++] = start;
+      start += step;
+    }
+
+    return range;
+  };
+
+  // Function (ahem) Functions
+  // ------------------
+
+  // Reusable constructor function for prototype setting.
+  var ctor = function(){};
+
+  // Create a function bound to a given object (assigning `this`, and arguments,
+  // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if
+  // available.
+  _.bind = function(func, context) {
+    var args, bound;
+    if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1));
+    if (!_.isFunction(func)) throw new TypeError;
+    args = slice.call(arguments, 2);
+    return bound = function() {
+      if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments)));
+      ctor.prototype = func.prototype;
+      var self = new ctor;
+      ctor.prototype = null;
+      var result = func.apply(self, args.concat(slice.call(arguments)));
+      if (Object(result) === result) return result;
+      return self;
+    };
+  };
+
+  // Partially apply a function by creating a version that has had some of its
+  // arguments pre-filled, without changing its dynamic `this` context.
+  _.partial = function(func) {
+    var args = slice.call(arguments, 1);
+    return function() {
+      return func.apply(this, args.concat(slice.call(arguments)));
+    };
+  };
+
+  // Bind all of an object's methods to that object. Useful for ensuring that
+  // all callbacks defined on an object belong to it.
+  _.bindAll = function(obj) {
+    var funcs = slice.call(arguments, 1);
+    if (funcs.length === 0) throw new Error("bindAll must be passed function names");
+    each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); });
+    return obj;
+  };
+
+  // Memoize an expensive function by storing its results.
+  _.memoize = function(func, hasher) {
+    var memo = {};
+    hasher || (hasher = _.identity);
+    return function() {
+      var key = hasher.apply(this, arguments);
+      return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments));
+    };
+  };
+
+  // Delays a function for the given number of milliseconds, and then calls
+  // it with the arguments supplied.
+  _.delay = function(func, wait) {
+    var args = slice.call(arguments, 2);
+    return setTimeout(function(){ return func.apply(null, args); }, wait);
+  };
+
+  // Defers a function, scheduling it to run after the current call stack has
+  // cleared.
+  _.defer = function(func) {
+    return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1)));
+  };
+
+  // Returns a function, that, when invoked, will only be triggered at most once
+  // during a given window of time. Normally, the throttled function will run
+  // as much as it can, without ever going more than once per `wait` duration;
+  // but if you'd like to disable the execution on the leading edge, pass
+  // `{leading: false}`. To disable execution on the trailing edge, ditto.
+  _.throttle = function(func, wait, options) {
+    var context, args, result;
+    var timeout = null;
+    var previous = 0;
+    options || (options = {});
+    var later = function() {
+      previous = options.leading === false ? 0 : new Date;
+      timeout = null;
+      result = func.apply(context, args);
+    };
+    return function() {
+      var now = new Date;
+      if (!previous && options.leading === false) previous = now;
+      var remaining = wait - (now - previous);
+      context = this;
+      args = arguments;
+      if (remaining <= 0) {
+        clearTimeout(timeout);
+        timeout = null;
+        previous = now;
+        result = func.apply(context, args);
+      } else if (!timeout && options.trailing !== false) {
+        timeout = setTimeout(later, remaining);
+      }
+      return result;
+    };
+  };
+
+  // Returns a function, that, as long as it continues to be invoked, will not
+  // be triggered. The function will be called after it stops being called for
+  // N milliseconds. If `immediate` is passed, trigger the function on the
+  // leading edge, instead of the trailing.
+  _.debounce = function(func, wait, immediate) {
+    var timeout, args, context, timestamp, result;
+    return function() {
+      context = this;
+      args = arguments;
+      timestamp = new Date();
+      var later = function() {
+        var last = (new Date()) - timestamp;
+        if (last < wait) {
+          timeout = setTimeout(later, wait - last);
+        } else {
+          timeout = null;
+          if (!immediate) result = func.apply(context, args);
+        }
+      };
+      var callNow = immediate && !timeout;
+      if (!timeout) {
+        timeout = setTimeout(later, wait);
+      }
+      if (callNow) result = func.apply(context, args);
+      return result;
+    };
+  };
+
+  // Returns a function that will be executed at most one time, no matter how
+  // often you call it. Useful for lazy initialization.
+  _.once = function(func) {
+    var ran = false, memo;
+    return function() {
+      if (ran) return memo;
+      ran = true;
+      memo = func.apply(this, arguments);
+      func = null;
+      return memo;
+    };
+  };
+
+  // Returns the first function passed as an argument to the second,
+  // allowing you to adjust arguments, run code before and after, and
+  // conditionally execute the original function.
+  _.wrap = function(func, wrapper) {
+    return function() {
+      var args = [func];
+      push.apply(args, arguments);
+      return wrapper.apply(this, args);
+    };
+  };
+
+  // Returns a function that is the composition of a list of functions, each
+  // consuming the return value of the function that follows.
+  _.compose = function() {
+    var funcs = arguments;
+    return function() {
+      var args = arguments;
+      for (var i = funcs.length - 1; i >= 0; i--) {
+        args = [funcs[i].apply(this, args)];
+      }
+      return args[0];
+    };
+  };
+
+  // Returns a function that will only be executed after being called N times.
+  _.after = function(times, func) {
+    return function() {
+      if (--times < 1) {
+        return func.apply(this, arguments);
+      }
+    };
+  };
+
+  // Object Functions
+  // ----------------
+
+  // Retrieve the names of an object's properties.
+  // Delegates to **ECMAScript 5**'s native `Object.keys`
+  _.keys = nativeKeys || function(obj) {
+    if (obj !== Object(obj)) throw new TypeError('Invalid object');
+    var keys = [];
+    for (var key in obj) if (_.has(obj, key)) keys.push(key);
+    return keys;
+  };
+
+  // Retrieve the values of an object's properties.
+  _.values = function(obj) {
+    var keys = _.keys(obj);
+    var length = keys.length;
+    var values = new Array(length);
+    for (var i = 0; i < length; i++) {
+      values[i] = obj[keys[i]];
+    }
+    return values;
+  };
+
+  // Convert an object into a list of `[key, value]` pairs.
+  _.pairs = function(obj) {
+    var keys = _.keys(obj);
+    var length = keys.length;
+    var pairs = new Array(length);
+    for (var i = 0; i < length; i++) {
+      pairs[i] = [keys[i], obj[keys[i]]];
+    }
+    return pairs;
+  };
+
+  // Invert the keys and values of an object. The values must be serializable.
+  _.invert = function(obj) {
+    var result = {};
+    var keys = _.keys(obj);
+    for (var i = 0, length = keys.length; i < length; i++) {
+      result[obj[keys[i]]] = keys[i];
+    }
+    return result;
+  };
+
+  // Return a sorted list of the function names available on the object.
+  // Aliased as `methods`
+  _.functions = _.methods = function(obj) {
+    var names = [];
+    for (var key in obj) {
+      if (_.isFunction(obj[key])) names.push(key);
+    }
+    return names.sort();
+  };
+
+  // Extend a given object with all the properties in passed-in object(s).
+  _.extend = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      if (source) {
+        for (var prop in source) {
+          obj[prop] = source[prop];
+        }
+      }
+    });
+    return obj;
+  };
+
+  // Return a copy of the object only containing the whitelisted properties.
+  _.pick = function(obj) {
+    var copy = {};
+    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+    each(keys, function(key) {
+      if (key in obj) copy[key] = obj[key];
+    });
+    return copy;
+  };
+
+   // Return a copy of the object without the blacklisted properties.
+  _.omit = function(obj) {
+    var copy = {};
+    var keys = concat.apply(ArrayProto, slice.call(arguments, 1));
+    for (var key in obj) {
+      if (!_.contains(keys, key)) copy[key] = obj[key];
+    }
+    return copy;
+  };
+
+  // Fill in a given object with default properties.
+  _.defaults = function(obj) {
+    each(slice.call(arguments, 1), function(source) {
+      if (source) {
+        for (var prop in source) {
+          if (obj[prop] === void 0) obj[prop] = source[prop];
+        }
+      }
+    });
+    return obj;
+  };
+
+  // Create a (shallow-cloned) duplicate of an object.
+  _.clone = function(obj) {
+    if (!_.isObject(obj)) return obj;
+    return _.isArray(obj) ? obj.slice() : _.extend({}, obj);
+  };
+
+  // Invokes interceptor with the obj, and then returns obj.
+  // The primary purpose of this method is to "tap into" a method chain, in
+  // order to perform operations on intermediate results within the chain.
+  _.tap = function(obj, interceptor) {
+    interceptor(obj);
+    return obj;
+  };
+
+  // Internal recursive comparison function for `isEqual`.
+  var eq = function(a, b, aStack, bStack) {
+    // Identical objects are equal. `0 === -0`, but they aren't identical.
+    // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal).
+    if (a === b) return a !== 0 || 1 / a == 1 / b;
+    // A strict comparison is necessary because `null == undefined`.
+    if (a == null || b == null) return a === b;
+    // Unwrap any wrapped objects.
+    if (a instanceof _) a = a._wrapped;
+    if (b instanceof _) b = b._wrapped;
+    // Compare `[[Class]]` names.
+    var className = toString.call(a);
+    if (className != toString.call(b)) return false;
+    switch (className) {
+      // Strings, numbers, dates, and booleans are compared by value.
+      case '[object String]':
+        // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is
+        // equivalent to `new String("5")`.
+        return a == String(b);
+      case '[object Number]':
+        // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for
+        // other numeric values.
+        return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b);
+      case '[object Date]':
+      case '[object Boolean]':
+        // Coerce dates and booleans to numeric primitive values. Dates are compared by their
+        // millisecond representations. Note that invalid dates with millisecond representations
+        // of `NaN` are not equivalent.
+        return +a == +b;
+      // RegExps are compared by their source patterns and flags.
+      case '[object RegExp]':
+        return a.source == b.source &&
+               a.global == b.global &&
+               a.multiline == b.multiline &&
+               a.ignoreCase == b.ignoreCase;
+    }
+    if (typeof a != 'object' || typeof b != 'object') return false;
+    // Assume equality for cyclic structures. The algorithm for detecting cyclic
+    // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.
+    var length = aStack.length;
+    while (length--) {
+      // Linear search. Performance is inversely proportional to the number of
+      // unique nested structures.
+      if (aStack[length] == a) return bStack[length] == b;
+    }
+    // Objects with different constructors are not equivalent, but `Object`s
+    // from different frames are.
+    var aCtor = a.constructor, bCtor = b.constructor;
+    if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) &&
+                             _.isFunction(bCtor) && (bCtor instanceof bCtor))) {
+      return false;
+    }
+    // Add the first object to the stack of traversed objects.
+    aStack.push(a);
+    bStack.push(b);
+    var size = 0, result = true;
+    // Recursively compare objects and arrays.
+    if (className == '[object Array]') {
+      // Compare array lengths to determine if a deep comparison is necessary.
+      size = a.length;
+      result = size == b.length;
+      if (result) {
+        // Deep compare the contents, ignoring non-numeric properties.
+        while (size--) {
+          if (!(result = eq(a[size], b[size], aStack, bStack))) break;
+        }
+      }
+    } else {
+      // Deep compare objects.
+      for (var key in a) {
+        if (_.has(a, key)) {
+          // Count the expected number of properties.
+          size++;
+          // Deep compare each member.
+          if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break;
+        }
+      }
+      // Ensure that both objects contain the same number of properties.
+      if (result) {
+        for (key in b) {
+          if (_.has(b, key) && !(size--)) break;
+        }
+        result = !size;
+      }
+    }
+    // Remove the first object from the stack of traversed objects.
+    aStack.pop();
+    bStack.pop();
+    return result;
+  };
+
+  // Perform a deep comparison to check if two objects are equal.
+  _.isEqual = function(a, b) {
+    return eq(a, b, [], []);
+  };
+
+  // Is a given array, string, or object empty?
+  // An "empty" object has no enumerable own-properties.
+  _.isEmpty = function(obj) {
+    if (obj == null) return true;
+    if (_.isArray(obj) || _.isString(obj)) return obj.length === 0;
+    for (var key in obj) if (_.has(obj, key)) return false;
+    return true;
+  };
+
+  // Is a given value a DOM element?
+  _.isElement = function(obj) {
+    return !!(obj && obj.nodeType === 1);
+  };
+
+  // Is a given value an array?
+  // Delegates to ECMA5's native Array.isArray
+  _.isArray = nativeIsArray || function(obj) {
+    return toString.call(obj) == '[object Array]';
+  };
+
+  // Is a given variable an object?
+  _.isObject = function(obj) {
+    return obj === Object(obj);
+  };
+
+  // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp.
+  each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) {
+    _['is' + name] = function(obj) {
+      return toString.call(obj) == '[object ' + name + ']';
+    };
+  });
+
+  // Define a fallback version of the method in browsers (ahem, IE), where
+  // there isn't any inspectable "Arguments" type.
+  if (!_.isArguments(arguments)) {
+    _.isArguments = function(obj) {
+      return !!(obj && _.has(obj, 'callee'));
+    };
+  }
+
+  // Optimize `isFunction` if appropriate.
+  if (typeof (/./) !== 'function') {
+    _.isFunction = function(obj) {
+      return typeof obj === 'function';
+    };
+  }
+
+  // Is a given object a finite number?
+  _.isFinite = function(obj) {
+    return isFinite(obj) && !isNaN(parseFloat(obj));
+  };
+
+  // Is the given value `NaN`? (NaN is the only number which does not equal itself).
+  _.isNaN = function(obj) {
+    return _.isNumber(obj) && obj != +obj;
+  };
+
+  // Is a given value a boolean?
+  _.isBoolean = function(obj) {
+    return obj === true || obj === false || toString.call(obj) == '[object Boolean]';
+  };
+
+  // Is a given value equal to null?
+  _.isNull = function(obj) {
+    return obj === null;
+  };
+
+  // Is a given variable undefined?
+  _.isUndefined = function(obj) {
+    return obj === void 0;
+  };
+
+  // Shortcut function for checking if an object has a given property directly
+  // on itself (in other words, not on a prototype).
+  _.has = function(obj, key) {
+    return hasOwnProperty.call(obj, key);
+  };
+
+  // Utility Functions
+  // -----------------
+
+  // Run Underscore.js in *noConflict* mode, returning the `_` variable to its
+  // previous owner. Returns a reference to the Underscore object.
+  _.noConflict = function() {
+    root._ = previousUnderscore;
+    return this;
+  };
+
+  // Keep the identity function around for default iterators.
+  _.identity = function(value) {
+    return value;
+  };
+
+  // Run a function **n** times.
+  _.times = function(n, iterator, context) {
+    var accum = Array(Math.max(0, n));
+    for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i);
+    return accum;
+  };
+
+  // Return a random integer between min and max (inclusive).
+  _.random = function(min, max) {
+    if (max == null) {
+      max = min;
+      min = 0;
+    }
+    return min + Math.floor(Math.random() * (max - min + 1));
+  };
+
+  // List of HTML entities for escaping.
+  var entityMap = {
+    escape: {
+      '&': '&amp;',
+      '<': '&lt;',
+      '>': '&gt;',
+      '"': '&quot;',
+      "'": '&#x27;'
+    }
+  };
+  entityMap.unescape = _.invert(entityMap.escape);
+
+  // Regexes containing the keys and values listed immediately above.
+  var entityRegexes = {
+    escape:   new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'),
+    unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g')
+  };
+
+  // Functions for escaping and unescaping strings to/from HTML interpolation.
+  _.each(['escape', 'unescape'], function(method) {
+    _[method] = function(string) {
+      if (string == null) return '';
+      return ('' + string).replace(entityRegexes[method], function(match) {
+        return entityMap[method][match];
+      });
+    };
+  });
+
+  // If the value of the named `property` is a function then invoke it with the
+  // `object` as context; otherwise, return it.
+  _.result = function(object, property) {
+    if (object == null) return void 0;
+    var value = object[property];
+    return _.isFunction(value) ? value.call(object) : value;
+  };
+
+  // Add your own custom functions to the Underscore object.
+  _.mixin = function(obj) {
+    each(_.functions(obj), function(name) {
+      var func = _[name] = obj[name];
+      _.prototype[name] = function() {
+        var args = [this._wrapped];
+        push.apply(args, arguments);
+        return result.call(this, func.apply(_, args));
+      };
+    });
+  };
+
+  // Generate a unique integer id (unique within the entire client session).
+  // Useful for temporary DOM ids.
+  var idCounter = 0;
+  _.uniqueId = function(prefix) {
+    var id = ++idCounter + '';
+    return prefix ? prefix + id : id;
+  };
+
+  // By default, Underscore uses ERB-style template delimiters, change the
+  // following template settings to use alternative delimiters.
+  _.templateSettings = {
+    evaluate    : /<%([\s\S]+?)%>/g,
+    interpolate : /<%=([\s\S]+?)%>/g,
+    escape      : /<%-([\s\S]+?)%>/g
+  };
+
+  // When customizing `templateSettings`, if you don't want to define an
+  // interpolation, evaluation or escaping regex, we need one that is
+  // guaranteed not to match.
+  var noMatch = /(.)^/;
+
+  // Certain characters need to be escaped so that they can be put into a
+  // string literal.
+  var escapes = {
+    "'":      "'",
+    '\\':     '\\',
+    '\r':     'r',
+    '\n':     'n',
+    '\t':     't',
+    '\u2028': 'u2028',
+    '\u2029': 'u2029'
+  };
+
+  var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g;
+
+  // JavaScript micro-templating, similar to John Resig's implementation.
+  // Underscore templating handles arbitrary delimiters, preserves whitespace,
+  // and correctly escapes quotes within interpolated code.
+  _.template = function(text, data, settings) {
+    var render;
+    settings = _.defaults({}, settings, _.templateSettings);
+
+    // Combine delimiters into one regular expression via alternation.
+    var matcher = new RegExp([
+      (settings.escape || noMatch).source,
+      (settings.interpolate || noMatch).source,
+      (settings.evaluate || noMatch).source
+    ].join('|') + '|$', 'g');
+
+    // Compile the template source, escaping string literals appropriately.
+    var index = 0;
+    var source = "__p+='";
+    text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {
+      source += text.slice(index, offset)
+        .replace(escaper, function(match) { return '\\' + escapes[match]; });
+
+      if (escape) {
+        source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'";
+      }
+      if (interpolate) {
+        source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'";
+      }
+      if (evaluate) {
+        source += "';\n" + evaluate + "\n__p+='";
+      }
+      index = offset + match.length;
+      return match;
+    });
+    source += "';\n";
+
+    // If a variable is not specified, place data values in local scope.
+    if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n';
+
+    source = "var __t,__p='',__j=Array.prototype.join," +
+      "print=function(){__p+=__j.call(arguments,'');};\n" +
+      source + "return __p;\n";
+
+    try {
+      render = new Function(settings.variable || 'obj', '_', source);
+    } catch (e) {
+      e.source = source;
+      throw e;
+    }
+
+    if (data) return render(data, _);
+    var template = function(data) {
+      return render.call(this, data, _);
+    };
+
+    // Provide the compiled function source as a convenience for precompilation.
+    template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}';
+
+    return template;
+  };
+
+  // Add a "chain" function, which will delegate to the wrapper.
+  _.chain = function(obj) {
+    return _(obj).chain();
+  };
+
+  // OOP
+  // ---------------
+  // If Underscore is called as a function, it returns a wrapped object that
+  // can be used OO-style. This wrapper holds altered versions of all the
+  // underscore functions. Wrapped objects may be chained.
+
+  // Helper function to continue chaining intermediate results.
+  var result = function(obj) {
+    return this._chain ? _(obj).chain() : obj;
+  };
+
+  // Add all of the Underscore functions to the wrapper object.
+  _.mixin(_);
+
+  // Add all mutator Array functions to the wrapper.
+  each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      var obj = this._wrapped;
+      method.apply(obj, arguments);
+      if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0];
+      return result.call(this, obj);
+    };
+  });
+
+  // Add all accessor Array functions to the wrapper.
+  each(['concat', 'join', 'slice'], function(name) {
+    var method = ArrayProto[name];
+    _.prototype[name] = function() {
+      return result.call(this, method.apply(this._wrapped, arguments));
+    };
+  });
+
+  _.extend(_.prototype, {
+
+    // Start chaining a wrapped Underscore object.
+    chain: function() {
+      this._chain = true;
+      return this;
+    },
+
+    // Extracts the result from a wrapped and chained object.
+    value: function() {
+      return this._wrapped;
+    }
+
+  });
+
+}).call(this);
new file mode 100644
index 0000000000000000000000000000000000000000..da1ed9f2c90797cd9cbd5739247d23d93f617816
GIT binary patch
literal 2088734
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
E4;OUJO8@`>
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/frameworks/yui-3.12.js
@@ -0,0 +1,11542 @@
+/*
+YUI 3.12.0 (build 8655935)
+Copyright 2013 Yahoo! Inc. All rights reserved.
+Licensed under the BSD License.
+http://yuilibrary.com/license/
+*/
+
+/**
+The YUI module contains the components required for building the YUI seed file.
+This includes the script loading mechanism, a simple queue, and the core
+utilities for the library.
+
+@module yui
+@main yui
+@submodule yui-base
+**/
+
+/*jshint eqeqeq: false*/
+if (typeof YUI != 'undefined') {
+    YUI._YUI = YUI;
+}
+
+/**
+The YUI global namespace object. This is the constructor for all YUI instances.
+
+This is a self-instantiable factory function, meaning you don't need to precede
+it with the `new` operator. You can invoke it directly like this:
+
+    YUI().use('*', function (Y) {
+        // Y is a new YUI instance.
+    });
+
+But it also works like this:
+
+    var Y = YUI();
+
+The `YUI` constructor accepts an optional config object, like this:
+
+    YUI({
+        debug: true,
+        combine: false
+    }).use('node', function (Y) {
+        // Y.Node is ready to use.
+    });
+
+See the API docs for the <a href="config.html">Config</a> class for the complete
+list of supported configuration properties accepted by the YUI constuctor.
+
+If a global `YUI` object is already defined, the existing YUI object will not be
+overwritten, to ensure that defined namespaces are preserved.
+
+Each YUI instance has full custom event support, but only if the event system is
+available.
+
+@class YUI
+@uses EventTarget
+@constructor
+@global
+@param {Object} [config]* Zero or more optional configuration objects. Config
+    values are stored in the `Y.config` property. See the
+    <a href="config.html">Config</a> docs for the list of supported properties.
+**/
+
+    /*global YUI*/
+    /*global YUI_config*/
+    var YUI = function() {
+        var i = 0,
+            Y = this,
+            args = arguments,
+            l = args.length,
+            instanceOf = function(o, type) {
+                return (o && o.hasOwnProperty && (o instanceof type));
+            },
+            gconf = (typeof YUI_config !== 'undefined') && YUI_config;
+
+        if (!(instanceOf(Y, YUI))) {
+            Y = new YUI();
+        } else {
+            // set up the core environment
+            Y._init();
+
+            /**
+            Master configuration that might span multiple contexts in a non-
+            browser environment. It is applied first to all instances in all
+            contexts.
+
+            @example
+
+                YUI.GlobalConfig = {
+                    filter: 'debug'
+                };
+
+                YUI().use('node', function (Y) {
+                    // debug files used here
+                });
+
+                YUI({
+                    filter: 'min'
+                }).use('node', function (Y) {
+                    // min files used here
+                });
+
+            @property {Object} GlobalConfig
+            @global
+            @static
+            **/
+            if (YUI.GlobalConfig) {
+                Y.applyConfig(YUI.GlobalConfig);
+            }
+
+            /**
+            Page-level config applied to all YUI instances created on the
+            current page. This is applied after `YUI.GlobalConfig` and before
+            any instance-level configuration.
+
+            @example
+
+                // Single global var to include before YUI seed file
+                YUI_config = {
+                    filter: 'debug'
+                };
+
+                YUI().use('node', function (Y) {
+                    // debug files used here
+                });
+
+                YUI({
+                    filter: 'min'
+                }).use('node', function (Y) {
+                    // min files used here
+                });
+
+            @property {Object} YUI_config
+            @global
+            **/
+            if (gconf) {
+                Y.applyConfig(gconf);
+            }
+
+            // bind the specified additional modules for this instance
+            if (!l) {
+                Y._setup();
+            }
+        }
+
+        if (l) {
+            // Each instance can accept one or more configuration objects.
+            // These are applied after YUI.GlobalConfig and YUI_Config,
+            // overriding values set in those config files if there is a
+            // matching property.
+            for (; i < l; i++) {
+                Y.applyConfig(args[i]);
+            }
+
+            Y._setup();
+        }
+
+        Y.instanceOf = instanceOf;
+
+        return Y;
+    };
+
+(function() {
+
+    var proto, prop,
+        VERSION = '3.12.0',
+        PERIOD = '.',
+        BASE = 'http://yui.yahooapis.com/',
+        /*
+            These CSS class names can't be generated by
+            getClassName since it is not available at the
+            time they are being used.
+        */
+        DOC_LABEL = 'yui3-js-enabled',
+        CSS_STAMP_EL = 'yui3-css-stamp',
+        NOOP = function() {},
+        SLICE = Array.prototype.slice,
+        APPLY_TO_AUTH = { 'io.xdrReady': 1,   // the functions applyTo
+                          'io.xdrResponse': 1,   // can call. this should
+                          'SWF.eventHandler': 1 }, // be done at build time
+        hasWin = (typeof window != 'undefined'),
+        win = (hasWin) ? window : null,
+        doc = (hasWin) ? win.document : null,
+        docEl = doc && doc.documentElement,
+        docClass = docEl && docEl.className,
+        instances = {},
+        time = new Date().getTime(),
+        add = function(el, type, fn, capture) {
+            if (el && el.addEventListener) {
+                el.addEventListener(type, fn, capture);
+            } else if (el && el.attachEvent) {
+                el.attachEvent('on' + type, fn);
+            }
+        },
+        remove = function(el, type, fn, capture) {
+            if (el && el.removeEventListener) {
+                // this can throw an uncaught exception in FF
+                try {
+                    el.removeEventListener(type, fn, capture);
+                } catch (ex) {}
+            } else if (el && el.detachEvent) {
+                el.detachEvent('on' + type, fn);
+            }
+        },
+        handleLoad = function() {
+            YUI.Env.windowLoaded = true;
+            YUI.Env.DOMReady = true;
+            if (hasWin) {
+                remove(window, 'load', handleLoad);
+            }
+        },
+        getLoader = function(Y, o) {
+            var loader = Y.Env._loader,
+                lCore = [ 'loader-base' ],
+                G_ENV = YUI.Env,
+                mods = G_ENV.mods;
+
+            if (loader) {
+                //loader._config(Y.config);
+                loader.ignoreRegistered = false;
+                loader.onEnd = null;
+                loader.data = null;
+                loader.required = [];
+                loader.loadType = null;
+            } else {
+                loader = new Y.Loader(Y.config);
+                Y.Env._loader = loader;
+            }
+            if (mods && mods.loader) {
+                lCore = [].concat(lCore, YUI.Env.loaderExtras);
+            }
+            YUI.Env.core = Y.Array.dedupe([].concat(YUI.Env.core, lCore));
+
+            return loader;
+        },
+
+        clobber = function(r, s) {
+            for (var i in s) {
+                if (s.hasOwnProperty(i)) {
+                    r[i] = s[i];
+                }
+            }
+        },
+
+        ALREADY_DONE = { success: true };
+
+//  Stamp the documentElement (HTML) with a class of "yui-loaded" to
+//  enable styles that need to key off of JS being enabled.
+if (docEl && docClass.indexOf(DOC_LABEL) == -1) {
+    if (docClass) {
+        docClass += ' ';
+    }
+    docClass += DOC_LABEL;
+    docEl.className = docClass;
+}
+
+if (VERSION.indexOf('@') > -1) {
+    VERSION = '3.5.0'; // dev time hack for cdn test
+}
+
+proto = {
+    /**
+    Applies a new configuration object to the config of this YUI instance. This
+    will merge new group/module definitions, and will also update the loader
+    cache if necessary. Updating `Y.config` directly will not update the cache.
+
+    @method applyConfig
+    @param {Object} o the configuration object.
+    @since 3.2.0
+    **/
+    applyConfig: function(o) {
+
+        o = o || NOOP;
+
+        var attr,
+            name,
+            // detail,
+            config = this.config,
+            mods = config.modules,
+            groups = config.groups,
+            aliases = config.aliases,
+            loader = this.Env._loader;
+
+        for (name in o) {
+            if (o.hasOwnProperty(name)) {
+                attr = o[name];
+                if (mods && name == 'modules') {
+                    clobber(mods, attr);
+                } else if (aliases && name == 'aliases') {
+                    clobber(aliases, attr);
+                } else if (groups && name == 'groups') {
+                    clobber(groups, attr);
+                } else if (name == 'win') {
+                    config[name] = (attr && attr.contentWindow) || attr;
+                    config.doc = config[name] ? config[name].document : null;
+                } else if (name == '_yuid') {
+                    // preserve the guid
+                } else {
+                    config[name] = attr;
+                }
+            }
+        }
+
+        if (loader) {
+            loader._config(o);
+        }
+
+    },
+
+    /**
+    Old way to apply a config to this instance (calls `applyConfig` under the
+    hood).
+
+    @private
+    @method _config
+    @param {Object} o The config to apply
+    **/
+    _config: function(o) {
+        this.applyConfig(o);
+    },
+
+    /**
+    Initializes this YUI instance.
+
+    @private
+    @method _init
+    **/
+    _init: function() {
+        var filter, el,
+            Y = this,
+            G_ENV = YUI.Env,
+            Env = Y.Env,
+            prop;
+
+        /**
+        The version number of this YUI instance.
+
+        This value is typically updated by a script when a YUI release is built,
+        so it may not reflect the correct version number when YUI is run from
+        the development source tree.
+
+        @property {String} version
+        **/
+        Y.version = VERSION;
+
+        if (!Env) {
+            Y.Env = {
+                core: ['get', 'features', 'intl-base', 'yui-log', 'yui-later', 'loader-base', 'loader-rollup', 'loader-yui3'],
+                loaderExtras: ['loader-rollup', 'loader-yui3'],
+                mods: {}, // flat module map
+                versions: {}, // version module map
+                base: BASE,
+                cdn: BASE + VERSION + '/build/',
+                // bootstrapped: false,
+                _idx: 0,
+                _used: {},
+                _attached: {},
+                _missed: [],
+                _yidx: 0,
+                _uidx: 0,
+                _guidp: 'y',
+                _loaded: {},
+                // serviced: {},
+                // Regex in English:
+                // I'll start at the \b(simpleyui).
+                // 1. Look in the test string for "simpleyui" or "yui" or
+                //    "yui-base" or "yui-davglass" or "yui-foobar" that comes after a word break.  That is, it
+                //    can't match "foyui" or "i_heart_simpleyui". This can be anywhere in the string.
+                // 2. After #1 must come a forward slash followed by the string matched in #1, so
+                //    "yui-base/yui-base" or "simpleyui/simpleyui" or "yui-pants/yui-pants".
+                // 3. The second occurence of the #1 token can optionally be followed by "-debug" or "-min",
+                //    so "yui/yui-min", "yui/yui-debug", "yui-base/yui-base-debug". NOT "yui/yui-tshirt".
+                // 4. This is followed by ".js", so "yui/yui.js", "simpleyui/simpleyui-min.js"
+                // 0. Going back to the beginning, now. If all that stuff in 1-4 comes after a "?" in the string,
+                //    then capture the junk between the LAST "&" and the string in 1-4.  So
+                //    "blah?foo/yui/yui.js" will capture "foo/" and "blah?some/thing.js&3.3.0/build/yui-davglass/yui-davglass.js"
+                //    will capture "3.3.0/build/"
+                //
+                // Regex Exploded:
+                // (?:\?             Find a ?
+                //   (?:[^&]*&)      followed by 0..n characters followed by an &
+                //   *               in fact, find as many sets of characters followed by a & as you can
+                //   ([^&]*)         capture the stuff after the last & in \1
+                // )?                but it's ok if all this ?junk&more_junk stuff isn't even there
+                // \b(simpleyui|     after a word break find either the string "simpleyui" or
+                //    yui(?:-\w+)?   the string "yui" optionally followed by a -, then more characters
+                // )                 and store the simpleyui or yui-* string in \2
+                // \/\2              then comes a / followed by the simpleyui or yui-* string in \2
+                // (?:-(min|debug))? optionally followed by "-min" or "-debug"
+                // .js               and ending in ".js"
+                _BASE_RE: /(?:\?(?:[^&]*&)*([^&]*))?\b(simpleyui|yui(?:-\w+)?)\/\2(?:-(min|debug))?\.js/,
+                parseBasePath: function(src, pattern) {
+                    var match = src.match(pattern),
+                        path, filter;
+
+                    if (match) {
+                        path = RegExp.leftContext || src.slice(0, src.indexOf(match[0]));
+
+                        // this is to set up the path to the loader.  The file
+                        // filter for loader should match the yui include.
+                        filter = match[3];
+
+                        // extract correct path for mixed combo urls
+                        // http://yuilibrary.com/projects/yui3/ticket/2528423
+                        if (match[1]) {
+                            path += '?' + match[1];
+                        }
+                        path = {
+                            filter: filter,
+                            path: path
+                        };
+                    }
+                    return path;
+                },
+                getBase: G_ENV && G_ENV.getBase ||
+                        function(pattern) {
+                            var nodes = (doc && doc.getElementsByTagName('script')) || [],
+                                path = Env.cdn, parsed,
+                                i, len, src;
+
+                            for (i = 0, len = nodes.length; i < len; ++i) {
+                                src = nodes[i].src;
+                                if (src) {
+                                    parsed = Y.Env.parseBasePath(src, pattern);
+                                    if (parsed) {
+                                        filter = parsed.filter;
+                                        path = parsed.path;
+                                        break;
+                                    }
+                                }
+                            }
+
+                            // use CDN default
+                            return path;
+                        }
+
+            };
+
+            Env = Y.Env;
+
+            Env._loaded[VERSION] = {};
+
+            if (G_ENV && Y !== YUI) {
+                Env._yidx = ++G_ENV._yidx;
+                Env._guidp = ('yui_' + VERSION + '_' +
+                             Env._yidx + '_' + time).replace(/[^a-z0-9_]+/g, '_');
+            } else if (YUI._YUI) {
+
+                G_ENV = YUI._YUI.Env;
+                Env._yidx += G_ENV._yidx;
+                Env._uidx += G_ENV._uidx;
+
+                for (prop in G_ENV) {
+                    if (!(prop in Env)) {
+                        Env[prop] = G_ENV[prop];
+                    }
+                }
+
+                delete YUI._YUI;
+            }
+
+            Y.id = Y.stamp(Y);
+            instances[Y.id] = Y;
+
+        }
+
+        Y.constructor = YUI;
+
+        // configuration defaults
+        Y.config = Y.config || {
+            bootstrap: true,
+            cacheUse: true,
+            debug: true,
+            doc: doc,
+            fetchCSS: true,
+            throwFail: true,
+            useBrowserConsole: true,
+            useNativeES5: true,
+            win: win,
+            global: Function('return this')()
+        };
+
+        //Register the CSS stamp element
+        if (doc && !doc.getElementById(CSS_STAMP_EL)) {
+            el = doc.createElement('div');
+            el.innerHTML = '<div id="' + CSS_STAMP_EL + '" style="position: absolute !important; visibility: hidden !important"></div>';
+            YUI.Env.cssStampEl = el.firstChild;
+            if (doc.body) {
+                doc.body.appendChild(YUI.Env.cssStampEl);
+            } else {
+                docEl.insertBefore(YUI.Env.cssStampEl, docEl.firstChild);
+            }
+        } else if (doc && doc.getElementById(CSS_STAMP_EL) && !YUI.Env.cssStampEl) {
+            YUI.Env.cssStampEl = doc.getElementById(CSS_STAMP_EL);
+        }
+
+        Y.config.lang = Y.config.lang || 'en-US';
+
+        Y.config.base = YUI.config.base || Y.Env.getBase(Y.Env._BASE_RE);
+
+        if (!filter || (!('mindebug').indexOf(filter))) {
+            filter = 'min';
+        }
+        filter = (filter) ? '-' + filter : filter;
+        Y.config.loaderPath = YUI.config.loaderPath || 'loader/loader' + filter + '.js';
+
+    },
+
+    /**
+    Finishes the instance setup. Attaches whatever YUI modules were defined
+    at the time that this instance was created.
+
+    @method _setup
+    @private
+    **/
+    _setup: function() {
+        var i, Y = this,
+            core = [],
+            mods = YUI.Env.mods,
+            extras = Y.config.core || [].concat(YUI.Env.core); //Clone it..
+
+        for (i = 0; i < extras.length; i++) {
+            if (mods[extras[i]]) {
+                core.push(extras[i]);
+            }
+        }
+
+        Y._attach(['yui-base']);
+        Y._attach(core);
+
+        if (Y.Loader) {
+            getLoader(Y);
+        }
+
+    },
+
+    /**
+    Executes the named method on the specified YUI instance if that method is
+    whitelisted.
+
+    @method applyTo
+    @param {String} id YUI instance id.
+    @param {String} method Name of the method to execute. For example:
+        'Object.keys'.
+    @param {Array} args Arguments to apply to the method.
+    @return {Mixed} Return value from the applied method, or `null` if the
+        specified instance was not found or the method was not whitelisted.
+    **/
+    applyTo: function(id, method, args) {
+        if (!(method in APPLY_TO_AUTH)) {
+            this.log(method + ': applyTo not allowed', 'warn', 'yui');
+            return null;
+        }
+
+        var instance = instances[id], nest, m, i;
+        if (instance) {
+            nest = method.split('.');
+            m = instance;
+            for (i = 0; i < nest.length; i = i + 1) {
+                m = m[nest[i]];
+                if (!m) {
+                    this.log('applyTo not found: ' + method, 'warn', 'yui');
+                }
+            }
+            return m && m.apply(instance, args);
+        }
+
+        return null;
+    },
+
+/**
+Registers a YUI module and makes it available for use in a `YUI().use()` call or
+as a dependency for other modules.
+
+The easiest way to create a first-class YUI module is to use
+<a href="http://yui.github.com/shifter/">Shifter</a>, the YUI component build
+tool.
+
+Shifter will automatically wrap your module code in a `YUI.add()` call along
+with any configuration info required for the module.
+
+@example
+
+    YUI.add('davglass', function (Y) {
+        Y.davglass = function () {
+        };
+    }, '3.4.0', {
+        requires: ['harley-davidson', 'mt-dew']
+    });
+
+@method add
+@param {String} name Module name.
+@param {Function} fn Function containing module code. This function will be
+    executed whenever the module is attached to a specific YUI instance.
+
+    @param {YUI} fn.Y The YUI instance to which this module is attached.
+    @param {String} fn.name Name of the module
+
+@param {String} version Module version number. This is currently used only for
+    informational purposes, and is not used internally by YUI.
+
+@param {Object} [config] Module config.
+    @param {Array} [config.requires] Array of other module names that must be
+        attached before this module can be attached.
+    @param {Array} [config.optional] Array of optional module names that should
+        be attached before this module is attached if they've already been
+        loaded. If the `loadOptional` YUI option is `true`, optional modules
+        that have not yet been loaded will be loaded just as if they were hard
+        requirements.
+    @param {Array} [config.use] Array of module names that are included within
+        or otherwise provided by this module, and which should be attached
+        automatically when this module is attached. This makes it possible to
+        create "virtual rollup" modules that simply attach a collection of other
+        modules or submodules.
+
+@return {YUI} This YUI instance.
+**/
+    add: function(name, fn, version, details) {
+        details = details || {};
+        var env = YUI.Env,
+            mod = {
+                name: name,
+                fn: fn,
+                version: version,
+                details: details
+            },
+            //Instance hash so we don't apply it to the same instance twice
+            applied = {},
+            loader, inst,
+            i, versions = env.versions;
+
+        env.mods[name] = mod;
+        versions[version] = versions[version] || {};
+        versions[version][name] = mod;
+
+        for (i in instances) {
+            if (instances.hasOwnProperty(i)) {
+                inst = instances[i];
+                if (!applied[inst.id]) {
+                    applied[inst.id] = true;
+                    loader = inst.Env._loader;
+                    if (loader) {
+                        if (!loader.moduleInfo[name] || loader.moduleInfo[name].temp) {
+                            loader.addModule(details, name);
+                        }
+                    }
+                }
+            }
+        }
+
+        return this;
+    },
+
+    /**
+    Executes the callback function associated with each required module,
+    attaching the module to this YUI instance.
+
+    @method _attach
+    @param {Array} r The array of modules to attach
+    @param {Boolean} [moot=false] If `true`, don't throw a warning if the module
+        is not attached.
+    @private
+    **/
+    _attach: function(r, moot) {
+        var i, name, mod, details, req, use, after,
+            mods = YUI.Env.mods,
+            aliases = YUI.Env.aliases,
+            Y = this, j,
+            cache = YUI.Env._renderedMods,
+            loader = Y.Env._loader,
+            done = Y.Env._attached,
+            len = r.length, loader, def, go,
+            c = [];
+
+        //Check for conditional modules (in a second+ instance) and add their requirements
+        //TODO I hate this entire method, it needs to be fixed ASAP (3.5.0) ^davglass
+        for (i = 0; i < len; i++) {
+            name = r[i];
+            mod = mods[name];
+            c.push(name);
+            if (loader && loader.conditions[name]) {
+                for (j in loader.conditions[name]) {
+                    if (loader.conditions[name].hasOwnProperty(j)) {
+                        def = loader.conditions[name][j];
+                        go = def && ((def.ua && Y.UA[def.ua]) || (def.test && def.test(Y)));
+                        if (go) {
+                            c.push(def.name);
+                        }
+                    }
+                }
+            }
+        }
+        r = c;
+        len = r.length;
+
+        for (i = 0; i < len; i++) {
+            if (!done[r[i]]) {
+                name = r[i];
+                mod = mods[name];
+
+                if (aliases && aliases[name] && !mod) {
+                    Y._attach(aliases[name]);
+                    continue;
+                }
+                if (!mod) {
+                    if (loader && loader.moduleInfo[name]) {
+                        mod = loader.moduleInfo[name];
+                        moot = true;
+                    }
+
+
+                    //if (!loader || !loader.moduleInfo[name]) {
+                    //if ((!loader || !loader.moduleInfo[name]) && !moot) {
+                    if (!moot && name) {
+                        if ((name.indexOf('skin-') === -1) && (name.indexOf('css') === -1)) {
+                            Y.Env._missed.push(name);
+                            Y.Env._missed = Y.Array.dedupe(Y.Env._missed);
+                            Y.message('NOT loaded: ' + name, 'warn', 'yui');
+                        }
+                    }
+                } else {
+                    done[name] = true;
+                    //Don't like this, but in case a mod was asked for once, then we fetch it
+                    //We need to remove it from the missed list ^davglass
+                    for (j = 0; j < Y.Env._missed.length; j++) {
+                        if (Y.Env._missed[j] === name) {
+                            Y.message('Found: ' + name + ' (was reported as missing earlier)', 'warn', 'yui');
+                            Y.Env._missed.splice(j, 1);
+                        }
+                    }
+                    /*
+                        If it's a temp module, we need to redo it's requirements if it's already loaded
+                        since it may have been loaded by another instance and it's dependencies might
+                        have been redefined inside the fetched file.
+                    */
+                    if (loader && cache && cache[name] && cache[name].temp) {
+                        loader.getRequires(cache[name]);
+                        req = [];
+                        for (j in loader.moduleInfo[name].expanded_map) {
+                            if (loader.moduleInfo[name].expanded_map.hasOwnProperty(j)) {
+                                req.push(j);
+                            }
+                        }
+                        Y._attach(req);
+                    }
+
+                    details = mod.details;
+                    req = details.requires;
+                    use = details.use;
+                    after = details.after;
+                    //Force Intl load if there is a language (Loader logic) @todo fix this shit
+                    if (details.lang) {
+                        req = req || [];
+                        req.unshift('intl');
+                    }
+
+                    if (req) {
+                        for (j = 0; j < req.length; j++) {
+                            if (!done[req[j]]) {
+                                if (!Y._attach(req)) {
+                                    return false;
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                    if (after) {
+                        for (j = 0; j < after.length; j++) {
+                            if (!done[after[j]]) {
+                                if (!Y._attach(after, true)) {
+                                    return false;
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+                    if (mod.fn) {
+                            if (Y.config.throwFail) {
+                                mod.fn(Y, name);
+                            } else {
+                                try {
+                                    mod.fn(Y, name);
+                                } catch (e) {
+                                    Y.error('Attach error: ' + name, e, name);
+                                return false;
+                            }
+                        }
+                    }
+
+                    if (use) {
+                        for (j = 0; j < use.length; j++) {
+                            if (!done[use[j]]) {
+                                if (!Y._attach(use)) {
+                                    return false;
+                                }
+                                break;
+                            }
+                        }
+                    }
+
+
+
+                }
+            }
+        }
+
+        return true;
+    },
+
+    /**
+    Delays the `use` callback until another event has taken place such as
+    `window.onload`, `domready`, `contentready`, or `available`.
+
+    @private
+    @method _delayCallback
+    @param {Function} cb The original `use` callback.
+    @param {String|Object} until Either an event name ('load', 'domready', etc.)
+        or an object containing event/args keys for contentready/available.
+    @return {Function}
+    **/
+    _delayCallback: function(cb, until) {
+
+        var Y = this,
+            mod = ['event-base'];
+
+        until = (Y.Lang.isObject(until) ? until : { event: until });
+
+        if (until.event === 'load') {
+            mod.push('event-synthetic');
+        }
+
+        return function() {
+            var args = arguments;
+            Y._use(mod, function() {
+                Y.on(until.event, function() {
+                    args[1].delayUntil = until.event;
+                    cb.apply(Y, args);
+                }, until.args);
+            });
+        };
+    },
+
+    /**
+    Attaches one or more modules to this YUI instance. When this is executed,
+    the requirements of the desired modules are analyzed, and one of several
+    things can happen:
+
+
+      * All required modules have already been loaded, and just need to be
+        attached to this YUI instance. In this case, the `use()` callback will
+        be executed synchronously after the modules are attached.
+
+      * One or more modules have not yet been loaded, or the Get utility is not
+        available, or the `bootstrap` config option is `false`. In this case,
+        a warning is issued indicating that modules are missing, but all
+        available modules will still be attached and the `use()` callback will
+        be executed synchronously.
+
+      * One or more modules are missing and the Loader is not available but the
+        Get utility is, and `bootstrap` is not `false`. In this case, the Get
+        utility will be used to load the Loader, and we will then proceed to
+        the following state:
+
+      * One or more modules are missing and the Loader is available. In this
+        case, the Loader will be used to resolve the dependency tree for the
+        missing modules and load them and their dependencies. When the Loader is
+        finished loading modules, the `use()` callback will be executed
+        asynchronously.
+
+    @example
+
+        // Loads and attaches dd and its dependencies.
+        YUI().use('dd', function (Y) {
+            // ...
+        });
+
+        // Loads and attaches dd and node as well as all of their dependencies.
+        YUI().use(['dd', 'node'], function (Y) {
+            // ...
+        });
+
+        // Attaches all modules that have already been loaded.
+        YUI().use('*', function (Y) {
+            // ...
+        });
+
+        // Attaches a gallery module.
+        YUI().use('gallery-yql', function (Y) {
+            // ...
+        });
+
+        // Attaches a YUI 2in3 module.
+        YUI().use('yui2-datatable', function (Y) {
+            // ...
+        });
+
+    @method use
+    @param {String|Array} modules* One or more module names to attach.
+    @param {Function} [callback] Callback function to be executed once all
+        specified modules and their dependencies have been attached.
+    @param {YUI} callback.Y The YUI instance created for this sandbox.
+    @param {Object} callback.status Object containing `success`, `msg` and
+        `data` properties.
+    @chainable
+    **/
+    use: function() {
+        var args = SLICE.call(arguments, 0),
+            callback = args[args.length - 1],
+            Y = this,
+            i = 0,
+            name,
+            Env = Y.Env,
+            provisioned = true;
+
+        // The last argument supplied to use can be a load complete callback
+        if (Y.Lang.isFunction(callback)) {
+            args.pop();
+            if (Y.config.delayUntil) {
+                callback = Y._delayCallback(callback, Y.config.delayUntil);
+            }
+        } else {
+            callback = null;
+        }
+        if (Y.Lang.isArray(args[0])) {
+            args = args[0];
+        }
+
+        if (Y.config.cacheUse) {
+            while ((name = args[i++])) {
+                if (!Env._attached[name]) {
+                    provisioned = false;
+                    break;
+                }
+            }
+
+            if (provisioned) {
+                if (args.length) {
+                }
+                Y._notify(callback, ALREADY_DONE, args);
+                return Y;
+            }
+        }
+
+        if (Y._loading) {
+            Y._useQueue = Y._useQueue || new Y.Queue();
+            Y._useQueue.add([args, callback]);
+        } else {
+            Y._use(args, function(Y, response) {
+                Y._notify(callback, response, args);
+            });
+        }
+
+        return Y;
+    },
+
+    /**
+    Handles Loader notifications about attachment/load errors.
+
+    @method _notify
+    @param {Function} callback Callback to pass to `Y.config.loadErrorFn`.
+    @param {Object} response Response returned from Loader.
+    @param {Array} args Arguments passed from Loader.
+    @private
+    **/
+    _notify: function(callback, response, args) {
+        if (!response.success && this.config.loadErrorFn) {
+            this.config.loadErrorFn.call(this, this, callback, response, args);
+        } else if (callback) {
+            if (this.Env._missed && this.Env._missed.length) {
+                response.msg = 'Missing modules: ' + this.Env._missed.join();
+                response.success = false;
+            }
+            if (this.config.throwFail) {
+                callback(this, response);
+            } else {
+                try {
+                    callback(this, response);
+                } catch (e) {
+                    this.error('use callback error', e, args);
+                }
+            }
+        }
+    },
+
+    /**
+    Called from the `use` method queue to ensure that only one set of loading
+    logic is performed at a time.
+
+    @method _use
+    @param {String} args* One or more modules to attach.
+    @param {Function} [callback] Function to call once all required modules have
+        been attached.
+    @private
+    **/
+    _use: function(args, callback) {
+
+        if (!this.Array) {
+            this._attach(['yui-base']);
+        }
+
+        var len, loader, handleBoot,
+            Y = this,
+            G_ENV = YUI.Env,
+            mods = G_ENV.mods,
+            Env = Y.Env,
+            used = Env._used,
+            aliases = G_ENV.aliases,
+            queue = G_ENV._loaderQueue,
+            firstArg = args[0],
+            YArray = Y.Array,
+            config = Y.config,
+            boot = config.bootstrap,
+            missing = [],
+            i,
+            r = [],
+            ret = true,
+            fetchCSS = config.fetchCSS,
+            process = function(names, skip) {
+
+                var i = 0, a = [], name, len, m, req, use;
+
+                if (!names.length) {
+                    return;
+                }
+
+                if (aliases) {
+                    len = names.length;
+                    for (i = 0; i < len; i++) {
+                        if (aliases[names[i]] && !mods[names[i]]) {
+                            a = [].concat(a, aliases[names[i]]);
+                        } else {
+                            a.push(names[i]);
+                        }
+                    }
+                    names = a;
+                }
+
+                len = names.length;
+
+                for (i = 0; i < len; i++) {
+                    name = names[i];
+                    if (!skip) {
+                        r.push(name);
+                    }
+
+                    // only attach a module once
+                    if (used[name]) {
+                        continue;
+                    }
+
+                    m = mods[name];
+                    req = null;
+                    use = null;
+
+                    if (m) {
+                        used[name] = true;
+                        req = m.details.requires;
+                        use = m.details.use;
+                    } else {
+                        // CSS files don't register themselves, see if it has
+                        // been loaded
+                        if (!G_ENV._loaded[VERSION][name]) {
+                            missing.push(name);
+                        } else {
+                            used[name] = true; // probably css
+                        }
+                    }
+
+                    // make sure requirements are attached
+                    if (req && req.length) {
+                        process(req);
+                    }
+
+                    // make sure we grab the submodule dependencies too
+                    if (use && use.length) {
+                        process(use, 1);
+                    }
+                }
+
+            },
+
+            handleLoader = function(fromLoader) {
+                var response = fromLoader || {
+                        success: true,
+                        msg: 'not dynamic'
+                    },
+                    redo, origMissing,
+                    ret = true,
+                    data = response.data;
+
+                Y._loading = false;
+
+                if (data) {
+                    origMissing = missing;
+                    missing = [];
+                    r = [];
+                    process(data);
+                    redo = missing.length;
+                    if (redo) {
+                        if ([].concat(missing).sort().join() ==
+                                origMissing.sort().join()) {
+                            redo = false;
+                        }
+                    }
+                }
+
+                if (redo && data) {
+                    Y._loading = true;
+                    Y._use(missing, function() {
+                        if (Y._attach(data)) {
+                            Y._notify(callback, response, data);
+                        }
+                    });
+                } else {
+                    if (data) {
+                        ret = Y._attach(data);
+                    }
+                    if (ret) {
+                        Y._notify(callback, response, args);
+                    }
+                }
+
+                if (Y._useQueue && Y._useQueue.size() && !Y._loading) {
+                    Y._use.apply(Y, Y._useQueue.next());
+                }
+
+            };
+
+
+        // YUI().use('*'); // bind everything available
+        if (firstArg === '*') {
+            args = [];
+            for (i in mods) {
+                if (mods.hasOwnProperty(i)) {
+                    args.push(i);
+                }
+            }
+            ret = Y._attach(args);
+            if (ret) {
+                handleLoader();
+            }
+            return Y;
+        }
+
+        if ((mods.loader || mods['loader-base']) && !Y.Loader) {
+            Y._attach(['loader' + ((!mods.loader) ? '-base' : '')]);
+        }
+
+
+        // use loader to expand dependencies and sort the
+        // requirements if it is available.
+        if (boot && Y.Loader && args.length) {
+            loader = getLoader(Y);
+            loader.require(args);
+            loader.ignoreRegistered = true;
+            loader._boot = true;
+            loader.calculate(null, (fetchCSS) ? null : 'js');
+            args = loader.sorted;
+            loader._boot = false;
+        }
+
+        process(args);
+
+        len = missing.length;
+
+
+        if (len) {
+            missing = YArray.dedupe(missing);
+            len = missing.length;
+        }
+
+
+        // dynamic load
+        if (boot && len && Y.Loader) {
+            Y._loading = true;
+            loader = getLoader(Y);
+            loader.onEnd = handleLoader;
+            loader.context = Y;
+            loader.data = args;
+            loader.ignoreRegistered = false;
+            loader.require(missing);
+            loader.insert(null, (fetchCSS) ? null : 'js');
+
+        } else if (boot && len && Y.Get && !Env.bootstrapped) {
+
+            Y._loading = true;
+
+            handleBoot = function() {
+                Y._loading = false;
+                queue.running = false;
+                Env.bootstrapped = true;
+                G_ENV._bootstrapping = false;
+                if (Y._attach(['loader'])) {
+                    Y._use(args, callback);
+                }
+            };
+
+            if (G_ENV._bootstrapping) {
+                queue.add(handleBoot);
+            } else {
+                G_ENV._bootstrapping = true;
+                Y.Get.script(config.base + config.loaderPath, {
+                    onEnd: handleBoot
+                });
+            }
+
+        } else {
+            ret = Y._attach(args);
+            if (ret) {
+                handleLoader();
+            }
+        }
+
+        return Y;
+    },
+
+
+    /**
+    Utility method for safely creating namespaces if they don't already exist.
+    May be called statically on the YUI global object or as a method on a YUI
+    instance.
+
+    When called statically, a namespace will be created on the YUI global
+    object:
+
+        // Create `YUI.your.namespace.here` as nested objects, preserving any
+        // objects that already exist instead of overwriting them.
+        YUI.namespace('your.namespace.here');
+
+    When called as a method on a YUI instance, a namespace will be created on
+    that instance:
+
+        // Creates `Y.property.package`.
+        Y.namespace('property.package');
+
+    Dots in the input string cause `namespace` to create nested objects for each
+    token. If any part of the requested namespace already exists, the current
+    object will be left in place and will not be overwritten. This allows
+    multiple calls to `namespace` to preserve existing namespaced properties.
+
+    If the first token in the namespace string is "YAHOO", that token is
+    discarded. This is legacy behavior for backwards compatibility with YUI 2.
+
+    Be careful with namespace tokens. Reserved words may work in some browsers
+    and not others. For instance, the following will fail in some browsers
+    because the supported version of JavaScript reserves the word "long":
+
+        Y.namespace('really.long.nested.namespace');
+
+    Note: If you pass multiple arguments to create multiple namespaces, only the
+    last one created is returned from this function.
+
+    @method namespace
+    @param {String} namespace* One or more namespaces to create.
+    @return {Object} Reference to the last namespace object created.
+    **/
+    namespace: function() {
+        var a = arguments, o, i = 0, j, d, arg;
+
+        for (; i < a.length; i++) {
+            o = this; //Reset base object per argument or it will get reused from the last
+            arg = a[i];
+            if (arg.indexOf(PERIOD) > -1) { //Skip this if no "." is present
+                d = arg.split(PERIOD);
+                for (j = (d[0] == 'YAHOO') ? 1 : 0; j < d.length; j++) {
+                    o[d[j]] = o[d[j]] || {};
+                    o = o[d[j]];
+                }
+            } else {
+                o[arg] = o[arg] || {};
+                o = o[arg]; //Reset base object to the new object so it's returned
+            }
+        }
+        return o;
+    },
+
+    // this is replaced if the log module is included
+    log: NOOP,
+    message: NOOP,
+    // this is replaced if the dump module is included
+    dump: function (o) { return ''+o; },
+
+    /**
+    Reports an error.
+
+    The reporting mechanism is controlled by the `throwFail` configuration
+    attribute. If `throwFail` is falsy, the message is logged. If `throwFail` is
+    truthy, a JS exception is thrown.
+
+    If an `errorFn` is specified in the config it must return `true` to indicate
+    that the exception was handled and keep it from being thrown.
+
+    @method error
+    @param {String} msg Error message.
+    @param {Error|String} [e] JavaScript error object or an error string.
+    @param {String} [src] Source of the error (such as the name of the module in
+        which the error occurred).
+    @chainable
+    **/
+    error: function(msg, e, src) {
+        //TODO Add check for window.onerror here
+
+        var Y = this, ret;
+
+        if (Y.config.errorFn) {
+            ret = Y.config.errorFn.apply(Y, arguments);
+        }
+
+        if (!ret) {
+            throw (e || new Error(msg));
+        } else {
+            Y.message(msg, 'error', ''+src); // don't scrub this one
+        }
+
+        return Y;
+    },
+
+    /**
+    Generates an id string that is unique among all YUI instances in this
+    execution context.
+
+    @method guid
+    @param {String} [pre] Prefix.
+    @return {String} Unique id.
+    **/
+    guid: function(pre) {
+        var id = this.Env._guidp + '_' + (++this.Env._uidx);
+        return (pre) ? (pre + id) : id;
+    },
+
+    /**
+    Returns a unique id associated with the given object and (if *readOnly* is
+    falsy) stamps the object with that id so it can be identified in the future.
+
+    Stamping an object involves adding a `_yuid` property to it that contains
+    the object's id. One exception to this is that in Internet Explorer, DOM
+    nodes have a `uniqueID` property that contains a browser-generated unique
+    id, which will be used instead of a YUI-generated id when available.
+
+    @method stamp
+    @param {Object} o Object to stamp.
+    @param {Boolean} readOnly If truthy and the given object has not already
+        been stamped, the object will not be modified and `null` will be
+        returned.
+    @return {String} Object's unique id, or `null` if *readOnly* was truthy and
+        the given object was not already stamped.
+    **/
+    stamp: function(o, readOnly) {
+        var uid;
+        if (!o) {
+            return o;
+        }
+
+        // IE generates its own unique ID for dom nodes
+        // The uniqueID property of a document node returns a new ID
+        if (o.uniqueID && o.nodeType && o.nodeType !== 9) {
+            uid = o.uniqueID;
+        } else {
+            uid = (typeof o === 'string') ? o : o._yuid;
+        }
+
+        if (!uid) {
+            uid = this.guid();
+            if (!readOnly) {
+                try {
+                    o._yuid = uid;
+                } catch (e) {
+                    uid = null;
+                }
+            }
+        }
+        return uid;
+    },
+
+    /**
+    Destroys this YUI instance.
+
+    @method destroy
+    @since 3.3.0
+    **/
+    destroy: function() {
+        var Y = this;
+        if (Y.Event) {
+            Y.Event._unload();
+        }
+        delete instances[Y.id];
+        delete Y.Env;
+        delete Y.config;
+    }
+
+    /**
+    Safe `instanceof` wrapper that works around a memory leak in IE when the
+    object being tested is `window` or `document`.
+
+    Unless you are testing objects that may be `window` or `document`, you
+    should use the native `instanceof` operator instead of this method.
+
+    @method instanceOf
+    @param {Object} o Object to check.
+    @param {Object} type Class to check against.
+    @since 3.3.0
+    **/
+};
+
+    YUI.prototype = proto;
+
+    // inheritance utilities are not available yet
+    for (prop in proto) {
+        if (proto.hasOwnProperty(prop)) {
+            YUI[prop] = proto[prop];
+        }
+    }
+
+    /**
+    Applies a configuration to all YUI instances in this execution context.
+
+    The main use case for this method is in "mashups" where several third-party
+    scripts need to write to a global YUI config, but cannot share a single
+    centrally-managed config object. This way they can all call
+    `YUI.applyConfig({})` instead of overwriting the single global config.
+
+    @example
+
+        YUI.applyConfig({
+            modules: {
+                davglass: {
+                    fullpath: './davglass.js'
+                }
+            }
+        });
+
+        YUI.applyConfig({
+            modules: {
+                foo: {
+                    fullpath: './foo.js'
+                }
+            }
+        });
+
+        YUI().use('davglass', function (Y) {
+            // Module davglass will be available here.
+        });
+
+    @method applyConfig
+    @param {Object} o Configuration object to apply.
+    @static
+    @since 3.5.0
+    **/
+    YUI.applyConfig = function(o) {
+        if (!o) {
+            return;
+        }
+        //If there is a GlobalConfig, apply it first to set the defaults
+        if (YUI.GlobalConfig) {
+            this.prototype.applyConfig.call(this, YUI.GlobalConfig);
+        }
+        //Apply this config to it
+        this.prototype.applyConfig.call(this, o);
+        //Reset GlobalConfig to the combined config
+        YUI.GlobalConfig = this.config;
+    };
+
+    // set up the environment
+    YUI._init();
+
+    if (hasWin) {
+        // add a window load event at load time so we can capture
+        // the case where it fires before dynamic loading is
+        // complete.
+        add(window, 'load', handleLoad);
+    } else {
+        handleLoad();
+    }
+
+    YUI.Env.add = add;
+    YUI.Env.remove = remove;
+
+    /*global exports*/
+    // Support the CommonJS method for exporting our single global
+    if (typeof exports == 'object') {
+        exports.YUI = YUI;
+        /**
+        * Set a method to be called when `Get.script` is called in Node.js
+        * `Get` will open the file, then pass it's content and it's path
+        * to this method before attaching it. Commonly used for code coverage
+        * instrumentation. <strong>Calling this multiple times will only
+        * attach the last hook method</strong>. This method is only
+        * available in Node.js.
+        * @method setLoadHook
+        * @static
+        * @param {Function} fn The function to set
+        * @param {String} fn.data The content of the file
+        * @param {String} fn.path The file path of the file
+        */
+        YUI.setLoadHook = function(fn) {
+            YUI._getLoadHook = fn;
+        };
+        /**
+        * Load hook for `Y.Get.script` in Node.js, see `YUI.setLoadHook`
+        * @method _getLoadHook
+        * @private
+        * @param {String} data The content of the file
+        * @param {String} path The file path of the file
+        */
+        YUI._getLoadHook = null;
+    }
+
+    YUI.Env[VERSION] = {};
+}());
+
+
+/**
+Config object that contains all of the configuration options for
+this `YUI` instance.
+
+This object is supplied by the implementer when instantiating YUI. Some
+properties have default values if they are not supplied by the implementer.
+
+This object should not be updated directly because some values are cached. Use
+`applyConfig()` to update the config object on a YUI instance that has already
+been configured.
+
+@class config
+@static
+**/
+
+/**
+If `true` (the default), YUI will "bootstrap" the YUI Loader and module metadata
+if they're needed to load additional dependencies and aren't already available.
+
+Setting this to `false` will prevent YUI from automatically loading the Loader
+and module metadata, so you will need to manually ensure that they're available
+or handle dependency resolution yourself.
+
+@property {Boolean} bootstrap
+@default true
+**/
+
+/**
+
+@property {Object} aliases
+**/
+
+/**
+A hash of module group definitions.
+
+For each group you can specify a list of modules and the base path and
+combo spec to use when dynamically loading the modules.
+
+@example
+
+    groups: {
+        yui2: {
+            // specify whether or not this group has a combo service
+            combine: true,
+
+            // The comboSeperator to use with this group's combo handler
+            comboSep: ';',
+
+            // The maxURLLength for this server
+            maxURLLength: 500,
+
+            // the base path for non-combo paths
+            base: 'http://yui.yahooapis.com/2.8.0r4/build/',
+
+            // the path to the combo service
+            comboBase: 'http://yui.yahooapis.com/combo?',
+
+            // a fragment to prepend to the path attribute when
+            // when building combo urls
+            root: '2.8.0r4/build/',
+
+            // the module definitions
+            modules:  {
+                yui2_yde: {
+                    path: "yahoo-dom-event/yahoo-dom-event.js"
+                },
+                yui2_anim: {
+                    path: "animation/animation.js",
+                    requires: ['yui2_yde']
+                }
+            }
+        }
+    }
+
+@property {Object} groups
+**/
+
+/**
+Path to the Loader JS file, relative to the `base` path.
+
+This is used to dynamically bootstrap the Loader when it's needed and isn't yet
+available.
+
+@property {String} loaderPath
+@default "loader/loader-min.js"
+**/
+
+/**
+If `true`, YUI will attempt to load CSS dependencies and skins. Set this to
+`false` to prevent YUI from loading any CSS, or set it to the string `"force"`
+to force CSS dependencies to be loaded even if their associated JS modules are
+already loaded.
+
+@property {Boolean|String} fetchCSS
+@default true
+**/
+
+/**
+Default gallery version used to build gallery module urls.
+
+@property {String} gallery
+@since 3.1.0
+**/
+
+/**
+Default YUI 2 version used to build YUI 2 module urls.
+
+This is used for intrinsic YUI 2 support via the 2in3 project. Also see the
+`2in3` config for pulling different revisions of the wrapped YUI 2 modules.
+
+@property {String} yui2
+@default "2.9.0"
+@since 3.1.0
+**/
+
+/**
+Revision number of YUI 2in3 modules that should be used when loading YUI 2in3.
+
+@property {String} 2in3
+@default "4"
+@since 3.1.0
+**/
+
+/**
+Alternate console log function that should be used in environments without a
+supported native console. This function is executed with the YUI instance as its
+`this` object.
+
+@property {Function} logFn
+@since 3.1.0
+**/
+
+/**
+The minimum log level to log messages for. Log levels are defined
+incrementally. Messages greater than or equal to the level specified will
+be shown. All others will be discarded. The order of log levels in
+increasing priority is:
+
+    debug
+    info
+    warn
+    error
+
+@property {String} logLevel
+@default 'debug'
+@since 3.10.0
+**/
+
+/**
+Callback to execute when `Y.error()` is called. It receives the error message
+and a JavaScript error object if one was provided.
+
+This function is executed with the YUI instance as its `this` object.
+
+Returning `true` from this function will prevent an exception from being thrown.
+
+@property {Function} errorFn
+@param {String} errorFn.msg Error message
+@param {Object} [errorFn.err] Error object (if one was provided).
+@since 3.2.0
+**/
+
+/**
+A callback to execute when Loader fails to load one or more resources.
+
+This could be because of a script load failure. It could also be because a
+module fails to register itself when the `requireRegistration` config is `true`.
+
+If this function is defined, the `use()` callback will only be called when the
+loader succeeds. Otherwise, `use()` will always executes unless there was a
+JavaScript error when attaching a module.
+
+@property {Function} loadErrorFn
+@since 3.3.0
+**/
+
+/**
+If `true`, Loader will expect all loaded scripts to be first-class YUI modules
+that register themselves with the YUI global, and will trigger a failure if a
+loaded script does not register a YUI module.
+
+@property {Boolean} requireRegistration
+@default false
+@since 3.3.0
+**/
+
+/**
+Cache serviced use() requests.
+
+@property {Boolean} cacheUse
+@default true
+@since 3.3.0
+@deprecated No longer used.
+**/
+
+/**
+Whether or not YUI should use native ES5 functionality when available for
+features like `Y.Array.each()`, `Y.Object()`, etc.
+
+When `false`, YUI will always use its own fallback implementations instead of
+relying on ES5 functionality, even when ES5 functionality is available.
+
+@property {Boolean} useNativeES5
+@default true
+@since 3.5.0
+**/
+
+/**
+ * Leverage native JSON stringify if the browser has a native
+ * implementation.  In general, this is a good idea.  See the Known Issues
+ * section in the JSON user guide for caveats.  The default value is true
+ * for browsers with native JSON support.
+ *
+ * @property useNativeJSONStringify
+ * @type Boolean
+ * @default true
+ * @since 3.8.0
+ */
+
+ /**
+ * Leverage native JSON parse if the browser has a native implementation.
+ * In general, this is a good idea.  See the Known Issues section in the
+ * JSON user guide for caveats.  The default value is true for browsers with
+ * native JSON support.
+ *
+ * @property useNativeJSONParse
+ * @type Boolean
+ * @default true
+ * @since 3.8.0
+ */
+
+/**
+Delay the `use` callback until a specific event has passed (`load`, `domready`, `contentready` or `available`)
+
+@property {Object|String} delayUntil
+@since 3.6.0
+@example
+
+You can use `load` or `domready` strings by default:
+
+    YUI({
+        delayUntil: 'domready'
+    }, function (Y) {
+        // This will not execute until 'domeready' occurs.
+    });
+
+Or you can delay until a node is available (with `available` or `contentready`):
+
+    YUI({
+        delayUntil: {
+            event: 'available',
+            args : '#foo'
+        }
+    }, function (Y) {
+        // This will not execute until a node matching the selector "#foo" is
+        // available in the DOM.
+    });
+
+**/
+YUI.add('yui-base', function (Y, NAME) {
+
+/*
+ * YUI stub
+ * @module yui
+ * @submodule yui-base
+ */
+/**
+ * The YUI module contains the components required for building the YUI
+ * seed file.  This includes the script loading mechanism, a simple queue,
+ * and the core utilities for the library.
+ * @module yui
+ * @submodule yui-base
+ */
+
+/**
+ * Provides core language utilites and extensions used throughout YUI.
+ *
+ * @class Lang
+ * @static
+ */
+
+var L = Y.Lang || (Y.Lang = {}),
+
+STRING_PROTO = String.prototype,
+TOSTRING     = Object.prototype.toString,
+
+TYPES = {
+    'undefined'        : 'undefined',
+    'number'           : 'number',
+    'boolean'          : 'boolean',
+    'string'           : 'string',
+    '[object Function]': 'function',
+    '[object RegExp]'  : 'regexp',
+    '[object Array]'   : 'array',
+    '[object Date]'    : 'date',
+    '[object Error]'   : 'error'
+},
+
+SUBREGEX         = /\{\s*([^|}]+?)\s*(?:\|([^}]*))?\s*\}/g,
+
+WHITESPACE       = "\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF",
+WHITESPACE_CLASS = "[\x09-\x0D\x20\xA0\u1680\u180E\u2000-\u200A\u2028\u2029\u202F\u205F\u3000\uFEFF]+",
+TRIM_LEFT_REGEX  = new RegExp("^" + WHITESPACE_CLASS),
+TRIM_RIGHT_REGEX = new RegExp(WHITESPACE_CLASS + "$"),
+TRIMREGEX        = new RegExp(TRIM_LEFT_REGEX.source + "|" + TRIM_RIGHT_REGEX.source, "g"),
+
+NATIVE_FN_REGEX  = /\{\s*\[(?:native code|function)\]\s*\}/i;
+
+// -- Protected Methods --------------------------------------------------------
+
+/**
+Returns `true` if the given function appears to be implemented in native code,
+`false` otherwise. Will always return `false` -- even in ES5-capable browsers --
+if the `useNativeES5` YUI config option is set to `false`.
+
+This isn't guaranteed to be 100% accurate and won't work for anything other than
+functions, but it can be useful for determining whether a function like
+`Array.prototype.forEach` is native or a JS shim provided by another library.
+
+There's a great article by @kangax discussing certain flaws with this technique:
+<http://perfectionkills.com/detecting-built-in-host-methods/>
+
+While his points are valid, it's still possible to benefit from this function
+as long as it's used carefully and sparingly, and in such a way that false
+negatives have minimal consequences. It's used internally to avoid using
+potentially broken non-native ES5 shims that have been added to the page by
+other libraries.
+
+@method _isNative
+@param {Function} fn Function to test.
+@return {Boolean} `true` if _fn_ appears to be native, `false` otherwise.
+@static
+@protected
+@since 3.5.0
+**/
+L._isNative = function (fn) {
+    return !!(Y.config.useNativeES5 && fn && NATIVE_FN_REGEX.test(fn));
+};
+
+// -- Public Methods -----------------------------------------------------------
+
+/**
+ * Determines whether or not the provided item is an array.
+ *
+ * Returns `false` for array-like collections such as the function `arguments`
+ * collection or `HTMLElement` collections. Use `Y.Array.test()` if you want to
+ * test for an array-like collection.
+ *
+ * @method isArray
+ * @param o The object to test.
+ * @return {boolean} true if o is an array.
+ * @static
+ */
+L.isArray = L._isNative(Array.isArray) ? Array.isArray : function (o) {
+    return L.type(o) === 'array';
+};
+
+/**
+ * Determines whether or not the provided item is a boolean.
+ * @method isBoolean
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a boolean.
+ */
+L.isBoolean = function(o) {
+    return typeof o === 'boolean';
+};
+
+/**
+ * Determines whether or not the supplied item is a date instance.
+ * @method isDate
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a date.
+ */
+L.isDate = function(o) {
+    return L.type(o) === 'date' && o.toString() !== 'Invalid Date' && !isNaN(o);
+};
+
+/**
+ * <p>
+ * Determines whether or not the provided item is a function.
+ * Note: Internet Explorer thinks certain functions are objects:
+ * </p>
+ *
+ * <pre>
+ * var obj = document.createElement("object");
+ * Y.Lang.isFunction(obj.getAttribute) // reports false in IE
+ * &nbsp;
+ * var input = document.createElement("input"); // append to body
+ * Y.Lang.isFunction(input.focus) // reports false in IE
+ * </pre>
+ *
+ * <p>
+ * You will have to implement additional tests if these functions
+ * matter to you.
+ * </p>
+ *
+ * @method isFunction
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a function.
+ */
+L.isFunction = function(o) {
+    return L.type(o) === 'function';
+};
+
+/**
+ * Determines whether or not the provided item is null.
+ * @method isNull
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is null.
+ */
+L.isNull = function(o) {
+    return o === null;
+};
+
+/**
+ * Determines whether or not the provided item is a legal number.
+ * @method isNumber
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a number.
+ */
+L.isNumber = function(o) {
+    return typeof o === 'number' && isFinite(o);
+};
+
+/**
+ * Determines whether or not the provided item is of type object
+ * or function. Note that arrays are also objects, so
+ * <code>Y.Lang.isObject([]) === true</code>.
+ * @method isObject
+ * @static
+ * @param o The object to test.
+ * @param failfn {boolean} fail if the input is a function.
+ * @return {boolean} true if o is an object.
+ * @see isPlainObject
+ */
+L.isObject = function(o, failfn) {
+    var t = typeof o;
+    return (o && (t === 'object' ||
+        (!failfn && (t === 'function' || L.isFunction(o))))) || false;
+};
+
+/**
+ * Determines whether or not the provided item is a string.
+ * @method isString
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is a string.
+ */
+L.isString = function(o) {
+    return typeof o === 'string';
+};
+
+/**
+ * Determines whether or not the provided item is undefined.
+ * @method isUndefined
+ * @static
+ * @param o The object to test.
+ * @return {boolean} true if o is undefined.
+ */
+L.isUndefined = function(o) {
+    return typeof o === 'undefined';
+};
+
+/**
+ * A convenience method for detecting a legitimate non-null value.
+ * Returns false for null/undefined/NaN, true for other values,
+ * including 0/false/''
+ * @method isValue
+ * @static
+ * @param o The item to test.
+ * @return {boolean} true if it is not null/undefined/NaN || false.
+ */
+L.isValue = function(o) {
+    var t = L.type(o);
+
+    switch (t) {
+        case 'number':
+            return isFinite(o);
+
+        case 'null': // fallthru
+        case 'undefined':
+            return false;
+
+        default:
+            return !!t;
+    }
+};
+
+/**
+ * Returns the current time in milliseconds.
+ *
+ * @method now
+ * @return {Number} Current time in milliseconds.
+ * @static
+ * @since 3.3.0
+ */
+L.now = Date.now || function () {
+    return new Date().getTime();
+};
+
+/**
+ * Lightweight version of <code>Y.substitute</code>. Uses the same template
+ * structure as <code>Y.substitute</code>, but doesn't support recursion,
+ * auto-object coersion, or formats.
+ * @method sub
+ * @param {string} s String to be modified.
+ * @param {object} o Object containing replacement values.
+ * @return {string} the substitute result.
+ * @static
+ * @since 3.2.0
+ */
+L.sub = function(s, o) {
+    return s.replace ? s.replace(SUBREGEX, function (match, key) {
+        return L.isUndefined(o[key]) ? match : o[key];
+    }) : s;
+};
+
+/**
+ * Returns a string without any leading or trailing whitespace.  If
+ * the input is not a string, the input will be returned untouched.
+ * @method trim
+ * @static
+ * @param s {string} the string to trim.
+ * @return {string} the trimmed string.
+ */
+L.trim = L._isNative(STRING_PROTO.trim) && !WHITESPACE.trim() ? function(s) {
+    return s && s.trim ? s.trim() : s;
+} : function (s) {
+    try {
+        return s.replace(TRIMREGEX, '');
+    } catch (e) {
+        return s;
+    }
+};
+
+/**
+ * Returns a string without any leading whitespace.
+ * @method trimLeft
+ * @static
+ * @param s {string} the string to trim.
+ * @return {string} the trimmed string.
+ */
+L.trimLeft = L._isNative(STRING_PROTO.trimLeft) && !WHITESPACE.trimLeft() ? function (s) {
+    return s.trimLeft();
+} : function (s) {
+    return s.replace(TRIM_LEFT_REGEX, '');
+};
+
+/**
+ * Returns a string without any trailing whitespace.
+ * @method trimRight
+ * @static
+ * @param s {string} the string to trim.
+ * @return {string} the trimmed string.
+ */
+L.trimRight = L._isNative(STRING_PROTO.trimRight) && !WHITESPACE.trimRight() ? function (s) {
+    return s.trimRight();
+} : function (s) {
+    return s.replace(TRIM_RIGHT_REGEX, '');
+};
+
+/**
+Returns one of the following strings, representing the type of the item passed
+in:
+
+ * "array"
+ * "boolean"
+ * "date"
+ * "error"
+ * "function"
+ * "null"
+ * "number"
+ * "object"
+ * "regexp"
+ * "string"
+ * "undefined"
+
+Known issues:
+
+ * `typeof HTMLElementCollection` returns function in Safari, but
+    `Y.Lang.type()` reports "object", which could be a good thing --
+    but it actually caused the logic in <code>Y.Lang.isObject</code> to fail.
+
+@method type
+@param o the item to test.
+@return {string} the detected type.
+@static
+**/
+L.type = function(o) {
+    return TYPES[typeof o] || TYPES[TOSTRING.call(o)] || (o ? 'object' : 'null');
+};
+/**
+@module yui
+@submodule yui-base
+*/
+
+var Lang   = Y.Lang,
+    Native = Array.prototype,
+
+    hasOwn = Object.prototype.hasOwnProperty;
+
+/**
+Provides utility methods for working with arrays. Additional array helpers can
+be found in the `collection` and `array-extras` modules.
+
+`Y.Array(thing)` returns a native array created from _thing_. Depending on
+_thing_'s type, one of the following will happen:
+
+  * Arrays are returned unmodified unless a non-zero _startIndex_ is
+    specified.
+  * Array-like collections (see `Array.test()`) are converted to arrays.
+  * For everything else, a new array is created with _thing_ as the sole
+    item.
+
+Note: elements that are also collections, such as `<form>` and `<select>`
+elements, are not automatically converted to arrays. To force a conversion,
+pass `true` as the value of the _force_ parameter.
+
+@class Array
+@constructor
+@param {Any} thing The thing to arrayify.
+@param {Number} [startIndex=0] If non-zero and _thing_ is an array or array-like
+  collection, a subset of items starting at the specified index will be
+  returned.
+@param {Boolean} [force=false] If `true`, _thing_ will be treated as an
+  array-like collection no matter what.
+@return {Array} A native array created from _thing_, according to the rules
+  described above.
+**/
+function YArray(thing, startIndex, force) {
+    var len, result;
+
+    /*jshint expr: true*/
+    startIndex || (startIndex = 0);
+
+    if (force || YArray.test(thing)) {
+        // IE throws when trying to slice HTMLElement collections.
+        try {
+            return Native.slice.call(thing, startIndex);
+        } catch (ex) {
+            result = [];
+
+            for (len = thing.length; startIndex < len; ++startIndex) {
+                result.push(thing[startIndex]);
+            }
+
+            return result;
+        }
+    }
+
+    return [thing];
+}
+
+Y.Array = YArray;
+
+/**
+Dedupes an array of strings, returning an array that's guaranteed to contain
+only one copy of a given string.
+
+This method differs from `Array.unique()` in that it's optimized for use only
+with arrays consisting entirely of strings or entirely of numbers, whereas
+`unique` may be used with other value types (but is slower).
+
+Using `dedupe()` with values other than strings or numbers, or with arrays
+containing a mix of strings and numbers, may result in unexpected behavior.
+
+@method dedupe
+@param {String[]|Number[]} array Array of strings or numbers to dedupe.
+@return {Array} Copy of _array_ containing no duplicate values.
+@static
+@since 3.4.0
+**/
+YArray.dedupe = Lang._isNative(Object.create) ? function (array) {
+    var hash    = Object.create(null),
+        results = [],
+        i, item, len;
+
+    for (i = 0, len = array.length; i < len; ++i) {
+        item = array[i];
+
+        if (!hash[item]) {
+            hash[item] = 1;
+            results.push(item);
+        }
+    }
+
+    return results;
+} : function (array) {
+    var hash    = {},
+        results = [],
+        i, item, len;
+
+    for (i = 0, len = array.length; i < len; ++i) {
+        item = array[i];
+
+        if (!hasOwn.call(hash, item)) {
+            hash[item] = 1;
+            results.push(item);
+        }
+    }
+
+    return results;
+};
+
+/**
+Executes the supplied function on each item in the array. This method wraps
+the native ES5 `Array.forEach()` method if available.
+
+@method each
+@param {Array} array Array to iterate.
+@param {Function} fn Function to execute on each item in the array. The function
+  will receive the following arguments:
+    @param {Any} fn.item Current array item.
+    @param {Number} fn.index Current array index.
+    @param {Array} fn.array Array being iterated.
+@param {Object} [thisObj] `this` object to use when calling _fn_.
+@return {YUI} The YUI instance.
+@static
+**/
+YArray.each = YArray.forEach = Lang._isNative(Native.forEach) ? function (array, fn, thisObj) {
+    Native.forEach.call(array || [], fn, thisObj || Y);
+    return Y;
+} : function (array, fn, thisObj) {
+    for (var i = 0, len = (array && array.length) || 0; i < len; ++i) {
+        if (i in array) {
+            fn.call(thisObj || Y, array[i], i, array);
+        }
+    }
+
+    return Y;
+};
+
+/**
+Alias for `each()`.
+
+@method forEach
+@static
+**/
+
+/**
+Returns an object using the first array as keys and the second as values. If
+the second array is not provided, or if it doesn't contain the same number of
+values as the first array, then `true` will be used in place of the missing
+values.
+
+@example
+
+    Y.Array.hash(['a', 'b', 'c'], ['foo', 'bar']);
+    // => {a: 'foo', b: 'bar', c: true}
+
+@method hash
+@param {String[]} keys Array of strings to use as keys.
+@param {Array} [values] Array to use as values.
+@return {Object} Hash using the first array as keys and the second as values.
+@static
+**/
+YArray.hash = function (keys, values) {
+    var hash = {},
+        vlen = (values && values.length) || 0,
+        i, len;
+
+    for (i = 0, len = keys.length; i < len; ++i) {
+        if (i in keys) {
+            hash[keys[i]] = vlen > i && i in values ? values[i] : true;
+        }
+    }
+
+    return hash;
+};
+
+/**
+Returns the index of the first item in the array that's equal (using a strict
+equality check) to the specified _value_, or `-1` if the value isn't found.
+
+This method wraps the native ES5 `Array.indexOf()` method if available.
+
+@method indexOf
+@param {Array} array Array to search.
+@param {Any} value Value to search for.
+@param {Number} [from=0] The index at which to begin the search.
+@return {Number} Index of the item strictly equal to _value_, or `-1` if not
+    found.
+@static
+**/
+YArray.indexOf = Lang._isNative(Native.indexOf) ? function (array, value, from) {
+    return Native.indexOf.call(array, value, from);
+} : function (array, value, from) {
+    // http://es5.github.com/#x15.4.4.14
+    var len = array.length;
+
+    from = +from || 0;
+    from = (from > 0 || -1) * Math.floor(Math.abs(from));
+
+    if (from < 0) {
+        from += len;
+
+        if (from < 0) {
+            from = 0;
+        }
+    }
+
+    for (; from < len; ++from) {
+        if (from in array && array[from] === value) {
+            return from;
+        }
+    }
+
+    return -1;
+};
+
+/**
+Numeric sort convenience function.
+
+The native `Array.prototype.sort()` function converts values to strings and
+sorts them in lexicographic order, which is unsuitable for sorting numeric
+values. Provide `Array.numericSort` as a custom sort function when you want
+to sort values in numeric order.
+
+@example
+
+    [42, 23, 8, 16, 4, 15].sort(Y.Array.numericSort);
+    // => [4, 8, 15, 16, 23, 42]
+
+@method numericSort
+@param {Number} a First value to compare.
+@param {Number} b Second value to compare.
+@return {Number} Difference between _a_ and _b_.
+@static
+**/
+YArray.numericSort = function (a, b) {
+    return a - b;
+};
+
+/**
+Executes the supplied function on each item in the array. Returning a truthy
+value from the function will stop the processing of remaining items.
+
+@method some
+@param {Array} array Array to iterate over.
+@param {Function} fn Function to execute on each item. The function will receive
+  the following arguments:
+    @param {Any} fn.value Current array item.
+    @param {Number} fn.index Current array index.
+    @param {Array} fn.array Array being iterated over.
+@param {Object} [thisObj] `this` object to use when calling _fn_.
+@return {Boolean} `true` if the function returns a truthy value on any of the
+  items in the array; `false` otherwise.
+@static
+**/
+YArray.some = Lang._isNative(Native.some) ? function (array, fn, thisObj) {
+    return Native.some.call(array, fn, thisObj);
+} : function (array, fn, thisObj) {
+    for (var i = 0, len = array.length; i < len; ++i) {
+        if (i in array && fn.call(thisObj, array[i], i, array)) {
+            return true;
+        }
+    }
+
+    return false;
+};
+
+/**
+Evaluates _obj_ to determine if it's an array, an array-like collection, or
+something else. This is useful when working with the function `arguments`
+collection and `HTMLElement` collections.
+
+Note: This implementation doesn't consider elements that are also
+collections, such as `<form>` and `<select>`, to be array-like.
+
+@method test
+@param {Object} obj Object to test.
+@return {Number} A number indicating the results of the test:
+
+  * 0: Neither an array nor an array-like collection.
+  * 1: Real array.
+  * 2: Array-like collection.
+
+@static
+**/
+YArray.test = function (obj) {
+    var result = 0;
+
+    if (Lang.isArray(obj)) {
+        result = 1;
+    } else if (Lang.isObject(obj)) {
+        try {
+            // indexed, but no tagName (element) or scrollTo/document (window. From DOM.isWindow test which we can't use here),
+            // or functions without apply/call (Safari
+            // HTMLElementCollection bug).
+            if ('length' in obj && !obj.tagName && !(obj.scrollTo && obj.document) && !obj.apply) {
+                result = 2;
+            }
+        } catch (ex) {}
+    }
+
+    return result;
+};
+/**
+ * The YUI module contains the components required for building the YUI
+ * seed file.  This includes the script loading mechanism, a simple queue,
+ * and the core utilities for the library.
+ * @module yui
+ * @submodule yui-base
+ */
+
+/**
+ * A simple FIFO queue.  Items are added to the Queue with add(1..n items) and
+ * removed using next().
+ *
+ * @class Queue
+ * @constructor
+ * @param {MIXED} item* 0..n items to seed the queue.
+ */
+function Queue() {
+    this._init();
+    this.add.apply(this, arguments);
+}
+
+Queue.prototype = {
+    /**
+     * Initialize the queue
+     *
+     * @method _init
+     * @protected
+     */
+    _init: function() {
+        /**
+         * The collection of enqueued items
+         *
+         * @property _q
+         * @type Array
+         * @protected
+         */
+        this._q = [];
+    },
+
+    /**
+     * Get the next item in the queue. FIFO support
+     *
+     * @method next
+     * @return {MIXED} the next item in the queue.
+     */
+    next: function() {
+        return this._q.shift();
+    },
+
+    /**
+     * Get the last in the queue. LIFO support.
+     *
+     * @method last
+     * @return {MIXED} the last item in the queue.
+     */
+    last: function() {
+        return this._q.pop();
+    },
+
+    /**
+     * Add 0..n items to the end of the queue.
+     *
+     * @method add
+     * @param {MIXED} item* 0..n items.
+     * @return {object} this queue.
+     */
+    add: function() {
+        this._q.push.apply(this._q, arguments);
+
+        return this;
+    },
+
+    /**
+     * Returns the current number of queued items.
+     *
+     * @method size
+     * @return {Number} The size.
+     */
+    size: function() {
+        return this._q.length;
+    }
+};
+
+Y.Queue = Queue;
+
+YUI.Env._loaderQueue = YUI.Env._loaderQueue || new Queue();
+
+/**
+The YUI module contains the components required for building the YUI seed file.
+This includes the script loading mechanism, a simple queue, and the core
+utilities for the library.
+
+@module yui
+@submodule yui-base
+**/
+
+var CACHED_DELIMITER = '__',
+
+    hasOwn   = Object.prototype.hasOwnProperty,
+    isObject = Y.Lang.isObject;
+
+/**
+Returns a wrapper for a function which caches the return value of that function,
+keyed off of the combined string representation of the argument values provided
+when the wrapper is called.
+
+Calling this function again with the same arguments will return the cached value
+rather than executing the wrapped function.
+
+Note that since the cache is keyed off of the string representation of arguments
+passed to the wrapper function, arguments that aren't strings and don't provide
+a meaningful `toString()` method may result in unexpected caching behavior. For
+example, the objects `{}` and `{foo: 'bar'}` would both be converted to the
+string `[object Object]` when used as a cache key.
+
+@method cached
+@param {Function} source The function to memoize.
+@param {Object} [cache={}] Object in which to store cached values. You may seed
+  this object with pre-existing cached values if desired.
+@param {any} [refetch] If supplied, this value is compared with the cached value
+  using a `==` comparison. If the values are equal, the wrapped function is
+  executed again even though a cached value exists.
+@return {Function} Wrapped function.
+@for YUI
+**/
+Y.cached = function (source, cache, refetch) {
+    /*jshint expr: true*/
+    cache || (cache = {});
+
+    return function (arg) {
+        var key = arguments.length > 1 ?
+                Array.prototype.join.call(arguments, CACHED_DELIMITER) :
+                String(arg);
+        
+        /*jshint eqeqeq: false*/
+        if (!(key in cache) || (refetch && cache[key] == refetch)) {
+            cache[key] = source.apply(source, arguments);
+        }
+
+        return cache[key];
+    };
+};
+
+/**
+Returns the `location` object from the window/frame in which this YUI instance
+operates, or `undefined` when executing in a non-browser environment
+(e.g. Node.js).
+
+It is _not_ recommended to hold references to the `window.location` object
+outside of the scope of a function in which its properties are being accessed or
+its methods are being called. This is because of a nasty bug/issue that exists
+in both Safari and MobileSafari browsers:
+[WebKit Bug 34679](https://bugs.webkit.org/show_bug.cgi?id=34679).
+
+@method getLocation
+@return {location} The `location` object from the window/frame in which this YUI
+    instance operates.
+@since 3.5.0
+**/
+Y.getLocation = function () {
+    // It is safer to look this up every time because yui-base is attached to a
+    // YUI instance before a user's config is applied; i.e. `Y.config.win` does
+    // not point the correct window object when this file is loaded.
+    var win = Y.config.win;
+
+    // It is not safe to hold a reference to the `location` object outside the
+    // scope in which it is being used. The WebKit engine used in Safari and
+    // MobileSafari will "disconnect" the `location` object from the `window`
+    // when a page is restored from back/forward history cache.
+    return win && win.location;
+};
+
+/**
+Returns a new object containing all of the properties of all the supplied
+objects. The properties from later objects will overwrite those in earlier
+objects.
+
+Passing in a single object will create a shallow copy of it. For a deep copy,
+use `clone()`.
+
+@method merge
+@param {Object} objects* One or more objects to merge.
+@return {Object} A new merged object.
+**/
+Y.merge = function () {
+    var i      = 0,
+        len    = arguments.length,
+        result = {},
+        key,
+        obj;
+
+    for (; i < len; ++i) {
+        obj = arguments[i];
+
+        for (key in obj) {
+            if (hasOwn.call(obj, key)) {
+                result[key] = obj[key];
+            }
+        }
+    }
+
+    return result;
+};
+
+/**
+Mixes _supplier_'s properties into _receiver_.
+
+Properties on _receiver_ or _receiver_'s prototype will not be overwritten or
+shadowed unless the _overwrite_ parameter is `true`, and will not be merged
+unless the _merge_ parameter is `true`.
+
+In the default mode (0), only properties the supplier owns are copied (prototype
+properties are not copied). The following copying modes are available:
+
+  * `0`: _Default_. Object to object.
+  * `1`: Prototype to prototype.
+  * `2`: Prototype to prototype and object to object.
+  * `3`: Prototype to object.
+  * `4`: Object to prototype.
+
+@method mix
+@param {Function|Object} receiver The object or function to receive the mixed
+  properties.
+@param {Function|Object} supplier The object or function supplying the
+  properties to be mixed.
+@param {Boolean} [overwrite=false] If `true`, properties that already exist
+  on the receiver will be overwritten with properties from the supplier.
+@param {String[]} [whitelist] An array of property names to copy. If
+  specified, only the whitelisted properties will be copied, and all others
+  will be ignored.
+@param {Number} [mode=0] Mix mode to use. See above for available modes.
+@param {Boolean} [merge=false] If `true`, objects and arrays that already
+  exist on the receiver will have the corresponding object/array from the
+  supplier merged into them, rather than being skipped or overwritten. When
+  both _overwrite_ and _merge_ are `true`, _merge_ takes precedence.
+@return {Function|Object|YUI} The receiver, or the YUI instance if the
+  specified receiver is falsy.
+**/
+Y.mix = function(receiver, supplier, overwrite, whitelist, mode, merge) {
+    var alwaysOverwrite, exists, from, i, key, len, to;
+
+    // If no supplier is given, we return the receiver. If no receiver is given,
+    // we return Y. Returning Y doesn't make much sense to me, but it's
+    // grandfathered in for backcompat reasons.
+    if (!receiver || !supplier) {
+        return receiver || Y;
+    }
+
+    if (mode) {
+        // In mode 2 (prototype to prototype and object to object), we recurse
+        // once to do the proto to proto mix. The object to object mix will be
+        // handled later on.
+        if (mode === 2) {
+            Y.mix(receiver.prototype, supplier.prototype, overwrite,
+                    whitelist, 0, merge);
+        }
+
+        // Depending on which mode is specified, we may be copying from or to
+        // the prototypes of the supplier and receiver.
+        from = mode === 1 || mode === 3 ? supplier.prototype : supplier;
+        to   = mode === 1 || mode === 4 ? receiver.prototype : receiver;
+
+        // If either the supplier or receiver doesn't actually have a
+        // prototype property, then we could end up with an undefined `from`
+        // or `to`. If that happens, we abort and return the receiver.
+        if (!from || !to) {
+            return receiver;
+        }
+    } else {
+        from = supplier;
+        to   = receiver;
+    }
+
+    // If `overwrite` is truthy and `merge` is falsy, then we can skip a
+    // property existence check on each iteration and save some time.
+    alwaysOverwrite = overwrite && !merge;
+
+    if (whitelist) {
+        for (i = 0, len = whitelist.length; i < len; ++i) {
+            key = whitelist[i];
+
+            // We call `Object.prototype.hasOwnProperty` instead of calling
+            // `hasOwnProperty` on the object itself, since the object's
+            // `hasOwnProperty` method may have been overridden or removed.
+            // Also, some native objects don't implement a `hasOwnProperty`
+            // method.
+            if (!hasOwn.call(from, key)) {
+                continue;
+            }
+
+            // The `key in to` check here is (sadly) intentional for backwards
+            // compatibility reasons. It prevents undesired shadowing of
+            // prototype members on `to`.
+            exists = alwaysOverwrite ? false : key in to;
+
+            if (merge && exists && isObject(to[key], true)
+                    && isObject(from[key], true)) {
+                // If we're in merge mode, and the key is present on both
+                // objects, and the value on both objects is either an object or
+                // an array (but not a function), then we recurse to merge the
+                // `from` value into the `to` value instead of overwriting it.
+                //
+                // Note: It's intentional that the whitelist isn't passed to the
+                // recursive call here. This is legacy behavior that lots of
+                // code still depends on.
+                Y.mix(to[key], from[key], overwrite, null, 0, merge);
+            } else if (overwrite || !exists) {
+                // We're not in merge mode, so we'll only copy the `from` value
+                // to the `to` value if we're in overwrite mode or if the
+                // current key doesn't exist on the `to` object.
+                to[key] = from[key];
+            }
+        }
+    } else {
+        for (key in from) {
+            // The code duplication here is for runtime performance reasons.
+            // Combining whitelist and non-whitelist operations into a single
+            // loop or breaking the shared logic out into a function both result
+            // in worse performance, and Y.mix is critical enough that the byte
+            // tradeoff is worth it.
+            if (!hasOwn.call(from, key)) {
+                continue;
+            }
+
+            // The `key in to` check here is (sadly) intentional for backwards
+            // compatibility reasons. It prevents undesired shadowing of
+            // prototype members on `to`.
+            exists = alwaysOverwrite ? false : key in to;
+
+            if (merge && exists && isObject(to[key], true)
+                    && isObject(from[key], true)) {
+                Y.mix(to[key], from[key], overwrite, null, 0, merge);
+            } else if (overwrite || !exists) {
+                to[key] = from[key];
+            }
+        }
+
+        // If this is an IE browser with the JScript enumeration bug, force
+        // enumeration of the buggy properties by making a recursive call with
+        // the buggy properties as the whitelist.
+        if (Y.Object._hasEnumBug) {
+            Y.mix(to, from, overwrite, Y.Object._forceEnum, mode, merge);
+        }
+    }
+
+    return receiver;
+};
+/**
+ * The YUI module contains the components required for building the YUI
+ * seed file.  This includes the script loading mechanism, a simple queue,
+ * and the core utilities for the library.
+ * @module yui
+ * @submodule yui-base
+ */
+
+/**
+ * Adds utilities to the YUI instance for working with objects.
+ *
+ * @class Object
+ */
+
+var Lang   = Y.Lang,
+    hasOwn = Object.prototype.hasOwnProperty,
+
+    UNDEFINED, // <-- Note the comma. We're still declaring vars.
+
+/**
+ * Returns a new object that uses _obj_ as its prototype. This method wraps the
+ * native ES5 `Object.create()` method if available, but doesn't currently
+ * pass through `Object.create()`'s second argument (properties) in order to
+ * ensure compatibility with older browsers.
+ *
+ * @method ()
+ * @param {Object} obj Prototype object.
+ * @return {Object} New object using _obj_ as its prototype.
+ * @static
+ */
+O = Y.Object = Lang._isNative(Object.create) ? function (obj) {
+    // We currently wrap the native Object.create instead of simply aliasing it
+    // to ensure consistency with our fallback shim, which currently doesn't
+    // support Object.create()'s second argument (properties). Once we have a
+    // safe fallback for the properties arg, we can stop wrapping
+    // Object.create().
+    return Object.create(obj);
+} : (function () {
+    // Reusable constructor function for the Object.create() shim.
+    function F() {}
+
+    // The actual shim.
+    return function (obj) {
+        F.prototype = obj;
+        return new F();
+    };
+}()),
+
+/**
+ * Property names that IE doesn't enumerate in for..in loops, even when they
+ * should be enumerable. When `_hasEnumBug` is `true`, it's necessary to
+ * manually enumerate these properties.
+ *
+ * @property _forceEnum
+ * @type String[]
+ * @protected
+ * @static
+ */
+forceEnum = O._forceEnum = [
+    'hasOwnProperty',
+    'isPrototypeOf',
+    'propertyIsEnumerable',
+    'toString',
+    'toLocaleString',
+    'valueOf'
+],
+
+/**
+ * `true` if this browser has the JScript enumeration bug that prevents
+ * enumeration of the properties named in the `_forceEnum` array, `false`
+ * otherwise.
+ *
+ * See:
+ *   - <https://developer.mozilla.org/en/ECMAScript_DontEnum_attribute#JScript_DontEnum_Bug>
+ *   - <http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation>
+ *
+ * @property _hasEnumBug
+ * @type Boolean
+ * @protected
+ * @static
+ */
+hasEnumBug = O._hasEnumBug = !{valueOf: 0}.propertyIsEnumerable('valueOf'),
+
+/**
+ * `true` if this browser incorrectly considers the `prototype` property of
+ * functions to be enumerable. Currently known to affect Opera 11.50 and Android 2.3.x.
+ *
+ * @property _hasProtoEnumBug
+ * @type Boolean
+ * @protected
+ * @static
+ */
+hasProtoEnumBug = O._hasProtoEnumBug = (function () {}).propertyIsEnumerable('prototype'),
+
+/**
+ * Returns `true` if _key_ exists on _obj_, `false` if _key_ doesn't exist or
+ * exists only on _obj_'s prototype. This is essentially a safer version of
+ * `obj.hasOwnProperty()`.
+ *
+ * @method owns
+ * @param {Object} obj Object to test.
+ * @param {String} key Property name to look for.
+ * @return {Boolean} `true` if _key_ exists on _obj_, `false` otherwise.
+ * @static
+ */
+owns = O.owns = function (obj, key) {
+    return !!obj && hasOwn.call(obj, key);
+}; // <-- End of var declarations.
+
+/**
+ * Alias for `owns()`.
+ *
+ * @method hasKey
+ * @param {Object} obj Object to test.
+ * @param {String} key Property name to look for.
+ * @return {Boolean} `true` if _key_ exists on _obj_, `false` otherwise.
+ * @static
+ */
+O.hasKey = owns;
+
+/**
+ * Returns an array containing the object's enumerable keys. Does not include
+ * prototype keys or non-enumerable keys.
+ *
+ * Note that keys are returned in enumeration order (that is, in the same order
+ * that they would be enumerated by a `for-in` loop), which may not be the same
+ * as the order in which they were defined.
+ *
+ * This method is an alias for the native ES5 `Object.keys()` method if
+ * available and non-buggy. The Opera 11.50 and Android 2.3.x versions of 
+ * `Object.keys()` have an inconsistency as they consider `prototype` to be 
+ * enumerable, so a non-native shim is used to rectify the difference.
+ *
+ * @example
+ *
+ *     Y.Object.keys({a: 'foo', b: 'bar', c: 'baz'});
+ *     // => ['a', 'b', 'c']
+ *
+ * @method keys
+ * @param {Object} obj An object.
+ * @return {String[]} Array of keys.
+ * @static
+ */
+O.keys = Lang._isNative(Object.keys) && !hasProtoEnumBug ? Object.keys : function (obj) {
+    if (!Lang.isObject(obj)) {
+        throw new TypeError('Object.keys called on a non-object');
+    }
+
+    var keys = [],
+        i, key, len;
+
+    if (hasProtoEnumBug && typeof obj === 'function') {
+        for (key in obj) {
+            if (owns(obj, key) && key !== 'prototype') {
+                keys.push(key);
+            }
+        }
+    } else {
+        for (key in obj) {
+            if (owns(obj, key)) {
+                keys.push(key);
+            }
+        }
+    }
+
+    if (hasEnumBug) {
+        for (i = 0, len = forceEnum.length; i < len; ++i) {
+            key = forceEnum[i];
+
+            if (owns(obj, key)) {
+                keys.push(key);
+            }
+        }
+    }
+
+    return keys;
+};
+
+/**
+ * Returns an array containing the values of the object's enumerable keys.
+ *
+ * Note that values are returned in enumeration order (that is, in the same
+ * order that they would be enumerated by a `for-in` loop), which may not be the
+ * same as the order in which they were defined.
+ *
+ * @example
+ *
+ *     Y.Object.values({a: 'foo', b: 'bar', c: 'baz'});
+ *     // => ['foo', 'bar', 'baz']
+ *
+ * @method values
+ * @param {Object} obj An object.
+ * @return {Array} Array of values.
+ * @static
+ */
+O.values = function (obj) {
+    var keys   = O.keys(obj),
+        i      = 0,
+        len    = keys.length,
+        values = [];
+
+    for (; i < len; ++i) {
+        values.push(obj[keys[i]]);
+    }
+
+    return values;
+};
+
+/**
+ * Returns the number of enumerable keys owned by an object.
+ *
+ * @method size
+ * @param {Object} obj An object.
+ * @return {Number} The object's size.
+ * @static
+ */
+O.size = function (obj) {
+    try {
+        return O.keys(obj).length;
+    } catch (ex) {
+        return 0; // Legacy behavior for non-objects.
+    }
+};
+
+/**
+ * Returns `true` if the object owns an enumerable property with the specified
+ * value.
+ *
+ * @method hasValue
+ * @param {Object} obj An object.
+ * @param {any} value The value to search for.
+ * @return {Boolean} `true` if _obj_ contains _value_, `false` otherwise.
+ * @static
+ */
+O.hasValue = function (obj, value) {
+    return Y.Array.indexOf(O.values(obj), value) > -1;
+};
+
+/**
+ * Executes a function on each enumerable property in _obj_. The function
+ * receives the value, the key, and the object itself as parameters (in that
+ * order).
+ *
+ * By default, only properties owned by _obj_ are enumerated. To include
+ * prototype properties, set the _proto_ parameter to `true`.
+ *
+ * @method each
+ * @param {Object} obj Object to enumerate.
+ * @param {Function} fn Function to execute on each enumerable property.
+ *   @param {mixed} fn.value Value of the current property.
+ *   @param {String} fn.key Key of the current property.
+ *   @param {Object} fn.obj Object being enumerated.
+ * @param {Object} [thisObj] `this` object to use when calling _fn_.
+ * @param {Boolean} [proto=false] Include prototype properties.
+ * @return {YUI} the YUI instance.
+ * @chainable
+ * @static
+ */
+O.each = function (obj, fn, thisObj, proto) {
+    var key;
+
+    for (key in obj) {
+        if (proto || owns(obj, key)) {
+            fn.call(thisObj || Y, obj[key], key, obj);
+        }
+    }
+
+    return Y;
+};
+
+/**
+ * Executes a function on each enumerable property in _obj_, but halts if the
+ * function returns a truthy value. The function receives the value, the key,
+ * and the object itself as paramters (in that order).
+ *
+ * By default, only properties owned by _obj_ are enumerated. To include
+ * prototype properties, set the _proto_ parameter to `true`.
+ *
+ * @method some
+ * @param {Object} obj Object to enumerate.
+ * @param {Function} fn Function to execute on each enumerable property.
+ *   @param {mixed} fn.value Value of the current property.
+ *   @param {String} fn.key Key of the current property.
+ *   @param {Object} fn.obj Object being enumerated.
+ * @param {Object} [thisObj] `this` object to use when calling _fn_.
+ * @param {Boolean} [proto=false] Include prototype properties.
+ * @return {Boolean} `true` if any execution of _fn_ returns a truthy value,
+ *   `false` otherwise.
+ * @static
+ */
+O.some = function (obj, fn, thisObj, proto) {
+    var key;
+
+    for (key in obj) {
+        if (proto || owns(obj, key)) {
+            if (fn.call(thisObj || Y, obj[key], key, obj)) {
+                return true;
+            }
+        }
+    }
+
+    return false;
+};
+
+/**
+ * Retrieves the sub value at the provided path,
+ * from the value object provided.
+ *
+ * @method getValue
+ * @static
+ * @param o The object from which to extract the property value.
+ * @param path {Array} A path array, specifying the object traversal path
+ * from which to obtain the sub value.
+ * @return {Any} The value stored in the path, undefined if not found,
+ * undefined if the source is not an object.  Returns the source object
+ * if an empty path is provided.
+ */
+O.getValue = function(o, path) {
+    if (!Lang.isObject(o)) {
+        return UNDEFINED;
+    }
+
+    var i,
+        p = Y.Array(path),
+        l = p.length;
+
+    for (i = 0; o !== UNDEFINED && i < l; i++) {
+        o = o[p[i]];
+    }
+
+    return o;
+};
+
+/**
+ * Sets the sub-attribute value at the provided path on the
+ * value object.  Returns the modified value object, or
+ * undefined if the path is invalid.
+ *
+ * @method setValue
+ * @static
+ * @param o             The object on which to set the sub value.
+ * @param path {Array}  A path array, specifying the object traversal path
+ *                      at which to set the sub value.
+ * @param val {Any}     The new value for the sub-attribute.
+ * @return {Object}     The modified object, with the new sub value set, or
+ *                      undefined, if the path was invalid.
+ */
+O.setValue = function(o, path, val) {
+    var i,
+        p = Y.Array(path),
+        leafIdx = p.length - 1,
+        ref = o;
+
+    if (leafIdx >= 0) {
+        for (i = 0; ref !== UNDEFINED && i < leafIdx; i++) {
+            ref = ref[p[i]];
+        }
+
+        if (ref !== UNDEFINED) {
+            ref[p[i]] = val;
+        } else {
+            return UNDEFINED;
+        }
+    }
+
+    return o;
+};
+
+/**
+ * Returns `true` if the object has no enumerable properties of its own.
+ *
+ * @method isEmpty
+ * @param {Object} obj An object.
+ * @return {Boolean} `true` if the object is empty.
+ * @static
+ * @since 3.2.0
+ */
+O.isEmpty = function (obj) {
+    return !O.keys(Object(obj)).length;
+};
+/**
+ * The YUI module contains the components required for building the YUI seed
+ * file.  This includes the script loading mechanism, a simple queue, and the
+ * core utilities for the library.
+ * @module yui
+ * @submodule yui-base
+ */
+
+/**
+ * YUI user agent detection.
+ * Do not fork for a browser if it can be avoided.  Use feature detection when
+ * you can.  Use the user agent as a last resort.  For all fields listed
+ * as @type float, UA stores a version number for the browser engine,
+ * 0 otherwise.  This value may or may not map to the version number of
+ * the browser using the engine.  The value is presented as a float so
+ * that it can easily be used for boolean evaluation as well as for
+ * looking for a particular range of versions.  Because of this,
+ * some of the granularity of the version info may be lost.  The fields that
+ * are @type string default to null.  The API docs list the values that
+ * these fields can have.
+ * @class UA
+ * @static
+ */
+
+/**
+* Static method on `YUI.Env` for parsing a UA string.  Called at instantiation
+* to populate `Y.UA`.
+*
+* @static
+* @method parseUA
+* @param {String} [subUA=navigator.userAgent] UA string to parse
+* @return {Object} The Y.UA object
+*/
+YUI.Env.parseUA = function(subUA) {
+
+    var numberify = function(s) {
+            var c = 0;
+            return parseFloat(s.replace(/\./g, function() {
+                return (c++ === 1) ? '' : '.';
+            }));
+        },
+
+        win = Y.config.win,
+
+        nav = win && win.navigator,
+
+        o = {
+
+        /**
+         * Internet Explorer version number or 0.  Example: 6
+         * @property ie
+         * @type float
+         * @static
+         */
+        ie: 0,
+
+        /**
+         * Opera version number or 0.  Example: 9.2
+         * @property opera
+         * @type float
+         * @static
+         */
+        opera: 0,
+
+        /**
+         * Gecko engine revision number.  Will evaluate to 1 if Gecko
+         * is detected but the revision could not be found. Other browsers
+         * will be 0.  Example: 1.8
+         * <pre>
+         * Firefox 1.0.0.4: 1.7.8   <-- Reports 1.7
+         * Firefox 1.5.0.9: 1.8.0.9 <-- 1.8
+         * Firefox 2.0.0.3: 1.8.1.3 <-- 1.81
+         * Firefox 3.0   <-- 1.9
+         * Firefox 3.5   <-- 1.91
+         * </pre>
+         * @property gecko
+         * @type float
+         * @static
+         */
+        gecko: 0,
+
+        /**
+         * AppleWebKit version.  KHTML browsers that are not WebKit browsers
+         * will evaluate to 1, other browsers 0.  Example: 418.9
+         * <pre>
+         * Safari 1.3.2 (312.6): 312.8.1 <-- Reports 312.8 -- currently the
+         *                                   latest available for Mac OSX 10.3.
+         * Safari 2.0.2:         416     <-- hasOwnProperty introduced
+         * Safari 2.0.4:         418     <-- preventDefault fixed
+         * Safari 2.0.4 (419.3): 418.9.1 <-- One version of Safari may run
+         *                                   different versions of webkit
+         * Safari 2.0.4 (419.3): 419     <-- Tiger installations that have been
+         *                                   updated, but not updated
+         *                                   to the latest patch.
+         * Webkit 212 nightly:   522+    <-- Safari 3.0 precursor (with native
+         * SVG and many major issues fixed).
+         * Safari 3.0.4 (523.12) 523.12  <-- First Tiger release - automatic
+         * update from 2.x via the 10.4.11 OS patch.
+         * Webkit nightly 1/2008:525+    <-- Supports DOMContentLoaded event.
+         *                                   yahoo.com user agent hack removed.
+         * </pre>
+         * http://en.wikipedia.org/wiki/Safari_version_history
+         * @property webkit
+         * @type float
+         * @static
+         */
+        webkit: 0,
+
+        /**
+         * Safari will be detected as webkit, but this property will also
+         * be populated with the Safari version number
+         * @property safari
+         * @type float
+         * @static
+         */
+        safari: 0,
+
+        /**
+         * Chrome will be detected as webkit, but this property will also
+         * be populated with the Chrome version number
+         * @property chrome
+         * @type float
+         * @static
+         */
+        chrome: 0,
+
+        /**
+         * The mobile property will be set to a string containing any relevant
+         * user agent information when a modern mobile browser is detected.
+         * Currently limited to Safari on the iPhone/iPod Touch, Nokia N-series
+         * devices with the WebKit-based browser, and Opera Mini.
+         * @property mobile
+         * @type string
+         * @default null
+         * @static
+         */
+        mobile: null,
+
+        /**
+         * Adobe AIR version number or 0.  Only populated if webkit is detected.
+         * Example: 1.0
+         * @property air
+         * @type float
+         */
+        air: 0,
+        /**
+         * PhantomJS version number or 0.  Only populated if webkit is detected.
+         * Example: 1.0
+         * @property phantomjs
+         * @type float
+         */
+        phantomjs: 0,
+        /**
+         * Detects Apple iPad's OS version
+         * @property ipad
+         * @type float
+         * @static
+         */
+        ipad: 0,
+        /**
+         * Detects Apple iPhone's OS version
+         * @property iphone
+         * @type float
+         * @static
+         */
+        iphone: 0,
+        /**
+         * Detects Apples iPod's OS version
+         * @property ipod
+         * @type float
+         * @static
+         */
+        ipod: 0,
+        /**
+         * General truthy check for iPad, iPhone or iPod
+         * @property ios
+         * @type Boolean
+         * @default null
+         * @static
+         */
+        ios: null,
+        /**
+         * Detects Googles Android OS version
+         * @property android
+         * @type float
+         * @static
+         */
+        android: 0,
+        /**
+         * Detects Kindle Silk
+         * @property silk
+         * @type float
+         * @static
+         */
+        silk: 0,
+        /**
+         * Detects Kindle Silk Acceleration
+         * @property accel
+         * @type Boolean
+         * @static
+         */
+        accel: false,
+        /**
+         * Detects Palms WebOS version
+         * @property webos
+         * @type float
+         * @static
+         */
+        webos: 0,
+
+        /**
+         * Google Caja version number or 0.
+         * @property caja
+         * @type float
+         */
+        caja: nav && nav.cajaVersion,
+
+        /**
+         * Set to true if the page appears to be in SSL
+         * @property secure
+         * @type boolean
+         * @static
+         */
+        secure: false,
+
+        /**
+         * The operating system.  Currently only detecting windows or macintosh
+         * @property os
+         * @type string
+         * @default null
+         * @static
+         */
+        os: null,
+
+        /**
+         * The Nodejs Version
+         * @property nodejs
+         * @type float
+         * @default 0
+         * @static
+         */
+        nodejs: 0,
+        /**
+        * Window8/IE10 Application host environment
+        * @property winjs
+        * @type Boolean
+        * @static
+        */
+        winjs: !!((typeof Windows !== "undefined") && Windows.System),
+        /**
+        * Are touch/msPointer events available on this device
+        * @property touchEnabled
+        * @type Boolean
+        * @static
+        */
+        touchEnabled: false
+    },
+
+    ua = subUA || nav && nav.userAgent,
+
+    loc = win && win.location,
+
+    href = loc && loc.href,
+
+    m;
+
+    /**
+    * The User Agent string that was parsed
+    * @property userAgent
+    * @type String
+    * @static
+    */
+    o.userAgent = ua;
+
+
+    o.secure = href && (href.toLowerCase().indexOf('https') === 0);
+
+    if (ua) {
+
+        if ((/windows|win32/i).test(ua)) {
+            o.os = 'windows';
+        } else if ((/macintosh|mac_powerpc/i).test(ua)) {
+            o.os = 'macintosh';
+        } else if ((/android/i).test(ua)) {
+            o.os = 'android';
+        } else if ((/symbos/i).test(ua)) {
+            o.os = 'symbos';
+        } else if ((/linux/i).test(ua)) {
+            o.os = 'linux';
+        } else if ((/rhino/i).test(ua)) {
+            o.os = 'rhino';
+        }
+
+        // Modern KHTML browsers should qualify as Safari X-Grade
+        if ((/KHTML/).test(ua)) {
+            o.webkit = 1;
+        }
+        if ((/IEMobile|XBLWP7/).test(ua)) {
+            o.mobile = 'windows';
+        }
+        if ((/Fennec/).test(ua)) {
+            o.mobile = 'gecko';
+        }
+        // Modern WebKit browsers are at least X-Grade
+        m = ua.match(/AppleWebKit\/([^\s]*)/);
+        if (m && m[1]) {
+            o.webkit = numberify(m[1]);
+            o.safari = o.webkit;
+
+            if (/PhantomJS/.test(ua)) {
+                m = ua.match(/PhantomJS\/([^\s]*)/);
+                if (m && m[1]) {
+                    o.phantomjs = numberify(m[1]);
+                }
+            }
+
+            // Mobile browser check
+            if (/ Mobile\//.test(ua) || (/iPad|iPod|iPhone/).test(ua)) {
+                o.mobile = 'Apple'; // iPhone or iPod Touch
+
+                m = ua.match(/OS ([^\s]*)/);
+                if (m && m[1]) {
+                    m = numberify(m[1].replace('_', '.'));
+                }
+                o.ios = m;
+                o.os = 'ios';
+                o.ipad = o.ipod = o.iphone = 0;
+
+                m = ua.match(/iPad|iPod|iPhone/);
+                if (m && m[0]) {
+                    o[m[0].toLowerCase()] = o.ios;
+                }
+            } else {
+                m = ua.match(/NokiaN[^\/]*|webOS\/\d\.\d/);
+                if (m) {
+                    // Nokia N-series, webOS, ex: NokiaN95
+                    o.mobile = m[0];
+                }
+                if (/webOS/.test(ua)) {
+                    o.mobile = 'WebOS';
+                    m = ua.match(/webOS\/([^\s]*);/);
+                    if (m && m[1]) {
+                        o.webos = numberify(m[1]);
+                    }
+                }
+                if (/ Android/.test(ua)) {
+                    if (/Mobile/.test(ua)) {
+                        o.mobile = 'Android';
+                    }
+                    m = ua.match(/Android ([^\s]*);/);
+                    if (m && m[1]) {
+                        o.android = numberify(m[1]);
+                    }
+
+                }
+                if (/Silk/.test(ua)) {
+                    m = ua.match(/Silk\/([^\s]*)\)/);
+                    if (m && m[1]) {
+                        o.silk = numberify(m[1]);
+                    }
+                    if (!o.android) {
+                        o.android = 2.34; //Hack for desktop mode in Kindle
+                        o.os = 'Android';
+                    }
+                    if (/Accelerated=true/.test(ua)) {
+                        o.accel = true;
+                    }
+                }
+            }
+
+            m = ua.match(/OPR\/(\d+\.\d+)/);
+
+            if (m && m[1]) {
+                // Opera 15+ with Blink (pretends to be both Chrome and Safari)
+                o.opera = numberify(m[1]);
+            } else {
+                m = ua.match(/(Chrome|CrMo|CriOS)\/([^\s]*)/);
+
+                if (m && m[1] && m[2]) {
+                    o.chrome = numberify(m[2]); // Chrome
+                    o.safari = 0; //Reset safari back to 0
+                    if (m[1] === 'CrMo') {
+                        o.mobile = 'chrome';
+                    }
+                } else {
+                    m = ua.match(/AdobeAIR\/([^\s]*)/);
+                    if (m) {
+                        o.air = m[0]; // Adobe AIR 1.0 or better
+                    }
+                }
+            }
+        }
+
+        if (!o.webkit) { // not webkit
+// @todo check Opera/8.01 (J2ME/MIDP; Opera Mini/2.0.4509/1316; fi; U; ssr)
+            if (/Opera/.test(ua)) {
+                m = ua.match(/Opera[\s\/]([^\s]*)/);
+                if (m && m[1]) {
+                    o.opera = numberify(m[1]);
+                }
+                m = ua.match(/Version\/([^\s]*)/);
+                if (m && m[1]) {
+                    o.opera = numberify(m[1]); // opera 10+
+                }
+
+                if (/Opera Mobi/.test(ua)) {
+                    o.mobile = 'opera';
+                    m = ua.replace('Opera Mobi', '').match(/Opera ([^\s]*)/);
+                    if (m && m[1]) {
+                        o.opera = numberify(m[1]);
+                    }
+                }
+                m = ua.match(/Opera Mini[^;]*/);
+
+                if (m) {
+                    o.mobile = m[0]; // ex: Opera Mini/2.0.4509/1316
+                }
+            } else { // not opera or webkit
+                m = ua.match(/MSIE ([^;]*)|Trident.*; rv:([0-9.]+)/);
+
+                if (m && (m[1] || m[2])) {
+                    o.ie = numberify(m[1] || m[2]);
+                } else { // not opera, webkit, or ie
+                    m = ua.match(/Gecko\/([^\s]*)/);
+
+                    if (m) {
+                        o.gecko = 1; // Gecko detected, look for revision
+                        m = ua.match(/rv:([^\s\)]*)/);
+                        if (m && m[1]) {
+                            o.gecko = numberify(m[1]);
+                            if (/Mobile|Tablet/.test(ua)) {
+                                o.mobile = "ffos";
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    //Check for known properties to tell if touch events are enabled on this device or if
+    //the number of MSPointer touchpoints on this device is greater than 0.
+    if (win && nav && !(o.chrome && o.chrome < 6)) {
+        o.touchEnabled = (("ontouchstart" in win) || (("msMaxTouchPoints" in nav) && (nav.msMaxTouchPoints > 0)));
+    }
+
+    //It was a parsed UA, do not assign the global value.
+    if (!subUA) {
+
+        if (typeof process === 'object') {
+
+            if (process.versions && process.versions.node) {
+                //NodeJS
+                o.os = process.platform;
+                o.nodejs = numberify(process.versions.node);
+            }
+        }
+
+        YUI.Env.UA = o;
+
+    }
+
+    return o;
+};
+
+
+Y.UA = YUI.Env.UA || YUI.Env.parseUA();
+
+/**
+Performs a simple comparison between two version numbers, accounting for
+standard versioning logic such as the fact that "535.8" is a lower version than
+"535.24", even though a simple numerical comparison would indicate that it's
+greater. Also accounts for cases such as "1.1" vs. "1.1.0", which are
+considered equivalent.
+
+Returns -1 if version _a_ is lower than version _b_, 0 if they're equivalent,
+1 if _a_ is higher than _b_.
+
+Versions may be numbers or strings containing numbers and dots. For example,
+both `535` and `"535.8.10"` are acceptable. A version string containing
+non-numeric characters, like `"535.8.beta"`, may produce unexpected results.
+
+@method compareVersions
+@param {Number|String} a First version number to compare.
+@param {Number|String} b Second version number to compare.
+@return -1 if _a_ is lower than _b_, 0 if they're equivalent, 1 if _a_ is
+    higher than _b_.
+**/
+Y.UA.compareVersions = function (a, b) {
+    var aPart, aParts, bPart, bParts, i, len;
+
+    if (a === b) {
+        return 0;
+    }
+
+    aParts = (a + '').split('.');
+    bParts = (b + '').split('.');
+
+    for (i = 0, len = Math.max(aParts.length, bParts.length); i < len; ++i) {
+        aPart = parseInt(aParts[i], 10);
+        bPart = parseInt(bParts[i], 10);
+
+        /*jshint expr: true*/
+        isNaN(aPart) && (aPart = 0);
+        isNaN(bPart) && (bPart = 0);
+
+        if (aPart < bPart) {
+            return -1;
+        }
+
+        if (aPart > bPart) {
+            return 1;
+        }
+    }
+
+    return 0;
+};
+YUI.Env.aliases = {
+    "anim": ["anim-base","anim-color","anim-curve","anim-easing","anim-node-plugin","anim-scroll","anim-xy"],
+    "anim-shape-transform": ["anim-shape"],
+    "app": ["app-base","app-content","app-transitions","lazy-model-list","model","model-list","model-sync-rest","router","view","view-node-map"],
+    "attribute": ["attribute-base","attribute-complex"],
+    "attribute-events": ["attribute-observable"],
+    "autocomplete": ["autocomplete-base","autocomplete-sources","autocomplete-list","autocomplete-plugin"],
+    "axes": ["axis-numeric","axis-category","axis-time","axis-stacked"],
+    "axes-base": ["axis-numeric-base","axis-category-base","axis-time-base","axis-stacked-base"],
+    "base": ["base-base","base-pluginhost","base-build"],
+    "cache": ["cache-base","cache-offline","cache-plugin"],
+    "charts": ["charts-base"],
+    "collection": ["array-extras","arraylist","arraylist-add","arraylist-filter","array-invoke"],
+    "color": ["color-base","color-hsl","color-harmony"],
+    "controller": ["router"],
+    "dataschema": ["dataschema-base","dataschema-json","dataschema-xml","dataschema-array","dataschema-text"],
+    "datasource": ["datasource-local","datasource-io","datasource-get","datasource-function","datasource-cache","datasource-jsonschema","datasource-xmlschema","datasource-arrayschema","datasource-textschema","datasource-polling"],
+    "datatable": ["datatable-core","datatable-table","datatable-head","datatable-body","datatable-base","datatable-column-widths","datatable-message","datatable-mutable","datatable-sort","datatable-datasource"],
+    "datatype": ["datatype-date","datatype-number","datatype-xml"],
+    "datatype-date": ["datatype-date-parse","datatype-date-format","datatype-date-math"],
+    "datatype-number": ["datatype-number-parse","datatype-number-format"],
+    "datatype-xml": ["datatype-xml-parse","datatype-xml-format"],
+    "dd": ["dd-ddm-base","dd-ddm","dd-ddm-drop","dd-drag","dd-proxy","dd-constrain","dd-drop","dd-scroll","dd-delegate"],
+    "dom": ["dom-base","dom-screen","dom-style","selector-native","selector"],
+    "editor": ["frame","editor-selection","exec-command","editor-base","editor-para","editor-br","editor-bidi","editor-tab","createlink-base"],
+    "event": ["event-base","event-delegate","event-synthetic","event-mousewheel","event-mouseenter","event-key","event-focus","event-resize","event-hover","event-outside","event-touch","event-move","event-flick","event-valuechange","event-tap"],
+    "event-custom": ["event-custom-base","event-custom-complex"],
+    "event-gestures": ["event-flick","event-move"],
+    "handlebars": ["handlebars-compiler"],
+    "highlight": ["highlight-base","highlight-accentfold"],
+    "history": ["history-base","history-hash","history-hash-ie","history-html5"],
+    "io": ["io-base","io-xdr","io-form","io-upload-iframe","io-queue"],
+    "json": ["json-parse","json-stringify"],
+    "loader": ["loader-base","loader-rollup","loader-yui3"],
+    "node": ["node-base","node-event-delegate","node-pluginhost","node-screen","node-style"],
+    "pluginhost": ["pluginhost-base","pluginhost-config"],
+    "querystring": ["querystring-parse","querystring-stringify"],
+    "recordset": ["recordset-base","recordset-sort","recordset-filter","recordset-indexer"],
+    "resize": ["resize-base","resize-proxy","resize-constrain"],
+    "slider": ["slider-base","slider-value-range","clickable-rail","range-slider"],
+    "template": ["template-base","template-micro"],
+    "text": ["text-accentfold","text-wordbreak"],
+    "widget": ["widget-base","widget-htmlparser","widget-skin","widget-uievents"]
+};
+
+
+}, '3.12.0', {
+    "use": [
+        "yui-base",
+        "get",
+        "features",
+        "intl-base",
+        "yui-log",
+        "yui-later",
+        "loader-base",
+        "loader-rollup",
+        "loader-yui3"
+    ]
+});
+YUI.add('get', function (Y, NAME) {
+
+/*jslint boss:true, expr:true, laxbreak: true */
+
+/**
+Provides dynamic loading of remote JavaScript and CSS resources.
+
+@module get
+@class Get
+@static
+**/
+
+var Lang = Y.Lang,
+
+    CUSTOM_ATTRS, // defined lazily in Y.Get.Transaction._createNode()
+
+    Get, Transaction;
+
+Y.Get = Get = {
+    // -- Public Properties ----------------------------------------------------
+
+    /**
+    Default options for CSS requests. Options specified here will override
+    global defaults for CSS requests.
+
+    See the `options` property for all available options.
+
+    @property cssOptions
+    @type Object
+    @static
+    @since 3.5.0
+    **/
+    cssOptions: {
+        attributes: {
+            rel: 'stylesheet'
+        },
+
+        doc         : Y.config.linkDoc || Y.config.doc,
+        pollInterval: 50
+    },
+
+    /**
+    Default options for JS requests. Options specified here will override global
+    defaults for JS requests.
+
+    See the `options` property for all available options.
+
+    @property jsOptions
+    @type Object
+    @static
+    @since 3.5.0
+    **/
+    jsOptions: {
+        autopurge: true,
+        doc      : Y.config.scriptDoc || Y.config.doc
+    },
+
+    /**
+    Default options to use for all requests.
+
+    Note that while all available options are documented here for ease of
+    discovery, some options (like callback functions) only make sense at the
+    transaction level.
+
+    Callback functions specified via the options object or the `options`
+    parameter of the `css()`, `js()`, or `load()` methods will receive the
+    transaction object as a parameter. See `Y.Get.Transaction` for details on
+    the properties and methods available on transactions.
+
+    @static
+    @since 3.5.0
+    @property {Object} options
+
+    @property {Boolean} [options.async=false] Whether or not to load scripts
+        asynchronously, meaning they're requested in parallel and execution
+        order is not guaranteed. Has no effect on CSS, since CSS is always
+        loaded asynchronously.
+
+    @property {Object} [options.attributes] HTML attribute name/value pairs that
+        should be added to inserted nodes. By default, the `charset` attribute
+        will be set to "utf-8" and nodes will be given an auto-generated `id`
+        attribute, but you can override these with your own values if desired.
+
+    @property {Boolean} [options.autopurge] Whether or not to automatically
+        purge inserted nodes after the purge threshold is reached. This is
+        `true` by default for JavaScript, but `false` for CSS since purging a
+        CSS node will also remove any styling applied by the referenced file.
+
+    @property {Object} [options.context] `this` object to use when calling
+        callback functions. Defaults to the transaction object.
+
+    @property {Mixed} [options.data] Arbitrary data object to pass to "on*"
+        callbacks.
+
+    @property {Document} [options.doc] Document into which nodes should be
+        inserted. By default, the current document is used.
+
+    @property {HTMLElement|String} [options.insertBefore] HTML element or id
+        string of an element before which all generated nodes should be
+        inserted. If not specified, Get will automatically determine the best
+        place to insert nodes for maximum compatibility.
+
+    @property {Function} [options.onEnd] Callback to execute after a transaction
+        is complete, regardless of whether it succeeded or failed.
+
+    @property {Function} [options.onFailure] Callback to execute after a
+        transaction fails, times out, or is aborted.
+
+    @property {Function} [options.onProgress] Callback to execute after each
+        individual request in a transaction either succeeds or fails.
+
+    @property {Function} [options.onSuccess] Callback to execute after a
+        transaction completes successfully with no errors. Note that in browsers
+        that don't support the `error` event on CSS `<link>` nodes, a failed CSS
+        request may still be reported as a success because in these browsers
+        it can be difficult or impossible to distinguish between success and
+        failure for CSS resources.
+
+    @property {Function} [options.onTimeout] Callback to execute after a
+        transaction times out.
+
+    @property {Number} [options.pollInterval=50] Polling interval (in
+        milliseconds) for detecting CSS load completion in browsers that don't
+        support the `load` event on `<link>` nodes. This isn't used for
+        JavaScript.
+
+    @property {Number} [options.purgethreshold=20] Number of nodes to insert
+        before triggering an automatic purge when `autopurge` is `true`.
+
+    @property {Number} [options.timeout] Number of milliseconds to wait before
+        aborting a transaction. When a timeout occurs, the `onTimeout` callback
+        is called, followed by `onFailure` and finally `onEnd`. By default,
+        there is no timeout.
+
+    @property {String} [options.type] Resource type ("css" or "js"). This option
+        is set automatically by the `css()` and `js()` functions and will be
+        ignored there, but may be useful when using the `load()` function. If
+        not specified, the type will be inferred from the URL, defaulting to
+        "js" if the URL doesn't contain a recognizable file extension.
+    **/
+    options: {
+        attributes: {
+            charset: 'utf-8'
+        },
+
+        purgethreshold: 20
+    },
+
+    // -- Protected Properties -------------------------------------------------
+
+    /**
+    Regex that matches a CSS URL. Used to guess the file type when it's not
+    specified.
+
+    @property REGEX_CSS
+    @type RegExp
+    @final
+    @protected
+    @static
+    @since 3.5.0
+    **/
+    REGEX_CSS: /\.css(?:[?;].*)?$/i,
+
+    /**
+    Regex that matches a JS URL. Used to guess the file type when it's not
+    specified.
+
+    @property REGEX_JS
+    @type RegExp
+    @final
+    @protected
+    @static
+    @since 3.5.0
+    **/
+    REGEX_JS : /\.js(?:[?;].*)?$/i,
+
+    /**
+    Contains information about the current environment, such as what script and
+    link injection features it supports.
+
+    This object is created and populated the first time the `_getEnv()` method
+    is called.
+
+    @property _env
+    @type Object
+    @protected
+    @static
+    @since 3.5.0
+    **/
+
+    /**
+    Mapping of document _yuid strings to <head> or <base> node references so we
+    don't have to look the node up each time we want to insert a request node.
+
+    @property _insertCache
+    @type Object
+    @protected
+    @static
+    @since 3.5.0
+    **/
+    _insertCache: {},
+
+    /**
+    Information about the currently pending transaction, if any.
+
+    This is actually an object with two properties: `callback`, containing the
+    optional callback passed to `css()`, `load()`, or `js()`; and `transaction`,
+    containing the actual transaction instance.
+
+    @property _pending
+    @type Object
+    @protected
+    @static
+    @since 3.5.0
+    **/
+    _pending: null,
+
+    /**
+    HTML nodes eligible to be purged next time autopurge is triggered.
+
+    @property _purgeNodes
+    @type HTMLElement[]
+    @protected
+    @static
+    @since 3.5.0
+    **/
+    _purgeNodes: [],
+
+    /**
+    Queued transactions and associated callbacks.
+
+    @property _queue
+    @type Object[]
+    @protected
+    @static
+    @since 3.5.0
+    **/
+    _queue: [],
+
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Aborts the specified transaction.
+
+    This will cause the transaction's `onFailure` callback to be called and
+    will prevent any new script and link nodes from being added to the document,
+    but any resources that have already been requested will continue loading
+    (there's no safe way to prevent this, unfortunately).
+
+    *Note:* This method is deprecated as of 3.5.0, and will be removed in a
+    future version of YUI. Use the transaction-level `abort()` method instead.
+
+    @method abort
+    @param {Get.Transaction} transaction Transaction to abort.
+    @deprecated Use the `abort()` method on the transaction instead.
+    @static
+    **/
+    abort: function (transaction) {
+        var i, id, item, len, pending;
+
+
+        if (!transaction.abort) {
+            id          = transaction;
+            pending     = this._pending;
+            transaction = null;
+
+            if (pending && pending.transaction.id === id) {
+                transaction   = pending.transaction;
+                this._pending = null;
+            } else {
+                for (i = 0, len = this._queue.length; i < len; ++i) {
+                    item = this._queue[i].transaction;
+
+                    if (item.id === id) {
+                        transaction = item;
+                        this._queue.splice(i, 1);
+                        break;
+                    }
+                }
+            }
+        }
+
+        transaction && transaction.abort();
+    },
+
+    /**
+    Loads one or more CSS files.
+
+    The _urls_ parameter may be provided as a URL string, a request object,
+    or an array of URL strings and/or request objects.
+
+    A request object is just an object that contains a `url` property and zero
+    or more options that should apply specifically to that request.
+    Request-specific options take priority over transaction-level options and
+    default options.
+
+    URLs may be relative or absolute, and do not have to have the same origin
+    as the current page.
+
+    The `options` parameter may be omitted completely and a callback passed in
+    its place, if desired.
+
+    @example
+
+        // Load a single CSS file and log a message on completion.
+        Y.Get.css('foo.css', function (err) {
+            if (err) {
+            } else {
+            }
+        });
+
+        // Load multiple CSS files and log a message when all have finished
+        // loading.
+        var urls = ['foo.css', 'http://example.com/bar.css', 'baz/quux.css'];
+
+        Y.Get.css(urls, function (err) {
+            if (err) {
+            } else {
+            }
+        });
+
+        // Specify transaction-level options, which will apply to all requests
+        // within the transaction.
+        Y.Get.css(urls, {
+            attributes: {'class': 'my-css'},
+            timeout   : 5000
+        });
+
+        // Specify per-request options, which override transaction-level and
+        // default options.
+        Y.Get.css([
+            {url: 'foo.css', attributes: {id: 'foo'}},
+            {url: 'bar.css', attributes: {id: 'bar', charset: 'iso-8859-1'}}
+        ]);
+
+    @method css
+    @param {String|Object|Array} urls URL string, request object, or array
+        of URLs and/or request objects to load.
+    @param {Object} [options] Options for this transaction. See the
+        `Y.Get.options` property for a complete list of available options.
+    @param {Function} [callback] Callback function to be called on completion.
+        This is a general callback and will be called before any more granular
+        callbacks (`onSuccess`, `onFailure`, etc.) specified in the `options`
+        object.
+
+        @param {Array|null} callback.err Array of errors that occurred during
+            the transaction, or `null` on success.
+        @param {Get.Transaction} callback.transaction Transaction object.
+
+    @return {Get.Transaction} Transaction object.
+    @static
+    **/
+    css: function (urls, options, callback) {
+        return this._load('css', urls, options, callback);
+    },
+
+    /**
+    Loads one or more JavaScript resources.
+
+    The _urls_ parameter may be provided as a URL string, a request object,
+    or an array of URL strings and/or request objects.
+
+    A request object is just an object that contains a `url` property and zero
+    or more options that should apply specifically to that request.
+    Request-specific options take priority over transaction-level options and
+    default options.
+
+    URLs may be relative or absolute, and do not have to have the same origin
+    as the current page.
+
+    The `options` parameter may be omitted completely and a callback passed in
+    its place, if desired.
+
+    Scripts will be executed in the order they're specified unless the `async`
+    option is `true`, in which case they'll be loaded in parallel and executed
+    in whatever order they finish loading.
+
+    @example
+
+        // Load a single JS file and log a message on completion.
+        Y.Get.js('foo.js', function (err) {
+            if (err) {
+            } else {
+            }
+        });
+
+        // Load multiple JS files, execute them in order, and log a message when
+        // all have finished loading.
+        var urls = ['foo.js', 'http://example.com/bar.js', 'baz/quux.js'];
+
+        Y.Get.js(urls, function (err) {
+            if (err) {
+            } else {
+            }
+        });
+
+        // Specify transaction-level options, which will apply to all requests
+        // within the transaction.
+        Y.Get.js(urls, {
+            attributes: {'class': 'my-js'},
+            timeout   : 5000
+        });
+
+        // Specify per-request options, which override transaction-level and
+        // default options.
+        Y.Get.js([
+            {url: 'foo.js', attributes: {id: 'foo'}},
+            {url: 'bar.js', attributes: {id: 'bar', charset: 'iso-8859-1'}}
+        ]);
+
+    @method js
+    @param {String|Object|Array} urls URL string, request object, or array
+        of URLs and/or request objects to load.
+    @param {Object} [options] Options for this transaction. See the
+        `Y.Get.options` property for a complete list of available options.
+    @param {Function} [callback] Callback function to be called on completion.
+        This is a general callback and will be called before any more granular
+        callbacks (`onSuccess`, `onFailure`, etc.) specified in the `options`
+        object.
+
+        @param {Array|null} callback.err Array of errors that occurred during
+            the transaction, or `null` on success.
+        @param {Get.Transaction} callback.transaction Transaction object.
+
+    @return {Get.Transaction} Transaction object.
+    @since 3.5.0
+    @static
+    **/
+    js: function (urls, options, callback) {
+        return this._load('js', urls, options, callback);
+    },
+
+    /**
+    Loads one or more CSS and/or JavaScript resources in the same transaction.
+
+    Use this method when you want to load both CSS and JavaScript in a single
+    transaction and be notified when all requested URLs have finished loading,
+    regardless of type.
+
+    Behavior and options are the same as for the `css()` and `js()` methods. If
+    a resource type isn't specified in per-request options or transaction-level
+    options, Get will guess the file type based on the URL's extension (`.css`
+    or `.js`, with or without a following query string). If the file type can't
+    be guessed from the URL, a warning will be logged and Get will assume the
+    URL is a JavaScript resource.
+
+    @example
+
+        // Load both CSS and JS files in a single transaction, and log a message
+        // when all files have finished loading.
+        Y.Get.load(['foo.css', 'bar.js', 'baz.css'], function (err) {
+            if (err) {
+            } else {
+            }
+        });
+
+    @method load
+    @param {String|Object|Array} urls URL string, request object, or array
+        of URLs and/or request objects to load.
+    @param {Object} [options] Options for this transaction. See the
+        `Y.Get.options` property for a complete list of available options.
+    @param {Function} [callback] Callback function to be called on completion.
+        This is a general callback and will be called before any more granular
+        callbacks (`onSuccess`, `onFailure`, etc.) specified in the `options`
+        object.
+
+        @param {Array|null} err Array of errors that occurred during the
+            transaction, or `null` on success.
+        @param {Get.Transaction} Transaction object.
+
+    @return {Get.Transaction} Transaction object.
+    @since 3.5.0
+    @static
+    **/
+    load: function (urls, options, callback) {
+        return this._load(null, urls, options, callback);
+    },
+
+    // -- Protected Methods ----------------------------------------------------
+
+    /**
+    Triggers an automatic purge if the purge threshold has been reached.
+
+    @method _autoPurge
+    @param {Number} threshold Purge threshold to use, in milliseconds.
+    @protected
+    @since 3.5.0
+    @static
+    **/
+    _autoPurge: function (threshold) {
+        if (threshold && this._purgeNodes.length >= threshold) {
+            this._purge(this._purgeNodes);
+        }
+    },
+
+    /**
+    Populates the `_env` property with information about the current
+    environment.
+
+    @method _getEnv
+    @return {Object} Environment information.
+    @protected
+    @since 3.5.0
+    @static
+    **/
+    _getEnv: function () {
+        var doc = Y.config.doc,
+            ua  = Y.UA;
+
+        // Note: some of these checks require browser sniffs since it's not
+        // feasible to load test files on every pageview just to perform a
+        // feature test. I'm sorry if this makes you sad.
+        return (this._env = {
+
+            // True if this is a browser that supports disabling async mode on
+            // dynamically created script nodes. See
+            // https://developer.mozilla.org/En/HTML/Element/Script#Attributes
+
+            // IE10 doesn't return true for the MDN feature test, so setting it explicitly,
+            // because it is async by default, and allows you to disable async by setting it to false
+            async: (doc && doc.createElement('script').async === true) || (ua.ie >= 10),
+
+            // True if this browser fires an event when a dynamically injected
+            // link node fails to load. This is currently true for Firefox 9+
+            // and WebKit 535.24+
+            cssFail: ua.gecko >= 9 || ua.compareVersions(ua.webkit, 535.24) >= 0,
+
+            // True if this browser fires an event when a dynamically injected
+            // link node finishes loading. This is currently true for IE, Opera,
+            // Firefox 9+, and WebKit 535.24+. Note that IE versions <9 fire the
+            // DOM 0 "onload" event, but not "load". All versions of IE fire
+            // "onload".
+            // davglass: Seems that Chrome on Android needs this to be false.
+            cssLoad: (
+                    (!ua.gecko && !ua.webkit) || ua.gecko >= 9 ||
+                    ua.compareVersions(ua.webkit, 535.24) >= 0
+                ) && !(ua.chrome && ua.chrome <= 18),
+
+            // True if this browser preserves script execution order while
+            // loading scripts in parallel as long as the script node's `async`
+            // attribute is set to false to explicitly disable async execution.
+            preservesScriptOrder: !!(ua.gecko || ua.opera || (ua.ie && ua.ie >= 10))
+        });
+    },
+
+    _getTransaction: function (urls, options) {
+        var requests = [],
+            i, len, req, url;
+
+        if (!Lang.isArray(urls)) {
+            urls = [urls];
+        }
+
+        options = Y.merge(this.options, options);
+
+        // Clone the attributes object so we don't end up modifying it by ref.
+        options.attributes = Y.merge(this.options.attributes,
+                options.attributes);
+
+        for (i = 0, len = urls.length; i < len; ++i) {
+            url = urls[i];
+            req = {attributes: {}};
+
+            // If `url` is a string, we create a URL object for it, then mix in
+            // global options and request-specific options. If it's an object
+            // with a "url" property, we assume it's a request object containing
+            // URL-specific options.
+            if (typeof url === 'string') {
+                req.url = url;
+            } else if (url.url) {
+                // URL-specific options override both global defaults and
+                // request-specific options.
+                Y.mix(req, url, false, null, 0, true);
+                url = url.url; // Make url a string so we can use it later.
+            } else {
+                continue;
+            }
+
+            Y.mix(req, options, false, null, 0, true);
+
+            // If we didn't get an explicit type for this URL either in the
+            // request options or the URL-specific options, try to determine
+            // one from the file extension.
+            if (!req.type) {
+                if (this.REGEX_CSS.test(url)) {
+                    req.type = 'css';
+                } else {
+                    if (!this.REGEX_JS.test(url)) {
+                    }
+
+                    req.type = 'js';
+                }
+            }
+
+            // Mix in type-specific default options, but don't overwrite any
+            // options that have already been set.
+            Y.mix(req, req.type === 'js' ? this.jsOptions : this.cssOptions,
+                false, null, 0, true);
+
+            // Give the node an id attribute if it doesn't already have one.
+            req.attributes.id || (req.attributes.id = Y.guid());
+
+            // Backcompat for <3.5.0 behavior.
+            if (req.win) {
+                req.doc = req.win.document;
+            } else {
+                req.win = req.doc.defaultView || req.doc.parentWindow;
+            }
+
+            if (req.charset) {
+                req.attributes.charset = req.charset;
+            }
+
+            requests.push(req);
+        }
+
+        return new Transaction(requests, options);
+    },
+
+    _load: function (type, urls, options, callback) {
+        var transaction;
+
+        // Allow callback as third param.
+        if (typeof options === 'function') {
+            callback = options;
+            options  = {};
+        }
+
+        options || (options = {});
+        options.type = type;
+
+        options._onFinish = Get._onTransactionFinish;
+
+        if (!this._env) {
+            this._getEnv();
+        }
+
+        transaction = this._getTransaction(urls, options);
+
+        this._queue.push({
+            callback   : callback,
+            transaction: transaction
+        });
+
+        this._next();
+
+        return transaction;
+    },
+
+    _onTransactionFinish : function() {
+        Get._pending = null;
+        Get._next();
+    },
+
+    _next: function () {
+        var item;
+
+        if (this._pending) {
+            return;
+        }
+
+        item = this._queue.shift();
+
+        if (item) {
+            this._pending = item;
+            item.transaction.execute(item.callback);
+        }
+    },
+
+    _purge: function (nodes) {
+        var purgeNodes    = this._purgeNodes,
+            isTransaction = nodes !== purgeNodes,
+            index, node;
+
+        while (node = nodes.pop()) { // assignment
+            // Don't purge nodes that haven't finished loading (or errored out),
+            // since this can hang the transaction.
+            if (!node._yuiget_finished) {
+                continue;
+            }
+
+            node.parentNode && node.parentNode.removeChild(node);
+
+            // If this is a transaction-level purge and this node also exists in
+            // the Get-level _purgeNodes array, we need to remove it from
+            // _purgeNodes to avoid creating a memory leak. The indexOf lookup
+            // sucks, but until we get WeakMaps, this is the least troublesome
+            // way to do this (we can't just hold onto node ids because they may
+            // not be in the same document).
+            if (isTransaction) {
+                index = Y.Array.indexOf(purgeNodes, node);
+
+                if (index > -1) {
+                    purgeNodes.splice(index, 1);
+                }
+            }
+        }
+    }
+};
+
+/**
+Alias for `js()`.
+
+@method script
+@static
+**/
+Get.script = Get.js;
+
+/**
+Represents a Get transaction, which may contain requests for one or more JS or
+CSS files.
+
+This class should not be instantiated manually. Instances will be created and
+returned as needed by Y.Get's `css()`, `js()`, and `load()` methods.
+
+@class Get.Transaction
+@constructor
+@since 3.5.0
+**/
+Get.Transaction = Transaction = function (requests, options) {
+    var self = this;
+
+    self.id       = Transaction._lastId += 1;
+    self.data     = options.data;
+    self.errors   = [];
+    self.nodes    = [];
+    self.options  = options;
+    self.requests = requests;
+
+    self._callbacks = []; // callbacks to call after execution finishes
+    self._queue     = [];
+    self._reqsWaiting   = 0;
+
+    // Deprecated pre-3.5.0 properties.
+    self.tId = self.id; // Use `id` instead.
+    self.win = options.win || Y.config.win;
+};
+
+/**
+Arbitrary data object associated with this transaction.
+
+This object comes from the options passed to `Get.css()`, `Get.js()`, or
+`Get.load()`, and will be `undefined` if no data object was specified.
+
+@property {Object} data
+**/
+
+/**
+Array of errors that have occurred during this transaction, if any.
+
+@since 3.5.0
+@property {Object[]} errors
+@property {String} errors.error Error message.
+@property {Object} errors.request Request object related to the error.
+**/
+
+/**
+Numeric id for this transaction, unique among all transactions within the same
+YUI sandbox in the current pageview.
+
+@property {Number} id
+@since 3.5.0
+**/
+
+/**
+HTMLElement nodes (native ones, not YUI Node instances) that have been inserted
+during the current transaction.
+
+@property {HTMLElement[]} nodes
+**/
+
+/**
+Options associated with this transaction.
+
+See `Get.options` for the full list of available options.
+
+@property {Object} options
+@since 3.5.0
+**/
+
+/**
+Request objects contained in this transaction. Each request object represents
+one CSS or JS URL that will be (or has been) requested and loaded into the page.
+
+@property {Object} requests
+@since 3.5.0
+**/
+
+/**
+Id of the most recent transaction.
+
+@property _lastId
+@type Number
+@protected
+@static
+**/
+Transaction._lastId = 0;
+
+Transaction.prototype = {
+    // -- Public Properties ----------------------------------------------------
+
+    /**
+    Current state of this transaction. One of "new", "executing", or "done".
+
+    @property _state
+    @type String
+    @protected
+    **/
+    _state: 'new', // "new", "executing", or "done"
+
+    // -- Public Methods -------------------------------------------------------
+
+    /**
+    Aborts this transaction.
+
+    This will cause the transaction's `onFailure` callback to be called and
+    will prevent any new script and link nodes from being added to the document,
+    but any resources that have already been requested will continue loading
+    (there's no safe way to prevent this, unfortunately).
+
+    @method abort
+    @param {String} [msg="Aborted."] Optional message to use in the `errors`
+        array describing why the transaction was aborted.
+    **/
+    abort: function (msg) {
+        this._pending    = null;
+        this._pendingCSS = null;
+        this._pollTimer  = clearTimeout(this._pollTimer);
+        this._queue      = [];
+        this._reqsWaiting    = 0;
+
+        this.errors.push({error: msg || 'Aborted'});
+        this._finish();
+    },
+
+    /**
+    Begins execting the transaction.
+
+    There's usually no reason to call this manually, since Get will call it
+    automatically when other pending transactions have finished. If you really
+    want to execute your transaction before Get does, you can, but be aware that
+    this transaction's scripts may end up executing before the scripts in other
+    pending transactions.
+
+    If the transaction is already executing, the specified callback (if any)
+    will be queued and called after execution finishes. If the transaction has
+    already finished, the callback will be called immediately (the transaction
+    will not be executed again).
+
+    @method execute
+    @param {Function} callback Callback function to execute after all requests
+        in the transaction are complete, or after the transaction is aborted.
+    **/
+    execute: function (callback) {
+        var self     = this,
+            requests = self.requests,
+            state    = self._state,
+            i, len, queue, req;
+
+        if (state === 'done') {
+            callback && callback(self.errors.length ? self.errors : null, self);
+            return;
+        } else {
+            callback && self._callbacks.push(callback);
+
+            if (state === 'executing') {
+                return;
+            }
+        }
+
+        self._state = 'executing';
+        self._queue = queue = [];
+
+        if (self.options.timeout) {
+            self._timeout = setTimeout(function () {
+                self.abort('Timeout');
+            }, self.options.timeout);
+        }
+
+        self._reqsWaiting = requests.length;
+
+        for (i = 0, len = requests.length; i < len; ++i) {
+            req = requests[i];
+
+            if (req.async || req.type === 'css') {
+                // No need to queue CSS or fully async JS.
+                self._insert(req);
+            } else {
+                queue.push(req);
+            }
+        }
+
+        self._next();
+    },
+
+    /**
+    Manually purges any `<script>` or `<link>` nodes this transaction has
+    created.
+
+    Be careful when purging a transaction that contains CSS requests, since
+    removing `<link>` nodes will also remove any styles they applied.
+
+    @method purge
+    **/
+    purge: function () {
+        Get._purge(this.nodes);
+    },
+
+    // -- Protected Methods ----------------------------------------------------
+    _createNode: function (name, attrs, doc) {
+        var node = doc.createElement(name),
+            attr, testEl;
+
+        if (!CUSTOM_ATTRS) {
+            // IE6 and IE7 expect property names rather than attribute names for
+            // certain attributes. Rather than sniffing, we do a quick feature
+            // test the first time _createNode() runs to determine whether we
+            // need to provide a workaround.
+            testEl = doc.createElement('div');
+            testEl.setAttribute('class', 'a');
+
+            CUSTOM_ATTRS = testEl.className === 'a' ? {} : {
+                'for'  : 'htmlFor',
+                'class': 'className'
+            };
+        }
+
+        for (attr in attrs) {
+            if (attrs.hasOwnProperty(attr)) {
+                node.setAttribute(CUSTOM_ATTRS[attr] || attr, attrs[attr]);
+            }
+        }
+
+        return node;
+    },
+
+    _finish: function () {
+        var errors  = this.errors.length ? this.errors : null,
+            options = this.options,
+            thisObj = options.context || this,
+            data, i, len;
+
+        if (this._state === 'done') {
+            return;
+        }
+
+        this._state = 'done';
+
+        for (i = 0, len = this._callbacks.length; i < len; ++i) {
+            this._callbacks[i].call(thisObj, errors, this);
+        }
+
+        data = this._getEventData();
+
+        if (errors) {
+            if (options.onTimeout && errors[errors.length - 1].error === 'Timeout') {
+                options.onTimeout.call(thisObj, data);
+            }
+
+            if (options.onFailure) {
+                options.onFailure.call(thisObj, data);
+            }
+        } else if (options.onSuccess) {
+            options.onSuccess.call(thisObj, data);
+        }
+
+        if (options.onEnd) {
+            options.onEnd.call(thisObj, data);
+        }
+
+        if (options._onFinish) {
+            options._onFinish();
+        }
+    },
+
+    _getEventData: function (req) {
+        if (req) {
+            // This merge is necessary for backcompat. I hate it.
+            return Y.merge(this, {
+                abort  : this.abort, // have to copy these because the prototype isn't preserved
+                purge  : this.purge,
+                request: req,
+                url    : req.url,
+                win    : req.win
+            });
+        } else {
+            return this;
+        }
+    },
+
+    _getInsertBefore: function (req) {
+        var doc = req.doc,
+            el  = req.insertBefore,
+            cache, docStamp;
+
+        if (el) {
+            return typeof el === 'string' ? doc.getElementById(el) : el;
+        }
+
+        cache    = Get._insertCache;
+        docStamp = Y.stamp(doc);
+
+        if ((el = cache[docStamp])) { // assignment
+            return el;
+        }
+
+        // Inserting before a <base> tag apparently works around an IE bug
+        // (according to a comment from pre-3.5.0 Y.Get), but I'm not sure what
+        // bug that is, exactly. Better safe than sorry?
+        if ((el = doc.getElementsByTagName('base')[0])) { // assignment
+            return (cache[docStamp] = el);
+        }
+
+        // Look for a <head> element.
+        el = doc.head || doc.getElementsByTagName('head')[0];
+
+        if (el) {
+            // Create a marker node at the end of <head> to use as an insertion
+            // point. Inserting before this node will ensure that all our CSS
+            // gets inserted in the correct order, to maintain style precedence.
+            el.appendChild(doc.createTextNode(''));
+            return (cache[docStamp] = el.lastChild);
+        }
+
+        // If all else fails, just insert before the first script node on the
+        // page, which is virtually guaranteed to exist.
+        return (cache[docStamp] = doc.getElementsByTagName('script')[0]);
+    },
+
+    _insert: function (req) {
+        var env          = Get._env,
+            insertBefore = this._getInsertBefore(req),
+            isScript     = req.type === 'js',
+            node         = req.node,
+            self         = this,
+            ua           = Y.UA,
+            cssTimeout, nodeType;
+
+        if (!node) {
+            if (isScript) {
+                nodeType = 'script';
+            } else if (!env.cssLoad && ua.gecko) {
+                nodeType = 'style';
+            } else {
+                nodeType = 'link';
+            }
+
+            node = req.node = this._createNode(nodeType, req.attributes,
+                req.doc);
+        }
+
+        function onError() {
+            self._progress('Failed to load ' + req.url, req);
+        }
+
+        function onLoad() {
+            if (cssTimeout) {
+                clearTimeout(cssTimeout);
+            }
+
+            self._progress(null, req);
+        }
+
+        // Deal with script asynchronicity.
+        if (isScript) {
+            node.setAttribute('src', req.url);
+
+            if (req.async) {
+                // Explicitly indicate that we want the browser to execute this
+                // script asynchronously. This is necessary for older browsers
+                // like Firefox <4.
+                node.async = true;
+            } else {
+                if (env.async) {
+                    // This browser treats injected scripts as async by default
+                    // (standard HTML5 behavior) but asynchronous loading isn't
+                    // desired, so tell the browser not to mark this script as
+                    // async.
+                    node.async = false;
+                }
+
+                // If this browser doesn't preserve script execution order based
+                // on insertion order, we'll need to avoid inserting other
+                // scripts until this one finishes loading.
+                if (!env.preservesScriptOrder) {
+                    this._pending = req;
+                }
+            }
+        } else {
+            if (!env.cssLoad && ua.gecko) {
+                // In Firefox <9, we can import the requested URL into a <style>
+                // node and poll for the existence of node.sheet.cssRules. This
+                // gives us a reliable way to determine CSS load completion that
+                // also works for cross-domain stylesheets.
+                //
+                // Props to Zach Leatherman for calling my attention to this
+                // technique.
+                node.innerHTML = (req.attributes.charset ?
+                    '@charset "' + req.attributes.charset + '";' : '') +
+                    '@import "' + req.url + '";';
+            } else {
+                node.setAttribute('href', req.url);
+            }
+        }
+
+        // Inject the node.
+        if (isScript && ua.ie && (ua.ie < 9 || (document.documentMode && document.documentMode < 9))) {
+            // Script on IE < 9, and IE 9+ when in IE 8 or older modes, including quirks mode.
+            node.onreadystatechange = function () {
+                if (/loaded|complete/.test(node.readyState)) {
+                    node.onreadystatechange = null;
+                    onLoad();
+                }
+            };
+        } else if (!isScript && !env.cssLoad) {
+            // CSS on Firefox <9 or WebKit.
+            this._poll(req);
+        } else {
+            // Script or CSS on everything else. Using DOM 0 events because that
+            // evens the playing field with older IEs.
+
+            if (ua.ie >= 10) {
+
+                // We currently need to introduce a timeout for IE10, since it
+                // calls onerror/onload synchronously for 304s - messing up existing
+                // program flow.
+
+                // Remove this block if the following bug gets fixed by GA
+                /*jshint maxlen: 1500 */
+                // https://connect.microsoft.com/IE/feedback/details/763871/dynamically-loaded-scripts-with-304s-responses-interrupt-the-currently-executing-js-thread-onload
+                node.onerror = function() { setTimeout(onError, 0); };
+                node.onload  = function() { setTimeout(onLoad, 0); };
+            } else {
+                node.onerror = onError;
+                node.onload  = onLoad;
+            }
+
+            // If this browser doesn't fire an event when CSS fails to load,
+            // fail after a timeout to avoid blocking the transaction queue.
+            if (!env.cssFail && !isScript) {
+                cssTimeout = setTimeout(onError, req.timeout || 3000);
+            }
+        }
+
+        this.nodes.push(node);
+        insertBefore.parentNode.insertBefore(node, insertBefore);
+    },
+
+    _next: function () {
+        if (this._pending) {
+            return;
+        }
+
+        // If there are requests in the queue, insert the next queued request.
+        // Otherwise, if we're waiting on already-inserted requests to finish,
+        // wait longer. If there are no queued requests and we're not waiting
+        // for anything to load, then we're done!
+        if (this._queue.length) {
+            this._insert(this._queue.shift());
+        } else if (!this._reqsWaiting) {
+            this._finish();
+        }
+    },
+
+    _poll: function (newReq) {
+        var self       = this,
+            pendingCSS = self._pendingCSS,
+            isWebKit   = Y.UA.webkit,
+            i, hasRules, j, nodeHref, req, sheets;
+
+        if (newReq) {
+            pendingCSS || (pendingCSS = self._pendingCSS = []);
+            pendingCSS.push(newReq);
+
+            if (self._pollTimer) {
+                // A poll timeout is already pending, so no need to create a
+                // new one.
+                return;
+            }
+        }
+
+        self._pollTimer = null;
+
+        // Note: in both the WebKit and Gecko hacks below, a CSS URL that 404s
+        // will still be treated as a success. There's no good workaround for
+        // this.
+
+        for (i = 0; i < pendingCSS.length; ++i) {
+            req = pendingCSS[i];
+
+            if (isWebKit) {
+                // Look for a stylesheet matching the pending URL.
+                sheets   = req.doc.styleSheets;
+                j        = sheets.length;
+                nodeHref = req.node.href;
+
+                while (--j >= 0) {
+                    if (sheets[j].href === nodeHref) {
+                        pendingCSS.splice(i, 1);
+                        i -= 1;
+                        self._progress(null, req);
+                        break;
+                    }
+                }
+            } else {
+                // Many thanks to Zach Leatherman for calling my attention to
+                // the @import-based cross-domain technique used here, and to
+                // Oleg Slobodskoi for an earlier same-domain implementation.
+                //
+                // See Zach's blog for more details:
+                // http://www.zachleat.com/web/2010/07/29/load-css-dynamically/
+                try {
+                    // We don't really need to store this value since we never
+                    // use it again, but if we don't store it, Closure Compiler
+                    // assumes the code is useless and removes it.
+                    hasRules = !!req.node.sheet.cssRules;
+
+                    // If we get here, the stylesheet has loaded.
+                    pendingCSS.splice(i, 1);
+                    i -= 1;
+                    self._progress(null, req);
+                } catch (ex) {
+                    // An exception means the stylesheet is still loading.
+                }
+            }
+        }
+
+        if (pendingCSS.length) {
+            self._pollTimer = setTimeout(function () {
+                self._poll.call(self);
+            }, self.options.pollInterval);
+        }
+    },
+
+    _progress: function (err, req) {
+        var options = this.options;
+
+        if (err) {
+            req.error = err;
+
+            this.errors.push({
+                error  : err,
+                request: req
+            });
+
+        }
+
+        req.node._yuiget_finished = req.finished = true;
+
+        if (options.onProgress) {
+            options.onProgress.call(options.context || this,
+                this._getEventData(req));
+        }
+
+        if (req.autopurge) {
+            // Pre-3.5.0 Get always excludes the most recent node from an
+            // autopurge. I find this odd, but I'm keeping that behavior for
+            // the sake of backcompat.
+            Get._autoPurge(this.options.purgethreshold);
+            Get._purgeNodes.push(req.node);
+        }
+
+        if (this._pending === req) {
+            this._pending = null;
+        }
+
+        this._reqsWaiting -= 1;
+
+        this._next();
+    }
+};
+
+
+}, '3.12.0', {"requires": ["yui-base"]});
+YUI.add('features', function (Y, NAME) {
+
+var feature_tests = {};
+
+/**
+Contains the core of YUI's feature test architecture.
+@module features
+*/
+
+/**
+* Feature detection
+* @class Features
+* @static
+*/
+
+Y.mix(Y.namespace('Features'), {
+
+    /**
+    * Object hash of all registered feature tests
+    * @property tests
+    * @type Object
+    */
+    tests: feature_tests,
+
+    /**
+    * Add a test to the system
+    *
+    *   ```
+    *   Y.Features.add("load", "1", {});
+    *   ```
+    *
+    * @method add
+    * @param {String} cat The category, right now only 'load' is supported
+    * @param {String} name The number sequence of the test, how it's reported in the URL or config: 1, 2, 3
+    * @param {Object} o Object containing test properties
+    * @param {String} o.name The name of the test
+    * @param {Function} o.test The test function to execute, the only argument to the function is the `Y` instance
+    * @param {String} o.trigger The module that triggers this test.
+    */
+    add: function(cat, name, o) {
+        feature_tests[cat] = feature_tests[cat] || {};
+        feature_tests[cat][name] = o;
+    },
+    /**
+    * Execute all tests of a given category and return the serialized results
+    *
+    *   ```
+    *   caps=1:1;2:1;3:0
+    *   ```
+    * @method all
+    * @param {String} cat The category to execute
+    * @param {Array} args The arguments to pass to the test function
+    * @return {String} A semi-colon separated string of tests and their success/failure: 1:1;2:1;3:0
+    */
+    all: function(cat, args) {
+        var cat_o = feature_tests[cat],
+            // results = {};
+            result = [];
+        if (cat_o) {
+            Y.Object.each(cat_o, function(v, k) {
+                result.push(k + ':' + (Y.Features.test(cat, k, args) ? 1 : 0));
+            });
+        }
+
+        return (result.length) ? result.join(';') : '';
+    },
+    /**
+    * Run a sepecific test and return a Boolean response.
+    *
+    *   ```
+    *   Y.Features.test("load", "1");
+    *   ```
+    *
+    * @method test
+    * @param {String} cat The category of the test to run
+    * @param {String} name The name of the test to run
+    * @param {Array} args The arguments to pass to the test function
+    * @return {Boolean} True or false if the test passed/failed.
+    */
+    test: function(cat, name, args) {
+        args = args || [];
+        var result, ua, test,
+            cat_o = feature_tests[cat],
+            feature = cat_o && cat_o[name];
+
+        if (!feature) {
+        } else {
+
+            result = feature.result;
+
+            if (Y.Lang.isUndefined(result)) {
+
+                ua = feature.ua;
+                if (ua) {
+                    result = (Y.UA[ua]);
+                }
+
+                test = feature.test;
+                if (test && ((!ua) || result)) {
+                    result = test.apply(Y, args);
+                }
+
+                feature.result = result;
+            }
+        }
+
+        return result;
+    }
+});
+
+// Y.Features.add("load", "1", {});
+// Y.Features.test("load", "1");
+// caps=1:1;2:0;3:1;
+
+/* This file is auto-generated by (yogi.js loader --mix --yes) */
+/*jshint maxlen:900, eqeqeq: false */
+var add = Y.Features.add;
+// app-transitions-native
+add('load', '0', {
+    "name": "app-transitions-native",
+    "test": function (Y) {
+    var doc  = Y.config.doc,
+        node = doc ? doc.documentElement : null;
+
+    if (node && node.style) {
+        return ('MozTransition' in node.style || 'WebkitTransition' in node.style || 'transition' in node.style);
+    }
+
+    return false;
+},
+    "trigger": "app-transitions"
+});
+// autocomplete-list-keys
+add('load', '1', {
+    "name": "autocomplete-list-keys",
+    "test": function (Y) {
+    // Only add keyboard support to autocomplete-list if this doesn't appear to
+    // be an iOS or Android-based mobile device.
+    //
+    // There's currently no feasible way to actually detect whether a device has
+    // a hardware keyboard, so this sniff will have to do. It can easily be
+    // overridden by manually loading the autocomplete-list-keys module.
+    //
+    // Worth noting: even though iOS supports bluetooth keyboards, Mobile Safari
+    // doesn't fire the keyboard events used by AutoCompleteList, so there's
+    // no point loading the -keys module even when a bluetooth keyboard may be
+    // available.
+    return !(Y.UA.ios || Y.UA.android);
+},
+    "trigger": "autocomplete-list"
+});
+// dd-gestures
+add('load', '2', {
+    "name": "dd-gestures",
+    "trigger": "dd-drag",
+    "ua": "touchEnabled"
+});
+// dom-style-ie
+add('load', '3', {
+    "name": "dom-style-ie",
+    "test": function (Y) {
+
+    var testFeature = Y.Features.test,
+        addFeature = Y.Features.add,
+        WINDOW = Y.config.win,
+        DOCUMENT = Y.config.doc,
+        DOCUMENT_ELEMENT = 'documentElement',
+        ret = false;
+
+    addFeature('style', 'computedStyle', {
+        test: function() {
+            return WINDOW && 'getComputedStyle' in WINDOW;
+        }
+    });
+
+    addFeature('style', 'opacity', {
+        test: function() {
+            return DOCUMENT && 'opacity' in DOCUMENT[DOCUMENT_ELEMENT].style;
+        }
+    });
+
+    ret =  (!testFeature('style', 'opacity') &&
+            !testFeature('style', 'computedStyle'));
+
+    return ret;
+},
+    "trigger": "dom-style"
+});
+// editor-para-ie
+add('load', '4', {
+    "name": "editor-para-ie",
+    "trigger": "editor-para",
+    "ua": "ie",
+    "when": "instead"
+});
+// event-base-ie
+add('load', '5', {
+    "name": "event-base-ie",
+    "test": function(Y) {
+    var imp = Y.config.doc && Y.config.doc.implementation;
+    return (imp && (!imp.hasFeature('Events', '2.0')));
+},
+    "trigger": "node-base"
+});
+// graphics-canvas
+add('load', '6', {
+    "name": "graphics-canvas",
+    "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
+        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
+    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
+},
+    "trigger": "graphics"
+});
+// graphics-canvas-default
+add('load', '7', {
+    "name": "graphics-canvas-default",
+    "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
+        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
+    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
+},
+    "trigger": "graphics"
+});
+// graphics-svg
+add('load', '8', {
+    "name": "graphics-svg",
+    "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
+        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
+    
+    return svg && (useSVG || !canvas);
+},
+    "trigger": "graphics"
+});
+// graphics-svg-default
+add('load', '9', {
+    "name": "graphics-svg-default",
+    "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
+        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
+    
+    return svg && (useSVG || !canvas);
+},
+    "trigger": "graphics"
+});
+// graphics-vml
+add('load', '10', {
+    "name": "graphics-vml",
+    "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas");
+    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
+},
+    "trigger": "graphics"
+});
+// graphics-vml-default
+add('load', '11', {
+    "name": "graphics-vml-default",
+    "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas");
+    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
+},
+    "trigger": "graphics"
+});
+// history-hash-ie
+add('load', '12', {
+    "name": "history-hash-ie",
+    "test": function (Y) {
+    var docMode = Y.config.doc && Y.config.doc.documentMode;
+
+    return Y.UA.ie && (!('onhashchange' in Y.config.win) ||
+            !docMode || docMode < 8);
+},
+    "trigger": "history-hash"
+});
+// io-nodejs
+add('load', '13', {
+    "name": "io-nodejs",
+    "trigger": "io-base",
+    "ua": "nodejs"
+});
+// json-parse-shim
+add('load', '14', {
+    "name": "json-parse-shim",
+    "test": function (Y) {
+    var _JSON = Y.config.global.JSON,
+        Native = Object.prototype.toString.call(_JSON) === '[object JSON]' && _JSON,
+        nativeSupport = Y.config.useNativeJSONParse !== false && !!Native;
+
+    function workingNative( k, v ) {
+        return k === "ok" ? true : v;
+    }
+    
+    // Double check basic functionality.  This is mainly to catch early broken
+    // implementations of the JSON API in Firefox 3.1 beta1 and beta2
+    if ( nativeSupport ) {
+        try {
+            nativeSupport = ( Native.parse( '{"ok":false}', workingNative ) ).ok;
+        }
+        catch ( e ) {
+            nativeSupport = false;
+        }
+    }
+
+    return !nativeSupport;
+},
+    "trigger": "json-parse"
+});
+// json-stringify-shim
+add('load', '15', {
+    "name": "json-stringify-shim",
+    "test": function (Y) {
+    var _JSON = Y.config.global.JSON,
+        Native = Object.prototype.toString.call(_JSON) === '[object JSON]' && _JSON,
+        nativeSupport = Y.config.useNativeJSONStringify !== false && !!Native;
+
+    // Double check basic native functionality.  This is primarily to catch broken
+    // early JSON API implementations in Firefox 3.1 beta1 and beta2.
+    if ( nativeSupport ) {
+        try {
+            nativeSupport = ( '0' === Native.stringify(0) );
+        } catch ( e ) {
+            nativeSupport = false;
+        }
+    }
+
+
+    return !nativeSupport;
+},
+    "trigger": "json-stringify"
+});
+// scrollview-base-ie
+add('load', '16', {
+    "name": "scrollview-base-ie",
+    "trigger": "scrollview-base",
+    "ua": "ie"
+});
+// selector-css2
+add('load', '17', {
+    "name": "selector-css2",
+    "test": function (Y) {
+    var DOCUMENT = Y.config.doc,
+        ret = DOCUMENT && !('querySelectorAll' in DOCUMENT);
+
+    return ret;
+},
+    "trigger": "selector"
+});
+// transition-timer
+add('load', '18', {
+    "name": "transition-timer",
+    "test": function (Y) {
+    var DOCUMENT = Y.config.doc,
+        node = (DOCUMENT) ? DOCUMENT.documentElement: null,
+        ret = true;
+
+    if (node && node.style) {
+        ret = !('MozTransition' in node.style || 'WebkitTransition' in node.style || 'transition' in node.style);
+    }
+
+    return ret;
+},
+    "trigger": "transition"
+});
+// widget-base-ie
+add('load', '19', {
+    "name": "widget-base-ie",
+    "trigger": "widget-base",
+    "ua": "ie"
+});
+// yql-jsonp
+add('load', '20', {
+    "name": "yql-jsonp",
+    "test": function (Y) {
+    /* Only load the JSONP module when not in nodejs or winjs
+    TODO Make the winjs module a CORS module
+    */
+    return (!Y.UA.nodejs && !Y.UA.winjs);
+},
+    "trigger": "yql",
+    "when": "after"
+});
+// yql-nodejs
+add('load', '21', {
+    "name": "yql-nodejs",
+    "trigger": "yql",
+    "ua": "nodejs",
+    "when": "after"
+});
+// yql-winjs
+add('load', '22', {
+    "name": "yql-winjs",
+    "trigger": "yql",
+    "ua": "winjs",
+    "when": "after"
+});
+
+}, '3.12.0', {"requires": ["yui-base"]});
+YUI.add('intl-base', function (Y, NAME) {
+
+/**
+ * The Intl utility provides a central location for managing sets of
+ * localized resources (strings and formatting patterns).
+ *
+ * @class Intl
+ * @uses EventTarget
+ * @static
+ */
+
+var SPLIT_REGEX = /[, ]/;
+
+Y.mix(Y.namespace('Intl'), {
+
+ /**
+    * Returns the language among those available that
+    * best matches the preferred language list, using the Lookup
+    * algorithm of BCP 47.
+    * If none of the available languages meets the user's preferences,
+    * then "" is returned.
+    * Extended language ranges are not supported.
+    *
+    * @method lookupBestLang
+    * @param {String[] | String} preferredLanguages The list of preferred
+    * languages in descending preference order, represented as BCP 47
+    * language tags. A string array or a comma-separated list.
+    * @param {String[]} availableLanguages The list of languages
+    * that the application supports, represented as BCP 47 language
+    * tags.
+    *
+    * @return {String} The available language that best matches the
+    * preferred language list, or "".
+    * @since 3.1.0
+    */
+    lookupBestLang: function(preferredLanguages, availableLanguages) {
+
+        var i, language, result, index;
+
+        // check whether the list of available languages contains language;
+        // if so return it
+        function scan(language) {
+            var i;
+            for (i = 0; i < availableLanguages.length; i += 1) {
+                if (language.toLowerCase() ===
+                            availableLanguages[i].toLowerCase()) {
+                    return availableLanguages[i];
+                }
+            }
+        }
+
+        if (Y.Lang.isString(preferredLanguages)) {
+            preferredLanguages = preferredLanguages.split(SPLIT_REGEX);
+        }
+
+        for (i = 0; i < preferredLanguages.length; i += 1) {
+            language = preferredLanguages[i];
+            if (!language || language === '*') {
+                continue;
+            }
+            // check the fallback sequence for one language
+            while (language.length > 0) {
+                result = scan(language);
+                if (result) {
+                    return result;
+                } else {
+                    index = language.lastIndexOf('-');
+                    if (index >= 0) {
+                        language = language.substring(0, index);
+                        // one-character subtags get cut along with the
+                        // following subtag
+                        if (index >= 2 && language.charAt(index - 2) === '-') {
+                            language = language.substring(0, index - 2);
+                        }
+                    } else {
+                        // nothing available for this language
+                        break;
+                    }
+                }
+            }
+        }
+
+        return '';
+    }
+});
+
+
+}, '3.12.0', {"requires": ["yui-base"]});
+YUI.add('yui-log', function (Y, NAME) {
+
+/**
+ * Provides console log capability and exposes a custom event for
+ * console implementations. This module is a `core` YUI module,
+ * <a href="../classes/YUI.html#method_log">it's documentation is located under the YUI class</a>.
+ *
+ * @module yui
+ * @submodule yui-log
+ */
+
+var INSTANCE = Y,
+    LOGEVENT = 'yui:log',
+    UNDEFINED = 'undefined',
+    LEVELS = { debug: 1,
+               info: 2,
+               warn: 4,
+               error: 8 };
+
+/**
+ * If the 'debug' config is true, a 'yui:log' event will be
+ * dispatched, which the Console widget and anything else
+ * can consume.  If the 'useBrowserConsole' config is true, it will
+ * write to the browser console if available.  YUI-specific log
+ * messages will only be present in the -debug versions of the
+ * JS files.  The build system is supposed to remove log statements
+ * from the raw and minified versions of the files.
+ *
+ * @method log
+ * @for YUI
+ * @param  {String}  msg  The message to log.
+ * @param  {String}  cat  The log category for the message.  Default
+ *                        categories are "info", "warn", "error", time".
+ *                        Custom categories can be used as well. (opt).
+ * @param  {String}  src  The source of the the message (opt).
+ * @param  {boolean} silent If true, the log event won't fire.
+ * @return {YUI}      YUI instance.
+ */
+INSTANCE.log = function(msg, cat, src, silent) {
+    var bail, excl, incl, m, f, minlevel,
+        Y = INSTANCE,
+        c = Y.config,
+        publisher = (Y.fire) ? Y : YUI.Env.globalEvents;
+    // suppress log message if the config is off or the event stack
+    // or the event call stack contains a consumer of the yui:log event
+    if (c.debug) {
+        // apply source filters
+        src = src || "";
+        if (typeof src !== "undefined") {
+            excl = c.logExclude;
+            incl = c.logInclude;
+            if (incl && !(src in incl)) {
+                bail = 1;
+            } else if (incl && (src in incl)) {
+                bail = !incl[src];
+            } else if (excl && (src in excl)) {
+                bail = excl[src];
+            }
+
+            // Determine the current minlevel as defined in configuration
+            Y.config.logLevel = Y.config.logLevel || 'debug';
+            minlevel = LEVELS[Y.config.logLevel.toLowerCase()];
+
+            if (cat in LEVELS && LEVELS[cat] < minlevel) {
+                // Skip this message if the we don't meet the defined minlevel
+                bail = 1;
+            }
+        }
+        if (!bail) {
+            if (c.useBrowserConsole) {
+                m = (src) ? src + ': ' + msg : msg;
+                if (Y.Lang.isFunction(c.logFn)) {
+                    c.logFn.call(Y, msg, cat, src);
+                } else if (typeof console !== UNDEFINED && console.log) {
+                    f = (cat && console[cat] && (cat in LEVELS)) ? cat : 'log';
+                    console[f](m);
+                } else if (typeof opera !== UNDEFINED) {
+                    opera.postError(m);
+                }
+            }
+
+            if (publisher && !silent) {
+
+                if (publisher === Y && (!publisher.getEvent(LOGEVENT))) {
+                    publisher.publish(LOGEVENT, {
+                        broadcast: 2
+                    });
+                }
+
+                publisher.fire(LOGEVENT, {
+                    msg: msg,
+                    cat: cat,
+                    src: src
+                });
+            }
+        }
+    }
+
+    return Y;
+};
+
+/**
+ * Write a system message.  This message will be preserved in the
+ * minified and raw versions of the YUI files, unlike log statements.
+ * @method message
+ * @for YUI
+ * @param  {String}  msg  The message to log.
+ * @param  {String}  cat  The log category for the message.  Default
+ *                        categories are "info", "warn", "error", time".
+ *                        Custom categories can be used as well. (opt).
+ * @param  {String}  src  The source of the the message (opt).
+ * @param  {boolean} silent If true, the log event won't fire.
+ * @return {YUI}      YUI instance.
+ */
+INSTANCE.message = function() {
+    return INSTANCE.log.apply(INSTANCE, arguments);
+};
+
+
+}, '3.12.0', {"requires": ["yui-base"]});
+YUI.add('yui-later', function (Y, NAME) {
+
+/**
+ * Provides a setTimeout/setInterval wrapper. This module is a `core` YUI module,
+ * <a href="../classes/YUI.html#method_later">it's documentation is located under the YUI class</a>.
+ *
+ * @module yui
+ * @submodule yui-later
+ */
+
+var NO_ARGS = [];
+
+/**
+ * Executes the supplied function in the context of the supplied
+ * object 'when' milliseconds later.  Executes the function a
+ * single time unless periodic is set to true.
+ * @for YUI
+ * @method later
+ * @param when {int} the number of milliseconds to wait until the fn
+ * is executed.
+ * @param o the context object.
+ * @param fn {Function|String} the function to execute or the name of
+ * the method in the 'o' object to execute.
+ * @param data [Array] data that is provided to the function.  This
+ * accepts either a single item or an array.  If an array is provided,
+ * the function is executed with one parameter for each array item.
+ * If you need to pass a single array parameter, it needs to be wrapped
+ * in an array [myarray].
+ *
+ * Note: native methods in IE may not have the call and apply methods.
+ * In this case, it will work, but you are limited to four arguments.
+ *
+ * @param periodic {boolean} if true, executes continuously at supplied
+ * interval until canceled.
+ * @return {object} a timer object. Call the cancel() method on this
+ * object to stop the timer.
+ */
+Y.later = function(when, o, fn, data, periodic) {
+    when = when || 0;
+    data = (!Y.Lang.isUndefined(data)) ? Y.Array(data) : NO_ARGS;
+    o = o || Y.config.win || Y;
+
+    var cancelled = false,
+        method = (o && Y.Lang.isString(fn)) ? o[fn] : fn,
+        wrapper = function() {
+            // IE 8- may execute a setInterval callback one last time
+            // after clearInterval was called, so in order to preserve
+            // the cancel() === no more runny-run, we have to jump through
+            // an extra hoop.
+            if (!cancelled) {
+                if (!method.apply) {
+                    method(data[0], data[1], data[2], data[3]);
+                } else {
+                    method.apply(o, data || NO_ARGS);
+                }
+            }
+        },
+        id = (periodic) ? setInterval(wrapper, when) : setTimeout(wrapper, when);
+
+    return {
+        id: id,
+        interval: periodic,
+        cancel: function() {
+            cancelled = true;
+            if (this.interval) {
+                clearInterval(id);
+            } else {
+                clearTimeout(id);
+            }
+        }
+    };
+};
+
+Y.Lang.later = Y.later;
+
+
+
+}, '3.12.0', {"requires": ["yui-base"]});
+YUI.add('loader-base', function (Y, NAME) {
+
+/**
+ * The YUI loader core
+ * @module loader
+ * @submodule loader-base
+ */
+
+(function() {
+    var VERSION = Y.version,
+        BUILD = '/build/',
+        ROOT = VERSION + '/',
+        CDN_BASE = Y.Env.base,
+        GALLERY_VERSION = 'gallery-2013.08.22-21-03',
+        TNT = '2in3',
+        TNT_VERSION = '4',
+        YUI2_VERSION = '2.9.0',
+        COMBO_BASE = CDN_BASE + 'combo?',
+        META = {
+            version: VERSION,
+            root: ROOT,
+            base: Y.Env.base,
+            comboBase: COMBO_BASE,
+            skin: {
+                defaultSkin: 'sam',
+                base: 'assets/skins/',
+                path: 'skin.css',
+                after: [
+                    'cssreset',
+                    'cssfonts',
+                    'cssgrids',
+                    'cssbase',
+                    'cssreset-context',
+                    'cssfonts-context'
+                ]
+            },
+            groups: {},
+            patterns: {}
+        },
+        groups = META.groups,
+        yui2Update = function(tnt, yui2, config) {
+            var root = TNT + '.' +
+                    (tnt || TNT_VERSION) + '/' +
+                    (yui2 || YUI2_VERSION) + BUILD,
+                base = (config && config.base) ? config.base : CDN_BASE,
+                combo = (config && config.comboBase) ? config.comboBase : COMBO_BASE;
+
+            groups.yui2.base = base + root;
+            groups.yui2.root = root;
+            groups.yui2.comboBase = combo;
+        },
+        galleryUpdate = function(tag, config) {
+            var root = (tag || GALLERY_VERSION) + BUILD,
+                base = (config && config.base) ? config.base : CDN_BASE,
+                combo = (config && config.comboBase) ? config.comboBase : COMBO_BASE;
+
+            groups.gallery.base = base + root;
+            groups.gallery.root = root;
+            groups.gallery.comboBase = combo;
+        };
+
+
+    groups[VERSION] = {};
+
+    groups.gallery = {
+        ext: false,
+        combine: true,
+        comboBase: COMBO_BASE,
+        update: galleryUpdate,
+        patterns: {
+            'gallery-': {},
+            'lang/gallery-': {},
+            'gallerycss-': {
+                type: 'css'
+            }
+        }
+    };
+
+    groups.yui2 = {
+        combine: true,
+        ext: false,
+        comboBase: COMBO_BASE,
+        update: yui2Update,
+        patterns: {
+            'yui2-': {
+                configFn: function(me) {
+                    if (/-skin|reset|fonts|grids|base/.test(me.name)) {
+                        me.type = 'css';
+                        me.path = me.path.replace(/\.js/, '.css');
+                        // this makes skins in builds earlier than
+                        // 2.6.0 work as long as combine is false
+                        me.path = me.path.replace(/\/yui2-skin/,
+                                            '/assets/skins/sam/yui2-skin');
+                    }
+                }
+            }
+        }
+    };
+
+    galleryUpdate();
+    yui2Update();
+
+    if (YUI.Env[VERSION]) {
+        Y.mix(META, YUI.Env[VERSION], false, [
+            'modules',
+            'groups',
+            'skin'
+        ], 0, true);
+    }
+
+    YUI.Env[VERSION] = META;
+}());
+/*jslint forin: true, maxlen: 350 */
+
+/**
+ * Loader dynamically loads script and css files.  It includes the dependency
+ * information for the version of the library in use, and will automatically pull in
+ * dependencies for the modules requested. It can also load the
+ * files from the Yahoo! CDN, and it can utilize the combo service provided on
+ * this network to reduce the number of http connections required to download
+ * YUI files.
+ *
+ * @module loader
+ * @main loader
+ * @submodule loader-base
+ */
+
+var NOT_FOUND = {},
+    NO_REQUIREMENTS = [],
+    MAX_URL_LENGTH = 1024,
+    GLOBAL_ENV = YUI.Env,
+    GLOBAL_LOADED = GLOBAL_ENV._loaded,
+    CSS = 'css',
+    JS = 'js',
+    INTL = 'intl',
+    DEFAULT_SKIN = 'sam',
+    VERSION = Y.version,
+    ROOT_LANG = '',
+    YObject = Y.Object,
+    oeach = YObject.each,
+    yArray = Y.Array,
+    _queue = GLOBAL_ENV._loaderQueue,
+    META = GLOBAL_ENV[VERSION],
+    SKIN_PREFIX = 'skin-',
+    L = Y.Lang,
+    ON_PAGE = GLOBAL_ENV.mods,
+    modulekey,
+    _path = function(dir, file, type, nomin) {
+        var path = dir + '/' + file;
+        if (!nomin) {
+            path += '-min';
+        }
+        path += '.' + (type || CSS);
+
+        return path;
+    };
+
+
+    if (!YUI.Env._cssLoaded) {
+        YUI.Env._cssLoaded = {};
+    }
+
+
+/**
+ * The component metadata is stored in Y.Env.meta.
+ * Part of the loader module.
+ * @property meta
+ * @for YUI
+ */
+Y.Env.meta = META;
+
+/**
+ * Loader dynamically loads script and css files.  It includes the dependency
+ * info for the version of the library in use, and will automatically pull in
+ * dependencies for the modules requested. It can load the
+ * files from the Yahoo! CDN, and it can utilize the combo service provided on
+ * this network to reduce the number of http connections required to download
+ * YUI files. You can also specify an external, custom combo service to host
+ * your modules as well.
+
+        var Y = YUI();
+        var loader = new Y.Loader({
+            filter: 'debug',
+            base: '../../',
+            root: 'build/',
+            combine: true,
+            require: ['node', 'dd', 'console']
+        });
+        var out = loader.resolve(true);
+
+ * @constructor
+ * @class Loader
+ * @param {Object} config an optional set of configuration options.
+ * @param {String} config.base The base dir which to fetch this module from
+ * @param {String} config.comboBase The Combo service base path. Ex: `http://yui.yahooapis.com/combo?`
+ * @param {String} config.root The root path to prepend to module names for the combo service. Ex: `2.5.2/build/`
+ * @param {String|Object} config.filter A filter to apply to result urls. <a href="#property_filter">See filter property</a>
+ * @param {Object} config.filters Per-component filter specification.  If specified for a given component, this overrides the filter config.
+ * @param {Boolean} config.combine Use a combo service to reduce the number of http connections required to load your dependencies
+ * @param {Boolean} [config.async=true] Fetch files in async
+ * @param {Array} config.ignore: A list of modules that should never be dynamically loaded
+ * @param {Array} config.force A list of modules that should always be loaded when required, even if already present on the page
+ * @param {HTMLElement|String} config.insertBefore Node or id for a node that should be used as the insertion point for new nodes
+ * @param {Object} config.jsAttributes Object literal containing attributes to add to script nodes
+ * @param {Object} config.cssAttributes Object literal containing attributes to add to link nodes
+ * @param {Number} config.timeout The number of milliseconds before a timeout occurs when dynamically loading nodes.  If not set, there is no timeout
+ * @param {Object} config.context Execution context for all callbacks
+ * @param {Function} config.onSuccess Callback for the 'success' event
+ * @param {Function} config.onFailure Callback for the 'failure' event
+ * @param {Function} config.onCSS Callback for the 'CSSComplete' event.  When loading YUI components with CSS the CSS is loaded first, then the script.  This provides a moment you can tie into to improve the presentation of the page while the script is loading.
+ * @param {Function} config.onTimeout Callback for the 'timeout' event
+ * @param {Function} config.onProgress Callback executed each time a script or css file is loaded
+ * @param {Object} config.modules A list of module definitions.  See <a href="#method_addModule">Loader.addModule</a> for the supported module metadata
+ * @param {Object} config.groups A list of group definitions.  Each group can contain specific definitions for `base`, `comboBase`, `combine`, and accepts a list of `modules`.
+ * @param {String} config.2in3 The version of the YUI 2 in 3 wrapper to use.  The intrinsic support for YUI 2 modules in YUI 3 relies on versions of the YUI 2 components inside YUI 3 module wrappers.  These wrappers change over time to accomodate the issues that arise from running YUI 2 in a YUI 3 sandbox.
+ * @param {String} config.yui2 When using the 2in3 project, you can select the version of YUI 2 to use.  Valid values are `2.2.2`, `2.3.1`, `2.4.1`, `2.5.2`, `2.6.0`, `2.7.0`, `2.8.0`, `2.8.1` and `2.9.0` [default] -- plus all versions of YUI 2 going forward.
+ */
+Y.Loader = function(o) {
+
+    var self = this;
+
+    //Catch no config passed.
+    o = o || {};
+
+    modulekey = META.md5;
+
+    /**
+     * Internal callback to handle multiple internal insert() calls
+     * so that css is inserted prior to js
+     * @property _internalCallback
+     * @private
+     */
+    // self._internalCallback = null;
+
+    /**
+     * Callback that will be executed when the loader is finished
+     * with an insert
+     * @method onSuccess
+     * @type function
+     */
+    // self.onSuccess = null;
+
+    /**
+     * Callback that will be executed if there is a failure
+     * @method onFailure
+     * @type function
+     */
+    // self.onFailure = null;
+
+    /**
+     * Callback for the 'CSSComplete' event.  When loading YUI components
+     * with CSS the CSS is loaded first, then the script.  This provides
+     * a moment you can tie into to improve the presentation of the page
+     * while the script is loading.
+     * @method onCSS
+     * @type function
+     */
+    // self.onCSS = null;
+
+    /**
+     * Callback executed each time a script or css file is loaded
+     * @method onProgress
+     * @type function
+     */
+    // self.onProgress = null;
+
+    /**
+     * Callback that will be executed if a timeout occurs
+     * @method onTimeout
+     * @type function
+     */
+    // self.onTimeout = null;
+
+    /**
+     * The execution context for all callbacks
+     * @property context
+     * @default {YUI} the YUI instance
+     */
+    self.context = Y;
+
+    /**
+     * Data that is passed to all callbacks
+     * @property data
+     */
+    // self.data = null;
+
+    /**
+     * Node reference or id where new nodes should be inserted before
+     * @property insertBefore
+     * @type string|HTMLElement
+     */
+    // self.insertBefore = null;
+
+    /**
+     * The charset attribute for inserted nodes
+     * @property charset
+     * @type string
+     * @deprecated , use cssAttributes or jsAttributes.
+     */
+    // self.charset = null;
+
+    /**
+     * An object literal containing attributes to add to link nodes
+     * @property cssAttributes
+     * @type object
+     */
+    // self.cssAttributes = null;
+
+    /**
+     * An object literal containing attributes to add to script nodes
+     * @property jsAttributes
+     * @type object
+     */
+    // self.jsAttributes = null;
+
+    /**
+     * The base directory.
+     * @property base
+     * @type string
+     * @default http://yui.yahooapis.com/[YUI VERSION]/build/
+     */
+    self.base = Y.Env.meta.base + Y.Env.meta.root;
+
+    /**
+     * Base path for the combo service
+     * @property comboBase
+     * @type string
+     * @default http://yui.yahooapis.com/combo?
+     */
+    self.comboBase = Y.Env.meta.comboBase;
+
+    /*
+     * Base path for language packs.
+     */
+    // self.langBase = Y.Env.meta.langBase;
+    // self.lang = "";
+
+    /**
+     * If configured, the loader will attempt to use the combo
+     * service for YUI resources and configured external resources.
+     * @property combine
+     * @type boolean
+     * @default true if a base dir isn't in the config
+     */
+    self.combine = o.base &&
+        (o.base.indexOf(self.comboBase.substr(0, 20)) > -1);
+
+    /**
+    * The default seperator to use between files in a combo URL
+    * @property comboSep
+    * @type {String}
+    * @default Ampersand
+    */
+    self.comboSep = '&';
+    /**
+     * Max url length for combo urls.  The default is 1024. This is the URL
+     * limit for the Yahoo! hosted combo servers.  If consuming
+     * a different combo service that has a different URL limit
+     * it is possible to override this default by supplying
+     * the maxURLLength config option.  The config option will
+     * only take effect if lower than the default.
+     *
+     * @property maxURLLength
+     * @type int
+     */
+    self.maxURLLength = MAX_URL_LENGTH;
+
+    /**
+     * Ignore modules registered on the YUI global
+     * @property ignoreRegistered
+     * @default false
+     */
+    self.ignoreRegistered = o.ignoreRegistered;
+
+    /**
+     * Root path to prepend to module path for the combo
+     * service
+     * @property root
+     * @type string
+     * @default [YUI VERSION]/build/
+     */
+    self.root = Y.Env.meta.root;
+
+    /**
+     * Timeout value in milliseconds.  If set, self value will be used by
+     * the get utility.  the timeout event will fire if
+     * a timeout occurs.
+     * @property timeout
+     * @type int
+     */
+    self.timeout = 0;
+
+    /**
+     * A list of modules that should not be loaded, even if
+     * they turn up in the dependency tree
+     * @property ignore
+     * @type string[]
+     */
+    // self.ignore = null;
+
+    /**
+     * A list of modules that should always be loaded, even
+     * if they have already been inserted into the page.
+     * @property force
+     * @type string[]
+     */
+    // self.force = null;
+
+    self.forceMap = {};
+
+    /**
+     * Should we allow rollups
+     * @property allowRollup
+     * @type boolean
+     * @default false
+     */
+    self.allowRollup = false;
+
+    /**
+     * A filter to apply to result urls.  This filter will modify the default
+     * path for all modules.  The default path for the YUI library is the
+     * minified version of the files (e.g., event-min.js).  The filter property
+     * can be a predefined filter or a custom filter.  The valid predefined
+     * filters are:
+     * <dl>
+     *  <dt>DEBUG</dt>
+     *  <dd>Selects the debug versions of the library (e.g., event-debug.js).
+     *      This option will automatically include the Logger widget</dd>
+     *  <dt>RAW</dt>
+     *  <dd>Selects the non-minified version of the library (e.g., event.js).
+     *  </dd>
+     * </dl>
+     * You can also define a custom filter, which must be an object literal
+     * containing a search expression and a replace string:
+     *
+     *      myFilter: {
+     *          'searchExp': "-min\\.js",
+     *          'replaceStr': "-debug.js"
+     *      }
+     *
+     * @property filter
+     * @type string| {searchExp: string, replaceStr: string}
+     */
+    // self.filter = null;
+
+    /**
+     * per-component filter specification.  If specified for a given
+     * component, this overrides the filter config.
+     * @property filters
+     * @type object
+     */
+    self.filters = {};
+
+    /**
+     * The list of requested modules
+     * @property required
+     * @type {string: boolean}
+     */
+    self.required = {};
+
+    /**
+     * If a module name is predefined when requested, it is checked againsts
+     * the patterns provided in this property.  If there is a match, the
+     * module is added with the default configuration.
+     *
+     * At the moment only supporting module prefixes, but anticipate
+     * supporting at least regular expressions.
+     * @property patterns
+     * @type Object
+     */
+    // self.patterns = Y.merge(Y.Env.meta.patterns);
+    self.patterns = {};
+
+    /**
+     * The library metadata
+     * @property moduleInfo
+     */
+    // self.moduleInfo = Y.merge(Y.Env.meta.moduleInfo);
+    self.moduleInfo = {};
+
+    self.groups = Y.merge(Y.Env.meta.groups);
+
+    /**
+     * Provides the information used to skin the skinnable components.
+     * The following skin definition would result in 'skin1' and 'skin2'
+     * being loaded for calendar (if calendar was requested), and
+     * 'sam' for all other skinnable components:
+     *
+     *      skin: {
+     *          // The default skin, which is automatically applied if not
+     *          // overriden by a component-specific skin definition.
+     *          // Change this in to apply a different skin globally
+     *          defaultSkin: 'sam',
+     *
+     *          // This is combined with the loader base property to get
+     *          // the default root directory for a skin. ex:
+     *          // http://yui.yahooapis.com/2.3.0/build/assets/skins/sam/
+     *          base: 'assets/skins/',
+     *
+     *          // Any component-specific overrides can be specified here,
+     *          // making it possible to load different skins for different
+     *          // components.  It is possible to load more than one skin
+     *          // for a given component as well.
+     *          overrides: {
+     *              calendar: ['skin1', 'skin2']
+     *          }
+     *      }
+     * @property skin
+     * @type {Object}
+     */
+    self.skin = Y.merge(Y.Env.meta.skin);
+
+    /*
+     * Map of conditional modules
+     * @since 3.2.0
+     */
+    self.conditions = {};
+
+    // map of modules with a hash of modules that meet the requirement
+    // self.provides = {};
+
+    self.config = o;
+    self._internal = true;
+
+    self._populateCache();
+
+    /**
+     * Set when beginning to compute the dependency tree.
+     * Composed of what YUI reports to be loaded combined
+     * with what has been loaded by any instance on the page
+     * with the version number specified in the metadata.
+     * @property loaded
+     * @type {string: boolean}
+     */
+    self.loaded = GLOBAL_LOADED[VERSION];
+
+
+    /**
+    * Should Loader fetch scripts in `async`, defaults to `true`
+    * @property async
+    */
+
+    self.async = true;
+
+    self._inspectPage();
+
+    self._internal = false;
+
+    self._config(o);
+
+    self.forceMap = (self.force) ? Y.Array.hash(self.force) : {};
+
+    self.testresults = null;
+
+    if (Y.config.tests) {
+        self.testresults = Y.config.tests;
+    }
+
+    /**
+     * List of rollup files found in the library metadata
+     * @property rollups
+     */
+    // self.rollups = null;
+
+    /**
+     * Whether or not to load optional dependencies for
+     * the requested modules
+     * @property loadOptional
+     * @type boolean
+     * @default false
+     */
+    // self.loadOptional = false;
+
+    /**
+     * All of the derived dependencies in sorted order, which
+     * will be populated when either calculate() or insert()
+     * is called
+     * @property sorted
+     * @type string[]
+     */
+    self.sorted = [];
+
+    /*
+     * A list of modules to attach to the YUI instance when complete.
+     * If not supplied, the sorted list of dependencies are applied.
+     * @property attaching
+     */
+    // self.attaching = null;
+
+    /**
+     * Flag to indicate the dependency tree needs to be recomputed
+     * if insert is called again.
+     * @property dirty
+     * @type boolean
+     * @default true
+     */
+    self.dirty = true;
+
+    /**
+     * List of modules inserted by the utility
+     * @property inserted
+     * @type {string: boolean}
+     */
+    self.inserted = {};
+
+    /**
+     * List of skipped modules during insert() because the module
+     * was not defined
+     * @property skipped
+     */
+    self.skipped = {};
+
+    // Y.on('yui:load', self.loadNext, self);
+
+    self.tested = {};
+
+    /*
+     * Cached sorted calculate results
+     * @property results
+     * @since 3.2.0
+     */
+    //self.results = {};
+
+    if (self.ignoreRegistered) {
+        //Clear inpage already processed modules.
+        self._resetModules();
+    }
+
+};
+
+Y.Loader.prototype = {
+    /**
+    * Checks the cache for modules and conditions, if they do not exist
+    * process the default metadata and populate the local moduleInfo hash.
+    * @method _populateCache
+    * @private
+    */
+    _populateCache: function() {
+        var self = this,
+            defaults = META.modules,
+            cache = GLOBAL_ENV._renderedMods,
+            i;
+
+        if (cache && !self.ignoreRegistered) {
+            for (i in cache) {
+                if (cache.hasOwnProperty(i)) {
+                    self.moduleInfo[i] = Y.merge(cache[i]);
+                }
+            }
+
+            cache = GLOBAL_ENV._conditions;
+            for (i in cache) {
+                if (cache.hasOwnProperty(i)) {
+                    self.conditions[i] = Y.merge(cache[i]);
+                }
+            }
+
+        } else {
+            for (i in defaults) {
+                if (defaults.hasOwnProperty(i)) {
+                    self.addModule(defaults[i], i);
+                }
+            }
+        }
+
+    },
+    /**
+    * Reset modules in the module cache to a pre-processed state so additional
+    * computations with a different skin or language will work as expected.
+    * @method _resetModules
+    * @private
+    */
+    _resetModules: function() {
+        var self = this, i, o,
+            mod, name, details;
+        for (i in self.moduleInfo) {
+            if (self.moduleInfo.hasOwnProperty(i)) {
+                mod = self.moduleInfo[i];
+                name = mod.name;
+                details  = (YUI.Env.mods[name] ? YUI.Env.mods[name].details : null);
+
+                if (details) {
+                    self.moduleInfo[name]._reset = true;
+                    self.moduleInfo[name].requires = details.requires || [];
+                    self.moduleInfo[name].optional = details.optional || [];
+                    self.moduleInfo[name].supersedes = details.supercedes || [];
+                }
+
+                if (mod.defaults) {
+                    for (o in mod.defaults) {
+                        if (mod.defaults.hasOwnProperty(o)) {
+                            if (mod[o]) {
+                                mod[o] = mod.defaults[o];
+                            }
+                        }
+                    }
+                }
+                delete mod.langCache;
+                delete mod.skinCache;
+                if (mod.skinnable) {
+                    self._addSkin(self.skin.defaultSkin, mod.name);
+                }
+            }
+        }
+    },
+    /**
+    Regex that matches a CSS URL. Used to guess the file type when it's not
+    specified.
+
+    @property REGEX_CSS
+    @type RegExp
+    @final
+    @protected
+    @since 3.5.0
+    **/
+    REGEX_CSS: /\.css(?:[?;].*)?$/i,
+
+    /**
+    * Default filters for raw and debug
+    * @property FILTER_DEFS
+    * @type Object
+    * @final
+    * @protected
+    */
+    FILTER_DEFS: {
+        RAW: {
+            'searchExp': '-min\\.js',
+            'replaceStr': '.js'
+        },
+        DEBUG: {
+            'searchExp': '-min\\.js',
+            'replaceStr': '-debug.js'
+        },
+        COVERAGE: {
+            'searchExp': '-min\\.js',
+            'replaceStr': '-coverage.js'
+        }
+    },
+    /*
+    * Check the pages meta-data and cache the result.
+    * @method _inspectPage
+    * @private
+    */
+    _inspectPage: function() {
+        var self = this, v, m, req, mr, i;
+
+        //Inspect the page for CSS only modules and mark them as loaded.
+        for (i in self.moduleInfo) {
+            if (self.moduleInfo.hasOwnProperty(i)) {
+                v = self.moduleInfo[i];
+                if (v.type && v.type === CSS) {
+                    if (self.isCSSLoaded(v.name)) {
+                        self.loaded[i] = true;
+                    }
+                }
+            }
+        }
+        for (i in ON_PAGE) {
+            if (ON_PAGE.hasOwnProperty(i)) {
+                v = ON_PAGE[i];
+                if (v.details) {
+                    m = self.moduleInfo[v.name];
+                    req = v.details.requires;
+                    mr = m && m.requires;
+
+                   if (m) {
+                       if (!m._inspected && req && mr.length !== req.length) {
+                           // console.log('deleting ' + m.name);
+                           delete m.expanded;
+                       }
+                   } else {
+                       m = self.addModule(v.details, i);
+                   }
+                   m._inspected = true;
+               }
+            }
+        }
+    },
+    /*
+    * returns true if b is not loaded, and is required directly or by means of modules it supersedes.
+    * @private
+    * @method _requires
+    * @param {String} mod1 The first module to compare
+    * @param {String} mod2 The second module to compare
+    */
+   _requires: function(mod1, mod2) {
+
+        var i, rm, after_map, s,
+            info = this.moduleInfo,
+            m = info[mod1],
+            other = info[mod2];
+
+        if (!m || !other) {
+            return false;
+        }
+
+        rm = m.expanded_map;
+        after_map = m.after_map;
+
+        // check if this module should be sorted after the other
+        // do this first to short circut circular deps
+        if (after_map && (mod2 in after_map)) {
+            return true;
+        }
+
+        after_map = other.after_map;
+
+        // and vis-versa
+        if (after_map && (mod1 in after_map)) {
+            return false;
+        }
+
+        // check if this module requires one the other supersedes
+        s = info[mod2] && info[mod2].supersedes;
+        if (s) {
+            for (i = 0; i < s.length; i++) {
+                if (this._requires(mod1, s[i])) {
+                    return true;
+                }
+            }
+        }
+
+        s = info[mod1] && info[mod1].supersedes;
+        if (s) {
+            for (i = 0; i < s.length; i++) {
+                if (this._requires(mod2, s[i])) {
+                    return false;
+                }
+            }
+        }
+
+        // check if this module requires the other directly
+        // if (r && yArray.indexOf(r, mod2) > -1) {
+        if (rm && (mod2 in rm)) {
+            return true;
+        }
+
+        // external css files should be sorted below yui css
+        if (m.ext && m.type === CSS && !other.ext && other.type === CSS) {
+            return true;
+        }
+
+        return false;
+    },
+    /**
+    * Apply a new config to the Loader instance
+    * @method _config
+    * @private
+    * @param {Object} o The new configuration
+    */
+    _config: function(o) {
+        var i, j, val, a, f, group, groupName, self = this,
+            mods = [], mod;
+        // apply config values
+        if (o) {
+            for (i in o) {
+                if (o.hasOwnProperty(i)) {
+                    val = o[i];
+                    //TODO This should be a case
+                    if (i === 'require') {
+                        self.require(val);
+                    } else if (i === 'skin') {
+                        //If the config.skin is a string, format to the expected object
+                        if (typeof val === 'string') {
+                            self.skin.defaultSkin = o.skin;
+                            val = {
+                                defaultSkin: val
+                            };
+                        }
+
+                        Y.mix(self.skin, val, true);
+                    } else if (i === 'groups') {
+                        for (j in val) {
+                            if (val.hasOwnProperty(j)) {
+                                groupName = j;
+                                group = val[j];
+                                self.addGroup(group, groupName);
+                                if (group.aliases) {
+                                    for (a in group.aliases) {
+                                        if (group.aliases.hasOwnProperty(a)) {
+                                            self.addAlias(group.aliases[a], a);
+                                        }
+                                    }
+                                }
+                            }
+                        }
+
+                    } else if (i === 'modules') {
+                        // add a hash of module definitions
+                        for (j in val) {
+                            if (val.hasOwnProperty(j)) {
+                                self.addModule(val[j], j);
+                            }
+                        }
+                    } else if (i === 'aliases') {
+                        for (j in val) {
+                            if (val.hasOwnProperty(j)) {
+                                self.addAlias(val[j], j);
+                            }
+                        }
+                    } else if (i === 'gallery') {
+                        if (this.groups.gallery.update) {
+                            this.groups.gallery.update(val, o);
+                        }
+                    } else if (i === 'yui2' || i === '2in3') {
+                        if (this.groups.yui2.update) {
+                            this.groups.yui2.update(o['2in3'], o.yui2, o);
+                        }
+                    } else {
+                        self[i] = val;
+                    }
+                }
+            }
+        }
+
+        // fix filter
+        f = self.filter;
+
+        if (L.isString(f)) {
+            f = f.toUpperCase();
+            self.filterName = f;
+            self.filter = self.FILTER_DEFS[f];
+            if (f === 'DEBUG') {
+                self.require('yui-log', 'dump');
+            }
+        }
+
+        if (self.filterName && self.coverage) {
+            if (self.filterName === 'COVERAGE' && L.isArray(self.coverage) && self.coverage.length) {
+                for (i = 0; i < self.coverage.length; i++) {
+                    mod = self.coverage[i];
+                    if (self.moduleInfo[mod] && self.moduleInfo[mod].use) {
+                        mods = [].concat(mods, self.moduleInfo[mod].use);
+                    } else {
+                        mods.push(mod);
+                    }
+                }
+                self.filters = self.filters || {};
+                Y.Array.each(mods, function(mod) {
+                    self.filters[mod] = self.FILTER_DEFS.COVERAGE;
+                });
+                self.filterName = 'RAW';
+                self.filter = self.FILTER_DEFS[self.filterName];
+            }
+        }
+
+    },
+
+    /**
+     * Returns the skin module name for the specified skin name.  If a
+     * module name is supplied, the returned skin module name is
+     * specific to the module passed in.
+     * @method formatSkin
+     * @param {string} skin the name of the skin.
+     * @param {string} mod optional: the name of a module to skin.
+     * @return {string} the full skin module name.
+     */
+    formatSkin: function(skin, mod) {
+        var s = SKIN_PREFIX + skin;
+        if (mod) {
+            s = s + '-' + mod;
+        }
+
+        return s;
+    },
+
+    /**
+     * Adds the skin def to the module info
+     * @method _addSkin
+     * @param {string} skin the name of the skin.
+     * @param {string} mod the name of the module.
+     * @param {string} parent parent module if this is a skin of a
+     * submodule or plugin.
+     * @return {string} the module name for the skin.
+     * @private
+     */
+    _addSkin: function(skin, mod, parent) {
+        var mdef, pkg, name, nmod,
+            info = this.moduleInfo,
+            sinf = this.skin,
+            ext = info[mod] && info[mod].ext;
+
+        // Add a module definition for the module-specific skin css
+        if (mod) {
+            name = this.formatSkin(skin, mod);
+            if (!info[name]) {
+                mdef = info[mod];
+                pkg = mdef.pkg || mod;
+                nmod = {
+                    skin: true,
+                    name: name,
+                    group: mdef.group,
+                    type: 'css',
+                    after: sinf.after,
+                    path: (parent || pkg) + '/' + sinf.base + skin +
+                          '/' + mod + '.css',
+                    ext: ext
+                };
+                if (mdef.base) {
+                    nmod.base = mdef.base;
+                }
+                if (mdef.configFn) {
+                    nmod.configFn = mdef.configFn;
+                }
+                this.addModule(nmod, name);
+
+            }
+        }
+
+        return name;
+    },
+    /**
+    * Adds an alias module to the system
+    * @method addAlias
+    * @param {Array} use An array of modules that makes up this alias
+    * @param {String} name The name of the alias
+    * @example
+    *       var loader = new Y.Loader({});
+    *       loader.addAlias([ 'node', 'yql' ], 'davglass');
+    *       loader.require(['davglass']);
+    *       var out = loader.resolve(true);
+    *
+    *       //out.js will contain Node and YQL modules
+    */
+    addAlias: function(use, name) {
+        YUI.Env.aliases[name] = use;
+        this.addModule({
+            name: name,
+            use: use
+        });
+    },
+    /**
+     * Add a new module group
+     * @method addGroup
+     * @param {Object} config An object containing the group configuration data
+     * @param {String} config.name required, the group name
+     * @param {String} config.base The base directory for this module group
+     * @param {String} config.root The root path to add to each combo resource path
+     * @param {Boolean} config.combine Should the request be combined
+     * @param {String} config.comboBase Combo service base path
+     * @param {Object} config.modules The group of modules
+     * @param {String} name the group name.
+     * @example
+     *      var loader = new Y.Loader({});
+     *      loader.addGroup({
+     *          name: 'davglass',
+     *          combine: true,
+     *          comboBase: '/combo?',
+     *          root: '',
+     *          modules: {
+     *              //Module List here
+     *          }
+     *      }, 'davglass');
+     */
+    addGroup: function(o, name) {
+        var mods = o.modules,
+            self = this, i, v;
+
+        name = name || o.name;
+        o.name = name;
+        self.groups[name] = o;
+
+        if (o.patterns) {
+            for (i in o.patterns) {
+                if (o.patterns.hasOwnProperty(i)) {
+                    o.patterns[i].group = name;
+                    self.patterns[i] = o.patterns[i];
+                }
+            }
+        }
+
+        if (mods) {
+            for (i in mods) {
+                if (mods.hasOwnProperty(i)) {
+                    v = mods[i];
+                    if (typeof v === 'string') {
+                        v = { name: i, fullpath: v };
+                    }
+                    v.group = name;
+                    self.addModule(v, i);
+                }
+            }
+        }
+    },
+
+    /**
+     * Add a new module to the component metadata.
+     * @method addModule
+     * @param {Object} config An object containing the module data.
+     * @param {String} config.name Required, the component name
+     * @param {String} config.type Required, the component type (js or css)
+     * @param {String} config.path Required, the path to the script from `base`
+     * @param {Array} config.requires Array of modules required by this component
+     * @param {Array} [config.optional] Array of optional modules for this component
+     * @param {Array} [config.supersedes] Array of the modules this component replaces
+     * @param {Array} [config.after] Array of modules the components which, if present, should be sorted above this one
+     * @param {Object} [config.after_map] Faster alternative to 'after' -- supply a hash instead of an array
+     * @param {Number} [config.rollup] The number of superseded modules required for automatic rollup
+     * @param {String} [config.fullpath] If `fullpath` is specified, this is used instead of the configured `base + path`
+     * @param {Boolean} [config.skinnable] Flag to determine if skin assets should automatically be pulled in
+     * @param {Object} [config.submodules] Hash of submodules
+     * @param {String} [config.group] The group the module belongs to -- this is set automatically when it is added as part of a group configuration.
+     * @param {Array} [config.lang] Array of BCP 47 language tags of languages for which this module has localized resource bundles, e.g., `["en-GB", "zh-Hans-CN"]`
+     * @param {Object} [config.condition] Specifies that the module should be loaded automatically if a condition is met. This is an object with up to four fields:
+     * @param {String} [config.condition.trigger] The name of a module that can trigger the auto-load
+     * @param {Function} [config.condition.test] A function that returns true when the module is to be loaded.
+     * @param {String} [config.condition.ua] The UA name of <a href="UA.html">Y.UA</a> object that returns true when the module is to be loaded. e.g., `"ie"`, `"nodejs"`.
+     * @param {String} [config.condition.when] Specifies the load order of the conditional module
+     *  with regard to the position of the trigger module.
+     *  This should be one of three values: `before`, `after`, or `instead`.  The default is `after`.
+     * @param {Object} [config.testresults] A hash of test results from `Y.Features.all()`
+     * @param {Function} [config.configFn] A function to exectute when configuring this module
+     * @param {Object} config.configFn.mod The module config, modifying this object will modify it's config. Returning false will delete the module's config.
+     * @param {String} [name] The module name, required if not in the module data.
+     * @return {Object} the module definition or null if the object passed in did not provide all required attributes.
+     */
+    addModule: function(o, name) {
+        name = name || o.name;
+
+        if (typeof o === 'string') {
+            o = { name: name, fullpath: o };
+        }
+
+
+        var subs, i, l, t, sup, s, smod, plugins, plug,
+            j, langs, packName, supName, flatSup, flatLang, lang, ret,
+            overrides, skinname, when, g, p,
+            conditions = this.conditions, trigger;
+
+        //Only merge this data if the temp flag is set
+        //from an earlier pass from a pattern or else
+        //an override module (YUI_config) can not be used to
+        //replace a default module.
+        if (this.moduleInfo[name] && this.moduleInfo[name].temp) {
+            //This catches temp modules loaded via a pattern
+            // The module will be added twice, once from the pattern and
+            // Once from the actual add call, this ensures that properties
+            // that were added to the module the first time around (group: gallery)
+            // are also added the second time around too.
+            o = Y.merge(this.moduleInfo[name], o);
+        }
+
+        o.name = name;
+
+        if (!o || !o.name) {
+            return null;
+        }
+
+        if (!o.type) {
+            //Always assume it's javascript unless the CSS pattern is matched.
+            o.type = JS;
+            p = o.path || o.fullpath;
+            if (p && this.REGEX_CSS.test(p)) {
+                o.type = CSS;
+            }
+        }
+
+        if (!o.path && !o.fullpath) {
+            o.path = _path(name, name, o.type);
+        }
+        o.supersedes = o.supersedes || o.use;
+
+        o.ext = ('ext' in o) ? o.ext : (this._internal) ? false : true;
+
+        // Handle submodule logic
+        subs = o.submodules;
+
+        this.moduleInfo[name] = o;
+
+        o.requires = o.requires || [];
+
+        /*
+        Only allowing the cascade of requires information, since
+        optional and supersedes are far more fine grained than
+        a blanket requires is.
+        */
+        if (this.requires) {
+            for (i = 0; i < this.requires.length; i++) {
+                o.requires.push(this.requires[i]);
+            }
+        }
+        if (o.group && this.groups && this.groups[o.group]) {
+            g = this.groups[o.group];
+            if (g.requires) {
+                for (i = 0; i < g.requires.length; i++) {
+                    o.requires.push(g.requires[i]);
+                }
+            }
+        }
+
+
+        if (!o.defaults) {
+            o.defaults = {
+                requires: o.requires ? [].concat(o.requires) : null,
+                supersedes: o.supersedes ? [].concat(o.supersedes) : null,
+                optional: o.optional ? [].concat(o.optional) : null
+            };
+        }
+
+        if (o.skinnable && o.ext && o.temp) {
+            skinname = this._addSkin(this.skin.defaultSkin, name);
+            o.requires.unshift(skinname);
+        }
+
+        if (o.requires.length) {
+            o.requires = this.filterRequires(o.requires) || [];
+        }
+
+        if (!o.langPack && o.lang) {
+            langs = yArray(o.lang);
+            for (j = 0; j < langs.length; j++) {
+                lang = langs[j];
+                packName = this.getLangPackName(lang, name);
+                smod = this.moduleInfo[packName];
+                if (!smod) {
+                    smod = this._addLangPack(lang, o, packName);
+                }
+            }
+        }
+
+
+        if (subs) {
+            sup = o.supersedes || [];
+            l = 0;
+
+            for (i in subs) {
+                if (subs.hasOwnProperty(i)) {
+                    s = subs[i];
+
+                    s.path = s.path || _path(name, i, o.type);
+                    s.pkg = name;
+                    s.group = o.group;
+
+                    if (s.supersedes) {
+                        sup = sup.concat(s.supersedes);
+                    }
+
+                    smod = this.addModule(s, i);
+                    sup.push(i);
+
+                    if (smod.skinnable) {
+                        o.skinnable = true;
+                        overrides = this.skin.overrides;
+                        if (overrides && overrides[i]) {
+                            for (j = 0; j < overrides[i].length; j++) {
+                                skinname = this._addSkin(overrides[i][j],
+                                         i, name);
+                                sup.push(skinname);
+                            }
+                        }
+                        skinname = this._addSkin(this.skin.defaultSkin,
+                                        i, name);
+                        sup.push(skinname);
+                    }
+
+                    // looks like we are expected to work out the metadata
+                    // for the parent module language packs from what is
+                    // specified in the child modules.
+                    if (s.lang && s.lang.length) {
+
+                        langs = yArray(s.lang);
+                        for (j = 0; j < langs.length; j++) {
+                            lang = langs[j];
+                            packName = this.getLangPackName(lang, name);
+                            supName = this.getLangPackName(lang, i);
+                            smod = this.moduleInfo[packName];
+
+                            if (!smod) {
+                                smod = this._addLangPack(lang, o, packName);
+                            }
+
+                            flatSup = flatSup || yArray.hash(smod.supersedes);
+
+                            if (!(supName in flatSup)) {
+                                smod.supersedes.push(supName);
+                            }
+
+                            o.lang = o.lang || [];
+
+                            flatLang = flatLang || yArray.hash(o.lang);
+
+                            if (!(lang in flatLang)) {
+                                o.lang.push(lang);
+                            }
+
+// Add rollup file, need to add to supersedes list too
+
+                            // default packages
+                            packName = this.getLangPackName(ROOT_LANG, name);
+                            supName = this.getLangPackName(ROOT_LANG, i);
+
+                            smod = this.moduleInfo[packName];
+
+                            if (!smod) {
+                                smod = this._addLangPack(lang, o, packName);
+                            }
+
+                            if (!(supName in flatSup)) {
+                                smod.supersedes.push(supName);
+                            }
+
+// Add rollup file, need to add to supersedes list too
+
+                        }
+                    }
+
+                    l++;
+                }
+            }
+            //o.supersedes = YObject.keys(yArray.hash(sup));
+            o.supersedes = yArray.dedupe(sup);
+            if (this.allowRollup) {
+                o.rollup = (l < 4) ? l : Math.min(l - 1, 4);
+            }
+        }
+
+        plugins = o.plugins;
+        if (plugins) {
+            for (i in plugins) {
+                if (plugins.hasOwnProperty(i)) {
+                    plug = plugins[i];
+                    plug.pkg = name;
+                    plug.path = plug.path || _path(name, i, o.type);
+                    plug.requires = plug.requires || [];
+                    plug.group = o.group;
+                    this.addModule(plug, i);
+                    if (o.skinnable) {
+                        this._addSkin(this.skin.defaultSkin, i, name);
+                    }
+
+                }
+            }
+        }
+
+        if (o.condition) {
+            t = o.condition.trigger;
+            if (YUI.Env.aliases[t]) {
+                t = YUI.Env.aliases[t];
+            }
+            if (!Y.Lang.isArray(t)) {
+                t = [t];
+            }
+
+            for (i = 0; i < t.length; i++) {
+                trigger = t[i];
+                when = o.condition.when;
+                conditions[trigger] = conditions[trigger] || {};
+                conditions[trigger][name] = o.condition;
+                // the 'when' attribute can be 'before', 'after', or 'instead'
+                // the default is after.
+                if (when && when !== 'after') {
+                    if (when === 'instead') { // replace the trigger
+                        o.supersedes = o.supersedes || [];
+                        o.supersedes.push(trigger);
+                    }
+                    // before the trigger
+                        // the trigger requires the conditional mod,
+                        // so it should appear before the conditional
+                        // mod if we do not intersede.
+                } else { // after the trigger
+                    o.after = o.after || [];
+                    o.after.push(trigger);
+                }
+            }
+        }
+
+        if (o.supersedes) {
+            o.supersedes = this.filterRequires(o.supersedes);
+        }
+
+        if (o.after) {
+            o.after = this.filterRequires(o.after);
+            o.after_map = yArray.hash(o.after);
+        }
+
+        // this.dirty = true;
+
+        if (o.configFn) {
+            ret = o.configFn(o);
+            if (ret === false) {
+                delete this.moduleInfo[name];
+                delete GLOBAL_ENV._renderedMods[name];
+                o = null;
+            }
+        }
+        //Add to global cache
+        if (o) {
+            if (!GLOBAL_ENV._renderedMods) {
+                GLOBAL_ENV._renderedMods = {};
+            }
+            GLOBAL_ENV._renderedMods[name] = Y.mix(GLOBAL_ENV._renderedMods[name] || {}, o);
+            GLOBAL_ENV._conditions = conditions;
+        }
+
+        return o;
+    },
+
+    /**
+     * Add a requirement for one or more module
+     * @method require
+     * @param {string[] | string*} what the modules to load.
+     */
+    require: function(what) {
+        var a = (typeof what === 'string') ? yArray(arguments) : what;
+        this.dirty = true;
+        this.required = Y.merge(this.required, yArray.hash(this.filterRequires(a)));
+
+        this._explodeRollups();
+    },
+    /**
+    * Grab all the items that were asked for, check to see if the Loader
+    * meta-data contains a "use" array. If it doesm remove the asked item and replace it with
+    * the content of the "use".
+    * This will make asking for: "dd"
+    * Actually ask for: "dd-ddm-base,dd-ddm,dd-ddm-drop,dd-drag,dd-proxy,dd-constrain,dd-drop,dd-scroll,dd-drop-plugin"
+    * @private
+    * @method _explodeRollups
+    */
+    _explodeRollups: function() {
+        var self = this, m, m2, i, a, v, len, len2,
+        r = self.required;
+
+        if (!self.allowRollup) {
+            for (i in r) {
+                if (r.hasOwnProperty(i)) {
+                    m = self.getModule(i);
+                    if (m && m.use) {
+                        len = m.use.length;
+                        for (a = 0; a < len; a++) {
+                            m2 = self.getModule(m.use[a]);
+                            if (m2 && m2.use) {
+                                len2 = m2.use.length;
+                                for (v = 0; v < len2; v++) {
+                                    r[m2.use[v]] = true;
+                                }
+                            } else {
+                                r[m.use[a]] = true;
+                            }
+                        }
+                    }
+                }
+            }
+            self.required = r;
+        }
+
+    },
+    /**
+    * Explodes the required array to remove aliases and replace them with real modules
+    * @method filterRequires
+    * @param {Array} r The original requires array
+    * @return {Array} The new array of exploded requirements
+    */
+    filterRequires: function(r) {
+        if (r) {
+            if (!Y.Lang.isArray(r)) {
+                r = [r];
+            }
+            r = Y.Array(r);
+            var c = [], i, mod, o, m;
+
+            for (i = 0; i < r.length; i++) {
+                mod = this.getModule(r[i]);
+                if (mod && mod.use) {
+                    for (o = 0; o < mod.use.length; o++) {
+                        //Must walk the other modules in case a module is a rollup of rollups (datatype)
+                        m = this.getModule(mod.use[o]);
+                        if (m && m.use && (m.name !== mod.name)) {
+                            c = Y.Array.dedupe([].concat(c, this.filterRequires(m.use)));
+                        } else {
+                            c.push(mod.use[o]);
+                        }
+                    }
+                } else {
+                    c.push(r[i]);
+                }
+            }
+            r = c;
+        }
+        return r;
+    },
+    /**
+     * Returns an object containing properties for all modules required
+     * in order to load the requested module
+     * @method getRequires
+     * @param {object}  mod The module definition from moduleInfo.
+     * @return {array} the expanded requirement list.
+     */
+    getRequires: function(mod) {
+
+        if (!mod) {
+            //console.log('returning no reqs for ' + mod.name);
+            return NO_REQUIREMENTS;
+        }
+
+        if (mod._parsed) {
+            //console.log('returning requires for ' + mod.name, mod.requires);
+            return mod.expanded || NO_REQUIREMENTS;
+        }
+
+        //TODO add modue cache here out of scope..
+
+        var i, m, j, add, packName, lang, testresults = this.testresults,
+            name = mod.name, cond,
+            adddef = ON_PAGE[name] && ON_PAGE[name].details,
+            d, go, def,
+            r, old_mod,
+            o, skinmod, skindef, skinpar, skinname,
+            intl = mod.lang || mod.intl,
+            info = this.moduleInfo,
+            ftests = Y.Features && Y.Features.tests.load,
+            hash, reparse;
+
+        // console.log(name);
+
+        // pattern match leaves module stub that needs to be filled out
+        if (mod.temp && adddef) {
+            old_mod = mod;
+            mod = this.addModule(adddef, name);
+            mod.group = old_mod.group;
+            mod.pkg = old_mod.pkg;
+            delete mod.expanded;
+        }
+
+        // console.log('cache: ' + mod.langCache + ' == ' + this.lang);
+
+        //If a skin or a lang is different, reparse..
+        reparse = !((!this.lang || mod.langCache === this.lang) && (mod.skinCache === this.skin.defaultSkin));
+
+        if (mod.expanded && !reparse) {
+            return mod.expanded;
+        }
+
+
+        d = [];
+        hash = {};
+        r = this.filterRequires(mod.requires);
+        if (mod.lang) {
+            //If a module has a lang attribute, auto add the intl requirement.
+            d.unshift('intl');
+            r.unshift('intl');
+            intl = true;
+        }
+        o = this.filterRequires(mod.optional);
+
+
+        mod._parsed = true;
+        mod.langCache = this.lang;
+        mod.skinCache = this.skin.defaultSkin;
+
+        for (i = 0; i < r.length; i++) {
+            if (!hash[r[i]]) {
+                d.push(r[i]);
+                hash[r[i]] = true;
+                m = this.getModule(r[i]);
+                if (m) {
+                    add = this.getRequires(m);
+                    intl = intl || (m.expanded_map &&
+                        (INTL in m.expanded_map));
+                    for (j = 0; j < add.length; j++) {
+                        d.push(add[j]);
+                    }
+                }
+            }
+        }
+
+        // get the requirements from superseded modules, if any
+        r = this.filterRequires(mod.supersedes);
+        if (r) {
+            for (i = 0; i < r.length; i++) {
+                if (!hash[r[i]]) {
+                    // if this module has submodules, the requirements list is
+                    // expanded to include the submodules.  This is so we can
+                    // prevent dups when a submodule is already loaded and the
+                    // parent is requested.
+                    if (mod.submodules) {
+                        d.push(r[i]);
+                    }
+
+                    hash[r[i]] = true;
+                    m = this.getModule(r[i]);
+
+                    if (m) {
+                        add = this.getRequires(m);
+                        intl = intl || (m.expanded_map &&
+                            (INTL in m.expanded_map));
+                        for (j = 0; j < add.length; j++) {
+                            d.push(add[j]);
+                        }
+                    }
+                }
+            }
+        }
+
+        if (o && this.loadOptional) {
+            for (i = 0; i < o.length; i++) {
+                if (!hash[o[i]]) {
+                    d.push(o[i]);
+                    hash[o[i]] = true;
+                    m = info[o[i]];
+                    if (m) {
+                        add = this.getRequires(m);
+                        intl = intl || (m.expanded_map &&
+                            (INTL in m.expanded_map));
+                        for (j = 0; j < add.length; j++) {
+                            d.push(add[j]);
+                        }
+                    }
+                }
+            }
+        }
+
+        cond = this.conditions[name];
+
+        if (cond) {
+            //Set the module to not parsed since we have conditionals and this could change the dependency tree.
+            mod._parsed = false;
+            if (testresults && ftests) {
+                oeach(testresults, function(result, id) {
+                    var condmod = ftests[id].name;
+                    if (!hash[condmod] && ftests[id].trigger === name) {
+                        if (result && ftests[id]) {
+                            hash[condmod] = true;
+                            d.push(condmod);
+                        }
+                    }
+                });
+            } else {
+                for (i in cond) {
+                    if (cond.hasOwnProperty(i)) {
+                        if (!hash[i]) {
+                            def = cond[i];
+                            //first see if they've specfied a ua check
+                            //then see if they've got a test fn & if it returns true
+                            //otherwise just having a condition block is enough
+                            go = def && ((!def.ua && !def.test) || (def.ua && Y.UA[def.ua]) ||
+                                        (def.test && def.test(Y, r)));
+
+                            if (go) {
+                                hash[i] = true;
+                                d.push(i);
+                                m = this.getModule(i);
+                                if (m) {
+                                    add = this.getRequires(m);
+                                    for (j = 0; j < add.length; j++) {
+                                        d.push(add[j]);
+                                    }
+
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        // Create skin modules
+        if (mod.skinnable) {
+            skindef = this.skin.overrides;
+            for (i in YUI.Env.aliases) {
+                if (YUI.Env.aliases.hasOwnProperty(i)) {
+                    if (Y.Array.indexOf(YUI.Env.aliases[i], name) > -1) {
+                        skinpar = i;
+                    }
+                }
+            }
+            if (skindef && (skindef[name] || (skinpar && skindef[skinpar]))) {
+                skinname = name;
+                if (skindef[skinpar]) {
+                    skinname = skinpar;
+                }
+                for (i = 0; i < skindef[skinname].length; i++) {
+                    skinmod = this._addSkin(skindef[skinname][i], name);
+                    if (!this.isCSSLoaded(skinmod, this._boot)) {
+                        d.push(skinmod);
+                    }
+                }
+            } else {
+                skinmod = this._addSkin(this.skin.defaultSkin, name);
+                if (!this.isCSSLoaded(skinmod, this._boot)) {
+                    d.push(skinmod);
+                }
+            }
+        }
+
+        mod._parsed = false;
+
+        if (intl) {
+
+            if (mod.lang && !mod.langPack && Y.Intl) {
+                lang = Y.Intl.lookupBestLang(this.lang || ROOT_LANG, mod.lang);
+                packName = this.getLangPackName(lang, name);
+                if (packName) {
+                    d.unshift(packName);
+                }
+            }
+            d.unshift(INTL);
+        }
+
+        mod.expanded_map = yArray.hash(d);
+
+        mod.expanded = YObject.keys(mod.expanded_map);
+
+        return mod.expanded;
+    },
+    /**
+    * Check to see if named css module is already loaded on the page
+    * @method isCSSLoaded
+    * @param {String} name The name of the css file
+    * @return Boolean
+    */
+    isCSSLoaded: function(name, skip) {
+        //TODO - Make this call a batching call with name being an array
+        if (!name || !YUI.Env.cssStampEl || (!skip && this.ignoreRegistered)) {
+            return false;
+        }
+        var el = YUI.Env.cssStampEl,
+            ret = false,
+            mod = YUI.Env._cssLoaded[name],
+            style = el.currentStyle; //IE
+
+
+        if (mod !== undefined) {
+            return mod;
+        }
+
+        //Add the classname to the element
+        el.className = name;
+
+        if (!style) {
+            style = Y.config.doc.defaultView.getComputedStyle(el, null);
+        }
+
+        if (style && style.display === 'none') {
+            ret = true;
+        }
+
+
+        el.className = ''; //Reset the classname to ''
+
+        YUI.Env._cssLoaded[name] = ret;
+
+        return ret;
+    },
+
+    /**
+     * Returns a hash of module names the supplied module satisfies.
+     * @method getProvides
+     * @param {string} name The name of the module.
+     * @return {object} what this module provides.
+     */
+    getProvides: function(name) {
+        var m = this.getModule(name), o, s;
+            // supmap = this.provides;
+
+        if (!m) {
+            return NOT_FOUND;
+        }
+
+        if (m && !m.provides) {
+            o = {};
+            s = m.supersedes;
+
+            if (s) {
+                yArray.each(s, function(v) {
+                    Y.mix(o, this.getProvides(v));
+                }, this);
+            }
+
+            o[name] = true;
+            m.provides = o;
+
+        }
+
+        return m.provides;
+    },
+
+    /**
+     * Calculates the dependency tree, the result is stored in the sorted
+     * property.
+     * @method calculate
+     * @param {object} o optional options object.
+     * @param {string} type optional argument to prune modules.
+     */
+    calculate: function(o, type) {
+        if (o || type || this.dirty) {
+
+            if (o) {
+                this._config(o);
+            }
+
+            if (!this._init) {
+                this._setup();
+            }
+
+            this._explode();
+
+            if (this.allowRollup) {
+                this._rollup();
+            } else {
+                this._explodeRollups();
+            }
+            this._reduce();
+            this._sort();
+        }
+    },
+    /**
+    * Creates a "psuedo" package for languages provided in the lang array
+    * @method _addLangPack
+    * @private
+    * @param {String} lang The language to create
+    * @param {Object} m The module definition to create the language pack around
+    * @param {String} packName The name of the package (e.g: lang/datatype-date-en-US)
+    * @return {Object} The module definition
+    */
+    _addLangPack: function(lang, m, packName) {
+        var name = m.name,
+            packPath, conf,
+            existing = this.moduleInfo[packName];
+
+        if (!existing) {
+
+            packPath = _path((m.pkg || name), packName, JS, true);
+
+            conf = {
+                path: packPath,
+                intl: true,
+                langPack: true,
+                ext: m.ext,
+                group: m.group,
+                supersedes: []
+            };
+            if (m.root) {
+                conf.root = m.root;
+            }
+            if (m.base) {
+                conf.base = m.base;
+            }
+
+            if (m.configFn) {
+                conf.configFn = m.configFn;
+            }
+
+            this.addModule(conf, packName);
+
+            if (lang) {
+                Y.Env.lang = Y.Env.lang || {};
+                Y.Env.lang[lang] = Y.Env.lang[lang] || {};
+                Y.Env.lang[lang][name] = true;
+            }
+        }
+
+        return this.moduleInfo[packName];
+    },
+
+    /**
+     * Investigates the current YUI configuration on the page.  By default,
+     * modules already detected will not be loaded again unless a force
+     * option is encountered.  Called by calculate()
+     * @method _setup
+     * @private
+     */
+    _setup: function() {
+        var info = this.moduleInfo, name, i, j, m, l,
+            packName;
+
+        for (name in info) {
+            if (info.hasOwnProperty(name)) {
+                m = info[name];
+                if (m) {
+
+                    // remove dups
+                    //m.requires = YObject.keys(yArray.hash(m.requires));
+                    m.requires = yArray.dedupe(m.requires);
+
+                    // Create lang pack modules
+                    //if (m.lang && m.lang.length) {
+                    if (m.lang) {
+                        // Setup root package if the module has lang defined,
+                        // it needs to provide a root language pack
+                        packName = this.getLangPackName(ROOT_LANG, name);
+                        this._addLangPack(null, m, packName);
+                    }
+
+                }
+            }
+        }
+
+
+        //l = Y.merge(this.inserted);
+        l = {};
+
+        // available modules
+        if (!this.ignoreRegistered) {
+            Y.mix(l, GLOBAL_ENV.mods);
+        }
+
+        // add the ignore list to the list of loaded packages
+        if (this.ignore) {
+            Y.mix(l, yArray.hash(this.ignore));
+        }
+
+        // expand the list to include superseded modules
+        for (j in l) {
+            if (l.hasOwnProperty(j)) {
+                Y.mix(l, this.getProvides(j));
+            }
+        }
+
+        // remove modules on the force list from the loaded list
+        if (this.force) {
+            for (i = 0; i < this.force.length; i++) {
+                if (this.force[i] in l) {
+                    delete l[this.force[i]];
+                }
+            }
+        }
+
+        Y.mix(this.loaded, l);
+
+        this._init = true;
+    },
+
+    /**
+     * Builds a module name for a language pack
+     * @method getLangPackName
+     * @param {string} lang the language code.
+     * @param {string} mname the module to build it for.
+     * @return {string} the language pack module name.
+     */
+    getLangPackName: function(lang, mname) {
+        return ('lang/' + mname + ((lang) ? '_' + lang : ''));
+    },
+    /**
+     * Inspects the required modules list looking for additional
+     * dependencies.  Expands the required list to include all
+     * required modules.  Called by calculate()
+     * @method _explode
+     * @private
+     */
+    _explode: function() {
+        //TODO Move done out of scope
+        var r = this.required, m, reqs, done = {},
+            self = this, name, expound;
+
+        // the setup phase is over, all modules have been created
+        self.dirty = false;
+
+        self._explodeRollups();
+        r = self.required;
+
+        for (name in r) {
+            if (r.hasOwnProperty(name)) {
+                if (!done[name]) {
+                    done[name] = true;
+                    m = self.getModule(name);
+                    if (m) {
+                        expound = m.expound;
+
+                        if (expound) {
+                            r[expound] = self.getModule(expound);
+                            reqs = self.getRequires(r[expound]);
+                            Y.mix(r, yArray.hash(reqs));
+                        }
+
+                        reqs = self.getRequires(m);
+                        Y.mix(r, yArray.hash(reqs));
+                    }
+                }
+            }
+        }
+
+    },
+    /**
+    * The default method used to test a module against a pattern
+    * @method _patternTest
+    * @private
+    * @param {String} mname The module being tested
+    * @param {String} pname The pattern to match
+    */
+    _patternTest: function(mname, pname) {
+        return (mname.indexOf(pname) > -1);
+    },
+    /**
+    * Get's the loader meta data for the requested module
+    * @method getModule
+    * @param {String} mname The module name to get
+    * @return {Object} The module metadata
+    */
+    getModule: function(mname) {
+        //TODO: Remove name check - it's a quick hack to fix pattern WIP
+        if (!mname) {
+            return null;
+        }
+
+        var p, found, pname,
+            m = this.moduleInfo[mname],
+            patterns = this.patterns;
+
+        // check the patterns library to see if we should automatically add
+        // the module with defaults
+        if (!m || (m && m.ext)) {
+            for (pname in patterns) {
+                if (patterns.hasOwnProperty(pname)) {
+                    p = patterns[pname];
+
+                    //There is no test method, create a default one that tests
+                    // the pattern against the mod name
+                    if (!p.test) {
+                        p.test = this._patternTest;
+                    }
+
+                    if (p.test(mname, pname)) {
+                        // use the metadata supplied for the pattern
+                        // as the module definition.
+                        found = p;
+                        break;
+                    }
+                }
+            }
+        }
+
+        if (!m) {
+            if (found) {
+                if (p.action) {
+                    p.action.call(this, mname, pname);
+                } else {
+                    // ext true or false?
+                    m = this.addModule(Y.merge(found), mname);
+                    if (found.configFn) {
+                        m.configFn = found.configFn;
+                    }
+                    m.temp = true;
+                }
+            }
+        } else {
+            if (found && m && found.configFn && !m.configFn) {
+                m.configFn = found.configFn;
+                m.configFn(m);
+            }
+        }
+
+        return m;
+    },
+
+    // impl in rollup submodule
+    _rollup: function() { },
+
+    /**
+     * Remove superceded modules and loaded modules.  Called by
+     * calculate() after we have the mega list of all dependencies
+     * @method _reduce
+     * @return {object} the reduced dependency hash.
+     * @private
+     */
+    _reduce: function(r) {
+
+        r = r || this.required;
+
+        var i, j, s, m, type = this.loadType,
+        ignore = this.ignore ? yArray.hash(this.ignore) : false;
+
+        for (i in r) {
+            if (r.hasOwnProperty(i)) {
+                m = this.getModule(i);
+                // remove if already loaded
+                if (((this.loaded[i] || ON_PAGE[i]) &&
+                        !this.forceMap[i] && !this.ignoreRegistered) ||
+                        (type && m && m.type !== type)) {
+                    delete r[i];
+                }
+                if (ignore && ignore[i]) {
+                    delete r[i];
+                }
+                // remove anything this module supersedes
+                s = m && m.supersedes;
+                if (s) {
+                    for (j = 0; j < s.length; j++) {
+                        if (s[j] in r) {
+                            delete r[s[j]];
+                        }
+                    }
+                }
+            }
+        }
+
+        return r;
+    },
+    /**
+    * Handles the queue when a module has been loaded for all cases
+    * @method _finish
+    * @private
+    * @param {String} msg The message from Loader
+    * @param {Boolean} success A boolean denoting success or failure
+    */
+    _finish: function(msg, success) {
+
+        _queue.running = false;
+
+        var onEnd = this.onEnd;
+        if (onEnd) {
+            onEnd.call(this.context, {
+                msg: msg,
+                data: this.data,
+                success: success
+            });
+        }
+        this._continue();
+    },
+    /**
+    * The default Loader onSuccess handler, calls this.onSuccess with a payload
+    * @method _onSuccess
+    * @private
+    */
+    _onSuccess: function() {
+        var self = this, skipped = Y.merge(self.skipped), fn,
+            failed = [], rreg = self.requireRegistration,
+            success, msg, i, mod;
+
+        for (i in skipped) {
+            if (skipped.hasOwnProperty(i)) {
+                delete self.inserted[i];
+            }
+        }
+
+        self.skipped = {};
+
+        for (i in self.inserted) {
+            if (self.inserted.hasOwnProperty(i)) {
+                mod = self.getModule(i);
+                if (mod && rreg && mod.type === JS && !(i in YUI.Env.mods)) {
+                    failed.push(i);
+                } else {
+                    Y.mix(self.loaded, self.getProvides(i));
+                }
+            }
+        }
+
+        fn = self.onSuccess;
+        msg = (failed.length) ? 'notregistered' : 'success';
+        success = !(failed.length);
+        if (fn) {
+            fn.call(self.context, {
+                msg: msg,
+                data: self.data,
+                success: success,
+                failed: failed,
+                skipped: skipped
+            });
+        }
+        self._finish(msg, success);
+    },
+    /**
+    * The default Loader onProgress handler, calls this.onProgress with a payload
+    * @method _onProgress
+    * @private
+    */
+    _onProgress: function(e) {
+        var self = this, i;
+        //set the internal cache to what just came in.
+        if (e.data && e.data.length) {
+            for (i = 0; i < e.data.length; i++) {
+                e.data[i] = self.getModule(e.data[i].name);
+            }
+        }
+        if (self.onProgress) {
+            self.onProgress.call(self.context, {
+                name: e.url,
+                data: e.data
+            });
+        }
+    },
+    /**
+    * The default Loader onFailure handler, calls this.onFailure with a payload
+    * @method _onFailure
+    * @private
+    */
+    _onFailure: function(o) {
+        var f = this.onFailure, msg = [], i = 0, len = o.errors.length;
+
+        for (i; i < len; i++) {
+            msg.push(o.errors[i].error);
+        }
+
+        msg = msg.join(',');
+
+
+        if (f) {
+            f.call(this.context, {
+                msg: msg,
+                data: this.data,
+                success: false
+            });
+        }
+
+        this._finish(msg, false);
+
+    },
+
+    /**
+    * The default Loader onTimeout handler, calls this.onTimeout with a payload
+    * @method _onTimeout
+    * @param {Get.Transaction} transaction The Transaction object from `Y.Get`
+    * @private
+    */
+    _onTimeout: function(transaction) {
+        var f = this.onTimeout;
+        if (f) {
+            f.call(this.context, {
+                msg: 'timeout',
+                data: this.data,
+                success: false,
+                transaction: transaction
+            });
+        }
+    },
+
+    /**
+     * Sorts the dependency tree.  The last step of calculate()
+     * @method _sort
+     * @private
+     */
+    _sort: function() {
+
+        // create an indexed list
+        var s = YObject.keys(this.required),
+            // loaded = this.loaded,
+            //TODO Move this out of scope
+            done = {},
+            p = 0, l, a, b, j, k, moved, doneKey;
+
+        // keep going until we make a pass without moving anything
+        for (;;) {
+
+            l = s.length;
+            moved = false;
+
+            // start the loop after items that are already sorted
+            for (j = p; j < l; j++) {
+
+                // check the next module on the list to see if its
+                // dependencies have been met
+                a = s[j];
+
+                // check everything below current item and move if we
+                // find a requirement for the current item
+                for (k = j + 1; k < l; k++) {
+                    doneKey = a + s[k];
+
+                    if (!done[doneKey] && this._requires(a, s[k])) {
+
+                        // extract the dependency so we can move it up
+                        b = s.splice(k, 1);
+
+                        // insert the dependency above the item that
+                        // requires it
+                        s.splice(j, 0, b[0]);
+
+                        // only swap two dependencies once to short circut
+                        // circular dependencies
+                        done[doneKey] = true;
+
+                        // keep working
+                        moved = true;
+
+                        break;
+                    }
+                }
+
+                // jump out of loop if we moved something
+                if (moved) {
+                    break;
+                // this item is sorted, move our pointer and keep going
+                } else {
+                    p++;
+                }
+            }
+
+            // when we make it here and moved is false, we are
+            // finished sorting
+            if (!moved) {
+                break;
+            }
+
+        }
+
+        this.sorted = s;
+    },
+
+    /**
+    * Handles the actual insertion of script/link tags
+    * @method _insert
+    * @private
+    * @param {Object} source The YUI instance the request came from
+    * @param {Object} o The metadata to include
+    * @param {String} type JS or CSS
+    * @param {Boolean} [skipcalc=false] Do a Loader.calculate on the meta
+    */
+    _insert: function(source, o, type, skipcalc) {
+
+
+        // restore the state at the time of the request
+        if (source) {
+            this._config(source);
+        }
+
+        // build the dependency list
+        // don't include type so we can process CSS and script in
+        // one pass when the type is not specified.
+
+        var modules = this.resolve(!skipcalc),
+            self = this, comp = 0, actions = 0,
+            mods = {}, deps, complete;
+
+        self._refetch = [];
+
+        if (type) {
+            //Filter out the opposite type and reset the array so the checks later work
+            modules[((type === JS) ? CSS : JS)] = [];
+        }
+        if (!self.fetchCSS) {
+            modules.css = [];
+        }
+        if (modules.js.length) {
+            comp++;
+        }
+        if (modules.css.length) {
+            comp++;
+        }
+
+        //console.log('Resolved Modules: ', modules);
+
+        complete = function(d) {
+            actions++;
+            var errs = {}, i = 0, o = 0, u = '', fn,
+                modName, resMods;
+
+            if (d && d.errors) {
+                for (i = 0; i < d.errors.length; i++) {
+                    if (d.errors[i].request) {
+                        u = d.errors[i].request.url;
+                    } else {
+                        u = d.errors[i];
+                    }
+                    errs[u] = u;
+                }
+            }
+
+            if (d && d.data && d.data.length && (d.type === 'success')) {
+                for (i = 0; i < d.data.length; i++) {
+                    self.inserted[d.data[i].name] = true;
+                    //If the external module has a skin or a lang, reprocess it
+                    if (d.data[i].lang || d.data[i].skinnable) {
+                        delete self.inserted[d.data[i].name];
+                        self._refetch.push(d.data[i].name);
+                    }
+                }
+            }
+
+            if (actions === comp) {
+                self._loading = null;
+                if (self._refetch.length) {
+                    //Get the deps for the new meta-data and reprocess
+                    for (i = 0; i < self._refetch.length; i++) {
+                        deps = self.getRequires(self.getModule(self._refetch[i]));
+                        for (o = 0; o < deps.length; o++) {
+                            if (!self.inserted[deps[o]]) {
+                                //We wouldn't be to this point without the module being here
+                                mods[deps[o]] = deps[o];
+                            }
+                        }
+                    }
+                    mods = Y.Object.keys(mods);
+                    if (mods.length) {
+                        self.require(mods);
+                        resMods = self.resolve(true);
+                        if (resMods.cssMods.length) {
+                            for (i=0; i <  resMods.cssMods.length; i++) {
+                                modName = resMods.cssMods[i].name;
+                                delete YUI.Env._cssLoaded[modName];
+                                if (self.isCSSLoaded(modName)) {
+                                    self.inserted[modName] = true;
+                                    delete self.required[modName];
+                                }
+                            }
+                            self.sorted = [];
+                            self._sort();
+                        }
+                        d = null; //bail
+                        self._insert(); //insert the new deps
+                    }
+                }
+                if (d && d.fn) {
+                    fn = d.fn;
+                    delete d.fn;
+                    fn.call(self, d);
+                }
+            }
+        };
+
+        this._loading = true;
+
+        if (!modules.js.length && !modules.css.length) {
+            actions = -1;
+            complete({
+                fn: self._onSuccess
+            });
+            return;
+        }
+
+
+        if (modules.css.length) { //Load CSS first
+            Y.Get.css(modules.css, {
+                data: modules.cssMods,
+                attributes: self.cssAttributes,
+                insertBefore: self.insertBefore,
+                charset: self.charset,
+                timeout: self.timeout,
+                context: self,
+                onProgress: function(e) {
+                    self._onProgress.call(self, e);
+                },
+                onTimeout: function(d) {
+                    self._onTimeout.call(self, d);
+                },
+                onSuccess: function(d) {
+                    d.type = 'success';
+                    d.fn = self._onSuccess;
+                    complete.call(self, d);
+                },
+                onFailure: function(d) {
+                    d.type = 'failure';
+                    d.fn = self._onFailure;
+                    complete.call(self, d);
+                }
+            });
+        }
+
+        if (modules.js.length) {
+            Y.Get.js(modules.js, {
+                data: modules.jsMods,
+                insertBefore: self.insertBefore,
+                attributes: self.jsAttributes,
+                charset: self.charset,
+                timeout: self.timeout,
+                autopurge: false,
+                context: self,
+                async: self.async,
+                onProgress: function(e) {
+                    self._onProgress.call(self, e);
+                },
+                onTimeout: function(d) {
+                    self._onTimeout.call(self, d);
+                },
+                onSuccess: function(d) {
+                    d.type = 'success';
+                    d.fn = self._onSuccess;
+                    complete.call(self, d);
+                },
+                onFailure: function(d) {
+                    d.type = 'failure';
+                    d.fn = self._onFailure;
+                    complete.call(self, d);
+                }
+            });
+        }
+    },
+    /**
+    * Once a loader operation is completely finished, process any additional queued items.
+    * @method _continue
+    * @private
+    */
+    _continue: function() {
+        if (!(_queue.running) && _queue.size() > 0) {
+            _queue.running = true;
+            _queue.next()();
+        }
+    },
+
+    /**
+     * inserts the requested modules and their dependencies.
+     * <code>type</code> can be "js" or "css".  Both script and
+     * css are inserted if type is not provided.
+     * @method insert
+     * @param {object} o optional options object.
+     * @param {string} type the type of dependency to insert.
+     */
+    insert: function(o, type, skipsort) {
+        var self = this, copy = Y.merge(this);
+        delete copy.require;
+        delete copy.dirty;
+        _queue.add(function() {
+            self._insert(copy, o, type, skipsort);
+        });
+        this._continue();
+    },
+
+    /**
+     * Executed every time a module is loaded, and if we are in a load
+     * cycle, we attempt to load the next script.  Public so that it
+     * is possible to call this if using a method other than
+     * Y.register to determine when scripts are fully loaded
+     * @method loadNext
+     * @deprecated
+     * @param {string} mname optional the name of the module that has
+     * been loaded (which is usually why it is time to load the next
+     * one).
+     */
+    loadNext: function() {
+        return;
+    },
+
+    /**
+     * Apply filter defined for this instance to a url/path
+     * @method _filter
+     * @param {string} u the string to filter.
+     * @param {string} name the name of the module, if we are processing
+     * a single module as opposed to a combined url.
+     * @return {string} the filtered string.
+     * @private
+     */
+    _filter: function(u, name, group) {
+        var f = this.filter,
+            hasFilter = name && (name in this.filters),
+            modFilter = hasFilter && this.filters[name],
+            groupName = group || (this.moduleInfo[name] ? this.moduleInfo[name].group : null);
+
+        if (groupName && this.groups[groupName] && this.groups[groupName].filter) {
+            modFilter = this.groups[groupName].filter;
+            hasFilter = true;
+        }
+
+        if (u) {
+            if (hasFilter) {
+                f = (L.isString(modFilter)) ? this.FILTER_DEFS[modFilter.toUpperCase()] || null : modFilter;
+            }
+            if (f) {
+                u = u.replace(new RegExp(f.searchExp, 'g'), f.replaceStr);
+            }
+        }
+        return u;
+    },
+
+    /**
+     * Generates the full url for a module
+     * @method _url
+     * @param {string} path the path fragment.
+     * @param {String} name The name of the module
+     * @param {String} [base=self.base] The base url to use
+     * @return {string} the full url.
+     * @private
+     */
+    _url: function(path, name, base) {
+        return this._filter((base || this.base || '') + path, name);
+    },
+    /**
+    * Returns an Object hash of file arrays built from `loader.sorted` or from an arbitrary list of sorted modules.
+    * @method resolve
+    * @param {Boolean} [calc=false] Perform a loader.calculate() before anything else
+    * @param {Array} [s=loader.sorted] An override for the loader.sorted array
+    * @return {Object} Object hash (js and css) of two arrays of file lists
+    * @example This method can be used as an off-line dep calculator
+    *
+    *        var Y = YUI();
+    *        var loader = new Y.Loader({
+    *            filter: 'debug',
+    *            base: '../../',
+    *            root: 'build/',
+    *            combine: true,
+    *            require: ['node', 'dd', 'console']
+    *        });
+    *        var out = loader.resolve(true);
+    *
+    */
+    resolve: function(calc, s) {
+
+        var len, i, m, url, group, groupName, j, frag,
+            comboSource, comboSources, mods, comboBase,
+            base, urls, u = [], tmpBase, baseLen, resCombos = {},
+            self = this, comboSep, maxURLLength,
+            inserted = (self.ignoreRegistered) ? {} : self.inserted,
+            resolved = { js: [], jsMods: [], css: [], cssMods: [] },
+            type = self.loadType || 'js', addSingle;
+
+        if (self.skin.overrides || self.skin.defaultSkin !== DEFAULT_SKIN || self.ignoreRegistered) {
+            self._resetModules();
+        }
+
+        if (calc) {
+            self.calculate();
+        }
+        s = s || self.sorted;
+
+        addSingle = function(m) {
+
+            if (m) {
+                group = (m.group && self.groups[m.group]) || NOT_FOUND;
+
+                //Always assume it's async
+                if (group.async === false) {
+                    m.async = group.async;
+                }
+
+                url = (m.fullpath) ? self._filter(m.fullpath, s[i]) :
+                      self._url(m.path, s[i], group.base || m.base);
+
+                if (m.attributes || m.async === false) {
+                    url = {
+                        url: url,
+                        async: m.async
+                    };
+                    if (m.attributes) {
+                        url.attributes = m.attributes;
+                    }
+                }
+                resolved[m.type].push(url);
+                resolved[m.type + 'Mods'].push(m);
+            } else {
+            }
+
+        };
+
+        len = s.length;
+
+        // the default combo base
+        comboBase = self.comboBase;
+
+        url = comboBase;
+
+        comboSources = {};
+
+        for (i = 0; i < len; i++) {
+            comboSource = comboBase;
+            m = self.getModule(s[i]);
+            groupName = m && m.group;
+            group = self.groups[groupName];
+            if (groupName && group) {
+
+                if (!group.combine || m.fullpath) {
+                    //This is not a combo module, skip it and load it singly later.
+                    addSingle(m);
+                    continue;
+                }
+                m.combine = true;
+                if (group.comboBase) {
+                    comboSource = group.comboBase;
+                }
+
+                if ("root" in group && L.isValue(group.root)) {
+                    m.root = group.root;
+                }
+                m.comboSep = group.comboSep || self.comboSep;
+                m.maxURLLength = group.maxURLLength || self.maxURLLength;
+            } else {
+                if (!self.combine) {
+                    //This is not a combo module, skip it and load it singly later.
+                    addSingle(m);
+                    continue;
+                }
+            }
+
+            comboSources[comboSource] = comboSources[comboSource] || [];
+            comboSources[comboSource].push(m);
+        }
+
+        for (j in comboSources) {
+            if (comboSources.hasOwnProperty(j)) {
+                resCombos[j] = resCombos[j] || { js: [], jsMods: [], css: [], cssMods: [] };
+                url = j;
+                mods = comboSources[j];
+                len = mods.length;
+
+                if (len) {
+                    for (i = 0; i < len; i++) {
+                        if (inserted[mods[i]]) {
+                            continue;
+                        }
+                        m = mods[i];
+                        // Do not try to combine non-yui JS unless combo def
+                        // is found
+                        if (m && (m.combine || !m.ext)) {
+                            resCombos[j].comboSep = m.comboSep;
+                            resCombos[j].group = m.group;
+                            resCombos[j].maxURLLength = m.maxURLLength;
+                            frag = ((L.isValue(m.root)) ? m.root : self.root) + (m.path || m.fullpath);
+                            frag = self._filter(frag, m.name);
+                            resCombos[j][m.type].push(frag);
+                            resCombos[j][m.type + 'Mods'].push(m);
+                        } else {
+                            //Add them to the next process..
+                            if (mods[i]) {
+                                addSingle(mods[i]);
+                            }
+                        }
+
+                    }
+                }
+            }
+        }
+
+
+        for (j in resCombos) {
+            if (resCombos.hasOwnProperty(j)) {
+                base = j;
+                comboSep = resCombos[base].comboSep || self.comboSep;
+                maxURLLength = resCombos[base].maxURLLength || self.maxURLLength;
+                for (type in resCombos[base]) {
+                    if (type === JS || type === CSS) {
+                        urls = resCombos[base][type];
+                        mods = resCombos[base][type + 'Mods'];
+                        len = urls.length;
+                        tmpBase = base + urls.join(comboSep);
+                        baseLen = tmpBase.length;
+                        if (maxURLLength <= base.length) {
+                            maxURLLength = MAX_URL_LENGTH;
+                        }
+
+                        if (len) {
+                            if (baseLen > maxURLLength) {
+                                u = [];
+                                for (s = 0; s < len; s++) {
+                                    u.push(urls[s]);
+                                    tmpBase = base + u.join(comboSep);
+
+                                    if (tmpBase.length > maxURLLength) {
+                                        m = u.pop();
+                                        tmpBase = base + u.join(comboSep);
+                                        resolved[type].push(self._filter(tmpBase, null, resCombos[base].group));
+                                        u = [];
+                                        if (m) {
+                                            u.push(m);
+                                        }
+                                    }
+                                }
+                                if (u.length) {
+                                    tmpBase = base + u.join(comboSep);
+                                    resolved[type].push(self._filter(tmpBase, null, resCombos[base].group));
+                                }
+                            } else {
+                                resolved[type].push(self._filter(tmpBase, null, resCombos[base].group));
+                            }
+                        }
+                        resolved[type + 'Mods'] = resolved[type + 'Mods'].concat(mods);
+                    }
+                }
+            }
+        }
+
+        resCombos = null;
+
+        return resolved;
+    },
+    /**
+    Shortcut to calculate, resolve and load all modules.
+
+        var loader = new Y.Loader({
+            ignoreRegistered: true,
+            modules: {
+                mod: {
+                    path: 'mod.js'
+                }
+            },
+            requires: [ 'mod' ]
+        });
+        loader.load(function() {
+            console.log('All modules have loaded..');
+        });
+
+
+    @method load
+    @param {Callback} cb Executed after all load operations are complete
+    */
+    load: function(cb) {
+        if (!cb) {
+            return;
+        }
+        var self = this,
+            out = self.resolve(true);
+
+        self.data = out;
+
+        self.onEnd = function() {
+            cb.apply(self.context || self, arguments);
+        };
+
+        self.insert();
+    }
+};
+
+
+
+}, '3.12.0', {"requires": ["get", "features"]});
+YUI.add('loader-rollup', function (Y, NAME) {
+
+/**
+ * Optional automatic rollup logic for reducing http connections
+ * when not using a combo service.
+ * @module loader
+ * @submodule rollup
+ */
+
+/**
+ * Look for rollup packages to determine if all of the modules a
+ * rollup supersedes are required.  If so, include the rollup to
+ * help reduce the total number of connections required.  Called
+ * by calculate().  This is an optional feature, and requires the
+ * appropriate submodule to function.
+ * @method _rollup
+ * @for Loader
+ * @private
+ */
+Y.Loader.prototype._rollup = function() {
+    var i, j, m, s, r = this.required, roll,
+        info = this.moduleInfo, rolled, c, smod;
+
+    // find and cache rollup modules
+    if (this.dirty || !this.rollups) {
+        this.rollups = {};
+        for (i in info) {
+            if (info.hasOwnProperty(i)) {
+                m = this.getModule(i);
+                // if (m && m.rollup && m.supersedes) {
+                if (m && m.rollup) {
+                    this.rollups[i] = m;
+                }
+            }
+        }
+    }
+
+    // make as many passes as needed to pick up rollup rollups
+    for (;;) {
+        rolled = false;
+
+        // go through the rollup candidates
+        for (i in this.rollups) {
+            if (this.rollups.hasOwnProperty(i)) {
+                // there can be only one, unless forced
+                if (!r[i] && ((!this.loaded[i]) || this.forceMap[i])) {
+                    m = this.getModule(i);
+                    s = m.supersedes || [];
+                    roll = false;
+
+                    // @TODO remove continue
+                    if (!m.rollup) {
+                        continue;
+                    }
+
+                    c = 0;
+
+                    // check the threshold
+                    for (j = 0; j < s.length; j++) {
+                        smod = info[s[j]];
+
+                        // if the superseded module is loaded, we can't
+                        // load the rollup unless it has been forced.
+                        if (this.loaded[s[j]] && !this.forceMap[s[j]]) {
+                            roll = false;
+                            break;
+                        // increment the counter if this module is required.
+                        // if we are beyond the rollup threshold, we will
+                        // use the rollup module
+                        } else if (r[s[j]] && m.type === smod.type) {
+                            c++;
+                            roll = (c >= m.rollup);
+                            if (roll) {
+                                break;
+                            }
+                        }
+                    }
+
+                    if (roll) {
+                        // add the rollup
+                        r[i] = true;
+                        rolled = true;
+
+                        // expand the rollup's dependencies
+                        this.getRequires(m);
+                    }
+                }
+            }
+        }
+
+        // if we made it here w/o rolling up something, we are done
+        if (!rolled) {
+            break;
+        }
+    }
+};
+
+
+}, '3.12.0', {"requires": ["loader-base"]});
+YUI.add('loader-yui3', function (Y, NAME) {
+
+/* This file is auto-generated by (yogi.js loader --mix --yes) */
+
+/*jshint maxlen:900, eqeqeq: false */
+
+/**
+ * YUI 3 module metadata
+ * @module loader
+ * @submodule loader-yui3
+ */
+YUI.Env[Y.version].modules = YUI.Env[Y.version].modules || {};
+Y.mix(YUI.Env[Y.version].modules, {
+    "align-plugin": {
+        "requires": [
+            "node-screen",
+            "node-pluginhost"
+        ]
+    },
+    "anim": {
+        "use": [
+            "anim-base",
+            "anim-color",
+            "anim-curve",
+            "anim-easing",
+            "anim-node-plugin",
+            "anim-scroll",
+            "anim-xy"
+        ]
+    },
+    "anim-base": {
+        "requires": [
+            "base-base",
+            "node-style"
+        ]
+    },
+    "anim-color": {
+        "requires": [
+            "anim-base"
+        ]
+    },
+    "anim-curve": {
+        "requires": [
+            "anim-xy"
+        ]
+    },
+    "anim-easing": {
+        "requires": [
+            "anim-base"
+        ]
+    },
+    "anim-node-plugin": {
+        "requires": [
+            "node-pluginhost",
+            "anim-base"
+        ]
+    },
+    "anim-scroll": {
+        "requires": [
+            "anim-base"
+        ]
+    },
+    "anim-shape": {
+        "requires": [
+            "anim-base",
+            "anim-easing",
+            "anim-color",
+            "matrix"
+        ]
+    },
+    "anim-shape-transform": {
+        "use": [
+            "anim-shape"
+        ]
+    },
+    "anim-xy": {
+        "requires": [
+            "anim-base",
+            "node-screen"
+        ]
+    },
+    "app": {
+        "use": [
+            "app-base",
+            "app-content",
+            "app-transitions",
+            "lazy-model-list",
+            "model",
+            "model-list",
+            "model-sync-rest",
+            "router",
+            "view",
+            "view-node-map"
+        ]
+    },
+    "app-base": {
+        "requires": [
+            "classnamemanager",
+            "pjax-base",
+            "router",
+            "view"
+        ]
+    },
+    "app-content": {
+        "requires": [
+            "app-base",
+            "pjax-content"
+        ]
+    },
+    "app-transitions": {
+        "requires": [
+            "app-base"
+        ]
+    },
+    "app-transitions-css": {
+        "type": "css"
+    },
+    "app-transitions-native": {
+        "condition": {
+            "name": "app-transitions-native",
+            "test": function (Y) {
+    var doc  = Y.config.doc,
+        node = doc ? doc.documentElement : null;
+
+    if (node && node.style) {
+        return ('MozTransition' in node.style || 'WebkitTransition' in node.style || 'transition' in node.style);
+    }
+
+    return false;
+},
+            "trigger": "app-transitions"
+        },
+        "requires": [
+            "app-transitions",
+            "app-transitions-css",
+            "parallel",
+            "transition"
+        ]
+    },
+    "array-extras": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "array-invoke": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "arraylist": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "arraylist-add": {
+        "requires": [
+            "arraylist"
+        ]
+    },
+    "arraylist-filter": {
+        "requires": [
+            "arraylist"
+        ]
+    },
+    "arraysort": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "async-queue": {
+        "requires": [
+            "event-custom"
+        ]
+    },
+    "attribute": {
+        "use": [
+            "attribute-base",
+            "attribute-complex"
+        ]
+    },
+    "attribute-base": {
+        "requires": [
+            "attribute-core",
+            "attribute-observable",
+            "attribute-extras"
+        ]
+    },
+    "attribute-complex": {
+        "requires": [
+            "attribute-base"
+        ]
+    },
+    "attribute-core": {
+        "requires": [
+            "oop"
+        ]
+    },
+    "attribute-events": {
+        "use": [
+            "attribute-observable"
+        ]
+    },
+    "attribute-extras": {
+        "requires": [
+            "oop"
+        ]
+    },
+    "attribute-observable": {
+        "requires": [
+            "event-custom"
+        ]
+    },
+    "autocomplete": {
+        "use": [
+            "autocomplete-base",
+            "autocomplete-sources",
+            "autocomplete-list",
+            "autocomplete-plugin"
+        ]
+    },
+    "autocomplete-base": {
+        "optional": [
+            "autocomplete-sources"
+        ],
+        "requires": [
+            "array-extras",
+            "base-build",
+            "escape",
+            "event-valuechange",
+            "node-base"
+        ]
+    },
+    "autocomplete-filters": {
+        "requires": [
+            "array-extras",
+            "text-wordbreak"
+        ]
+    },
+    "autocomplete-filters-accentfold": {
+        "requires": [
+            "array-extras",
+            "text-accentfold",
+            "text-wordbreak"
+        ]
+    },
+    "autocomplete-highlighters": {
+        "requires": [
+            "array-extras",
+            "highlight-base"
+        ]
+    },
+    "autocomplete-highlighters-accentfold": {
+        "requires": [
+            "array-extras",
+            "highlight-accentfold"
+        ]
+    },
+    "autocomplete-list": {
+        "after": [
+            "autocomplete-sources"
+        ],
+        "lang": [
+            "en",
+            "es",
+            "hu",
+            "it"
+        ],
+        "requires": [
+            "autocomplete-base",
+            "event-resize",
+            "node-screen",
+            "selector-css3",
+            "shim-plugin",
+            "widget",
+            "widget-position",
+            "widget-position-align"
+        ],
+        "skinnable": true
+    },
+    "autocomplete-list-keys": {
+        "condition": {
+            "name": "autocomplete-list-keys",
+            "test": function (Y) {
+    // Only add keyboard support to autocomplete-list if this doesn't appear to
+    // be an iOS or Android-based mobile device.
+    //
+    // There's currently no feasible way to actually detect whether a device has
+    // a hardware keyboard, so this sniff will have to do. It can easily be
+    // overridden by manually loading the autocomplete-list-keys module.
+    //
+    // Worth noting: even though iOS supports bluetooth keyboards, Mobile Safari
+    // doesn't fire the keyboard events used by AutoCompleteList, so there's
+    // no point loading the -keys module even when a bluetooth keyboard may be
+    // available.
+    return !(Y.UA.ios || Y.UA.android);
+},
+            "trigger": "autocomplete-list"
+        },
+        "requires": [
+            "autocomplete-list",
+            "base-build"
+        ]
+    },
+    "autocomplete-plugin": {
+        "requires": [
+            "autocomplete-list",
+            "node-pluginhost"
+        ]
+    },
+    "autocomplete-sources": {
+        "optional": [
+            "io-base",
+            "json-parse",
+            "jsonp",
+            "yql"
+        ],
+        "requires": [
+            "autocomplete-base"
+        ]
+    },
+    "axes": {
+        "use": [
+            "axis-numeric",
+            "axis-category",
+            "axis-time",
+            "axis-stacked"
+        ]
+    },
+    "axes-base": {
+        "use": [
+            "axis-numeric-base",
+            "axis-category-base",
+            "axis-time-base",
+            "axis-stacked-base"
+        ]
+    },
+    "axis": {
+        "requires": [
+            "dom",
+            "widget",
+            "widget-position",
+            "widget-stack",
+            "graphics",
+            "axis-base"
+        ]
+    },
+    "axis-base": {
+        "requires": [
+            "classnamemanager",
+            "datatype-number",
+            "datatype-date",
+            "base",
+            "event-custom"
+        ]
+    },
+    "axis-category": {
+        "requires": [
+            "axis",
+            "axis-category-base"
+        ]
+    },
+    "axis-category-base": {
+        "requires": [
+            "axis-base"
+        ]
+    },
+    "axis-numeric": {
+        "requires": [
+            "axis",
+            "axis-numeric-base"
+        ]
+    },
+    "axis-numeric-base": {
+        "requires": [
+            "axis-base"
+        ]
+    },
+    "axis-stacked": {
+        "requires": [
+            "axis-numeric",
+            "axis-stacked-base"
+        ]
+    },
+    "axis-stacked-base": {
+        "requires": [
+            "axis-numeric-base"
+        ]
+    },
+    "axis-time": {
+        "requires": [
+            "axis",
+            "axis-time-base"
+        ]
+    },
+    "axis-time-base": {
+        "requires": [
+            "axis-base"
+        ]
+    },
+    "base": {
+        "use": [
+            "base-base",
+            "base-pluginhost",
+            "base-build"
+        ]
+    },
+    "base-base": {
+        "requires": [
+            "attribute-base",
+            "base-core",
+            "base-observable"
+        ]
+    },
+    "base-build": {
+        "requires": [
+            "base-base"
+        ]
+    },
+    "base-core": {
+        "requires": [
+            "attribute-core"
+        ]
+    },
+    "base-observable": {
+        "requires": [
+            "attribute-observable"
+        ]
+    },
+    "base-pluginhost": {
+        "requires": [
+            "base-base",
+            "pluginhost"
+        ]
+    },
+    "button": {
+        "requires": [
+            "button-core",
+            "cssbutton",
+            "widget"
+        ]
+    },
+    "button-core": {
+        "requires": [
+            "attribute-core",
+            "classnamemanager",
+            "node-base"
+        ]
+    },
+    "button-group": {
+        "requires": [
+            "button-plugin",
+            "cssbutton",
+            "widget"
+        ]
+    },
+    "button-plugin": {
+        "requires": [
+            "button-core",
+            "cssbutton",
+            "node-pluginhost"
+        ]
+    },
+    "cache": {
+        "use": [
+            "cache-base",
+            "cache-offline",
+            "cache-plugin"
+        ]
+    },
+    "cache-base": {
+        "requires": [
+            "base"
+        ]
+    },
+    "cache-offline": {
+        "requires": [
+            "cache-base",
+            "json"
+        ]
+    },
+    "cache-plugin": {
+        "requires": [
+            "plugin",
+            "cache-base"
+        ]
+    },
+    "calendar": {
+        "requires": [
+            "calendar-base",
+            "calendarnavigator"
+        ],
+        "skinnable": true
+    },
+    "calendar-base": {
+        "lang": [
+            "de",
+            "en",
+            "es",
+            "es-AR",
+            "fr",
+            "hu",
+            "it",
+            "ja",
+            "nb-NO",
+            "nl",
+            "pt-BR",
+            "ru",
+            "zh-Hans",
+            "zh-Hans-CN",
+            "zh-Hant",
+            "zh-Hant-HK",
+            "zh-HANT-TW"
+        ],
+        "requires": [
+            "widget",
+            "datatype-date",
+            "datatype-date-math",
+            "cssgrids"
+        ],
+        "skinnable": true
+    },
+    "calendarnavigator": {
+        "requires": [
+            "plugin",
+            "classnamemanager",
+            "datatype-date",
+            "node"
+        ],
+        "skinnable": true
+    },
+    "charts": {
+        "use": [
+            "charts-base"
+        ]
+    },
+    "charts-base": {
+        "requires": [
+            "dom",
+            "event-mouseenter",
+            "event-touch",
+            "graphics-group",
+            "axes",
+            "series-pie",
+            "series-line",
+            "series-marker",
+            "series-area",
+            "series-spline",
+            "series-column",
+            "series-bar",
+            "series-areaspline",
+            "series-combo",
+            "series-combospline",
+            "series-line-stacked",
+            "series-marker-stacked",
+            "series-area-stacked",
+            "series-spline-stacked",
+            "series-column-stacked",
+            "series-bar-stacked",
+            "series-areaspline-stacked",
+            "series-combo-stacked",
+            "series-combospline-stacked"
+        ]
+    },
+    "charts-legend": {
+        "requires": [
+            "charts-base"
+        ]
+    },
+    "classnamemanager": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "clickable-rail": {
+        "requires": [
+            "slider-base"
+        ]
+    },
+    "collection": {
+        "use": [
+            "array-extras",
+            "arraylist",
+            "arraylist-add",
+            "arraylist-filter",
+            "array-invoke"
+        ]
+    },
+    "color": {
+        "use": [
+            "color-base",
+            "color-hsl",
+            "color-harmony"
+        ]
+    },
+    "color-base": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "color-harmony": {
+        "requires": [
+            "color-hsl"
+        ]
+    },
+    "color-hsl": {
+        "requires": [
+            "color-base"
+        ]
+    },
+    "color-hsv": {
+        "requires": [
+            "color-base"
+        ]
+    },
+    "console": {
+        "lang": [
+            "en",
+            "es",
+            "hu",
+            "it",
+            "ja"
+        ],
+        "requires": [
+            "yui-log",
+            "widget"
+        ],
+        "skinnable": true
+    },
+    "console-filters": {
+        "requires": [
+            "plugin",
+            "console"
+        ],
+        "skinnable": true
+    },
+    "controller": {
+        "use": [
+            "router"
+        ]
+    },
+    "cookie": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "createlink-base": {
+        "requires": [
+            "editor-base"
+        ]
+    },
+    "cssbase": {
+        "after": [
+            "cssreset",
+            "cssfonts",
+            "cssgrids",
+            "cssreset-context",
+            "cssfonts-context",
+            "cssgrids-context"
+        ],
+        "type": "css"
+    },
+    "cssbase-context": {
+        "after": [
+            "cssreset",
+            "cssfonts",
+            "cssgrids",
+            "cssreset-context",
+            "cssfonts-context",
+            "cssgrids-context"
+        ],
+        "type": "css"
+    },
+    "cssbutton": {
+        "type": "css"
+    },
+    "cssfonts": {
+        "type": "css"
+    },
+    "cssfonts-context": {
+        "type": "css"
+    },
+    "cssgrids": {
+        "optional": [
+            "cssnormalize"
+        ],
+        "type": "css"
+    },
+    "cssgrids-base": {
+        "optional": [
+            "cssnormalize"
+        ],
+        "type": "css"
+    },
+    "cssgrids-responsive": {
+        "optional": [
+            "cssnormalize"
+        ],
+        "requires": [
+            "cssgrids",
+            "cssgrids-responsive-base"
+        ],
+        "type": "css"
+    },
+    "cssgrids-units": {
+        "optional": [
+            "cssnormalize"
+        ],
+        "requires": [
+            "cssgrids-base"
+        ],
+        "type": "css"
+    },
+    "cssnormalize": {
+        "type": "css"
+    },
+    "cssnormalize-context": {
+        "type": "css"
+    },
+    "cssreset": {
+        "type": "css"
+    },
+    "cssreset-context": {
+        "type": "css"
+    },
+    "dataschema": {
+        "use": [
+            "dataschema-base",
+            "dataschema-json",
+            "dataschema-xml",
+            "dataschema-array",
+            "dataschema-text"
+        ]
+    },
+    "dataschema-array": {
+        "requires": [
+            "dataschema-base"
+        ]
+    },
+    "dataschema-base": {
+        "requires": [
+            "base"
+        ]
+    },
+    "dataschema-json": {
+        "requires": [
+            "dataschema-base",
+            "json"
+        ]
+    },
+    "dataschema-text": {
+        "requires": [
+            "dataschema-base"
+        ]
+    },
+    "dataschema-xml": {
+        "requires": [
+            "dataschema-base"
+        ]
+    },
+    "datasource": {
+        "use": [
+            "datasource-local",
+            "datasource-io",
+            "datasource-get",
+            "datasource-function",
+            "datasource-cache",
+            "datasource-jsonschema",
+            "datasource-xmlschema",
+            "datasource-arrayschema",
+            "datasource-textschema",
+            "datasource-polling"
+        ]
+    },
+    "datasource-arrayschema": {
+        "requires": [
+            "datasource-local",
+            "plugin",
+            "dataschema-array"
+        ]
+    },
+    "datasource-cache": {
+        "requires": [
+            "datasource-local",
+            "plugin",
+            "cache-base"
+        ]
+    },
+    "datasource-function": {
+        "requires": [
+            "datasource-local"
+        ]
+    },
+    "datasource-get": {
+        "requires": [
+            "datasource-local",
+            "get"
+        ]
+    },
+    "datasource-io": {
+        "requires": [
+            "datasource-local",
+            "io-base"
+        ]
+    },
+    "datasource-jsonschema": {
+        "requires": [
+            "datasource-local",
+            "plugin",
+            "dataschema-json"
+        ]
+    },
+    "datasource-local": {
+        "requires": [
+            "base"
+        ]
+    },
+    "datasource-polling": {
+        "requires": [
+            "datasource-local"
+        ]
+    },
+    "datasource-textschema": {
+        "requires": [
+            "datasource-local",
+            "plugin",
+            "dataschema-text"
+        ]
+    },
+    "datasource-xmlschema": {
+        "requires": [
+            "datasource-local",
+            "plugin",
+            "datatype-xml",
+            "dataschema-xml"
+        ]
+    },
+    "datatable": {
+        "use": [
+            "datatable-core",
+            "datatable-table",
+            "datatable-head",
+            "datatable-body",
+            "datatable-base",
+            "datatable-column-widths",
+            "datatable-message",
+            "datatable-mutable",
+            "datatable-sort",
+            "datatable-datasource"
+        ]
+    },
+    "datatable-base": {
+        "requires": [
+            "datatable-core",
+            "datatable-table",
+            "datatable-head",
+            "datatable-body",
+            "base-build",
+            "widget"
+        ],
+        "skinnable": true
+    },
+    "datatable-body": {
+        "requires": [
+            "datatable-core",
+            "view",
+            "classnamemanager"
+        ]
+    },
+    "datatable-column-widths": {
+        "requires": [
+            "datatable-base"
+        ]
+    },
+    "datatable-core": {
+        "requires": [
+            "escape",
+            "model-list",
+            "node-event-delegate"
+        ]
+    },
+    "datatable-datasource": {
+        "requires": [
+            "datatable-base",
+            "plugin",
+            "datasource-local"
+        ]
+    },
+    "datatable-foot": {
+        "requires": [
+            "datatable-core",
+            "view"
+        ]
+    },
+    "datatable-formatters": {
+        "requires": [
+            "datatable-body",
+            "datatype-number-format",
+            "datatype-date-format",
+            "escape"
+        ]
+    },
+    "datatable-head": {
+        "requires": [
+            "datatable-core",
+            "view",
+            "classnamemanager"
+        ]
+    },
+    "datatable-message": {
+        "lang": [
+            "en",
+            "fr",
+            "es",
+            "hu",
+            "it"
+        ],
+        "requires": [
+            "datatable-base"
+        ],
+        "skinnable": true
+    },
+    "datatable-mutable": {
+        "requires": [
+            "datatable-base"
+        ]
+    },
+    "datatable-paginator": {
+        "lang": [
+            "en"
+        ],
+        "requires": [
+            "model",
+            "view",
+            "paginator-core",
+            "datatable-foot",
+            "datatable-paginator-templates"
+        ],
+        "skinnable": true
+    },
+    "datatable-paginator-templates": {
+        "requires": [
+            "template"
+        ]
+    },
+    "datatable-scroll": {
+        "requires": [
+            "datatable-base",
+            "datatable-column-widths",
+            "dom-screen"
+        ],
+        "skinnable": true
+    },
+    "datatable-sort": {
+        "lang": [
+            "en",
+            "fr",
+            "es",
+            "hu"
+        ],
+        "requires": [
+            "datatable-base"
+        ],
+        "skinnable": true
+    },
+    "datatable-table": {
+        "requires": [
+            "datatable-core",
+            "datatable-head",
+            "datatable-body",
+            "view",
+            "classnamemanager"
+        ]
+    },
+    "datatype": {
+        "use": [
+            "datatype-date",
+            "datatype-number",
+            "datatype-xml"
+        ]
+    },
+    "datatype-date": {
+        "use": [
+            "datatype-date-parse",
+            "datatype-date-format",
+            "datatype-date-math"
+        ]
+    },
+    "datatype-date-format": {
+        "lang": [
+            "ar",
+            "ar-JO",
+            "ca",
+            "ca-ES",
+            "da",
+            "da-DK",
+            "de",
+            "de-AT",
+            "de-DE",
+            "el",
+            "el-GR",
+            "en",
+            "en-AU",
+            "en-CA",
+            "en-GB",
+            "en-IE",
+            "en-IN",
+            "en-JO",
+            "en-MY",
+            "en-NZ",
+            "en-PH",
+            "en-SG",
+            "en-US",
+            "es",
+            "es-AR",
+            "es-BO",
+            "es-CL",
+            "es-CO",
+            "es-EC",
+            "es-ES",
+            "es-MX",
+            "es-PE",
+            "es-PY",
+            "es-US",
+            "es-UY",
+            "es-VE",
+            "fi",
+            "fi-FI",
+            "fr",
+            "fr-BE",
+            "fr-CA",
+            "fr-FR",
+            "hi",
+            "hi-IN",
+            "hu",
+            "id",
+            "id-ID",
+            "it",
+            "it-IT",
+            "ja",
+            "ja-JP",
+            "ko",
+            "ko-KR",
+            "ms",
+            "ms-MY",
+            "nb",
+            "nb-NO",
+            "nl",
+            "nl-BE",
+            "nl-NL",
+            "pl",
+            "pl-PL",
+            "pt",
+            "pt-BR",
+            "ro",
+            "ro-RO",
+            "ru",
+            "ru-RU",
+            "sv",
+            "sv-SE",
+            "th",
+            "th-TH",
+            "tr",
+            "tr-TR",
+            "vi",
+            "vi-VN",
+            "zh-Hans",
+            "zh-Hans-CN",
+            "zh-Hant",
+            "zh-Hant-HK",
+            "zh-Hant-TW"
+        ]
+    },
+    "datatype-date-math": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "datatype-date-parse": {},
+    "datatype-number": {
+        "use": [
+            "datatype-number-parse",
+            "datatype-number-format"
+        ]
+    },
+    "datatype-number-format": {},
+    "datatype-number-parse": {},
+    "datatype-xml": {
+        "use": [
+            "datatype-xml-parse",
+            "datatype-xml-format"
+        ]
+    },
+    "datatype-xml-format": {},
+    "datatype-xml-parse": {},
+    "dd": {
+        "use": [
+            "dd-ddm-base",
+            "dd-ddm",
+            "dd-ddm-drop",
+            "dd-drag",
+            "dd-proxy",
+            "dd-constrain",
+            "dd-drop",
+            "dd-scroll",
+            "dd-delegate"
+        ]
+    },
+    "dd-constrain": {
+        "requires": [
+            "dd-drag"
+        ]
+    },
+    "dd-ddm": {
+        "requires": [
+            "dd-ddm-base",
+            "event-resize"
+        ]
+    },
+    "dd-ddm-base": {
+        "requires": [
+            "node",
+            "base",
+            "yui-throttle",
+            "classnamemanager"
+        ]
+    },
+    "dd-ddm-drop": {
+        "requires": [
+            "dd-ddm"
+        ]
+    },
+    "dd-delegate": {
+        "requires": [
+            "dd-drag",
+            "dd-drop-plugin",
+            "event-mouseenter"
+        ]
+    },
+    "dd-drag": {
+        "requires": [
+            "dd-ddm-base"
+        ]
+    },
+    "dd-drop": {
+        "requires": [
+            "dd-drag",
+            "dd-ddm-drop"
+        ]
+    },
+    "dd-drop-plugin": {
+        "requires": [
+            "dd-drop"
+        ]
+    },
+    "dd-gestures": {
+        "condition": {
+            "name": "dd-gestures",
+            "trigger": "dd-drag",
+            "ua": "touchEnabled"
+        },
+        "requires": [
+            "dd-drag",
+            "event-synthetic",
+            "event-gestures"
+        ]
+    },
+    "dd-plugin": {
+        "optional": [
+            "dd-constrain",
+            "dd-proxy"
+        ],
+        "requires": [
+            "dd-drag"
+        ]
+    },
+    "dd-proxy": {
+        "requires": [
+            "dd-drag"
+        ]
+    },
+    "dd-scroll": {
+        "requires": [
+            "dd-drag"
+        ]
+    },
+    "dial": {
+        "lang": [
+            "en",
+            "es",
+            "hu"
+        ],
+        "requires": [
+            "widget",
+            "dd-drag",
+            "event-mouseenter",
+            "event-move",
+            "event-key",
+            "transition",
+            "intl"
+        ],
+        "skinnable": true
+    },
+    "dom": {
+        "use": [
+            "dom-base",
+            "dom-screen",
+            "dom-style",
+            "selector-native",
+            "selector"
+        ]
+    },
+    "dom-base": {
+        "requires": [
+            "dom-core"
+        ]
+    },
+    "dom-core": {
+        "requires": [
+            "oop",
+            "features"
+        ]
+    },
+    "dom-deprecated": {
+        "requires": [
+            "dom-base"
+        ]
+    },
+    "dom-screen": {
+        "requires": [
+            "dom-base",
+            "dom-style"
+        ]
+    },
+    "dom-style": {
+        "requires": [
+            "dom-base",
+            "color-base"
+        ]
+    },
+    "dom-style-ie": {
+        "condition": {
+            "name": "dom-style-ie",
+            "test": function (Y) {
+
+    var testFeature = Y.Features.test,
+        addFeature = Y.Features.add,
+        WINDOW = Y.config.win,
+        DOCUMENT = Y.config.doc,
+        DOCUMENT_ELEMENT = 'documentElement',
+        ret = false;
+
+    addFeature('style', 'computedStyle', {
+        test: function() {
+            return WINDOW && 'getComputedStyle' in WINDOW;
+        }
+    });
+
+    addFeature('style', 'opacity', {
+        test: function() {
+            return DOCUMENT && 'opacity' in DOCUMENT[DOCUMENT_ELEMENT].style;
+        }
+    });
+
+    ret =  (!testFeature('style', 'opacity') &&
+            !testFeature('style', 'computedStyle'));
+
+    return ret;
+},
+            "trigger": "dom-style"
+        },
+        "requires": [
+            "dom-style"
+        ]
+    },
+    "dump": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "editor": {
+        "use": [
+            "frame",
+            "editor-selection",
+            "exec-command",
+            "editor-base",
+            "editor-para",
+            "editor-br",
+            "editor-bidi",
+            "editor-tab",
+            "createlink-base"
+        ]
+    },
+    "editor-base": {
+        "requires": [
+            "base",
+            "frame",
+            "node",
+            "exec-command",
+            "editor-selection"
+        ]
+    },
+    "editor-bidi": {
+        "requires": [
+            "editor-base"
+        ]
+    },
+    "editor-br": {
+        "requires": [
+            "editor-base"
+        ]
+    },
+    "editor-lists": {
+        "requires": [
+            "editor-base"
+        ]
+    },
+    "editor-para": {
+        "requires": [
+            "editor-para-base"
+        ]
+    },
+    "editor-para-base": {
+        "requires": [
+            "editor-base"
+        ]
+    },
+    "editor-para-ie": {
+        "condition": {
+            "name": "editor-para-ie",
+            "trigger": "editor-para",
+            "ua": "ie",
+            "when": "instead"
+        },
+        "requires": [
+            "editor-para-base"
+        ]
+    },
+    "editor-selection": {
+        "requires": [
+            "node"
+        ]
+    },
+    "editor-tab": {
+        "requires": [
+            "editor-base"
+        ]
+    },
+    "escape": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "event": {
+        "after": [
+            "node-base"
+        ],
+        "use": [
+            "event-base",
+            "event-delegate",
+            "event-synthetic",
+            "event-mousewheel",
+            "event-mouseenter",
+            "event-key",
+            "event-focus",
+            "event-resize",
+            "event-hover",
+            "event-outside",
+            "event-touch",
+            "event-move",
+            "event-flick",
+            "event-valuechange",
+            "event-tap"
+        ]
+    },
+    "event-base": {
+        "after": [
+            "node-base"
+        ],
+        "requires": [
+            "event-custom-base"
+        ]
+    },
+    "event-base-ie": {
+        "after": [
+            "event-base"
+        ],
+        "condition": {
+            "name": "event-base-ie",
+            "test": function(Y) {
+    var imp = Y.config.doc && Y.config.doc.implementation;
+    return (imp && (!imp.hasFeature('Events', '2.0')));
+},
+            "trigger": "node-base"
+        },
+        "requires": [
+            "node-base"
+        ]
+    },
+    "event-contextmenu": {
+        "requires": [
+            "event-synthetic",
+            "dom-screen"
+        ]
+    },
+    "event-custom": {
+        "use": [
+            "event-custom-base",
+            "event-custom-complex"
+        ]
+    },
+    "event-custom-base": {
+        "requires": [
+            "oop"
+        ]
+    },
+    "event-custom-complex": {
+        "requires": [
+            "event-custom-base"
+        ]
+    },
+    "event-delegate": {
+        "requires": [
+            "node-base"
+        ]
+    },
+    "event-flick": {
+        "requires": [
+            "node-base",
+            "event-touch",
+            "event-synthetic"
+        ]
+    },
+    "event-focus": {
+        "requires": [
+            "event-synthetic"
+        ]
+    },
+    "event-gestures": {
+        "use": [
+            "event-flick",
+            "event-move"
+        ]
+    },
+    "event-hover": {
+        "requires": [
+            "event-mouseenter"
+        ]
+    },
+    "event-key": {
+        "requires": [
+            "event-synthetic"
+        ]
+    },
+    "event-mouseenter": {
+        "requires": [
+            "event-synthetic"
+        ]
+    },
+    "event-mousewheel": {
+        "requires": [
+            "node-base"
+        ]
+    },
+    "event-move": {
+        "requires": [
+            "node-base",
+            "event-touch",
+            "event-synthetic"
+        ]
+    },
+    "event-outside": {
+        "requires": [
+            "event-synthetic"
+        ]
+    },
+    "event-resize": {
+        "requires": [
+            "node-base",
+            "event-synthetic"
+        ]
+    },
+    "event-simulate": {
+        "requires": [
+            "event-base"
+        ]
+    },
+    "event-synthetic": {
+        "requires": [
+            "node-base",
+            "event-custom-complex"
+        ]
+    },
+    "event-tap": {
+        "requires": [
+            "node-base",
+            "event-base",
+            "event-touch",
+            "event-synthetic"
+        ]
+    },
+    "event-touch": {
+        "requires": [
+            "node-base"
+        ]
+    },
+    "event-valuechange": {
+        "requires": [
+            "event-focus",
+            "event-synthetic"
+        ]
+    },
+    "exec-command": {
+        "requires": [
+            "frame"
+        ]
+    },
+    "features": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "file": {
+        "requires": [
+            "file-flash",
+            "file-html5"
+        ]
+    },
+    "file-flash": {
+        "requires": [
+            "base"
+        ]
+    },
+    "file-html5": {
+        "requires": [
+            "base"
+        ]
+    },
+    "frame": {
+        "requires": [
+            "base",
+            "node",
+            "selector-css3",
+            "yui-throttle"
+        ]
+    },
+    "gesture-simulate": {
+        "requires": [
+            "async-queue",
+            "event-simulate",
+            "node-screen"
+        ]
+    },
+    "get": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "graphics": {
+        "requires": [
+            "node",
+            "event-custom",
+            "pluginhost",
+            "matrix",
+            "classnamemanager"
+        ]
+    },
+    "graphics-canvas": {
+        "condition": {
+            "name": "graphics-canvas",
+            "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
+        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
+    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
+},
+            "trigger": "graphics"
+        },
+        "requires": [
+            "graphics"
+        ]
+    },
+    "graphics-canvas-default": {
+        "condition": {
+            "name": "graphics-canvas-default",
+            "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+        useCanvas = Y.config.defaultGraphicEngine && Y.config.defaultGraphicEngine == "canvas",
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
+        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
+    return (!svg || useCanvas) && (canvas && canvas.getContext && canvas.getContext("2d"));
+},
+            "trigger": "graphics"
+        }
+    },
+    "graphics-group": {
+        "requires": [
+            "graphics"
+        ]
+    },
+    "graphics-svg": {
+        "condition": {
+            "name": "graphics-svg",
+            "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
+        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
+    
+    return svg && (useSVG || !canvas);
+},
+            "trigger": "graphics"
+        },
+        "requires": [
+            "graphics"
+        ]
+    },
+    "graphics-svg-default": {
+        "condition": {
+            "name": "graphics-svg-default",
+            "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+        useSVG = !Y.config.defaultGraphicEngine || Y.config.defaultGraphicEngine != "canvas",
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas"),
+        svg = (DOCUMENT && DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1"));
+    
+    return svg && (useSVG || !canvas);
+},
+            "trigger": "graphics"
+        }
+    },
+    "graphics-vml": {
+        "condition": {
+            "name": "graphics-vml",
+            "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas");
+    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
+},
+            "trigger": "graphics"
+        },
+        "requires": [
+            "graphics"
+        ]
+    },
+    "graphics-vml-default": {
+        "condition": {
+            "name": "graphics-vml-default",
+            "test": function(Y) {
+    var DOCUMENT = Y.config.doc,
+		canvas = DOCUMENT && DOCUMENT.createElement("canvas");
+    return (DOCUMENT && !DOCUMENT.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#BasicStructure", "1.1") && (!canvas || !canvas.getContext || !canvas.getContext("2d")));
+},
+            "trigger": "graphics"
+        }
+    },
+    "handlebars": {
+        "use": [
+            "handlebars-compiler"
+        ]
+    },
+    "handlebars-base": {
+        "requires": []
+    },
+    "handlebars-compiler": {
+        "requires": [
+            "handlebars-base"
+        ]
+    },
+    "highlight": {
+        "use": [
+            "highlight-base",
+            "highlight-accentfold"
+        ]
+    },
+    "highlight-accentfold": {
+        "requires": [
+            "highlight-base",
+            "text-accentfold"
+        ]
+    },
+    "highlight-base": {
+        "requires": [
+            "array-extras",
+            "classnamemanager",
+            "escape",
+            "text-wordbreak"
+        ]
+    },
+    "history": {
+        "use": [
+            "history-base",
+            "history-hash",
+            "history-hash-ie",
+            "history-html5"
+        ]
+    },
+    "history-base": {
+        "requires": [
+            "event-custom-complex"
+        ]
+    },
+    "history-hash": {
+        "after": [
+            "history-html5"
+        ],
+        "requires": [
+            "event-synthetic",
+            "history-base",
+            "yui-later"
+        ]
+    },
+    "history-hash-ie": {
+        "condition": {
+            "name": "history-hash-ie",
+            "test": function (Y) {
+    var docMode = Y.config.doc && Y.config.doc.documentMode;
+
+    return Y.UA.ie && (!('onhashchange' in Y.config.win) ||
+            !docMode || docMode < 8);
+},
+            "trigger": "history-hash"
+        },
+        "requires": [
+            "history-hash",
+            "node-base"
+        ]
+    },
+    "history-html5": {
+        "optional": [
+            "json"
+        ],
+        "requires": [
+            "event-base",
+            "history-base",
+            "node-base"
+        ]
+    },
+    "imageloader": {
+        "requires": [
+            "base-base",
+            "node-style",
+            "node-screen"
+        ]
+    },
+    "intl": {
+        "requires": [
+            "intl-base",
+            "event-custom"
+        ]
+    },
+    "intl-base": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "io": {
+        "use": [
+            "io-base",
+            "io-xdr",
+            "io-form",
+            "io-upload-iframe",
+            "io-queue"
+        ]
+    },
+    "io-base": {
+        "requires": [
+            "event-custom-base",
+            "querystring-stringify-simple"
+        ]
+    },
+    "io-form": {
+        "requires": [
+            "io-base",
+            "node-base"
+        ]
+    },
+    "io-nodejs": {
+        "condition": {
+            "name": "io-nodejs",
+            "trigger": "io-base",
+            "ua": "nodejs"
+        },
+        "requires": [
+            "io-base"
+        ]
+    },
+    "io-queue": {
+        "requires": [
+            "io-base",
+            "queue-promote"
+        ]
+    },
+    "io-upload-iframe": {
+        "requires": [
+            "io-base",
+            "node-base"
+        ]
+    },
+    "io-xdr": {
+        "requires": [
+            "io-base",
+            "datatype-xml-parse"
+        ]
+    },
+    "json": {
+        "use": [
+            "json-parse",
+            "json-stringify"
+        ]
+    },
+    "json-parse": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "json-parse-shim": {
+        "condition": {
+            "name": "json-parse-shim",
+            "test": function (Y) {
+    var _JSON = Y.config.global.JSON,
+        Native = Object.prototype.toString.call(_JSON) === '[object JSON]' && _JSON,
+        nativeSupport = Y.config.useNativeJSONParse !== false && !!Native;
+
+    function workingNative( k, v ) {
+        return k === "ok" ? true : v;
+    }
+    
+    // Double check basic functionality.  This is mainly to catch early broken
+    // implementations of the JSON API in Firefox 3.1 beta1 and beta2
+    if ( nativeSupport ) {
+        try {
+            nativeSupport = ( Native.parse( '{"ok":false}', workingNative ) ).ok;
+        }
+        catch ( e ) {
+            nativeSupport = false;
+        }
+    }
+
+    return !nativeSupport;
+},
+            "trigger": "json-parse"
+        },
+        "requires": [
+            "json-parse"
+        ]
+    },
+    "json-stringify": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "json-stringify-shim": {
+        "condition": {
+            "name": "json-stringify-shim",
+            "test": function (Y) {
+    var _JSON = Y.config.global.JSON,
+        Native = Object.prototype.toString.call(_JSON) === '[object JSON]' && _JSON,
+        nativeSupport = Y.config.useNativeJSONStringify !== false && !!Native;
+
+    // Double check basic native functionality.  This is primarily to catch broken
+    // early JSON API implementations in Firefox 3.1 beta1 and beta2.
+    if ( nativeSupport ) {
+        try {
+            nativeSupport = ( '0' === Native.stringify(0) );
+        } catch ( e ) {
+            nativeSupport = false;
+        }
+    }
+
+
+    return !nativeSupport;
+},
+            "trigger": "json-stringify"
+        },
+        "requires": [
+            "json-stringify"
+        ]
+    },
+    "jsonp": {
+        "requires": [
+            "get",
+            "oop"
+        ]
+    },
+    "jsonp-url": {
+        "requires": [
+            "jsonp"
+        ]
+    },
+    "lazy-model-list": {
+        "requires": [
+            "model-list"
+        ]
+    },
+    "loader": {
+        "use": [
+            "loader-base",
+            "loader-rollup",
+            "loader-yui3"
+        ]
+    },
+    "loader-base": {
+        "requires": [
+            "get",
+            "features"
+        ]
+    },
+    "loader-rollup": {
+        "requires": [
+            "loader-base"
+        ]
+    },
+    "loader-yui3": {
+        "requires": [
+            "loader-base"
+        ]
+    },
+    "matrix": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "model": {
+        "requires": [
+            "base-build",
+            "escape",
+            "json-parse"
+        ]
+    },
+    "model-list": {
+        "requires": [
+            "array-extras",
+            "array-invoke",
+            "arraylist",
+            "base-build",
+            "escape",
+            "json-parse",
+            "model"
+        ]
+    },
+    "model-sync-rest": {
+        "requires": [
+            "model",
+            "io-base",
+            "json-stringify"
+        ]
+    },
+    "node": {
+        "use": [
+            "node-base",
+            "node-event-delegate",
+            "node-pluginhost",
+            "node-screen",
+            "node-style"
+        ]
+    },
+    "node-base": {
+        "requires": [
+            "event-base",
+            "node-core",
+            "dom-base",
+            "dom-style"
+        ]
+    },
+    "node-core": {
+        "requires": [
+            "dom-core",
+            "selector"
+        ]
+    },
+    "node-deprecated": {
+        "requires": [
+            "node-base"
+        ]
+    },
+    "node-event-delegate": {
+        "requires": [
+            "node-base",
+            "event-delegate"
+        ]
+    },
+    "node-event-html5": {
+        "requires": [
+            "node-base"
+        ]
+    },
+    "node-event-simulate": {
+        "requires": [
+            "node-base",
+            "event-simulate",
+            "gesture-simulate"
+        ]
+    },
+    "node-flick": {
+        "requires": [
+            "classnamemanager",
+            "transition",
+            "event-flick",
+            "plugin"
+        ],
+        "skinnable": true
+    },
+    "node-focusmanager": {
+        "requires": [
+            "attribute",
+            "node",
+            "plugin",
+            "node-event-simulate",
+            "event-key",
+            "event-focus"
+        ]
+    },
+    "node-load": {
+        "requires": [
+            "node-base",
+            "io-base"
+        ]
+    },
+    "node-menunav": {
+        "requires": [
+            "node",
+            "classnamemanager",
+            "plugin",
+            "node-focusmanager"
+        ],
+        "skinnable": true
+    },
+    "node-pluginhost": {
+        "requires": [
+            "node-base",
+            "pluginhost"
+        ]
+    },
+    "node-screen": {
+        "requires": [
+            "dom-screen",
+            "node-base"
+        ]
+    },
+    "node-scroll-info": {
+        "requires": [
+            "array-extras",
+            "base-build",
+            "event-resize",
+            "node-pluginhost",
+            "plugin",
+            "selector"
+        ]
+    },
+    "node-style": {
+        "requires": [
+            "dom-style",
+            "node-base"
+        ]
+    },
+    "oop": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "overlay": {
+        "requires": [
+            "widget",
+            "widget-stdmod",
+            "widget-position",
+            "widget-position-align",
+            "widget-stack",
+            "widget-position-constrain"
+        ],
+        "skinnable": true
+    },
+    "paginator": {
+        "requires": [
+            "paginator-core"
+        ]
+    },
+    "paginator-core": {
+        "requires": [
+            "base"
+        ]
+    },
+    "paginator-url": {
+        "requires": [
+            "paginator"
+        ]
+    },
+    "panel": {
+        "requires": [
+            "widget",
+            "widget-autohide",
+            "widget-buttons",
+            "widget-modality",
+            "widget-position",
+            "widget-position-align",
+            "widget-position-constrain",
+            "widget-stack",
+            "widget-stdmod"
+        ],
+        "skinnable": true
+    },
+    "parallel": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "pjax": {
+        "requires": [
+            "pjax-base",
+            "pjax-content"
+        ]
+    },
+    "pjax-base": {
+        "requires": [
+            "classnamemanager",
+            "node-event-delegate",
+            "router"
+        ]
+    },
+    "pjax-content": {
+        "requires": [
+            "io-base",
+            "node-base",
+            "router"
+        ]
+    },
+    "pjax-plugin": {
+        "requires": [
+            "node-pluginhost",
+            "pjax",
+            "plugin"
+        ]
+    },
+    "plugin": {
+        "requires": [
+            "base-base"
+        ]
+    },
+    "pluginhost": {
+        "use": [
+            "pluginhost-base",
+            "pluginhost-config"
+        ]
+    },
+    "pluginhost-base": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "pluginhost-config": {
+        "requires": [
+            "pluginhost-base"
+        ]
+    },
+    "promise": {
+        "requires": [
+            "timers"
+        ]
+    },
+    "querystring": {
+        "use": [
+            "querystring-parse",
+            "querystring-stringify"
+        ]
+    },
+    "querystring-parse": {
+        "requires": [
+            "yui-base",
+            "array-extras"
+        ]
+    },
+    "querystring-parse-simple": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "querystring-stringify": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "querystring-stringify-simple": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "queue-promote": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "range-slider": {
+        "requires": [
+            "slider-base",
+            "slider-value-range",
+            "clickable-rail"
+        ]
+    },
+    "recordset": {
+        "use": [
+            "recordset-base",
+            "recordset-sort",
+            "recordset-filter",
+            "recordset-indexer"
+        ]
+    },
+    "recordset-base": {
+        "requires": [
+            "base",
+            "arraylist"
+        ]
+    },
+    "recordset-filter": {
+        "requires": [
+            "recordset-base",
+            "array-extras",
+            "plugin"
+        ]
+    },
+    "recordset-indexer": {
+        "requires": [
+            "recordset-base",
+            "plugin"
+        ]
+    },
+    "recordset-sort": {
+        "requires": [
+            "arraysort",
+            "recordset-base",
+            "plugin"
+        ]
+    },
+    "resize": {
+        "use": [
+            "resize-base",
+            "resize-proxy",
+            "resize-constrain"
+        ]
+    },
+    "resize-base": {
+        "requires": [
+            "base",
+            "widget",
+            "event",
+            "oop",
+            "dd-drag",
+            "dd-delegate",
+            "dd-drop"
+        ],
+        "skinnable": true
+    },
+    "resize-constrain": {
+        "requires": [
+            "plugin",
+            "resize-base"
+        ]
+    },
+    "resize-plugin": {
+        "optional": [
+            "resize-constrain"
+        ],
+        "requires": [
+            "resize-base",
+            "plugin"
+        ]
+    },
+    "resize-proxy": {
+        "requires": [
+            "plugin",
+            "resize-base"
+        ]
+    },
+    "router": {
+        "optional": [
+            "querystring-parse"
+        ],
+        "requires": [
+            "array-extras",
+            "base-build",
+            "history"
+        ]
+    },
+    "scrollview": {
+        "requires": [
+            "scrollview-base",
+            "scrollview-scrollbars"
+        ]
+    },
+    "scrollview-base": {
+        "requires": [
+            "widget",
+            "event-gestures",
+            "event-mousewheel",
+            "transition"
+        ],
+        "skinnable": true
+    },
+    "scrollview-base-ie": {
+        "condition": {
+            "name": "scrollview-base-ie",
+            "trigger": "scrollview-base",
+            "ua": "ie"
+        },
+        "requires": [
+            "scrollview-base"
+        ]
+    },
+    "scrollview-list": {
+        "requires": [
+            "plugin",
+            "classnamemanager"
+        ],
+        "skinnable": true
+    },
+    "scrollview-paginator": {
+        "requires": [
+            "plugin",
+            "classnamemanager"
+        ]
+    },
+    "scrollview-scrollbars": {
+        "requires": [
+            "classnamemanager",
+            "transition",
+            "plugin"
+        ],
+        "skinnable": true
+    },
+    "selector": {
+        "requires": [
+            "selector-native"
+        ]
+    },
+    "selector-css2": {
+        "condition": {
+            "name": "selector-css2",
+            "test": function (Y) {
+    var DOCUMENT = Y.config.doc,
+        ret = DOCUMENT && !('querySelectorAll' in DOCUMENT);
+
+    return ret;
+},
+            "trigger": "selector"
+        },
+        "requires": [
+            "selector-native"
+        ]
+    },
+    "selector-css3": {
+        "requires": [
+            "selector-native",
+            "selector-css2"
+        ]
+    },
+    "selector-native": {
+        "requires": [
+            "dom-base"
+        ]
+    },
+    "series-area": {
+        "requires": [
+            "series-cartesian",
+            "series-fill-util"
+        ]
+    },
+    "series-area-stacked": {
+        "requires": [
+            "series-stacked",
+            "series-area"
+        ]
+    },
+    "series-areaspline": {
+        "requires": [
+            "series-area",
+            "series-curve-util"
+        ]
+    },
+    "series-areaspline-stacked": {
+        "requires": [
+            "series-stacked",
+            "series-areaspline"
+        ]
+    },
+    "series-bar": {
+        "requires": [
+            "series-marker",
+            "series-histogram-base"
+        ]
+    },
+    "series-bar-stacked": {
+        "requires": [
+            "series-stacked",
+            "series-bar"
+        ]
+    },
+    "series-base": {
+        "requires": [
+            "graphics",
+            "axis-base"
+        ]
+    },
+    "series-candlestick": {
+        "requires": [
+            "series-range"
+        ]
+    },
+    "series-cartesian": {
+        "requires": [
+            "series-base"
+        ]
+    },
+    "series-column": {
+        "requires": [
+            "series-marker",
+            "series-histogram-base"
+        ]
+    },
+    "series-column-stacked": {
+        "requires": [
+            "series-stacked",
+            "series-column"
+        ]
+    },
+    "series-combo": {
+        "requires": [
+            "series-cartesian",
+            "series-line-util",
+            "series-plot-util",
+            "series-fill-util"
+        ]
+    },
+    "series-combo-stacked": {
+        "requires": [
+            "series-stacked",
+            "series-combo"
+        ]
+    },
+    "series-combospline": {
+        "requires": [
+            "series-combo",
+            "series-curve-util"
+        ]
+    },
+    "series-combospline-stacked": {
+        "requires": [
+            "series-combo-stacked",
+            "series-curve-util"
+        ]
+    },
+    "series-curve-util": {},
+    "series-fill-util": {},
+    "series-histogram-base": {
+        "requires": [
+            "series-cartesian",
+            "series-plot-util"
+        ]
+    },
+    "series-line": {
+        "requires": [
+            "series-cartesian",
+            "series-line-util"
+        ]
+    },
+    "series-line-stacked": {
+        "requires": [
+            "series-stacked",
+            "series-line"
+        ]
+    },
+    "series-line-util": {},
+    "series-marker": {
+        "requires": [
+            "series-cartesian",
+            "series-plot-util"
+        ]
+    },
+    "series-marker-stacked": {
+        "requires": [
+            "series-stacked",
+            "series-marker"
+        ]
+    },
+    "series-ohlc": {
+        "requires": [
+            "series-range"
+        ]
+    },
+    "series-pie": {
+        "requires": [
+            "series-base",
+            "series-plot-util"
+        ]
+    },
+    "series-plot-util": {},
+    "series-range": {
+        "requires": [
+            "series-cartesian"
+        ]
+    },
+    "series-spline": {
+        "requires": [
+            "series-line",
+            "series-curve-util"
+        ]
+    },
+    "series-spline-stacked": {
+        "requires": [
+            "series-stacked",
+            "series-spline"
+        ]
+    },
+    "series-stacked": {
+        "requires": [
+            "axis-stacked"
+        ]
+    },
+    "shim-plugin": {
+        "requires": [
+            "node-style",
+            "node-pluginhost"
+        ]
+    },
+    "slider": {
+        "use": [
+            "slider-base",
+            "slider-value-range",
+            "clickable-rail",
+            "range-slider"
+        ]
+    },
+    "slider-base": {
+        "requires": [
+            "widget",
+            "dd-constrain",
+            "event-key"
+        ],
+        "skinnable": true
+    },
+    "slider-value-range": {
+        "requires": [
+            "slider-base"
+        ]
+    },
+    "sortable": {
+        "requires": [
+            "dd-delegate",
+            "dd-drop-plugin",
+            "dd-proxy"
+        ]
+    },
+    "sortable-scroll": {
+        "requires": [
+            "dd-scroll",
+            "sortable"
+        ]
+    },
+    "stylesheet": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "substitute": {
+        "optional": [
+            "dump"
+        ],
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "swf": {
+        "requires": [
+            "event-custom",
+            "node",
+            "swfdetect",
+            "escape"
+        ]
+    },
+    "swfdetect": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "tabview": {
+        "requires": [
+            "widget",
+            "widget-parent",
+            "widget-child",
+            "tabview-base",
+            "node-pluginhost",
+            "node-focusmanager"
+        ],
+        "skinnable": true
+    },
+    "tabview-base": {
+        "requires": [
+            "node-event-delegate",
+            "classnamemanager"
+        ]
+    },
+    "tabview-plugin": {
+        "requires": [
+            "tabview-base"
+        ]
+    },
+    "template": {
+        "use": [
+            "template-base",
+            "template-micro"
+        ]
+    },
+    "template-base": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "template-micro": {
+        "requires": [
+            "escape"
+        ]
+    },
+    "test": {
+        "requires": [
+            "event-simulate",
+            "event-custom",
+            "json-stringify"
+        ]
+    },
+    "test-console": {
+        "requires": [
+            "console-filters",
+            "test",
+            "array-extras"
+        ],
+        "skinnable": true
+    },
+    "text": {
+        "use": [
+            "text-accentfold",
+            "text-wordbreak"
+        ]
+    },
+    "text-accentfold": {
+        "requires": [
+            "array-extras",
+            "text-data-accentfold"
+        ]
+    },
+    "text-data-accentfold": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "text-data-wordbreak": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "text-wordbreak": {
+        "requires": [
+            "array-extras",
+            "text-data-wordbreak"
+        ]
+    },
+    "timers": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "transition": {
+        "requires": [
+            "node-style"
+        ]
+    },
+    "transition-timer": {
+        "condition": {
+            "name": "transition-timer",
+            "test": function (Y) {
+    var DOCUMENT = Y.config.doc,
+        node = (DOCUMENT) ? DOCUMENT.documentElement: null,
+        ret = true;
+
+    if (node && node.style) {
+        ret = !('MozTransition' in node.style || 'WebkitTransition' in node.style || 'transition' in node.style);
+    }
+
+    return ret;
+},
+            "trigger": "transition"
+        },
+        "requires": [
+            "transition"
+        ]
+    },
+    "tree": {
+        "requires": [
+            "base-build",
+            "tree-node"
+        ]
+    },
+    "tree-labelable": {
+        "requires": [
+            "tree"
+        ]
+    },
+    "tree-lazy": {
+        "requires": [
+            "base-pluginhost",
+            "plugin",
+            "tree"
+        ]
+    },
+    "tree-node": {},
+    "tree-openable": {
+        "requires": [
+            "tree"
+        ]
+    },
+    "tree-selectable": {
+        "requires": [
+            "tree"
+        ]
+    },
+    "tree-sortable": {
+        "requires": [
+            "tree"
+        ]
+    },
+    "uploader": {
+        "requires": [
+            "uploader-html5",
+            "uploader-flash"
+        ]
+    },
+    "uploader-flash": {
+        "requires": [
+            "swf",
+            "widget",
+            "base",
+            "cssbutton",
+            "node",
+            "event-custom",
+            "file-flash",
+            "uploader-queue"
+        ]
+    },
+    "uploader-html5": {
+        "requires": [
+            "widget",
+            "node-event-simulate",
+            "file-html5",
+            "uploader-queue"
+        ]
+    },
+    "uploader-queue": {
+        "requires": [
+            "base"
+        ]
+    },
+    "view": {
+        "requires": [
+            "base-build",
+            "node-event-delegate"
+        ]
+    },
+    "view-node-map": {
+        "requires": [
+            "view"
+        ]
+    },
+    "widget": {
+        "use": [
+            "widget-base",
+            "widget-htmlparser",
+            "widget-skin",
+            "widget-uievents"
+        ]
+    },
+    "widget-anim": {
+        "requires": [
+            "anim-base",
+            "plugin",
+            "widget"
+        ]
+    },
+    "widget-autohide": {
+        "requires": [
+            "base-build",
+            "event-key",
+            "event-outside",
+            "widget"
+        ]
+    },
+    "widget-base": {
+        "requires": [
+            "attribute",
+            "base-base",
+            "base-pluginhost",
+            "classnamemanager",
+            "event-focus",
+            "node-base",
+            "node-style"
+        ],
+        "skinnable": true
+    },
+    "widget-base-ie": {
+        "condition": {
+            "name": "widget-base-ie",
+            "trigger": "widget-base",
+            "ua": "ie"
+        },
+        "requires": [
+            "widget-base"
+        ]
+    },
+    "widget-buttons": {
+        "requires": [
+            "button-plugin",
+            "cssbutton",
+            "widget-stdmod"
+        ]
+    },
+    "widget-child": {
+        "requires": [
+            "base-build",
+            "widget"
+        ]
+    },
+    "widget-htmlparser": {
+        "requires": [
+            "widget-base"
+        ]
+    },
+    "widget-locale": {
+        "requires": [
+            "widget-base"
+        ]
+    },
+    "widget-modality": {
+        "requires": [
+            "base-build",
+            "event-outside",
+            "widget"
+        ],
+        "skinnable": true
+    },
+    "widget-parent": {
+        "requires": [
+            "arraylist",
+            "base-build",
+            "widget"
+        ]
+    },
+    "widget-position": {
+        "requires": [
+            "base-build",
+            "node-screen",
+            "widget"
+        ]
+    },
+    "widget-position-align": {
+        "requires": [
+            "widget-position"
+        ]
+    },
+    "widget-position-constrain": {
+        "requires": [
+            "widget-position"
+        ]
+    },
+    "widget-skin": {
+        "requires": [
+            "widget-base"
+        ]
+    },
+    "widget-stack": {
+        "requires": [
+            "base-build",
+            "widget"
+        ],
+        "skinnable": true
+    },
+    "widget-stdmod": {
+        "requires": [
+            "base-build",
+            "widget"
+        ]
+    },
+    "widget-uievents": {
+        "requires": [
+            "node-event-delegate",
+            "widget-base"
+        ]
+    },
+    "yql": {
+        "requires": [
+            "oop"
+        ]
+    },
+    "yql-jsonp": {
+        "condition": {
+            "name": "yql-jsonp",
+            "test": function (Y) {
+    /* Only load the JSONP module when not in nodejs or winjs
+    TODO Make the winjs module a CORS module
+    */
+    return (!Y.UA.nodejs && !Y.UA.winjs);
+},
+            "trigger": "yql",
+            "when": "after"
+        },
+        "requires": [
+            "jsonp",
+            "jsonp-url"
+        ]
+    },
+    "yql-nodejs": {
+        "condition": {
+            "name": "yql-nodejs",
+            "trigger": "yql",
+            "ua": "nodejs",
+            "when": "after"
+        }
+    },
+    "yql-winjs": {
+        "condition": {
+            "name": "yql-winjs",
+            "trigger": "yql",
+            "ua": "winjs",
+            "when": "after"
+        }
+    },
+    "yui": {},
+    "yui-base": {},
+    "yui-later": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "yui-log": {
+        "requires": [
+            "yui-base"
+        ]
+    },
+    "yui-throttle": {
+        "requires": [
+            "yui-base"
+        ]
+    }
+});
+YUI.Env[Y.version].md5 = 'fd7c67956df50e445f40d1668dd1dc80';
+
+
+}, '3.12.0', {"requires": ["loader-base"]});
+YUI.add('yui', function (Y, NAME) {}, '3.12.0', {
+    "use": [
+        "yui-base",
+        "get",
+        "features",
+        "intl-base",
+        "yui-log",
+        "yui-later",
+        "loader-base",
+        "loader-rollup",
+        "loader-yui3"
+    ]
+});
deleted file mode 100644
index 775b94c1a520c4b87f50ea78f0428594596bf7e6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/function-001.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/function-001.js
- *  ECMA Section:       15.7.2.1
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/function-001";
-var VERSION = "ECMA_2";
-var TITLE   = "RegExp( pattern, flags )";
-
-startTest();
-
-/*
- * for each test case, verify:
- * - verify that [[Class]] property is RegExp
- * - prototype property should be set to RegExp.prototype
- * - source is set to the empty string
- * - global property is set to false
- * - ignoreCase property is set to false
- * - multiline property is set to false
- * - lastIndex property is set to 0
- */
-
-RegExp.prototype.getClassProperty = Object.prototype.toString;
-var re = new RegExp();
-
-AddTestCase(
-  "new RegExp().__proto__",
-  RegExp.prototype,
-  re.__proto__
-  );
-
-test()
deleted file mode 100644
index 543e407d825bd0774882d7a098b583224079987e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/global-001.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          global-001
-   Corresponds To:     ecma/GlobalObject/15.1-1-n.js
-   ECMA Section:       The global object
-   Description:
-
-   The global object does not have a [[Construct]] property; it is not
-   possible to use the global object as a constructor with the new operator.
-
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "global-001";
-var VERSION = "ECMA_1";
-var TITLE   = "The Global Object";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = new this();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "result = new this()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 6e10384cbdb2a51a1f96e60c2a50f32c191c152d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/global-002.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          global-002
-   Corresponds To:     ecma/GlobalObject/15.1-2-n.js
-   ECMA Section:       The global object
-   Description:
-
-   The global object does not have a [[Construct]] property; it is not
-   possible to use the global object as a constructor with the new operator.
-
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "global-002";
-var VERSION = "JS1_4";
-var TITLE   = "The Global Object";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = this();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "result = this()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index f210c40d6b2cccf3877e488290f3b2568060c45a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/hex-001.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/hex-001.js
- *  ECMA Section:       15.7.3.1
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *  Positive test cases for constructing a RegExp object
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/hex-001";
-var VERSION = "ECMA_2";
-var TITLE   = "RegExp patterns that contain HexicdecimalEscapeSequences";
-
-startTest();
-
-// These examples come from 15.7.1, HexidecimalEscapeSequence
-
-AddRegExpCases( new RegExp("\x41"),  "new RegExp('\\x41')",  "A",  "A", 1, 0, ["A"] );
-AddRegExpCases( new RegExp("\x412"),"new RegExp('\\x412')", "A2", "A2", 1, 0, ["A2"] );
-
-AddRegExpCases( new RegExp("A"),  "new RegExp('A')",  "\x41",  "\\x41",  1, 0, ["A"] );
-AddRegExpCases( new RegExp("A"),  "new RegExp('A')",  "\x412", "\\x412", 1, 0, ["A"] );
-AddRegExpCases( new RegExp("^x"), "new RegExp('^x')", "x412",  "x412",   1, 0, ["x"]);
-AddRegExpCases( new RegExp("A"),  "new RegExp('A')",  "A2",    "A2",     1, 0, ["A"] );
-
-test();
-
-function AddRegExpCases(
-  regexp, str_regexp, pattern, str_pattern, length, index, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(pattern) == null || matches_array == null ) {
-    AddTestCase(
-      str_regexp + ".exec(" + pattern +")",
-      matches_array,
-      regexp.exec(pattern) );
-
-    return;
-  }
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").length",
-    length,
-    regexp.exec(pattern).length );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").index",
-    index,
-    regexp.exec(pattern).index );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").input",
-    pattern,
-    regexp.exec(pattern).input );
-
-  for ( var matches = 0; matches < matches_array.length; matches++ ) {
-    AddTestCase(
-      str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
-      matches_array[matches],
-      regexp.exec(pattern)[matches] );
-  }
-}
deleted file mode 100644
index da9cb6cb563fde67bd6e9a6a0d84b8e797b46de4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/if-001.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          if-001.js
- *  ECMA Section:
- *  Description:        The if statement
- *
- *  Verify that assignment in the if expression is evaluated correctly.
- *  Verifies the fix for bug http://scopus/bugsplat/show_bug.cgi?id=148822.
- *
- *  Author:             christine@netscape.com
- *  Date:               28 August 1998
- */
-var SECTION = "for-001";
-var VERSION = "ECMA_2";
-var TITLE   = "The if  statement";
-var BUGNUMBER="148822";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var a = 0;
-var b = 0;
-var result = "passed";
-
-if ( a = b ) {
-  result = "failed:  a = b should return 0";
-}
-
-new TestCase(
-  SECTION,
-  "if ( a = b ), where a and b are both equal to 0",
-  "passed",
-  result );
-
-
-test();
-
deleted file mode 100644
index 1f10b0947393b9930cfc8473d22aac10e1c81373..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/instanceof-001.js
+++ /dev/null
@@ -1,34 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          instanceof-1.js
-   ECMA Section:
-   Description:        instanceof operator
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "";
-var VERSION = "ECMA_2";
-var TITLE   = "instanceof operator";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var b = new Boolean();
-
-new TestCase( SECTION,
-              "var b = new Boolean(); b instanceof Boolean",
-              true,
-              b instanceof Boolean );
-
-new TestCase( SECTION,
-              "b instanceof Object",
-              true,
-              b instanceof Object );
-
-test();
deleted file mode 100644
index 293e9645539ddb3fdb5b4264e834523ea11d3b48..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/instanceof-002.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:
-   ECMA Section:
-   Description:        Call Objects
-
-
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "";
-var VERSION = "ECMA_2";
-var TITLE   = "The Call Constructor";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var b = new Boolean();
-
-new TestCase( SECTION,
-	      "var b = new Boolean(); b instanceof Boolean",
-	      true,
-	      b instanceof Boolean );
-
-new TestCase( SECTION,
-	      "b instanceof Object",
-	      true,
-	      b instanceof Object );
-
-new TestCase( SECTION,
-	      "b instanceof Array",
-	      false,
-	      b instanceof Array );
-
-new TestCase( SECTION,
-	      "true instanceof Boolean",
-	      false,
-	      true instanceof Boolean );
-
-new TestCase( SECTION,
-	      "Boolean instanceof Object",
-	      true,
-	      Boolean instanceof Object );
-test();
-
deleted file mode 100644
index 8a2e95ec8461fe1a9af1a92673cd006449f09121..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/instanceof-003-n.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          instanceof-001.js
- *  ECMA Section:       11.8.6
- *  Description:
- *
- *  RelationalExpression instanceof Identifier
- *
- *  Author:             christine@netscape.com
- *  Date:               2 September 1998
- */
-var SECTION = "instanceof-003-n";
-var VERSION = "ECMA_2";
-var TITLE   = "instanceof"
-
-  startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-function InstanceOf( object_1, object_2, expect ) {
-
-  result = object_1 instanceof object_2;
-
-  new TestCase(
-    SECTION,
-    "(" + object_1 + ") instanceof " + object_2,
-    expect,
-    result );
-}
-
-function Gen3(value) {
-  this.value = value;
-  this.generation = 3;
-  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
-}
-Gen3.name = 3;
-Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
-
-function Gen2(value) {
-  this.value = value;
-  this.generation = 2;
-}
-Gen2.name = 2;
-Gen2.prototype = new Gen3();
-
-function Gen1(value) {
-  this.value = value;
-  this.generation = 1;
-}
-Gen1.name = 1;
-Gen1.prototype = new Gen2();
-
-function Gen0(value) {
-  this.value = value;
-  this.generation = 0;
-}
-Gen0.name = 0;
-Gen0.prototype = new Gen1();
-
-
-function GenA(value) {
-  this.value = value;
-  this.generation = "A";
-  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
-
-}
-GenA.prototype = new Gen0();
-GenA.name = "A";
-
-function GenB(value) {
-  this.value = value;
-  this.generation = "B";
-  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
-}
-GenB.name = "B"
-  GenB.prototype = void 0;
-
-// Identifier is not a function
-DESCRIPTION = "Identifier is not a function";
-EXPECTED = "error";
-
-InstanceOf( true, true, "error" );
-
-test();
deleted file mode 100644
index 7c92d661ec149be7ee8db05d540e1534c00b3580..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/instanceof-003.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          instanceof-003.js
-   ECMA Section:
-   Description:        http://bugzilla.mozilla.org/show_bug.cgi?id=7635
-
-   js> function Foo() {}
-   js> theproto = {};
-   [object Object]
-   js> Foo.prototype = theproto
-   [object Object]
-   js> theproto instanceof Foo
-   true
-
-   I think this should be 'false'
-
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-   Modified to conform to ECMA3
-   https://bugzilla.mozilla.org/show_bug.cgi?id=281606
-*/
-var SECTION = "instanceof-003";
-var VERSION = "ECMA_2";
-var TITLE   = "instanceof operator";
-var BUGNUMBER ="7635";
-
-startTest();
-
-function Foo() {};
-theproto = {};
-Foo.prototype = theproto;
-
-AddTestCase(
-  "function Foo() = {}; theproto = {}; Foo.prototype = theproto; " +
-  "theproto instanceof Foo",
-  false,
-  theproto instanceof Foo );
-
-
-var o = {};
-
-// https://bugzilla.mozilla.org/show_bug.cgi?id=281606
-try
-{
-  AddTestCase(
-    "o = {}; o instanceof o",
-    "error",
-    o instanceof o );
-}
-catch(e)
-{
-  AddTestCase(
-    "o = {}; o instanceof o",
-    "error",
-    "error" );
-}
-
-test();
deleted file mode 100644
index 1d16ce0406f3c64d759a004b04af2cb0b8bdde05..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/instanceof-004-n.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          instanceof-001.js
- *  ECMA Section:       11.8.6
- *  Description:
- *
- *  RelationalExpression instanceof Identifier
- *
- *  Author:             christine@netscape.com
- *  Date:               2 September 1998
- */
-var SECTION = "instanceof-004-n";
-var VERSION = "ECMA_2";
-var TITLE   = "instanceof"
-
-  startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-function InstanceOf( object_1, object_2, expect ) {
-  result = object_1 instanceof object_2;
-
-  new TestCase(
-    SECTION,
-    "(" + object_1 + ") instanceof " + object_2,
-    expect,
-    result );
-}
-
-function Gen3(value) {
-  this.value = value;
-  this.generation = 3;
-  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
-}
-Gen3.name = 3;
-Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
-
-function Gen2(value) {
-  this.value = value;
-  this.generation = 2;
-}
-Gen2.name = 2;
-Gen2.prototype = new Gen3();
-
-function Gen1(value) {
-  this.value = value;
-  this.generation = 1;
-}
-Gen1.name = 1;
-Gen1.prototype = new Gen2();
-
-function Gen0(value) {
-  this.value = value;
-  this.generation = 0;
-}
-Gen0.name = 0;
-Gen0.prototype = new Gen1();
-
-
-function GenA(value) {
-  this.value = value;
-  this.generation = "A";
-  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
-
-}
-GenA.prototype = new Gen0();
-GenA.name = "A";
-
-function GenB(value) {
-  this.value = value;
-  this.generation = "B";
-  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
-}
-GenB.name = "B"
-  GenB.prototype = void 0;
-
-// Identifier is not a function
-
-DESCRIPTION = "Identifier is not a function";
-EXPECTED = "error";
-
-InstanceOf( new Boolean(true), false, "error" );
-
-test();
deleted file mode 100644
index 170b78ef4b53fa652b295173d353fe2dc986b9cb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/instanceof-005-n.js
+++ /dev/null
@@ -1,89 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          instanceof-001.js
- *  ECMA Section:       11.8.6
- *  Description:
- *
- *  RelationalExpression instanceof Identifier
- *
- *  Author:             christine@netscape.com
- *  Date:               2 September 1998
- */
-var SECTION = "instanceof-005-n";
-var VERSION = "ECMA_2";
-var TITLE   = "instanceof"
-
-  startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-function InstanceOf( object_1, object_2, expect ) {
-  result = object_1 instanceof object_2;
-
-  new TestCase(
-    SECTION,
-    "(" + object_1 + ") instanceof " + object_2,
-    expect,
-    result );
-}
-
-function Gen3(value) {
-  this.value = value;
-  this.generation = 3;
-  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
-}
-Gen3.name = 3;
-Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
-
-function Gen2(value) {
-  this.value = value;
-  this.generation = 2;
-}
-Gen2.name = 2;
-Gen2.prototype = new Gen3();
-
-function Gen1(value) {
-  this.value = value;
-  this.generation = 1;
-}
-Gen1.name = 1;
-Gen1.prototype = new Gen2();
-
-function Gen0(value) {
-  this.value = value;
-  this.generation = 0;
-}
-Gen0.name = 0;
-Gen0.prototype = new Gen1();
-
-
-function GenA(value) {
-  this.value = value;
-  this.generation = "A";
-  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
-
-}
-GenA.prototype = new Gen0();
-GenA.name = "A";
-
-function GenB(value) {
-  this.value = value;
-  this.generation = "B";
-  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
-}
-GenB.name = "B"
-  GenB.prototype = void 0;
-
-
-// Identifier is a function, prototype of Identifier is not an object
-
-DESCRIPTION = "Identifier is a function, prototype of Identifier is not an object";
-EXPECTED = "error";
-
-InstanceOf( new GenB(), GenB, "error" );
-
-test();
deleted file mode 100644
index 36ed72efb86a8407430d1f7ad53bb86ad9e5f2db..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/instanceof-006.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          instanceof-001.js
- *  ECMA Section:       11.8.6
- *  Description:
- *
- *  RelationalExpression instanceof Identifier
- *
- *  Author:             christine@netscape.com
- *  Date:               2 September 1998
- */
-var SECTION = "instanceof-001";
-var VERSION = "ECMA_2";
-var TITLE   = "instanceof"
-
-  startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-function InstanceOf( object_1, object_2, expect ) {
-  result = object_1 instanceof object_2;
-
-  new TestCase(
-    SECTION,
-    "(" + object_1 + ") instanceof " + object_2,
-    expect,
-    result );
-}
-
-function Gen3(value) {
-  this.value = value;
-  this.generation = 3;
-  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
-}
-Gen3.name = 3;
-Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
-
-function Gen2(value) {
-  this.value = value;
-  this.generation = 2;
-}
-Gen2.name = 2;
-Gen2.prototype = new Gen3();
-
-function Gen1(value) {
-  this.value = value;
-  this.generation = 1;
-}
-Gen1.name = 1;
-Gen1.prototype = new Gen2();
-
-function Gen0(value) {
-  this.value = value;
-  this.generation = 0;
-}
-Gen0.name = 0;
-Gen0.prototype = new Gen1();
-
-
-function GenA(value) {
-  this.value = value;
-  this.generation = "A";
-  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
-
-}
-GenA.prototype = new Gen0();
-GenA.name = "A";
-
-function GenB(value) {
-  this.value = value;
-  this.generation = "B";
-  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
-}
-GenB.name = "B"
-  GenB.prototype = void 0;
-
-// RelationalExpression is not an object.
-
-//    InstanceOf( true, Boolean, false );
-InstanceOf( new Boolean(false), Boolean, true );
-
-test();
deleted file mode 100644
index 60ae7a7dba8cabdcb3c7d264b512c4a101056d94..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/keywords-001.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:
- *  ECMA Section:
- *  Description:
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "";
-var VERSION = "ECMA_2";
-var TITLE   = "Keywords";
-
-startTest();
-
-print("This test requires option javascript.options.strict enabled");
-
-if (!options().match(/strict/))
-{
-  options('strict');
-}
-if (!options().match(/werror/))
-{
-  options('werror');
-}
-
-var result = "failed";
-
-try {
-  eval("super;");
-}
-catch (x) {
-  if (x instanceof SyntaxError)
-    result = x.name;
-}
-
-AddTestCase(
-  "using the expression \"super\" shouldn't cause js to crash",
-  "SyntaxError",
-  result );
-
-test();
deleted file mode 100644
index 92fc9e5e0842af0be46299acc7457e01809cb8e7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/label-001.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          label-001.js
- *  ECMA Section:
- *  Description:        Labeled statements
- *
- *  Labeled break and continue within a for loop.
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "label-003";
-var VERSION = "ECMA_2";
-var TITLE   = "Labeled statements";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-LabelTest(0, 0);
-LabelTest(1, 1)
-  LabelTest(-1, 1000);
-LabelTest(false,  0);
-LabelTest(true, 1);
-
-test();
-
-function LabelTest( limit, expect) {
-woo: for ( var result = 0; result < 1000; result++ ) { if (result == limit) { break woo; } else { continue woo; } };
-
-  new TestCase(
-    SECTION,
-    "break out of a labeled for loop: "+ limit,
-    expect,
-    result );
-}
-
deleted file mode 100644
index be279c14ee9375841b79828fffde80c8524098d2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/label-002.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          label-002.js
- *  ECMA Section:
- *  Description:        Labeled statements
- *
- *  Labeled break and continue within a for-in loop.
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "label-002";
-var VERSION = "ECMA_2";
-var TITLE   = "Labeled statements";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-LabelTest( { p1:"hi,", p2:" norris" }, "hi, norris", " norrishi," );
-LabelTest( { 0:"zero", 1:"one" }, "zeroone", "onezero" );
-
-LabelTest2( { p1:"hi,", p2:" norris" }, "hi,", " norris" );
-LabelTest2( { 0:"zero", 1:"one" }, "zero", "one" );
-
-test();
-
-function LabelTest( object, expect1, expect2 ) {
-  result = "";
-
-yoohoo:  { for ( property in object ) { result += object[property]; }; break yoohoo };
-
-  new TestCase(
-    SECTION,
-    "yoohoo: for ( property in object ) { result += object[property]; } break yoohoo }",
-    true,
-    result == expect1 || result == expect2 );
-}
-
-function LabelTest2( object, expect1, expect2 ) {
-  result = "";
-
-yoohoo:  { for ( property in object ) { result += object[property]; break yoohoo } }; ;
-
-  new TestCase(
-    SECTION,
-    "yoohoo: for ( property in object ) { result += object[property]; break yoohoo }}",
-    true,
-    result == expect1 || result == expect2 );
-}
-
deleted file mode 100644
index e0250521e717805f8eea014beb05fdead098fddb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/label-003.js
+++ /dev/null
@@ -1,15 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-// The colon for a labeled statement may be on a separate line.
-var x;
-label
-: {
-    x = 1;
-    break label;
-    x = 2;
-}
-assertEq(x, 1);
-reportCompare(0, 0, 'ok');
deleted file mode 100644
index 3b0f7fec00d51c7baadcbf3f817400234fbfa6ed..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-001.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-001.js
-   CorrespondsTo:      ecma/LexicalConventions/7.2.js
-   ECMA Section:       7.2 Line Terminators
-   Description:        - readability
-   - separate tokens
-   - may occur between any two tokens
-   - cannot occur within any token, not even a string
-   - affect the process of automatic semicolon insertion.
-
-   white space characters are:
-   unicode     name            formal name     string representation
-   \u000A      line feed       <LF>            \n
-   \u000D      carriage return <CR>            \r
-
-   this test uses onerror to capture line numbers.  because
-   we use on error, we can only have one test case per file.
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "lexical-001";
-var VERSION = "JS1_4";
-var TITLE   = "Line Terminators";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = eval("\r\n\expect");
-} catch ( e ) {
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "OBJECT = new Object; result = new OBJECT()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index a35cb02ca93d0ee66155349dd2938b502f697d9f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-002.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-002.js
-   Corresponds To:     ecma/LexicalConventions/7.2-3-n.js
-   ECMA Section:       7.2 Line Terminators
-   Description:        - readability
-   - separate tokens
-   - may occur between any two tokens
-   - cannot occur within any token, not even a string
-   - affect the process of automatic semicolon insertion.
-
-   white space characters are:
-   unicode     name            formal name     string representation
-   \u000A      line feed       <LF>            \n
-   \u000D      carriage return <CR>            \r
-
-   this test uses onerror to capture line numbers.  because
-   we use on error, we can only have one test case per file.
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "lexical-002";
-var VERSION = "JS1_4";
-var TITLE   = "Line Terminators";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  result = eval("\r\n\expect");
-} catch ( e ) {
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "result=eval(\"\r\nexpect\")" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 40c4dc64d15d5fe3523b20ce88417e06beb98a31..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-003.js
+++ /dev/null
@@ -1,43 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-003.js
-   Corresponds To:     7.3-13-n.js
-   ECMA Section:       7.3 Comments
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-003.js";
-var VERSION = "JS1_4";
-var TITLE   = "Comments";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("/*\n/* nested comment */\n*/\n");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "/*/*nested comment*/ */" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 4bf2d6454c9b159c9a809470fc93c9edbe30134f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-004.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-004.js
-   Corresponds To:     ecma/LexicalExpressions/7.4.1-1-n.js
-   ECMA Section:       7.4.1
-
-   Description:
-
-   Reserved words cannot be used as identifiers.
-
-   ReservedWord ::
-   Keyword
-   FutureReservedWord
-   NullLiteral
-   BooleanLiteral
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-004";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var null = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var null = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 880e4d9736188b7a93f1ba122d14c82bf32ae595..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-005.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-005.js
-   Corresponds To:     7.4.1-2.js
-   ECMA Section:       7.4.1
-
-   Description:
-
-   Reserved words cannot be used as identifiers.
-
-   ReservedWord ::
-   Keyword
-   FutureReservedWord
-   NullLiteral
-   BooleanLiteral
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-005";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("true = false;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "true = false" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 2d07274734b8b6123e3a9f62d8973e7280ee23ec..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-006.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-006.js
-   Corresponds To:     7.4.2-1.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-006";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("break = new Object();");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "break = new Object()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index a4f7be41d0ad81167a683f7eb09ff0c1be45fce2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-007.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-005.js
-   Corresponds To:     7.4.1-3-n.js
-   ECMA Section:       7.4.1
-
-   Description:
-
-   Reserved words cannot be used as identifiers.
-
-   ReservedWord ::
-   Keyword
-   FutureReservedWord
-   NullLiteral
-   BooleanLiteral
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-005";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("false = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "false = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index ac103a3ae5603a82d77f9e95301a3f3687c9ab72..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-008.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-008.js
-   Corresponds To:     7.4.3-1-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-008.js";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("case = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "case = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 952fefbd972d4c9dadfe711f0ddb459b3cfc6646..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-009.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-009
-   Corresponds To:     7.4.3-2-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-009";
-var VERSION = "ECMA_1";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("debugger = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "debugger = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 717f1822c139d32948285e3eb11cf43730c64219..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-011.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-011.js
-   Corresponds To:     7.4.3-4-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-011";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-print("This test requires option javascript.options.strict enabled");
-
-if (!options().match(/strict/))
-{
-  options('strict');
-}
-if (!options().match(/werror/))
-{
-  options('werror');
-}
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("super = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "super = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 7f55206ac98ead7d1b534cc3b8097ba0cc857150..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-012.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-012.js
-   Corresponds To:     7.4.3-5-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-012";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("catch = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "catch = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index ce63ba5c86efc04e7eecdf0b94e8ade1d1412285..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-013.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-013.js
-   Corresponds To:     7.4.3-6-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-013";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("default = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "default = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index eb56f5bb305454b7b6540363a66a23415a134977..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-014.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-014.js
-   Corresponds To:     7.4.3-7-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-014.js";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-print("This test requires option javascript.options.strict enabled");
-
-if (!options().match(/strict/))
-{
-  options('strict');
-}
-if (!options().match(/werror/))
-{
-  options('werror');
-}
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("extends = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "extends = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index c0d1fe40b62679d11a87731c0431a171da147b81..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-015.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-015.js
-   Corresponds To:     7.4.3-8-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-015";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("switch = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "switch = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 8c60e0ac54f0169e8a138683c23dd4c6fbe13aae..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-016.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-016
-   Corresponds To:     7.4.3-9-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-016";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-print("This test requires option javascript.options.strict enabled");
-
-if (!options().match(/strict/))
-{
-  options('strict');
-}
-if (!options().match(/werror/))
-{
-  options('werror');
-}
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("class = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "class = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index a1e0e6e591981f371c016327a719040ea662e56b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-017.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-017.js
-   Corresponds To:     7.4.3-10-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-017";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("do = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "do = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
-
deleted file mode 100644
index 8d7deb8b9cf35de802a770077a28cf6eb5c561f6..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-018.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-018
-   Corresponds To:     7.4.3-11-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-018";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("finally = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "finally = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index ba6774fe3e5fc5665750170f4b008a5f4149a678..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-019.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-019.js
-   Corresponds To:     7.4.3-12-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-019";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("throw = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "throw = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index bd74082c9a61646f63217d75f6546cf7219be058..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-020.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-020.js
-   Corresponds To      7.4.3-13-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-020";
-var VERSION = "JS1_4";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("const = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "const = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index dd38b63a2dd7367fbd80008b2ee8adf3d1780f4c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-021.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-021.js
-   Corresponds To:     7.4.3-14-n.js
-   ECMA Section:       7.4.3
-
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-021.js";
-var VERSION = "ECMA_1";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-print("This test requires option javascript.options.strict enabled");
-
-if (!options().match(/strict/))
-{
-  options('strict');
-}
-if (!options().match(/werror/))
-{
-  options('werror');
-}
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("enum = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "enum = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 39a9aca701bbc3d9a58b34e8d969317678588c8c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-023.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-023.js
-   Corresponds To:     7.4.3-16-n.js
-   ECMA Section:       7.4.3
-   Description:
-   The following words are used as keywords in proposed extensions and are
-   therefore reserved to allow for the possibility of future adoption of
-   those extensions.
-
-   FutureReservedWord :: one of
-   case    debugger    export      super
-   catch   default     extends     switch
-   class   do          finally     throw
-   const   enum        import      try
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "lexical-023.js";
-var VERSION = "ECMA_1";
-var TITLE   = "Future Reserved Words";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("try = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "try = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 8f4f5a90348a177c7c5cba6a82810807d58b4897..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-024.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-024
-   Corresponds To:     7.4.2-1-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-024";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var break;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var break" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index aa3e59877d2d36190013e5c81bbe26e6788c4ccc..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-025.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-025.js
-   Corresponds To      7.4.2-2-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-025";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var for;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var for" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 3b5d230297eedf3465f14241743b49ac850a6f97..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-026.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-026.js
-   Corresponds To:     7.4.2-3-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-026";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var new;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var new" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index a29bed12aad5bc0fb704cec2979e99b70ceab20b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-027.js
+++ /dev/null
@@ -1,61 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-027.js
-   Corresponds To:     7.4.2-4-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   var
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-027";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var var;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var var" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index c0ef34a00cd7dc9ef0be23f44e5881c58730a81c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-028.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-028.js
-   Corresponds To:     7.4.2-5-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-028";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var continue=true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var continue=true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index e79fe5f1e264706967fda0b39ca45ed95ed1a421..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-029.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-029.js
-   Corresponds To:     7.4.2-6.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-029";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var function = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var function = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 5acef3d410c14f60d5cfee0f2fcd7cfb927a6454..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-030.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-030.js
-   Corresponds To:     7.4.2-7-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-030";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var return = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var return = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 7430834e08b2cc23a5dd02dcfb08977b35171ad8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-031.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-031.js
-   Corresponds To:     7.4.2-8-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-031";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var return;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var return" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index daa962e4b9521b9b21242cef03fc1ccbd31478cb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-032.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-032.js
-   Corresponds To:     7.4.2-9-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-032";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("delete = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "delete = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 079b441d7d92d9bda3abdc532708fa3a534cbf2c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-033.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-033.js
-   Corresponds To:     7.4.2-10.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-033";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("if = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "if = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index b3278d53d2172070ca4eb24cb0e59065c638ef6c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-034.js
+++ /dev/null
@@ -1,58 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          7.4.2-11-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-034";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("this = true");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "this = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index b5015535d3c6013bfb084d5cf5c3d7d0f8af230b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-035.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-035.js
-   Correpsonds To:     7.4.2-12-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-035";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var while");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var while" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 5836694ee868559f4d00ebb8d6c62420f5e35786..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-036.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-036.js
-   Corresponds To:     7.4.2-13-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-036";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("else = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "else = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index ff6c26bf64799bfc29ef046af0103552d987b619..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-037.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-037.js
-   Corresponds To:     7.4.2-14-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-028";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var in;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var in" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index a490d4fc7b2a0a911f741538856a303b4d7405fe..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-038.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-038.js
-   Corresponds To:     7.4.2-15-n.js
-   ECMA Section:       7.4.2
-
-   Description:
-   The following tokens are ECMAScript keywords and may not be used as
-   identifiers in ECMAScript programs.
-
-   Syntax
-
-   Keyword :: one of
-   break          for         new         var
-   continue       function    return      void
-   delete         if          this        while
-   else           in          typeof      with
-
-   This test verifies that the keyword cannot be used as an identifier.
-   Functioinal tests of the keyword may be found in the section corresponding
-   to the function of the keyword.
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-
-*/
-var SECTION = "lexical-038";
-var VERSION = "JS1_4";
-var TITLE   = "Keywords";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("typeof = true;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "typeof = true" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index dfc706264557637de7d73d1fc86684715e547538..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-039.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-039
-   Corresponds To:     7.5-2-n.js
-   ECMA Section:       7.5 Identifiers
-   Description:        Identifiers are of unlimited length
-   - can contain letters, a decimal digit, _, or $
-   - the first character cannot be a decimal digit
-   - identifiers are case sensitive
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "lexical-039";
-var VERSION = "JS1_4";
-var TITLE   = "Identifiers";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var 0abc;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var 0abc" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index fd39cc1f252e5610d90e799b96fe785fa68aa89f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-040.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-040.js
-   Corresponds To:     7.5-2.js
-   ECMA Section:       7.5 Identifiers
-   Description:        Identifiers are of unlimited length
-   - can contain letters, a decimal digit, _, or $
-   - the first character cannot be a decimal digit
-   - identifiers are case sensitive
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "lexical-040";
-var VERSION = "JS1_4";
-var TITLE   = "Identifiers";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var 1abc;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var 1abc" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 57264e20375fcc7abebb470b315ba9b4ea819bc2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-041.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-041.js
-   Corresponds To:     7.5-8-n.js
-   ECMA Section:       7.5 Identifiers
-   Description:        Identifiers are of unlimited length
-   - can contain letters, a decimal digit, _, or $
-   - the first character cannot be a decimal digit
-   - identifiers are case sensitive
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "lexical-041";
-var VERSION = "ECMA_1";
-var TITLE   = "Identifiers";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var @abc;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var @abc" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 47f879d5daebdd7c53c0be93ff95dd359160a195..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-042.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-042.js
-   Corresponds To:     7.5-9-n.js
-   ECMA Section:       7.5 Identifiers
-   Description:        Identifiers are of unlimited length
-   - can contain letters, a decimal digit, _, or $
-   - the first character cannot be a decimal digit
-   - identifiers are case sensitive
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "lexical-042";
-var VERSION = "JS1_4";
-var TITLE   = "Identifiers";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("var 123;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "var 123" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 483ce6f420cb1da7077a22bf97bcdeab264f2ae7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-047.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-047.js
-   Corresponds To:     7.8.1-7-n.js
-   ECMA Section:       7.8.1
-   Description:
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-
-var SECTION = "lexical-047";
-var VERSION = "JS1_4";
-var TITLE   = "for loops";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var counter = 0;
-  eval("for ( counter = 0\n"
-       + "counter <= 1\n"
-       + "counter++ )\n"
-       + "{\n"
-       + "result += \":  got to inner loop\";\n"
-       + "}\n");
-
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "line breaks within a for expression" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 5db347b431af79b0b2aba67c99009649ac9c0eb2..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-048.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-048.js
-   Corresponds To:     7.8.1-1.js
-   ECMA Section:       7.8.1 Rules of Automatic Semicolon Insertion
-   Description:
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-
-var SECTION = "lexical-048";
-var VERSION = "JS1_4";
-var TITLE   = "The Rules of Automatic Semicolon Insertion";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var counter = 0;
-  eval( "for ( counter = 0;\ncounter <= 1\ncounter++ ) {\nresult += \": got inside for loop\")");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "line breaks within a for expression" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 53d2a5856246e0912b2898833835b739ee172a49..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-049.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-049
-   Corresponds To:     7.8.1-1.js
-   ECMA Section:       7.8.1 Rules of Automatic Semicolon Insertioin
-   Description:
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-var SECTION = "lexical-049";
-var VERSION = "JS1_4";
-var TITLE   = "The Rules of Automatic Semicolon Insertion";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var counter = 0;
-  eval("for ( counter = 0\n"
-       + "counter <= 1;\n"
-       + "counter++ )\n"
-       + "{\n"
-       + "result += \": got inside for loop\";\n"
-       + "}\n");
-
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "line breaks within a for expression" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 38c0cbdcfdefdad1ccbf659d1cf6cfe938e78830..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-050.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-050.js
-   Corresponds to:     7.8.2-1-n.js
-   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
-   Description:        compare some specific examples of the automatic
-   insertion rules in the EMCA specification.
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-
-var SECTION = "lexical-050";
-var VERSION = "JS1_4";
-var TITLE   = "Examples of Automatic Semicolon Insertion";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("{ 1 2 } 3");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "{ 1 2 } 3" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
-
deleted file mode 100644
index fa840f33e0af9c2ca316c15c9a39b9a7cc395288..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-051.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-051.js
-   Corresponds to:     7.8.2-3-n.js
-   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
-   Description:        compare some specific examples of the automatic
-   insertion rules in the EMCA specification.
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-
-var SECTION = "lexical-051";
-var VERSION = "JS1_4";
-var TITLE   = "Examples of Automatic Semicolon Insertion";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("for (a; b\n) result += \": got to inner loop\";")
-    } catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "for (a; b\n)" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
-
deleted file mode 100644
index 02ce208c76af3d0eead046fe47aa23d7891667b3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-052.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-052.js
-   Corresponds to:     7.8.2-4-n.js
-   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
-   Description:        compare some specific examples of the automatic
-   insertion rules in the EMCA specification.
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-
-var SECTION = "lexical-052";
-var VERSION = "JS1_4";
-var TITLE   = "Examples of Automatic Semicolon Insertion";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  MyFunction();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "calling return indirectly" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function MyFunction() {
-  var s = "return";
-  eval(s);
-}
deleted file mode 100644
index 10394859b5cf6c6e27b63f679536519ccf1d4d6e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-053.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-053.js
-   Corresponds to:     7.8.2-7-n.js
-   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
-   Description:        compare some specific examples of the automatic
-   insertion rules in the EMCA specification.
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-
-var SECTION = "lexical-053";
-var VERSION = "JS1_4";
-var TITLE   = "Examples of Automatic Semicolon Insertion";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  a = true
-    b = false
-
-    eval('if (a > b)\nelse result += ": got to else statement"');
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "calling return indirectly" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 142d4f35c604634dec18f9fcb4536e533cf7b326..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/lexical-054.js
+++ /dev/null
@@ -1,46 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          lexical-054.js
-   Corresponds to:     7.8.2-7-n.js
-   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
-   Description:        compare some specific examples of the automatic
-   insertion rules in the EMCA specification.
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-
-var SECTION = "lexical-054";
-var VERSION = "JS1_4";
-var TITLE   = "Examples of Automatic Semicolon Insertion";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  a=0;
-  b=1;
-  c=2;
-  d=3;
-  eval("if (a > b)\nelse c = d");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "if (a > b)\nelse c = d" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 075236aa2fd129bbe9720356786f53abaf21b32f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/match-001.js
+++ /dev/null
@@ -1,106 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          String/match-001.js
- *  ECMA Section:       15.6.4.9
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-
-/*
- *  String.match( regexp )
- *
- *  If regexp is not an object of type RegExp, it is replaced with result
- *  of the expression new RegExp(regexp). Let string denote the result of
- *  converting the this value to a string.  If regexp.global is false,
- *  return the result obtained by invoking RegExp.prototype.exec (see
- *  section 15.7.5.3) on regexp with string as parameter.
- *
- *  Otherwise, set the regexp.lastIndex property to 0 and invoke
- *  RegExp.prototype.exec repeatedly until there is no match. If there is a
- *  match with an empty string (in other words, if the value of
- *  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
- *  The value returned is an array with the properties 0 through n-1
- *  corresponding to the first element of the result of each matching
- *  invocation of RegExp.prototype.exec.
- *
- *  Note that the match function is intentionally generic; it does not
- *  require that its this value be a string object.  Therefore, it can be
- *  transferred to other kinds of objects for use as a method.
- */
-
-var SECTION = "String/match-001.js";
-var VERSION = "ECMA_2";
-var TITLE   = "String.prototype.match( regexp )";
-
-startTest();
-
-// the regexp argument is not a RegExp object
-// this is not a string object
-
-// cases in which the regexp global property is false
-
-AddRegExpCases( 3, "3",   "1234567890", 1, 2, ["3"] );
-
-// cases in which the regexp object global property is true
-
-AddGlobalRegExpCases( /34/g, "/34/g", "343443444",  3, ["34", "34", "34"] );
-AddGlobalRegExpCases( /\d{1}/g,  "/d{1}/g",  "123456abcde7890", 10,
-		      ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] );
-
-AddGlobalRegExpCases( /\d{2}/g,  "/d{2}/g",  "123456abcde7890", 5,
-		      ["12", "34", "56", "78", "90"] );
-
-AddGlobalRegExpCases( /\D{2}/g,  "/d{2}/g",  "123456abcde7890", 2,
-		      ["ab", "cd"] );
-
-test();
-
-
-function AddRegExpCases(
-  regexp, str_regexp, string, length, index, matches_array ) {
-
-  AddTestCase(
-    "( " + string  + " ).match(" + str_regexp +").length",
-    length,
-    string.match(regexp).length );
-
-  AddTestCase(
-    "( " + string + " ).match(" + str_regexp +").index",
-    index,
-    string.match(regexp).index );
-
-  AddTestCase(
-    "( " + string + " ).match(" + str_regexp +").input",
-    string,
-    string.match(regexp).input );
-
-  for ( var matches = 0; matches < matches_array.length; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
-      matches_array[matches],
-      string.match(regexp)[matches] );
-  }
-}
-
-function AddGlobalRegExpCases(
-  regexp, str_regexp, string, length, matches_array ) {
-
-  AddTestCase(
-    "( " + string  + " ).match(" + str_regexp +").length",
-    length,
-    string.match(regexp).length );
-
-  for ( var matches = 0; matches < matches_array.length; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
-      matches_array[matches],
-      string.match(regexp)[matches] );
-  }
-}
deleted file mode 100644
index 772363013e947c229d2d07748285db83a20ccd66..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/match-002.js
+++ /dev/null
@@ -1,174 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          String/match-002.js
- *  ECMA Section:       15.6.4.9
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-
-/*
- *  String.match( regexp )
- *
- *  If regexp is not an object of type RegExp, it is replaced with result
- *  of the expression new RegExp(regexp). Let string denote the result of
- *  converting the this value to a string.  If regexp.global is false,
- *  return the result obtained by invoking RegExp.prototype.exec (see
- *  section 15.7.5.3) on regexp with string as parameter.
- *
- *  Otherwise, set the regexp.lastIndex property to 0 and invoke
- *  RegExp.prototype.exec repeatedly until there is no match. If there is a
- *  match with an empty string (in other words, if the value of
- *  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
- *  The value returned is an array with the properties 0 through n-1
- *  corresponding to the first element of the result of each matching
- *  invocation of RegExp.prototype.exec.
- *
- *  Note that the match function is intentionally generic; it does not
- *  require that its this value be a string object.  Therefore, it can be
- *  transferred to other kinds of objects for use as a method.
- *
- *  This file tests cases in which regexp.global is false.  Therefore,
- *  results should behave as regexp.exec with string passed as a parameter.
- *
- */
-
-var SECTION = "String/match-002.js";
-var VERSION = "ECMA_2";
-var TITLE   = "String.prototype.match( regexp )";
-
-startTest();
-
-// the regexp argument is not a RegExp object
-// this is not a string object
-
-AddRegExpCases( /([\d]{5})([-\ ]?[\d]{4})?$/,
-		"/([\d]{5})([-\ ]?[\d]{4})?$/",
-		"Boston, Mass. 02134",
-		14,
-		["02134", "02134", undefined]);
-
-AddGlobalRegExpCases( /([\d]{5})([-\ ]?[\d]{4})?$/g,
-		      "/([\d]{5})([-\ ]?[\d]{4})?$/g",
-		      "Boston, Mass. 02134",
-		      ["02134"]);
-
-// set the value of lastIndex
-re = /([\d]{5})([-\ ]?[\d]{4})?$/;
-re.lastIndex = 0;
-
-s = "Boston, MA 02134";
-
-AddRegExpCases( re,
-		"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex =0",
-		s,
-		s.lastIndexOf("0"),
-		["02134", "02134", undefined]);
-
-
-re.lastIndex = s.length;
-
-AddRegExpCases( re,
-		"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
-		s.length,
-		s,
-		s.lastIndexOf("0"),
-		["02134", "02134", undefined] );
-
-re.lastIndex = s.lastIndexOf("0");
-
-AddRegExpCases( re,
-		"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
-		s.lastIndexOf("0"),
-		s,
-		s.lastIndexOf("0"),
-		["02134", "02134", undefined]);
-
-re.lastIndex = s.lastIndexOf("0") + 1;
-
-AddRegExpCases( re,
-		"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
-		s.lastIndexOf("0") +1,
-		s,
-		s.lastIndexOf("0"),
-		["02134", "02134", undefined]);
-
-test();
-
-function AddRegExpCases(
-  regexp, str_regexp, string, index, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(string) == null || matches_array == null ) {
-    AddTestCase(
-      string + ".match(" + regexp +")",
-      matches_array,
-      string.match(regexp) );
-
-    return;
-  }
-
-  AddTestCase(
-    "( " + string  + " ).match(" + str_regexp +").length",
-    matches_array.length,
-    string.match(regexp).length );
-
-  AddTestCase(
-    "( " + string + " ).match(" + str_regexp +").index",
-    index,
-    string.match(regexp).index );
-
-  AddTestCase(
-    "( " + string + " ).match(" + str_regexp +").input",
-    string,
-    string.match(regexp).input );
-
-  var limit = matches_array.length > string.match(regexp).length ?
-    matches_array.length :
-    string.match(regexp).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
-      matches_array[matches],
-      string.match(regexp)[matches] );
-  }
-}
-
-function AddGlobalRegExpCases(
-  regexp, str_regexp, string, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(string) == null || matches_array == null ) {
-    AddTestCase(
-      regexp + ".exec(" + string +")",
-      matches_array,
-      regexp.exec(string) );
-
-    return;
-  }
-
-  AddTestCase(
-    "( " + string  + " ).match(" + str_regexp +").length",
-    matches_array.length,
-    string.match(regexp).length );
-
-  var limit = matches_array.length > string.match(regexp).length ?
-    matches_array.length :
-    string.match(regexp).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
-      matches_array[matches],
-      string.match(regexp)[matches] );
-  }
-}
deleted file mode 100644
index 1422b2f79d54876b0c68d87ce4a3a885164ec239..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/match-003.js
+++ /dev/null
@@ -1,132 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          String/match-003.js
- *  ECMA Section:       15.6.4.9
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-
-/*
- *  String.match( regexp )
- *
- *  If regexp is not an object of type RegExp, it is replaced with result
- *  of the expression new RegExp(regexp). Let string denote the result of
- *  converting the this value to a string.  If regexp.global is false,
- *  return the result obtained by invoking RegExp.prototype.exec (see
- *  section 15.7.5.3) on regexp with string as parameter.
- *
- *  Otherwise, set the regexp.lastIndex property to 0 and invoke
- *  RegExp.prototype.exec repeatedly until there is no match. If there is a
- *  match with an empty string (in other words, if the value of
- *  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
- *  The value returned is an array with the properties 0 through n-1
- *  corresponding to the first element of the result of each matching
- *  invocation of RegExp.prototype.exec.
- *
- *  Note that the match function is intentionally generic; it does not
- *  require that its this value be a string object.  Therefore, it can be
- *  transferred to other kinds of objects for use as a method.
- */
-
-var SECTION = "String/match-003.js";
-var VERSION = "ECMA_2";
-var TITLE   = "String.prototype.match( regexp )";
-
-startTest();
-
-// the regexp argument is not a RegExp object
-// this is not a string object
-
-
-//  [if regexp.global is true] set the regexp.lastIndex property to 0 and
-//  invoke RegExp.prototype.exec repeatedly until there is no match. If
-//  there is a match with an empty string (in other words, if the value of
-//  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
-//  The value returned is an array with the properties 0 through n-1
-//  corresponding to the first element of the result of each matching invocation
-//  of RegExp.prototype.exec.
-
-
-// set the value of lastIndex
-re = /([\d]{5})([-\ ]?[\d]{4})?$/g;
-
-
-s = "Boston, MA 02134";
-
-AddGlobalRegExpCases( re,
-		      "re = " + re,
-		      s,
-		      ["02134" ]);
-
-re.lastIndex = 0;
-
-AddGlobalRegExpCases(
-  re,
-  "re = " + re + "; re.lastIndex = 0 ",
-  s,
-  ["02134"]);
-
-
-re.lastIndex = s.length;
-
-AddGlobalRegExpCases(
-  re,
-  "re = " + re + "; re.lastIndex = " + s.length,
-  s,
-  ["02134"] );
-
-re.lastIndex = s.lastIndexOf("0");
-
-AddGlobalRegExpCases(
-  re,
-  "re = "+ re +"; re.lastIndex = " + s.lastIndexOf("0"),
-  s,
-  ["02134"]);
-
-re.lastIndex = s.lastIndexOf("0") + 1;
-
-AddGlobalRegExpCases(
-  re,
-  "re = " +re+ "; re.lastIndex = " + (s.lastIndexOf("0") +1),
-  s,
-  ["02134"]);
-
-test();
-
-function AddGlobalRegExpCases(
-  regexp, str_regexp, string, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( string.match(regexp) == null || matches_array == null ) {
-    AddTestCase(
-      string + ".match(" + str_regexp +")",
-      matches_array,
-      string.match(regexp) );
-
-    return;
-  }
-
-  AddTestCase(
-    "( " + string  + " ).match(" + str_regexp +").length",
-    matches_array.length,
-    string.match(regexp).length );
-
-  var limit = matches_array.length > string.match(regexp).length ?
-    matches_array.length :
-    string.match(regexp).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
-      matches_array[matches],
-      string.match(regexp)[matches] );
-  }
-}
deleted file mode 100644
index 7643a2be422b5fb00c3c86ab6126240c46eb3ec8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/match-004.js
+++ /dev/null
@@ -1,173 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          String/match-004.js
- *  ECMA Section:       15.6.4.9
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-
-/*
- *  String.match( regexp )
- *
- *  If regexp is not an object of type RegExp, it is replaced with result
- *  of the expression new RegExp(regexp). Let string denote the result of
- *  converting the this value to a string.  If regexp.global is false,
- *  return the result obtained by invoking RegExp.prototype.exec (see
- *  section 15.7.5.3) on regexp with string as parameter.
- *
- *  Otherwise, set the regexp.lastIndex property to 0 and invoke
- *  RegExp.prototype.exec repeatedly until there is no match. If there is a
- *  match with an empty string (in other words, if the value of
- *  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
- *  The value returned is an array with the properties 0 through n-1
- *  corresponding to the first element of the result of each matching
- *  invocation of RegExp.prototype.exec.
- *
- *  Note that the match function is intentionally generic; it does not
- *  require that its this value be a string object.  Therefore, it can be
- *  transferred to other kinds of objects for use as a method.
- *
- *
- *  The match function should be intentionally generic, and not require
- *  this to be a string.
- *
- */
-
-var SECTION = "String/match-004.js";
-var VERSION = "ECMA_2";
-var TITLE   = "String.prototype.match( regexp )";
-
-var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=345818";
-
-startTest();
-
-// set the value of lastIndex
-re = /0./;
-s = 10203040506070809000;
-
-Number.prototype.match = String.prototype.match;
-
-AddRegExpCases(  re,
-		 "re = " + re ,
-		 s,
-		 String(s),
-		 1,
-		 ["02"]);
-
-
-re.lastIndex = 0;
-AddRegExpCases(  re,
-		 "re = " + re +" [lastIndex is " + re.lastIndex+"]",
-		 s,
-		 String(s),
-		 1,
-		 ["02"]);
-/*
-
-re.lastIndex = s.length;
-
-AddRegExpCases( re,
-"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
-s.length,
-s,
-s.lastIndexOf("0"),
-null );
-
-re.lastIndex = s.lastIndexOf("0");
-
-AddRegExpCases( re,
-"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
-s.lastIndexOf("0"),
-s,
-s.lastIndexOf("0"),
-["02134"]);
-
-re.lastIndex = s.lastIndexOf("0") + 1;
-
-AddRegExpCases( re,
-"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
-s.lastIndexOf("0") +1,
-s,
-0,
-null);
-*/
-test();
-
-function AddRegExpCases(
-  regexp, str_regexp, string, str_string, index, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(string) == null || matches_array == null ) {
-    AddTestCase(
-      string + ".match(" + regexp +")",
-      matches_array,
-      string.match(regexp) );
-
-    return;
-  }
-
-  AddTestCase(
-    "( " + string  + " ).match(" + str_regexp +").length",
-    matches_array.length,
-    string.match(regexp).length );
-
-  AddTestCase(
-    "( " + string + " ).match(" + str_regexp +").index",
-    index,
-    string.match(regexp).index );
-
-  AddTestCase(
-    "( " + string + " ).match(" + str_regexp +").input",
-    str_string,
-    string.match(regexp).input );
-
-  var limit = matches_array.length > string.match(regexp).length ?
-    matches_array.length :
-    string.match(regexp).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
-      matches_array[matches],
-      string.match(regexp)[matches] );
-  }
-}
-
-function AddGlobalRegExpCases(
-  regexp, str_regexp, string, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(string) == null || matches_array == null ) {
-    AddTestCase(
-      regexp + ".exec(" + string +")",
-      matches_array,
-      regexp.exec(string) );
-
-    return;
-  }
-
-  AddTestCase(
-    "( " + string  + " ).match(" + str_regexp +").length",
-    matches_array.length,
-    string.match(regexp).length );
-
-  var limit = matches_array.length > string.match(regexp).length ?
-    matches_array.length :
-    string.match(regexp).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
-      matches_array[matches],
-      string.match(regexp)[matches] );
-  }
-}
deleted file mode 100644
index 7c56b53f6e51409086a4a9ce792fdc20db17512e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/multiline-001.js
+++ /dev/null
@@ -1,68 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/multiline-001.js
- *  ECMA Section:
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Date:               19 February 1999
- */
-
-var SECTION = "RegExp/multiline-001";
-var VERSION = "ECMA_2";
-var TITLE   = "RegExp: multiline flag";
-var BUGNUMBER="343901";
-
-startTest();
-
-var woodpeckers = "ivory-billed\ndowny\nhairy\nacorn\nyellow-bellied sapsucker\n" +
-  "northern flicker\npileated\n";
-
-AddRegExpCases( /.*[y]$/m, woodpeckers, woodpeckers.indexOf("downy"), ["downy"] );
-
-AddRegExpCases( /.*[d]$/m, woodpeckers, woodpeckers.indexOf("ivory-billed"), ["ivory-billed"] );
-
-test();
-
-
-function AddRegExpCases
-( regexp, pattern, index, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(pattern) == null || matches_array == null ) {
-    AddTestCase(
-      regexp + ".exec(" + pattern +")",
-      matches_array,
-      regexp.exec(pattern) );
-
-    return;
-  }
-
-  AddTestCase(
-    regexp.toString() + ".exec(" + pattern +").length",
-    matches_array.length,
-    regexp.exec(pattern).length );
-
-  AddTestCase(
-    regexp.toString() + ".exec(" + pattern +").index",
-    index,
-    regexp.exec(pattern).index );
-
-  AddTestCase(
-    regexp + ".exec(" + pattern +").input",
-    pattern,
-    regexp.exec(pattern).input );
-
-
-  for ( var matches = 0; matches < matches_array.length; matches++ ) {
-    AddTestCase(
-      regexp + ".exec(" + pattern +")[" + matches +"]",
-      matches_array[matches],
-      regexp.exec(pattern)[matches] );
-  }
-}
deleted file mode 100644
index dea41480451cab95c845c9b34c4344105c50df6e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/number-001.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          number-001
-   Corresponds To:     15.7.4.2-2-n.js
-   ECMA Section:       15.7.4.2.2 Number.prototype.toString()
-   Description:
-   If the radix is the number 10 or not supplied, then this number value is
-   given as an argument to the ToString operator; the resulting string value
-   is returned.
-
-   If the radix is supplied and is an integer from 2 to 36, but not 10, the
-   result is a string, the choice of which is implementation dependent.
-
-   The toString function is not generic; it generates a runtime error if its
-   this value is not a Number object. Therefore it cannot be transferred to
-   other kinds of objects for use as a method.
-
-   Author:             christine@netscape.com
-   Date:               16 september 1997
-*/
-var SECTION = "number-001";
-var VERSION = "JS1_4";
-var TITLE   = "Exceptions for Number.toString()";
-
-startTest();
-writeHeaderToLog( SECTION + " Number.prototype.toString()");
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  object= new Object();
-  object.toString = Number.prototype.toString;
-  result = object.toString();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "object = new Object(); object.toString = Number.prototype.toString; object.toString()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index f8d2838668daf7c2e2ac2b28f07eb990cd1308b8..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/number-002.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          number-002.js
-   Corresponds To:     ecma/Number/15.7.4.3-2-n.js
-   ECMA Section:       15.7.4.3.1 Number.prototype.valueOf()
-   Description:
-   Returns this number value.
-
-   The valueOf function is not generic; it generates a runtime error if its
-   this value is not a Number object. Therefore it cannot be transferred to
-   other kinds of objects for use as a method.
-
-   Author:             christine@netscape.com
-   Date:               16 september 1997
-*/
-var SECTION = "number-002";
-var VERSION = "JS1_4";
-var TITLE   = "Exceptions for Number.valueOf()";
-
-startTest();
-writeHeaderToLog( SECTION + " Number.prototype.valueOf()");
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  object= new Object();
-  object.toString = Number.prototype.valueOf;
-  result = object.toString();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "object = new Object(); object.valueOf = Number.prototype.valueOf; object.valueOf()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index 5ff1d672080e763d18823bad698a60f83ae84427..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/number-003.js
+++ /dev/null
@@ -1,50 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          number-003.js
-   Corresponds To:     15.7.4.3-3.js
-   ECMA Section:       15.7.4.3.1 Number.prototype.valueOf()
-   Description:
-   Returns this number value.
-
-   The valueOf function is not generic; it generates a runtime error if its
-   this value is not a Number object. Therefore it cannot be transferred to
-   other kinds of objects for use as a method.
-
-   Author:             christine@netscape.com
-   Date:               16 september 1997
-*/
-var SECTION = "number-003";
-var VERSION = "JS1_4";
-var TITLE   = "Exceptions for Number.valueOf()";
-
-startTest();
-writeHeaderToLog( SECTION + " Number.prototype.valueOf()");
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  VALUE_OF = Number.prototype.valueOf;
-  OBJECT = new String("Infinity");
-  OBJECT.valueOf = VALUE_OF;
-  result = OBJECT.valueOf();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "Assigning Number.prototype.valueOf as the valueOf of a String object " +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 5a3c602eecff39f4a9601c03641763c38a7e88cd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/octal-001.js
+++ /dev/null
@@ -1,78 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/octal-001.js
- *  ECMA Section:       15.7.1
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *  Simple test cases for matching OctalEscapeSequences.
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/octal-001.js";
-var VERSION = "ECMA_2";
-var TITLE   = "RegExp patterns that contain OctalEscapeSequences";
-var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346196";
-
-startTest();
-
-
-// backreference
-AddRegExpCases(
-  /(.)\1/,
-  "/(.)\\1/",
-  "HI!!",
-  "HI!",
-  2,
-  ["!!", "!"] );
-
-test();
-
-function AddRegExpCases(
-  regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(pattern) == null || matches_array == null ) {
-    AddTestCase(
-      regexp + ".exec(" + str_pattern +")",
-      matches_array,
-      regexp.exec(pattern) );
-
-    return;
-  }
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").length",
-    matches_array.length,
-    regexp.exec(pattern).length );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").index",
-    index,
-    regexp.exec(pattern).index );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").input",
-    pattern,
-    regexp.exec(pattern).input );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").toString()",
-    matches_array.toString(),
-    regexp.exec(pattern).toString() );
-/*
-  var limit = matches_array.length > regexp.exec(pattern).length
-  ? matches_array.length
-  : regexp.exec(pattern).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-  AddTestCase(
-  str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
-  matches_array[matches],
-  regexp.exec(pattern)[matches] );
-  }
-*/
-}
deleted file mode 100644
index 3a42bcc33bef51ac10902d1b4981c354cb25073a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/octal-002.js
+++ /dev/null
@@ -1,93 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/octal-002.js
- *  ECMA Section:       15.7.1
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *  Simple test cases for matching OctalEscapeSequences.
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/octal-002.js";
-var VERSION = "ECMA_2";
-var TITLE   = "RegExp patterns that contain OctalEscapeSequences";
-var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346189";
-
-startTest();
-
-// backreference
-AddRegExpCases(
-  /(.)(.)(.)(.)(.)(.)(.)(.)\8/,
-  "/(.)(.)(.)(.)(.)(.)(.)(.)\\8",
-  "aabbccaaabbbccc",
-  "aabbccaaabbbccc",
-  0,
-  ["aabbccaaa", "a", "a", "b", "b", "c", "c", "a", "a"] );
-
-AddRegExpCases(
-  /(.)(.)(.)(.)(.)(.)(.)(.)(.)\9/,
-  "/(.)(.)(.)(.)(.)(.)(.)(.)\\9",
-  "aabbccaabbcc",
-  "aabbccaabbcc",
-  0,
-  ["aabbccaabb", "a", "a", "b", "b", "c", "c", "a", "a", "b"] );
-
-AddRegExpCases(
-  /(.)(.)(.)(.)(.)(.)(.)(.)(.)\8/,
-  "/(.)(.)(.)(.)(.)(.)(.)(.)(.)\\8",
-  "aabbccaababcc",
-  "aabbccaababcc",
-  0,
-  ["aabbccaaba", "a", "a", "b", "b", "c", "c", "a", "a", "b"] );
-
-test();
-
-function AddRegExpCases(
-  regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(pattern) == null || matches_array == null ) {
-    AddTestCase(
-      regexp + ".exec(" + str_pattern +")",
-      matches_array,
-      regexp.exec(pattern) );
-
-    return;
-  }
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").length",
-    matches_array.length,
-    regexp.exec(pattern).length );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").index",
-    index,
-    regexp.exec(pattern).index );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").input",
-    pattern,
-    regexp.exec(pattern).input );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").toString()",
-    matches_array.toString(),
-    regexp.exec(pattern).toString() );
-/*
-  var limit = matches_array.length > regexp.exec(pattern).length
-  ? matches_array.length
-  : regexp.exec(pattern).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-  AddTestCase(
-  str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
-  matches_array[matches],
-  regexp.exec(pattern)[matches] );
-  }
-*/
-}
deleted file mode 100644
index c1c1dd331e5158404cba2a717276213a6ac90add..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/octal-003.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/octal-003.js
- *  ECMA Section:       15.7.1
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *  Simple test cases for matching OctalEscapeSequences.
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- *
- *  Revised:            02 August 2002
- *  Author:             pschwartau@netscape.com
- *
- *  WHY:  the original test expected the regexp /.\011/
- *        to match 'a' + String.fromCharCode(0) + '11'
- *
- *  This is incorrect: the string is a 4-character string consisting of
- *  the characters <'a'>, <nul>, <'1'>, <'1'>. By contrast, the \011 in the
- *  regexp should be parsed as a single token: it is the octal escape sequence
- *  for the horizontal tab character '\t' === '\u0009' === '\x09' === '\011'.
- *
- *  So the regexp consists of 2 characters: <any-character>, <'\t'>.
- *  There is no match between the regexp and the string.
- *
- *  See the testcase ecma_3/RegExp/octal-002.js for an elaboration.
- *
- */
-var SECTION = "RegExp/octal-003.js";
-var VERSION = "ECMA_2";
-var TITLE   = "RegExp patterns that contain OctalEscapeSequences";
-var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346132";
-
-startTest();
-
-AddRegExpCases( /.\011/, "/\\011/", "a" + String.fromCharCode(0) + "11", "a\\011", 0, null );
-
-test();
-
-function AddRegExpCases(
-  regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
-
-  // prevent a runtime error
-
-  if ( regexp.exec(pattern) == null || matches_array == null ) {
-    AddTestCase(
-      regexp + ".exec(" + str_pattern +")",
-      matches_array,
-      regexp.exec(pattern) );
-
-    return;
-  }
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").length",
-    matches_array.length,
-    regexp.exec(pattern).length );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").index",
-    index,
-    regexp.exec(pattern).index );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").input",
-    escape(pattern),
-    escape(regexp.exec(pattern).input) );
-
-  AddTestCase(
-    str_regexp + ".exec(" + str_pattern +").toString()",
-    matches_array.toString(),
-    escape(regexp.exec(pattern).toString()) );
-
-  var limit = matches_array.length > regexp.exec(pattern).length
-    ? matches_array.length
-    : regexp.exec(pattern).length;
-
-  for ( var matches = 0; matches < limit; matches++ ) {
-    AddTestCase(
-      str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
-      matches_array[matches],
-      escape(regexp.exec(pattern)[matches]) );
-  }
-
-}
deleted file mode 100644
index f520e8914f2bbe7043267ff27b287004f5abc42f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/properties-001.js
+++ /dev/null
@@ -1,91 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/properties-001.js
- *  ECMA Section:       15.7.6.js
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/properties-001.js";
-var VERSION = "ECMA_2";
-var TITLE   = "Properties of RegExp Instances";
-var BUGNUMBER ="";
-
-startTest();
-
-AddRegExpCases( new RegExp, "(?:)",   false, false, false, 0 );
-AddRegExpCases( /.*/,       ".*", false, false, false, 0 );
-AddRegExpCases( /[\d]{5}/g, "[\\d]{5}", true, false, false, 0 );
-AddRegExpCases( /[\S]?$/i,  "[\\S]?$", false, true, false, 0 );
-AddRegExpCases( /^([a-z]*)[^\w\s\f\n\r]+/m,  "^([a-z]*)[^\\w\\s\\f\\n\\r]+", false, false, true, 0 );
-AddRegExpCases( /[\D]{1,5}[\ -][\d]/gi,      "[\\D]{1,5}[\\ -][\\d]", true, true, false, 0 );
-AddRegExpCases( /[a-zA-Z0-9]*/gm, "[a-zA-Z0-9]*", true, false, true, 0 );
-AddRegExpCases( /x|y|z/gim, "x|y|z", true, true, true, 0 );
-
-AddRegExpCases( /\u0051/im, "\\u0051", false, true, true, 0 );
-AddRegExpCases( /\x45/gm, "\\x45", true, false, true, 0 );
-AddRegExpCases( /\097/gi, "\\097", true, true, false, 0 );
-
-test();
-
-function AddRegExpCases( re, s, g, i, m, l ) {
-
-  AddTestCase( re + ".test == RegExp.prototype.test",
-	       true,
-	       re.test == RegExp.prototype.test );
-
-  AddTestCase( re + ".toString == RegExp.prototype.toString",
-	       true,
-	       re.toString == RegExp.prototype.toString );
-
-  AddTestCase( re + ".contructor == RegExp.prototype.constructor",
-	       true,
-	       re.constructor == RegExp.prototype.constructor );
-
-  AddTestCase( re + ".compile == RegExp.prototype.compile",
-	       true,
-	       re.compile == RegExp.prototype.compile );
-
-  AddTestCase( re + ".exec == RegExp.prototype.exec",
-	       true,
-	       re.exec == RegExp.prototype.exec );
-
-  // properties
-
-  AddTestCase( re + ".source",
-	       s,
-	       re.source );
-
-/*
- * http://bugzilla.mozilla.org/show_bug.cgi?id=225550 changed
- * the behavior of toString() and toSource() on empty regexps.
- * So branch if |s| is the empty string -
- */
-  var S = s? s : '(?:)';
-
-  AddTestCase( re + ".toString()",
-	       "/" + S +"/" + (g?"g":"") + (i?"i":"") +(m?"m":""),
-	       re.toString() );
-
-  AddTestCase( re + ".global",
-	       g,
-	       re.global );
-
-  AddTestCase( re + ".ignoreCase",
-	       i,
-	       re.ignoreCase );
-
-  AddTestCase( re + ".multiline",
-	       m,
-	       re.multiline);
-
-  AddTestCase( re + ".lastIndex",
-	       l,
-	       re.lastIndex  );
-}
deleted file mode 100644
index e657089d33e6b87ba8671797fa1ef9142248436d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/properties-002.js
+++ /dev/null
@@ -1,129 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/properties-002.js
- *  ECMA Section:       15.7.6.js
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-//-----------------------------------------------------------------------------
-var SECTION = "RegExp/properties-002.js";
-var VERSION = "ECMA_2";
-var TITLE   = "Properties of RegExp Instances";
-var BUGNUMBER ="124339";
-
-startTest();
-
-re_1 = /\cA?/g;
-re_1.lastIndex = Math.pow(2,31);
-AddRegExpCases( re_1, "\\cA?", true, false, false, Math.pow(2,31) );
-
-re_2 = /\w*/i;
-re_2.lastIndex = Math.pow(2,32) -1;
-AddRegExpCases( re_2, "\\w*", false, true, false, Math.pow(2,32)-1 );
-
-re_3 = /\*{0,80}/m;
-re_3.lastIndex = Math.pow(2,31) -1;
-AddRegExpCases( re_3, "\\*{0,80}", false, false, true, Math.pow(2,31) -1 );
-
-re_4 = /^./gim;
-re_4.lastIndex = Math.pow(2,30) -1;
-AddRegExpCases( re_4, "^.", true, true, true, Math.pow(2,30) -1 );
-
-re_5 = /\B/;
-re_5.lastIndex = Math.pow(2,30);
-AddRegExpCases( re_5, "\\B", false, false, false, Math.pow(2,30) );
-
-/*
- * Brendan: "need to test cases Math.pow(2,32) and greater to see
- * whether they round-trip." Reason: thanks to the work done in
- * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, lastIndex
- * is now stored as a double instead of a uint32_t (unsigned integer).
- *
- * Note 2^32 -1 is the upper bound for uint32's, but doubles can go
- * all the way up to Number.MAX_VALUE. So that's why we need cases
- * between those two numbers.
- *
- */
-re_6 = /\B/;
-re_6.lastIndex = Math.pow(2,32);
-AddRegExpCases( re_6, "\\B", false, false, false, Math.pow(2,32) );
-
-re_7 = /\B/;
-re_7.lastIndex = Math.pow(2,32) + 1;
-AddRegExpCases( re_7, "\\B", false, false, false, Math.pow(2,32) + 1 );
-
-re_8 = /\B/;
-re_8.lastIndex = Math.pow(2,32) * 2;
-AddRegExpCases( re_8, "\\B", false, false, false, Math.pow(2,32) * 2 );
-
-re_9 = /\B/;
-re_9.lastIndex = Math.pow(2,40);
-AddRegExpCases( re_9, "\\B", false, false, false, Math.pow(2,40) );
-
-re_10 = /\B/;
-re_10.lastIndex = Number.MAX_VALUE;
-AddRegExpCases( re_10, "\\B", false, false, false, Number.MAX_VALUE );
-
-
-
-//-----------------------------------------------------------------------------
-test();
-//-----------------------------------------------------------------------------
-
-
-
-function AddRegExpCases( re, s, g, i, m, l ){
-
-  AddTestCase( re + ".test == RegExp.prototype.test",
-	       true,
-	       re.test == RegExp.prototype.test );
-
-  AddTestCase( re + ".toString == RegExp.prototype.toString",
-	       true,
-	       re.toString == RegExp.prototype.toString );
-
-  AddTestCase( re + ".contructor == RegExp.prototype.constructor",
-	       true,
-	       re.constructor == RegExp.prototype.constructor );
-
-  AddTestCase( re + ".compile == RegExp.prototype.compile",
-	       true,
-	       re.compile == RegExp.prototype.compile );
-
-  AddTestCase( re + ".exec == RegExp.prototype.exec",
-	       true,
-	       re.exec == RegExp.prototype.exec );
-
-  // properties
-
-  AddTestCase( re + ".source",
-	       s,
-	       re.source );
-
-  AddTestCase( re + ".toString()",
-	       "/" + s +"/" + (g?"g":"") + (i?"i":"") +(m?"m":""),
-	       re.toString() );
-
-  AddTestCase( re + ".global",
-	       g,
-	       re.global );
-
-  AddTestCase( re + ".ignoreCase",
-	       i,
-	       re.ignoreCase );
-
-  AddTestCase( re + ".multiline",
-	       m,
-	       re.multiline);
-
-  AddTestCase( re + ".lastIndex",
-	       l,
-	       re.lastIndex  );
-}
deleted file mode 100644
index d598f086e8c883009bde180203ff4079b5dbd298..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/regexp-enumerate-001.js
+++ /dev/null
@@ -1,88 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          regexp-enumerate-001.js
-   ECMA V2 Section:
-   Description:        Regression Test.
-
-   If instance Native Object have properties that are enumerable,
-   JavaScript enumerated through the properties twice. This only
-   happened if objects had been instantiated, but their properties
-   had not been enumerated.  ie, the object inherited properties
-   from its prototype that are enumerated.
-
-   In the core JavaScript, this is only a problem with RegExp
-   objects, since the inherited properties of most core JavaScript
-   objects are not enumerated.
-
-   Author:             christine@netscape.com, pschwartau@netscape.com
-   Date:               12 November 1997
-   Modified:           14 July 2002
-   Reason:             See http://bugzilla.mozilla.org/show_bug.cgi?id=155291
-   ECMA-262 Ed.3  Sections 15.10.7.1 through 15.10.7.5
-   RegExp properties should be DontEnum
-   *
-   */
-//    onerror = err;
-
-var SECTION = "regexp-enumerate-001";
-var VERSION = "ECMA_2";
-var TITLE   = "Regression Test for Enumerating Properties";
-
-var BUGNUMBER="339403";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-/*
- *  This test expects RegExp instances to have four enumerated properties:
- *  source, global, ignoreCase, and lastIndex
- *
- *  99.01.25:  now they also have a multiLine instance property.
- *
- */
-
-
-var r = new RegExp();
-
-var e = new Array();
-
-var t = new TestRegExp();
-
-for ( p in r ) { e[e.length] = { property:p, value:r[p] }; t.addProperty( p, r[p]) };
-
-new TestCase( SECTION,
-	      "r = new RegExp(); e = new Array(); "+
-	      "for ( p in r ) { e[e.length] = { property:p, value:r[p] }; e.length",
-	      0,
-	      e.length );
-
-test();
-
-function TestRegExp() {
-  this.addProperty = addProperty;
-}
-function addProperty(name, value) {
-  var pass = false;
-
-  if ( eval("this."+name) != void 0 ) {
-    pass = true;
-  } else {
-    eval( "this."+ name+" = "+ false );
-  }
-
-  new TestCase( SECTION,
-		"Property: " + name +" already enumerated?",
-		false,
-		pass );
-
-  if ( gTestcases[ gTestcases.length-1].passed == false ) {
-    gTestcases[gTestcases.length-1].reason = "property already enumerated";
-
-  }
-
-}
deleted file mode 100644
index ed112879b60626265f2fca3a93b2151f56d07e00..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/regexp-literals-001.js
+++ /dev/null
@@ -1,44 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          LexicalConventions/regexp-literals-001.js
- *  ECMA Section:       7.8.5
- *  Description:
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "LexicalConventions/regexp-literals-001.js";
-var VERSION = "ECMA_2";
-var TITLE   = "Regular Expression Literals";
-
-startTest();
-
-// Regular Expression Literals may not be empty; // should be regarded
-// as a comment, not a RegExp literal.
-
-s = //;
-
-  "passed";
-
-AddTestCase(
-  "// should be a comment, not a regular expression literal",
-  "passed",
-  String(s));
-
-AddTestCase(
-  "// typeof object should be type of object declared on following line",
-  "passed",
-  (typeof s) == "string" ? "passed" : "failed" );
-
-AddTestCase(
-  "// should not return an object of the type RegExp",
-  "passed",
-  (typeof s == "object") ? "failed" : "passed" );
-
-test();
deleted file mode 100644
index a3ccf7cc93a6876e15a53bf9977b885a4db8373d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/regexp-literals-002.js
+++ /dev/null
@@ -1,28 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          LexicalConventions/regexp-literals-002.js
- *  ECMA Section:       7.8.5
- *  Description:        Based on ECMA 2 Draft 8 October 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "LexicalConventions/regexp-literals-002.js";
-var VERSION = "ECMA_2";
-var TITLE   = "Regular Expression Literals";
-
-startTest();
-
-// A regular expression literal represents an object of type RegExp.
-
-AddTestCase(
-  "// A regular expression literal represents an object of type RegExp.",
-  "true",
-  (/x*/ instanceof RegExp).toString() );
-
-test();
deleted file mode 100644
index c013b642ee7c044cfbd4fb47d044306be14c3461..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/regress-001.js
+++ /dev/null
@@ -1,45 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/regress-001.js
- *  ECMA Section:       N/A
- *  Description:        Regression test case:
- *  JS regexp anchoring on empty match bug
- *  http://bugzilla.mozilla.org/show_bug.cgi?id=2157
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/hex-001.js";
-var VERSION = "ECMA_2";
-var TITLE   = "JS regexp anchoring on empty match bug";
-var BUGNUMBER = "2157";
-
-startTest();
-
-AddRegExpCases( /a||b/.exec(''),
-		"/a||b/.exec('')",
-		1,
-		[''] );
-
-test();
-
-function AddRegExpCases( regexp, str_regexp, length, matches_array ) {
-
-  AddTestCase(
-    "( " + str_regexp + " ).length",
-    regexp.length,
-    regexp.length );
-
-
-  for ( var matches = 0; matches < matches_array.length; matches++ ) {
-    AddTestCase(
-      "( " + str_regexp + " )[" + matches +"]",
-      matches_array[matches],
-      regexp[matches] );
-  }
-}
deleted file mode 100644
index 87be12f962e36b289af66c076bbeb7844789fb14..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/regress-7635.js
+++ /dev/null
@@ -1,55 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          regress-7635.js
- *  Reference:          http://bugzilla.mozilla.org/show_bug.cgi?id=7635
- *  Description:        instanceof tweaks
- *  Author:            
- */
-
-var SECTION = "instanceof";       // provide a document reference (ie, ECMA section)
-var VERSION = "ECMA_2"; // Version of JavaScript or ECMA
-var TITLE   = "Regression test for Bugzilla #7635";       // Provide ECMA section title or a description
-var BUGNUMBER = "7635";     // Provide URL to bugsplat or bugzilla report
-
-startTest();               // leave this alone
-
-/*
- * Calls to AddTestCase here. AddTestCase is a function that is defined
- * in shell.js and takes three arguments:
- * - a string representation of what is being tested
- * - the expected result
- * - the actual result
- *
- * For example, a test might look like this:
- *
- * var zip = /[\d]{5}$/;
- *
- * AddTestCase(
- * "zip = /[\d]{5}$/; \"PO Box 12345 Boston, MA 02134\".match(zip)",   // description of the test
- *  "02134",                                                           // expected result
- *  "PO Box 12345 Boston, MA 02134".match(zip) );                      // actual result
- *
- */
-
-function Foo() {}
-theproto = {};
-Foo.prototype = theproto
-  theproto instanceof Foo
-
-
-  AddTestCase( "function Foo() {}; theproto = {}; Foo.prototype = theproto; theproto instanceof Foo",
-	       false,
-	       theproto instanceof Foo );
-
-var f = new Function();
-
-AddTestCase( "var f = new Function(); f instanceof f", false, f instanceof f );
-
-
-test();       // leave this alone.  this executes the test cases and
-// displays results.
new file mode 100644
index 0000000000000000000000000000000000000000..1591d807f8b0ccafb3f97c7643ec5b85b13fa59c
GIT binary patch
literal 7633
zc%0=}&2Abo5MG+}PgSc*J+=pWOI4L5QV%^Kq=e9xDkW7G<r<mY2{>^uvP}rD(pTsU
z^xo&Gdg-CJcDxJhvg?HayAV_^z>GcP`8@t+?4s&+7?g@FAa2Qa1nnqm!?G;t@D5lm
z72qg(1=5m=D7b{Sl2&os8(j=f-IEf80{4Un+nc(HMi^XEhcMPZ0EZC)ZjD@`sVgGJ
z1rF(`?&x2O$OF%B<%+P8Ge)H<X`}j6-1h$Z!XGHOuZ2<x+HRKgZ@W^iSC4AN?SX8l
zyNkMdwSHKMX&!3L(WzZOuGT)pwA$uL<=8ga)HC7QfsUfQ9n;=JtpM3&DyGV5oC9e%
zrbwXpJpelyhTqRE>yZ|Qw*|L@k_H1GZ=zRd-N8W@wC!5%K*&X~r-Q}l6u@l?7U#M6
zgVNkI7hHHA8t4IMTC`1-F=O`q0aX`sik?vrp6NEGKy)$24IKg!HhD-D2*PY{NaebN
zxJw;z&Wnb1W0s%jg>ue-wBPLP>=w>t+`;JE$J*pKU6g;V4&_*ir-HIRbf4_q)3>((
z+|Ardz%}qrD$u?_#lD}wg^u8gt9}Oxiu)F}Ud@Gg;Mg9LzPADh7Gy%Bj7%R|vqn&p
zKY&F<vzuHx0{9{kn}F10i={}YI!G0d&Pb2Z(AOo_rzr0UOo@*u1ySdRyqOU4cT-wp
zdJ@qOInqZ0YqOu>49=7#XtSlFezl?3fuoE~&ICzzr9dn4$;V~x6;C+%2}dz|68yWG
z3X{+%rLuj`P*LOgk@>u83Ene!`CrPpsqah$X>IsDp$yzx0IreumXpbb%YrFhT~?^`
z87>=RbfFi-8|Qe-v9N9<fvUc7O$$z+nOq0WL_DTY<fBF-anu7GHEcrW%96V1mx*#(
zK~eU0kh^`XvnVe!(v@J|MaG>AZ@7PlopNzKt#uh2v<tp=tg!yXW@01TTh-Uq<Z$%%
zY1oAt^fGU9G@T?RiU*Ht;?J2`>#<iKRG#D$Gd!UTr{5^=p{m)|qa)}JcX!JCFee1I
z>bNPOvSEgVT)EL{U#QieK(e=}t6wHbFR~Rkx*bi(_i~7O!};p*^5Se{s3+MGdjZM#
zPLx(wbfBY$c$Mv)ZUVj#DZzcYlry&i>}I%!tP3N|+lt+c5vCN#^pas24TlCqKOU8d
zG@#~%_zk&XGs+Fwyi=^l8%+i#XC|h1sPGRv{>vvndgc|!E^qMLKWv6~orO7aOSJ^_
lvUo9?LQko^c1?I3&aQ$ibWcbscx(R7tEooK|C~K8{s+4p*H!=k
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/boolean-001.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          boolean-001.js
+   Description:        Corresponds to ecma/Boolean/15.6.4.2-4-n.js
+
+   The toString function is not generic; it generates
+   a runtime error if its this value is not a Boolean
+   object.  Therefore it cannot be transferred to other
+   kinds of objects for use as a method.
+
+   Author:             christine@netscape.com
+   Date:               june 27, 1997
+*/
+var SECTION = "boolean-001.js";
+var VERSION = "JS1_4";
+var TITLE   = "Boolean.prototype.toString()";
+startTest();
+writeHeaderToLog( SECTION +" "+ TITLE );
+
+var exception = "No exception thrown";
+var result = "Failed";
+
+var TO_STRING = Boolean.prototype.toString;
+
+try {
+  var s = new String("Not a Boolean");
+  s.toString = TO_STRING;
+  s.toString();
+} catch ( e ) {
+  result = "Passed!";
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "Assigning Boolean.prototype.toString to a String object "+
+  "(threw " +exception +")",
+  "Passed!",
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..888295fa2121a661621002196513de60935ea5ab
GIT binary patch
literal 7647
zc%0=}&2AGh5Z<(ff)EIa8(hMz2$2?q#3hQ<rl}|j2_m7_%GsSHF77(Aou+ve9)Sly
zoOv81#FZP2ca!X9*PApy+cct=bZ6`t&)+v==T*1Eppb6^aSAnC(2lY;Ez6QN?||h{
z0k)zSAT6ngf^%?{wDP;&>U?<XzLX#oI44BZyscX(gux}X31j_3uo)5HRLD7sx*%el
zV3UsOj=tJN9(sC97le(JF)CF-3)O%5UGLK;{y@UECQ2o!+bZb)Yo%iSxLV2Y4roK(
zE#%dY>*Z36a|bym`{hri)9O)-sYRZYKGsYk?;;N_ZRjY<-5B>aas|jPQ!!RXyE&kS
zO?r&1OvohTQuM+g0?EGl^~AF7X<|557$Zs=4E!JveQs+57k#F#V>tsN7eSy0dUal4
z?1FQ6D*g=5I!Of=o`wc$z?~L#sWPU~fxqC`!9=4?3c?fZVqQcKV~q09Az_hasz4A{
z^Olq@I~WbAEzWq>ux?E91AS1=84&ly-rlR+nT#tK{rbK(>0Pduf3MEVvBY1Bmvtq+
ztGzsZeFL1knOTW*4Pdks*J90E2Yv$QI)W>%`W?u5ORLSDXLC6`&|4ce0`CA2oX6yh
zBBFoj$l8IrAplrJw7SXdB=BCuV3Qv;0%Lm;st!`ctuvxy)bw?+^&!%G0yE+*QbE*t
znYR*5{%*=@%uXWuAw{|(uwVNL&Y-C*L0fGV)vE<P4-};=aweCg*9kNun_Mn)pLjyy
zCzN9P82EQJ4JKiFT1xmHA)~^xBk@_)7QAQB^1pO*(=fUePiw(Pgfeh$fOEgCrkk5D
z5GHeVSE2TMIB$%hg+32&oZ-dC!mf?@srtqvEx3JVY#odeahpOVJQ_0+S8We-r`nt=
zN9v+qB+70FE!m47cly|6kzQn^E5RH?#_iAEa{pF4<tlqx=`uDL7JTklTm6Zn#Adoz
zsxPa_;OH&W5QPf#QXg?NnE23>FxWUI^qd*9?t9%qWl1(M!4sPB^2g+TWVKwqI^x}7
zbf@eOLqZ^{jzIyH4lpF-%2kSeZk++b?impF22J$WiO>rK;z}2z3CUgz;chrtJy2d8
ziVVFZJyg#j5^qE?WkuB-t>9Hob~=GR5GlcVdMzcl0^iMW1z8tBNFKv9hAKX>y-r1h
zDcx~-$#5OhhIWX4H!2co@S11hSHy;`C^n??M6n*vGbxCi8JON6!!LIH$|gQ{W);T?
z&lj8ZYt8VYvoJ*NsJ4J!8gE5Y&}nJ!Toay!(`z6L-4T-d-I~AfYNS!~KV*-S{{igc
B+8qD@
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/boolean-002.js
@@ -0,0 +1,51 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          boolean-001.js
+   Description:        Corresponds to ecma/Boolean/15.6.4.3-4-n.js
+
+   15.6.4.3 Boolean.prototype.valueOf()
+   Returns this boolean value.
+
+   The valueOf function is not generic; it generates
+   a runtime error if its this value is not a Boolean
+   object.  Therefore it cannot be transferred to other
+   kinds of objects for use as a method.
+
+   Author:             christine@netscape.com
+   Date:               09 september 1998
+*/
+var SECTION = "boolean-002.js";
+var VERSION = "JS1_4";
+var TITLE   = "Boolean.prototype.valueOf()";
+startTest();
+writeHeaderToLog( SECTION +" "+ TITLE );
+
+
+var exception = "No exception thrown";
+var result = "Failed";
+
+var VALUE_OF = Boolean.prototype.valueOf;
+
+try {
+  var s = new String("Not a Boolean");
+  s.valueOf = VALUE_0F;
+  s.valueOf();
+} catch ( e ) {
+  result = "Passed!";
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "Assigning Boolean.prototype.valueOf to a String object "+
+  "(threw " +exception +")",
+  "Passed!",
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..4071bfb1c6fcaa9dcf3436035007a7107523b7f3
GIT binary patch
literal 8948
zc%0=~&2rl|5Jvu*bf$;S^wQpVv?mkW?ex;A>W(8TsZ(3cL~Ley%E07CLIaT;0J5zo
z$*bgXddo30Ip)$XK#C$MkP>CmvQu3o0pu=r_rvbDKu1j?4*Q)EP=9~m2^J}GhY%vY
zFaqK;0iI%KAc<5|!59K1NoUtQ-O0XsASDO|{!1zb=GD6>gu?~%DCg5d@HiFV_vsi#
zol%h=@Mxqa>Aw+`hemJjjPg_&XHxBJq59L=HGkv5e{kS|9+XP3V7UJU{yzEZ@WAbL
zc9Wsp)btQ7S(v(yQ-faDJ^G`+Fn15<+#~mRQJ{Y7W$(qn_STm;2NxbhiiLr7DR2>?
znbs)*a>6rHS%V8+!0#jy<v#l45b~8C%*G63#po%AI2cqflibFK-mt(Yeli$}dBBs!
zXnbG{=ZiBcKH})DWhz2pG@POae3P(%DJz^F#}6F&2srkdfiR*2#7A*4*0{|ak`;N(
z6bQ-(=8@h-gdUdK;#<ZVK3R~gG36sv9_{V@uqZnHj=gNt*sOm)Y|g(62yeu{dRILg
zeE;glYv5eH$_+Tzl2{sX?YB6gv)oQ3LKUiM1UnLx%f_&^y_UD<N(Zw#V6?-0F*Z+h
zG5KfKtG%b|0RW+5I4Q3tbJrEDwK-AeS*%V%xggb|b=IU<H2tR7`ZbQ93xvaOI10iI
zkHcY!$?t5CMrcwo%_!2_0n2raZVs;%5o|b8MZH?k!?~iCMb>gjdj&vGIOW@A?G;z-
z`jV~q*;W@T)oCJjTJRIfIQZ9~y8OEt=avxAM*RB?PV_@374N8#2+u8A{x3Yq#^)PD
z@^gyq)p|&F#k5P6H=5TnV|eIKu{_~;m(z&^yYW2q-k8VZZg5Ep_^LnQJgKtrY_1-?
z$8g<lw*~oiGc3;5aN0uAhx676f~~`?#e|wCfd@D>4D{0l>t`WY`F$511**ZavMy)S
z_A~DU#;3WU==a0ZzcB|8B;H7Y)U=_9mY^#`ff9aS67}D0Nij)9eKb@suPPUj6g1WR
zWCaj)Gf5{40+W$0w+{^#s{`I_O53)jw9jvs)P`$W9c-cN+JM_?(5jn|UrKgO<`7JU
zF<V);qO6uP8UVvp6j<#LebCUQvMkxY#k6p@m=@aUX>Ue9--5{6G<qv7qs}i*0OwB3
zlD4*gcH-gmglx}pM0P3F8ZyonHb|(oh2w-J`KYm@kcyMTR;tCNgqGE{8-D($(~4^5
znDfab@HAqwt(VR_OdiN-;NkaE2$C%t;R9np%*1zlnybaX%o@$C%rUq^@|)cbKF`b1
zX&@C{^D6Ksl5nr(S9|wnsIGaPwi*+>M9)~#r{$s)iZSJ>-=wh_cQ5)Iv7+)m`P0Vo
z>)l2a{gmG}t9hgfZI3lbv<=l)%jGwj-{I(;Yr?s+G_6P^S0-!jh{=q4n?sk!XYGVi
z74z%I*00#%m3?)CeEllvzTQ;!w3DF|>9yf{M-ElUc>$Q;>!D_afGz7Wa>M@tLKT4J
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-002.js
@@ -0,0 +1,54 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          date-002.js
+   Corresponds To:     15.9.5.23-3-n.js
+   ECMA Section:       15.9.5.23
+   Description:        Date.prototype.setTime
+
+   1.  If the this value is not a Date object, generate a runtime error.
+   2.  Call ToNumber(time).
+   3.  Call TimeClip(Result(1)).
+   4.  Set the [[Value]] property of the this value to Result(2).
+   5.  Return the value of the [[Value]] property of the this value.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "date-002";
+var VERSION = "JS1_4";
+var TITLE   = "Date.prototype.setTime()";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var MYDATE = new MyDate();
+  result = MYDATE.setTime(0);
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "MYDATE = new MyDate(); MYDATE.setTime(0)" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function MyDate(value) {
+  this.value = value;
+  this.setTime = Date.prototype.setTime;
+  return this;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..3bd94fd80d1dba5e9c1d7fa97045bf06a70264e5
GIT binary patch
literal 9119
zc%0=~+invv5OpuyBp#5Eka!Dkt+=!Z-UyZ2G(e%Ghy-4dyE{!xo!yn~w9PN@5j^q@
z{0*Og#0LOlZ!WtV?>3w6HZ9~Oi7zwuneogSyQ+EthmC3nsJqd01Pc^dB7{iC4}iE#
zfTP$ENFo(g&;?IPQe88ntI?^OQi4$6ex#ylrY@rp4kyf^ocFiE;Z%Uzpj{MoL`A&8
zp@Hg+{&lF_HhSwvl#i5gCe?-(sz22=^EYh#feqJnqf~-<?G63=ZGUh7Gm5CL4H}1?
zdT)DMuP55CVSBS)YwhecCi<>mUu&neTer^oSbyKN&ANeoaN<CqnD0&WUNyaeZHc-|
zfb8)|S9HG#5b%3oh;)d)-6Q0tZj71?O~vRwhtL*OFOw|dphM=l#2qyHVr=gSglNL?
z;*5%4*t&3<3SSrv`=|kD66P^w^`@<Gz>bUl#ts+=BicjvNG`@|w;>==k-JQRpuA~@
z)K3CLSn3@wnBDN+gk<eTF8ch#_4Ox{qDS8$$~KL~;`?)c_)d6uA^7T3^}6}^)6)w8
z?(g}4YY8lcKzj!}w$XJT1;SUp>Id-1jN3by3G1=S<}e8u-7sE?4Tl;={>W-Ib~+gV
z5GvZe^i(niF0oe|ggVM%Y7(jiQcdp88WNLRzbt#bh3&@zo#7R>f@t}>emiB$-xn+n
zjgCo0KcYw<2F%r=Z*w?MM6h;8CG~1S_s5D#7MTl@^1{FFsH7j4nOB@~=2MR1Kbu>u
zM5hSbX~8cj<KSL^-128W;HJ>eLh!wf9Sy%S5?@gr;U8PH{4XrY#^ww2<aZQntJyrc
zCHgh0oX$9xnT`8yAJY@I*EsD-uy3CG&Y>9|mV&3$f1esX&IegG?2YB4FPMWD%Pl}2
zEY8LB69uKs4h=XiogLWA-k24vHQITsZFxXQQ`YsywywchY2X?JbFvN#8S%T61ZvNx
z#WUVb>}q>@bOO<#zfC>Ah2VoKFo(`cQ1$+q^A@`MF+=P5zHv2zH3srM)jzwJq#mUR
z*-NcsregY2n7$T?i&4{=pn0}XVLT|?OvOgs)g?>R{r7x3my>0s>JkdWIlz{K`CW#n
zkaB7wSx@;Pp(-{gl;8~KMFaF*NR7(0bo&*<!g4Y!lv8$Jjw^=}MCNAtYhm)MJg<0g
zTp1F%74uJ1r<L{9)n^qPF}%uKSuNqhyRw3%9BM4#;^UOCRM@4B1(s5i#+ihsrMF9d
zQ>mkiD&|7=MbC4z$3%-n9e$YHlzq>^@0Z{WPHKPyx_~|tK0#{A7XC78G`%uL<PtG(
z_=x!~E=Na$k?5Q+me0t5f=%-{d1dI=IUoL}qlB}O*6gw}W+`8EDIZ}c&A#yjBj)HY
zDvrwsTgjL2<s^wz{OC-FNtVZLX-Cm}$bJP+e|5c!txFe#en%Nwl2cC2+gcqaBkFB{
zo^GF+gG!doFCK9}XTURS;{vJsc{2a>TcZf27(H>$c5RU5Iqv~ud_J$4!eF^>rTzk+
C+qwe)
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-003.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          date-003.js
+   Corresponds To      15.9.5.3-1.js
+   ECMA Section:       15.9.5.3-1 Date.prototype.valueOf
+   Description:
+
+   The valueOf function returns a number, which is this time value.
+
+   The valueOf function is not generic; it generates a runtime error if
+   its this value is not a Date object.  Therefore it cannot be transferred
+   to other kinds of objects for use as a method.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "date-003";
+var VERSION = "JS1_4";
+var TITLE   = "Date.prototype.valueOf";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var OBJ = new MyObject( new Date(0) );
+  result = OBJ.valueOf();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "OBJ = new MyObject( new Date(0)); OBJ.valueOf()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function MyObject( value ) {
+  this.value = value;
+  this.valueOf = Date.prototype.valueOf;
+//  The following line causes an infinte loop
+//    this.toString = new Function( "return this+\"\";");
+  return this;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..07cdf29223cd798d166c92074e2bfca6f50fb384
GIT binary patch
literal 8768
zc%0=~&2AGh5Z*$|kHi59iSyoQg=mY!1rdtcG=-uzRAi~dsd9IxiK(-@vYobh5zf2;
zS00BqK;i*_u{S@v8*l!)o3tgDB>tK4d^4W;Y?ov!WUx_c0P!|zE~lZiZd;Zm+#m$Y
zqa0jG&p=p05(!Q4rLanCdUPp1byEo761+pgYkKM;3Sn?TUBXy<8(c;>cvaFwQD=lF
z8(b2~R_|Yfh;6O6az<EB8KXjOD52_8TGM}{#-G@5Pc;h3sbAl?gTMDbZ*Mx4(psk}
z(be8YO9r~`VppwFc6L8h2l|$<&)IeM1_i2Fhn0^t)2#d02Ny1ck_NtUDR2>@nZ_;-
zqQzoeaf4GR;CIIp*%<BEmi0h2#(jpqqU4xC<P4&gY2Cs>r_}c>uhSUtzQa3<QSpI3
z>@QBM_>HX#qf`W3YdA&?IMbp&mBw(|iU#a@7;yB20@tE_jF0qUjDG6^5*N8gC2+!O
zdPwCWM1+O1ctKmkS_6_*OnDe8&(_yp42tf3M<|;#=8NyI`QbYd;kn?ecGdgZ^P{T(
z?w|R9Ye+1)K>HXwRF+!}c_0JX4q>$p(xFY53hTbgTDJ;l-Oyi(35PPK{@7|2cB&cx
zScKPG*|nq(T*_7xgeuEoZQ{}aAqTB9ro^=A*TvR{*nZA27~Wwka3|Oc>KP{gSTF=M
z1}5R{m?E_quvka2&EP~@oYosMtyc+p+E-Mt$cZ2+F8!+xJA1oKz2YHzK4UB1*xF(w
zI(hg`3Em-;fp-OJ%isBcn?XNw!S@k%R0F#w-j)p>oEx<KFD%K#=5veW1A>RE=_1+T
z?J|*WqhHIk;epr2@`UYWMp^>Q#<RdZ)x)E+;D`g@QMJWbr^-gXiF))6-F2(j1IQaw
z$(xPq)5lGdE2?l_I6*L-Zzp0x`IEp+?5g`}bjtd!3&x)BAW$H4EGyG;Hf29`_n~>5
zaEh8A9Dl(aU?J^B3MAV(c{C%sViYKo-H+$>(cUk|vPIl`I+a{*1L+_d?x}op(TXV-
z-MsLgIL@*PSOLeSIlwjnAG!{SA!FCX?yh7I(TsePLIJ@ri^`|~Q8xr-BC@jNS4<0w
z>9kPHVf1<&#0wBPG5>witAF-u+lO;IqBqMcuk5I~d$F~=Qo!}Ey^IGNR9e6_z=(8|
z+ZBcZmO_igrG#dcwQGKFr?QI7=X!Fd<-00k;zuTxcBt4CZQsT3x8QenXov%vfH4!j
z$SJB8{nBgHy&^&2Qn|1DrgxB(qq0Cx^n?$1FRc#s8vP)*)Q##1AHl{Wf|oe!Wt^`P
zUJ7`VupVwg+l;#x@y1w@NlZSOt}G^dLrCM4+&1GOGA!D*RFEhehCc{rzdwGzLX<ns
z($YL~Y_8@ssEDaI0Xo`0Qzw*RKEHZoea3(fJrCzd*JsK0)uuA1ofw_yJ@!p^RWL5`
HPc;7n$|gqs
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/date-004.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          date-004.js
+   Corresponds To:     15.9.5.4-2-n.js
+   ECMA Section:       15.9.5.4-1 Date.prototype.getTime
+   Description:
+
+   1.  If the this value is not an object whose [[Class]] property is "Date",
+   generate a runtime error.
+   2.  Return this time value.
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "date-004";
+var VERSION = "JS1_4";
+var TITLE   = "Date.prototype.getTime";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var MYDATE = new MyDate();
+  result = MYDATE.getTime();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "MYDATE = new MyDate(); MYDATE.getTime()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function MyDate( value ) {
+  this.value = value;
+  this.getTime = Date.prototype.getTime;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..cc17224f1b82995222cada10c77a02d58acffa02
GIT binary patch
literal 6770
zc%0o>&2AGh5O!PsDuKiaRRW1Uf&jIZda9yIZJI(+TM&tQsZizYI*D6nH`q?w@H{*O
z@4$tp;KG3;S7yAMWV7)u*>t1+<dVccGvjY&z8SluyB)zcN-ajcjjAhoN0S9Yh;oAt
zBOaH`)%=VpqBPa4&3vs$Y1ynU#kX!M#iVB5A(d6L^$rLT?1H;gh~74H1(nP@pluL!
zM&;;$OFOzd_}8Lp+vu&FQ87>^xY8Ra6hEb9^EVv)0s}ZvQd)Aqxp5DEmqF|CYH2wd
z>QCK=scNNM+x>7bHg^~1YP+?)ignjv<x_QJSKI;z7R<#gu&N0+fawuz=?D6;M92di
zi~|h7a#|NGM2>16_+%ayopRqJUNjiUp?4y^=u7~7Xopepw{LNlia;6-b<hAi3HQ0S
z`hF{1u<Jo|@CIkni1xvmNn`B5M6%){_qb+~imF*sx#&oy6rOm_oJMrVBtL=)cHy!P
z0`q2NWp!Ns;5&rcrnXp+|6Co&<KbEa$e1E0YV~;S8i4z3?n=P5utXuyuAy9}v~n7O
zbl%f58j`V7)ztT>^qfjRy4AYlAiq_l4CGXv7#dXVv%0a24Gp!SWRwn<AhO8rj1elE
z-SpZpgf)SL4d6vAKAK96XpEoE%9_ce-;}dHhVgR=q4Ew!nXCnSK{MsZ-)-RzVM}E%
zrU+97if<VCf;BXeyxG!8y(s9_P|=J<=7MB)6#^%m^mLip;tWPeNyVEMrnZLaR^}s~
zLl;9kJ6+#JvW^!!jBTzqRnK?f`z`aMtm?pmHiK{uJLh`f^}=7qMl-9-Xy4uh4fK2O
zkE3!ha|fbxHrme<9j!G4Vl8U|8e+xd_@FC9v@FzRTQzwt&Wg(sUj(vE#Q+^;q6g>$
zP=$!lqbE-~d9nj!g}@ei4pnB~rqb^N-yRa<%p&p#Vud$-T%E|KevdTq{u(46(-XQ0
zM0SNGuP(*tPhp}#xnSP9;|I>5{daUr2IqbT9~Z|<SAgeY{Hik%q!_j_^RfciCZ#5O
zJJ1%uJ$?uc#-pJmmuk0F7PPAvY2YgU6>PUQ*&=XH4L0H9!hc>A(v!_3#c$i?>be(~
zeX3hi7MF~6z8rHwJoMrvV@irO;AO{Hv2HzDD9){y>1AKrd)eDWpG&4cfZhS<6DgCO
zI~lZMQ+d6~Z`!QJ7~}3fYu88e8uthF6R6;%BQc7!J-Kp`LP~x`|M3w}2cbu&rH%Yo
zkzy12XMqWQz|Ln*(}+1fJ(Q`kIK~|5*L?KgJo{Vj&A8#`rk*EJEqw9PIg0gdTv;yY
hmwHLcNoctbf-&fPo{{i;1bwONeOiH;tQpBQ{0~Ycu~Yy6
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-001.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-001
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  Call error.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-001";
+var VERSION = "js1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions:  CallError";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+Call_1();
+
+test();
+
+function Call_1() {
+  result = "failed: no exception thrown";
+  exception = null;
+
+  try {
+    Math();
+  } catch ( e ) {
+    result = "passed:  threw exception",
+      exception = e.toString();
+  } finally {
+    new TestCase(
+      SECTION,
+      "Math() [ exception is " + exception +" ]",
+      "passed:  threw exception",
+      result );
+  }
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..fe66b283124188d6697091f26f67f89a880db397
GIT binary patch
literal 6960
zc%0o>OK%e~5Oyg~Ata7GE_>hr0#ra85Q-u}nnJ5KAQJUbp~~5H61UE7WP6i_Ggtl(
zKZIYwg(FvHyqjdR@h*96X-hBZ`Y|*9{LSaFOFHZcRxWiI^~!Zu@}4H^gb?KhJw`k(
znX7r9DWWvhtjm0@NNK~2E+wbFQHn{;ynQO`X6j`yBG?IcsSv|W<_apASEF4p)u(d0
z!KFPNj=wroZ5qGTJ{4nUf-7A{qxe_aFrQIl9~!Wuq_pIIyL=P=uLM4Pg|0q)UfPJ;
zNB!5Jzh130wm;Nn`mR7<W4p0iwa(hFeyUH+N`~RUfVD&zRyWZEh(E?IdsScW5^^0I
zlPCkaoHhlE;G>!cKDh*gj=Ap<FK!IvWQ$_IxTApjBo5=^_bB2#7lAY$n&1Iu67F+t
zCBWNgz_tez;VsUjG3~>Srh~Bq6WdCf+~t}{D(YrP^`s}6Qn=zZvl<c3SiS`v?8Id~
z1m@|pXD?>$kAEYmZElMN`PbQjJWJOiK*kg~QqK=xo&#{5wKD<Nq7sEb`wHzcrIphP
zq_ac&G*V=zuBq=)={eOAyVYxFtZ`K-1G&_0OoFP9<lRKaCc)Z}s(_{^)`RGx%ri!)
zY=_y0#01(D8a9w`;3=f3)QHIJ>a5C{Uiw8@>uqQsNTADmXl1ey>;~<OC4aY39;i#@
zFyRQ(1y13J{erbLk-Xi}X}@Ub@x;+7n_LKz(>o=w!^uvUr6bN!g^X0ZXf(~Ntp3ZS
z#C7Omv}Y^yT~zJlsfPsT>Wv!uF8sb@ew<o87|><F>8Orw2Hr6G&%|hYm1!Nto6>?&
zCH`^R4yNze^nzvggH&mo&4WY%o5F`!fjO*&Ld3%&hqh7kpUi({=+v$RvP;DnCuMj9
zY6AEIH}o_H>Fu6x6?tTMi+hMJ^KV(%SA-p?ch}QL!IBvTtl@1RN2l^?R5r~$zX2)8
z^c;J2723gMC@dMalEB}Gjuz#Dd9NKmaK<+RM|Wf}@N?w3IE6X`JZ~g#KXXBfv`vJU
zM_`+kh8%7|l>qnq2{gz@BTg>WZl@w>s2FMCDE<Xvx7OVvaE}c((WAp(UK+BK%_PM)
zTYYqKHgVphsIkF6IRN*l?ksr#&T;>!BuJ9PHF>-(c@miI&Bw4<;vK9PN4!;v?<e-+
z`y6w5VS&G6Y8j|=K;Ti-*}%yWKAX$)EzirAx5zQ>?y+ujD!*}l&^&?~gY+b_NZXTZ
zA#upaulO5ZE_D#?=&JHD|J|wBg#J-rLjMc7M$GZ8q(YTtW6Y9%UW%W}PybqeF`gtA
zmY#cv3+N4=iw_?;2Z`#EE6c0GO3z;lirT`9K^{7vPs#XVBE2+Dd527vvaHbj2O%`{
A{Qv*}
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-002.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-002
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  Construct error.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-002";
+var VERSION = "js1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions: ConstructError";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+Construct_1();
+
+test();
+
+function Construct_1() {
+  result = "failed: no exception thrown";
+  exception = null;
+
+  try {
+    result = new Math();
+  } catch ( e ) {
+    result = "passed:  threw exception",
+      exception = e.toString();
+  } finally {
+    new TestCase(
+      SECTION,
+      "new Math() [ exception is " + exception +" ]",
+      "passed:  threw exception",
+      result );
+  }
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..7d20d9e937c57f6808e91874ff57750020ccf5e1
GIT binary patch
literal 8403
zc%0o?UvCpf5Z@HimWN7JpDIwr!4qlI1O&W*8;KZ0Q>AHDTSyf`(fV#|FRX7*yXz!I
z;!{-WXX&@<BQHEKyLUdH&wCgDIg^;Y*xo-gv%i`7&FrS82N8$8S`TQj*YqWeG`T_u
zQND<P1Wbaj*$F73G}X|DP%Bc~wX18{txuE!sUdhlWz%lGib6P?F`sfid<s6N5`rVz
zM^PtKP7e4q(u4F@kE*9uZ{vjWR2gSV?-`-yueNJ{#)Aq6%tTFT$-?g5SNOfzsJ9OO
zII8U?W23oEoNFDl4jWT5Uz-^!yP%KnO-&k+FB*R}Cq!m#@NmJ#c{aow(D($n;v@Zd
zlMrLj1jGm}qiqf`c2qMFk}q)48x{s6NCt%*`zO(B+=-Bn?XW7|k1Q@zA*9vNMh&==
zu#jn|_xIxk2LZ+h>oAa3bcpWE8{-Bhk(CvB$TUdGn|4X#ERvv<Iq`-)4IfNN{st%D
z%!kMT^Yh)i_owBjpE1-fwbg?B|HXkk9j;Y?Z1U%|x_A8G5`g=|#)W|EppZ(SeQ4x@
z(#q=y>HS7eXiUdmQ`0b@GVmIs=vI%sn5r653b~Lg#uhb4#BNQ4v867U>d5Aq!x(4{
z!2=MqXHZ-o#<=F7a3Orn)E`ZyHgHUz&Pkj3qp!<Zzs2!WiLvr4j)H87L(wfb@_(*)
z$GD|(m{DYM1?z7d`W!l%NY?G?yj~;dr?H|Hi<}FR)s+Y{;T5OL!WNfMLP097TbR1L
zqt7xU%{g>6#Pe(r`i8Hw_0B{$Q%}?|^zrjKgh^gSxS$Uh&~f|R7Qrz7W^J^y%8rig
z%@M(<0snJSj>+9r^qk%Htz1)E5CoaNH3trHqH=sR;5=CtYjdrdy&#vz=7c|l>{Fg1
zq-+Esi6F8V6?*dYc}LH7gt9Q$H{LTU%db_%*Mbk<5$n(@atY&wbwjf{mr<iuY3BVg
z_A@x@OB_d$1MbMJrFi`YPIM^a5Ipii;ib0#Pxqua4NF+LI&QiEJg;SMJTpOR!Zu@G
zSpd7FwB+y^HV1g2A46l}(bAGnwco3AI#575W)*vjwmW-mF8ntZoA{OCoTr82WV1=}
z@8;SkMf|nggGX?>^3rE)X%^UGvHsh2pPf5hjqyF^$Vzuby+lcBlrjHz=(j=UeQo84
z_G@Hz5=ql9>tQu6DGHBF{nMhzZ$;+k0GP$_CAZIg3D_5c19dQ4hW}8b7J3-Lg793T
zF7;EwyL4F1)C-rqKh!hTBAbBO4tK$R(7LER5vr{~FRwUQalznO=JLJmzI=a9o!<BM
zI)hgo?DR}`2d7?12jo(Dx%;$r;Esa)s*pD3e><r*q2Fy*m(ZW0Z?iXGyuj9}ayZ5w
z>7T2~Kgm}AEVmv{lItOIZi2j?7IyC!FGPBbx8AwkW4E^+SIoxSsj{6>%A?k#ZQDs(
zvz_zXucgemHEqV7E$?OK9e}A-Jo}!*>y@0%5Qg_^MZ)K+rb{)OMcu$`o#R}?9|5Bi
B-G~4H
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-003.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-003
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  Target error.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-003";
+var VERSION = "js1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions: TargetError";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+Target_1();
+
+test();
+
+function Target_1() {
+  result = "failed: no exception thrown";
+  exception = null;
+
+  try {
+    string = new String("hi");
+    string.toString = Boolean.prototype.toString;
+    string.toString();
+  } catch ( e ) {
+    result = "passed:  threw exception",
+      exception = e.toString();
+  } finally {
+    new TestCase(
+      SECTION,
+      "string = new String(\"hi\");"+
+      "string.toString = Boolean.prototype.toString" +
+      "string.toString() [ exception is " + exception +" ]",
+      "passed:  threw exception",
+      result );
+  }
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..3535a7db2f26d4fac13bf68dea964778873e9c17
GIT binary patch
literal 7031
zc%0o>&2G~`5Oyj55)wy#4p`*~s30LBp{P;`DHN50NYqPJRU3PgY`gJVyX&^$L3kD(
zf+H7RfeS~j%&eWnan^2}I%-QUj(68Hv)_F4vs=?q$mv?GM~T1I^dt+lv+OvI@<d1-
zpGoRzc0`q<G|{wA1Ff9es##r2f4Z&|m74lHL^jQ*S3wA;C(I+958hIb6G{DT(g#sT
zL{1KPB-GL9tw+>bqqlKH_(&ONO0S_%{MA;?Ydjdi08Z4DmMrM5-GKkiM!mK9X}h+X
zj1A|m!CY&zwbhuKxs5a8Q~LlE@4uLuMxi^6FU<*|X)9b<uymRg@dsdj0$u*5e%yDQ
zn>d&T8Ng+v&1sAt(M$x+6<Bo00^jkIK_SN;O7x;b0rasQM#bNu#YHNFG#c8V0lsut
zz_iu>Z{h`;J}`uJ7?nnJ01nL>V+SUYl@__hG?j!m&637RD5+Ao<0Z2j9!*KU0~7Sb
zqagzG?D_MT)AC2p7;2l^YC-;UejrcNwF;0if)3P+{fhwZqos2J*OEjkf%X;3rAjNe
zBc%I*9FaI7yG>03pGe<r4B4$-yTfGFkW$FGoH4ekIZW=xI6Ah~22>p~dTKieE+%<O
z9U{9?eu)?(n*qay@hz-Dnn;a+Oz+N`II~;7EPK5R<Hr)%@*YO1Y>6$=&DrvI8{>hw
zL=IAlFj}An$K>a<qaDe*J)PByf}V^OEm&kJNETNlaKg<Gm$@x2ND4Wjc-d&0*CG9v
zF^T)o)uf({DDW_6r)wVao2hj*2t0Vcqd^i`AuQ-qpmf|sw}n55{}~(2tTLlRdo!tE
z*oJ?el!MVb5?!+Aew=A+b7_$3UNi7GR$TVCBhHg$u|C_X*~{{2{G9NKkbS~OC@I4t
zNF{(SFhfrwkahNKn<%2f8}uNmEIwf69}m7kue+SB19Qd`aE5gQT%C!kVaqi0_bmuO
zs%LQ3br=Vc5x2zGnX>ysnCKA3ssGvyggZJ7xVk6BaZr$(tIJR4fak6B$!8`=k+v!G
ziU@3z(vpJ>Xc6FOKZXYRXi}3$wAZV15-I9*a25Lswp)8{F1$m7O?=;Q$|Xa7u$iFv
zWowQuj}vDNin{2B5#;!fwBMenWoVu->F+e_N|i$NYe$HRBh|2l6dhb<KgiTmgiHG<
zT`1=)Duyb>Td$VHyUW#)_$*!gQ+pSGf#aey1@D=z2s$Px7FZzYv0IQtZ7MHzs-L$}
zMvgJBD7}OdS)}d3RVumU#8>i;H=tU?9-XrjpW_f#Z9xC5Frc^T@xo6&h&f)m)QPe<
z#%$^LmE^{K@#p)?ako)A^*o4c>h21Zz?D6BH`S>!Wx1X>(>+?rq*i(}$U}E;LBh)=
Q>A7(#Dl&PQ<qX6B0NF7QtN;K2
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-004.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-004
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  ToObject error.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-004";
+var VERSION = "js1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions: ToObjectError";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+ToObject_1();
+
+test();
+
+function ToObject_1() {
+  result = "failed: no exception thrown";
+  exception = null;
+
+  try {
+    result = foo["bar"];
+  } catch ( e ) {
+    result = "passed:  threw exception",
+      exception = e.toString();
+  } finally {
+    new TestCase(
+      SECTION,
+      "foo[\"bar\"] [ exception is " + exception +" ]",
+      "passed:  threw exception",
+      result );
+  }
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..89cebac87bb5b33251fe9e23d70e7a096fbd0dba
GIT binary patch
literal 7031
zc%0o>&2G~`5O!PsB_xjg9I)UBs8j+Wp{Nq1DHN3!k*JpnRU3PgENr~i?z(Mw5T1pH
z;K+qn;KGqBGixVtoV6RLj@puo<K6Yl>^I;1?ACM?a=KpYQR1&RJ;_4ttT>LNJP}gI
zXOeoF9a7~eO*HM(Kr5%VYF5|MpT1IxN=^MeBAe#ZOCW^PW9AXg2OHGmL{fi;^g+}i
zk&^=+33W7j>k+kK^fnF&A1UKZ>2(x}zuKyKjRzwbz=@jDk_FxMtMI?ssJFIucWSH2
z*l_ML%(b>!+l{H28#p6&+n+)4!P?X`3f*gbY)%MGTj9cjrIW0PKLGO+=<+x9<BsE8
z!@)Gj04^hKPGj_lW+HHwVbK>B_>P|p3OV*rq8A+sppWe^D*g^FE>a<+(a;7B@TJ27
zrmg;e9WU7Ofg!BJs5GJjaA?*TJ1~i?w8(9ysU*B<mNbq-NtMDKFPYu&XiD-;n4rfV
z4H1|pPoF-YmOpyNP}|g23-X_{19_URRe+2U^jWPPJUa*A-d{Qsa4kus5@=tbT&lEk
zJ3_ke$RUXnvfI=o@QL)@#*p3Wr8`Vk4Jn13%Nb*vn#1I7jH6>)Z9vr_qo=lm;9`=e
z)FHAP<(G&tvKcUJ7+=R4q>0oB$n@^4i8H(Pi?Y{SFn%O~EpK6z%9hv`-JC6dw=o`=
zOXMJ>2%`mRa7=zqJKB+~+tXRSDCp5x(Sk*mf@E<;0w>)3aGBfUf~1fWiWiNhc^%S!
z8I!mVT}|rQi~<jHcDm*vznOZa27w39H#A5hD})7o3Y3nU=(g|&@jqjunN?<VXm2JJ
z4BPMzlX5V6N1{vi+z&I2Z7vN`-D?IO$BN6rPQ-b#EY@dRHG5e;iJucb5wcJC2qk4$
z1gQkj1!m|;1hUSaZ4*UQc#R%JmBk0F{Nuql=yg}JbzshT0?x2*fU7f6HEfw?{=NkP
zNc9Y^x&q@MGUAr_I#qVR2NNB_IQ3t;fpABs0ay2=I0_1Kb9MRY4Dh_3KKaZ9DbhA&
zUJ-$9Qd)Ab2`vH~?Z?m{A5CiVi1vDQP9jB}4z6Nf!FFrU&4u^HU=!aroN&pIA8aNl
ze%YF%i{r#ugQ70_VFWq;J?*zAY8jd*O!_;?x>BVO{n`<t;z%`YAw>t5*$*=H6yef7
zN*BsGi;AI2@z$#)@%~D6BtA_S|JdHepX0bFO~KoyD}s&*iUk%3dgK-)QJc#1o$BXp
zl#yf1D@re+L>6g#aFt3fIq{Xe;|-`5u}A0Z#OFAKRU6PhD-7rzdbIG94`Pm&E_I?T
zjxk&My`0>*FaCUgG43`>r=GiUP2GP0CGf!~cR$ssGG)1*IMqE`$)r|#Gsr{t(}IMT
ROVV@WR8(a0GRrB3{{ivL53K+I
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-005.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-005
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  ToObject error.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-005";
+var VERSION = "js1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions: ToObjectError";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+ToObject_1();
+
+test();
+
+function ToObject_1() {
+  result = "failed: no exception thrown";
+  exception = null;
+
+  try {
+    result = foo["bar"];
+  } catch ( e ) {
+    result = "passed:  threw exception",
+      exception = e.toString();
+  } finally {
+    new TestCase(
+      SECTION,
+      "foo[\"bar\"] [ exception is " + exception +" ]",
+      "passed:  threw exception",
+      result );
+  }
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..205617172f7f56f1465f6683d7b7b8a6ab5551bb
GIT binary patch
literal 8841
zc%0o?&2HO95MJA9(;Qm#SRfbnQnW}5Cuq?_pcqITrFG%RL8ayr6vm2NNt>)lVs|B*
zz4sA{obwiWrJQ=~v7K3xB1J7JN~UVbzDOD_XJ)_o`DWKGJqZOnYK<86j=HYop(Y1}
z5ak9TBOaH`)qKhnQJQKtX1-RWb!b+%@~=Ktib>79msEDmtG7UjV3*vbLPSrQE2v~%
zhmJwjl*)O5OG7=G{TfmA)YxrLshAlPT<IfJihr#`^D`Fy1%i)IsI=t%@aPlx{yaMC
zzXlbp!$g=qybTY#?c?6bS!dxHD(Ri{PTLDlKE)@&3(3bE(Kvr#)%&vjYj;j>-pfa@
zVE;;9#@b--3GU^HymJV-gTj1-ATpfx1&g7lng_md=neNh;w8dBX5mfjVm3g;GCz!o
ze?Ypo%tRoKg+5q-HwpK-wkFS$c)^JW>BR?}Nu%0_Y$!To2PV;#S9!`clT>uglJ;dN
znNqmpJ+m7zS<s9jW|uAt5t#4p-~Vw@|Lik{+Ge&{kpI3ukQZ~g36QbEUaJS^KWqWG
zclWLZTuYN_1lsRWFH>4MgFrgJ&?$|(xzp9u_o(!ocADMlq0@^()|N7mYXu_nr<<~Z
zag1et+CVx6D#&dGfkk#;j8Hk8lygglY5@ovzS#GGtE5IS7I$ZDn#HZ}%3ePQ`Gtf`
z`5B~4_JY%3ShD5!wrq#2r83GH!b$=1juT(7fhLj<N4jVi72V4WZCK?>kZg`1@PSia
zE^B*S(GW^Xao5tcVtTrfWr_RH&2*n<6W_&_ou@oZajqV#$amrMC*~)`6~clsgRG7R
z@P6P$@i*h6d8&*w^|#Os(h>f}ydEsznd%ki^)J%_rgG@bkFEu9h!vId&P0f0S!~U=
zsy-)|xMhn+Ajee95K<<CppyWykQI7<_r*Zh+d@?uJi+Lp$?Ahy`N`nVgX9#_KrKPO
z@S%^Z3l)`4OH1BIW88ht#(gF;T|Fp7rj4G!1cZbV`9numCA|?>IrBC^b3xWY-0!P{
z{9A#-_VW~GzQDX`srhNZJv)UZWYd8TBe`3}He?pHA_p|z40kMmw^OXn1~(vnH^2FR
zRcQWIW59JYK#dXQCeZ-@jF`}FLl-G_jvCSW804UGB9^fA$}|35crc(`Fz=z`2hQw1
z$k8JiT=*3e`u23?HSoMca(7>~AjPy@(zUCg>B;CB92A9!GH5U#O@nf&c1Op8P81^p
zT*dzY->tVUB5>arY~t(cC3n>2#b%1)?Y`xRygNaxTNE2Op?BED#t&81GkWF0YKL5{
zIW5c|X|r<4XIP%>*JMSL=u5Jx(Gq-h&|C>#CC|UL=lK>_^~zNDg_-PN>I14ndSe$(
z1qIklZZ}b_d()FY)D+JUHI6eYHHwn@s&!y(qK$06pg%NN(EnHK#(x|fQ)LN^+0wsY
z`BrgDo4KRjjr;kPThAfl0{tfC$gjU~?l}d)tK9I-mF3=jZS<G)kVcv-Ca3fJhLo??
Qx!1<2ih0V~%@xG|0W3scX#fBK
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-006.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-006
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  ToPrimitive error.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-006";
+var VERSION = "js1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions: TypeError";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+ToPrimitive_1();
+
+test();
+
+
+/**
+ * Getting the [[DefaultValue]] of any instances of MyObject
+ * should result in a runtime error in ToPrimitive.
+ */
+
+function MyObject() {
+  this.toString = void 0;
+  this.valueOf = void 0;
+}
+
+function ToPrimitive_1() {
+  result = "failed: no exception thrown";
+  exception = null;
+
+  try {
+    result = new MyObject() + new MyObject();
+  } catch ( e ) {
+    result = "passed:  threw exception",
+      exception = e.toString();
+  } finally {
+    new TestCase(
+      SECTION,
+      "new MyObject() + new MyObject() [ exception is " + exception +" ]",
+      "passed:  threw exception",
+      result );
+  }
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..655aad27aad0eb722a1ff9a4b9420df4e56d4534
GIT binary patch
literal 9236
zc%0o?&2HO95T@<4X$qw1u|RuZdTEQau-ztT5hw;?TS;BmauLbC1ck98N75!MlGt6z
zX5S&_yhsmyrJe%h(qlWj6h(?!Qj|=^Qhc$ryPVni=I5KCYH|=T*sJw`xO+{9(?D8V
zmSqXY55RIM2S?H&2unyJp%0!ER&86KuB9J+A_Q;=?m6L2{pc+e!r+QJgt71t97Z^}
z4bn$ZL&7H)91_UE_*;*NL#?+yBy6mVQ6cw~Q1w^a)?cH=zi{DWwJ0Q~UU%;fe%?QO
z);K%auRpJCk5=Q|&v5q;I%L4)Ibj31*qu7^2_88KPunl?4pW=AakE)JXdRt4ruII<
zz1C6dxNdyvy#Bm7@l@J~$9P~fWyJh<h@>GjBe&!OcK2(``cy5Z9f*#jq|G4m43X6L
z^o3qg&$ZmqqR$iWkMycwL5C*y&?^4L)s0yye6BULQ3F0{QIASvZ0$z}j$DjB+M&R;
zXb*!Wdl@q@BUx#Y$5a9*tf`OGuL2H2D2q3=H5e9I$#-!Bt{eyyFhA_<{5&mx{6B))
zq_$d+-`*U^)3ICy$SQwcirtF`D**0S8#e;3p@dWd?E@tjgcNqi=k{-8NTOnIHzo00
z!d<%_N4I!n+pREwI_ExL0Z+WUnJ~|xkxIOw=<284Uw(YJvk<<Cie}8pS{Ed$O|~B(
z6{l{e@KWpyU=iLO<a2uhR>rnG*sxdNQbpUebw*aon!YZ!eva#x9G(9wt^#lQ$9^}*
z<iAbj1cQ<AFr`Q(05(riJTvG>i_>mTX7wsT_Y*}+7C9Fr%VS`*VdtmI!Z$9cxH+k~
zZed!~@_vwcsqB!|l%J;q&r$r9rZN@dR6G%(=ivWm;El2?zyp22u#P66w(o|~Cw)h~
zEA(o7-%L4(XQ<yN<){oEi=J~}x)*b2;aHI#4l>|aMpP~u1I9+jB5kHq<+(QJS|)$^
zyieE|A)zA(O9>*2Q6VR-&pNuC2}NPBue_&J7Ei|cv)Ajb(VSO7E@8aTuBT3CGAizZ
zW<0NyQRf8uZQzNl7A7J{Eyvdmu>!6LM21EotsWIA^(H`5PL_UD@Qa;%mf^6?G>7RA
z*hd<2e&|!z%wZ$8X<&un)G4AHYwWcw2~=MU*UW*pW2{a)#r|u+<<e`sYN7KAMyV=4
z2f42~34D_wfx>>^rm3Jzv+^Mk0!4$jR)i3;HKc^QR2rg4^j5{~{+GDXA(Vmp$o71D
z{O-+`J?>w61<m^E)aM28ykn)_GnRr>h3$;`T?9>whfi^4WGqaeQSqotltZM`J78oW
z!0M<|^iRCI@x2Q3omU#0=$C^TKNsXDn@);1n}%t5eVkY}DV8v-zYppy?$!&*ca5%E
zvR{}SZj*FLM_8Kf7o<fU=rf|J(iD8LRb2{RC(ge&$N36p_1skVh3@UJ??b9n^ahu9
z0R@;;t~OCE`pzdk-ejl25`)cLg(4@vN{y~nl#%5p^gk6Q^!qB^>NkV~A`FhvCjEz+
zZ)Htd&g<&+cvU}l>DgAeV7-Ys^4st1`*vpGMXLFx!te@yVf1IzkV=ZH3QqfvB?+Ie
Ra$oCRM;`O!m78lU{|{l|-H-qP
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-007.js
@@ -0,0 +1,57 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-007
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  DefaultValue error.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-007";
+var VERSION = "js1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions:  TypeError";
+var BUGNUMBER="318250";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DefaultValue_1();
+
+test();
+
+
+/**
+ * Getting the [[DefaultValue]] of any instances of MyObject
+ * should result in a runtime error in ToPrimitive.
+ */
+
+function MyObject() {
+  this.toString = void 0;
+  this.valueOf = new Object();
+}
+
+function DefaultValue_1() {
+  result = "failed: no exception thrown";
+  exception = null;
+
+  try {
+    result = new MyObject() + new MyObject();
+  } catch ( e ) {
+    result = "passed:  threw exception",
+      exception = e.toString();
+  } finally {
+    new TestCase(
+      SECTION,
+      "new MyObject() + new MyObject() [ exception is " + exception +" ]",
+      "passed:  threw exception",
+      result );
+  }
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..8736f471ebc8f12282b8e4f284903da51dc26aaa
GIT binary patch
literal 7294
zc%0o?&u<e)6dprM%b`_|2!yodMAcRSiAoh%k%(g;Rhm|{#RXOAc=y>J81Gs$vq{{)
zjDLg+e*zb{aqWAvYkR$(-R?RYl8}q-`SIq>H{bi-n@QWmQwiJcG4No!=PNNa>?&hS
z`_U9wAQbpU9D!!qa03$vjb`mFJGz~n`dDjF27>2Y_3YFy(1?T+;d3cxyWmT%AUNO?
zG<C$)YJ<<GCSLp+bG>WV?H+NtSWF6Sw#g{{wYTigq)}r7b+olnA{=dhh2MMKPJi!@
zgZ5V1Ht+kI`evcwCx`dfI={ru{$78-yVgS{pLhT2t(eUE;NgJQ|M`$iXtlRe;EK2O
z<|bq0>I%dNt>6O*33l9wC}dY~&?^xJEJzz8wLG76T{=#LeCdZ>;^W-ovLzyAR~X<5
zIFpG`80YElBm?#W<cAmvP}X#a$C-D=4NPh)YjR&0P+a!xknYJ;f!4I+mfekv*DQa7
z9dP2qlz{p9-o0Pf?JqtPs9no83-bH(19_dUO@K@x@>1VFd~gB4z1=z&a2+bq2(-VD
zUC>5*!$^6*@gttdvDY&^47dus?wsBFp_hnQSE)#CbQDXEdUIj7uEEk%7fc;g^UP)l
zS`v5w#?>e;P7h05b5OVtzE1haaAgRN_1!sTGr#rAve)mh{a7Jao?$DfezYHr3by>(
z#dqW_SF_AQ6f2m26Y5JC8m7c(Z1U@pp&yqEow3PUkepqLpboD%TsHQ&L=p-@@v_m>
zT{nG}5lQ<n%?QtvIP^)cv-ytLE%akO3w`{23Sk;oQyee>By>_f529d}e6v2<UTs_F
z{^o>WUV#6(YKLNXVY+6u{e7;eEg(UrZq0$ya-wpMSA{B#Zl|l)2j!u%LXSvIxLh2V
zwuDAa!-GbWn)3Z*4ILiDQl`Dhlq#&;Au`dD<+r?I;BI`&EWervZ6t*lg)}-B;Pc9@
z^87w(0hkI0bq(9mWGo$_eyTKc3p<8fNC+N!VdO0?C7v0p=r}A%63t2FIpBFcdjYEi
zDbY6LUKxR1R{Co81Zx!(jU_b1N2`)PH~zRId8~mAX_WXEeRr1rGV)(pY?4QhiZ2~@
z+EQc-1gufL$~_&ta}|V_hc8v*?~`SHz(Xm>`u{Ko)U}0yBE*l-sW65|4jFJ)6cuiB
zoebHthnB4uHcV%hJLLydGk}V-mEGWrtIe_cG*_9Q+*g?k94NK<c*7QlsArg{C^^Bg
zS0dmAwcG_xGn*<0aZLEX!(_0c9W*~0yhQnCQ$;K??%=8=JO%NUDJD&noalxZk_~R6
z%?9+_1_Sy4jz7s=mtLMaTsscNZt267^j{8V|HyGU9(Za?kC*1#yLaXZ@y-w4i%hL7
kwBx1bR8NXErLFdsh>hOgXJovdRBwz^S*j`0ms2$V2haUqJpcdz
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-008.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-008
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  SyntaxError.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-008";
+var VERSION = "js1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions: SyntaxError";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+Syntax_1();
+
+test();
+
+function Syntax_1() {
+  result = "failed: no exception thrown";
+  exception = null;
+
+  try {
+    result = eval("continue;");
+  } catch ( e ) {
+    result = "passed:  threw exception",
+      exception = e.toString();
+  } finally {
+    new TestCase(
+      SECTION,
+      "eval(\"continue\") [ exception is " + exception +" ]",
+      "passed:  threw exception",
+      result );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..5775ffce691f6f37d959d0186ebf55bc3e66b66d
GIT binary patch
literal 7291
zc%1E6NpI6Y6m}QNB7ry~kjxpOv}{tVC{mNUrKJQ^r#*0~CiWy5bz)mH<1G9O{tZ8a
ze}dEtSKf@XIF9Wsb(0j4i{n||oA<r%EuOsaJ&FtY21a(lv>5S(wxMYnw_FcvHeuKj
zq=mW01roT49l^DHPOZ*|x9)R}nZWi1Vy4=<2|_6D5DQV-J-`-44BKVY1W_%-Mh7h9
z34id`K>R@IHCl)clu^P(K?;?>d``UvgFj&4o*d+Y5vN{w2>*-cN9FU+MdK`=>y7qj
zAHZxGb2#ed&e-IAm^6)2<@if^Y)-1E99K?_*j*RKnK`m6e8R}F;n{;O*{EO7G))>Z
z0y2P0P?h2UJtT<hXzQ@(ia54r_Xb@y^ic0G(xCwQ@Ni1S9~fPmq{3xNLlrc@PK`K3
z#QMJ&EI77-A*4nyQ=%PkX!J0#8214Qi##O)Gek|b#OQbob1p4jQ`S&_O!8xxz#R*F
z5}4Q9+q>iP2hRZNIJMb={CjyIk5e)WkYyO0m^+v6Rsh@=YfAw)CKF@=?RzN~QWMu}
zF4Ip?3k3;THwAKR#BAN@vzzbfX4es@V=(5j6>!D%a(JGQ>oal37EHX|d9(XrKB^B@
znEleJbm5`uINM85FGHu3c*zoqv4&XPPcFbiup+i4!3G7L2}!qc>tf4N)bzVz>r)tS
zGjRS#7{#pOp1Sn}lYhqL6CfjE-H;*~0MOwCe5SZ2G)C$T5!EXNy&5XIWsx&Ma(g9M
zPUy+uGWUs7Qf@*h#;L5Z?jb-A4e5}k68frZcY%4rYLqDQIo4`&75NT{CpJA%*Sb<{
z4Z7qBt?^~qr?eMJ!R!d>+Hiu6DCy=5DCojT-I1#!VbxE$Q}3@p1Y$8o2Hpxz1?_sq
zRC*2*9)iybdr#LLS08kCx@a)B?W8avy9~7?KtZHWCjdHA{G@s5t|s>QFS(g&SW5XW
zh0;OT;VM_$tZ7jIraL#=6muO{*Z#eTxP`JhbJltS6E#Gr%vzAAa66_N&dvA);v_yN
zSHx_2_Gvvko|SQXAsIw=z$L_EU{xj|*t;1uX+@f?M^d9ofVyDa1yze12~CRP>C*FE
zD^QX*BAXAaL*KDv?-Tx5m&77`pLZP#o=4c}B{~llG%;`~xQLYnEBL3*sAl;{8H=#H
zf0g@nRL+L#$9h9E-rK(H-wvdg?rE+}r%Olk73TDgV#FUVYa%*8h${v``~tGT3NdPZ
z)X~$KkVb=|^qy3ienFpnz5H!6CR4BE=TR=MrmW;ilj3=ST_sv%S2;`mTCC>fIiULA
I0aMrWzh2}-=>Px#
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-009.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          exception-009
+ *  ECMA Section:
+ *  Description:        Tests for JavaScript Standard Exceptions
+ *
+ *  Regression test for nested try blocks.
+ *
+ *  http://scopus.mcom.com/bugsplat/show_bug.cgi?id=312964
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               31 August 1998
+ */
+var SECTION = "exception-009";
+var VERSION = "JS1_4";
+var TITLE   = "Tests for JavaScript Standard Exceptions: SyntaxError";
+var BUGNUMBER= "312964";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+try {
+  expect = "passed:  no exception thrown";
+  result = expect;
+  Nested_1();
+} catch ( e ) {
+  result = "failed: threw " + e;
+} finally {
+  new TestCase(
+    SECTION,
+    "nested try",
+    expect,
+    result );
+}
+
+
+test();
+
+function Nested_1() {
+  try {
+    try {
+    } catch (a) {
+    } finally {
+    }
+  } catch (b) {
+  } finally {
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..cb256ce9fa4746074c5dd7c6680bc3d073a0f025
GIT binary patch
literal 5023
zc%1E6OK;Oa5Z*v}gM<(lZsx=RLD~ulwX!1RVIWc(syMB<p{+fQSKZpy?m9_-1AmC0
z#f>YocAkz+(#lC&L@u#scIVsq=Cz5bqL4$y^nkh*+Yu~O<SrpZIzb4;Wda<<`XGr^
zRKYp;N)odiuQq45R;2`?z&)nIj<;^15e`G<P|hzJ;BYFyZPRl!)u&=!;LuP-lQ)mb
zMvQCqDW8CGCRIfn)gQAQzb3+C6zC(HQVHhwDi844w(8yH*S1+6$;P^SsOvVnEo(ue
zcO6?Ddv4b(ObWYXmPh{QpRD|Xkf&NW%M>!i=n02}0;*WxlRLQRjQK8cN5Vi%X&xO$
zyNJw94;MrHMrmmoL?B{>6GXtBg!xQm2C<ebXu23?cFI7+rhSY``Y@Rsj|rJI*<uO=
z<#xQp8ioR-)E<{&Z+Ns|`57u;=s>86dAGf@y=Z^(olu<xTP(@Hu8-u!lq`be`>3$$
z2i5PpS7LVxVUN2)j0IEZEYIuM3T95H+0xwsfKbtk@_Wmas+4b8q&?EjOHrY^Al0IG
znZ=rReSMi!DqTw^WwgCQ^5_*R8iD^t8FfLWXDCku15_A(#Q8s$TF+5F5XjLNl!E96
zt)Q2aVL!9tjPau4Vg^X(2+qnR<Qz^F5v=E_G_E%Eb_%p+lb51oeRDu7jQkY3@`?Xa
z3OVU{+tO5f7~)f2_v>X%vrETE7egDXJgIp@VYhvsLFs=gSEI6a^tpX>P_sJw#_rC?
zy}eCRiFbF_^Y!W!q2md(^8PMz4{C*h^h6I1%dU5thim8^k5Q4N<&rsct2unAFLB=v
zvHMz$f(g`l4?+ZDBiyxNu=YyUWa%4Wol3|l=9h@Pl`iHRG7Xny^tz(G@s6tl0C>ur
z7|}u+?$Z8{YPGj}h-peyF+YZGvYX3h^^ZbQ=L0G}RhuoV@p|8|y&&SQ;n6-AFho<X
YF<{CwBHy7A-nxy+9~rA(jpoIF0Bg^8AOHXW
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-010-n.js
@@ -0,0 +1,25 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+var SECTION = "exception-010";
+var VERSION = "ECMA_2";
+startTest();
+var TITLE   = "Don't Crash throwing null";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+print("Null throw test.");
+print("BUGNUMBER: 21799");
+
+DESCRIPTION = "throw null";
+EXPECTED = "error";
+
+new TestCase( SECTION,  "throw null",     "error",    eval("throw null" ));
+
+test();
+
+print("FAILED!: Should have exited with uncaught exception.");
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..a4760b5e9d8656d6f1c62e0bf23eb455b6e4de73
GIT binary patch
literal 4716
zc%0o=OK;Oa5Z*v3AjIRs5oAt)5Tr$%kQFH;MnnpsszbyLZS6_C>ejY)*Gc*t_(S|G
zZd^DpYv<uOHc2bH4|-`bvpe6;H#6UEOcjM38m0%-ZP<=rp&~a4A<_v#ATAT&C^iO3
zq@oH=z*mx(^?0?J-rAHBgaUU!g&l9*!5|!_%%Pm0w!z_4fZL-d7-~$#s==Y5iWc8I
zD%&xxHKu$4#+g(N9aR6B_4sRI9H2oT*_28!f7G~*pKYtv?|kW*^_gw%yM?}fr{A^K
zJbKr_I<!}IrC~DIHM2g;zxZT-9uaa+8`Df7LyR7ANGPC+1wOffi;kJ^5_e_{#FFOO
zVRVYf-12ZS#Ba3LHbDd;MmRzQ+)0?vRBjPJBnvt&mYEG1h&Z&5RmmPEm*Y7h>5yHf
zKu~VSORQ-qKuVo)EzX8VYmx7x1EvmynwZyn`}^zh7ylEg^I*#*`Pb!<yxx*!ki3fy
ztM$40{q4EfT|(G%Rfw@*37waD3#A}+I?a|=2LM9FC@R*LB~_W+@<_X@#Y<74`XJSM
zcDcivO})BK+O1tmC*{aqDSh-59qqt>u8fwT(leANf(bf|$ai7Ld~pA}{z6G76M;m1
zLMw=V&<#cfZT2&-*jO|wPE$a-QSib{>ds-Ph+rd6WpQ<&S4*IZL!OC}>MjHAFp68~
z+$a9WJQTF&b!$_dVThlKB#`G_X=kp_V|09-k9sowhC<zalf!FeeB#rSjeNa2!|Gf>
zx8C2!0)W~=PxYg&ZP~5E&OrrT{}3Gsm)pqbwI=e8eu#WKK=H8JC9|j}0E7s{g>ct{
zN#!%G$<nWy7L`yi)=v<5Cp*?xM9jBp>#9nA;R39y0C>uRLP06|`(Q!oi*dkQWAEi=
z;l1AXnx<8i^RmCnX>Pi{f0WWb@6hqF+38yCXYUQ$3nK0s9vy=LQw-%A6Q(>IR)<FT
PdNdZl%D2DWSIvI`w6zo)
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/exception-011-n.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+var SECTION = "exception-011";
+var VERSION = "ECMA_2";
+startTest();
+var TITLE   = "Don't Crash throwing undefined";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+print("Undefined throw test.");
+
+DESCRIPTION = "throw undefined";
+EXPECTED = "error";
+
+new TestCase( SECTION,  "throw undefined",  "error", eval("throw (void 0)") );
+
+test();
+
+print("FAILED!: Should have exited with uncaught exception.");
+
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..0e564affddc034d1476177c2c9f36363556f7158
GIT binary patch
literal 6231
zc%0o>&2rN)5LRgUJusZ$!a<W$8Cuc;Cnkg`X&B11q0?kKaOx=bHW5|qj4U_J190XI
zcm&S86<3a|<Ro?yIc-vB(vnN;U1?YQY4=;nMHO}gl!`52ZmH%--ce+Q5E3|k2Z+lh
zIEtS^Kmx@Sw82vWDHhD=Vsh$s5P($R9x+)nQ&-W5fOGCJA$mLD2qwX;vNoDJV{%mB
zu#O6cZ!H$=7{8S>CWg)g4^&AT)xToFyhg$wD7dYKfs)*7mhR$ntx~S<ey$b^ec3>#
z$JKZ1dzA@|o^@0?tl4JWM;)9y&{5p?CbV}@D<KGlidD(=jV(G?EcAg(59!xqLLO*g
z5@Ljwvxa~OJEqq{ZsDL)?zzP63w;^yPk%9bI}!4DamK}8l;$pS;Y;J8fgW%s;T~7k
z-G3hq*mW^K_z4GTOnbPU<BPFw&H#|4$vv(>GEp-_D(4+UIM5O2Of({#u>8<$(qP=i
z=H}L<gW-RKwass~DF0a=$`i?)3Cg;FKGn94Uta@oS941N*TNy0K>HLGWgl0eVPS$I
zi<<S*HTsUeq0i<*Ja$|g5V%=ETq#yG%E;P@HERSlkpmDWn_+qzh~XQH*aoDgRctF#
z)ge%m(OKznJoK9q>m!tRC8oqjl!C1Ldww$|<lnZm#`I*emvE#@Vvr%&XipT8yxCIY
zezl?Jv7-f>oC%V}wF0f6>E$x_il<b5N-6%g9maa-$zt!c;SY=paIZm!Sy@hpNjYz3
zg6|VlRDC)$PrEFjswMrd#nUAKughMUDW?@vt^vb$d&r_FFAEk1U<X9_&Z!w5-8L?H
z#W2&NOU6q2CF5#$is@%|VM~ka+<kO7fRU$kobNUcnK`pwL?uM`zaAfLAJVr}$q?}9
zlCOL@INZvwM-MOac$P6wukx0Jv(x94{3|DtELnyo1Fu$wX7{F--;61ITn&ZjCsw2#
z*@q3x=UW-&6;=yxdV2I&b`1c!^!z#|BB*8egad}<KdmQZcOYB>bTcsiyo8}4;Lbj@
z8zYpV=lhLsNR6Z;_32O9%Vs9NNvWLv`#sbuKid8|kNp?%MRv(hh3>-XSp%Z)KxGzK
zP%|O^L~2+ar-sEGw{ON(V*w^-=B0I=4Su`LXq-fpdz4WpagQJN1k07=O78WJuHn%Q
mx{J8%TtG>gUDT$0*H~E7m>ZO7E$)VYq0sE2=Kl~gD*gw>xc%M$
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-001.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-001.js
+   Corresponds to:     ecma/Expressions/11.12-2-n.js
+   ECMA Section:       11.12
+   Description:
+
+   The grammar for a ConditionalExpression in ECMAScript is a little bit
+   different from that in C and Java, which each allow the second
+   subexpression to be an Expression but restrict the third expression to
+   be a ConditionalExpression.  The motivation for this difference in
+   ECMAScript is to allow an assignment expression to be governed by either
+   arm of a conditional and to eliminate the confusing and fairly useless
+   case of a comma expression as the center expression.
+
+   Author:             christine@netscape.com
+   Date:               09 september 1998
+*/
+var SECTION = "expression-001";
+var VERSION = "JS1_4";
+var TITLE   = "Conditional operator ( ? : )"
+  startTest();
+writeHeaderToLog( SECTION + " " + TITLE );
+
+// the following expression should be an error in JS.
+
+var result = "Failed"
+  var exception = "No exception was thrown";
+
+try {
+  eval("var MY_VAR = true ? \"EXPR1\", \"EXPR2\" : \"EXPR3\"");
+} catch ( e ) {
+  result = "Passed";
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "comma expression in a conditional statement "+
+  "(threw "+ exception +")",
+  "Passed",
+  result );
+
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..36a7c196c669aacf23b97098f9134e398555913b
GIT binary patch
literal 11296
zc%1E8&2rl|5T>29PEYN$x1KmT)stzRc5>8sYAZ_W#F0G~n`uuOn1m!G6v+WV%X)`A
zMPH!TK1$!Bw;nQ?X?H>WkPt|VGATxBeUXF(cCou3b{A{3WE}bQur;K_JM6ifMbf%s
zS(b3ah*}=w)RpXt3QI^L>4*kWSgiv!yOmygBn0J>dM^p@sik*;iBGSYOMHLwn7TgU
z)a#NFu(~2VJK&N?#`9l8A|5Nboh#zch51a#Lu877tpoKl8GHu=pW&d8oCSl!d+`1I
z;_SS0;r!Y<m=0!$95%@1WQn*3#9pWEoSb!+XrBPhIdM)q##Jvn7d_J|+!wueX(U+~
zEKxsI)Cg2vBJBVvGA`g$#C~c)+7w>{eJ5oKjY~2WtT**szD@t$x2(@`FzsXTEhCpc
zO`JziC2JQZy<vf8dDFp=F90%?i+BQ`FZQ8Cyr1p0NJPk$giDYBD=ii<X@uW#GU3Dn
zfU-WLT(J%SPx@wzKAssQ&GM8<%8B1oQ##iX*j=E;J4zcrUgG>^;?3zi@$JKhKYaIE
zEDM=`CiXVTuGZ3jHD~Fib5V(<@hm>;egEpw2VmTH%^24Zjw%E3EI!&tt_$<Q6l>Xe
zA+9&e9ZK%vj2LauhJ=yYDcTKl2&ER`gE&6}EsUn=X)@mzFh1sBoS$Hnawj|u2g^z-
z-Tv4yI2as7_#`C=!GTs&zV>NfTAU4rQkRR29xMda%(9e8>I;lWu=63b_KpkAKn^^&
z4W?K=K;gxuLxs%2r=Guybgee@{b)KF^@l!leP>d)OUJdl2tjznIhm~Ko{c4{KbuKZ
zdI_2zP`cm}&fKDiV$F?Ndm4fZ4I2bFTZ7QdHY=}p0BuyRU@ENc&yJr#3~nCQ=6g~G
z*}ucuyE>psCkG61ap2KD3#eDD_s?2_+)XD)^##s_#vV6#6*AA9AS*!Lrj#$`J&XWd
zV#wopLFi+>gBUN&Rd@~=KOxLFxozX2{hwxxo73E=#J*o4f<t@G-j+iijtx@&E4OJ=
zuc$I4pA#Y0M6$ytZ6e*_BDpHXLvI3E3C7z#i3K$)?}zRiH9hGz-q2!v)s20B8iW&S
zCLKAu2ES}q@?RxVt$Xi4{h9lMjxIA9MCH)S*8nRknx^|YmY2$2MRicB>Q-pZov}BY
zan@hAGQS!8?G(b(@KEr-ecf!(uD<iL58-b2<3B&8k(d{BYv?I7V73xDyrIZb%3(RD
zCUvQiVUilF4GJ}YVN<s}Y%R5kFj!5g_}d-BEw7%&;&wDuYhYQrW_tvLr&K~wOl>v6
z4*NC<?BqPz<6$Uf1SahH4b#wsz123*v)@2rPRDh$cW($ym9?h#YuNj$)p}{Bc`0to
z8{HUTWHmkRCvo5+V$!!g1S%6pViLIU`IH9J(;C5q5e3X7Zx*m@OTMW+Dyqm7b6Omn
zy?Qv$^1+BOXI=7%!&_L3)$K|T77!6ZjEU7qO2UDWB(x-0P*<m(1!#V-j1I`JGuNwx
zi(8Qy*N1#W{JArP0xN_Ba3TOuW)1z^)V?ftAJ^@BJ3R~TH0y6s_w(&J>Uh&4&}v91
zI=IJp-q3T!uaEK{uiW1=c($REJYD?i<@w4burp*LCEjGvlBg`5ck-BifVZFqOuot~
z+ejY8%@p2mez6Q)veN(X%n4KVUy8O68+q}v5o~mGHuFC=Hja(L24yWCSh0nX8U7bj
Cx04e9
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-002.js
@@ -0,0 +1,60 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expressions-002.js
+   Corresponds to:     ecma/Expressions/11.2.1-3-n.js
+   ECMA Section:       11.2.1 Property Accessors
+   Description:
+
+   Try to access properties of an object whose value is undefined.
+
+   Author:             christine@netscape.com
+   Date:               09 september 1998
+*/
+var SECTION = "expressions-002.js";
+var VERSION = "JS1_4";
+var TITLE   = "Property Accessors";
+writeHeaderToLog( SECTION + " "+TITLE );
+
+startTest();
+
+// go through all Native Function objects, methods, and properties and get their typeof.
+
+var PROPERTY = new Array();
+var p = 0;
+
+// try to access properties of primitive types
+
+OBJECT = new Property(  "undefined",    void 0,   "undefined",   NaN );
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = OBJECT.value.valueOf();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+
+new TestCase(
+  SECTION,
+  "Get the value of an object whose value is undefined "+
+  "(threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function Property( object, value, string, number ) {
+  this.object = object;
+  this.string = String(value);
+  this.number = Number(value);
+  this.valueOf = value;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..6e888eb0b602a9a05ad7a2a3ea675d413cc126e1
GIT binary patch
literal 10502
zc%1E8-E!MR6jstg;er_k9su1i&|x5D;L>C!aov&<+zfU*+;uk6iM{Pw((JC{_#Jo?
zF1Y0lcpUB-X5gHaY|HXWksK+m1G%xiKj-(`^Rt_djw1nwoiQ-~aNtQEY3H8fILZqn
zaC|Po)BF;Yqcqbnfj}##b6{3?vRjXo0;$1&$>hLny^ll$Tyc*HF?$T2U=sX3n;@x6
zCRYbM7U_8LYs}PR!?$<I#DbaNN*@wY`s*B+pUL1KIPic5m6kjh9lnR(&m_tq^{jJ{
z4$dcO;h@(Yo;>fb&Ao$j!;|4@&${bn@27!n*ZVjJR~|%~hr!zHyJj{*ZLCugR4g)6
zS-o<~;%92`VpDwjnd5vwgIU+0OE^0hkl37&n9e>fdcy<X@zcRjF8!JcLoh&BErl~I
z{>IV0>sW-+a5zT}xYOYQ*H+XVCksw|#1+5bAPwmNVUQQb>bJQ;vLsKr2Fb+0Ea_cE
zXkkSf?-^}Gyhiz>#6#&i_2r{S-+c92tutACCib@RZr0L&ZqL$dSZ~DAbiSSqzJB%X
zTVUM3wqsmNh-nPO^O)xzc^<AuQ*31CCA+~q<Qu-rGh($t7vp?JQnDL`egKEbQCyrj
zmPX6zX*1u4I6jqVobPcI<S;x9N9#%&-G1M*I2awp<SfI8z(H0sz7}wy9mz*yo##u0
zzF0D9nPe@Kv=<m@!Yzi-#uAsDfdY8$8ceAqz<NpQAt+sd&wT!FL07EF_$Z*&IgRH5
zt@8dM8V7WR_(nC&^W$fT$8s?CVcNPE>~-LZ6Mn<J_wzxb_CX<c$AJ$QJOIC3?-#jX
zv7ZeV<_jjX9C;G(GUUEJSftYS(Q1-=W#T#u#Fap;P33EOkHTo5Sz=njdAYOon6*u4
z!gECU3FE@%wp*{q{@IRk3!1k^?E5hxICK}}T|JiJ)WYSz(plJg;l_}B#+2F+$wN8o
zGVP6*$<-(x`ZLT*INlX3R$y0Ngx(voJh?Er=9c7DKNcbl!pZDPI(o5h@yl){|0<Dc
z(;AHQ=iZMnIbX>jCWoHCMp!vfn(o`!UMqW*)j^pu*r2&^1r;zlOpd{ZRb&P9cQX*r
z;=|zoW(VHDv>Xe~9-xO9@AmKh0jdqfqNsZ}nvNPtd`qFHmct58P3u9S1u)!Jn@4?i
zmnn<YjEcYBv$T2b+_LP(4O0swYZq<b;lxwWSQUdi2efNey5WV(0yjBW?sOa~NGG^*
z7rmzCYU)Pvkc&UZ5*?;(TzXv-qZ+%gd)R{PRqOWJM2m9Wj$i*#sL{>b{5^>Sj}VjX
z`v|C99jRI1;pbBb(qkLpf(amIk_T9--;!@eMl-8cs=8c2oIl~7t<s^;upnLYz4jN}
zOLcCgr&&To5L1S=P9@>MI;C>iu%yDyJeGbk?}AI1<ey%v)uNkK%jNf#E2s$Ngo%Zp
zl)*7Z3-m8yQ?L5q2iqNIy{3K5DmT)zr19BY#5@FUPB9O~TyUy}gt9YzOh=JCSN>lX
z#jpMD1B++3RJLae<a`NVxlA68xyrD&8MG!UYp0|lqHkfRv;~t_Ic2w!Vo8|N9_VMs
ra+Oy5nX({Ewcj}HAU2BP<yNrKFA(N`Y}`6FDyI9!>|gPcV`cbX`$UxC
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-003.js
@@ -0,0 +1,55 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expressions-003.js
+   Corresponds to:     ecma/Expressions/11.2.1-3-n.js
+   ECMA Section:       11.2.1 Property Accessors
+   Description:
+
+   Try to access properties of an object whose value is undefined.
+
+   Author:             christine@netscape.com
+   Date:               09 september 1998
+*/
+var SECTION = "expressions-003.js";
+var VERSION = "JS1_4";
+var TITLE   = "Property Accessors";
+writeHeaderToLog( SECTION + " "+TITLE );
+
+startTest();
+
+// try to access properties of primitive types
+
+OBJECT = new Property(  "undefined",    void 0,   "undefined",   NaN );
+
+var result    = "Failed";
+var exception = "No exception thrown";
+var expect    = "Passed";
+
+try {
+  result = OBJECT.value.toString();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+
+new TestCase(
+  SECTION,
+  "Get the toString value of an object whose value is undefined "+
+  "(threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function Property( object, value, string, number ) {
+  this.object = object;
+  this.string = String(value);
+  this.number = Number(value);
+  this.value = value;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..58ef04e5178b0eec52174db89d8551e7c0432465
GIT binary patch
literal 10483
zc%1E8&2r;J5LPxz77kDpJODaTY*AE}Dh?b>suHhv$r8LNY__;<O{9)J>{xQmjN|wn
zcn+R{6A!}+aHY6F_ei!Sc_d4Y6eSC}*q)y0p6UMjXL{1nv#Efi&KQ_~H1H&!YG>bZ
z9OZ>maC|Po)BFmQqcqbnfj}##b7*FFl1q=30;$1&#pJ*&eTYm1Tyu{Jv3LreU=sX3
zn;@$zCes5Ro9fx>*O;lNMsDwliIp(Hl|CY-^w&8wKcm4vaNu1UR9f<2baa5<U!J_^
zb%&k9cxXwYY3CBRC-q{3_y~yuTy^@gzd?HkX~WauS<kxaRquy^ZPj~7gKH0_nuoy#
z^}tZ4cu*@zf|`j0DS6~?kp3WX<n4m&+)$CR5%bmi`=^fcJ`E<#jb`TTLO^6kMq<r|
z-tfS8{CF^wYpld_30i3W^*)S<zi@PKn}|>v2^S~<S2{f4+KR-JXu_$FSml=-q+uN(
zw6dGA8hojcB+E0dK{7EgQ+n4^RHmX6@0rtx*#_qiBGbn6zIgKFt4#r`&q&ucx%F!K
z&-S#u;UKkWnVj;);LF!{LAigoqg+c|sztRQB?6^;?0GmJRk4$v*Ww1t6k_DA{llt*
zF6NEIPDyW+N&p-tN3;Ayv{qW?oHq4+h~smK%J~*YK@P*SaI|?ybGG01ECxnHF}X+x
zB5;t_jI9M+YDe<XSZC!DqtDlZ8fIBZCCvpzBDnbw+IhzXK9B>?`vy}=?^u6HJp`q5
z@R`lsMQ5!y^oa+pgg#rDXFF^k=8YT3URS2<bBJpnX0=q=hloQk6QY!B_Gc+<M(Bvx
z)#A_<H!}gry&}HO3c|&1`?gn1)_T1TgAwCrj0^DZK*jV=JIc+uD%GOjkCD(1-4%OR
zk7YQwNck@zIeW#e4aw(BsU49#l#4FY-guqr&A~%|fyn{KyMoOW*bgs4?~R!rwMe$~
zMP5@7wuWA_yB}@2bH`HT7)hgmW@qx<(x9c+4>2`@t}#;WS|!o>x%WLxE>dZj)`u5A
zBdnZhoOPR6Ua15qDn}B9szGz^45}k^7`efYbzTYdcM}j#;=|zoW)5#)T8xEy9q93X
z+zETT9jG!C^P+A8SD+TuRw0SE6nZKdEXQja4+;%{;kIsDbQA6}Wzm{B;;;Lb+g3Au
zko(aCYJg?sqU~!WJO_<cF}O=WyJn^vUb-xBBgb;*<4{3N;L4>drloImqpgs2Kf~%A
z=1p{@wuGnJx@nIa*n8QMy)x6hG<VN?a};HCJ#D#Xv%n+7B(Hn~RIZNIBJl9@IRvrC
zPI1Bn5HrzhE0u21H?v1WRjGn56APE`wdZL*6ctviD?ZNtf@`V7E%n%XV0uTCT&<)i
z5?DzplL!ln>%=SOC(8?P0jKPnXt^?Uw?etNW0*okC?`y;?4%5iF<PK~5t}+~gYRrz
z#%lNVtm<!e&VoD7?pxe2+>JSAp_mCy<&aS1(<kJLWVzyhsmOnZcOO|S+fv1ztc|nP
zd+7>!IOb|gce)}fE2pG9rg!j?)Pl;(c-gI_SlUeC_2(zY(nYKMhL{tkn!hvMLu};5
b%T}<_&)LlX*tm6UluY-v>Az%uBQ^Xl#Q%uw
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-004.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-004.js
+   Corresponds To:     11.2.1-4-n.js
+   ECMA Section:       11.2.1 Property Accessors
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               09 september 1998
+*/
+var SECTION = "expression-004";
+var VERSION = "JS1_4";
+var TITLE   = "Property Accessors";
+writeHeaderToLog( SECTION + " "+TITLE );
+startTest();
+
+var OBJECT = new Property( "null", null, "null", 0 );
+
+var result    = "Failed";
+var exception = "No exception thrown";
+var expect    = "Passed";
+
+try {
+  result = OBJECT.value.toString();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "Get the toString value of an object whose value is null "+
+  "(threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function Property( object, value, string, number ) {
+  this.object = object;
+  this.string = String(value);
+  this.number = Number(value);
+  this.value = value;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..847c851cfcf9acbc6fe772016b4a0695d92bd240
GIT binary patch
literal 6367
zc%0o>&2G~`5Z=;KKu8D)i36t`TOrgU!7YshX%IziK-lWF+St>0>DIQ^>!x`KUW6y$
zJ$M6NfGancT|2SkteYQf(zcg$XLe_Hzxj7l#vzAR(*x?ZEJv_Vl668z<OCrQmkDqr
zyMTy9l1exSUq+<4qjxv+N8dyd2np^n6_!4_fkHT3GKX?L+y{qK0dAL`qo@liCJ7D=
zWjtPaG}_mCI~SCXm2noymJ+J|nmc-#5WgW|QxPL6nBQ;R!~d;L+dlZ%ZSJJB5$`VY
z>;wC-GsRJ-jys<%)2Ro@gG&cO$pU|hyQ#S$Uf9SI5XC&l%3pmC`FC<xpRLF&4FO4w
zQ4Z73r-VFI#Jt(iT#WWOB=(?6t-jD1^IhVm#6V;=PxUGnK{ICe&?<f-b#0c4Kxhp;
z)PN@m^O-by)Z1jkfr~!JP8kR-+D8{DUdCwf5g>VyhfIQ?+|pY*mmz`~sTZ&5*YJ2s
z@}tDG>An}cyRWAejDHiXO?s<E`Pb@Do(hmkP*y?t!FqY}>KcH%A{RE~rAnZEtmJyo
z@L|xvtgP?86v~-0Yg7od)+{=V2(&T#=kBRcQw0HlP|=Ue%Si@V;gu%vRMy1uB%}?I
zoPM1#B^IB4Q{Ji!IuPgv?~w|^4i1BU$&<gY8C)4%l8RwYkqU#6XJElTl|-<<CyRQO
zpy!#Qnnf-INqy;GF&gFJvh<Cwi1w0DytP%u*wa*DJ0<uXWgOgVP*qk4Zm~114BSr?
zTmI_+?w{3wThgmng6|V#bc4oNd_#I77#Ot70k$oMZ7Llvt7RI9z#U?FLVBCiI07>m
zJaEqR_GBEKF$11-W6skmn{X%U(N|MFTC&#SxXJpy+Fhu)BLmNU-p1k#vcgQ&g+c9I
zfa+$BsPvX>cINP!cFr~OxN5)ox4_Zny&A)69dCO*ow9GY<1OStSCxhudgB$qwm^Pf
zwsThyFy{!)dlQ(e^Fi+mVoO4y8ewS;nS~5i5;f`iK5}J{6qst0LJiLFKQg2OM2&-O
z8W~X2PyB(JH;QSYp2_28OkE4NDbL24X-|J)P$g+=yRn7c3a%>5Rx@I`vSDw#hGB2s
XCVXL`Wi{c3f8kIeDVP6{GfDmn3~@1_
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-005.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-005.js
+   Corresponds To:     11.2.2-10-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+
+var SECTION = "expression-005";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var expect = "Passed";
+var exception = "No exception thrown";
+
+try {
+  result = new Math();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "result= new Math() (threw " + exception + ")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..7938dc8226c4cba284c56039185e8e6c9aa243a4
GIT binary patch
literal 7435
zc%0=}OH&g;5FQ@Bsyt|U^R!3MQt$-_V=NM)LP4-dpuAC&-6k0rcDH6HB>5@+6U)Ej
z53tIURUWiwHjhm*OGwxyfLy|M&vZ|J-P4cB$hyxVo2dbHvL#zEUy?aONML(D5Qhn{
zB|C+H1d>WP0apejv!qvNqFdL30E7f*pNf*+I*&p)G?`5~Z>@vPsQ{-)Pf*k;75xO8
z`m)~rs?lIw>n)s8-c`m~AhSxS`pYco&ye^733nASkb=3@>^=NHxA(EQx1B5OW|rF2
z4)->4cXFGBe0hj<2U#U#Z0r<=c(;&O-Y9PsjJx&=yCu^ubrfjY;7jJY#-l*fM@x+?
z0YRNdSW%n5Ab&1m^BGo+K7&~ig4}j+JoMim6LMb>qoIHyz-Wa-=wqtXl384I%v^^!
zZK5Z7an#nU?7`6JokOemgVdQ(Dm<YzR8Rx%B+O;f7^S&z!G?oz%nlg{E!xGf8$66L
z7CL}LMQ$+(g7T7HQfT@JW}qyd(bn+#kmQG<*W2r!EibP;KMIC*bbmv*O{$Xx`seh3
z9=bk>0Ija<X6ePj>ni~6@9BVR$Xba&`#{O9f#pKO!ep<{eg#neH64^=3Qi(OtNi@x
z<?8Cnn~Cu4sVH^ox7O85Kt|j1ShORjQ+TO54nU}=*5kW?9#{jm#lePMg^*<k<gj(d
zsxxT%b+J`ln1(>-e?lsVvbW_`V@&=wV+djlMk-nnMd|`{ZXWhohmr_Zt;s>XO3>4u
zqLf9B1xb1pRxzyj>oW0)&&Z}RSMkPHZDZS*RKEK_83*SI)RVu{t0#tzJrR5#A*1M7
zUGbKz39n($^1t+-rXeh`Nd8Q5ES@Zq%c7O1(ysMtnKs;WT3DWtp69e4fZ2HN*~fZ$
zIK__`-4BX&&f8Ts<o4C047zJJ-5Kw_spMUb>j#HslPikQNWDSOXQ><+!|+_4Q1VUS
z8nUXcT0LNW#|7u!Uq+xnCRkQ3%_A|<aXycX_Dnu<lcUJ$Yksld)($=!#boouqA5?@
zywDpvhT@7#3Zu*vU>l=XnRL)n5HNciPAYwvtNotNn8X)qZjt6IGnT_*ZcY1Jy)sKL
zYypx@3MmA`W#mW&h??H>G%%p1P5g>!VSX?zq%$a9k0Ch)kz@C!Pr9|udZ!=p!q(%h
z6=uK=QLk87Ot>*tL1Qi8+<_`mn9@gNq{Lnr46vkHFD@iBuCiV8XEl{r<m9i1{p5d_
CO^6x*
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-006.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-006.js
+   Corresponds to:     11.2.2-1-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+
+   http://scopus/bugsplat/show_bug.cgi?id=327765
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-006.js";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+var BUGNUMBER="327765";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var OBJECT = new Object();
+  result = new OBJECT();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "OBJECT = new Object; result = new OBJECT()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..a8664e007058944fbb27d17c3041ff642836876a
GIT binary patch
literal 6962
zc%0=}&2G~`5Z?Y!Ku8FQ3*3Bc1*k;=aUhKZNh*ShK_u<9+St=%>DIQ^o1}Rb-he0I
zt+;Z7*|n26&N_c}ng)7lJhPtJ{pRPJbwRcR4#h$Xs9UT#f(4Rn5kf-84}iE#fFoH4
zLJ~?U;SxL<lES`TT}ZzAE(}3Pa8IeI=~uVW2!|`?P|ka0a5xp<+Vm1lb*LB>I5d#$
z!BdNdW$m}pp?u(svrrb5QT12Y*N>6#2MTtSFqDFM&Ej4BU8|Jp)z5ZeKbG}%cTiWa
z){iS=8uiv`<!jCK)_v5$l>>ofzBi`b(b@nvY*Yyd+dQF4Zv7DTn~AMYcVxDPfW*Pb
zhUxWFLLMk#GHe(wMjITWcu?h5Z|H(~E^%X_FNQIX{i+nfFb?;jUHnGr#xxhc&>kA-
z0pBFdW73#W@1q4(7jurCGZ5OehbfZYj4|MSK$0epnFK+3O)sfj1qf!SPQ0N{!`ow)
zA4Z{#*S$D6cr)%`@IS)Z<TqcGf2|JXu>#2jWmS|PYcJ1U-2!k|l){F-lnb<vl-(9s
z9&|12%6jh$p*(a}>l1<YI;;*O0wwJJiG3>66d?c*Dw^$VIvGNiI;9Cb)isfxgsej-
z$4_T$iRq)S%UM-Gy8_eT14=>E{bRqGapa#HhE&Fsq@tH_q{^V58A#aYk_gsp$+TZ(
z=-JTGl1<J9$@1F2QdrsLvha>4RC`7#{<ExNoN4lioicnx83*?ku*#p+fSWN+=7R5I
zRM@^XFmK70@Vf>t|I2)2x(4Ky$zLemuNKSXy6BatbXr3$(+Bt69?}!aOPsbtFdv@#
z&V^ncT?eP!0nh9<=P}Dh+7Ui_vK3!;a^PCLZnCDQR;L)ZAJCcKuOm5woUxcr>~iI(
zYFEmWLwu4V#LXlj>K~ZbDf4PT>G;ew6Jne+HjWX3Ig_%63<jNaisV1>tRM=r@`VlE
z8<{&NWW-E!=L`j0N>phQTwTJ~>sdO+lYz{)2kfnP512Lk=1QYU#PM$w?HqH+qL(NI
z0dqdVWn%<$-FX||5L*%m)p@14WabK3M%Bd6_fRYSh~D#U3QI_an`n~?5Op&z(a?aJ
zKH_(53)|_ou$)WadR%~)U~=xc^LdiqtV2spC)UARD{6o!P#={B3wHN%9(z^VSi5+u
mKrc(UgHP#6xqUw{z_L`vxR%i@Zd>z@W~#Nw#lH=XivI%39P_aN
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-007.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-007.js
+   Corresponds To:     11.2.2-2-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-007";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  UNDEFINED = void 0;
+  result = new UNDEFINED();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "UNDEFINED = void 0; result = new UNDEFINED()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..f8455632cb57ca142706677fd7aa43e0cb23862f
GIT binary patch
literal 6835
zc%0=}&2G~`5Z;#ZCn1Eyg`<zH5NeS)AQ37-nu?+j5HY=08+)28b!}_CX_|*XybgD6
zJOHo3l^e{go!D{KX_MNdrM*<%pP8L+zx`$=HPsJ2*sk?}yW4F?icql|jIqcGLSU|t
z;3#nd5sMU8a16eRSZ!0Uu4T8riXxB-+<h+Fdg~e*@!(WA-1CMz;CNhu+v3M)>V(V5
z0f&dGKmO|RXh-{PoN#aK%oCB?CZqIM+ti=&;CCFjO@on=!td%utxwHnZ8I4dP0*rt
zqi*lLZ%xhJ#5sG<ZZ?d&_8TADrd@Y&4o)2il?eQ)*;{%x#7K-&5~9ABnaakL3l#q+
zU>C#i^AThBXfS&%cpZXwJc#k;bWFC2i;jfvGB+6vWO}E`VTb~FP3hsZi{Ci9a+Zrg
zY7ZUsfIFG+g)%bcb-ZBDMNWxB0aBaxkplU{81HQaNY-RiD3IK1>m`lT5D|_j;uRf@
z*PpU{Kfa-4-IJ}Y=hF_x|6{C8e#=Gq*YZ%F;&~}3)7yI6etPii5`eoT3LE656lfoi
z-5yvz3@lV#efEV=PMx(!La)81ufvEy9o0Q^PC|_YAAoV$?H8wu6tY~DCh$mQG5tto
zL!_poGfHAU^s5ppUFbj}4c_1=NIPf--GY$6tr)0`l;m=laYWBx#0*Txhl)wj?Ww$9
zGW0lgRI$mqAgNCNX~HUgE(@P{#%nKliq#9>kL3v8bTKyL=34!U7Z$(g*xYr?#>N7%
z49=6`T`oLuFF`i`vm9^>%Jx$5eMp24tg(4Z^<*$Gc)3nY&UZnjG5G_>zH>1q+j3av
z%IT#wfDSxxhnUuJyzcRS1m@tqz&X;(<2Lz>-uQrY&8TMjbYDz)e8Cz8+i=nKX?3nr
z8C~eP_uE+1fGSa`S}>@*dMeH~=PDA<!J2x88d+R5Z!Y#w^!3ihuw3G8piZp*|HPY%
zL9^7Vf}Uatu+5SD7VUTl0^z)a<IV);v_I&4Mr>Iqsew@DCo|WD6}+0{`wq^kAkHb}
zib4fs_!kOEfKVG<=aB(59pYD%g|)maRMW9tjc&C9lXDk4R+8DQmzIyB{=$ltk3L~w
y(aicr$@LXc#ahSm6&+O2B%h%}r8W2lSSrmD7cyFu&#w5dS|lfG@gMIdhyMbcoXD{N
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-008.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-008
+   Corresponds To:     11.2.2-3-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-008";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var NULL = null;
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = new NULL();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "NULL = null; result = new NULL()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..a253bcf39518c4c4c1ac3a320f0abb8400140b16
GIT binary patch
literal 6872
zc%0=}&2G~`5Z;#ZCn1Eyg`>r#tq^LFxFA9#NCO0wfEugUYGY56rCZxtubbp45O2c^
z@GzXX!U<;APU1N0wn=T=LNBRj)-yZb{JSQjfJ4332kO>4j$nZ#*9ak@;|D-oCcu&G
z1VR!@D&ZJB8IszTK3z+{`Z5ebNO1S5=;&A1PzZ-1b13Jd9dI}m;I`>8iaMcUmf+Ap
zMw6#L4R^HO<_YB!Wt@ewu7s+;+LnHdiQkZLQxQWcnAfYT|2xfw-TKh3Z6&lZ?}p;p
zd#(1HIo5S#*)4mwImb}~_nUhilfc`^gP{X~WWHxq2g3kuF|q`N5l^wwR%J}Z-vsV_
zAbvd{<c=by9fJ;Gw96qzoT_V*RXlXWJeRl$(HB#%CYMn`fR378POJEd)RnVT_(E&w
zq6U1EFpo)N%)E*Zv|NlTcE~_z(H;gt_A*A7jsZ!F++`93<sE&bISdftP+7d9t>Mv}
z<h!wll5>x@x1Y@`nEb|AoAefo@{j6Jo{RHBP*%D1uJh#J=_LTSq7XKemqMVur{wm*
z@?c<L-PLzr3gxM?&bZWTt<&r<BGAD4p1P+(O_h8ALPamiZx~a^GFF<vQ&kolkdQWn
za^5;)Nz9slRcuub9S97Aw@3wH`@4QG$K<aohET?kq+*m(q|#s<8Q78!B@wLGms!0^
z(4(oMl0_~ANqOa8F|7P_S^CDOWP463mS6b3S5x>*BUd55i<7<beo|4hHqMVlz^Vkl
zri_Do3Bdhb4Y)Z|eIfYXM@HMXCgLsG7yiJY<$sFg?2=SiB!8s1m@XH|wiq?2bo$c~
zK^yM7BkcM}Z*UrgU^brn&XGPI@6l&0&j;;@^JI95xifA4v#HH5Il|zc&U&6Yof%}t
z4n6n#HqJaC3#?Ra7?eI-oz{%bHAS8yZW^iJNF%Ew=VGa%9eg^9#fIJ{R*KbsKlB!k
zp}cxk!qQOzYzwr%Wmh5v0dwBNad!rD^}gTzgxHcms0~A!Q)VHD<z!9rd<(hKkGo2-
zMWKXX_!~7+0iyQo1`Q3UX%oL-Sy;=Kg>qK9tFg|OAadbx=i#KcSud>h_2*Vx`S3w~
z8;Us_n+4BUDp;%y9AQyK348Pzm8h_900vk}?GqOgn%B{;_=hi5P~`I8_h!j|0Ez+A
A>;M1&
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-009.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-009
+   Corresponds to:     ecma/Expressions/11.2.2-4-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-009";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var STRING = "";
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = new STRING();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "STRING = ''; result = new STRING()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..e8a0a5ceab8fe302b8bbd212bfe8ac062a82eed3
GIT binary patch
literal 6857
zc%0=}&2G~`5Z*#5AR&arg&RJ$0@POGm`0*$5Jhc3b?CL)*wbX`*0$E`rg;f?9bSOP
z;03sF<p#5BCw825+N3sVX)kGJc4v0J`A<zo0f&062h^?Gj$nZ#cL^b(;|D-oCcu&G
z3_=o0D&Z778Isz%K3&UReG`TtB)ErE*!t=+3gK|h9Lo7%2OLfXxGj2$qRyxoCpa{a
z(db)`hC5ns^NjM5GR{I-S3=caZC!tjiQkcMUlBtonAfeZ;Qy^p``gWf+Im77veYrV
z*=X;6Xif0$A+NpL-fJ3f9X1ba)2)ZdgL4N0$$W2uyP~-P+G1o02qT_hWv$AYik}JG
z#X$UgM#v*Y%sK`g!f1y>j5t-#BzN%83G-ayCPZJPUQHgOf&d+rK2EFnjnt)!RQN(`
z=%5C?Ntnl^F=n>o1G_Fp6+31iv}g~5ApaPn--du>MeZ>Pf^u6QX`Tm&aHuR^($?^3
zLh|F-L&>>U8=D)G3PztX)+W8>qWo)dC{M(BDJZMldT(zYy}kzEE+~Wz<)sv8pD4LK
zusrBnSa<c?=R!GEW)Dlf)|zIA5rGEQ_slyLYO3S|5GuM+al=R<%UNjxPgPlLKti@5
zl#|vOOJd&in_{bSXkTC$yhAF8w!i0h3rzmDWC&#pNh$^zMJf%3k%2AwSQ5dyJ(<_5
z1ieTVRV;EQNUAIUieVL}%iJ%XlI;blSbgF9v6#YV8po#iu7!Cdm^00JWR&T*tU()R
z#xl}C34Ti%2lpB@=s$}Aw_uVl1>dJC2YhQJ-jY4x_YGQZQzYjXqtYVzBgJKOzDRD1
zL4!)CmyQM6aNiwZr$>5&(<lV9@!WS#^znFizF=WKYDJtUWh~~7wf3*3);{Ohg1b5E
zdg^p;co{nM()Zgq=YTA+QnjF8`9L+T0bOcxyhPkIGQp8WR!7d&Qbjv>I*R3n-Wpbl
zJO6*^%^X8T^{RqJV*#+u(EjFKgA@eJ*@x5480PA}-}#K#l0c}fLYh-%CWjSdP4fK#
za-|=4m2!(h1;OwyYNP^0?bZz%8c@?Fe!;S^oG%O2tZ_GEg{?s3%;V1UQE%JYcxlCD
z&)U*I2F2vnwUP%c6)Dy#&abGVg2nlQGE~~qZ-AxJCUGU9MeXc{|I($ZiJbojy>aqi
D(eTY1
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-010.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-010.js
+   Corresponds To:     11.2.2-5-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-010";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var NUMBER = 0;
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = new NUMBER();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "NUMBER=0, result = new NUMBER()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..2e56874495a3effe53f065d493796eb6fdaf2874
GIT binary patch
literal 6921
zc%0=}&2G~`5OzxWlTd}kiJMQT6+)#FH$p^{2GJ@ch(x_s8+)28-P+cA-6Rjfi*Vvi
zIP(Ntxxwt(i5+{LHmOZowU^X0yE8lA%+AkNMc^^0Rfj<ATG!&#6UIHmFnr7Pz_2L?
zOVA7O4POue=imt6sP3xO)#TQF-v=(hJ|?`Ywr-*j24iXw#wG_~F~Y%alXDbxLHInu
zBAy6lUqj*_D80=K!e+`C^+inzm4DS;^%)X>A>olE`hrtuP<x2~*E^k7bH82Pjc8Ne
z1LSq;N6khr!;;&&$T;j|x7|lx@37ZuYIhwszjSrG9wQIN7I=cXj`k=p_Rvl(i-RAq
z1S@HA3I_a*T#*mb)^o#nB8f?-p|dFIGYGvw<S~s6Ty#bq+pr^|%VUp6hmiq-PK*zy
zRQy3|<uVm6R~q`L0e2eIp+Xx^^>D$VjS)vrDR3p)!2n4gM(ejJAW4xeDu5H#RZE&<
z4-xjI#T8`@3o??oLJvjjUcKJi%PN@thFI(L7K`%l^`V@J^FmOTck8ITck<>2fV-v;
z)})t0pnWRk4#9L_WMWQMXI}~BSXp;k29(zLc4!f3VD3+xQ=%rz0f0gHAjmH!F=Qz#
zb>PV?i^YkH9{3__oi-(=O}{O+N{5a(hQUXq0`IvkcaUT9kBTOgF(e6}BoxVOFpUf>
z*QdhZbTAZYy;9K2SW(F$mx83c^e-7^{&iXT#0zeF&Q&Zw@%>z1Rmrq!3!GPXT?WKi
z<h{zBE6v(&v4{&G1%Duvfqer?^WXJ=o72M=g6}hAv|V#1-V{Ubjx<{CQY5EGqQWBi
zGr<vcwMg#qNrMP$7&ipUaMzw-jYoQek-!JN@yxZ()benmzGRF(X$Oo&txCw9E9&2M
zMZH+pzrTu#a$KJt%yq74!>IHwYhhKoQa_m{=Z97!5kE;tRd8JoQq{CBMzh%H+`)+2
zNQcgf?espf298{va`zOVEAQ`NWPm8JjxH5Ti&9z%Q^*=%TcSd)IwMI4sPzfX`*WDf
z{cis&VrzI@jvPXNWtMVS&aH{Q<vXKr!@{#_Zdlyo7Z?oxBUeg5<lx;Pz6LdA;x|kS
zo9VPr&Wv|E=GziPF5MBmh-;kr&J;X=w`Q39@Ke4QMa=D;f?F{eFy=OPx~QXs;rfzn
eRM^9S29{E5#kGXyRkd6G8YYv9SpCs&p8OACwA~v3
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-011.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-011.js
+   Corresponds To:     ecma/Expressions/11.2.2-6-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-011";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var BOOLEAN  = true;
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var OBJECT = new BOOLEAN();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "BOOLEAN = true; result = new BOOLEAN()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..6ab0ff6b8eeb445bd98489f9a0bac92babf07d01
GIT binary patch
literal 7496
zc%0=}OHbQC5H^Lr4y~&8*o(ypR8>6s;6R83A*HDxt%yPD32p2p-m=)%?uI14qL<$L
zH~N4211j~@TRXdU631Bw5^MsL3-QeE%+5E@-GXQa6c-CFMozJ2GZF}6)-Vii`vEo_
z!musK8RiBTNZ?cK32qdY)apWf>n7)z3G5sqR#RK&KnTTcVk1gB+t{XvVW)~tLDU&y
zg9IA|qS^a$5#LsN%V&u8lu^P(Q3{oRg(dYF5`O~Wfh2Olh}S4Sgx^~SJJo}|t@3_h
zDWZ0{_kmk0m#oUi>Jaaq<XQWb>dp}BF0ibMwOiH-JS^|mbOPm3aNEX#Aik$nhuZ;I
zs%0_En>5CX+q?n%I|-XdE7D5?BqJ}T<NNfvVLXz=xWB>A1l1`H9f_n`b)XaCIffGv
zebx__NUw}7@PGdtO2r?b&YY*hXG%jIG{8=SctmJJaVuO<aUfX9F~LlU_8_*BhtbAD
z7m&EfT_P|;w5FDn+W~;drNuMK8rmF^{5W)NwC?5d%IdI!-v1D5o!)Fw{xv<6hY}<c
zlx0$WsI45mz6Rh<DTFn3DHCX)NVzUHJ=`*(oU5~61C)PH2j!HOk_pnXIKNt5TYLLv
zB7FNQYTXX4boHx`*7g##<=E*YUb0hTY#`QXruX?iSP9$GV1v1V2@7*EY@N2{Bu&35
zw#tNQF>wBSpkikEyM80Z<R3GdAckN>tP@it6QG-UFi9N?gOP?Sl6s|}7kx!JiyRA*
z{MxHznCa;<@rg%N)09-qzvO+>MN9rAPd5wejIH8U?zyGTqJE}i)Ms5=7(1%u;a#F}
zz24=weQwj<8nWtm?+~Hbxds!(-|0;hnhRSd_&x(h)i-<MP2n=XrP1;~MRM|@omnJ*
zLYz++$rkIBkg(nUG@}gnoemUHpqD6Wa;!I=`u2%h9=_C^^E`7@ZBiP|Ss{0zety;U
zm<gw?O<*-VxjNAox(>bYehXR%78zEmE9+G$ee*&C?*-zf6bp_xvMO>emnzD^qfyK@
z^cH8Mm#o_zdSk~>TD{8Qel!Kx#%O<&-rghx#NNZF^#RP~e!u<&ur&fEFGE6~GGjR`
zC2OK@`8X~7kpt|6MInb^xQZGn0g+DvCB!wTDHFd#S(r<fg?w(GH{<4=gUGSRo#kF{
zGdI-BV7PT*-X-&k>t<L7yDYVCVKL*0ONNfQ00S+k$l(FtoVt|R<Any6T)W1lgr@bk
Q8~$P^%Zr%&VRDfC4;$Q__W%F@
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-012.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-012.js
+   Corresponds To:     ecma/Expressions/11.2.2-6-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+   http://scopus/bugsplat/show_bug.cgi?id=327765
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-012";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+var BUGNUMBER= "327765";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var STRING = new String("hi");
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = new STRING();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "STRING = new String(\"hi\"); result = new STRING()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..89f18c2b0e534711b871eeeca3b12c7617beebe6
GIT binary patch
literal 7422
zc%0=}%~BIV5MB`f4q8@u^s+}Ni$X-@V2lMJDhkmefh#rHZIY2;cWY*rBro9A7w|!R
zA0I%=lQ->|&Cjx#B_!+;KrUgsXS%1q{+%hvFknzDG=aFqs>5j@ts9nQ3C9n>aw!K#
z(qj;okVL`}cv4t}CB3>3-?}CQa0%`n;Z?nL4uvpiQ-?6t*#L(T4sL}Up{QfRPZAsw
z$guy_Bw|DBEguusSH`H2MI}`I6_)g8MErq-JBlbIr(UCY7yn=1eOuYxUN7$ymb%m)
z_ZD(fShtZ?EthJWA1gz=o5-te*0##VU3=x7s%e)x3bY*vB=tSxQJ@{5rA8J95waL7
zZgT<%{Ovj;9j2K_mUT}N<8DKDQBr3R`GcrqTC=$5kb17=c8NY8_`G`<6(Z=y!Qr%u
zKS-S!rNZZ0Lmf5XPK$a}8Y5~wTCnM2%+Ui1T#NQFM3RRw`mF~@T;vv&zzM7BCFOR2
z2n%KLjJAe_Lz3@D9_p@Je6qYUtf2oJVQtczEy_Qqhw@OIXM(cIt@qXC{b!c|+$n{y
zp}b@Q?E@vZ3AP6<8>_ND`z1j6_jFKB=?s}5tt$4))78}%&nLonprYDqv|87o`WS65
zVRwz4PT{2*E`UXNBTR4C1F#adrNM^npUWBuIc%M=<s?nNDz>VGX>oM^JEQ`y`CEP?
z#pLfZh9JgZB)k(-q!OT)c{mUqNQ=`(QzrE)L5~NDauzujB>A;h#jw-UW#SW`QcY7*
zG5?bH#S|_1mps$BYcjS1t=w}<pCvr1gP{d!j6Rs!LN}^#BXH`R7FJOO`t^F0ldt=v
zX1qLP)#Kg}%D}w@GsNHN%@BqwT_*TGR0-nSeet$za=&HJ@;^m#@`jvQB!418Oc=>E
z-YF63GzasGHr#hRST>PfVk8t`HlF#;p<W(6v5a_E*{_6*btkKcd!k}~HFcE<=c_ej
zH9WOC(FuAEJ@ft=HVu#&R;ml@PAQ%8Oe5|Y;-(Y}jySS9a?Y13+QFxzm~H4SV5OM7
z{-HN^45ihp9BxEYfNhNSH|c#%K|q~tP=jJ(zhD21*jfQs*B@z4nXw#}k~Q6L^{OoW
zsH<dK6mkfLi>Q$b5cLR9BEo>0Ht`#lg}G!|$mhO!HSXFuh#Y&|S?u>V`;~qRjILqx
z%L^~<s0jAxdeQts#^aWX8+#t7SyYk3eSbtz%IvMe086ed<6J`1n%fnBpi{L)PW}#g
GlKc;ZK!c0`
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-013.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-013.js
+   Corresponds To:     ecma/Expressions/11.2.2-8-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-013";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+var BUGNUMBER= "327765";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var NUMBER = new Number(1);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = new NUMBER();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "NUMBER = new Number(1); result = new NUMBER()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..5b4e5c7129d396743db48a74a42fb250869cf91b
GIT binary patch
literal 7361
zc%0=}&2rN)5Oz!XJ1_&ojgyb<Fc8XL4}{F5se#U<Dbu9Ac2rwU)T*{eQkv#1cmke-
zJFmhWh7&U!U?n@TW6MpG+DQw&q~4WwwcoDxlT;R6pW;fngOO8d+Kl+ZxM3Iuw>=*l
z4q@09<P>v*3ncIfb_F-eB{jMnpIYS{Gl88w#F}dA5*VTQjM#|M{sy)wV%TY*6EJm(
z*r>opzUU6WI*4y5zt$<DLuZt5QISUFU%8|{1K~Fi+>t^q7;)Q`+wlMT_IBN>Hp-<?
zHqhOby50AU-K}+NC#97$n^vv0xt*SQ6LhW3R^8Ih+Ou|=x>?d6KC`hei07uXx0Ke0
zP_-(Cd6&ji@t_k(z;Bq1Y@EJ6GK_mt7|$Ezi=YFFgM=WtOk)uS9TV3voKWboDCyy1
zWQ{-`qs1u~zd^b%&V|R6hXe2cGY#Srp)INPV8EsWMMn+^X3De+HIiJ6Hg5w!;wI}v
zV1{T@4YAIAK$y#j7gRK~o3i{M$WS=$$+Oj$Pmg%o$M83RTjx4opnuE{=v1la0<^4m
ztF~3$U%dk8{+bWEnii7_w)dso4mMrfGodxBwO;|0f6fQx3<}7tieEfmTYLR#Dtsds
z%>mmgUr`6r#$E%8jjc}NC0Q3^1F?2Do3kUZ60v2$24?^!T9}J;bXwX;hJIaQl^dqV
zAo(9aidoC6d+m&nzbt5q7>W_Ge$0{F0E3+er=mk)Fw*Xbq+e<1apb6AlM_Kw9K}k7
znY~@6Uhz5IG-E3k-}0)uYMBjfr%uGWXdAd!_~ufJ@jQx=J7pW08AE-a4?}6s{&~^U
zJ47gUt^oc2nIHXYZe+RO`w$cj&m5XJMTdDkjhFwal9LzQ+$#Aa;(W?VZn1t13A+;=
zJyhVH(}#u!@)|{5j`hJ)&puYegC~+P?;`t+E~Q~N3$!Dx?vsuXraT%|LDhEU=tK`6
zB=o}bThQ*Y$gxw+j90Qq?qa+$zHn->>WD+DO6PKWMP>MW81t>Y6=)TU|9<UFR7B@B
ztO9N`bAW9E{+sr$B_Sa87Ct!`!CcPw4vqj@!)Nm9BJ^8kqJ(Aan($jb3kxrxm3*5*
z0mU$jCMf}t7x)_D8q`#XpP?-*CEG$Vcg5>*PcFdZ#OIw-L~iC=^^g}{p_W(Pm_ZjD
z$b(VKD><LIWaXI4aG(Vr1>Dxhw58l$8Z@vJN*b3knniEd{CQ1w7cu=S;;8s9$Qp0h
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-014.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-014.js
+   Corresponds To:     ecma/Expressions/11.2.2-9-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-014.js";
+var VERSION = "ECMA_1";
+var TITLE   = "The new operator";
+var BUGNUMBER= "327765";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var BOOLEAN = new Boolean();
+
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = new BOOLEAN();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "BOOLEAN = new Boolean(); result = new BOOLEAN()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..2448100c2b1252fb876727843bd9d96b471e6306
GIT binary patch
literal 6581
zc%0=}QE$^Q5Kh?`AS8r@5U+XMgrH2o6I~_fIx#dlM5?_`ZgOkQyd<)nb>%1V3-+&g
zL%hM+N!v7a+O<p64ffLY&c5?~{_f7#nv6mQ^;!>zS9e@aLusv9mL=RE1k0lwTuIMC
zSV9sBXW&a=)v9`RExq-<5WppPM}#|i>pB`?a6w(d*kBi2MmTsaa)zeP37-_WB$UzU
zTaSoc?YDVO*vJ{9Le`a0^;fIvud(n43O1BbNKXB3{T}}BG#l;x!&a@D$cDPRsB7=H
z51LaNwd<())iLdQfI7HvA(S-mr?eYd8{&bDDh?uIDOLLDJE*^tI{JJ^W^0vNHMxv@
zm@c1L)<Y#sUmIQ*B^?IweGuhVALx|&p5-ONfRFDy@vA6;*El|hcJUjfm3b}#u03?n
z1Mak_Po<GjAL0f39&(PJP~h6Mj}*xs#(3dFK++};s02=!qn9)<LIhK&h$}i87EM`x
z6klz!?!~L^x6=+rpE1@Zzr~{bb9E?BB}gGCtEBwoY#+b50pR{x4Y-E7R2YHxBHvZ0
z*bOYjVkwNruAE^T&_2hxVT@lnOr26;rrH63MR+&LZzf~FGBKK<Q#BKt6PIleaymL=
zLCl7JTVj2T@;*lrd_*bmc5o1Mb3(qX7>JC7Bz%x^q>=!;b<Al7C(`1y+ml(p%Fy$%
zqmoT71W9?tUn%VTbXoeuGjcsA75~|uVtmmQad*n_9-$1p8_-k!tOnei$7CV+K0!q*
zut(-?+2cXq;N^dL9hruJ!kGMp;B>VdliPgIAkyuPdzlVA@CMkPP~Ko95?~IV1@5U{
z9uI?8oB;K<cm`a{p8>Bo@@0gX@y9W>zMI_ERXBi==d^NWqV&Q<dOE7L_KyAfrCxJ*
zvbpunz$<h6nL)Egic9It(nPynX6Z|som2}l^|%!=mhdOmPQbmjmJH<u&<B%(c73%v
zL!u!-SKi-7zJV;Tr!K_MS>>&S$MgzdTcBGmTN4xn)cp)+oe9j<{-E;>v9&_3Ue3~-
zG7DW;PSzyf@1s@*aqU=gWSUniiX%e{`lVN31&Ep-8$=jT(;<Gxvap^l3+0R|w_{8z
z!Q{eCP5q#m>SYDLy%a0#O?=uyzl=d}PRS{3h&8}cYD2h|(Y)4m%YV61l|wH71J$JX
EFH{9|1poj5
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-015.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-015.js
+   Corresponds To:     ecma/Expressions/11.2.3-2-n.js
+   ECMA Section:       11.2.3. Function Calls
+   Description:
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-015";
+var VERSION = "JS1_4";
+var TITLE   = "Function Calls";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("result = 3.valueOf();");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "3.valueOf()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..998416a91357ad115dcb17a30f95da3292ba75e2
GIT binary patch
literal 6660
zc%0=}&2AGh5OzZ;AS8s~!ZF8I2--@BQxtyER1}pIk<e@9>`oI?XLn_Lljg|l@C3XS
zH^dFb-c7REc+)1`Roc=^ni+e>^Lb{zaVjbdI8-ZLpl-G42o@-EhY%tiKLFw~0ghsQ
zkVGn~pa-6kq_S;RSCU)bNeM!MdrU>sY+Xkq9L||TIUnwU!>ItbL3?PbPsOyrp@9m=
z-?~)p8Nc;D<zr`@NmbQG^<QP%e2s)ZP_UteQVHgDs`v2!X1&%rIBHb3W7$Y|7j><J
z)?s}{qjw$Gzcg*T9-t1+9S9Wjy&3I>(FS;6t4e?jc|w&udMY0Lj4{oQ_U$u59%^9{
zeMFtnHirmSs*g!Zxaf>|E^%X_FD6$PA4cCa-p1r`#>F3$u3hB97sf*yJ>X8lJf^IP
z@jhB`;9}~qQwGAA_VA|Dhq2z<2#}=7L#9Ab-ZV?<=K&%tb;N5X8XnGAeiYqMyza%$
z?(10x<If0do8Np<{<S)kXYxE3lyz-=Z0?@Cx(49>UJbaG_L5ry?}whFQ7PB3qspZ)
zp15j`y1DT=sSRuV+F|098Z+J10SFbHFq;!5fTd!zL8p5xa*R+dkZLwMYeP(jep6z7
zjPilNB=~?*5H0`E?_`AhbIp>-n2=Nq6OMEdAn8Uq&EZrL!8%=)_Nxs&pExSm<U)`X
z*Zj4joLw$UpLkBKXO!Zt<rM3flgHg@!~2wRaIXQU{9O&W8N+8T_&!BN!!M7`msMBz
z1B;jcWjeCW^0{U5XNr%c<ubV?hBd03?u5%s;J!OVdO~@P(@=svc<wuAW_k3cyWk;r
z(g-<^SvJy6@zI--<zANLT6{CIj;B|r7<Y7`m)_q(at4)Sr&@Ll(D5_p6ZG0s9HRI8
z?QfV?BoLZa)zG^AYl?(RNfI{yU@fIW(nC?-XRe)u<3w%XnFVv^WhxmDSE;m2Ftpil
zbh_ktc8NT%C6YOr2`1C8R@x>Z=ihq1rLu*ct#tcKWuc*IUVklMnqL8I3()n7n#@8M
zmQgkF_xq?-e#C<LHiZI`p#g)!Uv?T0{eZ1eX+h0|_#NBAdb%wX^H#bU@5BO3E<Bz+
zLB*zK(elpL%b4Xhw{o5Vb#jz9am0o}5f9P}I!|toX$vfc^1_vjW--_e{{=}m5Viad
HWz*t+7P*iO
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-016.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-016.js
+   Corresponds To:     ecma/Expressions/11.2.3-3-n.js
+   ECMA Section:       11.2.3. Function Calls
+   Description:
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-016";
+var VERSION = "JS1_4";
+var TITLE   = "Function Calls";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = (void 0).valueOf();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "(void 0).valueOf()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..6c7609fbc892e5561705fcfc817f9e8ad214d1f9
GIT binary patch
literal 6486
zc%0=}&2G~`5Z;zjKu8FQ1J@i|At;rQxI~d4O+`^j5w?1*Huf}Gy0xv{b<!Mo2_#;E
zC*ZBPA#O0cb`mF9w~cF)w&db?W_M=i+xc}}#Sw=_y$959IG$jUB6kQO(hDOXJ`><6
z)(1(Xq6$tSP?FTQ%<6h}>l-OSDDV%daLm><6vE+*d6e_v4tSgj@Z0nhMfIteCU`Vb
z@%XJr<&M$Y>Qg>e#+g(NEmZ&NTjn((en-N(CQ2n(&~4nq|4ysv?j5x2TPbbCyNf(`
z&)sj$arCak)+fid>jCoM%!5d=Fqq@68*YRLwz34sm}gkoqtDob&lJ;qYrj4v<e?^J
z(MQx7?Qlq7rTUm;6&Ibbz$bo648`Q?(!=PR#@m=2&Zzi})Rl`=gu-a(pa$GYSiqFk
zG2SK%_Iz|5cFaH+(E;A{>|w0;HUcCoa-S&>lsjfg>nuWqrM7s*Si|Ev$&Zp7O4mJq
zx&3-x!T6bAZPQyW%0HKf@|>TSg0haS_s;gwt7`!6ujPPiNiU^2@NOJ<8kJfTGpa0v
z@kEs~%H~GrBsQ$}YlWFpYRq(22Ov~*<NTU10c^%b8+1CyVvP~X1*zt(vnIq@({GBc
zkC8qQ=mhVO3c?Nd!)}hrKUOS`j1Eb~Fr!EZ0T$iFr#T!eB3QSlX7y@8&nAj07P$~4
z)g^z;sO5)C;S-+|>p7u#Yio+N%_-yVwBTLJIQZ9~ru<nBxH-*dDfm7?MmwyH#n)6%
zgaeC~|D`*!_41{8@<)n8QZY|<#jr`0*PGNbV|eHfu{<HY$!RRXZafdY6SF*-=`I-L
zj@mKjX_Za5Q}yVZtsWJuwKy}fZlG7sRNT>pUV6Wa#TitInd+ak0eXxJ5N+cy2ge1Q
zo=bR7Gvgvze2xEHEnv(wpO0m^4!DW=V)gbr;6jdcUe>ChM_vMK3lzbkp{pTa-Um4C
zOku9~hn>%eEs2C~h?PBL7P_#Us7c@NBUgn<Z7DY?RNxG47*w7pH6VH{Y*J}K&6xNF
z)56+pTBv3Mxf#<}1tJT5w$KIcMOxuDHcRfRv}4pZuxW)s6(imSS*Nt|)B;PTHQ`D^
T^QzYk|0bi8hbsQ*X`1{OAaz)?
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-017.js
@@ -0,0 +1,40 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-07.js
+   Corresponds To:     ecma/Expressions/11.2.3-4-n.js
+   ECMA Section:       11.2.3. Function Calls
+   Description:
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-017";
+var VERSION = "JS1_4";
+var TITLE   = "Function Calls";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = nullvalueOf();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "null.valueOf()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..af527c947b9be55aeca87fa2750479b4ba42d1c4
GIT binary patch
literal 7444
zc%0=}&2G~`5Z;#ZCn1Eyfddz-r$z{s0;NI?k=itrpf;e|t;DI?*xPvN*0$E0CV31b
z9)XA8eRu#QPTXL2ogc?pw@I*@w&apzW_M=io7wr<qG$$;l!`9FPRX=64FtM@5DINS
zAjqMd*n*yt5QPE@azZ>2qT;ezU5szt2t&dJaSkvy)z$?N!bqFin6b_lu^HyXso@h4
zb&B~g!N!4T_W!v!+){cgr<nDXF&c`J6e>T(W%V~A{s6)qNel(2UZZpuesAt?*Y<Ze
zD|^M|F15$K4P3KQwyGa$BfMLZXYEyM+as)-z_O~=PDLy5pt5J`1j?h3woL*-eNU^7
zv;(kI%i<(#vKT9Fa{>tX?m8nKrbmwvx+jTow}HDTt}_z(1IuHgd02EzJqI~mqR$6D
z?;b{m2)J=@IHlq@Q0LB5;d7;-4jN!5q8=66h}w)6R2_&pdPE6VqCE(a<YBZf?Ew-O
zxkClvn3-xxr5ymmp|p5TS;LwmlJ7?z>aKhGY~}T+g8p}ewN7ugDF2)t$|G@}3Ci+r
zy*F15UtR)mXB5Jk^pXj*52Rd|7#?XEkd@WhF9FKGW`lA{Wyl0+nXz9yUt4>%Iu*VH
z6=tu{DqVx@qqV&Z)iriHiI*(6gdoft&Gd3T04rfz8f;Mhxv)qmMy=D9oTTYj#a4M?
zS{$7J4yc4%{*K>BG5PzPCWs*zG4I3_$qUfCdC(9Y3B+l`6-m8P(363poJCFqNq*&3
zGK}==GWChi$fhY*@!D2xZ6ldgzI%%)BhDqLCx2#FPc-d)Cip%CM$I?+;tk<)zopUg
zzx1EFX(_Wv{)l0Ioi36s-YH{YyMtP$4ELQ5lqaB<8E%F|Z#?tuW3@aQx6hfe4{J@v
zx>Yvf4%MSC;I8?62fVMkl6Nt#PtN5!SJX%=_Xa_oMg2@^3qI+t$HYM?5ARY<K<evO
z_MPPhuo|9Roq)9G*Rl6ofIbl!)~XA0b4tjK)$oqtnQ|;W#F16G<KJ$Ka`4$GW}AEp
zy5w{HLT}<2N~>5o%tteTZGr}9+UZR~K<!;}QXj%x?)U4T0b3MsISdK?m6^z4DYvHk
zU%oL5|IFM!Wm3o?7%n15N<ie3KpBS`)Rc+eAT2B;(?UMe=hc|Ja}YUkZ?PKnc1Bd+
zj5q3aFxtMf=+ec)x)J5V9!srTDy(PRc+2=PmSC;{9XY%LoRgd~d%-B=aQ1PBor#5}
S6}c<^Y$tP!nErKgnEV%%nT%Ti
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/expression-019.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          expression-019.js
+   Corresponds To:     11.2.2-7-n.js
+   ECMA Section:       11.2.2. The new operator
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "expression-019";
+var VERSION = "JS1_4";
+var TITLE   = "The new operator";
+var BUGNUMBER= "327765";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var STRING = new String("hi");
+  result = new STRING();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var STRING = new String(\"hi\"); result = new STRING();" +
+  " (threw " + exception + ")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..a73cc799cbc9027026364d0e44614547a6972cdf
GIT binary patch
literal 6275
zc%0Q(OK;Oa5O!#Ji33PToH$rLwJMOug&v|vG>xED8>A-fflIZqC&{)O+uB_xjSxSH
zI|u#}LL524teuCGtkWj7m9&?3XS_Q*-+c4f7NzeoC>7g4>{89*)RV@BVHm=4Juqy_
z!IHEK!Vr>3=zt@IQOpKk7o%H02mxGzeNK2S*t&^_Fu0}`VXS`u79$+&D(T=+UBV{?
z7V)G%TD6Hd2<%q6gpG_bDr89=s(y;uU>OR(qu`Me3dyO{Dm}%&_s>37&rbF$r^W0*
zI@CT!ZLLzSAAYXR=pLf3epo-QXm_1gPHVbd${t)>;7RH_Gg@^s4#H=0tcu=#%B4&(
zJAgIb;h(Pz<Czjh1AxF&(qIrGOVnMA2l&wyb!@{P2wgso-rzDS*cg!U<pL9bQJT5Q
zgv$d94YYte4eC&-<;H&a!J&=pp-l=rINHHrPhUnGoFO35Baf*BPFOAYq;l;c!a{kR
z3A|zc%*oGD(excl;qo?@%fGu6vld3bL$Gy*lZE;B>R_H>b0RRS3_7Y^<O^#6ZXvT0
za5Y6F5onJh3>K#2N>hNRTmai_^l{Olmdlh53#$p7BTy!F%r0<su$eF9OybyPo3`4(
z*C0NBRzv=n_K+C;^SQ$Ny`|tCTc{12ZD0z<mUXU|vBO3#r{Gde7r-FA<;S<|F;-Kq
z#i52H0GD+Ta@IR-vzm7OzWDkA<votE|AbQDb@$k9#kl-KS7VTig!dzc6#sE13hB(C
zDGiQED5veJgLcP;Qa*AaNYZP}N@2#Q%hETVQ-)(wG5w17Yc&;5JAx(=JC*Pr5$iBX
z{aal#(aipdp!-tUbj{K6rfhS!r?GMiu<N{ECemt;i){deYxl8!qP)zAFF+3lbFHi3
z^YBf0%ZFgFEqn@Y#6Jb^_VSzmcKV{L&FkEElskZ)$MhPZqxizCdL0=f&F1#b*Kea$
zORY5Y(wE6OY%5176-~H+Z+A<$AXf7eZ9&3bRDH$<Gzzs7sP7_sA0)&g%njOd)Yns7
z8Ul3d{dJ@r$W_<=CZQU#rZD!c0JsGz`?AGBK|rk&=rktEgWB&lF0l+69#=D-)F;hC
zwIwER2J0uNm2MdPC5QW)szq{Ss6sFGQmg<`FP$<G8q@+8_t5g@bYVzms7_(}UpU|2
w44TvS*1YbqwPSAMm;yb`NPnld=bThbd6ZrH+Ve{9J%1r9wB+*t2$&TA2UaEzi2wiq
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/function-001.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          boolean-001.js
+ *  Description:
+ *
+ *  http://scopus.mcom.com/bugsplat/show_bug.cgi?id=99232
+ *
+ *  eval("function f(){}function g(){}") at top level is an error for JS1.2
+ *     and above (missing ; between named function expressions), but declares f
+ *     and g as functions below 1.2.
+ *
+ * Fails to produce error regardless of version:
+ * js> version(100)
+ * 120
+ * js> eval("function f(){}function g(){}")
+ * js> version(120);
+ * 100
+ * js> eval("function f(){}function g(){}")
+ * js>
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "function-001.js";
+var VERSION = "JS_12";
+var TITLE   = "functions not separated by semicolons are errors in version 120 and higher";
+var BUGNUMBER="10278";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "pass";
+var exception = "no exception thrown";
+
+try {
+  eval("function f(){}function g(){}");
+} catch ( e ) {
+  result = "fail";
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "eval(\"function f(){}function g(){}\") (threw "+exception,
+  "pass",
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..9a45db13d92b826af8d0747c4dc340cf21b6599d
GIT binary patch
literal 6447
zc%0o>&2rN)5LQe1zrb+d>SH?$({c})DQ<wyv?)V8y>=9P8;h#8M^c*R%H!|^ycHa{
zaDtVbAIFiK#<fXHFKKqAUG1mUx4UVme!`*I2!RI8jxSiE$UQ=c^y36bzy$b;U4SG~
zQ3dA^DM=dJW_2UGbyrFd3W8%QI%ewz8sTuse9HN74}4Aq1Z{ebrY@+M75Fq!{mHkG
z%01(^bwT;W8D~;8wNd@o*fw8N;WrdK&_byMi+at6_<yJ6dizK1#`Z`y*4;;)x9=Ua
z<}`ZOaqDx(w(BwK;L?Xgu{fI3J}}w@4{TKlkbRy}WsjbV2R}!c7Ds#bl8~obm_;8^
zXSB;9g_Y`Kl672k#-e}(BVjD2S2sG0zG=LT>EVovUnpH$<RTWvLl-^ZPQoIltcme1
zU9cZu>abG=!kCWmrt^of-rE?EtjPnWKv3Q>OInu+A}n>pYbF}rpR@b~6+IqzDSy4Q
z^Jd=o<TJ(D=CfLaf36PUxg4(qVV&qL_i*>*HlX`^HRxKnr4nqPYr7#hA4~>2N8K+o
zRI>!kQ*WIyn;W+<J%tSd7b!e*Pz{@AbpS#|uU}jfrkLfzw4tXt7Hf=99!N`cRzl2&
zeph0BhVp^HJot!G5MF!`_X<M(zGlf~%t<PS8AtjZV9`y}n!~9gg7rd`_p1%PnmVf4
z<Wi8-NB&yj6hD{JC%)pj7d*xKneWGHn9thgR8>~qQ^p~<1!d*WYQQaMJ}bfZ1uELH
zGcoU|P{ad^mwyiS3Ntz1%U71kpC}GV<uch5LzgN)oYpcEcpMC|JfYm>v@gLPJdgb|
zvpk*Y77TJH?LOzDDw}F&>JhWmqms22XGYeG^y*y29bf3R_j_2JK~>09Z5Wj40=$sP
z%)UYt7d0~1$Ot!c?ODuBPTcGfn5(-QpK6n83prr@|4*u=+Ka20sD{3G1+Xnq*vfY0
z8Up4Y!g+TFbG<({V-!h*ZgQ3V$t-nY1+QlG{Sj(aoYsqy)6IgevchC2$$m@0r2)~S
zo=c?#H51}jq=k(<Ez~nr+>ME<29u>)#+2-ww@w5DY#Eu{+^V=;(%Io`VmFEoYM9*?
fP)}uZrv;W;3&V|!7L~9&{$q<~5LNy+rCIS`I0i|$
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/global-001.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          global-001
+   Corresponds To:     ecma/GlobalObject/15.1-1-n.js
+   ECMA Section:       The global object
+   Description:
+
+   The global object does not have a [[Construct]] property; it is not
+   possible to use the global object as a constructor with the new operator.
+
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "global-001";
+var VERSION = "ECMA_1";
+var TITLE   = "The Global Object";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = new this();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "result = new this()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..1c56a3af26d29adb73cb57e3ef3e894d2f76ac27
GIT binary patch
literal 6443
zc%0=}&2rN)5LQbme+OVVaP_erhG}6qhRi@3piD^_?CG_m*jrnz8ha$AX)ZhvPrzGo
z;lc@4auPd<+%%~@X-h7SccoqJx2yeeO?49v^;!fpsJp&ki6VChA<~Z%AORELD|QBw
zNJSN#LPtqb+cK+b`K|Ay1fd`}pu#m<*H8$DbLLad`#a!sDj;alQxtVZ#W=yIiRzBt
zA}V)`-sTzQBW0XPRo6oGueN1gQ{oRKtZSlFf_1|BJ^b%B8{Y1ItF|?u4S9Ew=k0oX
z%_)xFb<q6g+IBra9-RA-C>D37xa)?S;DN0y0kX?;to+d@?7`;%(_(AG=Y%}c#60?l
zI-_k4DXdf<ldR&R6V?exFd)VvbKT%D+SBNb>~KcKZ=|lwQV|QIp^X}FCt)3?tby@9
zU9cNq=&&OO!iesmrza0%_1h4TyvRMKKv3?QCC&2$5tiEG6=MzWPDy@<jF87|%3p48
zzn&I8dZswrbe4<oujL^;72~BKtnbxl_toK>YXI(_<$!BREu}#FRLhOP`Dg;z*>4|@
zWtur)&a}D1WNy?#b_yE=4b0%VgKF4xQU@SZgx%tjkYP4qrVTxvVzI;s<$<(VXU&I`
zrr#7>pCG*_Fb+N;6@(Y>#bJTTKUXZVj4???Kc`6F1FX4eSaUd1M6fVYlX|tF7n!1p
zMa~6Db-7<NoZ{=U@QE+D?gdxz)|M4(ms5uCwBQevaR{zKS^2vha0`0RQt*9-j8^Q7
z#5*byanGXVe`%0xt$b;b{FUO2v{)p2qTis(kFr{343C38mM5e)IPFTX8_#3^#4Jxo
zx*2oaVXMpepvtD)v3hiDt49mgS{xZ!*wL#eD(=vsm)`GTaRyalrdqTO@FFI2`wC&4
z)yZ5UBpNxt=Rq?;akX1ue0MQG<wn&eCV|!4A60Yp7Z;_X3L4)fz&1x^Tl79^2$=r`
zPTOOc>;18rqevojm#geoW-f;n+?v7redMY*Ef@=qH#6GG5`&=yy~>9m4Tzrg8dO?P
zGbVn=w6Hdr7OEL5ZpKJefylW#na87K=e)&!k;#qCl6xf`8O{c_qR^{iaGQ~KN*g*Y
auvA(Ut|YXmeBJObEjoLs#Xl&Glm7vLtw>J*
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/global-002.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          global-002
+   Corresponds To:     ecma/GlobalObject/15.1-2-n.js
+   ECMA Section:       The global object
+   Description:
+
+   The global object does not have a [[Construct]] property; it is not
+   possible to use the global object as a constructor with the new operator.
+
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "global-002";
+var VERSION = "JS1_4";
+var TITLE   = "The Global Object";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = this();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "result = this()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..5080e8085a49c764d5949f2f884ff492bd1a79f2
GIT binary patch
literal 6393
zc%0=}&2G~`5Z=&Iekvp+4qSaKAe2^u6Cn~!gJ=~}gsonyjXh14ZftA4X_`mj6?g((
zi4zhM5;vG#C$W>P+c<S-1HGh~*`3+>_S^YMMfO4t)k+7bSG8TiLP^#LA(0z|Ks+YE
zmFx^65=knd3%-m<rL0$1(p%p|5eNz15f!%Hx{gLToHLhlKG*}7QvqI+cG1)s6_Wy&
zhO#&Q)}hg!_FF%reC&*~NLH0m^;aqDud(n83O1B5l7ji|>K**wuGgIX!)B#Cl#O(^
zQRnPCjrxp6?K-M|v`xG2p$^Vn2qg>r8SRGFhInA3N<h@(DOLLDQ}L84<sqio(Y}04
z$fgpe(MQx7ZE=WUrRtdE7A`tvzDK;FFc8Vr4G*Jk8gC;xoObaOrKQVU1VVdgp$FVa
zn9rn<7`yR;eGjR_P8bMn+Q*xoK8*3+Mu4PEHkbrKxviJf&qG8wQW2MQG`u%sc{AbS
z^X=`OS?lA^7-*BzVj=#1eGt!(yby@h!#c2cj$hmWaDQD7xQ5(P2(%AT(O^DU4u~%E
zH4qD-oH(;b$y|Gd<PatVYM8-O=TxYvqz*u+X!o*9LIT-TlqT?0ip3Hmqyv$hjn0@4
zr$b+rSk;C01=8RhN<lb5BWP!Y{Iz7DGE$O?LCTSO23T`rR&zL!M6h;8PWx4co+XZ!
zY%&)l%gg;rVP!v;g-?9JYtML!|7=w;b~#1doihBEG7jDis4Bm&2i%O_vk-hAp`saB
zWAm2mh@fxq^1t*)rdGZ%CV!wfBQ3^cM+|CIx}Bt!>A(YTfaMA0HBNgGn1knmd#abm
zBi)>HoZc2sa%<U>+|>rRi>IG&rqZ`yS;weY+gGcniu;H=bMJSs4**$UQv53&he8_g
zQZl-XW7BKP&GEaacyK@K`D7HsImlm2F+6=|n*LXN@0vOn-%rl>bKLB4K4f*Qok04>
zYLhxgF<O+@3IgW7hi+?v*=m2#`h?UXp-_#fG~a!$XOVIJDL%^}=Kq2d$(-abfDBFO
zFFlJWK-73vqmcnM9pYy!7VFdeUd|-28dJ~`Oy*9^Pf>BWdw`%?uPq<?)}ek#udKK}
zjf8r|){}xeA4M8#3mZ#xv4k<~l8jW?2x)-j%4eUq+sth=tM6Fx-%V6vk&FL4G%5ZA
Ds}3{P
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-001.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-001.js
+   CorrespondsTo:      ecma/LexicalConventions/7.2.js
+   ECMA Section:       7.2 Line Terminators
+   Description:        - readability
+   - separate tokens
+   - may occur between any two tokens
+   - cannot occur within any token, not even a string
+   - affect the process of automatic semicolon insertion.
+
+   white space characters are:
+   unicode     name            formal name     string representation
+   \u000A      line feed       <LF>            \n
+   \u000D      carriage return <CR>            \r
+
+   this test uses onerror to capture line numbers.  because
+   we use on error, we can only have one test case per file.
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "lexical-001";
+var VERSION = "JS1_4";
+var TITLE   = "Line Terminators";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = eval("\r\n\expect");
+} catch ( e ) {
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "OBJECT = new Object; result = new OBJECT()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..adea18629e0184affbb920fabc6fc1134fe02984
GIT binary patch
literal 6374
zc%0=}&2AGh5O!$!t&os7^cwY4gis3N7$QL$L{SKcUG-WyyVJzf*<IOA)4Tu=!xQjI
zoRE-^xWU+)WH%dco1`1sKrd-L_KfG7&-0V2>PH-E)h<xK=6Hfdifj-<q!&g&d?vtC
z>=Y!CiYn+qpd_hQ%<gLX=u0U<DDV%daLmz7RKnqmd6e_vK6so8@LRNps!pkxUhrt7
z`jc;6D))`u#wq0!W1LA<(@OPUwPL=;i(hczmR^)fu%J`BjsH81x_j`xRjrKH#<H6z
za}V5RV@9G+9X38Xwo`Xe24@~biiN?9^p=rEcwwtZfb8>>D1G&eKc#AAglWFFJKKb8
z>BThqh&rQf4l%4$Uz6OxO(!hyi9cElMH0HvWpt!58p-91iJ!Pyy2wN*jD<E@z>|ap
zOj(KXD&BD5BX!s@17TDL80qX~tZ^Fyl2+Md3Iyej+0r<R5Mil3E*Wole@63G!o??h
zd(URIPd;OyZAOcQ`1{pCJVWwAAl47-t@HHg`85Fd*VTY)$t{II`v3(^7C_kr(PM!D
zVkwjpW6n648>^69!iGQ{GkEHr8a18N0SFbHett<vAj^1Z15c+|EHOg4Al0mQ)_j<C
zeO-Lj0UZdW!5dr!;fBqyljHK&l7-4hNh*dZL;4wD&5c>j;aCyDI$f2us}(&?46Rt@
zLXfO3_iI5p|G6xE<8xkn&QttntBSSDDI#`S@oUOB_}8GS{Jt7+b9&E0@O_AaR#={>
zFRQKy2No;;OMhf*<qKo-2Z}S&a!hu`uuhfNO=_8OJoJZHo^ZX+X<vffc^-NvW_vu+
z%{j-JWAP-nkw3{@Zg4w)`uS!neM^>g^on%?y*pFf$K09wyo-GRr~;GXU+FkB(ttt9
z=`xONuWezD-$B9sdwI_%rx?yb{(6ex>6jV%U+%pd>YN{+1>et6tIzp})v<I6=^yJ&
z>II6?vb@$1Fz+4o+EdKd=fn0Vq!x*UZcLRu_6t3WobadktiqW8OHL$nlD_~lv|zCE
zETRF?<5`_b3u?y2&sZ!rv;1DoB(NS+&<a#8oS3&KrRaq&0=qloEWPun;5J7yq`Zq=
pBn(zDb6t>r3Y!-#uw44?^R|`?E6r;%*8E2joki60zXeS%{{dl?E_na|
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-002.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-002.js
+   Corresponds To:     ecma/LexicalConventions/7.2-3-n.js
+   ECMA Section:       7.2 Line Terminators
+   Description:        - readability
+   - separate tokens
+   - may occur between any two tokens
+   - cannot occur within any token, not even a string
+   - affect the process of automatic semicolon insertion.
+
+   white space characters are:
+   unicode     name            formal name     string representation
+   \u000A      line feed       <LF>            \n
+   \u000D      carriage return <CR>            \r
+
+   this test uses onerror to capture line numbers.  because
+   we use on error, we can only have one test case per file.
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "lexical-002";
+var VERSION = "JS1_4";
+var TITLE   = "Line Terminators";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  result = eval("\r\n\expect");
+} catch ( e ) {
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "result=eval(\"\r\nexpect\")" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..616dfeedf2c4b2f966eb7704e1fa056ab2860400
GIT binary patch
literal 6536
zc%0=}&2AGh5O&(~S0seQp$9HG(jeF(I7XEq4Wg(7M50QZDra|^xOH|{w$n5(z{Bta
zJOJ+lM{Y3oCfQBmO}pu?(n3|K&5S+c`TWg{CsoxCIqX)uK)v0jD_E$=Iw3^5K?uZS
z0$jz;KoY5_f*$xvlB#1?SCd;`O9?`OcSuFkY~4U39L||bIUnwU%c%gbL3?QGjEZT2
zOGDM4eCkrUXZ+UBD4#gvOsZXNRR2^R^Dz>BL&0q=lu9tavwH{sZ`NzA{f~{RGm?#U
zw@}yGZynU<G<w%z{d3c{>mKUh+=WoFz@O9JHrfymY*h)6eV$Myk3JJmsp^a{O^^1+
z79sbwFo`~*&S;xM1S{3YBx|_nl=&X<M#4bES2sG0zG=LT_;AL>Z<LlUauEpQp^YAJ
zCt*HQR${z~7VLXS9d^t>7}Gx9^z31*_cjJ3Y4U(65R^B~lKOdw2umGt$wb5ZbCw^(
zTzs~(^YZzLoOdw!8)0qpn=i^gSBLT(&vQXp=hpk?i=$W90Nh`z0oPJqa)I_PDr!N`
zl;5S$jh!^db=-J^*tsq88W!)w`7~O(o&yjnI{ox+5JNQ+oeeZyU9r0e)dH#JqqCO6
z+0buFtPfE>5P1FXPzs_I90Z+|kiVBK6h<miF-$np^v8A^v6;iMB7$|gYSynd^fY!<
zu*po26j%1OqMV*COP_c_mZzlRKif^L51c&iP8)tp83*qgbdx`;0XOB@nG3#;P|*m=
z6Z2)&6~Vyb<$rk>*<SIvG5Hh4@n|_Fx5ThUmD`PbnF&1bhS;7^UgNYc!5%yh+*7kW
zn&vJ!!kKN+5VxK_#9eJ>TRixDv9-SI+}3qCfRU%Pa$%!%W+FXCg;UvdDrFxZO5l~<
z=tWqrIGgxuVVAuLEg)Mh!Kh?@8M<99zsyxFPOXf5J!<qhAF(LXPJzCS<Xy{&M3@?^
z<LlKkR2l<x>HRHa9jF{TYbKs9DslxpsaF77hMu`>WzY~X_XG6WQ<&@hLHh);C85yo
zXJt>BOc$1tHHooM1yKcAa&Wq+R^&&91`G<X!x|7hMb@aapk_k+ie+JAwk#Agu-uGc
ztpJmmTicdtZBAvnu~i&wZ3TRjQhtJuT^JNG8eUL-avN*63po2_U%;7-rnRvf{#}l)
MB5L`stfs|(0V~{Ma{vGU
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-003.js
@@ -0,0 +1,43 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-003.js
+   Corresponds To:     7.3-13-n.js
+   ECMA Section:       7.3 Comments
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-003.js";
+var VERSION = "JS1_4";
+var TITLE   = "Comments";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("/*\n/* nested comment */\n*/\n");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "/*/*nested comment*/ */" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..e5f2d3e143ae7245a5cf47c66a6ff7fed5dfa2fc
GIT binary patch
literal 6514
zc%0=}!EO^V5Ovy8Ks`{21J^xLA(SF<BSeBUh(Za7M7>td?lduVcUQJIX)b&a2hRKz
zTsXtnn`AeMH|?goN(;TDnXzX)&u?Ztsi`RBP_OlYdiAy|Sg6P*Aw;@C2*hIoT*U?;
ziBwd<IrvJFTGgzsrMJG45`+Tpn2NU9x`jqKTrih%J~{xGQvqI!o};M&6|(}DhANtV
z>r;7P{5A)aPn~flRb3m^f3>Rl8VkRnU|S2N63p+_@8bXMW}|cXu~n;%WfR>U)O8L!
zN6iI|-gVsk+_vqyk2<(;Ayh2z7qr_(8{&bjDgiR$DOLLDbMaJa)iI{o(SCnK$c`4K
z(MQx7?Q)1=rTUm;0~eh!-y_~w7>MNR#)r{2jkl2;&bauE(#mBn0%1IK(F5)z%xB6<
zjMwpkLl3FLP8kSe+Q*xoKaBO>CV-?(9x(-i^0ryhya*9tsUxnKXn3?>c_-oG)BXMD
zi`J)~G0--r#X|gZeGo5@yby?WV!dlWJGlwq{#p;XmfBJXwD(Z)9!A4Jcyc9l6DRFS
z5jWl-ac+yeft5RTK8=<x<^Y6>UX<Mm5~${)vw@~dE4CJ)Iv~|zbk;gJANp;Hbr<DB
zf!F^Qr64-NQP9f>`A5Y<VWc7zqm&~}f9$m}n>m~+B3Q4l=KX3zPZCEZo6H4Cc{N`v
zoa}U2`NT`IJR=qV*=}Ne-4t<m+VC67ICwXpoBUZ1xEXKGLhyZvidNuE%{!_uf}zFB
z|MD)fJ>d&u@+XS3(P~WYh*5(ox1aPf6L{c_usxx?!D%GH9y|}+GqXG%<*qotnQid|
zx0yY`U2kApKJ~P0t?wqcbsY|1<Qc8JXQOm(BJIZM;`kBg&Pzv$2wqqyW$!#o7}iM9
zD4kS>W7kV6b3e=TDJMx!S{VJ9I<a;J={;oZMnTNMd|*9aub$)21fVPL?;zDc71&O5
zk#kvPE8!iz2H0{m%2msOhJd*r;JiD7x!xaizaX|G6#CJu>?xD$!ZNZZH4CaBE*mRO
zOPAG(;>gf~Vd=$J1ENRA29*}nOo(5xENsn}g>t5p+cBY)U@~_<d$8EgO8D8td5kYx
n7?v>yUQ%`nn_>4#IQvzfySa^KwXa+L!;P*UYW3fzX2pL2pxRxz
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-004.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-004.js
+   Corresponds To:     ecma/LexicalExpressions/7.4.1-1-n.js
+   ECMA Section:       7.4.1
+
+   Description:
+
+   Reserved words cannot be used as identifiers.
+
+   ReservedWord ::
+   Keyword
+   FutureReservedWord
+   NullLiteral
+   BooleanLiteral
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-004";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var null = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var null = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..d62c1ddf71d8df7e730194e9eaa80653af27e08d
GIT binary patch
literal 6508
zc%0=}QE$^Q5O%jQKm!Sh2VVQggiwbBPn1f~6)`pnqSam}H@UTDUJ}{Px{5!9_yznc
zc;Ok&PTQoZ(=A=1Zm^fGclMp{^LKZ?)>RmAXw(Nl-A2a|EKp>f5F#Bv0OB$Mj$&sZ
ziBwd<DR@efdd;k^C%3+q5`+Txkcy7kx`9SGoHK`VKH3F`Qvq(9o}#HUDrN-^4OBS&
zHlT9X_-&n0K6S>KR1IxZ|J7^eYb5-Rf=w-yN-(eAxQ+jJTFvg>$9BComQ8fGP}kk-
z9<=5(de>p=bH}#pF6!Xifj}|eo6~L@ZGZ>1sszZ8CsfI!r{by9Yhz5aqy6@XkS#4t
zqK~LE+T#$xO7$_x8ZJ6vo=e=Z&=>L5jSr)58gC;$oN@6RrIm|Z_`-PTp$FVan8%cr
z7;mBldoEIk9WxNdw1+pHK8*F=CV(VO9xw%h@{U>3Iu8(GsUxnKXm~hhc`N4P)193c
z^VX-I5zscL#X|gZbr8>yyby?WV!iJ?J9>T%!2Puva4of^5NPk9Vjo6BU$}B9bYmx-
zNf9^RAa-txyor@NaXyWfF6ID)ihh{g3Sy{I(b+)Lr4?I?P+gE}K00e1Oox6`Vts(}
zp}^~Zhf)w-|G@8Og#4pop)gXBic!Lmra$)Dh|L_16%njIP-(x~(399v$tH6_QeMs1
zifVScEPdhyS)P%K|7<t0zHW-RJ8k$aWgOgV&`tiV2HcD{XCe4LL`B=LPR&=<K=?z8
zm;dEmWP8FF#^g^FXQSnq+!doHRn8#pWhQXn9btPyd6Uynf<1WdJ11s&G|F9aely#m
z32r@mg1g$lws`8<x3#|O+}3qCfRSgka@R)b+(f#M3ME3QzN#KmF5#txPxiL6fL_f6
zhmsj(2zIrMGMBSBnQ}7ps2y@X=1ruXfq5J0x>gWvFd10i)2mbDnE-U@{axf4r~-Rw
zE@mz&Yb89QR{&d%F1c(i&=4@^1Dy6|FxUJ2-WSA{1VX=<l|5y0U06oeBnCm{M>S)~
zQR$*uQ5+fCFf6_DYC!bd*rd{enhEhMmW7RUStw^jxf$bG2_|zlvwNv#R>BV^)yMdz
ng<%;J-~~0Ou<3QXgtK4vp_|)iR`0suKiTNgp_cz;YF7LgN{w4{
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-005.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-005.js
+   Corresponds To:     7.4.1-2.js
+   ECMA Section:       7.4.1
+
+   Description:
+
+   Reserved words cannot be used as identifiers.
+
+   ReservedWord ::
+   Keyword
+   FutureReservedWord
+   NullLiteral
+   BooleanLiteral
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-005";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("true = false;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "true = false" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..6c6afd0bdc80e48867f4a5a08ad12e032b03683f
GIT binary patch
literal 6524
zc%0=}&2AGh5O&(~r(Tc%am}$6LMamB!V(G6APOZ#Y}9Mz>`oI?cXwrbo94{h@C1D;
zxNwHCH_2`iZ`!20N(;TDnXzX)pTC*$#8Gj?q3-m6`gPY6EK+2h5F))W0^&0Po?>Sp
ziBwd<DFjLqr)E|=*{yG-1fjq`q{1~@H_!-&bLLUb2fN^LD!^~iQ#5r(#iYQak&4IP
zdQ|Qjzs)ns$IdvDs;-UdKc{BCCc+;mxT}Ry2^Mtg_wawW*=X+_w4B;dHqzZeU3;&+
z-<;9tU5CxDu5H%?)WNw2kz!#mqrGdi5gyp85+GxqQDu)l6;H*f4KdA+_Tnian_8Gf
zA5mwt!y$o{>SK~MTy(+$pZG&zDAKDN9!B3Z-bQ*j<Kj0;E0?(lh4Iiq54e-CfGI06
z-X#n6e54LLW+05|0B?HwFxGn;0g^Sj&lCvCU9+Tl9wEX~M_e({@OZ}ZX3E9qJ3Fst
zt&cwwplwczh4|;{Af6$4ArR}t`sltmdU*rD{k0l!Ew!Z(Xz!!q6Ab#H@a0nIrcT^Z
z5jWl-b#9Bift5RRK8=<x<^Y6>Zk*o=QmCe)vw@~dE4CJ)+91_zbk;gJ9r|sF^&!gp
z0<ZrAN<p;4{ji%8@<qi$VWc7zgN!3hf9$mhn>idSB3QSlru}L|&r(Mvn_LKz@@l?T
zRP)ni=@ZY%@|;xsXS<2@byLLMX~XX+<KW+bZt`a};O4wJ3&HmhDq3N6Y`&^`BJ5kd
z{4eh!+Y`PpCV!zg8!gA=wiq<1@_K16Gl7Tx0NWGF8=S@x?7{QUJ2A_XQSOTKo7t93
zaO?RK-1P>w`BRT;YkfDlt?O_ABhP8&+(zkziS$I@y8wDpeNzpfUp?r2L%_GTUt4%(
zZ$EQr*2r)vn^}fv*UKz(N%NCxL8czHV$O&BNwgDiZzFBj3Zf4t1?vWS^%RLl09|>1
z8~FyRz@EAgL+6#Z5+2hlfNg<pxol0)5HRmEoOUKK*ZV`0j3g5J<*e)}v(Sa*WKCuu
zRAEv(mK>Qbs};qOp#}ZYE3gJc&yNi%EvT6gzhhb0m@W(Dj4HQdOe?|U!cFaQPE#x4
r2bAg-zH!k-2@~NZwWqLY)&fhZo#9$W^Lp4V{|QHz5Via-Rg>bsOax#=
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-006.js
@@ -0,0 +1,58 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-006.js
+   Corresponds To:     7.4.2-1.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-006";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("break = new Object();");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "break = new Object()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..43ecdd20599f1bc279551b128aab0a292ab12ecf
GIT binary patch
literal 6508
zc%0=}QE$^Q5O%jQKm!Sh2VVQggiwbBPn1f~6)`pnqSam}H@UTDUJ}{Px{5!9_yznc
zc;Ok&PTQoZ(=A=1Zm^fGclMp{^LKZ?)>RmAXw(Nl-A2a|EKp>f5F#Bv0OB$Mj$&sZ
ziBwd<DR@efdd;k^C%3+q5`+Txkcy7kx`9SGoHK`VKH3F`Qvq(9o}#HUDrN-^4OBS&
zHlT9X_-&n0K6S>KR1IxZ|J7^eYb5-Rf=w-yN-(eAxQ+jJTFvg>$9BComQ8fGP}kk-
z9<=5(de>p=bH}#pF6!Xifj}|eo6~L@ZGZ>1sszZ8CsfI!r{by9Yhz5aqy6@XkS#4t
zqK~LE+T#$xO7$_x8ZJ6vo=e=Z&=>L5jSr)58gC;$oN@6RrIm|Z_`-PTp$FVan8%cr
z7;mBldoEIk9WxNdw1+pHK8*F=CV(VO9xw%h@{U>3Iu8(GsUxnKXm~hhc`N4P)193c
z^VX-I5zscL#X|gZbr8>yyby?WV!iJ?J9>T%!2Puva4of^5NPk9Vjo6BU$}B9bYmx-
zNf9^RAa-txyor@NaXyWfF6ID)ihh{g3Sy{I(b+)Lr4?I?P+gE}K00e1Oox6`Vts(}
zp}^~Zhf)w-|G@8Og#4pop)gXBic!Lmra$)Dh|L_16%njIP-(x~(399v$tH6_QeMs1
zifVScEPdhyS)P%K|7<t0zHW-RJ8k$aWgOgV&`tiV2HcD{XCe4LL`B=LPR&=<K=?z8
zm;dEmWP8FF#^g^FXQSnq+!doHRn8#pWhQXn9btPyd6Uynf<1WdJ11s&G|F9aely#m
z32r@mg1g$lws`8<x3#|O+}3qCfRSgka@R)b+(f#Miet(pR9{t<2;rrLPxiL6fL_f6
zhmsj(2zIrMGMBSBnQ}7ps2y@X=1ruXfq5J0x>gWvFd10i)2mbDnE-U@{axf4r~-Rw
zE@mz&Yb89QR{&d%F1c(i&=4@^1Dy6|FxUJ2-WSA{1VX=<l|5y0U06oeBnCm{M>S)~
zQR$*uQ5+fCFf6_DYC!bd*rd{enhEhMmW7RUStw^jxf$bG2_|zlvwNv#R>BV^)yMdz
ng<%;J-~~0Ou<3QXgtK4vp_|)iR`0suKiTNgp_cz;YF7LgN-bM+
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-007.js
@@ -0,0 +1,51 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-005.js
+   Corresponds To:     7.4.1-3-n.js
+   ECMA Section:       7.4.1
+
+   Description:
+
+   Reserved words cannot be used as identifiers.
+
+   ReservedWord ::
+   Keyword
+   FutureReservedWord
+   NullLiteral
+   BooleanLiteral
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-005";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("false = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "false = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..36b49d6142665af8ca2aef1dc9d1757665b53fe6
GIT binary patch
literal 6579
zc%0=}&2G~`5O!$!QxQT!h^voO2vQ^tNTiV<O+~8`P!pA7wXvtkw%gd+T_+8X!~-DS
ziYpfcv+E>woOM#Cw$ef_iD$esv)_I*vy+Mpd<NA@7l>PJI-L5_TC*%mIGzudOF1}_
z_CZ)e5(($flftT$_1l&B(sx1tm*5@|-qcIi(FlVJ>JY|;JK!+F!EKOpG}R}3THp|0
z29u{Q5j)y%y-(Q08KXj0l~MJnl=WjM{Dy)%N+=|!y-xKm{%+Q5t-Vi;N_iw3>u#g2
zwbweR&uG-DqxxafwCX<U;KBi4Qm;3oy`!~025eMu5CMy+;-PP&{#GpX#g5F@N|o~H
zFw$ZA{?xKIlrVm5cwCgU8HDFSlv^Fp8SS~2I}&<4I`ffVMG-v4C=Tu77fMTuTzFi2
zXrl*QY0(~)Mn=64U)XbzbM%A)*QR?&kz_E&10MqtH+euMaKf7UmHLH`U<$S4lHLsq
zW-LF9Nc>`J>&?qkG3#LR9b#?rn=i^gSBLUUg5-j-O3MA_tK-+#0NmfJ0oPEMa)I^<
zDs}@^T<t@^3f%|S{^D_WIUYwIo8xYvT|*R!35FWBfLO2!I@J{bEW$fMdQXXPOKjDI
zpemi%qquB=kh8lp*2U!3Z^~XDp?tuR3m;GlyyYEuos=#AC>i*Syd-=WbEI+sn|4TT
z1}D<uw9}PIzsk__$Wg&2GeJ^Z4^Rp_JzbWLcuvZvq~br@T8tN)JkCxT-X)ZQdktF4
zpVfeya;MA%-^ZwEc=p7+ExX(s7`*&1mn73HkQ<Xf6CARZV{(fRYeYKTsF&%Dd+re1
z6Uu9h1Om*PXP$GWUk_)(OAdm1SvU%=rH_JFoBR^O#1yn|YJJzat*h+-?mVTHJ0?nJ
zCei~Px&V9ImOOyB20EF$&K!2tVibxel;+pf5=x)V{9MXN(BnqH*oZcvb_(Uqwb4kP
z18XoBXs4&%PH<-o(52V6kY*rrY^9lqIj^b}aED$2Y#Ey5vZX*lK%I|p-k!o-t@qle
zh^^&wbzzp~l*x2pDOodmzK2@rg(YLjNoi57$d3#S7!+Q36(DMCtYKYD0pu%|h4o}v
zC}u*r8Piz-CNuZ4jp<&N^OZ}n!hVJ~S{M{D|1Bsvxy`Pd1;l>YYi?$vX|3yq|6!vl
Lhg|-DscG?Fe>8L0
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-008.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-008.js
+   Corresponds To:     7.4.3-1-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-008.js";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("case = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "case = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..2191764f6af766ebd8a6d11745a73ae0143dde91
GIT binary patch
literal 6582
zc%0Q(!EVz)5OruNpdLU%h^voO2&Ei>5UEX5QK=26iOR9s*i&ceHnw)xNps<Y_yP|6
z6I?hVm|Z8a<E+y<wMm;x;u-JE&f7OLJE_SqU{J61fVlOx!)YL`HOsPu;|E~5l!GJb
z0E8tZk#GThDXdymzg<f%-4Oz~1owpSwqCl9Mi^XDhcGtU1BVd~Zi`%?sR7}$0*3@L
zoIdr4*wcQS1Hz`x7!|UvjH*wqsvjfaHxz6rp^%*Rz4`<E-EKBI2OnFt>R2|>-A7&L
zpmW%q)2LM^&EvLd)g#owr2~Paet%B8p|t^S*r?(lLY7b^xBeFO_YzxQ%2cIR9iK!t
zMn9fg)}|6B&kWCsk}iYjFo+6H@8+ELUCSK{eI6h9*stOTo?*NX?cz5|D_6Pjx%SXS
z54h5zeJYJ~+KpZ~aFKBIi~`rD`^b;<W{jsj0VHYikV@c$we>5_%K*U?D&mTchJ|yM
zH)96B+TMOMZ+-e50c~<xEX2Q72k~5L6auj#b+d7_bNc!gp!;Vv=o(5=A=o}c#eS&j
zs(lPtoCo0ApMCC%rJ#;IwkM51yM}ltCKwu6{S%v2(5Z$1U=i+x+3h68EfuN>K~<iy
zJ#pCqA?KqrR>gGacO}**C?9g<!UvQB@A!wlml5*!ih<9_OTtG9M=BSvUq{qta3(EI
zy`D__Rfb;1j!HI}3zG6WfKu4m>9X{W7o>bfDwbdUey*na8Lu@(wU&KC8MwEgwftQT
zxEc4>LhyZxik5Fr&D*la{h`6je+PSoOith33uE#pg7ejKOz!YegGi?r_c9&0?~brN
zp}fIJD8L*%^PO}3dNdARa|YDQqA74KdkVbS(3cXXW}ud-_1)&SuEGI~JfoF+CQ9cf
zlDa#%&<#Bgxc%OiJcM@!N|`&)0){mbG)g9w=Ge`WN}tc-e9B4E(^kmXm^zVm2I;M}
z@kCw#b1)yM*H>?+_%i|M+Uq+=HIN0i(_G|SRM|?nN3Q_39F20>a-blf&JkR6XE0am
z{q7gU)(W_~G)r^J<T|j7tQkK)M6L9rva#f}bXBb=jtngrmR@`nAZm1M5Me+~hxirC
z!g{(alryE=jR~y;lezoZ<N1D8@YPE(!+wD`TNsux2VPNj3Y%fKO4$2#ue-U8X0@+7
Q{>P1~9&-8rr)I_f00KdEF8}}l
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-009.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-009
+   Corresponds To:     7.4.3-2-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-009";
+var VERSION = "ECMA_1";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("debugger = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "debugger = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..b0115005fd832c39e228e35c7752b57022efc3b2
GIT binary patch
literal 9101
zc%1E7Uvtw&5LW^XblNh^FuaR5m`(|q;SG}+Fa|<Xw-X!s)X7|=jeX%FiMx{>!?)mL
z@Co<|e40M>k)gXMJ5uD69XWE0A$f^?r`x^#?Qj2hRnu`KV6)Z*=5Mw<$s_GtavVo_
zVFZrPC3u?mKsib?4TlhD<<!>A)3xl;M@oUz;J;$BWsY7(Ap(xL$AlO>0Z%Xqev=)d
zs2-Ci7d#f}`1o6wsV7EnqsPRtGQpMJB%$<ITQ^^m#Sgf!MvF>I9&|RZ;OADO-roAN
zSz8~jjrM-Pz4lgnyD_#yr(QL7TDDU^;vO7%5NRF;W4mi+H^K{Bw<M@oWVW(b&)Kt5
zTOVRtZ0)C8j&qF`v*;u0ob3rnU}bboXB8iM%>&=@hl`<1T{pZ8c^bWuUe2ia4_8;F
zsR*Ufu!kD(q{9QQt;BeoJh0^>b@)C9X+#I;>HKA^ej5Rj6}indNG4k5k;YMk2rII9
z#aJWaG08urT>S0c#>Tkx<NpcJHl@`<{O{r*9wT`r5K~~iXl?A?{|dnUyclpTxup_l
zZ{o(&m=dJB1DIud;Jbf^(pNJ<ooZ~2GP+R>=}l}f)G>``E=$l+W(RPX?8L=&A;m3c
zstrNPvsh=OZiCX})>)Hc-t=X$^*XNiC34|8u7Yfb+hM1`<c}*BJ|i!g9Ap$xEMVbH
zs4ZY$JCb+0I<J=m{hBJ8v&d4A%&!2@hFcsiGv9bZ$QOj-veA?*jPO%YIKH>#+S2}c
zKsa`}ay16NE8$Iy4WM#E({Q;5tjCmTP46Zv>Mou0v<m^Hbl-yhbkw)@Q?!Zbq}uUN
zIBKUgCeVlgpRj`XG8ZbV*-$YbuyR>gc*`Cqv-*-u;NBl_xOc*v<~Dl=*pj02=r($=
zI0{`c&=|j!%;^~p9y0B93y!~?z`-3L0_JRtm?qyk`+{}GdWtnugos{a?R;{_8MyXX
zgx+hTI{95S<;T=+GZtcqNV0pv-e<OY@HHoq=?wU%k~Cs--4riP=#+}RaFI?f(n*<g
z(g!I+d67<*FrDOGcV6k_n;17($6r<S^Cb8w<M!6?yvGe+76Wd<P_hzyZ{S8VbdSZm
zx+}xJMa%axIJ3=oD`WCsOsN@}+?Innm9jKR8^c3?fO!|!>w?9~-g1;IBBKGnIhKt0
z$wLJr{<BT=Cy&K{U$%Nh<^Wn=P^|n)iq$XV$QXMw_o1t03=gWPS@jHuvJqtncD9Hz
z&Y2uc)wVfzkgls0(FTKocLI7kN1hQtr#|0Co`J5gmX>1Xq_j4NiPZvND^VpE^rNYi
z!wRBi`28yV?hKQhG2{4rTCS*$3{B|IJ@XPE^e&;!lm#_o;yX+Wm-A_1K4a_U7}?K3
zWa(n|bFP?G+;kBw+}qgGLVq4_1*YVj%HC+)nZw;r+vt`ST2#B1{QU@}4n6zZ%9G3g
E0~HIiDF6Tf
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-011.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-011.js
+   Corresponds To:     7.4.3-4-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-011";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+print("This test requires option javascript.options.strict enabled");
+
+if (!options().match(/strict/))
+{
+  options('strict');
+}
+if (!options().match(/werror/))
+{
+  options('werror');
+}
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("super = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "super = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..43685c1df87a13b0b339aff5f0cff6ba48a06cf5
GIT binary patch
literal 6521
zc%0=}-*3|}5Kg!8O9KfBAzt&ygismcjZz7^P7FptYc(DxH@UTDUJ}_(yNdsacO?ER
zo_IuXcG@OQoo?w8b%VWhy|eFppTE2FwI;)WLA}-o;?~;^r-8KAEz1&)AAsdj4vwS)
z5SEZc!YO!CShcENT}y6#Ed+20?jhlAy>$bPFgT+QVQjPm4kH}g7CA*z1Hxwo4hdv9
z{njU9NBeCK2%9=%RLHtAs{U$K{WTJPL%~fY6p~Y~SHFe-x0{X5-p5w0I+jgzH&EBv
z>+Cn@G-}sj^Pp|obq95D=0G5+@6Bm%YHffAHmW#?kR?>fqo?Aj)T(1lv!ng~$g(z-
zFo`~*PDz(R1S?U;wAOIZ3H4md9SeOPU)}gH>Zb8F;=^edzff8^&xOymhc0@+ofh?|
zG!o-Yv|!Ig>d<2fT$}drrqhQp-rEF_q{)3MffLr&OPXf^A}mzI6&(!==PYl=TzvX$
z`}w@}>1PDA$!W0=|6Co!b0jYWVwG6$+S^Ajt^l~dR|Br0wiE*GLsaaBszBNYfK_$?
zuKn5Pu2>4{*kgNA(Y0%cPhx_hfn_{#SOuM`>;M+wy)e5k#JHtGH6f_#EcO{LJ0RqI
zbjG5X4*j~sdLQLOj$C+)Qs5nb-|uCF{G(#vGxCz~QNoeR1#G+#wHX{si_>0Tru`~I
zPhv+Uo6H4Cc@01*?Cf+|`os%TJ|h+X+16rw>J)Kz%J43s4BRWwTK=pC+>8fkA^1K(
zMa#FR=55*M{?Op%e|aRC-t&bq`4hoGX*ni$_^3go(~o<Z4%~M~*q%_{U?db^4xahW
ziC!Mfbr&4w^tNc6ThAWnE;qd`9)aGQTHjS}>na?;$TM2GYoc^+BHhzR$1AsA*^-Cw
z(!eKk+gU)bMuJ1hjM4<VTt?~3S)5Ec8G6(T85{E^($2uVg>+pjh&GrEwCAbSDe_DJ
zy72xE@(g5wy)+jy7nQXV9?>g+Ek~DJwiYM|sPh3%yEB-p{eJfgVrvCly_lsrWpZ6u
zM%IkK-$t$UqnfegsB~VfD2@y*7?xgn6(DMEY!G2UO^5gu%fd#wER-{%T#xar1e3X&
z+1*q#EBMi+XkkCbH!Tdym;leIIfYHHTP2+Rq7U8NMzea?HUG&*l@7W5FH^JPzli%_
AIsgCw
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-012.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-012.js
+   Corresponds To:     7.4.3-5-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-012";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("catch = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "catch = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..57b0b456b53ad268c356ad3a5daf79ea2ad57b76
GIT binary patch
literal 6525
zc%0=}!EO^V5Ovy8K$QRqA+CF*LMT*lBUFMk6-8}8O;nDRvpY!)ZgypRljgt=@dfZz
zoH!yFdz0)Y@uuB$S81V_G&A;$=lRWyClwV29Cj;Rpx$o76)aF>oe&~jKLFw}0j^?w
zkVGn~;0$_7l1kaEt|Yg<krIRg?}Unm*}8#7IGi(=az5Mxms0^=ot~koJ{8jfmj)`F
zeCtxVXZ+Usluw*-Ce^Mss{blw^EDEFL&2sNN+npYvwIu=Z`7*IgAesec_bU_ZlSJu
z&^)ZoY4om>+Hu3S>n`fx+=W0fzc;7dG}-_UY*h)6Ay251N1utOR4I=zO^^1+V?wsH
zFo`~*&S;B61S{3YBx|_n3+s8r8wq_8U)|_1`lj(V;=>sizffAb$b~PAhZcIkorLw6
zvJ&HMwBW!)>aaEgVNCb%re_ahy|*zSNt1_6fuOu$mekGzL|E#GOC}l~&RO1yx%lk)
z&Wm~Llg|ifo6~$D{<%7c=SZFl#5%FwH+D{6UITD{uLfL8ZOH}NN2u5jb%At_0jq2u
zJm-@yJh>FqvB$=^q8rx`pTq`370Y<yuo^mD*#QU@oiM#G#JJ6bYC}-hS?n`HH9@NR
z=&VI?HuRek>jRVz1ajdWN<lRJL%)*}^7oR3&&W$Eh6zVH7qIb0)aKAuM6ga*&HB}b
zp2m&}Hkk>M;u?TfIO*xK^obXwd`c?*v#rJY)XC%SwBdcqIC$5fwftEPxG4|NT=0E}
zin{Mi%sZ+p{DH;G|MEz(z2|dd@<)n;(sE30ieZ&1w;T5|6S(gUu|1)@%4sOU9z6Hm
zFJ^f(*Ija$GuxtZZasaRyV~@&cmz7KwZ7}z)^#|5k*BoswvE!6iF6+o9<(VITj#Z-
zL<p}ejIuYL1q7=mSd`2uL$Rynl)0Y8>6DS9r}dEY5pyE#6wup9*tML9gXzFJJ-vE{
zK4X9`y}yY}1C?Vp&BV<`g{^>R^a^0h&?lFz1{wn99>G~_3Uj^RZ+%8=Ng(u_S=m!2
z(}ksE&FK3b)G9x!8cPmK7uAaV$WVtt;k8!-q9?~Hl@`=Yh+nZRY|NI0VuqBPF`yM-
zGIKk-H`mT`et2nOI8X3h3xgu2zzeEQZWHWw0cXGLV>h$WwC;7of40%ZLoNU7)U^07
DkDg);
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-013.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-013.js
+   Corresponds To:     7.4.3-6-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-013";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("default = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "default = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..73c5736575b5732aca5c98c0bfb9a442c5bf41dc
GIT binary patch
literal 9108
zc%1E7!E)0`5LE(%<pNYu+{F!QYZIvAhDj9|vxEwUiVd77Y9h7m2@^>>GqU5Y;wShF
zzJSlzKiTVEwxD}tN3uM!k&!Wm<Pv*EGd=zK_3Lq~rsGJ!ZmkE*-)(u4N7^~(IF9nd
z2ppeF@HFp(a+GEojv>&>sqL7jYuTj_lme;2f5l|WEIp5#2sq&$6Jq!XJi#RRO?Hf1
z^_iR;@K~hd({DYd9vQohJ`<<L1Xp^OHl@GXj`^Ale#C(-8dO^Hpu2k!Kern7_TKYm
zZD%w#p1Xi^?Y;JXV`_$0y=ok^Y^yHe9GrL%X&wesvs-31!UJ2UB&b+qrm{!R`Lj{m
z8DU!N?LRjh=Q0gu(MQxdI~0(>%IKKRCO-6z2fpKv21A*KZgd!mG)5ymoH6kqj&95|
z5lUm>5G~+JhX-6+iSaObV9!VD@D2xQwhl1T`NLS_HU=cS<v!OSnP{0u8YdAVtjOaH
z<Bf=?cD|f)@sHbg?rtBcX#=PK6Rd4^t3~<W)uBAa^GZ;r+<Mx&^Y-o!0Pg>*0oNig
zl|XwPCmzS7k?sMY(DuQ1Ux(6PjK`_P)>zbyX-H3EgQ1Q}o;fT*N8%3PFxicZOGAoV
z&Q%+NB(+#-q;7-K)81KiG4J}i_<9w`2NJpP1V=%(!~L*Z;PR&p3!jmfOb#=KC>OBy
zCe#+t(T?QZp3d8)jebuJEqTjQkSwnT(1cr@E(@P{M#>kY;=0k4JdE&DQ96FGX>IBF
z+#?)&T)7$(-<9xJjCVlghUU)Y9<e@C=61TBjHqo|=V=!Ll62pK{(RK;Iw{&jbTaLD
zxH(#<F(%N70H3ge_%fF&o7q$`AFy&+Sa`#pCyU0CT;Sd_I6j<+ra8^w5#CBMcyt;)
zTpfij8fZ-1N@{wBgU3vJy@KU`&*0zz5CL;OMod#|osMALsXN7%DMCcAsT+NA#s#?c
zP=ww)V><b1HRt!#+h#1p2$5uV!rwn__25Sqk@*aGQ;Ce&LN_N$Gj2-7Q8<&6GdU?E
zCj*c&lxK3XhH{b*-S?7{pQ7Dh?SNHrpQnu<Gj6~7eeZU|=hc8)(3h+P-)lJ04BgZ1
zUEP!6z+&ZBX`I>Gyp=Ke1ygE4Cb#9VPNggrY2$e44^ek<ye?R*>{pJGMP%ILH_MVP
zKSijZ%l~an{n?%IXX{q4$Q?k>3yM{zl45nmIIAJ>m3!aSGKPCqRIPf3McJG(6#KTE
zGU1t>PSsv?ZXsbeD<Tf21Mdd(bdEk_fWCTt8<_^W!fINIo3n&%2|cS7z*eG8uIOh|
zselz^&FK4Y^vg3$RAa#g`aG?ujtos0EM0pE5PF+XXUc+_aq&IM!uh-`ET?h39!>it
zY`M@|+sSfP@x_aX;oii1Eew|NW?+u$RQ6Wm))LPCwU^z}n-*2CHGfA!;-MFRV>vne
E1;bOd<^TWy
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-014.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-014.js
+   Corresponds To:     7.4.3-7-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-014.js";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+print("This test requires option javascript.options.strict enabled");
+
+if (!options().match(/strict/))
+{
+  options('strict');
+}
+if (!options().match(/werror/))
+{
+  options('werror');
+}
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("extends = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "extends = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..7680c2d3fa916d02fa23680367a587672f3b639d
GIT binary patch
literal 6523
zc%0=}QE$^Q5O%jQKobZFAzt&ygix6TPn1f~bz-O#v{vJBa+6zY<~EVzw5!A~;t#;T
z;)zEDXQyq_)ajNkQ8(C2*E{>p_xZa!Un?^3I8-Y=piZ@A3+73(NeJ<6*8}1(0k&jA
z@QE*}ggy+UPby`-x)R^|#`i%;aE_^H>8)F6gu^+rDd*#TusIdrG-)4A4XKzH*wmB3
z>|2le``T}PNcqeeXTGc|qw23x)?Y*6Hxz6up)Um+bgQ@V|5m-$KK$6Mlqa&O?iT9W
zhwVmvL8EpZ*N<AJU3XCj=Qenfxq}7mw$^%hV53TaAMltee)L2<rAm2%X?nEZ9}}{p
zgmLr{bw)cJLRhIfCfUG6XKdgQXCib(baj)%sGG*yhz_S+{6cBzA{VaE9y;g&cM>*W
z(nyTA;eta4sl!eg2yJ?RH=R6;@!qC@#7#Ds1VMRAFR7n<h_J6BF6n4^uwZ#7;^MRC
zdoLHQ&ptz-O-}QL_~-f{ULbic5Ua#`-`YEQaSg!zy&iB4wIvs5AEDwPPzBOD0<5w_
zaIDX+aQu~^jy$%e6<xcA=p-f>YFNf&hgHz2$__xN=mzP1A;K*YstG|=XR*%+*#=)O
zMrSOF$<S{~tPfB=63B&jC<W1W8*Vox<R2vipOKeTjAM>eE@0ygsm<Y362ZDXne?j+
zJ&ha{Y%&uh#Wet>u+r0I<r6PS`IJ=rXIqQ$sguXuDZ>Ypad56dYx%Pta8n+jx#0T{
z6;0QgnYUz5xFds?|K*Wnde7&^<WCd_rPY|+7ULR~b}#B>I&jw+V|zk*jnlvfbMV}?
z&-C(euDj$gr?-XU+-CYXceUwl`3Tf7wZ7}z)>Sxwk*BnBFi|=)k?yOD95K9e>$N3C
z0Iv*$GWVS&{Hn!B6i+G5u&bq%zMbXSl#!w*&4BX>aYF4J&b!FhjhuLc*}%F3wK~C`
zDL|Lr-$tT=%(0nfqUN%?R=_KI4X|ZsldBd31p%`^K)*AGx!Uh`z96>56Y9w<%_)=V
z!cwwk^8F5Kr5hHF6=$W3YDIozXu_!Q(yIVbgJX^Q2Gn$jU$HD~CCfrFGs?}F&k8V^
zxtrZfcC(zHU5Xdh6MWUesE8Txf})e#{JLAf*)RLl&1^KSdEM|IZB*@$tN%7NFa8U`
CM`2<B
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-015.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-015.js
+   Corresponds To:     7.4.3-8-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-015";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("switch = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "switch = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..f3c7cf1adde5f2401099482068396e526800416e
GIT binary patch
literal 9101
zc%1E7QE$^o5Ozx`AdVB#iFflxg=j%K-3y`85yDX@;nalkgwWQWCJS5J?5>mM_!s<)
z`vvzG_%%H7i0)?AN$oo81P6zZqkU<z>)qM;=9_Oe<C=~m0o%1MFn_z{NgiqEoZ~pk
z3nOrRF2U2h2g*^JX*hyFE2p+)o~~t={;m{A4gNlpEwgkDHxY2mJtoB90eFH*@SE%i
zx9Tx@dcb3mj!(XInR;OCHhN5)7!zFSZQ7LnYFp-OGWa(Rtka;<k_Vmb3;4O!sJC~X
zHEUbLvC-UloNMp2cN=3fv}(Vx*Rrj;gmZB0L8N&YjLoi_*$5A8osytpk(tUKJ?GC#
zZEJ{Wv9}+tJI>EEm_;8^=j=d00xP3qI;;558y@(MKO78Y8oJ?ODAE{>^l-++Cmdaw
zW+Ifv!U0;ql@1TMwi4rh^1zOd)ZvF5q}e*aNaqh@joS#2?3TM+gJhy*9%&p$h_E7$
zSBy6z9^3hH%Eeo^@BB8t`^o<VXq(Y$A^x~Hh{s4?3B;6Gk6U+M{rVk%`*|_oTC}AS
zXs_YK!<Yop-2+tF9{BEyQ2J^ns8frrk)j*Zke<W_Lmg#2b6A3olpVlfvJ)5Ag%r1(
zt2P8lXR*#m-3Fz{y|ap9-t}ei^(v0{C34{rj)H85yJ4rm<$qQzd`4a}Imj5IT)@Jc
zP+P#Eb|mj~b>1#*bTc(H=PgS?GQR>q6K-+3%zWYrDPNF^%SKc3Fv3qo>G<BJwWZ^8
zmvHQI<!VfPSHjyEFM!Go&4tT-&3a6ktLbJkqBd!rr(Fn0(tQj1(^20!OwlHylWE7p
z&CxoIF@a75_=FY2=ebl_&8CX^fR)R_!t3@tnKhQ=0{5Q6(ZQ)`n$sM-#w#fXk4~cp
zi=)s51C5DWNlnji@Q7)zTd@4E2^`!5B4EzPh-r$gb0}D6>`t+6iV)Fj>^h&EaR#p4
z7oqpYm`;9IP5CkPsu>G0L?oF#<?kQ1dhk7q$aDt0tVBj^p_>w=2{)zUD4fa3nVgi7
zlRiip$}>4xLOIEY?pw*p|DxSsZGTm9pQnu<GH$>6ed~6^zl#C4peb1izQ5o^Gjvb3
zcXd~WeT$VJrEzBK@m9v<KbcZ9GPx}Wbt+}4NE^pPe}KA+<8{GeWxsNiEFz-@zgd>F
z_$fjKE&i|T=ud8oKUubVMeYE4UQn$3N{ZDLI=Vn6x%XTxW4K#I&8lZOl+7qZu&>J~
z6P(G(RP8lq1L?Y25p6ITcqgEzbL1HT^u_Dj$TQFt*3weUoFr>==vXZPwh~oxK|h*G
z1*{-zhTkvJ@6IsMj2YYK)3l;GGBlw-cjYBO=v_jcDGO@G#djzRYk66iPuqGqTK03;
zvUD-~DOb!YzH|{S+#7hOh5kI=3QW<Q%HC*f%;D@`deJStX;JN3^7kVo9eVb+m8XaQ
E1A29``~Uy|
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-016.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-016
+   Corresponds To:     7.4.3-9-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-016";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+print("This test requires option javascript.options.strict enabled");
+
+if (!options().match(/strict/))
+{
+  options('strict');
+}
+if (!options().match(/werror/))
+{
+  options('werror');
+}
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("class = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "class = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..15cab29413b37d3d7048eec67b4273e3c5c51335
GIT binary patch
literal 6515
zc%0=}O>Yx15Ovy8D7_#d#C4BU2!%>W90-*lP1T|jP!pA7<?K!qQ#ZS^z4`b{T)6VD
zIB`TU_9od);!V5huF^s;X=dyh&-0rZPbw-5IP6tAK)t<&D_Ee&Iw3^5egMQ{0$jy<
zAc<5|!6kH+B$cvRT}f_zCnX34-YFFgvvmWFa2PO`az5M#ms0^=onE4;9u?C9mj)`F
zeCtrTZ~WGJluw*-Ce@xcs{blw^EDEFL&2sNN+npgy>}n~Z`7*Iqfhlpc_bU_?xC)E
z)I6@uY4ons+DXH<YYTNSa3N64@6KsAjW)moTU7#N$P=pM(P!c*Rmvkw)1&?Vl#p#L
zOrnpdGuq-1!AkWp$r>)YU|o-RBcU(is~a6g-!$Gvd^qFc7fMT4x$uSY&_WNmldvvR
zR${!5794p<9d^z@7}H(6>Dj|r?`;f7(&RByASiE`CAC3-2umGt$wb4$Im_EI7hk;G
zeLZh|@)-ebbDA&2KUW9w9LaNmSSQwp#_rjxTLA9w)qrcMExADZ1QiFNE|AU%V3qBG
z=X~*nCzpac_ShI#bmJQ0lh|OWVi`{yRzs&NI{=}g9j5n%7`K^FZ3yZ*i+x6@CP+0O
zowX>=hJIIKeT4G9KrS4j6hzZM_S-2T|0r4bjJ%{`m~f<X0UK{bZ4T#(2-fbXS-;xQ
z^Vm_rCNn`&Tm#SwCp}%3KJkK-Pf5jpwzXKFI(gikHhe%C2k#cNmOrZjH{}7E3%-w0
zQTLsRc}I1G-?w=AUmi)e_k3<l{!DRDT8_z0F|1PMcH&-U0{6WkwkMQVISnP)gXg|`
zVU|a8-8F|fvn?9u*3-win@w+vN1#Jn>$}ZuU55i0c}gp%HcDqE(nC~uzVp^mB7`><
zGTD310&Z0k1WKlpVb{&l$=uB1Ov*^lvwFz+h%}LQ3gaE*>RL{m!AxN7u3kOEoH0Px
z-rq!$fy%LwW}@YynpVIIdIhj$Xpzen0u2FkKf+~e3Uj^RZ+%5<Ng(udS=m!2(}ksE
z&FK3B)G9wJ7)#DcSJjIA$WVuV;bm6?qKC#Rl@`=YhyyGO8?$AhnEB*x%w`3c%-qSg
zlASE)=a%M#^9*0J&@W>4yQ1LaHn;8+aQ5pyaWflDYg~8y#~NKX)bhVcO^g2mS<+p~
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-017.js
@@ -0,0 +1,54 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-017.js
+   Corresponds To:     7.4.3-10-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-017";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("do = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "do = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..4bbf882afc5ae62cf9694c3018dcaeca8e1b3070
GIT binary patch
literal 6525
zc%0=}!EO^V5Ovy8K$QRqA+CF*LMT+?fJCSSX)21^fSRZrD`$6-7~Jg2_9o4NAL0w(
zt2l8)F!m<dP2x?v>8{d3FKK4%8PD^Z8BZ!I3^?pox<I|%hAUX0$T}fJx_$t}V**^o
z`XGr^RKXealq8k1SzSqPeIq3Z1>Ol24YPFvjc_<;F6Df<2QH@qygEHYQ++C?1uhL#
zIQiD4a?kj!^(mh?<4meuZB+kN%I0e%{Dy)}EtE>IUT60<{@<uon+G52mGVe7*4;u~
z^PqWHo73oBC$-~-ZP#7Y!MO{8Vt#K<yJ@rm9@wf9AVZ!|C67K6PpMKKVVWN8kH>^;
zX<-t5M4izVhX_`xk4e^W(HGY9h&K}YBEGuOVf0PoZN!H&E`Fi3bdd{R7!NJ<fIA86
zF=Zvj+i1aohty$h2Ev%`;Z4sT#(HmKK$0d8nF2w1!z`(t2Z*rL5tmFfJe;$<6?5^~
z^PQLT)+e74&^D*}Li}@e5YLf37l?IYy>INCzPJY9{$35ZmfDgFw2x4+AL;_>90OL_
zK6uV2UwCpUsAG?faYZ+-AwG!>hANiv#9=jby0QZhDmr0$Ux;y=3Dt(6uCv%@gld9R
z^U+z0;%w+QCDsQh9|+{aJCuTG`iFieCFJiV3!jmfR16c2bS_}yji}9`t%zWquA23$
z4Lyw=6>KsSB*irVt#H!QW$6<yNcogh{AXK>^{JD`-D$)7lyUH`L2LQ58gNq{pt<1t
z5EXUbnV5G}SNH>qm;dFFWP8u&#^jF_2c_kh+!VtqRc<%#WhQXn8)ADxd6m;pf<1Wd
zyI;)mXs)~DFlV+!<J@}sICr(_ZSe?nWNUrbxvlGP03%On<!u|KGZX1PD%#kr@hY6x
zjuIifvM|ctcoq<>nqW~frwqlemQ&_>7N=82j-J*-&PU9Nv{OKDBVpHaA`Yel>-6;M
z8TyO?y7c}gG7VIY-82(77ZtVwp3y6SEkmDNwi;*%n0o|gttrg)e!uk@u_b}fZ)Rmr
znM@a!k~O36cTlVRsA?=ZEL~J9@*_hX28GvN4Tzo`t5jN0Ga-J(vam5*7K#~CZpMIC
zfXU45?A}~E%lYA@iQzoKcP$Kxm;x`TI=M}-+XbBcvX9-&M$@|24gc9j7Z0`kuT#_F
EzkhvVCIA2c
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-018.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-018
+   Corresponds To:     7.4.3-11-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-018";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("finally = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "finally = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..231d67fff5f49d9ac886747dfeccd59fac3b31e7
GIT binary patch
literal 6578
zc%0=}QE$^Q5Kh?`pn-&h5U+V;La0pQ1<_R+T_*;kptTy0lbhUHGp~tkr(MNA;vI>9
z#S@PR&Q9B;snaf9qHfTaHh1xz@AG$ezE))5GpJU&K-_B6;nbJbnq^tS@qDmc%E6Je
z55f|XNH~X{6jr6I->$@$?g{~1f_qGOQ!iadBMdI6Ll_(Gfx`#~w?WR)RG;u^fkS*5
zOrE+#>}kLCK4BAQj0#y*M%AZM){mj^8wxg*P)JUDo$4L@-K^JI2Ok@i@<=w;-9}yO
zpmkWE(Wq6&^`oX~)jia~g#*5%UT;Rbp|w74*r?(l0v1!nx4wh=Td}P#c4W3zs+32E
zkq*=MCziFTgz;m;<D#U^AUqGE-0BUT(VlC$BcaEmGava?6v1PR_Mu(;LTPD{3y*6L
zZS;UEE!v~f$f!5r3kNQ8j-FEB+H?;olH82(z{h~ZO&(GSoUo>TrGDWfm_kKd($TPB
z#`0!F;^!~6U(H&de1|}roaPJh&(%RZlO4H0tTOUlbNl4wH30YbYQQxVrCgwWjEen0
zRaW~5usrv{wLg2@6-z-Kd2Ehbfp!hiPE0V=u>Qw3tDsXY0l*@>6Qnnk2)9J2CInU8
z#0JG>3xu4F&R7(aq2H8PAEJD~kqd883cTeVdYzPzf0PV-MqUy=j5$)dfE_!eHiJ`X
zaoXw1q+ey|S>&i-lbIkXt^p{8ot`dB?|4qir=;RP+ggmbnmo=<8Qv$9fqM;F%b(SN
zn{uJd1>Z-gXn6L-ye+%j8yLL&FP9|KAdnlAKM|a;mSb{@4{Jm^-Kdx8z&&?}?Fr>I
zMgjrm;F;%~>DR-7@RC!YUKY-QYw2^~)yBSrFfjtXH?_X&+}2e%fRU%Pa@R!Z%tU&C
z3Z13)jxBiruMK=Mx1Blks>L`I&nQi>t7VivocYO=k)bDzfUyy8LhTgHTWh0%JO|of
zGSE&>y`3P>7@$k9Zz0b>=GaR!F>_v7E8r5n0@yNi$z^MSf`B?7;JiJBxmxeFzaX}j
z&()1tno}mzfu&^4==rXy0bW=$mK>E9)r$Pc(11bVl~)0x=EfQk2Gn$jU$HE#C(A-H
zBg)Mf&k8V^xtZNhG_#y9U5Xa=Q*;1>A|}8EH7B>}b*q5AU-qJ#*=Snty5WD>sL~;q
J|7U7i{1@VCbNv7S
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-019.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-019.js
+   Corresponds To:     7.4.3-12-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-019";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("throw = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "throw = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..8ac8b3b669443a471f27c72b92b0ca6516fc1492
GIT binary patch
literal 6521
zc%0=}-*3|}5Kg!8O9KfBAzt&ygir_KjZz7^P7FptYc(DxH@UTDUJ}_(yNdsacO?ER
zo_IuXcG@OQoo?w8b%VWhy|eFppTE2FwI;)WLA}-o;?~;^r-8KAEz1&)AAsdj4vwS)
z5SEZc!YO!CShcENT}y6#Ed+20?jhlAy>$bPFgT+QVQjPm4kH}g7CA*z1Hxwo4hdv9
z{njU9NBeCK2%9=%RLHtAs{U$K{WTJPL%~fY6p~Y~SHFe-x0{X5-p5w0I+jgzH&EBv
z>+Cn@G-}sj^Pp|obq95D=0G5+@6Bm%YHffAHmW#?kR?>fqo?Aj)T(1lv!ng~$g(z-
zFo`~*PDz(R1S?U;wAOIZ3H4md9SeOPU)}gH>Zb8F;=^edzff8^&xOymhc0@+ofh?|
zG!o-Yv|!Ig>d<2fT$}drrqhQp-rEF_q{)3MffLr&OPXf^A}mzI6&(!==PYl=TztCy
ze0$#d^fLn5<g{3bf36PVIg%Fwu}Z9W?Po_Xt^l~dR|Br0wiE*GLsaaBszBNYfK_$?
zuKn5Pu2>4{*kgNA(Y0%cPhx_hfn_{#SOuM`>;M+wy)e5k#JHtGH6f_#EcO{LJ0RqI
zbjG5X4*j~sdLQLOj$C+)Qs5nb-|uCF{G(#vGxCz~QNoeR1#G+#wHX{si_>0Tru`~I
zPhv+Uo6H4Cc@01*?Cf+|`os%TJ|h+X+16rw>J)Kz%J43s4BRWwTK=pC+>8fkA^1K(
zMa#FR=55*M{?Op%e|aRC-t&bq`4hoGX*ni$_^3go(~o<Z4%~M~*q%_{U?db^4xahW
ziC!Mfbr&4w^tNc6ThAWnE;qd`9)aGQTHjS}>na?;$TM2GYoc^+BHdF*_dOx)SGMFK
zyfpC1+;$ewtC8SPGNUxXE|*dIauz33PKF+}LdM3tiL^5?Zy{aR3Ze}r1MPWgb&5O_
zfG)hhgFFLSU@y(Z%td9bgh%uWV9U`Zm#qZ~0_uE#)9wuBYQNw8g4kLCS1)F1PMKU6
zmXS5%@3&Da{itRvIVzo3D~cmS3x=gvUImDn8yiFzP}3oP#j>!GE(_(1DA!{=E5T&$
zW_CB#%nE*VDO%W%@l6ZEGA6)tYEEI(>sAS8zvx3Zx6!QLb<KaWQKdsJ|I5^@_%AyA
BV1WPt
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-020.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-020.js
+   Corresponds To      7.4.3-13-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-020";
+var VERSION = "JS1_4";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("const = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "const = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..c5132ebc9a8904ccc34215cc1c5793fc3e368169
GIT binary patch
literal 9103
zc%1E7(Qea76m<&}5G#bV;@!M~R<yt?*-8)sbX5Xs0{eu})V@uoo!Dk(oHY9x`x$%z
z|F9pk`?xO%?j0w!<BSs=oQ6p4OXC^O+_~qTd+yA*rsGJ!ZmkQ<-)(u4N7}jMIF9nd
z2ppeF@HFp(a+GEodJt&k)OO6<wd~L*N`chizhkmxhF-==1e|h@2{C*Io?sIEChOr;
zeI_RxJQnHr?5WGtGh?^WXX4D5;7ae(r1V$YF^@^(Cv4cFMx`YWI=ff#cdJov@4ar;
zc1CUEzAM<*-fQnSrg~`9yT(DwHtIU|!Knw4=3y|^yJdPKT(GrEf{I0^E4%cZKO423
z5vIl7{&UB1Zc<|weMFtJLjeh_jF#za;!7ty@Ew2D7|Jwsqs369F&gROjEVoTbz`21
zP#Oz|XaPq$JmA_&jHk&9dp=T!A90Xo>Hs61UyL<wV?eS~?sE;2iI#b#aT+1Qiag#h
z-iUZ==9?)O?>~6-aQj$I8#w!)U~RKoEz19`4&^DHSAsH;y-|Pl<io?C0NpRELD!-$
zm0)`tJD$fRlI{VZ()Pi3{|u$S7?D$pt+A>b(~z#j216aCJhNDWj?^8%VX_k!*M=0g
zoU1kjNo%pzNZkgdr@gZZW8U?3@%0wA4<vHoCANZWhx=itz~#>y7Cs{{nH**eQ7&Nd
zO{gv4NIQ~ux;k%{Ci*QkwB#vEL9)CeKpk#zx-7in87W_oit9#G@-V_*Md|prO>0ZX
z=P}{f<;vBV_^yPHF>V5t8=6g*d(8SwneFLz(xSF$oTps~NYZ@^`twoWJ4(?eqLXRI
z!^zP)wK0KC1o(y(#J9Or+03Sj`GJ+o!ooZDJXtiB<O26zLGN%Pnr1bJ$G9!U;L&RI
zaCH>AYM?Q3E2-%j4)&P#x&_1kn!&*XAOhxmjF_g_I!A(aruGzDrU((erndCS8W-T&
zQxSS6#&mMFnscD~(2Ru`A(He?`1`_E4}NA5na_atmB@%KbaSFKW2aOcg$p^kkdrcU
zG5{$<c_AljC@1;QotK<cdm{dKH78>06<Af*4bK_3Z~e~uy5Z|;z%96#tOVa*v7;Hf
zXVbg7E5m`s%DIERLMG?$c`IY`8>ZBPOm53zol03M(#G-7AENGJdtI<t*|!`ei^%wr
z-waEx`6)sL*Ze<rt3Uf{{Ev03SL6<$=LN;etE5={LPmnP=l<?$8N=f$N>)8Xp=?4K
ze*IWNnb^$ErD}IM_mHid6|n|$fp-FWJI9?dK;J#SjWh#YVJR&|%vq|ogbS+`z*eG2
zuIS8EDqsa!GkU&8$IdX3j0JDc=V?WCWN5-*>B38Z(5HktQx?>c!yd}Q<-9B`=hk{X
zZtRyZW$9XWW3rZ2yyYTRxOZ_!3xj2R6PP18m3_~+w}iES?>4veq(!A`&A*P2a_Ggs
IRZcd41G|B<ivR!s
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-021.js
@@ -0,0 +1,62 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-021.js
+   Corresponds To:     7.4.3-14-n.js
+   ECMA Section:       7.4.3
+
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-021.js";
+var VERSION = "ECMA_1";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+print("This test requires option javascript.options.strict enabled");
+
+if (!options().match(/strict/))
+{
+  options('strict');
+}
+if (!options().match(/werror/))
+{
+  options('werror');
+}
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("enum = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "enum = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..e9fc39cd4537b647f3d545d0ec7b27010fad56aa
GIT binary patch
literal 6521
zc%0Q(OK;Oa5Z<(<yd;E#5LX|m5QN8(5UHf8h|~tuMCDj*>}j&?Cbrh=r1?wSk@#0|
z<bq&!oy3l_PV3YrZ7*qNc4v0J{bpt-6&ZLOs+As4r`oaw^Ca0Mg!s1W0dbfBTe2be
z#Ftb;9|qDVm9k!4iErKYeGn3yV=7vD>lPZ}aKUWK`FIa(P6aqk+DB7ED&_??^<*&n
z)}#KO_FErPK6A#IFRRL^`m2=n*HHKk1=~vKOTh-+>RtT5Rj;)hpPQBPL^jpkL0!Ai
zKBzBf)UM<DQOmUJKI-7Y22V0~u%O-6S`QCwR0;3{9#h4So`|PZDNis>kM{dBLLMq%
z9DPKc(GG_YR;rFkHgM578#u(72wf3f-Q+OprtvnS!)X`4QChmpg)6j&4tl_ygbkQ9
z660gIpy42O*eL^{O%L#<lZP?h+Z2$v$pa=qP~Or@>K7g&?5l`NIvO4<Sbh|7@#X8c
z?_Qnxiw<U=A=W0p`J()5eJC&RJQtJ|+3U5#-IF&r0Np?9LDx`Ua>4c~D)s|aB&{RB
zN;?F{`sxa2H6lkIThpqpT|;yd6AU#h<*~ym=u~wFAXIdN^xhERmI&2^psKalYlLir
zFBhXT7RF@gw<XrcC?5&r!Y7o1XuAh)HznjBB?F(4msE^nj#MsS^9`xZ;ZzdAx;>fn
zs|>w}92IOb6C}ko0j03g(`DroFG=~7R4l&w{ajD=Gd_3nYAySead2)xYx%n#a8n+k
zx#0T*6;0QgnYUz5xFds?{|@#VnVfvn=f>nO6o;kNnA{fQ8kKf0>Sa1`*BN7bLV1nT
zzz1{i+_lg3@^H4h;y|ajg(KZ&`bc-Z32ylq)G)Qao7~n_IDnC-wDOLL(wT{*W<V*%
z)(1<90NxweWNtc3$W@CmD4tK6Uf0VfeKpHdDI-5mngQn%)`Z$Qkav)*8#$2%Q-O5{
zYITA-Q-H3#zl|&dnPVr-#LHzxt$-)=8eq%NBUh~i3Ib*yLccSIx!Uh`&JbJT3H4r<
z=9I~FVJTTN`F>AT05_}{D-KGR)r$Pc(1cOpbyoqRrp6le4XEi5$5<A&l4YTo0p)fK
zX9bwd+{zxzwX&QaT#6Ldb9~RjsEFzBl8Tet<hoP9*{}M@&1^KSbKUZvYgFNotN$uB
GFa8Hk$Y4SM
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-023.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-023.js
+   Corresponds To:     7.4.3-16-n.js
+   ECMA Section:       7.4.3
+   Description:
+   The following words are used as keywords in proposed extensions and are
+   therefore reserved to allow for the possibility of future adoption of
+   those extensions.
+
+   FutureReservedWord :: one of
+   case    debugger    export      super
+   catch   default     extends     switch
+   class   do          finally     throw
+   const   enum        import      try
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "lexical-023.js";
+var VERSION = "ECMA_1";
+var TITLE   = "Future Reserved Words";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("try = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "try = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..405ba10377514254018d5654d2db55a662746c51
GIT binary patch
literal 6502
zc%0=}!EO^V5Ovy8D7_$Y;F=>9LIK2$RU}ALwNL^gt6nQ-cbb^G*_G{WlHcLT7w}hb
z;S6JMlHDZUw43fKE%cIR#-8y!znSsGQBlaD?(~5A^|mKisK_QEM0!C8#AgCL#V$b-
zsi=Yr=qpK_npy3nx4xAUgaZGBiniIhg+@3GnMXMv?Ssdu0KY{q(9|UrvjUHXDw=-l
zQMqsYHZLikI^#^Lx;Co+oSOL>3%{daTMMNUtlzEQ$N$^ShI{m><<!QqiS8ci+#~n6
zxuDUzPMTlZwp}}@gP{kZVnKgFyKS@~9@wf9AS0eqrH?)rPsOQ?G0l$l+Y>@|wJ?o7
zqRwcCLkug`$0QrL=$!R^;*W)aNUm;t7=6=t8_D5}i{B`%T;(DV#zO}^;7-E&Oj(KX
zE?#itBX!sr17S?}@uuewW4*TtAZe4wOo5=hZI(2LAtEew#1#__j}|QNCR}{};??U#
z>(kE|Xq(ewA^y2Oh!;p+2*f(E-nU<#-Ue`gtp{97Z7BrW2dMY}qd_2ixe~gGllG*D
z8*h*}w?*E-%AGo&MoSlS076AK%5DV-RCCeUK+~laTZ>RGNVOQ9wGPgQeph0Bgz|yF
z>pw&(2sbzmx)~w=s8}eBRHR~*a-`{xy*6euhciV4>-N;VUv21F;;3YkxgaU8=4(YY
zJ6%>j@scdhNX37)n^<2rMckb>d_Wlo{}yzUKkETE<IPzJzK>DS3aV4{Rn-&0z~be9
zc^BE9@P#q?GsW3xH72`a)S$}iCB4i99{3|{PbhD28cDDR&jat=ERRRIYtC<GTRg#S
zW>0W88`zdlJ%_f|cbnU~4hJyuj8;x<l+I10hjF@8I|AtW8w;82J!c8G8Yu#$)5);w
zX6a;ZW_c#%q~~cX;(Sb+SUZF99&&Y~AkJVWux?+ko@34gplk1Ukz}9>Y^1qpxvZv@
z@Pb|gY&lxws)ay9z`T!e(V4+q?+-d(5nB=p{ajY|l*x5r8CjE>0#y(fj1}jkt7=7Y
zWN5*l^s=h~(L-Z{N(*Wx#37c2t@*N0&U|t=X0sAZ=I&%W=}uO{PbJl-_?m@58MEIN
h1*fpNb+3f8U-yZd+h|tfy5m3A=(?d+|4nLE{1+Z$S*rj5
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-024.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-024
+   Corresponds To:     7.4.2-1-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-024";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var break;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var break" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..3e0e40795fa29026c3d9051cb79327fa27a2e1ca
GIT binary patch
literal 6498
zc%0=}!EO^V5Ovzpf_g#Xz%|EK2n7(Fh$2Cnib4s9UG-WyyVJzf-CfyE()<h`z!&gW
zaN!JNZ<5_4-n5(UDlPPqX2zcJJinRoq^|lAheo{z)NeSRV38u5gb?Y45fGmV@Dv+>
zBvMfY7Z4~(>NT^vp5FRKN)QVC6Dl0DbqkGfxMUvXd~^UFrvm&oy+Bg~DrN;9jZ}a7
ztw-g7@!J|uK6S>KR1IxZ|J7^eYb^YZf^997O0b~Y*unpuR?|KD)UMaYvWe~<>f9su
zxV50syG~kP9NVr3sDn!nBE`aBLA!0V5gyp85+M6LrAi-tE}lxgHpVnN+Ha2u+10`{
z`iMHC9S$+9R3DRU;G%OD_{1LzLy=tF_%QmW@ivmf85h4%TDi(aD2#^=dcd881x#6q
z@ity?<Rf+183SQV2YA!-hq2z<1dz1JW2Qh*?wBR5%LoycI^v3nhW8gN?<QP)`s~H4
zMeEbg7-*Z*Vj=#yK8P1cUI@fGvEDn+PhZ{waDS}_TuW^!1ls$k_yD6}D15mRx``8K
zQpAlnNSxauZ(`+6olm2si#Y(HqTA1I1qoDh(b+)Lr4?I?P%cQd7@f5a&WC<iVtt76
zp}^~Zhf)x3cpP>!LjF;)P#CF5#VF-S(;s_n%w`T}iU`*2sd>NJ(38Yb$tH6_QeMs1
zifVSctbF1nS)P%K|7<t0zHW-RJ8k%oG7kPN=q7*G18&Bfvk-hAp`smDr{=4wC&Hn{
z%m4B&vOVDoWAbN;v(aiycEzYkmDfvpnF&1fN7$ZF-sH3|!5%yhy>qiX9_6k%znN|E
z1h<(z!QE_NTR!z1+FIXjZtFT6z{oRN`KgW4D?I`+U8-lHcx|DQz2hulRx?GPbTS!k
z-7J~Ry)4h8oa8)h_c<R^Cf3d%ypK%XD2Oqb2do?D)pNX=0CesBE>a9sfo(JwDVJ5W
z65h{ifGtOZT(t~n2$=T~E;=)q>-}NpD`HC`p&!f2o-(;EEF)`D>94}LT&y@HT~#ZJ
zBSRa8r59Zdh#nc6R9a9oAr7!CY|WR2a;B5JF`1QMGIt-_N%~j`Ka*7V@FfewGUmQ3
h%1vQ2>wXDmzwYxkx6!P&b;p0G(N#mO{(ID{_%ASVSRw!b
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-025.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-025.js
+   Corresponds To      7.4.2-2-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-025";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var for;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var for" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..09ac17e4dffc33dcb1bb1620f159eddbf6953413
GIT binary patch
literal 6498
zc%0=}!EO^V5Ovzpf_g#Xz%|EK2n7)0!YUG^sVJ0y$g0=M*_|e)?(WKVlICal0KR~~
zf(vIDdz0)Y@utmoS81V_G&A;$=lRWyCywez9O_OFs9$e;f<=mK5<;XGMnHTfz*B4h
zl1N1rTtJ{CacX9@livD9N)QVC6Drzf>lPZ}aLGK%`RD*VP6hZadV!_}RLlxI8ma#D
zTaU^E<F`4WeCmudsp{IO{&Q;PYb^YZf^997O0b|?-@*Ue&4zpQspZthvWe~<>f9su
zxVfOwyH1*4+O}N}PzRSDM2dyMf_B?zBRsHGB|!FhN|iqPTs#%0HpVnN+Ha2u+10`{
z`iMHC9S$+9R3DRU;G%OD_{1LzLy=tF_%QmW@ivmf85h4%TDi(aD2#^=dcd881x#6q
z@ity?<Rf+183SQV2YA!-hq2z<1dz1JW2Qh*-Zo2`mk}Z?b;K1D4eu{l-c7jp^x2D7
zi`J)~G0--r#X|gZeGo5@yby?WV!dxaKYe)%!2Puza4of^5NPkC;scC^q3~rcbQ34-
zNf9^RAaQPsyn&TFbv})jF6ID)if%u<6(ms2MP~y|msV^oLb)K-VszFzI3N05iS;4M
zhXSwv9ZEsC;c?i_2>D0FLSdvL6{D0RO@HjQF`GG@DI!?6r{?`?Lr)S%C7WCclJaW4
zR#daoCHIM!WO+s^{<Gc0`noCN?zG`U$~gG9pqu<z54ag`&O-2ggo;*Jotm$zo(P8)
zFaOKC$o7OUjLDxV&PMr|?21u?DzBIHG81^{kFY(VyuoQ-f<1U1dgo?&Jjz{jely$R
z32rlcg1gzkwtVV2w6(t5+}3qCfRSgk@>3h7b3FnvU8(^LUt6eT?>I}C)kx7NolJ&X
zH%lgSFU#|2MRK0D`kap`6KiJ>-bbcx6vP<J1J(`n>N(y_0J`>m7bym+z&5%PDVJ5W
z65h{ifNg~anYRpR2$=T~E;=)q>-}NpD`HC`p&!f2o-!+4SVq>Q(qDyfxyU&sT~#ZJ
zBSQ;@r59Zdh#namR9a9oAr7!CY|WR2a;B5JF`1QMa^*g@lk~9?ekQ5z;Y${VWz2n7
hl$*k4*8LLBe%<Ho%0{!=)*b($Mpq4$|M#d_@n3ATSSbJi
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-026.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-026.js
+   Corresponds To:     7.4.2-3-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-026";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var new;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var new" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..9c8c995331c055f697efbd6e17f32e43f1e50145
GIT binary patch
literal 6498
zc%0=}!EO^V5Ovzpf_g#Xz%|EK2n7%l2Ud|FO+}#uM510RXLp*Iy4jWOO`4zK1NZ{|
z3ND;s>`k(pjW=z!yGjd{sx~wBjOY2yj3<r?0}gek57eu-UBLoHHVGlp^#dRt6W}T~
z1WBZ#3NB!vBynnHwUgZXMoJJ0yb~(gX6qIj;c&@Z%K7*JTuudeEqZ~bhE&W8TpFlw
z_Nh<hf$`fMQa*FWnN)RcRR1_N^Dz>BN5QrhN+sB!SKq<^+s#Jj=u^w7O=MHuJ=ArM
zI>*fgjox+A{L;4VdVo5(bRkg8A1r9MjW)moTU7#N$P=pM(NpnMoZ1A_>}bC|CS+F&
zljtMrjCMIhuu^?YvVn`v*}x;-MCgn7>L!QLH;uOuAI`Y=jnc|hE_`7;bkPIuBy7Nx
zl^AcM1xFrIhn+DH#`FMhI(-=Hy-fj0nmlF-1m$hBq<I-2!cs?EG12gF!SZg*#i!3+
zyjrwA`x^mmb6PCKKi3EG0?7-3SSQx|_Vd%1w*cH<>jBqNTMB{pJ}N%Ic;pLD=0Z1i
z(w-J^;|*fxw#XY;xfAEpXz5}OK&a@2*{vXkDixg#G+kP;wFuP#sTQNN*1>e>cO}+`
zC?5&D{&y$^(eaP{UPj12Di#VO6{#2}9BKMvuZ`Hu;Y<<1dVQ7ls|`Jg9hGcyB}mGv
z`C3uUPM6##UXtY*srb)!6YJ}yh`ZB<4=Ll|-GXlNXFcF%yg3WO_Yo>uesyNPs`|no
zS-ku&?;_h1zAz?#rZ^krV{%7~8&tXdxR;s0eQ%8I3FQq=Lkafax$mBv<<Tg2&H2r2
zizc|u><R8>1KaYc=g`*rZgX4L;Q&US(aKM4l+N`C#B{0R?`sQ{>>Xzbvl<EdB$LT-
z>t@Mh?qzu%tw_$(R>=8;GLd!;;eBN4MnR0hJYc<nUY+926rgMG?;yoM71%~sBIUA*
zR>J#v4X~}yAoG?14FPjM!bNuubG_g1eno6aAoOEd*;8hv3(LrwMEWZ~Di=AYq^oL0
zab#%0sPv+%0nsC4gGvi(Cd46@g{^d1C}%pk8<SZHCRgrbJ8>T?;cJrW9=>E@RL0zQ
iMY$<#X5BC0?ALwXu52``ZQb!NYIN05`M-~v7ykuzqgW^a
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-027.js
@@ -0,0 +1,61 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-027.js
+   Corresponds To:     7.4.2-4-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   var
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-027";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var var;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var var" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..d91134fcfa1b6a7bee9cf62746b741527e9a8ba2
GIT binary patch
literal 6518
zc%0=}O>Yx15Ovy8K)vvB;F=>9LIK19i4Y0WAPOZ^B<i(tcBhG{ySuWzO>^V-aOA|l
zf(vIDdz0*D<4wEiuF^s;X=dyh&-0rZPwFZRI5g@5pl+k%2o@-^P6&~X9{_Qg07tP?
zkVGn~-~>D+Nxf!P*OOacO9?`Odq73UY~4U39L|_SIUntS!>ItbO;6C&DHXE<hXyK~
zej8A^WBj&GDW5vyOsa-9s{iUW^EDEFL&2sNN+p=rZ`{QHJFRAS_fxxG8_OoT8>s8<
zcK2Fy8oleF^|@o)bsKeX=0KpB@6Bm9jW)moTU7#N$P=pM(NpnM>a{VZ+0lM~K**LB
zCecUK8SQb1V5Rz)WDOS`GtVXNSm=xR>c)rBH;uOuAI`Y=jnc|_E_`7;^w0zDB+O&V
zN{lzrf?XG>!;TmTW7@-;P9Mg4ZxcY0Cij>EL3zh4X`Ka#u+$M(Of)>4v%D2^@$r*q
zFXpXJKO>-RPK$;3=jtGyBY7bZ>%@BBd3yN#3V{1-HQ-umOCiwSLd6Fd4SnItrO=I?
zbS6dIc!SuvE%GK-?!@^tTDq765Gwj%b}NXXN=0V_O_x?|Ekbocs`==wbub<Jb&2&3
z%7+54{~by}bp1WQpAqtpiiN^RMJh%KN1FcFYa=#uI8sEg{y?SuYD14=M<tug1xa}|
zUn{EF>9X{R7i4)xD*m(G#QM4^;_kHJx0G>kuRu5Xvl?(S-kgQtdmj~TzdAKvRRiG<
zEnfbYcaiN0Ul^13Db7aAF}W*7O{$zh+{;YhzB|J9gz_e*p#*#I+;@)6@@SO1;QVH`
zMHAe5_5^pifo<{Bvu|sCSGle0Z~!CEXywdC>D)xR7o|(p@$q0@2(Od~;iZLC_TICA
zW6cDSl4)gFcDb}NH?%mTa?<p$9dbS<Po$l}dK)>rRuFeEBUs<lt5Xb`0CeH~T_hW*
z0vl>BdM>JMCA_3p09%e$xoknu5HRN>ob+Ze*Zck67sQqXLO+|8J!NuTSVq<)ra|RL
zg=5Ki>AYG|92wd$EWP|{K=km~q|$<#3GpkIg^hGsC}&Q&9y3}ACUbYRyS9#2!cQmF
qhxodMVHvaFIfbXNId;2*vtRVdo7-qs1H0xw-st+Fmj8`vR{R&q{9vH~
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-028.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-028.js
+   Corresponds To:     7.4.2-5-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-028";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var continue=true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var continue=true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..300d5631d584f1a3dba1c85ecba46f38c43f0867
GIT binary patch
literal 6522
zc%0=}!EO^V5Ovy8K)oP=#5G4MgaU{QB1EET5QP#@v+A{ScBhG{ySuWzO>^aQ_yELT
z!G$x7y-9YHc++OPtF+Kdni+e>^ZaJUle&sR4vl&rsMqMYf`y8#6GEgLgg`tdz*X!F
zB$0|LI0auxQm>iS_4L*^Qi4$69a7OTTQ|@MhjZpq&WF3;aw@=U(^E8cM#Z$irJ;%@
z-}+SU8o#YG$|ue^ld7SO>c4u;e2s<QP_U_mQVHhw8n^NPPOItceQMWhBiUGY3w6$(
zv)`K2=v{}cgN|+2UDUz33!!3xKd0R^+7J(HRSA$0PpQ&JpNXeZuZ=Lxj`sUQLbkLp
zjXt8zXqQ6_E7iv&Yq;oy`5y5`!ayWfH#&^IX}pc(aK^=NlvXZs5eVa<iym+%VLnq<
zV(i2V_B^BxJ7yq^X&-NT_Au6a8v~Lyxz7{`$~$IB>pVn+rH;5_qT$h;<*kH^Po6%1
zId6UP83S!|S}eprR|oMN$qRv4C)WGUv!fT+0Nh`z0oPJn3W4?xDn7t)5C~7^LN{^J
z85eQm4HD<J$eUQXQ|HrY>0%B*sOUx6tssGFCOR8vy0l_z5y}Cn=A*OL!P(GnO04%#
zJ`i~Q?@$WD3HF0tM#w)Z778O3sTiglY5HTYjoHlMSP{W`eKqS>8+x2LD%s>xkd#;R
zwW6AxF1b&<Aj>mS@t^G`*4IrDcc%@%rHq4j4Z6vn)qtDv<}3u?`>1FK)rtA4>Wg4t
z@$$dCi)>H$!kGM-;%t<U$&MH{sdD>CFEfD$-Voap%A1@<670eAz&$a`<5BLC^PAZg
zPjKtm6WrAXw#8G=fvxpj=eDlH0gODOm7mxsy)=;?#OYE!j(pdo?CYu$5xla{%HDkz
zu&kM)QaZ5=&#snO=8hKU)RII!YDb)p=o4$F(B4MYt`)={%n8=>_39Z8jRCs!eh29W
zs=$`I6hRkNw-VmcD}Zf@W|_AnXb7155l*{PnCtyP_X}c6LZKhd%APVyU06oeq~<{t
z#HAzW#B@=uD2@zm7?fUsH6VI?Y*J}K&4l<B%fiNNStw^xxfxSh2_|zrLoGe6gr85U
qkMM;HgEHp93rbI6v+Q;WXTR*TcWI+pE$oK>fTJsj%KtmnwD>R86k##|
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-029.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-029.js
+   Corresponds To:     7.4.2-6.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-029";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var function = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var function = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..384181f46c7fadd2ef1c580162ae02d142f88fa7
GIT binary patch
literal 6518
zc%0=}O>@&Q5LMbzV0z)>z%@rY43jc&BV-2BFceDYkW8-~#oi{Os_l{Frn&KZICA1&
z!G$xd<Ro?+IjvKB(n2q3cBNhI)7xEb>M9I4H0lGOZlmJ}7AUe#2$7B-0CAZBN3k=I
zL@KJ_6g(wKy=GR|lUrX)2||H;NJYnN-9RH8&Y43wAMJv}sQ|Z4PtnvF6|(||1}dC>
z8&J7x{I<?0pE~1As)jbI|LQgKH4=V9!KM~UC79Q5+{XVqt!8)cQ@dUp%O<*8sO#=^
z_gixsz3Z^`xntXP7j<y%K%kiK&1pA{Hoya0RRUzl6RPCVQ}I;lwK1mI(SCnK$d(o+
z(MQx7?Qw`;rTUm;4Hum-&n50y=!^L3#)r{2jkggW&bauE(#l0Hd|^EF&;#xy%wx(*
zj5pDOJr}9Nju{AJ+QXYpAI5rb6F`zC_n87gdB-eiod<}p)Dc%qG(4QMycKit>CW?=
zdF#{92xyzrVj=#yI*8{;UI@fGvEFx{9lf{);Qm?-xR%;d2())l@c~9dU$}B9bYmx-
zNf9^RAa-txyor@NaXyWfF6ID)ihh{g3Sy{I(b+)Lr4?I?P+gE}K00e1Oox6`V!em*
zp}^~Zhf)w-f8XzCg#4pop)gXBic!Lmra$)Dh|L_16%njIP-(x~(399v$tH6_QeMs1
zifVScEPdhyS)P%K|7<t0zHW-RJ8k$aWgOgV&`tiV2HcD{XCe4LL`B=LPR&=<K=?z8
zm;dEmWP8FF#^eKvv(a))?ut>9DrXS)G84G(j<7wUyvb=O!5%#KofES>8s#oIznN{(
z1h<|&!Ch@&TRim~*jnFpZtFT6z{oRNIkQnZH<2Dh=~5Mdz<bqKRV6}rX(5%p_blL8
zGeM+eS{asIEv?KAEzYQ%G(BpEoR7&9X=kwBM$WDk#2w5C*7x-46oV!JU3z~P$p)&x
zhMJ3>i)vd5FX<J)mZMcJTM#q^%=rkXy&25)e!uqxu_b}f&t_#$nOql^ku`~FQ29~e
zSaM#vs8$q5hBgdKFTWZPJv=t4w4i1}{EB5^BV88CnNx1Yj8=ll+#T({t)rFj(@FI)
pzHVVy#w>V2;VEp6-7ewmmwoc)Hk#GIZupNkx_+qTf1{ce{{@!^UyuL*
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-030.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-030.js
+   Corresponds To:     7.4.2-7-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-030";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var return = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var return = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..3111f5c60cdb95e7925dcac21629ce5b9d6af7d2
GIT binary patch
literal 6504
zc%0=}&2AGh5O&&9etJRTz%@rIghB;3R*@hLB2WS%t6nQ-cbb^GyDQsCn)l(v6Yy4W
z;S6JMlHF{)X_M|ME%cIR#-8zf{$|D#M-3tlb*B&1uXjAbB1N_dA<_#YAU+e|DK-R2
zq@oJWAyASyHM81DZ+$H#2nGHz6&<s62aRyJU>@asd<Y(=0{k{TM^i&8<^>*&)L{0l
zPvxQU+Z<9pbH<reb!}AtIW_Y&7Jf&;t`<rqSkSBA#s53ahTHnoc4`yZRCfn;Zp%Gt
zE@<?w<K~x+ZP$I&!G#BrVqvhL-8I?>4{TKlkOQ7lrH`J8r{dHmnC3_O?J*&HT9`&3
zQD?NvA%>OeW0EagbjAXo_!D6$lB=5>M&C5vMshgg;x|ewm$?Xq@z6yNxRbDeDJwDF
z#0y$JQiq)~5XN+XH=R9<_1>m{q)i?%1%mR9S<<|S5Mik!u9#@}V8QZU!o_FLUmPr2
zpMAza+ng2)@z2dcyg>3oAl8ZXzH@N$@&<tWYct?lYD*!|-b2L)7>`2X%eBx=oOGr|
z+<1e;xh?VrR_@gKG+Mft0}v{DgZx&IK$VHk2AVFd*jj{gL8`^*taUIO`fZ8zA<9Pr
zum2rNLAc>j*vkp|N5w*6q#_mLlp{@l?6onQIh-mYSg)_Lezl>eiKCKDt^`SWHD4>L
z`RTIuiI-$~PAdMh-NgF3DdO(5;kT4=@NYmj`Lh{tbKabV;QI&_?XWsCUsZh(jx1jO
zmv@ov311kKKU18I)?>0O#to{xe$vZK;GsXp_Jr~VrvnN0;CbksndR{)cg6Y5Y>Owj
z?fePudIQ_?si$RYeK)zS>u>-g&uQgd8>QD8VK7~)0ucD%m4!|Arn7`xjTD2@`DEyI
zy?ioPvpkhn<mX9y!1;tVv33sReI)BvL8QS{V7)-E&QNCx(3SVQ$TCm`cG8u2xvZ#_
z@Pys~Y%BE0bt{2}fO#L`ygP@v-XC_qBDN$F`n{~|DYMdr<z!823{+uUG1eTEE~^#A
zk)aKv((A4UL{E(kDlMp)5XV>+cCuxmoB`!_3}+>nT)CA!m}_Mv{8&<bg6~-vl`;KY
iQgI5KT=z>j`&A#gD;v%0T(|t^8eKTl`oBuei~j;^ky_>e
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-031.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-031.js
+   Corresponds To:     7.4.2-8-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-031";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var return;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var return" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..541dd234d1bb12012be732eb272992529e686b7e
GIT binary patch
literal 6510
zc%0=}&2AGh5O&&9Kotmy1J@j>5DI@cLL^9oD1?AW)NAGJP7_micV&B<M&gNh0^SNP
zoMG%uvYU-J?WVg*3%#V7v1dG=znSr*uEKyrqdo-cHoA^rfg+oP5b5{<5SIyX6gve;
zq@oH=z*CacYi4ylx%IV_AQZR<RCLYOEi}U6j5(C^@g6vw3UE901Wlb%F)wgvpu*X=
zA(eZ^Z|juunKRC$YG|YSuU<1>BjI-xY-^!Zf_a0+P5i&xYWDU&b?UW=Y^u9~y54@T
z-CEG-T?ef%UE8kPsDm>H0>yl9LA!0V0Up?@5+FmKP$iF^il<VqO)y;&?E^w~v@nT2
zqRwcaLj)_;$0QrL=$LsfaVJ7w#8)>tjJ|2SjrefJ#cz~W&U4`l<Dripa3^6NQ&wWU
zi5Bd;NF8>>Kp4{=-gNpf)_a=*k~G<73Iyd{v!rzvAi`2dTrtt`aKZ9U%*Dq~o<Cc(
zKKqP-wmB^p;-Bk-c!A`FK&%t%efR0%iz@)`ul0aysV#*-dkYmGU_A1LD_24{cG8^|
zapMhQ=eEe3Sh*AD(`e~p4nU|FgxReihAI`E4K!U^v9$=*1F06Hv(~|M=+`CIdng|X
zy#9A61<~`{{vadd9~BFQk&0A|6OJ_fvDZdy=5VBlV1uDb`_+aX#g0lgnG2HgYQ9!f
zv(she6EDf~j8yz*yNUI6Q^ehA!*40$;9h}l@@GBZX1qBI!S_BYI(~I#zN&`8A6dNo
zFYhAT6TUDef2KGat;Xb@7&obMhH)=5f&1<l+Y`#0oQ4wY!E@g^Hp`<??t=51*%nQ3
zo7ofG<p#FpQ%~F0`mS<Y*Wmz0p3%y|M(Nx{x{C@II4G#Tswxq}OADdweP;>3nh6pm
zQ_3*xaw%nQXL&Z|r08KM<a|P$NIQq~F7kDwAl_g$uz{ynr`R(E=)(JZNHkCdHq%_x
zTvpdgctx)Pwj6D8)ncF_V9rN4>Ca)V_xt^?h%E_(eljb2%H+DRjI2pag36DI#)`Aj
zd9|WAGIU^6dg;}G=)ti`r3Ez;;x{Y{Tj{b;&Wv(B=Ccw^=I&;9(%r0tpG>L`@l^|>
lGG@SYicVqk>uw2Wzvxppx6!QTb<KaY(X~UZ{@c{N_%B6_TuJ}{
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-032.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-032.js
+   Corresponds To:     7.4.2-9-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-032";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("delete = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "delete = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..1e53b98b996eb9ab1aa219d44b54c7e280e6a840
GIT binary patch
literal 6502
zc%0=}&2AGh5O&(~Q+h$-z%@rIgaRrzmPn8WwNL_Lqh2d#cbb^G*_G{WlGowL6Yy4W
z;S6JMlHDZUw43fKE%cIR#-8zf{$|D#M@1ory3+&d*IiGrP?1eSi1dOGh|dIgid}#t
zQc(rx&{vW;HM81DZ+#;r2nGHz6|UL3g+@3GnMXMv?Ssdu0KY}g(bNSMvjUHXDw=-l
zQMqsYHZLfjI^#^Lx;Co+oSOL>3%{e_t`<rqSif7phyT0HM*Hwn%c+fJ6WtxuwGZ1z
z%>|9#b=>^o+IDTD4u&3tiUs`z?Ome{@xWG<02%R=Dt+|1cq&e9jA?eX-yRdPqlIbo
z5p_m89Aa3hJ|@|~MQ5z<6MrlWL~?cG!|0pF+ei*)T>M69<uVt6FdjPS0e2GCXUa;9
zxAB5QAF0Dm83<##k2gJk80)=F07;uXVhRN1u36F?hKR7#5m!t!JX)~4lW_6b^S!-A
z>(kE|Xq(ewA^y2Oh!;p+2*f(E-n%bOUfuw3f2{{xOKm9x+WV;Z0HZ-5e7O?3i4%8H
z#EmydoZBLAVC7DoPot%aIRK%e8)dhG1gg2{Y@q4VimgScHb}J?owW|mhkjdPeTedb
z!0SIiDTsD(6m&B}{!y_|7^z6bDCJ1gAA4=gW)7!{2-fYXdB57w)5KB9CUZejUd`8v
zYIeG;eBvcpo{@_GY&WsKZi=`&ZTKB!9Q+&5P5!J0+>AG8A^1K*MJuRI%~w@V1Otng
z|K(j|d%_pS<j)jmqt%$)7NZ7LUN7loCh))?VS7S(gVRWYJ$N2?XJ&ak%3X1OGuz?`
zZZms=yWYUIeCj!{wZ5C&)^#|5k!Q4WYNK>+B0WF_JFUL1DiOge3z_UaX9>3&DFUU_
z$*}8s>11wZc_!tg=SeH#d`y~HJA?5qa&@C1&R{06ZeOpSW6lJiEAMY3$v_p@NORG0
zSxqb91-%B?a<s@*3xS4!c^~1tGlRL_A9TJVwj>n#xvcCdlk37VvL-bJsvs^HE6z!m
z)r#WC(1JnfWmf~DhsFk#7Sv3LLo5qh^JSr&`Q&!YW+j-+-O0AoovehPN~%xrH4B3>
kX1_}cPGNKFZV6|<>JvA&(X7UG%YUrVbwjQGo7AlMFGf9B=Kufz
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-033.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-033.js
+   Corresponds To:     7.4.2-10.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-033";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("if = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "if = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..f68307b303cf039073456c0af5c3b64ecc12cadc
GIT binary patch
literal 6505
zc%0=}!EVz)5Z$z;fO<jVz%@rIgaU%2i3A~tKnVz2y;d80nk?PM*6zA#_#ZBO0e=M-
z&M>=9VkcRrjcY3{^pa*~cV_49o0*+BDvmfbodM9G>H302ifj`?q#s5=0w%y$><lE4
ziYhpTp_0UDnAJ{p>q{v?C<qRzaLv{oG{WJW`IPhVYw$T05OnD&nmVImUf|P6#j|e%
zDqkDF?K8?}&N!2*sg3GCr(wP(!tW^9)k3KR8}^&G@qf47@;V>8PGcgQ>TaRV>v#w4
zC5_&7*#7L=cHKoCocj<d77mxRyG9$~fvqY5GUgdo_UH@o)SSiy)BI?^Js@OH3$y4W
z>Wua{B(PF_OtOWGPS`LY!9*B}^y(&u(Kn5^ksi*t_>I!qMJ_^NJoL~5?j&r;l$98-
zk_DXrsl$#L2xEGPH@$cm>%C0@$(lT13Iye@S<*g_5Mik!u9;|fykvPV<>KQf&z>(^
zpM54k+nkmQ@z2dcyhQR+Al8ZX&V71x9l-sy8E`GNr4(rIpyEA@N1+I0A#_tG?zD&-
zZ;(2-Mc%^7ojIRIOBZthLPbB$Zv`n-3(?s?)1?(#i%=d&wH%$b4lag%Q)0b`@{z#n
ze~VHOUU(4pb3*=6vrrhRNX0ngNYfvCZNg>_$BGEnAE-sY+R&raQN<?Lf~2~duNC$D
zbSZq|6<MB>ivMgkvA%A~xI1n54P_jHYtT*pYzEw%H)kpM-bY0@tk2BX)j)(Ji<kf9
zU1WR0m&W8z6lbGiO!maMMU_8DdzlG5493`=P~PG+mS7K_hyICKo{VyroZrm0WP;ny
zpWv=Gu&thYI=0q#o!hz&2Qc!SR^GEwy3h!t229pp)Rl<A!X|suSwXH=hC$hUGW5Dy
zKAEdool0x+^QaqhK4DFwodbCv$+}e%X)qO7f2db4P-hCzrT2TtGEgOU(zSTGs;E`)
zgx&ybYxKyXl|Vzl{10&2o5Ni14|`t_TM`NVURL&$S?j`bvL-VIsxYY-1qY>zYDIZu
z=)$P-x~l=vQ)7!t3u-3BuUHm#7Ry341Io=9&MGijek;53uO;<|_@ISR731FpC8xB}
db-#kMU-p%|w$Z%Sb;EzJ(Un6L|5<8Y{1^0DT8RJv
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-034.js
@@ -0,0 +1,58 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          7.4.2-11-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-034";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("this = true");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "this = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..43c26eaedfb06fa6edd10903547d67804fd7f790
GIT binary patch
literal 6501
zc%0=}!E)0u5LMbz==8!22d+8NVVJ-GH&13DO`%W%gFU?##oi{Os_l`KCixt$d;xz2
z7tXMflh{e*v`Otr3%#V-m3FmHZ+EqER4?XGce+4>y6X!TE3!!lk$w~d377z1u?vty
zDyrZdLM4e)Gpn8K)>l%3P!Jqb;hL>mXoSOn`IPhFKKPsp2wL<UO<hniE%0fqdXsNm
zD))`w<^|;wXPik@*GBc9Q!`%^;dc~lYoSzvg`N6c{NHUhyu*(zr#6y}b$3wb9ePL2
zIgQ?R-2Cj?cI}`J20p}!Md6%w+h}7vuvH~M_IO5>J^D;M6{j}BG(XyJ4++`T!YulT
zI-_k439M8flWgFkGZqFU7zrbhUft+0`lj(V(!&`SzfoGb%ta)Ohc<e^orHx<S&8vF
zS#TI2b=WBbVN8d3)3b-M-rE?EtjQy$Kv3?QCCx#M2umGt#YDq<bC!2gE<Sns{N=p$
z$!7wz&1ta^|6Cu$b0jYWVx3s;+-D~*ZUDHy)&s7kwiE*GJyg7hVLuXqTnXLOi90Uh
z#v7#0ZIL&ya%aw`(bB~nfKbut<+p+qs+s6)py|?ztwksgq?(V;S_fxCzb&!eM|of1
z^}j_a2roK{IyoW#s8}eBRHR~<air;wy*6Pphf_ra>vYwuUv21d>ZoLsOF>dz&DV-*
ze!8rD;ssfrlZyXrH?h8Minu#%_<%AF!42ppf7SzT&YQCkd>^2q6;&tZtEwxazQxP`
z@-DJH;R|E(CyKMtYE1UTutAmIO?#OMJPL-`o>1Q4v?swHJdgY{vpgB)t~kG$ZOH_;
znLoi@Z(v(I^}MmQzMI_EbvS^L=d|)KHcBr|q@5&Ps{JmOMGKegEoT9>8X5j%v&oR_
zdf8+yW^p1d$<C8jkMj{{673Ykdq~xdf+&NDz&fE`Jwu!^Kv&-HA;&-!*hiOQ<)V^S
z!UK8@ur1LcSFHmY0_J~!^Y#?xdVkdZirA7^=-0Bcr_53pmXkG^Ay7q0y;yNfx~x_d
zM}`*kORu^b5Ir+CsI;JFLL6XO*qSX1<%}n{V>BzlWYLZ6+P{=kAK_yb`elrMmlT}B
e#@4+O&VJPw?$So{8rLoVtwz@kwfav|)8fCieOZ<O
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-035.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-035.js
+   Correpsonds To:     7.4.2-12-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-035";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var while");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var while" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..a9f43d7599fe9962804fb8435bd9ff569baba19f
GIT binary patch
literal 6506
zc%0=}!EO^V5Ovy8K;?kMfoqOb2n7V<!V-z5L9~>BNYrcP>`oI?cXwrbn}!eKz!&gW
zaN!JNZ<5_4-n7~7DlPQVcE+CZJinRotfQikL*3~E_3CX`uuze8LWp#O5QxVFxQd;D
zBvMfYr{F6|oSIqfq_@725`+Tpkczh1x`9SGoHLhlKHLSDQvqI!o}#HUDy9W44OKMx
zuTSN!@!LG3eBz8Vsp{IO{&8yN-&pt^1)EwZm0*6aejER8HyfS3k1eM*l8tq@P}kY(
z95m-Nde>p|bKAD-F6!Xig;24;pVMv{ZHNc9sszZ0r&Q^q&%{%4Y9mauqy6@fkS#4t
zqmQUF+T{?#O7$_x8ZJ6vzDK-~Fc8VrjSi!48gC;xoN@6RrIm|Z1j2aeq6gebn9r1z
z7(4NTJrAkFju{AJ+Q*xoJ&g6<#(<<v9xw%h^0ryhJP#3JsUxnKXm~Vdc`M=Klc&#L
z&Rd`Sj)As0Ef(URtAlus<b^=26KlWy?C8Zc0Qc8wz_rwtLZH2aiuW)a1j3WK&`q4Q
z$3@(DgT%Ql@&;D!)cG`8x|jnHDtb|ND@dT4iOvR^F0I&FgzA7)^U+!B;B4qOCD!{W
z9|*kucPItX2@Zl@M#w)Z778O3sTiglY5HTYjoHlMSP{W`eKqS>8+x2LD%s>xkd#;R
zwW6AxF1b&<Aj>mS@t^G`*4IrDcc%@%rHq4j4Z6vn)qtDv<}3u?2dHQT)rtA4>Wg4t
z@$$dCi)>H$!kGMt;%t<U$sI9lQ04ZMUS<LhydkzHls7nyB-n%JfqP<>$D`aO=Qp!0
zp5WHAC%CH(Y>TI!eOv3h&TU<X0~mQmD|c;_UYbbvv=c6&`nsw_1g|V~vUi;Y>}sSa
zlujtaud5}Lxtqngv?M`~S`p_X+Qix^l(&(sYXz|ebAk1Iy?TZ_V}LHbzk@UbRbVS!
zikOS4S_yCH6~MMclgwKRGz8530H@t4%=P}D`vtKjq0kRzWlx!<E-WK!QgfgR;*ybb
zQo5*C6i0>@3`#G&8W24;HmJ0qW<vamWnp8sER-{$+>Gh01e3Ww$EA8%37<=<kMKnc
mgEHp73rbF5v+H&VXTR(-cWI+pt?Pz=u+f!6<^L`<E&dDkgj%cs
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-036.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-036.js
+   Corresponds To:     7.4.2-13-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-036";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("else = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "else = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..20b586007d831be4a43c8aa60036eea7ce0669db
GIT binary patch
literal 6496
zc%0=}!EO^V5Ovx@LA@Yx;F=>9LIK19iB%*>gD8}MNYo>hvpY>p-QAV#ZJK}K3-|*5
z3ND;s>`k(pjW=z!yGjeaq?xg2JkM`tJaJSMa%eh3pkA}<3KlA|NeGc{5CZX-09Uay
zkVGn~;1ql%iPJEvo%GgMQi4$69a7OXTer{%hjZpq&c}P;aw@><&{H&ZM#a3qrJ;&u
z--cA~8Ncl_%4g0vld7qW>OZGpzQ)4uD7dYKQVHe{n%nq)x83UPf9yDoiEOI7g}UB;
z@1VV)(Yp@YpS!kQcTorDE`*8&{(|<l(S~?nt4e^3cuJK%dM2Kl)0kkIAMLjXgzRWx
z8hu2a(LRS5R;rIlHgM4i^F88Cgn>w|ZgLoX(|8-n;f#ylD6L)OA`r$yA3fks!hEKz
z#CRPq*!Pe+?3jTtrhUBW>|w0;HU%VY@_;E2ly}XN_IZd1OC52|M8l&6%R31dA3u5a
zV$u5SGX~n`v|NaPt`Fh`l9vLpPONv`r$^7P0l2@`1FogElmhJ?RJ@1rC=i}3gl^)b
zJ1yeI8zjzck+-mNr_QI*(#0HrP%((|TR{R<COR8vy0l_z5vm7LEk<XpgW1q;O04%#
zJ`#BSZ&3=O7aRnGoRELiEEGm6QZY_B()7n(8?%|iu_A&EhAQh<8+w#Ds@UX8kW^Rm
zwW6M%E`?9LB+GMB@t^G`*4IrLcc%@%p^Srf4Z6vn^?;l6<}3x@`>5yy^_ls)8j4_K
z@$$dCi)>H$(wO{-;%rom$vrV{QRNPkUS<LhyfL;Xl(#sIB-n%JfqP<>$D`aO=Qp!0
zp5Qj~C%CH(Y|E#fwypJD=eDlH0gODSm4C5OdSxPQ$LUgM{!0s!><woLv05qiq;tto
z>uR}Vu4Q=|t;o%zPQ>|yF|l?I;9Vr@MoEOhG++Z?ug=hB3ectZ_mE+rO6;O5adKHf
ztKj*(2G~~Uk43A1hJd*r;Iu!7x!xc2zaq9I6#A{K>?yO-h2>;TY6Mh4TrCO?Nf*_M
z^2pGEQROvP1EMF!7L^v%Oo$Pdg{^E^sAf318G~5`CJViX;x<;nk0kYn_>P596;s~@
h)uyzGb+>}EU-ogkveCS*b;EzA(M3ZQ|21k}{1+YKS3Up$
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-037.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-037.js
+   Corresponds To:     7.4.2-14-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-028";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var in;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var in" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..0d0efc7a967913508273e37a8d28cab564781887
GIT binary patch
literal 6510
zc%0=}QE$^Q5O%jQKobaw2VVQggit~7fJCVTT@iy)5Uut)xyh|H^ODGR)>Yyc@eBA@
z@WL~kowi9+r(3#2-C!?W@9aC@=kM-(t*bEL(5MfAx{a<QSfI!zAw)WU0K{bi9K}vS
z5~-+y6Y!KI^_p2-Pi}oJB?txX0To@dbqkGfIAadwe7pw^rvls#Jwa2aRLlz;8mMsg
zZAj&w@!LA3eCCWZsT$g-{;Su_*GTvs1>0IEm0;eWaTEXVwwk^DPn~*gBAe=Npsu&y
zYqu6Ode=egOV_sRHtOKafj}|eThMMBZGZ>1sszZ8CsfI!r{by9YZFYDMEih{9W6|v
zkEk=+=Mce4^)bl?E;?qOOWcXj7xC3i4x?`xZzDdOaq%0amGfNq!g%PT2i!@R$CQ;A
zZ=wbJE>edbF%ZVIhc}%*jP>58fFw<}nF2w1*DPtB1&FZJ5m!t!JY2B66LazLlV>j$
zt<OFqplwczh4|<CAYLGOArR}tdf$C|`1}fh`)fVmT53xn(B4AD2N;ih;mVcJjh%F-
zMcjCU*tsq8CRXmm`7~O(m;(?h24Qw9h@nbFX9G=_R%|Uo^+2k{=&W@x9r|^N^&ZMc
z0<ZraN<sAewm--S`A5Y<VWc7z<Aftkf9$mpn>idQBG_Q4(tfp}N3o-lP3D56yqd2S
z)$DXx`NT`IJR=qV*=}Ne-4t<m+VES-IJj4!oBUZ1xEXKGLh!whijH5MnXjs$@JALe
z|I53`_Jl8t$)73CMyoNoC&o>xoMGI{OyIsd#`c8rCa0kUd+^+Mj?MCDl)K>kX0}BW
z+-CL!ce#OW`P9?4wZ5y|)^#|5k!Q4Wuu(cUk?x{GjRWwHs;{a_gz(ZrD0|;o!mnn6
zM9Gvg47*%PncG>OO*tug*a<nG5GT^k;k=7{-6)7Rm<?>;>D4LrOaZ#^{vHwyRDsPj
z7d4mFwGv*@Yk)0Bn_RURXb70|5l;GZnCtz1|0`lk0->MG%APX0E-WK!5|g0vqoT3m
ztaM(jD2@yr7?oanH6VI$Y*J}K&4l<3%feQ=ER-{&T#xyz1e3YD*`0JZE8!=T>O*|h
n!l;ZH@SLJk*!;R%!r3qS)Xi-)t9f1XA8mB)P^<qoH81`PmI_>$
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-038.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-038.js
+   Corresponds To:     7.4.2-15-n.js
+   ECMA Section:       7.4.2
+
+   Description:
+   The following tokens are ECMAScript keywords and may not be used as
+   identifiers in ECMAScript programs.
+
+   Syntax
+
+   Keyword :: one of
+   break          for         new         var
+   continue       function    return      void
+   delete         if          this        while
+   else           in          typeof      with
+
+   This test verifies that the keyword cannot be used as an identifier.
+   Functioinal tests of the keyword may be found in the section corresponding
+   to the function of the keyword.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+*/
+var SECTION = "lexical-038";
+var VERSION = "JS1_4";
+var TITLE   = "Keywords";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("typeof = true;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "typeof = true" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..9bd2dce5ded69d8f4193bc8825f8b239fb80a55b
GIT binary patch
literal 6503
zc%0=}!EO^V5Ovy8TJ?g&foqPf5K0kT5K$yZ0~D2j$g0=k>`oI?H@mXEP4hk6_yYcl
z1L6#0Z<5_?ylFSxRa)pJ&5S+cd44nFNnM2jheo{*)N6EH!2(6r2_e$;10Ws~;3{?j
zl1N1roWnp#Qm>iS_2kx9Qi4$69aGUUTQ|@MhfC&C&PNB}aw@=U({nU+LB*`VrGW~k
z-}+P@7{9Fx%BRjald7SO>c4u;e2s+PQLw3nQVBNbHSXj8omSI1{MfG7#<Gd-9_pM!
z=cqNO(YuaYpF6f)+o*#}7Xron!JKx}XahX3RV6@%JfTV+Jrz%-UK?YY9qqSAgzRWx
z5`9FS(JqGwR;rIl)^O1o8+gPU3w;q^-S{y2rtvo7!x<O9QChjmg)fYUE_%S7gbkRo
z661BW;Lt<ruu}%Ym>%Fwrw?Pjw+SFglSfQ}puA(2v@QcgSn7x?CK?{jS>B1c_+<at
zi+StQ&j@In(_$h1xjKmFNL~oUI<ek&o}N6v1>pW#4Y-!tQW$$<_i`zKV?Uiq9XAdk
z_HPTmiN!l{L=Bj(=KzF?UYOkt;^U?QwBe?!D|Q#59FS^0I%_FRhkjRLeSq?zKnA=+
zDG0|u@_QK}|EO44jBKQ0lyIao0NZUuXbz`}2-fSXv|nxLaqOsMler)%uk33@H9K9F
zKJkJ?&q&38wxL)bI7Qr@HvEP%4&E(jD1TN1ZpO2-5PTn^qU~3w=BuhN{Gr9m|ME1l
zz2XaF@+XSp(Q-_7#HdM?+mCyh3EcNa*q%_{<TR9E51#w(nOPo9bJrZ<%(iHVThAWi
zZZ@+m9(>-~THkGM>pC33$TM2`7aOH>6KOk2m+C(4x-TtUvbUTC)M_U9lguVVuA60(
zxtPU?l#`t&?U3^^XCmzk#Cu59wSp*viNJaTy*fpl2|(B0?;yuO71&2}v2syKE8zjX
z0@!kN$Ytw*hJd*r;JiD7x!&)0zaq9I5c;*O>?xD$!ZNaE{Cx|x%8%;Bl4H_UwW2sO
zv|(6!)zyILnXyTw1vL}m5X-_wx-674p4^SmtOS#}8`)N(krn*d(x$7s_?CrX8I#`?
h^`@|?b+3f8U-yBV+h|tby5m39=(3@f|3zw6{1<V}S#tmY
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-039.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-039
+   Corresponds To:     7.5-2-n.js
+   ECMA Section:       7.5 Identifiers
+   Description:        Identifiers are of unlimited length
+   - can contain letters, a decimal digit, _, or $
+   - the first character cannot be a decimal digit
+   - identifiers are case sensitive
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "lexical-039";
+var VERSION = "JS1_4";
+var TITLE   = "Identifiers";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var 0abc;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var 0abc" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..b8f80c31ae8a3ef65f8eac18f97708c0a7ccdcd8
GIT binary patch
literal 6503
zc%0=}!EO^V5Ovy8TJ?g&foqOb2&I*JBZ>rR3PmL#67^b~-DzU#?yhWa(|iv%zJR~t
zfH=e0n`Ac|Z`w_Fl@@wQGh@$qp5M%PQdeQXp-~?IbsHT=ut1S@LWp$y0Eo*3IEr0?
zBvMfYm*6Q$>NT^vp4|FcN)QU%Qz|-U>joO(aLpXb`REWFP6fDadWoj4sF)QvG*IF6
z+knbL<F|E1`P3O_QZ=+u{a3G<uaWRO3O2P+D#5&d<1zl<X*IjYAKUfXST@l;LS6T`
zd(xWI=v}9+&mG&YZPdZF1A$_`H>ce++5iu1RSA$GPpFbdPsLNI*T$G;NBiv=Av;=_
zL?2OSw8tTWmFi=XHC%MTJeRm*p)caA8y`mBG~PyhIOF0sN-H<H@P+ZvLl3x<FpnuK
zG2TQAj$Nb<J7*w_X%BBYeHiP#O#n%nJYfn1<sGx6bsZqWQb$}d(eQB2@=nafmwN|$
z^VX-I5zscL#X|gZbr8>yyby?WV!iL|pB>x-aDS}^TuW^!jJ>gYxfH;$pU$L?8;214
zw*}wC;+;66229s;076AS%<cy9aZ>@>aMRTlyNgg=kZL|UYbi{J{!n6lg7Tq22E0Ql
zh^~L)_cKENQL(TX*+|7G;Yeoyw%dr%9L^OHtUpj`zuM4?*ip$Qb3syG+1H9{cDgKm
z;suGGk&6FpL$N+^inu#%_=qwN?mcKIe^vu-#<Q~!e4nDC?N_Jft7;(pp~cJp@-(u&
z;tON)CyL|Ia!l@uQIjfX5ce_@xbKdzJ)ykGX(+)SJolXovpkySZaKo4ZP5_7o;}3f
zZDw0M_`J2XzWdzPbvS^LXSDJ!HcICv(sq<C)qUD?URk(gZ#fI7)lBdwnN5aVcgrSo
zF^dx^Cp*vDA?IVxMA{jMcaf@V1yKeQf%QGTIz^lbK)2rCMUH_gu#e_q<)V^S!UK8*
zu;u8G%hmx60dqdUWp4&^z2EPBMQlkR^lMq!QzqAiWn|6x`xa`IAJvN`$E2HTMR8<k
z!?5(Ks{zq7W0Oh?Y9_=XmW7RUStw^bc^IQv2_|zlvaLiTEBLXcO;?}eTNZ|8Onx`i
go5H5n-4f1z+XrrLqgj3Hf&Wya%Z6J17pYnCU&_8&Z2$lO
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-040.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-040.js
+   Corresponds To:     7.5-2.js
+   ECMA Section:       7.5 Identifiers
+   Description:        Identifiers are of unlimited length
+   - can contain letters, a decimal digit, _, or $
+   - the first character cannot be a decimal digit
+   - identifiers are case sensitive
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "lexical-040";
+var VERSION = "JS1_4";
+var TITLE   = "Identifiers";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var 1abc;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var 1abc" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..bedcb79ebbd84f7c3c084714a22e082a5c3be7b0
GIT binary patch
literal 7419
zc%1E6QE$^Q5O%jQHX$S=9(m~_6G8<Ei3h5Rk##U>D~MKm9d2@K&AcYE-F5v-`~v<J
zNQh@RJ8hGuPPcRkUB&j&<<7qIeg5vwc2)HQ4z+3*s8?&cf(44K6GEix2S7X~z*X!5
zB$0|LIES8+q*^hftMRG3Qi4$69aGUXQ#a5EhfC&C&WC&8aw@=U&~r3(LB+JdrGe^C
zzPeQI8Nc-l$|ue^ld7hT>c48me1^hrDA?3OsRZkFYWMN~X5DEWd~8%JBiUGY4|T1B
z)?s}{qh}r0KR0c&wowO{E(D7Cy&3JM(FV9+t4e_E^O!2W^h7+RYGs6JdbF>f5b{t9
z<LD#mjJ7$1uu{EDvWA1sSkEKgNa%}b>qd*wJB_;$EzY?3jndLpE_`7;w9y03B&^4j
zl^E~B0S6vZhn+GI#&i#NI=L9@zKsEin>=I+1m#ULq<$G7!cs?EGSTq<jO7Or7oWd)
z^>Wtw<TnJ`<}_c3e=ZN=8ItD$v1WSRIodtB4e0(_4!V}&k{f*^_i`bCBR|b?AvX>o
z@^1^?!Rj4bq6SPCbO1s{r=Q*qqU9z6wBe@9E4CM*S|HVIbk<s!41HB%eT4FXKn8q3
zDTtPT=yy^={$8@M7}-e0Fy=^S0QTFE&>T(`5v<cyNx$0Av&d1wCNn`&T;11-a(cQf
zyy7{Do|1~IM$@~Lyi3XdFeURnhWuF0F~oZ5$m@)^PZ<aA7M$_^EC<|_t6(npK1M~u
zFHg*uRaf`}i<f^6_7a(#yjkbQ<WE$}1)1CuLx(E28}%|1xbF?IJ)zv;v@gLPJonu*
zGdz4@x#qKqnHD~*tdrD-m7Bez%zun{Z)<(GxvlGP03%On<zH-+&P=53FkQ-TY1@5c
z;gY@O%%PSO<4-)B47qNWO=e@}CsIaso;3QLk2n)*ry$-zs;=ck8B7G$>FLo4;*0^h
z_WTxd3{;MNG!rZ5m9zp5&`W?VLx)_n4rmCNdj#k0Da`eJzx@@lC4tbVWo1v9OdFPx
zHKXq>)G9x$7YkmKuBsLJk)Z*D!mF+ZMBf=5DlMp)5C>QmHj-tbnCr=ET+IqFnYoc|
y#Tr@8hb?Wo{1nf!Feu{YcSXI)?bf<ez}l~Sz|Cwlt#7UPQ;jYgYVjATY4KmM<cIA5
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-041.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-041.js
+   Corresponds To:     7.5-8-n.js
+   ECMA Section:       7.5 Identifiers
+   Description:        Identifiers are of unlimited length
+   - can contain letters, a decimal digit, _, or $
+   - the first character cannot be a decimal digit
+   - identifiers are case sensitive
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "lexical-041";
+var VERSION = "ECMA_1";
+var TITLE   = "Identifiers";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var @abc;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var @abc" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..e46f91b7f9f6cf7dcb61e08f797a323adaded74c
GIT binary patch
literal 7416
zc%1E6!EO^V5Ovzpf)ElCM=m*1ArxAAV-*R~R1}qfNYrcP>`oI?H@mW(r1>SjfWP8^
zIK$YRWH%dc+D&(r2AWHf8GFX_{AR|sqxu1ds?!DPRhzD0fg+oP5b62>5RVCP6&rvg
zQc(q$&{L8)6*Jn2PkkpP2nF6L6-_gB3ypBNVlL%;bO<h|0=x#jL{kGQW(6({RDb%f
zOXZ>QTOUw9b;g-gRc%y%oQnAy3csUZTMMNUtk<dT;O}O=);j*&a4KWjME3x7t>e~7
zeNLlioz}lLZL=Ps4z64X6!Uv?+HIo^aKToU0NLj;Reb4*cuG!XjA?qb2hRz4qJ?qv
z5p_n}970&BUMAVVK^Ls&5pOK?MYMI}#ps>J-G~-vT>M69={gs_Fdo|I0cR4{W6Da5
z_u+tJ52?e>83<##hdZ5IjCJ28fW%FnFa?70rWsPd3J_tbBQBX}cz@3F<A{r|ULWkw
zTc3W1K--+=3-Qm@K|DwDTp-qo^|85kc5ny4{k0l!Ewv>#_D1gIQUFJOnv*(i975#Z
z7JLnhcWj9oFkR092o;@vdN+ucn+VW`o35_dU4&|ZRP)hUOJOqfb&2&U%7+3O@ByVD
zTK<XONeTH!$--h}BNd~VBb@=*ZbL$II9EilPFE%UYC|t0M+KYA1W9paUn|P#>9X{S
z7bJR0Dy|z%?^E(VCI7>e{3p(M);mWYd#4Q_QO3c$182NHs{uFVCYTGp&rs3u%Tx1Z
z)fN8G;^lw2t=KNsxiR?*m2ycYx5TJMmD`PanF-wYM%bQEUgNYc!5%#K-3v23d|<iZ
ztBRQxzN>7K)OVHJJ)<msi#W2izPsGkbvS^Lr?m1j8>KT7>0y{I<-PqkZ!J`^cbo;x
zs>SFNPbR~y+a;6Pm&JLMk(_6ZKIdb~gxVQ|caf<ZIWY$FfOUF$bb>b%fNng$g%kso
zV;jvx%0(5efb;VTV9U@Tmn{Pt0_J{#%k~WBdcNQOhS-uo=)<zIr%a{|OUas8`YS&y
z7farfuB#RKk)Z*@!i%m3L|++eR9a9oAr7!CY$eM=F}IWTxS17TGIJl>iTYU1M=i~W
r@(Vo4!mx;Y-!<hXw>#@@0c*eM@iw#3w6?Y84>h`KsO8_IX2pL20QiOf
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-042.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-042.js
+   Corresponds To:     7.5-9-n.js
+   ECMA Section:       7.5 Identifiers
+   Description:        Identifiers are of unlimited length
+   - can contain letters, a decimal digit, _, or $
+   - the first character cannot be a decimal digit
+   - identifiers are case sensitive
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "lexical-042";
+var VERSION = "JS1_4";
+var TITLE   = "Identifiers";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("var 123;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "var 123" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..c7d0d42ce21668eeb88270b6353ecc6acf424ab5
GIT binary patch
literal 7830
zc%0=}&2AGh5Z==ATR;e|9ISF_RiU<0B_v2Al{AQ=5)g@ct(@IyV(P9}UZ-h<cnKZ`
z@dP{uuYfpkhOsxzZW3?Wq`OLgdP&z~&v-tMznO7CwE_;sLKCQ0th$l~%9(W>Cv-&s
zj>japiXB1dgo-LS1Yd<tVa3cYB$sZ6AxH(@E|pcYbPknpIA$*8yt4%^rxLshJw#PU
zRQ3<JG*GSHSCfWY#%}qD@}4oyLRHjC^<QDdd`5#map1Nd43%Vlqp1I{mP@tm50%17
zckD!V6J@pS+D>^$qF3#fKUHn3w9FMPUx6Hw-9;H3yAUWQ{2}QrBMs0Qt4KoF;t5gG
ztpQ(W3M*Z_(~<c8)N$tZVDe<}L>R4eh#;qWo6ZfKbijPi@w$UT#>d*-jE(|4sd#h7
z#9thpIn9KS#zGw};7W)2Oj(2Gbu?ky!?0re45U%*V-yT-#(JhFfFxD!Fgzs6t7c01
zI6#C$?eUE9hPQ?^&&P54e0BZBu=d_>1hma)wh;fG9>hZzAQOo7rF&Oh+grZ?;QpBo
zxE9{Y1X|5L`$7^fL=a8{Z)~M{!tll%#MW)Dmyp&I8`N-VrU!7SY_!tzM2yvddp6Xx
zcbIpiszIoRy|WVGpzD{#*GD+smU#YeaTH`t?1)B+%Rgo;F^sWDWhY@s$3G_GD4aR$
zD@U?MQw`eHik4$TIjbBClKe<t3rPBPnRv$|u6fE;yt3)UTHa)Fc3SZp$~brzAf5c1
z4!9{rXD0YQK|w{3o_eC1QnW2ru1jHLtKl<?<c|~^r^zC@COajn+-981jN`)VV0yyw
z5~r;Y?9OxH9+>G-pLfRQ&Mb@CyV>;i?tI<c=(cAQF}sm(hx2QC<@ZpJIU>v|Sa?Y0
zj*2s<2j$f$2X$xwdYDocJ)FC=Wzn@&IW}iL?lwG&q<dM&23ftAF)=@g?;<H|kTr|`
zOzhl`?JO^orM%4O+xR6f<qN$!k1TJHg_ndhgd$21=KByerVFp~^z7>h<tfGX2>vT2
zGG~(EO<Fx4!y6hM9jRmH<-JOa^Df0l(mq05nzba$2?-uc0M_vJ>;alT0qD%@YnTy0
zW!OQCl|x1qb2&U6OaZnrdV@)`wuXSY@8PiChq+!a>You?Cy+WXDEpNe>%dZOP51i_
zN|lHRW5Nfb)3_qLV5mSl_Zmq9qF>8OG_;^*T>OT#FgHjG`8>>Ajw0kD)HTm^KgE0?
zbqVw!ByFae%qNuSVkeHPj0+tdEo2cJd}!zK9Civ7W%iV}l*8W7+VzjEG%clF^7m`a
LC~ER&`u^enH>3_X
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-047.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-047.js
+   Corresponds To:     7.8.1-7-n.js
+   ECMA Section:       7.8.1
+   Description:
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+
+var SECTION = "lexical-047";
+var VERSION = "JS1_4";
+var TITLE   = "for loops";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var counter = 0;
+  eval("for ( counter = 0\n"
+       + "counter <= 1\n"
+       + "counter++ )\n"
+       + "{\n"
+       + "result += \":  got to inner loop\";\n"
+       + "}\n");
+
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "line breaks within a for expression" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..06f27524def3dfd54a209cba477aeac1ea29ff2d
GIT binary patch
literal 6992
zc%0o>&2AGh5Z==Ae?f5KX2GSULTx1u2+~Rrf+#8hk*L?o*_|e)&U$5gn^wF9FTpGD
z1Uv)>UV#&57<-fKCh?{u-BoCNN!PO;d%pSRZ!0>EIP6q9K!crzFIl9$WzX}JFCy>)
zCc)S27?h_p)zF1dE3dL)->zi0zEBFJhG3t{hTXb?N;sS_pK^Zs3Vco_1a;a)RmW70
zF8DOk@$jib)hl~$?U?f6VVo(wW0ab|%7%SR7Qf@db+f3nWMO;9{NJcmo4fDpm5u(|
zKz0>n&E4i+Z9-yp?bkjwT)T|S7jdXTPRMSe3{HHAG!x;3^qQ4MXpB=NLB%{H%9=H1
z>r!Q-k9R&2(S6UmZ5FehL60!n;*da2%{9F%_|g#z125<=3YogKe;LC9^i+B|d&F;C
zT{`OsA?*n*JOOulEM(eAnwQB7y8+UQ9Wszsb%-n&zl_tT13<DW_ZT{f@`in-b`l}N
z%2>Q)t>N*6=G!SxA8$T+I;nm5n*i-Pv{;CLEe_&|04M}v6LfDITL(}6190yyEd*Rg
z-YEpyM@DZ4$j6w2BI1y|h_&b<NIq#mm-&K=knDygH;<&J8Sqc9(HN8fdml)z=fb9n
zc|T);!PAri0FTOcoL@*%Fvsk7!D^B(7AC2ip!B45&P+LO`bDwz4zBkk666i8f^3RC
z(atgXn~UT~Rw_?32bloDN}ceX!=d&hYj^bcxkk}?dQizKXM&`>s$c{pKV0U%@svD}
z6N;C%-Z=Z8B7A2Qzov{s@E_EhKZ^l3rz<T4-+L&i3o=wsbVrKbe8uI`FnPSmFO10_
zC{9-MF}W#Et5o})w3b=JMR1Dc3D>Kf#tPiVbKxJ^*ONi;AE!UNEt&t8^XI?wjeFDQ
zq91tYE9H(rKNr`ZPYj_`XjaF@Lo$CF&%7a&m!lmt)Bv<Fr!D&Ga@@>8`2huoLXuU|
z_XgP}o6m0z9xB^pYw)nXPS(ihTS=88>)YhPGtw5Cuu!o8h|$7@h#sst!rR>iOmR##
z6Vh4g*?2!6^{juVlWxX@aZryr?{hDaj(BQq*%8HaG7obTYlr6TG5!qz`se*kq$=nF
zTbr54J*~==Fw-mmwi%k1dDDr3fcfvB+Zw^#>=&(1h^-e%Gr(wf$js!hoT%wP-$1Dr
zN!ponay=_o6i0?S^h!_O1`spGSE+KKW=;HpX<=nNEtE4cUW{qE1eG(_!-uBPV<C{1
z1bU=MkLeBz3AN=d<yFD0v0)2Y#mNJDWz6Ykq@u#UF}Ny!nT6t9O7lwE1^=*SGK!x6
I`{C&FUx=^zS^xk5
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-048.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-048.js
+   Corresponds To:     7.8.1-1.js
+   ECMA Section:       7.8.1 Rules of Automatic Semicolon Insertion
+   Description:
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+
+var SECTION = "lexical-048";
+var VERSION = "JS1_4";
+var TITLE   = "The Rules of Automatic Semicolon Insertion";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var counter = 0;
+  eval( "for ( counter = 0;\ncounter <= 1\ncounter++ ) {\nresult += \": got inside for loop\")");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "line breaks within a for expression" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..5386ff5c440b032324ecdef41445d1ae3c541fee
GIT binary patch
literal 7865
zc%0=}!EO^t5S@^~!h#Tj>mFL+l5B(m5*HRH5*VWm%6bvDxT5w<#qLdedeq$$CtB@K
z?APoU@DE)0g*|bGsvgHPwr8B!%*aW|#hI?|s;<}7ud2Fc<4D48tp_~VZTVV6)?4*F
z&-f|=FAy4hD~`Z;#&QdN2(9sI+irF(yYz)Ipe+RNxo)|oYp6uRvGBQ+C$GSlTtm?0
zeN=VC_4t6#BO8ytdfdEnb{j`rj*LlR>@F##zuLC@Oa?#Vz)v)2tQKK+m;P@x>g~Nh
zo3-uX*s1I~%G!JF{l=7pR=sb$YvrvXnXlr|f}WDyLKz(U5LuzZDd`O-jnJ7~kp>gX
zj412Ygs&^L?IGU9NPPOm^KR2%_GIux1n)>lAm_AA?;1`z6k*^6!$GCfV;ydWq5w}S
z-JCP=1xHuTGNH7y&_N5h(i5Suxk2+XnXngNScwAx+NlmP3MMy`d#0y=WL549JR~k#
zZc5`gLWB)@yyCo(@s#G<X`DWK{Pfwh_R((wbe_?2A^v}P5KmozQXr;F_onsa!_x}@
z?){aefSbcRr9k^D>Foh~7fUcq9k3U%Rec1>XD#RpUr80Ry^y$hjGpGeKix*_GzGZ*
zK)Ss=Z0gAS84n0gN(BHO*WI`{k)&Ww_@4(WkuN4DZQEe%w0F5oIqCXk@%0{#4>ShI
z?>Gv&t@c&7z~%q)f*gaD>ywNjx*(XTlX#bKU_C9mJv(Wa6m6x3DpolcB-LdF60qXy
zvha>)@Ib*;yt4TwxBe;P>`3uzE+hmOAm4ml4!8wXX({+VKtWTnk$Pr(S`8LUE>|X!
zCyV^jBKa-H&T6qpZtIgew|+0pWzKOGoM3vw@w()(fqdts@(<ngq!B!4_ve-+{oiVF
z|Mz|E-t4}pj+kAmwgvjUy!w2q37rvUO)NaL@Mp!DH-hqNl!Fu+fF2f<MfcV&ZCUig
zs+^lM@1x*AX|}<Jmxb-H$3K@$%y-kf$Z9+6$@3for5L)C8rs@on^l>i>-cw7${&sj
zJ+`&O)_-GNWtj+#2!PQ^Nu{Fo$`B;i{+Xe?pxmCpfb~r7%yPU-tl!7+j!0+6>YSPR
zLo=3gNb-qvj1o6jbJFF46puxK=!P_Vg6K~HI`{fE<^-@M_7HPrky+(j1&;?yfNhTM
zV9~ry5D5Pd=y%32r}e7y7h>y0nlgjUzcO<jSi!9se&0l?RS97%_(XITSCkhFO&C;O
zB@rO>URLKO2Q}y7zeo#fleAFH)6C^4LoPyPLwQt+5Lib8KQwG0Y)^!YyCj;%Rmr6e
sMGM=&79R#xJcyk^MWsFFZC0@N^Y;C7D=kWCm;42r7{xCBP(MEW4dCh;oB#j-
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-049.js
@@ -0,0 +1,49 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-049
+   Corresponds To:     7.8.1-1.js
+   ECMA Section:       7.8.1 Rules of Automatic Semicolon Insertioin
+   Description:
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+var SECTION = "lexical-049";
+var VERSION = "JS1_4";
+var TITLE   = "The Rules of Automatic Semicolon Insertion";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var counter = 0;
+  eval("for ( counter = 0\n"
+       + "counter <= 1;\n"
+       + "counter++ )\n"
+       + "{\n"
+       + "result += \": got inside for loop\";\n"
+       + "}\n");
+
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "line breaks within a for expression" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..799465247d2d6dfb1bff596ea11cd7e80d84b610
GIT binary patch
literal 6534
zc%0o>&2G~`5O&(~r(QrDxcW$iP+ER&QKXUv2r2>LsMoTwr^(Wd*IKWeM2HvS2{`jY
zoH)bmI!zpBoz|(XwCyF$%<k;Wx8Ka{q$Z<)LA}-o;?*5j&_G(7mSu%555V%M09Vp8
z2(3^O2?OwDXw|BEbuGDdKMX-g@Q#RZ^wupj!eB&Q!r1r#Tt)<VZ8AVpXGF{kToTA=
z`mImG1AT7ujIilpjE1tVjH<s{Rez0zKT&X32}3EU->cul|D9%|)B4n|RVT7@-5u0*
zTAjn@f=2B+YJPD{yB?qpMlJ-Ba(_X4S8D@w*r*Z^Ml7L9x}J)sQmald&5ri>6U*9G
z!X)~LIwf5OF|0(nX>H)5Q|fz`HxY6%ySj-p>Zb8FX3ps&{-U&U(Ggte6S{Z;?zE^+
zrI8qK;sq@asY6dF2yNQOn@&4pyti{ek|qzS1VNaimo!HKA{?rSD>@n$Em+>3aq;=?
z>)l1`)6W=a)1k#e{AYa-FOa+th*e^JaQ2R0T?23*Rn`Kop|%tP?G7rMBQih}q0LY1
z{YdfwV&vKm45-T)_wAOi%I{ot$^rk(3+KGbYj<Ggoe7!-mi9yd3Qkq+0W2bVQFgDG
zVVMfwgsQ5&*n5QRKqwcZGZxBp=r<+ShbSKk<i~rIg6Qx=-pdI2mx<%ZRU*cTgH(QC
zGmh!b;6z%2_WCk?t}^s&c2LPCb3syGQ&0*!J6%@xcu5(^NX1**Zj8^LBJNHZeoH6=
z?;5n5f9nA^<55}&zK>DS=JwRQE&GBGS8Fb}hRNwSeql`hOmKKwjmaG`ZV>7AXT3}Z
z&b=|VCzLlBi9#?3&$xT4m&dc-B?mmcEgtbUvq!wEO?1o0qIag&cb(h13I{Oqj8^{D
zMCsf_Qsv;gy=T9$f7mY#Tr#(uCDdvp_>;^gO|GkDlfIbciIkI_$L)x*31?#M9K<_F
z)s2EEgNZ<UzFM6k&N)Dr-rqrvfh@3(=3?ctl2*b4dJVAU=#Z<{0R;hdKf<6phq>C%
zyWbF7D-i0nEX^sC>%ua!X7c?$Y9){B#foFnMYW<hGPGe>dev2csF|@rLIY|##1WQ-
zt#nx^XFRzXqge?ii*96BvaL8_KgGu^49gh(E+{yKjjcN+_<q?JZf>Jljq8U0R-@{M
KT>U4hdGUYTFk)5!
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-050.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-050.js
+   Corresponds to:     7.8.2-1-n.js
+   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
+   Description:        compare some specific examples of the automatic
+   insertion rules in the EMCA specification.
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+
+var SECTION = "lexical-050";
+var VERSION = "JS1_4";
+var TITLE   = "Examples of Automatic Semicolon Insertion";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("{ 1 2 } 3");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "{ 1 2 } 3" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..3c6258bcb13de30c0711ffdedfccf6f6b572cd3a
GIT binary patch
literal 6571
zc%0o>&2AGh5Z<)qw-*oxu2xU23JR6rLPMmI1`$*OB2llEvpY@PI_s6!X%eoy4Nt%u
zapc4q#@_sFHr}*JH%i-H(w$k)cs_qK<Jp4h1RRQm7ErHPb0rIuv+g)f=!yUwk4bP9
zyMWLM6;;p%UxiK~Z{9A%mmY*6NCn<8l{K?;1C4O#F_&`QKLnRk30{@9(bNT%lLD6p
zsxx|O(eTjtEniSRa>iMxirT3DE9A{%B>ahj`&t+($^2&V0sdbrm+F--)k1zC8|v<%
zu3o7hm8Ud%)p7Y-&9>?h>Y(RBpqTKdwD*lRzzthf62cCTsp4Bt#FH!J2biWu`}?`$
zY-(W~eMFtn28Re%s<-K^;Y;Vt_Z)8^6mooYgU#rZ#?u&Y&bauC(%fY(gft!+=mA$c
z%xB6<jQ7zC6%VPyP8mpJ+Q*YlZpM0ULqOstkC*~UdCk01?gfZ&s3XpqXn1GJ^5&R}
zFJHaco3=jsjexc}%@*Q6tAluo<e5OM6YEoL@8tCj0QYHbCE!|WOD53nprYKPZ8Q-Q
zaY_z4O0*Fpm(-xmT)~A;D!wki6V+)B_{Y1b4XeD_4vcqagQkR~Jr;n5Q&)QchstIr
zy;qE}OoVSkRo7nZJyO*nRMXK}3uQ9&+Y;*&ly@ca<0DEz*2R%%riA><#&P5-mHn6_
zogdhYBf4`qRgPrMmP-27hIYq}mTYn^NS4<Ww1T9k%fdUJQ3g^{@y@mz>-8s#v(tt@
zP{zT#0qy4BYQRmolxBkOGgMRs8JQ=lB}I3!=5lA4oV?>_#^kRQho{AuT$lY4Rc>qC
z%S_<H>tlODd5P0b2=?H)aL>)_(X4mH0naRpM!fa(5$}2v-R!aG%+~sDa$DEo07jnD
z%754>JvWhFpyE_WvQ76%<M9rO>Mq%RN4DOQrcgu)!h9bj;X(vk`xd&{yV4Bym0}c&
zC!FEm^%BmU-RxYOlfWm{4(9_}McRo|*g-b0WyC7X71s3i+X-$B0lM<~I?@nShOKrk
z;?AmiOSogN0Jb@r=%S@UL%`h6&~8j%uGfpk8Di@MQeUW*J!R%Pu#~JBJU>LO5>ZK6
zaFV*LR%AzpDs-1#m^C1JtSr&cf|?2OJC=owWLa3w1amv4w<VZd=zCtQ*JXSq)2txd
nc;kicGUmfeN=|08tp%2)HiT;#O>14Z{DY3J9BT3JR+HlYs%vjB
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-051.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-051.js
+   Corresponds to:     7.8.2-3-n.js
+   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
+   Description:        compare some specific examples of the automatic
+   insertion rules in the EMCA specification.
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+
+var SECTION = "lexical-051";
+var VERSION = "JS1_4";
+var TITLE   = "Examples of Automatic Semicolon Insertion";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("for (a; b\n) result += \": got to inner loop\";")
+    } catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "for (a; b\n)" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..5a12cee7826091e8b88790b92daeacc2ec1927ab
GIT binary patch
literal 7848
zc%0o?PjAym6nDGqvdiv)6(?34EOFTip)QEMMU_ejP*k#rL|oC-eobaO@mMqCw)qBo
z=gaT~IPg`tAP$___s03-IO8M^w$iqjI`d}U%=^9HygzosB(Z?KMju$X*9jDljrW7+
zc{-3Wcp+C17=8-c(}o!sKxDMn*tN48*`@nhgEA1lVX9-7UPC1U&UwIu7(RhOFa=?o
z4N%o7Q?mmBi%l~5)o1#N-M4kh#AGwUwb>)3^w-$6KhwdFIB=Z?wNX6k?cKoVm&2z?
zgeR9#V|O$>7Sq&DtJyvHr#&b85oO(j?qSQh>P_o)$F=Ggl)-rbv2(wltTaY@oFWA}
z5gAd|vYfeFjolIC#bA86<9WZ)VAeV46wZzWq^L7GrnilgPIwf0;b>5*sb@!rAtIo&
zriZgze8thNWm`yPcR0cwaHYp1Zk)V%oK83hky-qhgR-h4Btrf$PQQ%-$*Mf$1{4z=
zJEe6VBf^?2-m=z+WKQ$1Q>xzo>+gs2+9&^0pk13*3-Ra8K|DwDN+70-^`i6O?V}3-
z?(bV00oM^*DuH$f1+8;7Ko#1T$Nqj|<Nz@W{0<CwAcc(lgNUN@Omr#%|MV1{aT2h{
zf$8a7&@?gfXAB@XDH#BGO!boDR5HafXTA$nioKYcl<9&t^VT^7W#075V(U#DKU2t$
z=Qs+gD-UI_z~uKXjw4r@8fG@4`+>PSrMrM*<0;<joBY0{=-zarnpKv9q`ss;0>AjW
ztbO7IVW8kDUfFcxEPtx-9VvdwxPb5iq?>P>0k@zitpwj&C}>N6qTV-sCC}DNE?0)h
z`5M16Cck3XTdl|Bt{OI(3HsAqW(}9&5YrQmHw8;HxQ!PwII+{yR&YuG_qLq~G0L*3
zbS58tarxyU=h~tsvQ%NQz%$JZ{8=(u-+Uh#Erg4CSgmt+@Gfpw<lKD}^&*;`bMY9U
zmDhKX4PYuvL#6n$C?eEQe{KM_5(#GA8%q%I;3W)>W-zDq^5|d0){7Mto5p=*N;$0H
z){K7tj8Y@hxV>&LSX|vzNQO3?)gB)S5Nf%aOgm7sCjN(E;aWZ{)KlGGj?ShAm8A=c
z+aosMv#-D;D)K2p(Cbz)thjg~j`)9KZ3t&|bW%$KP-R`<P7P;YwO}l*v?!5X@>d@e
zM@%(uc*Zqdw&9>a!}Y!%MgjhR2GQtF#yDXB$eHw;1{G)NlRcxA>Y0))7wyJhMPAM7
zp?g13UGfvi-Ek$otWaI$JA&)18~B3rN6sdC*56^u>b3H+GJl3RQVp1xxKdlHV?aR)
zAbrhZJ69{G7xDEm(TuiS{86qL<#*eTGQHaN`;)89tH1ru^QEfJJ57*R?wvWY1JLM#
TVA^##v2-o%@W*OhvU~V{vj7g*
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-052.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-052.js
+   Corresponds to:     7.8.2-4-n.js
+   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
+   Description:        compare some specific examples of the automatic
+   insertion rules in the EMCA specification.
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+
+var SECTION = "lexical-052";
+var VERSION = "JS1_4";
+var TITLE   = "Examples of Automatic Semicolon Insertion";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  MyFunction();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "calling return indirectly" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function MyFunction() {
+  var s = "return";
+  eval(s);
+}
new file mode 100644
index 0000000000000000000000000000000000000000..cd5471ced36b28732c7f6dee7fe8a34e0713755d
GIT binary patch
literal 7162
zc%0o>&2AGh5Z<(<{PY6i1ShMfRuw9!zyXCwZ5l*T35Z0!R?hA;F?H6F*J+YBKs*Y(
z0B^;KGmO3Y*=)RNHr<f6y)-*xk3FBq-^@6#+AR)+d;_RgsJN1~l(XtMPT-0bI3APW
zDs};Z6DX>n3BC%P{H__Dk51hW0+0&46Dlia>KYp1&}A;=ymtsLrxLs}ZKA0QD#ryb
zZK?L~t3iW9vu^2v^5J5f1*)Kp>c9N1`3!|WP_V9rfs)Lx7w+QkN~u^q`c%&E_GJUz
z9n@8is>h`Xjh=N<`ckpYx{o^Oy3kTg_!HW7qix}atttsYn@3d9t;hVy<#+p-CVTt(
zspD*DVHABtozWVH5LT+U>8#+ObLM-F*B1&oI=cR5^hx7sj5cSM_=D2iWlIQYR;b|$
zIMZQ1Q`W#Z2nQT_7&`2Xfi$LlJn8smtmifWBx>@QDUg&`%#c#Ig$M`Q<DBt^w<j!b
zjAHTG^H+P5)`$N?plyq03-RyeK|B%UnLw;B)`!ZA)0fu(+()^kfNSBFOrYIHMX5`h
zXd)oujO@3SXd*@~sX&vtf(xG<`I>&m*eM14qg_-6EN`|0qutq{DI&E;9MEuTwg+&i
zthbYM#R$uo`!-ZH_hRmmstSRc^v+6@ao2B(uMbh)kr*HEQ3|pujzvAe<zKcK$5^GZ
z7g<Q(4@|~kxN|sDj%4+Qim$5;?Ti*$u*p=AEG{W%1xdaxbMJTx4J2H}TbpjI<xdu8
zrwzZOjDvR#(#_xHfSXX1W`gfyRFnl7nkT9uMQ6U`a%&<vUgKvL$)71UPxD1`RrZQh
zxs6dSGmZ<dhv^CBMNZoR*q!IXJvYO{UT?+*&rAzjyw&6u?`j?0^tR|HuDco!fjQGU
zdd2F#9vw^WgV>pQeiiEgP&0&*meZM{=s*Y#)SnhcxyfM3uI5=1IJK<6aTW>Ae<=v{
zMF8|Ep$PnLBg51bw1*0IMz$y^klOYG-~o^@Ym=R~Wb+NF3q=%W1Faac#HNL>>}Aaq
z`YJ{^DjHaZz^=yF<_M=pQc4CqEw?%E^HQiCJB)4Qq?MaXOS9H$sp5B9+Pocvm7)rp
zmoYR1%>4+>+8E|~zNmdgY@L?W9htIUnN$asaBKSC_fV@u$SiZV;+JtncEM1F&cgXw
z1ESw0iZrmGW?cM+w6GSZg~hbMH>3SufXUP;?@2!z@HeJ9tW<rX8A6w+yq9r>uVaL4
pVFLx7MLaiLLO_{4m259y@3VGQsf{KjvK#(BsCh)q{|q`V{s)zcJA?oL
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-053.js
@@ -0,0 +1,45 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-053.js
+   Corresponds to:     7.8.2-7-n.js
+   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
+   Description:        compare some specific examples of the automatic
+   insertion rules in the EMCA specification.
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+
+var SECTION = "lexical-053";
+var VERSION = "JS1_4";
+var TITLE   = "Examples of Automatic Semicolon Insertion";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  a = true
+    b = false
+
+    eval('if (a > b)\nelse result += ": got to else statement"');
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "calling return indirectly" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..c21e2932951817b28601b96d6c786822a2cfbdee
GIT binary patch
literal 7726
zc%0o>&2rN)5O(Mfg<fD7ZXA4UhG7CTa0`Kwh9OJ|49WD`QS5D^R<S*@+$49Nh9}^C
zcmTL?hLxNj$C1<g*rZ7>sduGa?Wa$>S`|g$F(?(=K<rZ8;?xtyj$s(S<$7S)l!GPc
zHTZ@vh=2|_!Z(TqHM$s`dhGka1=weV*VWWrG{T@qEy7s;1T024*fr8YQ`dw~3M}G@
zVD!}{{)zHixh8Dnj8R{dq*3`-EU3>=_#FlNQs@g#omS~C{$H<@8`aOXVqqW~>h@6A
zs5VY3QyMwztn#(4n{^L$(6hi3)ODt``%3HKg0(6Re!wEC=+a~H<cfs>rpeJ>J~50#
zDU70zs8iBp5W-62GL1Vp=!!bFVGo2ZA8*}YF><GIH^z%oF8-i2casa3D-TWdfHMv1
zP@yHpyKq3&M(WTD3S60XaHr#o(eB$2kf_O1Du5GKS3@d24-xid#5olW3#Kd|j=A{k
z`Ky=H)<?e~&^o8-Li}re5Koaj6^P}*`dEK)ejC7jm|F|Dn%t5Kw0TridZdFUeAB%!
zj|1U$5F^X1Lx)-}a~-ql$n-mrofd$9yo&lT%d6$Ucy&5x%9z?C0Z2Gywg)f>Zw1M<
zVvJ=hd>yJX_hRkgq5-~`j!v5><DqX#tPfD$<;af@C<WedPu*5R$Uk%(N3Igyk2sR&
z1B-D;cLo>2;I!2ialg{g)3KwBO)dmUc11xd%;e*;^onPsfrO*DwdF>8{Yhi*q~Z63
zGO%w!x%s;ua1$=2so?tv6*bo!nKwn7yWQoA%hoVCe#cLZ$zKRIPs=g6!TV(*toFE;
zslZ*kkL3yFWkv!Y^uaUNx>Cc#UT@9@PfZJ3yq)A0Z?%qYc3bolGwfcR0!x;4jEc4#
zIXYI{huoQaegp3TAm*Twl#{twRKt4(r`9YQ86%|PoJsHMvnGt1>0<Qz%@$&0rOczZ
zTZoY+v95yAL8ch}mo`JDSHRE`S_`Htu?rWr$Ecte<`FSVW;1^um=C69zBYArPJbPq
zQTED_+7@MyDtxO|dbLTjDYIbZJg)_e4YG8ooq#)!W%SPGma}>9_zN*~)^%$;GSdRL
z_hoZ}gn(L~pwpbdT+Vl!mx!(5aoNcW{gGK{!xB!-;QIiz!VPoBl214{<%;ykP=jvf
z8CU`$-?PfZ*Py0C{Dx^^H=Y)<c{<sQXQK>EW?9r$@+0|S9%0iB-7KD{Zb&|<J+I|6
aSo^%4_`*h$ir9v~Da#xpmVY{*6#oN^^zmZ=
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/lexical-054.js
@@ -0,0 +1,46 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          lexical-054.js
+   Corresponds to:     7.8.2-7-n.js
+   ECMA Section:       7.8.2 Examples of Automatic Semicolon Insertion
+   Description:        compare some specific examples of the automatic
+   insertion rules in the EMCA specification.
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+
+var SECTION = "lexical-054";
+var VERSION = "JS1_4";
+var TITLE   = "Examples of Automatic Semicolon Insertion";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  a=0;
+  b=1;
+  c=2;
+  d=3;
+  eval("if (a > b)\nelse c = d");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "if (a > b)\nelse c = d" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..234e56fc17711e66c5140cfec66f8dce3483cfc4
GIT binary patch
literal 7525
zc%0=}&2rN)5O#kk1uo2Rgo6(p+F_vW3^zh%N*abTC1ptHwWHYEL{zmrlH4?p!<FaY
zO?Ut<++ii>$93d1ah$d(y`<ii_UGHx?n)&Ug$&B2HW0sD_XG`<v*I|8^mqu4PX&02
zo`ZCxA_~qRP|_)FnboD_)?Fz<DDaPnsGF^;D1^ZU^$26#J@6P2;Md3*iaICaGQlIE
ziUwb8BKM5m>N#NpWsFKy)<X4PY0G@Z#2-jl(?qER4O-><_<y}xY3v`?N?SczpLY*=
zjs3<!b%djL9aX>7ZMz;I4=y|i73IMQcg=7^G}y`#AS0GwB~4HHgTFmYv%UTP)NvkZ
zViJ8sosuSl7*?Xqbe3_^DGhwb?-98ehOTFfjx<JNXq-{;2dPU}so=tBXrcz(>Ck{G
zYht{M7wr3(I`o8sFrovDblMne-1>kdMIKNEg0Q+-QoRTfVW~Y{GTyLgMDjzeF*<94
zc)7j3Gb()W8{=%#SuDc8Zw}#+94`c6eXc&%caC4*0&v%tZUkIQX(<F+7a7%l@saKc
z7jDhu@+-w-DI1%)P#-F<_iMYc0)|G}5UF56PuQ(d)HNQ!A)*y!cZeZ`DX(o{>WYgU
zN2mr!HR_$UJf>Y=6ki`By(2I!J|GoDgCFo#hRe@wsf{U0L^q*G9}8^3ah5YUQI4Rk
zwo2>Of?f<2<+gu*b^94I`pF&&uDI%kkSFc$Y(=*Y7)3y@1-~bhfqx4s`rn%YH)HH8
z1m7pfsBw27-c@bEI~Fbf%WPtsq6^F9&jhb0`7*g7x)q|l_ONdl$GP9dR)F*hBasBV
z^Nf3^W_f&@y5b6TT#Fd%b+nj!srLWE0b?Z{mz;eKZ)>y_=+&w2)(_~!`y1E@K}{H6
z-u!lDd~48|d&kwb9A?-u(P&ZNh%sv@v@+^_0^KCjVKH)I&>ifbI1;FCG3aGQviH4?
zOZshke7KY5rvRA5@ENyH?RPwkWcsZ;#$Zs%iOwy|v7E<!lEEbJgniwCpDE#|swrc7
zQ6<rElHoJmXtwrivS@s$ifw0`*vpm|yPZvv-%}@A)(mtv%EA;Q^&(V;j8ilBqA-VK
zxQ@9?1EL>vDnwdPGcNwbvap&i3-fu7n8UltVu+mj3iWkxcHFma03A0To;Nn%xG{O~
zCWHLU_nMK#wg;S<?9}<?Zs1KCP0X&KGd)U<DPD!Rpc!M{wdT@VW)hm!1Q+~KR@Wev
J|LyrQ`5&Z(z2E=<
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-001.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          number-001
+   Corresponds To:     15.7.4.2-2-n.js
+   ECMA Section:       15.7.4.2.2 Number.prototype.toString()
+   Description:
+   If the radix is the number 10 or not supplied, then this number value is
+   given as an argument to the ToString operator; the resulting string value
+   is returned.
+
+   If the radix is supplied and is an integer from 2 to 36, but not 10, the
+   result is a string, the choice of which is implementation dependent.
+
+   The toString function is not generic; it generates a runtime error if its
+   this value is not a Number object. Therefore it cannot be transferred to
+   other kinds of objects for use as a method.
+
+   Author:             christine@netscape.com
+   Date:               16 september 1997
+*/
+var SECTION = "number-001";
+var VERSION = "JS1_4";
+var TITLE   = "Exceptions for Number.toString()";
+
+startTest();
+writeHeaderToLog( SECTION + " Number.prototype.toString()");
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  object= new Object();
+  object.toString = Number.prototype.toString;
+  result = object.toString();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "object = new Object(); object.toString = Number.prototype.toString; object.toString()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..03ee134ac9467312f5efa8a97ebf29d1b55b941a
GIT binary patch
literal 7519
zc%0=}&2G~`5Z?aK@^eAr$N@`SS|Mmb+z63M8bnb^P!si9ZR|<1bZcAdb<;cxZ@^pd
zD!c#}?l8NK6W3X%iQ}|Q=_U2d?)-c+J2Sf_8TuT`r7lpX+^_}nC0Qec1h(e`ahL#G
zvU3PXAgP2iaAiPBJ9>2~xpglHKuB<osc7h}>nMc71+yvV{e7@G72wq98Hzfm;xfUe
zz6^(7T^j6bz14Hdhsrn$WLXJSf2AG$84-UVVM7rEDVW<SZ{q)rYNdHlua$NNw3v4f
zdCi07VRek7b{$ub8m3(jkOvnw_>y_<7<WT+eKgp}5)gzu!AhE*@&|thm}YzX{V5@j
z6fucDqRwcGLj)^TW|CE0bjn<ZI0K?5Mxh%Rqauyb7#XKk{6Xr<RVqB8HMCFz?j+1*
z(wG<@q6G&IrVeW}5L&d0kxm<9j9UyyQsg0%ASiF>CDjWb5e}5cE7}_#j!Ax~G=^s_
z5HELk-;4_%{zf>PbQX*7@0&w-EXNB$Se>iSjn^k{ZvnWQD>nkJp|lhN?K5Ol<Kh!o
zZBJM=oy)KE@_Kt~I~V99-Ho`kYa?J}lL?Rt*7Jnf3Pe@n0SFbHFuOsF5KK93!crAn
zY&b$TA&}$V8LMO3^=0w(G17Yiv*Hs{K{UNXuan{Ob5mwxhEmZ_C{m{aJ8+cb9NLly
z*6GT$UM1+oNKtP47gx5i(~&sWec?$@_I=2a^>?<O8^?<xkXM2~QpUl#1@-*z&48OR
z^c8~d6J*ppYbf55UE%c%TK<>G#56+}mdRf!UQY65a#QpxRNCE9+t7}CP9Hk~(kq;X
z0hpcVo_(s9M|Y_!E>I`6kn=%9i@29c|1TUb*3xmw+1Bu`#yYNAooa4zK&Rf{#6Ade
z%J_P%Z&${*2EBzhTxCl=!<MNgivlN%c|)O;G5ZUs9+?h{mJ@+auzli0Ap6Cjmlesu
z_kCO<z37Zi4tLW06adp0KIitC{f=glOutpf7|tn~t2X0ORc}uyNw+7(a-Q~S=90Yg
z^>xR6u6&=Vq)cc<l|;WuhEF%6`MR&pqRF8uwwrBZD_dReZZ=JR&zxvkBhcL_3o}gA
z%TO6IPR+uL!UB@vI>s&qh<eVc(7=G2cJU{ch4pk<Sj=O@0$xp)L*&disH5T8vEExQ
z^sH!h-r9a=MdbKJ2H9DUHR+|M$D6r~RLNy+;Vl~N%PyaDy+=-{T!pxx7!%&K7SdPd
U5}MTkm;60e6(E`a+4(a0A4DL!p8x;=
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-002.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          number-002.js
+   Corresponds To:     ecma/Number/15.7.4.3-2-n.js
+   ECMA Section:       15.7.4.3.1 Number.prototype.valueOf()
+   Description:
+   Returns this number value.
+
+   The valueOf function is not generic; it generates a runtime error if its
+   this value is not a Number object. Therefore it cannot be transferred to
+   other kinds of objects for use as a method.
+
+   Author:             christine@netscape.com
+   Date:               16 september 1997
+*/
+var SECTION = "number-002";
+var VERSION = "JS1_4";
+var TITLE   = "Exceptions for Number.valueOf()";
+
+startTest();
+writeHeaderToLog( SECTION + " Number.prototype.valueOf()");
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  object= new Object();
+  object.toString = Number.prototype.valueOf;
+  result = object.toString();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "object = new Object(); object.valueOf = Number.prototype.valueOf; object.valueOf()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..4d51fdb52d8ffb5b33e066d35cbb431222940345
GIT binary patch
literal 7910
zc%0=}OK;Oa5OyC>9v38z2w}mc6@nJQF^bftu1FOUL_)98#-1cgx3;z3B+Xyq%>UxT
z9cI^gxXwCF9H&W2FR5pC=e^&|ZccQ32KihYh?B3{ochApF$^QHJs%8*a<B#MLSO`f
z2)F`Q1V-*qt<FWa9tQz%0nP>CRkd{&g)q3LHesxP3N|AgoHDsWQC-4s5^Um&&giR6
zf>Wi}>Jm0m#%Lh&QmFjP9jece_!9{aB{2}3x~=>k{$I5UwPK~5I~>r4ya&ju6>BAH
zf+KfbSl_C;U5}9m*EaZqdhP`Gq2l^zu$ILk=&%SYYI@8c{2jzJ+1uAI4dbaKMx&2W
zr=-Ck3@edl8r!(&lDdxJ42T{dr*2@3%rs_WY@AZ@2dP`Psqnbc&_E5i)1WRD+QK*q
z7Ze>V9onS8m1q|;9XCdsw_!k{B1=>NC#<TLSl2#AIFKH1DQ{S3Lh=)-v2)b`{_g1L
z<D~G>Zy0Bt&TJ$6dvy_>sPRl9EYH<>^+WyB8U%N5YbC+eKuac}eT58b2tI+?^tf48
zwftT!uQc}$QU!giyE=q+Wdw|E(gmb|cpfoZ22nyhfI)bxliVQ25sW#li=_lyY&cxh
zAP|$@Y0)w6`lk5$4Cy_NRq+|Az-wN~YbCh+MpxNbp@jD%isY%l4jdLagQhSzZM8*Q
zuN3rltSGhp%Y*F~$QahT&pqLZz7Hv?{@&ubcD%?U@>1{_p$wcg!1KSW32wsBmq~n|
zBctq@Bk`tabFZh-^1n<bx*0mNO8!dla+0o+YrJ0|!fub-hH~6<`q&AOUSOmXfZloL
z*_Ud0c$d260#z?}7#lRSkb49Ay9l$p@w}vLYj{_qEmy9NHMe0xXWn1KJ_url{63PC
z=W*$~Rj-^)&#?4_+FwATe#|_t@dFFQz*d0WP4u<4Ex3KI&L?XtY)_LeML=ZKx)N9I
z4Xd}(oKmIP%{41102!;w$vMsm)6-vu-qI&7X-kM833FCm2ZD1$kF5Ek+mz_o*Q8ZH
zqpVSuqem&8@#P(;q#~K+sH9dr9iG-OHz`lxEW={jOV3>+?;?dV(*<&d@t_cy0ixMc
z1Hxhxkt(9;naXy;IKY8$dvhm@S<8FwI!hW$?*}T(am(2RU`RMM5ttX=)YhL86qZm7
zcQFacfXFAd0tqxxQ!f76(Of*1^FXwOm#obYIrnI3AtOBO_?7rXW|F`ZZ7_$Q9#YIu
zi5Z?eGvnK~tS56{v^n%Nq8EnaTfiz47bIiK)8bNE$wEStn%;&#i%ZNA>0keElK%lS
CZai85
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/number-003.js
@@ -0,0 +1,50 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          number-003.js
+   Corresponds To:     15.7.4.3-3.js
+   ECMA Section:       15.7.4.3.1 Number.prototype.valueOf()
+   Description:
+   Returns this number value.
+
+   The valueOf function is not generic; it generates a runtime error if its
+   this value is not a Number object. Therefore it cannot be transferred to
+   other kinds of objects for use as a method.
+
+   Author:             christine@netscape.com
+   Date:               16 september 1997
+*/
+var SECTION = "number-003";
+var VERSION = "JS1_4";
+var TITLE   = "Exceptions for Number.valueOf()";
+
+startTest();
+writeHeaderToLog( SECTION + " Number.prototype.valueOf()");
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  VALUE_OF = Number.prototype.valueOf;
+  OBJECT = new String("Infinity");
+  OBJECT.valueOf = VALUE_OF;
+  result = OBJECT.valueOf();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "Assigning Number.prototype.valueOf as the valueOf of a String object " +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..90193e1fe53533a6660fda2c327f2b5b2b807c60
GIT binary patch
literal 6518
zc%0Q(!EO^V5Ovy8C|p1sxaQajLE3v1siZ+fY6BvxUMpvJnz(hdE8A%jA%2J>C;keq
zaDlNm$!<2@w43gdwwE+B_KfHG&5S2iH3&G=sy(1yt?ddHD6&Zik**&A@t6Qtv1^b-
zDyrZL`bv^&#jLKzw;oCfLV<TmMcZuMLL(eT%%z-<kHF<rfY+i|XzH4Zd4Wp<HJE+t
zQF&ziHm)h3Ipa*Knl`HcsulA!6n;a&wiZeySif6)jQ_VAb*K5URjo{9Q{5xfIZfxd
zv7phrP8*-wwp}}@gOLk?Vt#)?yKS@q9@wf9AO}3AiXS}@PpMj&V45E7_g92G)519V
zh&rPk4k4^mACqk0qD$8Ih&K`XBD%WCVf0PoZA6DNF8-jjbdw8T7!MuvfIA86Gi4>l
zyKq6%L+Y?|2Ev%`<4q?IW4*U2AaRq&Oo5=hZI(1f0U|7Q#3d6AA1qjYt_eNm@0<Po
zgSQuQ(Z%dDMBC;$Uz~rf59bA@=Yq4Qd!v4Gcy@3P(EYt0bS)Jo7i?c>yFDnM`=UJK
z@=7pA-r7?;#w|prut8AALLNJ)hE3OY076A~klq<0%o1VR(Ax<!RVW9fB|2+aOoskY
zV%1e?D3AvqPzu8FkNs{+$UjOJE+Z$Y7{?sxJiyi)(wf7$B7${$D(P1ndL20`*kmS1
zifaK{QBF^nl~24R-BVJr_{#TlJ(bV;*vYG{yr+zVcMsai-}Qi-@&wHV-<POp`Q@4U
zvg!$cXz}vj!CoVilP~(*nEZ+2sI(fB9Wky`<@TapW&-!UF}5d^*Et<Xum{h5_tGp6
zC%apYb7osO&~2s<ba$KImJdNqTkE^eZC!^07<o!7@7O4vnMis9)GxtZwpaf0^s9wU
z_NKFhT=f`(;`wCgb+>#nSF=2oGV=4RHQ;>0nov6j@*a|PBPY^eDzI)}uTD^B3ec_h
zJIFFnId;-ayj)h)3V1@V0k#Z1a@9(pAz<zaTy^F!*Zcj>1!7AAq2J5Oo-&y(EG26u
z-=CmX`C-LaaZtLcR^&&977PooyBZKZHP)%Lpk_iGVOiKpmW5&ll!q~#6<{)RE87WM
zndxMfMs_FLniJ(+e9pqKh~e*sf|J|ex>vy2Z~Mm0Y&5NLJ@8*^blp&^|0p#t{s$j-
BUW5Pu
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-001.js
@@ -0,0 +1,47 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          statement-001.js
+   Corresponds To:     12.6.2-9-n.js
+   ECMA Section:       12.6.2 The for Statement
+
+   1. first expression is not present.
+   2. second expression is not present
+   3. third expression is not present
+
+
+   Author:             christine@netscape.com
+   Date:               15 september 1997
+*/
+
+var SECTION = "statement-001.js";
+//     var SECTION = "12.6.2-9-n";
+var VERSION = "ECMA_1";
+var TITLE   = "The for statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("for (i) {\n}");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "for(i) {}" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..c923bf91c6e46314111a3a381c72441db1cf81a7
GIT binary patch
literal 6576
zc%0=}!EO^V5Z$z;P$48FggD}3t3p!{H$o&xgD5Hik*F7hDra|^xOH|{UZ-h<xN_t}
z_yRr(i6bWjV{ek(B;K@}?kX+xl4i!9@jSno@uVcXK8JFt4b&;uZNYqLEnAiq*q#rT
z!vxrpoj_m(l1k`+D+8-k)T>MJt<Qr1gal`win`vqf<`!;GMjSV-vOIb0Zxr}(9{VP
z;{u!dvOD_LrooQ(TRowC<czaGmX%TUS1RhSq3|0DR+TW2g1N2ob^O0xtu%Ju)=I^J
zY^b}2y2fr}uR5hsyY{Q^>!w|6sDo1*e91g_O1rAHJ|5Vp5)gEGOcg)+L_CF3ae!%Z
zv_I}y)=edhqmQUF+T;+zO4Tu~C0umOT*q<-LQh0jH#m&CX}pc-aN5N$lorl%;R)@b
zi5_sL#at$h#CQ=d*maOP?2v)brd_=0$-@}$Z3sx*<Q|hCD6i`!)l(l44phVi9S!eJ
zS-zzRJ>>7h?d`|Y_D7!~)F!vtg8XxFAWzXe6OdJEy{<nxcybBA{k<4)4b>$RXzwb!
zZ6Jr9*xF()8F6_os3VW{p&jiSqLY|ls9+(F9acf7YCC{MMXQ_K86w;!LNy_{7G|oD
z4G0X;8O!2i=vO7y+bHh|<iabIf@pYqUMnHw?*#*&k(X5TV~$iVVCxO3&EZg5g0<Rm
z(yubK89B<?WGYDVYXM3@lGA1G6VFKbgjD=zTZ{3rlf~UB!!If0;9P>%@@FyNCOkni
z!S@a-Y91MxC$cTPp25ri@<=kh=rd#TJBp*yd`xbLeuYZA9rZFDxaah-J)yk9X*U3K
z@Z7VH_407CJLfp3w}k`Ua`HfTvH5NG5Y#cXzRTR!RXBi=C$#b}CQ7F!Qc<-td=8Rz
zf>}e@1L6~=5|;%V<P!<YFxh;jB_I5cPswKk<IIg|1_3KEmc?^UQ}ALrr>}2zx~1gs
zL9NUAfLWn->>@Uh&`TK+3)6+QT(x?FUPFM+y}yA>1esyCO~u_=g)fI^_5xr_(MRX4
z777ApzkyD340E;LYaSuCmM_$sTAEWP)rBQw&EWeD)JiX`Dsv7~XVr@A$WVh`?zLF~
zq9)4<4GgI15WiwsSeYyf`3x~vV}Q%SWa@Tz9~B)>0Jbyg63+$F(dk7ZPG$U3Q%oW2
p_z;F(9%JJfWhk?ecO!?hpZ9f~+GtWcyW+p|sA?kT|2b=1{1<S)bJYL<
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-002.js
@@ -0,0 +1,69 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          statement-002.js
+   Corresponds To:     12.6.3-1.js
+   ECMA Section:       12.6.3 The for...in Statement
+   Description:
+   The production IterationStatement : for ( LeftHandSideExpression in Expression )
+   Statement is evaluated as follows:
+
+   1.  Evaluate the Expression.
+   2.  Call GetValue(Result(1)).
+   3.  Call ToObject(Result(2)).
+   4.  Let C be "normal completion".
+   5.  Get the name of the next property of Result(3) that doesn't have the
+   DontEnum attribute. If there is no such property, go to step 14.
+   6.  Evaluate the LeftHandSideExpression ( it may be evaluated repeatedly).
+   7.  Call PutValue(Result(6), Result(5)).  PutValue( V, W ):
+   1.  If Type(V) is not Reference, generate a runtime error.
+   2.  Call GetBase(V).
+   3.  If Result(2) is null, go to step 6.
+   4.  Call the [[Put]] method of Result(2), passing GetPropertyName(V)
+   for the property name and W for the value.
+   5.  Return.
+   6.  Call the [[Put]] method for the global object, passing
+   GetPropertyName(V) for the property name and W for the value.
+   7.  Return.
+   8.  Evaluate Statement.
+   9.  If Result(8) is a value completion, change C to be "normal completion
+   after value V" where V is the value carried by Result(8).
+   10. If Result(8) is a break completion, go to step 14.
+   11. If Result(8) is a continue completion, go to step 5.
+   12. If Result(8) is a return completion, return Result(8).
+   13. Go to step 5.
+   14. Return C.
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "statement-002";
+var VERSION = "JS1_4";
+var TITLE   = "The for..in statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval(" for ( var i, p in this) { result += this[p]; }");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "more than one member expression" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..7c3c6497b6704d149c9a826fda97ea3c78f16628
GIT binary patch
literal 9226
zc%0>0TW=Fb6dn_L0Z|DF@mOiwCn5x)YTs(2f-!BXU=X%=sVX$tJ+TMIJFA)5Bv#db
z!2hBDrQ$dAu}>A8ne}D8o?UyLT^!TAIG)QnGvE2nZIY&rBM$q`0nlK->q{1CvO@?_
zzKDPXOoFf32`Hj8)i8umE7IJvtDEVq50nC_A$UP$*KWOxLO7f;pK?BW1U{z{f({*`
zs1qvZ2Yedoc=~NX)g!C7eM0$E8D~oG8=>Z>xo5v7gYR(QOEajnWMO~b{QhM0^yn3e
zXzq;%CzD^`WVhYw9X#zU%zcJ)y@TFi+qvsS`+3*3>k7`nnGca>B3zjL+|EX>qcm_z
zI5$X8F;8ts-!=n5qq#RWLq0$^z9r<E8B7}t4aMjYhr|-p9G+alMXy;HkYGG0<jmUR
z!x(a)0cVG^D*naM#xfN`S`A020e2D>GVSEj!(_ohfNW#O45SquA~~{$aawZ%NLu6}
z(;zAD+9mC?2oYB1#tnNL9xq7#%J{&9@^|jt`+iaW^fQ6lrM6m-|JfYK3*@f^WaDtZ
zcE5Z1!vz5Mzs-Q_h&h!&d(+4rfOjn9-McLGrd(bN>Y2vwM2=Mrvy-@BXkqM69o9f+
z(g6UWvLELslNoNAtGW=pl6b1rJy4F@Im2T1>f3VH>o|TYkqf`zD9D~T6#bkl|J88t
z8F@+ND5c2w0%q%k+8mBGk*q(^S-nQk?U|yQMV5l3z7$|4ynJ_A`@{t<pW}+3Y-({9
zJ5|`u2!2c%hu{LFmiL<hH>WVI1m7Dt(GlKMyr&0JoI14pUy3AGonIM~pHb|t)?;!{
zj#^avgIO-K7Z<?@(-V%jIE@v!FVBVl+AdF;!4*3|yDjMfck+9{^R;}%P0(A6usikk
zJ55)1t)FF?meFPK4xH9rhPXTIQWe)niwEzvBC~bSG?Mv60f9^r{WR)!!w|q5<`C%b
z?X6$e%BI+;dABf)GUZ{rCU(6)uGWyV6H0ow?^{j3MZf>(&{ByuLz+JegqM#CtyI2B
zd#g=m=Z~vU40p+F__7moKK9pSc8=Y<$g)dWcCYEJn0Q$~G^;Z{I{|3r{XKMV&=p3v
zQURf;gsP!o-vDeSD)Mzhuz`U2Phfa7hq>7=Y`!LuG|^4FU8a=5a=a#0BxsQYjCG5I
zC9$G9GJLG6$-GgusB)lYulNST!sTpOsOLFkJ5uRI$j)Dzm_P&1XuC6@Vc;nifHz}Q
z#d+HB#JhzJHJsM*{InzpRrYkYTf^B`?XpV?%}Zum{$6ZiiLT~Z{Ba!mhB4``%mf>z
z9;i|1<LA#1j{P#i1w%m2B+me*KudnJXSB0wu58Ohyvb9-vw1nj_ot#uJ|lcHX#<N}
z*!(vJ;zT9C%v-MzE$*!6>>=ck@+m^fG6?+?kwsSM`P*j=z1kIuXz<Wj&!{Z^7lHgI
zoc@mEk!C}sT)Jq=mUSzaPCaa>QtDlRrv3n6!)C=#13z8la=9gjQH(yl9OWf~R=~O9
Y2bS}QyS|!Ho&$!lat2uehf=-v2U=y-82|tP
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-003.js
@@ -0,0 +1,80 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          statement-003
+   Corresponds To:     12.6.3-7-n.js
+   ECMA Section:       12.6.3 The for...in Statement
+   Description:
+   The production IterationStatement : for ( LeftHandSideExpression in Expression )
+   Statement is evaluated as follows:
+
+   1.  Evaluate the Expression.
+   2.  Call GetValue(Result(1)).
+   3.  Call ToObject(Result(2)).
+   4.  Let C be "normal completion".
+   5.  Get the name of the next property of Result(3) that doesn't have the
+   DontEnum attribute. If there is no such property, go to step 14.
+   6.  Evaluate the LeftHandSideExpression ( it may be evaluated repeatedly).
+   7.  Call PutValue(Result(6), Result(5)).  PutValue( V, W ):
+   1.  If Type(V) is not Reference, generate a runtime error.
+   2.  Call GetBase(V).
+   3.  If Result(2) is null, go to step 6.
+   4.  Call the [[Put]] method of Result(2), passing GetPropertyName(V)
+   for the property name and W for the value.
+   5.  Return.
+   6.  Call the [[Put]] method for the global object, passing
+   GetPropertyName(V) for the property name and W for the value.
+   7.  Return.
+   8.  Evaluate Statement.
+   9.  If Result(8) is a value completion, change C to be "normal completion
+   after value V" where V is the value carried by Result(8).
+   10. If Result(8) is a break completion, go to step 14.
+   11. If Result(8) is a continue completion, go to step 5.
+   12. If Result(8) is a return completion, return Result(8).
+   13. Go to step 5.
+   14. Return C.
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "statement-003";
+var VERSION = "JS1_4";
+var TITLE   = "The for..in statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var o = new MyObject();
+  var result = 0;
+
+  eval("for ( this in o) {\n"
+       + "result += this[p];\n"
+       + "}\n");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "bad left-hand side expression" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function MyObject() {
+  this.value = 2;
+  this[0] = 4;
+  return this;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..1a85db7c90560fa44d30a6ebeb4c47be461eeddc
GIT binary patch
literal 8893
zc%0=~-HsbI6n44=S_D!B;<D1vtFEeci^Lu2iZ)GQ(KfA`s5b~z-kGzBTW377J-Ztr
z-hc<<33vxCcm^)HLU8QK&t&46%w%WS1okG0kA05McmBO?9Y-7v+asXCVc(Z5(qxYi
zqI?kn377<5volacX{uoip;n}QV0X9EM;|K%QbX{X%Dz2%9hq>rU_Rx1@)UedB?LV>
zMpkE3E-&~r(((M)h^nVnZugAxxiHR@J~T|tU;DuROcsB~g&Ss3Y01Ljq51xN^5Wzz
zvS=Sn7iYu|kl62b21hS?E425JHaHp_cb%tRcVG2gr*0w*E_{eI6X6Q=eM^m8S7{+h
zI1flrF;5*xYny?f)jpV-As?V$JwiS*i)n+Qp%^{kkXVA6%ad!k=^YCL5=<9`Tv&U0
z8RHyiz{TaPh(B?)wN8YPR>BENz>|c9Ognw)NwVQ6KyPEG45VcpqH|;~<Fw`skTlC<
zra@BPw_Caw5hARN#x1K2k5@Q<Y+_*M^7kJ;{Bo85{4;^tCAMCW|F}AkSDe2VkWIjS
z*Z<<pHh}xr)qv~BIkiChnc+JE?^MVK4_N5UeR(6O7ZUq3K2|g=ZsLNWgSkI-Sp%IZ
z2LOc1VVqw~7Pw_pbs=~&iBzcvpd8vc(_&WjUD5RxuAfWvg>P{c<UkyYVUEhbv>g77
zeo5sdCCJ1AR_nyIIh<-D*>I$@at)(<3qcLDtOQAOCBP88{BYU$#swjt6N>-Y(&B7(
z>ad+*{ERXV!4{O3zpn<|oW`^kd_P4(Pk3|oo*qeY?vV0-X_8!her=xolHzo=nI{kA
zq(ikoTGTSDxCka#o^ZXxX{^AlJQw~uyFD2OOHP3HSTY0d<<EeZ8~KWdptnfA*6h5~
zc2(Ery(}{_x(wcf^Tyi{_k>-k<J!??)2IdLqd8jtw!2MN<;3&}5^%ck?s|9V9S=tg
zvG4u(VFPt0X%M`7kFdxv^?mfiR}Lw)b$mZn?#c>Wxsyt<=~Q6z@8weg6r)`+fxqd+
zoKJ%`p)UFM{+=VNZWyarE7&kJyE73x1E}=*0R}hd8e7du>7c0UH!x#f0c;hT$W0Tl
zfq?nXVSKWLxj8Rvi6N0RxlOx6rjo&Oq9#?>v`F&Brgd#iuBgu${;fi9o>e+jIZ(4I
z{)}nidNwUIGr{jhA>D@BeB0y%8hA$9{SgfVPq6^Jg-6v~rj4I?cX0-U^Cn(Q)+C|Y
zYX5!%cP~2_R%V)4%y#^V)8rCe&r9yJIP{Ijq(?rJY?ykiCZUg?-#|Ex%Lq4&0evQ!
zTup<Pe6x47RJGK$WisAu`hB^~$He}eb;Zf|^Vv&A@zj++7855b`EA~2jcD;OxMU9@
z$CS?zQr3eoP7zu33caj-*3jitC~|`*#(G9%@qe}RUmb>M&Alz@fYVJ=wyi7OIt_51
zN{M#?ntHRgX|q(}=wULD%r8p2Q+&VP=61Ow#!-why&mN?j7s2qDHKVWQdpYZt#U?r
Q1(?RF8KeXbm1gaK0APV>i2wiq
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-004.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          statement-004.js
+   Corresponds To:     12.6.3-1.js
+   ECMA Section:       12.6.3 The for...in Statement
+   Description:
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "statement-004";
+var VERSION = "JS1_4";
+var TITLE   = "The for..in statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var o = new MyObject();
+
+  eval("for ( \"a\" in o) {\n"
+       + "result += this[p];\n"
+       + "}");
+
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "bad left-hand side expression" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
+function MyObject() {
+  this.value = 2;
+  this[0] = 4;
+  return this;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..6f18b441ac591b8ffa051d1df5a5a1570f802b8c
GIT binary patch
literal 9187
zc%0=~Pmj|^6rZs44~VL$Rgaa-jTM3gsXaAa6+&pYS^^>w7lhEP{Wh60v8|c$?nYI=
z0S7)#KS^)>29-E+s@gZ>#BrRlV`uGVL-&$o{=7Hu_x`_at0?5K-yQ+=_WQ12p&~nk
z5a|XX5RVCP6*~b*q@oJO;44Ymd**aIef7SSAQX7dspy-lmyrmEGv-pxClA5pRDjo`
zV<dG##o~fXLlq^zMpQmDe7h%<C(JmLYF`u8f9*Z<GhX}?7e3XCQVHe{_x1P3lP5>N
zAc^+gbaA%%32yegox#DA-qPMjxHmW$9Cod@o_C-1ZMUxA9-O%lDi-)lyC0j~(DsxT
zZUxp00%XKf7t+#ZAZWGsrfSFs=&u`uT+@qbg`uJtJ>n2+g6hYUOL*ut^F88C7XvZZ
z_Vh8@I8cG}#~BvyakaIIMIa1^BjkWL3G<n<+R}sgz=4O>#*P^XL)u5<$UerZ%^4tR
zl7~!zpuBI6bk9OWSZaw|Mj9S1QT|N(z|7=t-@W_oGX3N;hT6uqUXb5y4&)`{uLWf7
za6k9&z53<?fcy7mz_rAjTA=+((;b0x9Edx2nC~REycX1Rj{O-O!y4u<vBA*6*q?f=
zhEAsg07Atu%1<V9+%lrt5WEt5s!#)v7U`^EF)RAE$a)>uPX*e-Pq+$V5F7@>9Fc!-
zS?n3@l8Q-+k@f}5*0E`GI95ck;YelqYC^Z>j2b3c36kbgfZlNO-DT|;7r1<mD}J!4
z#aistp*v0Z5oH{_3y@m=*$lWjg=sDLeu*2sz)8qEY9xYF3zz>(kz}j$YqR916uYbS
zEO{U%9je^XJeL{418;)q3D-NEMiT78^T2&=j>pYl$qvw5i+jMG{2uUpEnjgH^cExR
zPP6?^+m>CMx3WyjXj6C(P8%;n>>YNcimU!&6YY-;eSJD3{|x`q_Xh|SsQS}a5Ahew
zE%JJjz?Q{p%PLi^e?ZZ4%;S&ktxhXP@Xv7r+c4+mJqH`HVAuKeYRx&~i^L9{Ti;_U
zX7WY&^1E`SYh`BIUVgJku%dP?aQIFt5v3j0WU2E9OejXXVw!u^i#VV9XuP{%*t=+8
zm$HWa;YGAcv7o3nY9PLC0JaLH_PWtmL%`g}Fg{wqT;C5&A||2Gflb+6rjo*Pye5_X
zRS*Y^b+iA9SW%xb{8#0W9zJ!bw4i20e1l=(ayBe9Gw0ZjEP4?V^Vd2iP|wlaZjY$%
zIg)wc%q^<sG_CE#xrv=JoHj96S`mb5n~Ci<@b<Fpb7i7=$!yC9!8(?xdgk4aBHz^(
zlWvT4uwnAPocJz&{s{imFGD;q2DF*Dzt;s?{LQ@4?8=3*Efeu(GlHj!bhPg$q$|z`
zZp`LA#l30%@PJrR$uINPD@2Q1<^_EOVoZ60kTe#Aeu~JVRj5Vjvx+V!LXjCf(Av{1
zi~skZKbsluSf(!<D&^8eQ?{%tT{;c0pGvW}0h*fZo3L5)IN*niTrPKlaTuXbuSR(V
dp%OUPJXARkx$EVW@(eJHRZ~a_94htN{{lEt%<KRF
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-005.js
@@ -0,0 +1,51 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          statement-005.js
+   Corresponds To:     12.6.3-8-n.js
+   ECMA Section:       12.6.3 The for...in Statement
+   Description:
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "statement-005";
+var VERSION = "JS1_4";
+var TITLE   = "The for..in statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var o = new MyObject();
+  result = 0;
+
+  eval("for (1 in o) {\n"
+       + "result += this[p];"
+       + "}\n");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "bad left-hand side expression" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function MyObject() {
+  this.value = 2;
+  this[0] = 4;
+  return this;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..210465e5631755b8fc47da9c4bffcd4db2bc039b
GIT binary patch
literal 9297
zc%0>0L2uhO6jqvcTY(KIFzl}Gw4zwk0mV*U(A0I-45?GpMi09bjPz`CrA3vblK8$K
zwV$#}e?yNu4cjASTe3{ak|M=Pn~QBye2?#Y-+O$IN=HQ@gZ<6~h`&GZ1Pzt5>o|_|
zcnFS91$c^{fpnxI3Z@V!>2&tY)1CCv11Ui$@ZS(IFiUTv5C#|2BaF?SgU5&fzfYzp
z>Wqlh0gr?#TK<|4`P}I3oe{QF#;8>LTB!c(?3thO;0GM|N)JjUXfWQ_-(Sv7PX9m=
zoxS<sV)9Fz9Q3-wqm%yH+#Q@79u1Fs)>UtMuLrhOcX19bJO~x#!P@K>W;V2KWe2CY
zb%6jGvDAXJwHXNTbMA(GfPVkpalY1rX@{YsC^=;idxGfAJGbzmcQo)Fe?G`X;_dln
zG&#_L$>xlTe{ghXlL{`3hEvplD;*k8W#!Vd_<<uI*+xecgb^JeIkKCvdUF9tTI4ZR
zAP5_nM|u|_A}qDVJH{Fotx5hy$H0Q}KR$l^^Sb=yXAHGXZL=VM+#bkl<ZlFI9dN%5
zetP@l8i4!ncEGjdoJOGiPRpHuJL2NeBO16%F4uxO(KuMhF{&Zii4BG>=Kj=XHFWwo
z0C0#HNBM_If?LK^8-jP^NEK=b(qf%8EoM!>DYo9j@pFM(c!8rJhWwb1b4>ng$HHgi
zB@wffA{`5OTF2C8Fj9`7<B7`Z)q)--idq&~36l1X06pR6hfD1p7leFHD1Nd>i?!Hk
z!gpHmA)yTXYjCvuw;gbE3e!gL{T3(s++B)y)kN@fi<Zx&NV3)WjWPKZ!S1RalZRr~
zCCZy5XPGga`!hVAaJ<V%B*AVx<K8>-c-#zb=m6jLBgW>ZY&^Si9=%6HcH3=2I<_OP
zeb;CDIGY#xaNc@tU~hXXl|fe)q#tg?anncF2<jC@sk211Jd}rA9HnYYjZmsgGNEZR
z(=0m~&8<zqU*NL|_(sWn=^{vPZ^So*O|u#3Z(Dk(TkZ2{$fLkNz(>Y`UX@n?FWh4h
zI5%C}_wX0HqZ0W;OckISB)K*rQsBRY>FJ8g^nSQWBb!hdPN+;Rv>{)cARCBRvSKa>
z!*1&MOXr!~0IU`?aFx`4fRww{5Vft8P6JeWedCm^M4+OItcCu63$Rrv@ax`AXb7lR
zlp;c*Q=PJhOy!8TL`|x^Q9Q1j>y|egaz%4wxT<<jUwL(jw4i28{1el{?QB|T=XT|0
z+$^;qvewOP96K(RZorl6!-xj9{_awGG(X%QurG)6Hg2&tB%j7^;2yNF_p;4;WubY8
z*bTpS);UBqbGv>R1)gS1x{uUJhROpu3q1V%6@qy@hWNk~kTdZcWnGxX-^?D(tXwJA
zGMR4iPWsiV93AsZ(G_1n-(NJY#Z7ma_qFB9yLts^@m)ZstDF+HL`WJ2VVoke$O^S;
zeb&+COemtkGwnUCviLs@^51QbcP-aSTPoqw#ZtDMD_t^`=&4fg5lq@__%h?^buN=v
hyVfF<o9$g2xDvXIxO?TC@)|IWRdYxQ94htL{{v#4?zI2_
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-006.js
@@ -0,0 +1,51 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          statement-006.js
+   Corresponds To:     12.6.3-9-n.js
+   ECMA Section:       12.6.3 The for...in Statement
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               11 september 1997
+*/
+var SECTION = "statement-006";
+var VERSION = "JS1_4";
+var TITLE   = "The for..in statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var o = new MyObject();
+  var result = 0;
+  for ( var o in foo) {
+    result += this[o];
+  }
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "object is not defined" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+function MyObject() {
+  this.value = 2;
+  this[0] = 4;
+  return this;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..4cf6cf96f62c3b134ba00e9b34225fdde129af62
GIT binary patch
literal 6550
zc%0=}&2G~`5Z<(<P$48FB)IxWK`2E+;y@G$(f~yzAQJUjHuf}Gy0xv{b<;cwufP-V
z9J~leZouq1KaR6b>(o|S=q2@xcV_3?Z)SE}Q&GsFUh4z(>TOrBP?2>)h;)Mxh{puD
zik*TaQc(pb;44XLRr7W&x%8!!AQX59RJ6^~4K%{xjJcHa;V!tG3h-L=1Wlb%F)MIs
zsG`YJpUPe1w|PqW#2IH&)wNOmSF4)GSojSEn_4K9V1BQD6aQ~F8=bumty*;?8|!YM
zuCv$KZ_a7-s)OdIwr$lG>fp?UP_e+D({37Vh#R)51jvXdRLQNU;;GcCBTTcS{qca1
z+gg}JA5mwt%OQr9>TQxWeCe3^9`Q!PKunKrv>AQUcpB5q85h4$S~<@}AdH7Ddcc*0
z`Ak`f@hW~{&qM04BL>2l_VJ|Co3WnT7?7mNeWpNA-Zrl^&q734>WC{Q8XnDAzM}~}
z=I@i8o#*rRC%-Y&Hn+us{Bw06&(XXPkacRkYd<}Fb_Kxwy&7;W)uj+<?`yk#aNGcQ
z;78z0$h;KRQ<v?r9pf9OTe0ELz)GIjt;S9lcK|{~FUoEWQ{Ymu+92GDQ&p%ANK16q
zx|k0Ay2N@H<pY6ac#BdHonSxcWrX~_Vj(mVlZs)&kxmBey)m~r94R7LudmX6wV}sT
zM<tug1xa~5Kr5W=bXj`G3vxaq75~}ZV!iDYadz79YsxrySD?52Sq-=uchExcy@!fc
z;7rUrsxN|p#moP4OR`<*3uE#}inG#kOzwzbgDST_?PVtLz#C$FLV1JJNP<0h9=ONm
z^?0<q;5=uR#S`6n_C$BN0dDaW^v2fuu5w$~;Q&US(aJyDD4m-~x*UwJgD)&xvbUTC
z)M_O7lguVVuFGYUIhe(Xl#`u@t%&mxXJYLP#M?;KwSp*viNJckemg~+F+dky-$9On
zDzJ~{V&$TeR>B2(1+eAlkjvHq4FPlC!%24rbG<(3enD(WDD-Vv*;6Lhfn{XP==m0E
zRS?&UCC8-mYDIBmXu+WLs;dFfGh>5F3u-3BuUHl~(q*BX@#K1pW+j-+-N+s#8krMB
zN-__Bj~wbd#+12_F8JPYDd(Cr&O^NI!k~=V@SKWN*j&3^!rm`>1<q|WtFvA6k2$)q
LsO7&|&5Hj5-<oYi
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-007.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          statement-007.js
+   Corresponds To:     12.7-1-n.js
+   ECMA Section:       12.7 The continue statement
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "statement-007";
+var VERSION = "JS1_4";
+var TITLE   = "The continue statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("continue;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "continue outside of an iteration statement" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..8c64b3e6009bfd9a8bdbce9d08ca9f9b46ecb15f
GIT binary patch
literal 6544
zc%0=}&2G~`5Z<(<P$48FB)Iwp6+$Tz2PC3MG!3Gt1Vp0VP_?nA$<nQD?XH{VMR*9F
zfQR5+IC2AK*ZFarb=tVL(n2q(XS_2z-+nW*<C=;>4)t0es8?^hf`y8#6GEgLgg`td
zz*X!FB$0|LI0auxQmdM`Yssarr39hCJEWp*mTsUC4(H6JoDcWF<y3&zqNix;jEY%-
zOG6b+p88bo8Nbal$|ue^ld7(b>c3jmJjTLrDA?3OsRZ+T_1pM=yV>aMe`wXJBiUGY
z3w53S&OvidqgNd^KecVEwonJ>E`*8&{+xExXhYnvRV6@1JfTW%Jrz%-RvlrQ9qo@t
zgxuA_B>IRtqg@U$tW<B4tl>*1%=d^l5(Z*=bfeAalg87SZqB&)h0@AJE&^dZbkPH@
zB+O^ZN{rq3g?$gH!;TpUW7@})PH)C~Zeu`_CJ&ebL3!J}(mW3lVW}gom}q!3XZfBc
z^q9ZTc6MIQ+n@Z#P}|%V3-Zs^fjmd^LO|B3^{)N==*2Yv_xEbRwN#fvpna(A_QB~2
zpeGLVoe7z9VLf%(9@{a#VY(F?4h^j2iQQ`Kba4kDRP>_k)-VMw6{`)xtvFSM>VULF
zXRV9r&~Hkt_fb9&NQSp41<?r(f?h_*-zyeEBQdEMCLHNxz}_2ko5Qgpg7x|;?N=Lm
zI(1aC$)zAEuLo#_lbtTPcf26yGg9%N?Jd^ZP7!CP4Zop`gLe&j%b(SNn{fv%1m6d!
zXa&y1yrcRe7+AdgFSjJymA)`0f224o<zsS33>#Fr{b?^Vfd}3Y+Y`zgoJJDt!Sld9
zF|Ws?-6iKavn-zI*0U$Ns||3Ar=UGs>$}cvU55i0c}6S$Y@>88BAM&pD+`hA{bm8L
z8VT|wQ^_#vYN=#SWpNfQNzJ2H#QBIYv33UEZRF`%L43h1U_D>Ionp-xpi8gsAi+Qt
z*hH72<f3|3!tHqlur1LZ^A-UO0dwEOX?F&5y*}uEL2OAV^i^5eQ)a0H%gCD1^BvTx
zATAa;XQYd2MR8<k!Jzb#s{zpiV}nWyY9_?5SQa+YWucte<YvreC74{gi#;B9F(-(W
zWF9!du|s{w*fBTJ1z$R@<XJPud4l&`7?d#;UQmt-n`pO7*!yKKze^j<YHK(AGmfq*
KD*xB2S@B<Z&T0n$
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-008.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          statement-008.js
+   Corresponds To:     12.8-1-n.js
+   ECMA Section:       12.8 The break statement
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "statement-008";
+var VERSION = "JS1_4";
+var TITLE   = "The break in statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("break;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "break outside of an iteration statement" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..e024e3ebc9073a8f27c7abedef1f9c366d93e09b
GIT binary patch
literal 6373
zc%0Q(O>Yx15Ovzpg18_7;sVlgqe3MrH$)Vvq(M|_10qq6RL<@sF?DxWwzp}11OJ3S
z2jYwbV{bk-8*kbqyGq+j+ZlVt^ZfkA-inGs4%JEzs8?;ef`y7~5<;XKgg`tdz*X!L
zB$0|LxBy>CQYo9!mE_a|DM2XkPN`^`saqI?!xeKW=YvCVITheF=mmzlq+;6O(ojX?
z|9Vs&n!NQ(%E!q#ld7tN>Yqy4{2Lp8qG4Mbr4r2VR(J64X1&%r`rN3LhqjUL9{O5G
zt>gNPN6$K~e{I@kJwP8^xezKA_%q&Z;|+1aR+j)7@q{b6^i(~iN_mKBcC{~`5%N$Q
zljtMrjJ7$%uu{EDvVnunneP#AXbi+;>xPTbJB_<BS)57n2d$;+QUt<eXk!MPNtn-+
zl^7r50Y@HEhjkbT6WYg}PA|r~ZzDjGA&;2?L3z^*sb7VNu+$ZoOf@{3iF_X&`)}X8
z+uPssXG4#F$0*w}=8Ny|_2E0i@LcfKG_TiA4$k&(0lI(JgRVtca>4eAj@tuA07|6q
zjAeK!q$dfRqc|orOcr88p@tfsSgS@(%Q^s|q8nv5g$Zn_N^JmYk;UqSYJs#=XH~>>
z>35~pM`-U0q{1h(f@lTDK{uo17bOdwk(N{p5{dLtz^)rJn?pwt!MZ(_&Z`5xo+Mg&
z{l!W3Q*<~h@x6G3`L!N}v0f(flJAd{aqw<|eE(YyxEWWxT=0F2jz-{&!#k=cg8pr|
ziL8;y=^JxyO#VXgDY6`sTVhb7%I!@WhABMo2G|48UgI>9U@x8r?ztHrznpIPTr$(*
z2h(QugK4$*(fmh7-PT`jbMMsU09KySFTdF+y)cn>jMnN7^xncGd&8MStXhIS$+Kjr
zwc1%S+cN(cEy&HYM#TA$F|l_F;9Vr@MoxsmW5Bw;9-X4i2%sC!Zz01#<=90R;^aI*
zE8vd02G|zpkISlnhJd*zaM7N^T+a{M-w|693Vp{__9L^<hGm?Z#P<Rf#A>nROXNDO
z$d3#S=ohZJ8W8;~t5In|&6M~9Wnn8V3&lJt3V8k8jgSksvFGD9<^++F%mXLrIMnGx
zzFWXWSJT9Kg|}PiJJ~|G(ieg`8k9>3+Ob=}+HZR0T{vh~FT3MkNVJrw<v#>XoBspc
C3NV!b
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/statement-009.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          12.9-1-n.js
+   ECMA Section:       12.9 The return statement
+   Description:
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "12.9-1-n";
+var VERSION = "ECMA_1";
+var TITLE   = "The return statement";
+
+startTest();
+writeHeaderToLog( SECTION + " The return statement");
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  eval("return;");
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "return outside of a function" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..2c0883db0043cb4596d7f688cd4ee7ad98c1413b
GIT binary patch
literal 7924
zc%0=~%}(1u5Z(Z#rM*<Ddg!52j-aaiNIg^{4Jsj3K{QlN#1(DqA=$Fn?s`MWEA<Kb
zR=xDz&aM;3IP2gfHX)Qt?AhI!oo{C68!si<@i>%AZJ>6!ZVBc|vP=l^E!P8LGXa)l
zSKt$0QVEyfNS~Cp^z2e}=||rOA;CVSqOO;&pb`$(%%Yt44#476fL)`PsOpM}n*xh^
zvJ<|wsehpDR<9@zjdAA7vQn!4N?ZCh5dK8LsuKEAFsD_1jL-FIrEz#tD{b{<gRw_A
z);Me&S4T$Fs?+MXx@pxKj={ABo@A~wGP<fqJ>0NyNPyqrk)i0;WB%Z8AJb%Sw_g+T
zObMgtBkGJcIRvm$wN0{wlP;KJ6T2^T#V~aJ&8SFYG=`hgCjOwbaGMENXbVlWfGY`e
zm^3EFelX$C#?)cw41`wgV5H-lF~)5GNL1x9lOQOs>nYW14-xj2#|7;T?~G`EsuEg1
zzTMv58C4$s1~{8+W{dFe`5`=#<C!3=&ec(U=j`1*0Jl(>3%G{Tk_oi0)UnWyo1So`
zD|;SnN;eQq1^3WueNfc3c^K}-1Vsfad1S*1K2_WS2o<ePGBpgbi@9q;aZMjpDr5tE
zIqIFUF2-G76kngCyelvtKBE*w!##El0o6YKGUYVpCKbJiA$1;*dxP}ma4v~pt+tHY
zRf^sW4dtwIB1rP%05wodJ}y)5c+9a+IEoLJUX0yN7O_)`KT*cPz6bR3cRt`I^q`sG
z`vM1QZZT9}lx^X54Oae_M#<FDXO_udDSj(Wm&py$t59jRhg_x|ckLe16Ur-`c6=~9
z&t2<6PY*urZuy=&t93Z<vurSWgOA>$Bg^r)Ov$zQ>Bw4+njK@@K|oWlZy-5?Oc~#k
z{Uaor@$s!eH}@_;@1^<Om}{xpoebNaSwo?WG3yIlHbKP0qV>4iQG$&u_7t+05qb%c
z?7u(3DarkE7F}P|?b!M>4$ruJV!V=|h%im~r7<O{i<Y=k){r#a&YY6!Zcouf@g75P
zl?aPP!>1{3Hcr=BG(J?>a^waQ<kDhuWSab*IMI?CtA|k*Cg{@_p)w?#n%s**4#{vA
z&71;6-CR|uZ$M4E_yZAHiI;_ZE=d;Sf@m>RPW-9&GUU|ahoS@BV$kI88ZMz`va_cy
zwgN-pwJ=&tyfWU6PhQ_hcP%#Y&eUNjuFJMS=X1DuyQR`*c59dtp3Hb~CZ$P?z2H~n
Ns$k0L|08fy{10mgIh+6h
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/string-001.js
@@ -0,0 +1,53 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          string-001.js
+   Corresponds To:     15.5.4.2-2-n.js
+   ECMA Section:       15.5.4.2 String.prototype.toString()
+
+   Description:        Returns this string value.  Note that, for a String
+   object, the toString() method happens to return the same
+   thing as the valueOf() method.
+
+   The toString function is not generic; it generates a
+   runtime error if its this value is not a String object.
+   Therefore it connot be transferred to the other kinds of
+   objects for use as a method.
+
+   Author:             christine@netscape.com
+   Date:               1 october 1997
+*/
+var SECTION = "string-001";
+var VERSION = "JS1_4";
+var TITLE   = "String.prototype.toString";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  OBJECT = new Object();
+  OBJECT.toString = String.prototype.toString();
+  result = OBJECT.toString();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "OBJECT = new Object; "+
+  " OBJECT.toString = String.prototype.toString; OBJECT.toString()" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..2751d1eecaf67665c962212e3d83a1511dc1b025
GIT binary patch
literal 7901
zc%0=}OK;Oa5OyCF3Kt|U2yyVS6{0POTSKZg4Wd;^5s7-Ow)Qkxy0xwKCTac|e}Lb^
zg)=a_PGZN|ZC-ZMlw6X`?9Stx*_qibh-Sc`SZDxoi&clyKv*l5WrdC(faOvSj-V|F
ztxymF*WiiJDr~FOh2+-#Fa$2ZJtMrTwyvTO1~=3pjCBsdVT6NQA=fCXMff1WA%ST2
z|20T>sPvXwg!Pp%8j7M6DnEs7^*18^M8ac93<alNy|{+IPY;gErCMRTOX{)YvMMr;
zPAfyaN64!k)lSOVU1#NQRo$+2<iU*tfuO!O#9dR|0DaN2ID}1>U?sguxr*OixXnQP
zd2LzGBrzEn3<xC`3?jsdG}BtfMOV~wEw@Ybc^uWQF)|4-P_c1J#c!l8jZ)!rrQrfK
z;7*HrRA_VNAX;$bVph>h3S5cyFbUGeXyeucBq{QQ3gCoQ)spf}fCz`u<0a({YYs_%
zDsx@^e7m#repq<_JHlC~Gh2jz%@5(B9M1${d9IGD@6JEm18}94a{yOUS~7w5r92ku
z=T^Xd;fqcHTWaO$<y2_LN~^tcue3vKj1Gws*7$_I5<OY=0W8AnO>@(Tp-XwI194rQ
zRKi6KLNV-}wk)PyUld=TBfZTr9X=x!c+EfY>jsy9=u#R}lkiSLkvtCAm80xta49TK
z>kX0CD+RrY73C~)B1rOU0g_>xkIU2+-*V~=NAbaS7wxc<MeL;DPlPgX??HF@J0EZj
zBWNc0zCcFBxBKF4(cpetqvd~@lXMe(W|{nz;4NypOs?@xi3q0=_cG<U?{=^~A-%*%
zGX%Z!%y+KT^61hx;-+_AX)@OBvJrQnA1$LJEBRhR_U1Fi>F$-fP*k9u`+%Tqx%jS4
z!?7lz?1#X8WYs;nI^}&Y1S9rKWz_is*B8KJSv3R=qGa}!zZOoqICY3lMj#pjnwUC_
z1GUNel>g({J>&L?-Hz&#(QVmM`ZtQ{z{z3so;AbLS(V}7GVQJ4uH!ySx{p^^M%R~8
zq8}xrr<&DlC0ZrX?UBm1+ihZpT28m3hnL<H=b33ldKgt<f{A+(3WMR)bpJm=uJBC_
zW0s<jLo(dO>?Hw_Z%`!?YEV-ywh)okbXmyfxnnV&dKN?E#Fw_ceoM7K+8(s+XeQsa
zBVz9@7MZ4J+TDz=k+1p{9hDARv9YO9mWfh%BJ2&(;D|sD4{0OHZDx;vn>pA%?t8(+
ULQQRZ!C$^*)fCe|@DGyz0jBFN0{{R3
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Exceptions/string-002.js
@@ -0,0 +1,52 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          string-002.js
+   Corresponds To:     15.5.4.3-3-n.js
+   ECMA Section:       15.5.4.3 String.prototype.valueOf()
+
+   Description:        Returns this string value.
+
+   The valueOf function is not generic; it generates a
+   runtime error if its this value is not a String object.
+   Therefore it connot be transferred to the other kinds of
+   objects for use as a method.
+
+   Author:             christine@netscape.com
+   Date:               1 october 1997
+*/
+var SECTION = "string-002";
+var VERSION = "JS1_4";
+var TITLE   = "String.prototype.valueOf";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var result = "Failed";
+var exception = "No exception thrown";
+var expect = "Passed";
+
+try {
+  var OBJECT =new Object();
+  OBJECT.valueOf = String.prototype.valueOf;
+  result = OBJECT.valueOf();
+} catch ( e ) {
+  result = expect;
+  exception = e.toString();
+}
+
+new TestCase(
+  SECTION,
+  "OBJECT = new Object; OBJECT.valueOf = String.prototype.valueOf;"+
+  "result = OBJECT.valueOf();" +
+  " (threw " + exception +")",
+  expect,
+  result );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..c82e6e21fcdbddc70e5a660d5930d6cfadee213f
GIT binary patch
literal 8762
zc%1E7%We}f6m=*qAR)w_%`8}eP+u&NkdlZt4N$2BM50QpDtE?BEG9F-_Oy-o1U`WO
zV8zd{XW38S+A~S!;h9V_lRjv=Nn&5$$GOMX?sZjo1Dn*VJ%X)z+hlYg&<a9`o9=)h
zi!x#gdP+Fr0t?b7j^L=esidpnr8}GxCWv*2Sz9f=3rcKqPEBmv!#!f!m=UXm`=II+
zv*>_{2f`cw>S4a8>^4uaJvL@jF6vUL{Ht!NpZ?$w2INGQ3r3x8{T_U8HyfS(kFDxv
zFgBWdB<J8ODF5bRn~GsVWEDg@`<;VkVn!-HY<_M>6o)-AK%g?s6Mq4O5Wtrn*bmSr
z9gYAE08@Ny6CXh=sOz9RAoP_w7P5jtmrb%1*p*2I;3s}46RVZL<17;{Qx=ZF0<1*T
zp+d`nU0-0|0+!GdN|;jZKvLt*=z$4zg;gF<K^V5%N~C!{V1#oSaYaRAdkM`?5(!@4
z+S)eOjqUA?*Bh^r*2bSc@H!{Th5Q0t8RSXwmI3)1Of(xGc8*?N19Tr=4WTtfqZDkP
zO1(W|a7Af@1e`XY!m2ooXGX17GoH_d{KSFwsJJUn$iy)nDh;UUA>SpEvd9yHFzb5h
zN5lliSmZiDAILLEU?w_*i)3`#q8ShUro{Rf#?Kf~<2{TL)^QKqZc50%b@T?BVm1sJ
zl3QcM5IBTS1Y)$?6LGsz(Tj<p1*@D1lEobma>7X8E^~XFQ2|o6;!UGz*4-&WQU^4w
z#7P<?YS(pbf}N~PRkX;o$l1apl&lLJObKmIcX-beT1HvUuMXWhYHjGKbv>w&b{Z8;
z?UEY#sPQJF>f}Ej{0wHDIG4e;wIFCG?H;fwvfUQ4{Jg3<GBvYbGESKMG?vcysOBm%
zl`h3?EIF8ugMX2RgEN_ut6O-=4Y_=c%cQ0!_0Q!bHAq1V;sd8LQ!qX$mYFP`$&zqi
z?#U7|Depj{obJ$D&oO1=G2DZcH-5@@_|P%o^Br-5=End8`UKGS-#Lz5Yv_MdKB`%+
zMkh?rzLb25>XBI<tDf;$#6i&)kQ}cZYkm?zU1Cb&eXbo1Z<WwHMGR>@<&RpPZ3kk$
z>pH3Y9oIbjIFe$Q^|3t$ohwqprh#Mu(L@x`3*Fw&?^_JPVu8kiFQiPD_E<T{m$a;1
zv@6Lk;mv+NOn><LzKYcPGD;C_H`;ZibgUqay8pS?cc69=krQN4>Dd~PV`-bK$tuNa
zwOR>n)*M8gS)YchX`dye_cH!xyAR{?8KQwXNjYqO-3cmip$1c~j`x4q?ax8Ong2VL
e{dn~@wt!y$6q*-m4y0A*LQ2!BQOeaQ*YH0sP(3dI
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Expressions/StrictEquality-001.js
@@ -0,0 +1,73 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          StrictEquality-001.js
+ *  ECMA Section:       11.9.6.js
+ *  Description:
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               4 september 1998
+ */
+var SECTION = "StrictEquality-001 - 11.9.6";
+var VERSION = "ECMA_2";
+var TITLE   =  "The strict equality operator ( === )";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+
+// 1. If Type(x) is different from Type(y) return false
+
+StrictEquality( true, new Boolean(true), false );
+StrictEquality( new Boolean(), false, false );
+StrictEquality( "", new String(),    false );
+StrictEquality( new String("hi"), "hi", false );
+
+// 2. If Type(x) is not Number go to step 9.
+
+// 3. If x is NaN, return false
+StrictEquality( NaN, NaN,   false );
+StrictEquality( NaN, 0,     false );
+
+// 4. If y is NaN, return false.
+StrictEquality( 0,  NaN,    false );
+
+// 5. if x is the same number value as y, return true
+
+// 6. If x is +0 and y is -0, return true
+
+// 7. If x is -0 and y is +0, return true
+
+// 8. Return false.
+
+
+// 9.  If Type(x) is String, then return true if x and y are exactly
+//  the same sequence of characters ( same length and same characters
+//  in corresponding positions.) Otherwise return false.
+
+//  10. If Type(x) is Boolean, return true if x and y are both true or
+//  both false. otherwise return false.
+
+
+//  Return true if x and y refer to the same object.  Otherwise return
+//  false.
+
+// Return false.
+
+
+test();
+
+function StrictEquality( x, y, expect ) {
+  result = ( x === y );
+
+  new TestCase(
+    SECTION,
+    x +" === " + y,
+    expect,
+    result );
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..af6788e48e6f661f389a0ea26961029da3351ef2
GIT binary patch
literal 5344
zc%0o>OK;jh5MGi#)f_7I)?PUEp*A5&rK*Z7Bpz;xl+Y-4qN<l@V-K+EVq3cl3ID7=
ztC!w8Ya4KkO@TsQT(D<$cGll~^RNxo3pkXG4p6sjIf4a>tP?_{;|D-oCcsgw50Xel
z6?DN<k{G3MwUIQfNC`rLdrE~Bnm)iyI9xJ^az3bo!>ItbNxQgJpNgvjhX$%Qy6aF`
z5B-{b%16#Pld7yY)jy*Y-bO->0<AEl63lCtALF%U*6hZ&rcsJzL)}Bv*$w-^oX}{i
zQ}fu$vMQjiHI^owr%qHbN--+==l$`5kPR(N;%8n40;FWVXAOZS+AWOanXuOo-LWZI
zLkkT!0HLDY%MVw>MHOo?5D9DT&%+RmEE1pvc%>2$B%e~CzL0*P1ExSwZiNOZCm7e>
zgqK%3Y<9&yvG$6sEgA%TP;>;9ouUG%wkCbYn2v7a|NDY!dnu?sM@98yzj<<4HIMg-
zyE~shep(31FFg+{f$v3`OZ6quIm2W{4m=0{_rb%nDPNEP7jywn8kK@`-yK9(Ar7Hd
zhSK3_Q%^Z8CP!EI(RFFG^_-RC<q*xeQ<`MLan|f{9xsdBWUZ<)&&B=6yvSuk`aD??
z@I{yM5hgO^CGr8WL>j2+m2$STPYZli$4k4M-W2ldURpTKDYg+t&p9O7rhWfJK#3a*
zeIe5@u7`Ob#z2Oy{$!<6+6D4fdpM6mMwrJ`W|Gey)67Pc^|W(m^)pn26>@WXduP+j
zNa*auULC~0Zw}&#uDuk9AECmm9aheE7DD$ncb=zuzEe~v8_Pyc_qn-bT`SxOlQJg5
zrSM2Mo_L&jyZd4HUD5SHdT&%T+uS>D>3QQqAV^<P3c~ge{B{n-eq{w314hLl;YgDN
zn|~B@4lP9lYj;#u|9n4owBjx2f@F1VKr4#*6#B2xG$$8UKYZix$J(A=og(Wn*=M%5
zk=LMR$bH>T>!wvZZXB&3N()zjJB{fR-9Nt{A@9xlk^$B91R;EJE!Z{TV&zp+gQc5s
zjY`O=mao_1uN=3q4$aH(RYm{WyPXaQ;3;!r<}BqEej|nMzhB?)_J<J-s#<(9y(<0-
DBH_`F
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/apply-001-n.js
@@ -0,0 +1,29 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 4 -*-
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+print("STATUS: f.apply crash test.");
+
+print("BUGNUMBER: 21836");
+
+function f ()
+{
+}
+
+var SECTION = "apply-001-n";
+var VERSION = "ECMA_1";
+startTest();
+var TITLE   = "f.apply(2,2) doesn't crash";
+
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DESCRIPTION = "f.apply(2,2) doesn't crash";
+EXPECTED = "error";
+
+new TestCase( SECTION,  "f.apply(2,2) doesn't crash",     "error",    eval("f.apply(2,2)") );
+
+test();
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..09f23140a5cd2365b5d65e4f2a1900e6c7700491
GIT binary patch
literal 6944
zc%1E7&2rN)5LVLidw~nXFkEtMhtdK^#uG@=P&$*QOq1yhr;cJPi9oSEl9Dz&12<lV
zm*8D^16av+Vmr1Qw`rOddZ_J{yg#3IKgk<I4qZmdMxS7-+%h?JC0auW3Da>2vM48}
zq$47bkXVudv86!9j-G9VU#$p1xFpsw<}Ll|Iw)b}jGCCS@h&kL=EQ2^0jL^b9u=6_
zmBYzXAB$aWw?4vbVvJEC%Sx&GGj{Z&C;SEiHDCzIsog6-g8Q0dkHDX{)6z0y#~%yk
z+=Dr-dab>G*qj-=17q#|cB7v7)^Yu)6?rS{O3XjF`WU5q|NR+450x;CCZI@hhY=4Z
zEU9CoB24;9Z3|hx(Badi@SRaB2k1_n(<Xj{v~ZpYhieNRumEo&YEzlG&{c23z6Gg3
zyOeOP+J=>jJClfU07zJ6gG$0N^OmZ9=5iv0inySoVZ#~CcVR%~)yvnjiYHeO<0N~x
z2Hn|QTok(X+Ck;y%?hCV=X%gh;DCi-`xFK~3~f`Pvh8w5I&$oiZI#Ry0()w+74Wk*
zPNu#j0Z{{cA$N;@JrRO1?+w#geu`Wy*dz=esBJ`IU|}NUY;=i~7!UoX#QGTIryR23
zBS;BvI}N9o67tVNLPkSoVm=NTQq=(4sF&P~bS2`n*Ozg-O3{m{p(|FI3zDm&e>G4_
zFP95@oKf^CrMSQ}ZIaU~&(ixUKq$r<79=G*e-!=0)C#V9Y4%{JnR7$-sn{y1|C`w+
za|NRI!M(;|wbIB|dQpN==|Rl{GU!CyQSUpQFL3@vut7k*%JJn_KJ!c*1m!=k`vIh6
zNC$?C@eFAL_8~VsO7}cSf^3fI@k+bxh4*=FbqnuRTH#e4hY@UVmHeCOk>;F2%<Y2W
z<}PMQ@cqNJ_@t0fi@B4=U%YH&mx)lOQ=!x4B-;`;?0<|tp0BSieZ0+2AKO~dVRvKm
zKanhhNPaDkNUjOl8^&KDO@1ll{eoT=0WRhHT16=r(?$r|FX8@_f|-hn7~3XX_lWI(
zCA%<TK!9Pqo_5Ev#@?OwQI85O4g8H&P|y|s6xE}?#3!nAw!q&9$L}27?lmvTbM~ym
zft)mljGcR|pTEC07j;Ee&EW&gCO8U>0dPOy54j_w7`0Gxi)BvdX5oq!(R{#U<z7{#
qjEW%p2bT0-4c;X+k&XzYP`={5?j}(x)R)@hJ-AYPIN6jK75@cK6Yz)t
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/FunctionObjects/call-1.js
@@ -0,0 +1,42 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          call-1.js
+   Section:            Function.prototype.call
+   Description:
+
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "call-1";
+var VERSION = "ECMA_2";
+var TITLE   = "Function.prototype.call";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+new TestCase( SECTION,
+	      "ConvertToString.call(this, this)",
+	      GLOBAL,
+	      ConvertToString.call(this, this));
+
+new TestCase( SECTION,
+	      "ConvertToString.call(Boolean, Boolean.prototype)",
+	      "false",
+	      ConvertToString.call(Boolean, Boolean.prototype));
+
+new TestCase( SECTION,
+	      "ConvertToString.call(Boolean, Boolean.prototype.valueOf())",
+	      "false",
+	      ConvertToString.call(Boolean, Boolean.prototype.valueOf()));
+
+test();
+
+function ConvertToString(obj) {
+  return obj +"";
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..1a8158b63ff04b67c73cf7afdd9b169ee9c2f0aa
GIT binary patch
literal 7031
zc%1E6O;6iE5Oo>~{kZhno6Ds)BK1@WD-wjLiV9RBDYpu3>`k(;*k*SflKzbT%&JoR
z6FRd_u;Z*_lDMT&;es>k-P!kM=IwYL6@{GEodG3Yz3mDXDywQ)mUM%VS{@VBRcuJ5
zB^6Qhn)*swPEEh<q^BN8Nrj@`IT39=bqf~Zbi`c3`S^&soCxZjl51FMNW`qcC83J$
zehr8`(tevm!tb1MCRH65#XqN}f5yfeFyMeAm0*6qz5~zgW~0;kbn4V5w&~bY80)k;
z$IZDBoORwjYnx_m!<e8l;wl+R?;x|Sic_0VlfUU7uPy5(8q*{Kd5m;9joBfJ1-|tJ
zUb<qwXL%E2Ad(17HiH2JQj^VT7vI5JDRL1A?V$@EV5Y@<ri}4Dj9+MZkO8d6sL)IM
z5U}iKjPy?lNiTWK6cvQG^()O$2n<U^T+wKFG`Dh0Vs^>9|1rBJPv!FZ>*08vOVCny
z#q@4AP7W^K{lDxQgrO8}pTWRKI=&5rCs$%OanhbDu=Yk1=O*M0klob&kS$bVN-ZM#
zQNE5RRAtbaNPCV4g(5<As8sXljOv$#zA0ESK|*-S!}-mWw@atXKBnP-Nm~J<wxBl=
zoP^R2LaZwLk_?H|XY^idk$X7LRW|jpJUl~&6|>&zC2V6&qHD{A#lbt;2nP^8ykR8q
zvroi0!#<q<agpi=P=O3eg#RYlYZ<Xb2+Td9*WH<D>fLlNp_zc-;cnFU;ZkTvQ={Xy
zWU-`j@R}%hkTd=3f*d@fn1C6KAyF7xtH()yPM^1Rbz^$XHAFcladEC4^1!{)uHy!?
zpsTz%jX0k$5|7T{{ZKLB{g*|gI0L?vA|s~I6+~&l5tJW=M>%<vlV#-OmI@JwM>*L*
zImw3ZZ^=oyUl%_g=Ig?Efl$_`TaPev>sK6#ju<yk0Fu<!zyog#*$VasCy_J@^^&DG
zy&uxk;u|82P|gj}dKW^AuVaojt;!J&1>}FeV~F5H+b^TU8>!?;my*t`^-2ltqs3KJ
z?y2yqYT$RhCI`^Yb~)8_m&0jKS%UQkDvSLEyvBTh<GVEInLD1PQtKXMF0~%sXtu|`
zBBN%`X;I!+KPU?8`}lUI0;kD#@A(}lR;o&r@in{0GD4Wr4xF{%bXe(x&Xa@<yVSva
zJ@7odzG@I@U`fL~gz43_74|(0L=v8CHK2Ba-rm)^yKBoq5OL3ct85pA)4r6p3T#&p
eX=u>b+Dc)Wu1x5n3fb@rz^#eQuXxWnYyJ&#LI#%r
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/keywords-001.js
@@ -0,0 +1,48 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:
+ *  ECMA Section:
+ *  Description:
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "";
+var VERSION = "ECMA_2";
+var TITLE   = "Keywords";
+
+startTest();
+
+print("This test requires option javascript.options.strict enabled");
+
+if (!options().match(/strict/))
+{
+  options('strict');
+}
+if (!options().match(/werror/))
+{
+  options('werror');
+}
+
+var result = "failed";
+
+try {
+  eval("super;");
+}
+catch (x) {
+  if (x instanceof SyntaxError)
+    result = x.name;
+}
+
+AddTestCase(
+  "using the expression \"super\" shouldn't cause js to crash",
+  "SyntaxError",
+  result );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..75167456b99dd2884de511bcce3f78eec2982804
GIT binary patch
literal 5128
zc%1E5&2rN)5LVg(!*GKm7hjp7q~*lH%}hvg$V@0Rbtp$hu{Vi|Dj7*mlQ-e{cmf`Q
zmF?7yW0%r8X*(qs$17=nzWubjc1;v=Xt`6MLCf<M3k}&NglJ!eKmw+~H*5x)XhRL0
zgD{%7&3Lz)KibwBl!4%sDla~|he|linNK-ibiwCTL2yjZQPqs9Re?`K6J5SdsqV&h
zdo#)}jd7+;%PO@$w;8`C!c!DjmtAcX6O-06{O|QT!~W-Ex0%Y8Yfo@(*dGphYb*BD
zY45~aIh8k4u#L|&{%X&Dz9i(i73Psbgcu!hNFbnwNkMjS(|0BU5~M<@GMH0mY>0?l
z=3H#zRfCYm-%LmqTNt4QJV}^frZkBklMVd<)6B*URIFNHR*KG)V!Q+-uX4Z)D9XKf
zOK%=3(Aq}ah@;`rn&vmSFi3dQkz!^&kwP~WOkf`F^F*EAKR7sicc#~EUp|vGl(|%I
z0)CS_OTao^>qx*;T<CQ^wZFZ;2k7qJ4ZTasL@n69#)T7@MCi7Y?RQc=H=}c=$6J=@
z*a67=DFdT}bvfs<1<;mi07BIysxI^ydWC??aJ0n_8;3GO&}Kcl(#ly3y@pt^IkAbb
zy9*I7DRb@fLj(uRH5g>&CHcJd%?v3v+TaSJJTQj5KzTa|EI&F_Lj^~EHPRM;EBrp-
zLbK`Usf>8wjKHCeFVAftZyg~GzN++YX2>{c$Jt^kx1Iy*OyYV4{KK*y_fIA&u0!$4
zZ>$2`BQAg4t%J+mgv(|Tf*d<?bcXYCj@ef3WD7w$ZaYZmvE*D{pbn(AC~<N-yp~va
z?QB5vX|b>vM34A5^1+YDCYN$_L13z@S~^vWf(rcnNTvb~V?z|1Oij^GOMs)J%*VXW
zF9nr5d6n@WoMcMkPI6JMvzE(JSAulKUEeALZlrij8NagoJ%$3(t)+k*t~5j2{uJOx
wxNxXgRt>BlW}4O#oLW)q|7!90szpME4H~Gr)SI7`A9l6aOZk7p@2XYtA7E9d7ytkO
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/regexp-literals-001.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          LexicalConventions/regexp-literals-001.js
+ *  ECMA Section:       7.8.5
+ *  Description:
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "LexicalConventions/regexp-literals-001.js";
+var VERSION = "ECMA_2";
+var TITLE   = "Regular Expression Literals";
+
+startTest();
+
+// Regular Expression Literals may not be empty; // should be regarded
+// as a comment, not a RegExp literal.
+
+s = //;
+
+  "passed";
+
+AddTestCase(
+  "// should be a comment, not a regular expression literal",
+  "passed",
+  String(s));
+
+AddTestCase(
+  "// typeof object should be type of object declared on following line",
+  "passed",
+  (typeof s) == "string" ? "passed" : "failed" );
+
+AddTestCase(
+  "// should not return an object of the type RegExp",
+  "passed",
+  (typeof s == "object") ? "failed" : "passed" );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..b7a21a7a5cd4e4b6c351b9dacc2b33bb3fceb2cb
GIT binary patch
literal 2903
zc%0Q%PjAyO6n8fm42~SR<O<T3Y3Ha?X>+Kw4QZ)*MQ-w%dbmzxJ5~Ed`3hY52t3<q
zlO`!>qtaL}Y2N?e?>#>!&_&LnA1r_-{V0|!*W{ECqT(zEk}wIeW-CxcX{uofLMsyZ
z);g%W4wM3^A(>JcS=Uz>gu|M}l=IC9VooI_cXWxNR#ff_Vw&q>_qL#FWb=kA%6G{)
zQ@U@0nqT1CS0|jJz?2*)EtyFBZ}5K<4kzQUcY$BZwz}7-n~WznVM}AYrr~|G=T%SB
z$c@hu|KZAho)dCrgmtEnAx38$90gRfOpp^a`p!f`l2Vw-isrHy0}+|4inA#`^a$zw
zEk!16h8bo+Pr?M#olX4W48{qznavqU8(Lsjn#FW-yd|U_@`h=Ult<PiT;~#$GKhN?
z4KG@eKcV8r&CM_qD^p1(lrJHLb$-EJICXJ#b$$7u+PQa6*M_c=j@y7=<k=d~9@k?u
zzzl3Syd8YI{twtaeV*~|SQAI#_9H6pAuX_Mud?^bI8PhrDo(Ur(Y64n>ggh5h<mwK
zvLVo{Y5+oIS{z>V6?+Z9T|Azfn?zHoC!lm2UFYU(LVqb(-=lnxBnIh_DmZ}l$4Plv
z{nH$cP~rRDz?0=LRRnnDibRzW8EhUEUN(Ec8`aC^p5El(;Sge;%Oj7sX{DA$2liuh
z!?c{mx3HY;^~3l(bR?Jf<stRv(CMdgQ*$(JF!pwVaF}Z%S-Q|oQ18%;37ldPLpHCV
zbui^vZPb=ijY>i0oTja<XAIV#TOT9tJp75oM~&v0TRUiZc*B(Px2A=eYx!dj?8`pC
Mc6gt@ruN0Z0ZQJthX4Qo
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/LexicalConventions/regexp-literals-002.js
@@ -0,0 +1,28 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          LexicalConventions/regexp-literals-002.js
+ *  ECMA Section:       7.8.5
+ *  Description:        Based on ECMA 2 Draft 8 October 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "LexicalConventions/regexp-literals-002.js";
+var VERSION = "ECMA_2";
+var TITLE   = "Regular Expression Literals";
+
+startTest();
+
+// A regular expression literal represents an object of type RegExp.
+
+AddTestCase(
+  "// A regular expression literal represents an object of type RegExp.",
+  "true",
+  (/x*/ instanceof RegExp).toString() );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..2b23f16a31c2ac16c84fff7af89c63b68bbcb2ae
GIT binary patch
literal 7016
zc%0=}O;6iE5M4@3ztvt^m0NlPRVB2?;s!y;Argd&L|m#0ZR{Z|-PqRdI*^~*WB)-9
z{Q;e|6WiF1Nr(fXi6Vu}?CzU+`)0<$P@c=7Vw?fBDos-`SCM5xh%_A+h{Xh$iuFJe
zsi=Z3*h&(k?5{TBTX&=cp};z(qUmpah=*{vWG3ajzXv9#0;~q@;!!;+t{P10DlhzY
zM&+K5TkBCCf^jBQMIWkPM%n)w7`tfD4nr!z>`vt|{@tuqTlK?+Q6AWazDMY5)m!_u
zlt=G6t{pYAc0E9!fXEz2PlSY@16oE0{Cky<m)aO75Q$^7%^_fhD(2Wk<Njo}MXZ6*
z5fS@?VDx1np;2%_7)wOI^C2AJBeW3#cM@hZm3g<j!GgMlx6e))2>)msFDn^LCiO!?
z;z#Z?1%mRXzod5Q3XoD~yyR!Yz0}EX(QyQNY1wpaG<qh+|8aBkQyM7z3^>oiFP7~;
z<j&YmNwyHSSI|+b9_*Zao&$FO-VM7Mt)dWaUuZnIC<SU>TfY&*5m0m3mwiNt0?5j~
zip@9{qh?I^X8=M)#~a<<Bf1h9W)b&Pj}JwKYJpVg>@xdeGW7y-#fii^wqBjcc&L$U
z_G>U^9zeGZB08&uM1k_paoXoNq=+kU+zHjc_K-vv<7}UZ_m!|krb&-o4FW1h^<5ab
z>NT#yB&(cC`E3whei2NW=54cd=pQ;IOHXi>a)P?gso|No$E~{=^{Ho~j6@r7G4pPd
zr~0v4%{}e1&(XePS-Qtosm!<tKdoN~zMK>XUNRN^7=~V<>&w>(hf_ra>zt`1qz>gn
z1T@tY+zzj8BP_LzWYZ~qEd`|-TQe-Vtx~~r`8_(;;)8iT6;Ix<o(lUFI=%<3ZUFxy
zKf9Ys>^3{?s17mFl*upQnLRwrQ3>~!GD>)2g}q6uTRNUFuj$|u<LIke+y0VKD03=9
zJwHY<u@L$?nU%ge+-XxjmcDi!hXb|qfXICi(x{XdLP(uLgtVF#68`jZ1Y{%sr($}B
z?!2@YLQqhMpx&hg)%CbyoY{+`C;gK)C+mff6Q7lw@CjDcZ3`~Pl2Ze-7R=0*Q~10)
V|EkJK{+_E!Kgz0`{|ob~`5&O^6+Hj|
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/constructor-001.js
@@ -0,0 +1,66 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/constructor-001.js
+ *  ECMA Section:       15.7.3.3
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/constructor-001";
+var VERSION = "ECMA_2";
+var TITLE   = "new RegExp()";
+
+startTest();
+
+/*
+ * for each test case, verify:
+ * - verify that [[Class]] property is RegExp
+ * - prototype property should be set to RegExp.prototype
+ * - source is set to the empty string
+ * - global property is set to false
+ * - ignoreCase property is set to false
+ * - multiline property is set to false
+ * - lastIndex property is set to 0
+ */
+
+RegExp.prototype.getClassProperty = Object.prototype.toString;
+var re = new RegExp();
+
+AddTestCase(
+  "RegExp.prototype.getClassProperty = Object.prototype.toString; " +
+  "(new RegExp()).getClassProperty()",
+  "[object RegExp]",
+  re.getClassProperty() );
+
+AddTestCase(
+  "(new RegExp()).source",
+  "(?:)",
+  re.source );
+
+AddTestCase(
+  "(new RegExp()).global",
+  false,
+  re.global );
+
+AddTestCase(
+  "(new RegExp()).ignoreCase",
+  false,
+  re.ignoreCase );
+
+AddTestCase(
+  "(new RegExp()).multiline",
+  false,
+  re.multiline );
+
+AddTestCase(
+  "(new RegExp()).lastIndex",
+  0,
+  re.lastIndex );
+
+test()
new file mode 100644
index 0000000000000000000000000000000000000000..42a4e4ea86125a2fd42dc70541e2580dbfd6b59e
GIT binary patch
literal 24948
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/exec-002.js
@@ -0,0 +1,188 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/exec-002.js
+ *  ECMA Section:       15.7.5.3
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Test cases provided by rogerl@netscape.com
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/exec-002";
+var VERSION = "ECMA_2";
+var TITLE   = "RegExp.prototype.exec(string)";
+
+startTest();
+
+/*
+ * for each test case, verify:
+ * - type of object returned
+ * - length of the returned array
+ * - value of lastIndex
+ * - value of index
+ * - value of input
+ * - value of the array indices
+ */
+
+AddRegExpCases(
+  /(a|d|q|)x/i,
+  "bcaDxqy",
+  3,
+  ["Dx", "D"] );
+
+AddRegExpCases(
+  /(a|(e|q))(x|y)/,
+  "bcaddxqy",
+  6,
+  ["qy","q","q","y"] );
+
+
+AddRegExpCases(
+  /a+b+d/,
+  "aabbeeaabbs",
+  0,
+  null );
+
+AddRegExpCases(
+  /a*b/,
+  "aaadaabaaa",
+  4,
+  ["aab"] );
+
+AddRegExpCases(
+  /a*b/,
+  "dddb",
+  3,
+  ["b"] );
+
+AddRegExpCases(
+  /a*b/,
+  "xxx",
+  0,
+  null );
+
+AddRegExpCases(
+  /x\d\dy/,
+  "abcx45ysss235",
+  3,
+  ["x45y"] );
+
+AddRegExpCases(
+  /[^abc]def[abc]+/,
+  "abxdefbb",
+  2,
+  ["xdefbb"] );
+
+AddRegExpCases(
+  /(a*)baa/,
+  "ccdaaabaxaabaa",
+  9,
+  ["aabaa", "aa"] );
+
+AddRegExpCases(
+  /(a*)baa/,
+  "aabaa",
+  0,
+  ["aabaa", "aa"] );
+
+AddRegExpCases(
+  /q(a|b)*q/,
+  "xxqababqyy",
+  2,
+  ["qababq", "b"] );
+
+AddRegExpCases(
+  /(a(.|[^d])c)*/,
+  "adcaxc",
+  0,
+  ["adcaxc", "axc", "x"] );
+
+AddRegExpCases(
+  /(a*)b\1/,
+  "abaaaxaabaayy",
+  0,
+  ["aba", "a"] );
+
+AddRegExpCases(
+  /(a*)b\1/,
+  "abaaaxaabaayy",
+  0,
+  ["aba", "a"] );
+
+AddRegExpCases(
+  /(a*)b\1/,
+  "cccdaaabaxaabaayy",
+  6,
+  ["aba", "a"] );
+
+AddRegExpCases(
+  /(a*)b\1/,
+  "cccdaaabqxaabaayy",
+  7,
+  ["b", ""] );
+
+AddRegExpCases(
+  /"(.|[^"\\\\])*"/,
+        'xx\"makudonarudo\"yy',
+        2,
+        ["\"makudonarudo\"", "o"] );
+
+    AddRegExpCases(
+        /"(.|[^"\\\\])*"/,
+	      "xx\"ma\"yy",
+	      2,
+	      ["\"ma\"", "a"] );
+
+	   test();
+
+	   function AddRegExpCases(
+	     regexp, pattern, index, matches_array ) {
+
+// prevent a runtime error
+
+	     if ( regexp.exec(pattern) == null || matches_array == null ) {
+	       AddTestCase(
+		 regexp + ".exec(" + pattern +")",
+		 matches_array,
+		 regexp.exec(pattern) );
+
+	       return;
+	     }
+	     AddTestCase(
+	       regexp + ".exec(" + pattern +").length",
+	       matches_array.length,
+	       regexp.exec(pattern).length );
+
+	     AddTestCase(
+	       regexp + ".exec(" + pattern +").index",
+	       index,
+	       regexp.exec(pattern).index );
+
+	     AddTestCase(
+	       regexp + ".exec(" + pattern +").input",
+	       pattern,
+	       regexp.exec(pattern).input );
+
+	     AddTestCase(
+	       regexp + ".exec(" + pattern +").toString()",
+	       matches_array.toString(),
+	       regexp.exec(pattern).toString() );
+/*
+  var limit = matches_array.length > regexp.exec(pattern).length
+  ? matches_array.length
+  : regexp.exec(pattern).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+  AddTestCase(
+  regexp + ".exec(" + pattern +")[" + matches +"]",
+  matches_array[matches],
+  regexp.exec(pattern)[matches] );
+  }
+*/
+	   }
new file mode 100644
index 0000000000000000000000000000000000000000..4a264017dfbb55e039927dfa80fb5f872f79cde2
GIT binary patch
literal 19721
zc%1E9-E!MR6y79F0+hdj7w`?!W;$)!4i{WF0oOH<p$(llbogsC8|lPeDobW}o!T>b
z2nODWXW*J==mo=Y$sWnEWqD;w*2=MC<;M1|_U!rn&e85kS$5hE?3bHB?ftsNSzD3~
zLWr=uHV~U}up~PNL4>3dTHs1S%Dev4<?zyq5Wpqa&nd6_OK&J54s@AC9jEsgEQfNi
z4{1x0I;VVez@ly08T@Ke@z~$Dc21qaW)2f_ABo~$dDs6L4EEFjPLze@%x&zyufA7o
z`v@AfZo5hai1KcK>hh6o^+>%|JwEvMaBOZ<%^e>cKdEU~J+B?rM^=S7iLj?W`znfO
z{`?z4-o?SNGL;e;J#`?^5|zwz$+~*z6?1K3_Xj;bv_zj7G@MfIkU4*g|J3N(v@JaD
z?{KPiP%8;@nbg|(QSiWltvrF9G2lLFR~atKj8?~&3JH^Z!X$9&)cr@4$v6ms60iBv
zIGr)dXyCxQYP@^*{{08z8w@@JUF-HWtK~OWr{!^<G@<1!HBqZRt(-hu0PU96u0*>U
zEHI+m&jub`YE!8eyP_nURF*8ym6W-quMs(wmRO5AHKFhk>hNm^Tq_J_DXcMMs(y*%
zK6fx=R;Q_|0`HJKs9nT!077}A6Q2!+s*Pwvr{uRW-AKyiF$g&>ofbQzqA!cAlXBCD
zz!(SHQHMW-*ST}JHE_)s&c4?HUFrzHiHgRR<6SuQ79XL6@VXR8bNklM-A^Cf+A$o-
zF>=g_=Ap7WXVxU5LEOCg+z1&$v}7ur(_UmXIFV{`?#{C+P*Gi2sQAH%wUPOXt_U%R
z6(4J`;-PV{h?8VqM3)XO=ITJJf)_<;kvZl*h`>c<De4L=q7m4xCsq`tg?Xs>qJWCU
zhl*UPip@S&T+_m$0E^;1WR^I4+07R%K8&En%dT;_z$zedVCO`3h4Es#1FZ^P>@6%_
z6vahxWO4OKaqTM$Oc~P5ozIsY*TO5t@NFYv3lkO5b1n7x6}S-G5w_I>El>st8Wm1G
zyBB=(dGu$6KRWabZL7nxQ95{WIUt>~ui+oH_AQdCg#in6=GxF5n?ZPUz-`Fp*wlM!
zszs&M1aU&qrL{c{{VPc=VGa!l<7WT!Cc!&AeiFCzo&J1ud7|zKo${}s&!lu2*&$W+
zm6<`H<d@M&66;7zc)UfOftLzDiWLwk?^cm1M<qU5*CgZQyy;vco3ybWlZmR<y|a;w
zb^UB)by1v+q6RUt5uAV~kqi~4e{$GyoPJyc<dOjUBgA8L;K?m%@zMM5CxmQ99sJ;I
zm=!nr*@#%4EBs~)NvMM+RZqnAkx(A43Xp`tq#(^Wa3%?7ji%I<KNlB6WtpP6x2LB$
zYcfaOFzYF_PDj!?uJ=xVQC1*rj;zUE_F7;PfP~5g=z<kfF8rt~yi)Nn5gewM?daE`
zU6Oiu9u`j}c7ia@CaqR#$FpAft`u~dPH8WV2MymW7b>#Xqqbk<()VVN%dz7LGkJ_l
z-&HQZp-IX!`3tgg$1Lc~mt-mhrzsz1YK^>yP;@)K880UkGQmDhXwC^TbDk1NinL@t
zEhTtWJ_7X)lnxT7muwTVW4d~8`9b@S0<>2Tw5PrV8W91Hh<5J9y%lB_BIzq<MgT5w
z-#qRou;7v(7AFJW-wN<8z&9W8-S)vZ<^V0T3<(eC3g}%_=$&A|l|bI#3*;@3H(%s!
zcQjYU`JT5F*t<N~t9OqCy#pQ}g6<8U6qCVKP^WF<<xjX7U}UM;e{%j?r@Q(53;Fmx
zc6{K@(o2)zoG1$lmkpqBVl~V&AQK#^CVBPKNb#NT+7Wd#@r=V6>kjqqe^JhSY1r`X
z)18>)S5X8TE{4;wf;Ny@eK7y~qd&Jbk+=Lc*<V{lO}1<#i^|bp<%q$z^HWYmV=BCw
s>5}e6GTK$IrD`9rC#9q*pq1x6U%rYpAbe4o=i47+-T`8&`Ygl$15QL*v;Y7A
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/hex-001.js
@@ -0,0 +1,68 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/hex-001.js
+ *  ECMA Section:       15.7.3.1
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *  Positive test cases for constructing a RegExp object
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/hex-001";
+var VERSION = "ECMA_2";
+var TITLE   = "RegExp patterns that contain HexicdecimalEscapeSequences";
+
+startTest();
+
+// These examples come from 15.7.1, HexidecimalEscapeSequence
+
+AddRegExpCases( new RegExp("\x41"),  "new RegExp('\\x41')",  "A",  "A", 1, 0, ["A"] );
+AddRegExpCases( new RegExp("\x412"),"new RegExp('\\x412')", "A2", "A2", 1, 0, ["A2"] );
+
+AddRegExpCases( new RegExp("A"),  "new RegExp('A')",  "\x41",  "\\x41",  1, 0, ["A"] );
+AddRegExpCases( new RegExp("A"),  "new RegExp('A')",  "\x412", "\\x412", 1, 0, ["A"] );
+AddRegExpCases( new RegExp("^x"), "new RegExp('^x')", "x412",  "x412",   1, 0, ["x"]);
+AddRegExpCases( new RegExp("A"),  "new RegExp('A')",  "A2",    "A2",     1, 0, ["A"] );
+
+test();
+
+function AddRegExpCases(
+  regexp, str_regexp, pattern, str_pattern, length, index, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(pattern) == null || matches_array == null ) {
+    AddTestCase(
+      str_regexp + ".exec(" + pattern +")",
+      matches_array,
+      regexp.exec(pattern) );
+
+    return;
+  }
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").length",
+    length,
+    regexp.exec(pattern).length );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").index",
+    index,
+    regexp.exec(pattern).index );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").input",
+    pattern,
+    regexp.exec(pattern).input );
+
+  for ( var matches = 0; matches < matches_array.length; matches++ ) {
+    AddTestCase(
+      str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+      matches_array[matches],
+      regexp.exec(pattern)[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..522adf5f6d510a214b9b18a11ef5a21bdd7e5cb9
GIT binary patch
literal 16362
zc%1E9Pj4GV6yG#S11@kvNN~yl2||^mv>X7rk(|_2ks7y(lO8BlG~ONCL&m$y%s8>7
zegZxM-=SwDJ_DbD8&`zjj(9V>w%5C}&Te+Mw$ts!&dl!n|9<by8@DR@F2#G*E=JZ~
z(`3XI#;Rc$+;m)QScG9ykPFNWE|9=IYzuBwch%F?;Hx#xF%#H&j#yK@x&}lj9uN~z
zI(&ppiWs&Us0XAj5Sv~wkt_P+zq*J&Qhe(dh>n?2!o{8>D*sh?)t}ztudr}iE^@($
z-P!v9zSk`47<cLe_W*IstGoWz=#h8fk^R%hjnkw3`f+4;19qGBgOkIjjmX|Q?42B*
zJgIBndR{+n>fX8odzX%5x!63%EFe!%kC1Zk=^Hp+^^f-qqaqiBt^gMh)S}q4F%rbF
zja%^0Ik7Fn@)sR8@uM${bUV0aBAjCJAFQri#lm5VLkl>-n+CCo&_>C=_rReAaYWh#
zGez14w}*w%`e0;`Ajv00V1{T@JpvAAm~*M|iqeMmBa}ac4KFr!dwnVhB{tr^ckjz6
zoAIY-aUJ)3ZT<KBY#oW*Tx>1VvVL$>JG;LC)}2!%YY-zB+kP~T<8L>|fxOwKsIvgJ
z{%1b6j=}ZZV)?;W55Bo3QcPGhN0n6Z!V}gy-4CFA2Beerk`)zW1F=p&z8+7E71Axv
zY*62sIKf;*wbRz0u<FId(qAiciKY0Ot<f0BA~p<|TB-tVkS7_%ZDBCd>54ED$^7nw
zbfy6P8aBv<!-m@}0uf?WEa%c5R=S9=VFj5EvnxYPsdKsAf)9eNO^#gNm)ccw&XrH3
zO&un>nAreHMDcJ5#Sr<HhS?3tqgkEjR5JYu{MW)E?OWM<J0z=%1Z>)dg!f3=NMzdi
z;>Gagr;)}}O4^(4+*BH-N{Z{+TsoGRN4VFTl1aYrw0?wxf#EWlTVj~qWmhT`=#c<A
z@Zf1X#-~5%N?z*Bk==sITTPP0Cq<1hGz^i)G;~~>i<Akf#f`}5e~ZXytIX(mX0(}0
zuDlm2%LOI&oP=HS{FW&z@@aa%>)WR6bc0Q=iZNc}L)(PU$Jq88LKhzBVepMND{DE{
z(EFxjRJ&ZQj^qvbbu?{zHce+$;flYMa<ujfyenZn#T0FQltGc5_a#UnVRkV;Lo$T5
z(=s0dBYP74816uPq#Tqj$Ut&)l!^geeQRV;DEY}HNzs~$T!-}#9mf(^xdzAqF$no1
zrZsM^XbN3&*|fgRq^&lRvXRsTb~b`D@*xDILHcKnKBazOc;u4c&%T5W>A~5<`}pvE
z{h5yhQ>faWfcL5onuh7v9RJjpYlun*z!Pz&?rR;7r5dkZ>CeYmXg++Xr@0LM&8!Rx
zR5d)nW=vK4Ue_w5l3`}f&1h%*eniG~fJ@Q{FT&%g)J~Ab*|gPaO&#-Gg_3tCcg00q
zJZLDl3?Q>_g?+!s9oikQn90ecEM+kvy#*n^s;NqO59OAFWNvtpd0@UHVd(StfnPxg
zl!y3oW2*qkQ-VlYlJYM}2~Kmz7!CmG;PC2pZAN8G*Xu1mV83230sF=!`8)Dp;CK+5
za-#A!R~l)ytsRQ(j_4+1@h1JApk4*s5T`|s(%+C|S*VJbz=KOZ=}lIaYGqlvd6`z0
zrE7`5p~_Os95l2131_Tjtyt7rF~fmxMXC6?966OEr(zJ-?Q1Tii<Q5`+~vVseRw4J
zg@VH-V7sPB5#inB^<7Ke-35PgP~b0m|Ipd)&HO)y=skRV;x-^y88K&Nt}*T#laKnc
zpl>w?^i6Dr<(o3-v^Z6v9WpoJ&lql#!Nl(B3k37XvBAs3yD>$t1_V2{Os5loHY~En
zVDZ;~zintTZ~1$%-*1<_*s_r<JH{Numr1wvq9D;z;ncP6S6?Qhec<$<=fT#jQgj7a
b6?sKltYLFdzU;`0{aI7~0T9#8XIcIq!Tuok
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/multiline-001.js
@@ -0,0 +1,68 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/multiline-001.js
+ *  ECMA Section:
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Date:               19 February 1999
+ */
+
+var SECTION = "RegExp/multiline-001";
+var VERSION = "ECMA_2";
+var TITLE   = "RegExp: multiline flag";
+var BUGNUMBER="343901";
+
+startTest();
+
+var woodpeckers = "ivory-billed\ndowny\nhairy\nacorn\nyellow-bellied sapsucker\n" +
+  "northern flicker\npileated\n";
+
+AddRegExpCases( /.*[y]$/m, woodpeckers, woodpeckers.indexOf("downy"), ["downy"] );
+
+AddRegExpCases( /.*[d]$/m, woodpeckers, woodpeckers.indexOf("ivory-billed"), ["ivory-billed"] );
+
+test();
+
+
+function AddRegExpCases
+( regexp, pattern, index, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(pattern) == null || matches_array == null ) {
+    AddTestCase(
+      regexp + ".exec(" + pattern +")",
+      matches_array,
+      regexp.exec(pattern) );
+
+    return;
+  }
+
+  AddTestCase(
+    regexp.toString() + ".exec(" + pattern +").length",
+    matches_array.length,
+    regexp.exec(pattern).length );
+
+  AddTestCase(
+    regexp.toString() + ".exec(" + pattern +").index",
+    index,
+    regexp.exec(pattern).index );
+
+  AddTestCase(
+    regexp + ".exec(" + pattern +").input",
+    pattern,
+    regexp.exec(pattern).input );
+
+
+  for ( var matches = 0; matches < matches_array.length; matches++ ) {
+    AddTestCase(
+      regexp + ".exec(" + pattern +")[" + matches +"]",
+      matches_array[matches],
+      regexp.exec(pattern)[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..19edaff006a0bc86d3b826612145e47a141ee8df
GIT binary patch
literal 13126
zc%1E8-EP}97**<}+1hP4yV_lHmtcrhZ$p6&PF5%Nx&Vzk#Az>v0R}BGHd|U!Nh*th
zJj5_y*i&qeu=m(o>;X1lA1TF_B}$Paxv>%T#xZ|Bem{rjkaU~E_bA?P4l%O#yA~s!
zFlvTjaLe_uVH1WeLC!HZxIhArup_w9G}Y*4bZU!p%mlVyBi2<@KL8^XUl0pXI(~*N
ziWs&#XauIt5u0tWkSF}fw;|%s)Vl3+L???;!o|KcD*rW2^)+bx9U9hUBNvP~gZ)q8
z@0M+!;6eMsJ477wrWtl!4fzO$9K3qod3AiyK1uX$KySBwczX1*ljxHRogSUOXlrM^
zZl82#W<~vsIS-#<0@FkLtzj4+%EoA_A;kpsDGqXo1aTeX9t?U*9NVzNMwd<N6gnfz
z3aOtur<V8+TGy^y!ewfOKCA#U4dM`?MZrNZ;K&A?kTZgrGVMTF<IZSve3g)>$rnUm
zhG<s}fr2v3xr}&CMMM3B<<FoasJ-c00@2+^j~ewiJh{r`Gf22@@p4oB&+Vl;3CuE5
zeIGj7hsUknmrIb{&)04xyBb0$CAW<Uj5j?bV6wwE#Sn>2%XI`I&gM%A?luSR#9jQ(
z$Bu=U0pzz-h7?9Gr4+l+F%-i4#x$iY`rPdM1MX2IOg?mf?!mXZH6Y&-d+)2SA2*&n
zzEK&bo^-FIR=I?y9_mtb2>KccLZ($pF2)9813z7`r#X$KAT7Ia0AS)2bCHZrD`4@^
zS0&c0<HJnAf5H0q<46y|70izL8t!A`jG{qeH%T7ZuJ8QRNE|GJq?U?kDG8=p%`Dln
zM8Wq*TU#ZYtp#RtS?vH47_qX<hERQ~HPd1YjbpPhjh%fJ0{(!WdnpLWADgsLdctIf
z#%6qPuJ%@yU=!sq(s#aNN#%=*pxh;dxA@qx;PW|la3EbC3>aZ3NO05XyY@KvOZljJ
zxoVxlO?y}RVb)GfQAF4@=f&u6n7c9G9Y_)m$Sb}`^n3z6BP6UL<~<}ggZ8cyvRR@}
zQX<0xz(=C%p^_2SOPl&2?2k{+b&HB-xYzM14Tl9;(v8Z0y2zsmGiY+z2+>J>xxzne
zVZa4oTFlnY(CJ8i-*ovd7Hw)73R%@+rkKf8JQXvm*%`$QW^AY!6XyeQ7J(f|-jQ(2
ze!EG3b9k^7KBvsk^4XOAYa#0za1-I`<{=D3WdUGB+A$unsH930KzRY3QhX*1Mg~Kn
zQ^w27X|l?)xwogcc~jAnxgpju9`$ErOU`%uZ=ec>$E0gwTwL?AwtGYt@ddV0WbsGc
zGsIjzWNzh*E6(JAHk0PO2wz0S=L$Q=HZB&eHfrixZxxh+C)sP>Vbe)NmF03>b7EcQ
zBi_S6dF8!R>TU|8cLDM>jfCC^FVdAS$|armYqB&xDf~ECmo&7U{v1*W7MaRl+9hgd
z0p8C^B$X_cFH1SDgeMs8Uh`4n^+&c0b)4_KxB8_0Z$;WSP4GN7w7W>$@;B3+I>pXF
z4D&7VKDjan{YOfX7Db8PR{~SMz~rdliod?*WBFeymakZTF)Y8KSU%;Yu5b)FUjZxX
zT~_MNDBzu7-d`)`t(bSQ%<K7@-(CyHko%XSihGxvd-d?R3*7tXdd0mJ_b!BcKUUl;
q++fCb&iCn6;JW<pBJzFbDg$%==bt4=$|}@iMRlhDFj90WSM&cbyzdPF
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-001.js
@@ -0,0 +1,78 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/octal-001.js
+ *  ECMA Section:       15.7.1
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *  Simple test cases for matching OctalEscapeSequences.
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/octal-001.js";
+var VERSION = "ECMA_2";
+var TITLE   = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346196";
+
+startTest();
+
+
+// backreference
+AddRegExpCases(
+  /(.)\1/,
+  "/(.)\\1/",
+  "HI!!",
+  "HI!",
+  2,
+  ["!!", "!"] );
+
+test();
+
+function AddRegExpCases(
+  regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(pattern) == null || matches_array == null ) {
+    AddTestCase(
+      regexp + ".exec(" + str_pattern +")",
+      matches_array,
+      regexp.exec(pattern) );
+
+    return;
+  }
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").length",
+    matches_array.length,
+    regexp.exec(pattern).length );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").index",
+    index,
+    regexp.exec(pattern).index );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").input",
+    pattern,
+    regexp.exec(pattern).input );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").toString()",
+    matches_array.toString(),
+    regexp.exec(pattern).toString() );
+/*
+  var limit = matches_array.length > regexp.exec(pattern).length
+  ? matches_array.length
+  : regexp.exec(pattern).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+  AddTestCase(
+  str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+  matches_array[matches],
+  regexp.exec(pattern)[matches] );
+  }
+*/
+}
new file mode 100644
index 0000000000000000000000000000000000000000..8ea72e599de7de957add3440852377c271eeac9a
GIT binary patch
literal 17150
zc%1E8+iu)M7@jn=C24^Rt^k3;T`H7pTM%l|CTNo`Riq|`Y|;ya6wTU`-DziSGcy|!
zDG!0T;Q_eeiud6ycmR<2XYA~H?XlyHy&Jo6w2F7<@Xvpm@0)|0a_BL#+3XW+Z+0wB
zJ&6_(Lc(%Af^5o(CFuzfNJuQnfH+d1W<$4bhP$?eAY2mr73Lk?^&Jqx$SJijV`tBZ
z#V{xK9v*<G6U-+IEbPhQ=vN<$XL{WB31*|g7!`6;2~~g1hW_an{tgAVRiTiaI=#*J
z;d{%r_ermP>TP2|M6(f8T{KyOCR>Nk_YQZr+WWEEyHML{Zy)Tu+>6zzfev;KUbKz9
zUbXi-6TQNEMwEwV;J{?lc3TK7tHQ9W!NnAJ8S#CHC3PKi3mUzlj*aY~(B<Pe1<I(f
zg6qf1=^_4u(uK>0aJe3#3nM^JL>(%PS+M0d*s&o`=rJW+i*_KaQDuxizHmrb<O?bZ
z$E>59KtMSWLRq|^tzpBM<PV|3kA1_nBxY+5A3k1xE#jk$p1#9PgBR=Sf3DBf@x&~`
z)pwwxy}jEydRzkUezb5c-ZcP1A-;VyO5+s|OX%!~71_sf#c~~qsk8D@C3jl@c9IVH
zc}N_Klp)ElDGUjSUPvg`prS9O_f4arXmKbS-C<9749kY-yT2U4uXU?OzoquZmtTGT
z=*iP7g<-5o=YndrN@T2|$wk}1uOTCpTNULJf-vt5lL>q5(})X_ybB8eE)R&1aqEl(
z7B#&pwx%r~CJg=orv9C1rU%L8_m1cq%wu%Sa4$BSK86OX>ko{dpPs~48@{ItP4iEn
zqLD>~LPq-lDlqPLEeop$Jgt(9um_pMsg*Va8s)k{Op9}T7U@k`WbN!P0Rcjn5;7>e
zol9Xm3-+O^sEW*PMPwG8=d+SIr?^My;)bxtABD2Vrzz~A(EI826Nq6|lxwv6A=p#@
z%OHM!)N#0II2oAQ$mIzmtBWC}#QB;#$}iIpqZ`Ucf6kSU=CYyrERBz5v8Q=245zqw
zPP&@>N|RDmfTSj+^2@An+}|!zQb&cdn3KfshK{99tiy-b>cWGHmN;`Pcs?f%@sFH6
zXfPlU5dVg<>)L1jH?5<t6}of`i^e<7?<eIfYBCIpro7Pn8~Q4Br?|UR7Y@|1$!V-c
z(Zc{st53ucR-kRXqYQXER;S3HlOE(ptm+<8$G`k2sq1o3AMKv$_A~6^qrD+xK{MY=
zrdHW+1+uJuCbG%p1I$M86*~W63PWB%PRq&Ismj=jDZ6eaf9JC{F$}q+8gnL}$i#fg
zC)O}C@(E0tP!S}~mc(fQwxw`KrCa(t7s>AmEPo!n1~CE4$7A$g3{V$Yt|Rn~p+uOe
z06>eR>o?59OFtz7AkT+WMvf)owAYtWzbP}$&&SRxO6JCfS>{zqOZkRcyJXOvpe@zk
z?Y@R6Adf56<XL{sOPlT?S|q2$u=LRZ{t+2&R;SV-bt<P^O^!Aa6K>9$;j@VNRAy(G
z#`&x@TFqSRjZP*1RjNzgpGpP|9hP&L*|(yxFY^-bp3l7MzF6^YLQ1be$}buy^h)`n
zRQaM<(3!8u!tf;54nzrFS1`1i{2D{9v`A(C!ZuM4W}y9)KvL6E@wAj-OSn&9?=>AH
zUcO{YVaMs#d({W+e{0abs)MK5q1{B_epdnaIwMX`_OlH!Ppr%U|DjMMSy7<&HNg~5
zFc~6P@zd9ADF17X@-@oO2IcQ+lutOR%WXr(Q@|Q}%L=_I0lX2&`&*5?HS*3DdA*_G
z?lrd!nQw|}>@7F;n$zPZVDDeIYwWGDcP7|-Ut_Oy{T{0s&!?+^b=l8F)cMYZ2c~@a
Vrvy%^LM$rEJ2?^~ftNBB{||;|5a0j+
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-002.js
@@ -0,0 +1,93 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/octal-002.js
+ *  ECMA Section:       15.7.1
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *  Simple test cases for matching OctalEscapeSequences.
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/octal-002.js";
+var VERSION = "ECMA_2";
+var TITLE   = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346189";
+
+startTest();
+
+// backreference
+AddRegExpCases(
+  /(.)(.)(.)(.)(.)(.)(.)(.)\8/,
+  "/(.)(.)(.)(.)(.)(.)(.)(.)\\8",
+  "aabbccaaabbbccc",
+  "aabbccaaabbbccc",
+  0,
+  ["aabbccaaa", "a", "a", "b", "b", "c", "c", "a", "a"] );
+
+AddRegExpCases(
+  /(.)(.)(.)(.)(.)(.)(.)(.)(.)\9/,
+  "/(.)(.)(.)(.)(.)(.)(.)(.)\\9",
+  "aabbccaabbcc",
+  "aabbccaabbcc",
+  0,
+  ["aabbccaabb", "a", "a", "b", "b", "c", "c", "a", "a", "b"] );
+
+AddRegExpCases(
+  /(.)(.)(.)(.)(.)(.)(.)(.)(.)\8/,
+  "/(.)(.)(.)(.)(.)(.)(.)(.)(.)\\8",
+  "aabbccaababcc",
+  "aabbccaababcc",
+  0,
+  ["aabbccaaba", "a", "a", "b", "b", "c", "c", "a", "a", "b"] );
+
+test();
+
+function AddRegExpCases(
+  regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(pattern) == null || matches_array == null ) {
+    AddTestCase(
+      regexp + ".exec(" + str_pattern +")",
+      matches_array,
+      regexp.exec(pattern) );
+
+    return;
+  }
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").length",
+    matches_array.length,
+    regexp.exec(pattern).length );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").index",
+    index,
+    regexp.exec(pattern).index );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").input",
+    pattern,
+    regexp.exec(pattern).input );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").toString()",
+    matches_array.toString(),
+    regexp.exec(pattern).toString() );
+/*
+  var limit = matches_array.length > regexp.exec(pattern).length
+  ? matches_array.length
+  : regexp.exec(pattern).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+  AddTestCase(
+  str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+  matches_array[matches],
+  regexp.exec(pattern)[matches] );
+  }
+*/
+}
new file mode 100644
index 0000000000000000000000000000000000000000..2d68f8010b81cbc23b401fbdaa5ea6faac1f782f
GIT binary patch
literal 19077
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/octal-003.js
@@ -0,0 +1,87 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/octal-003.js
+ *  ECMA Section:       15.7.1
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *  Simple test cases for matching OctalEscapeSequences.
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ *
+ *  Revised:            02 August 2002
+ *  Author:             pschwartau@netscape.com
+ *
+ *  WHY:  the original test expected the regexp /.\011/
+ *        to match 'a' + String.fromCharCode(0) + '11'
+ *
+ *  This is incorrect: the string is a 4-character string consisting of
+ *  the characters <'a'>, <nul>, <'1'>, <'1'>. By contrast, the \011 in the
+ *  regexp should be parsed as a single token: it is the octal escape sequence
+ *  for the horizontal tab character '\t' === '\u0009' === '\x09' === '\011'.
+ *
+ *  So the regexp consists of 2 characters: <any-character>, <'\t'>.
+ *  There is no match between the regexp and the string.
+ *
+ *  See the testcase ecma_3/RegExp/octal-002.js for an elaboration.
+ *
+ */
+var SECTION = "RegExp/octal-003.js";
+var VERSION = "ECMA_2";
+var TITLE   = "RegExp patterns that contain OctalEscapeSequences";
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=346132";
+
+startTest();
+
+AddRegExpCases( /.\011/, "/\\011/", "a" + String.fromCharCode(0) + "11", "a\\011", 0, null );
+
+test();
+
+function AddRegExpCases(
+  regexp, str_regexp, pattern, str_pattern, index, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(pattern) == null || matches_array == null ) {
+    AddTestCase(
+      regexp + ".exec(" + str_pattern +")",
+      matches_array,
+      regexp.exec(pattern) );
+
+    return;
+  }
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").length",
+    matches_array.length,
+    regexp.exec(pattern).length );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").index",
+    index,
+    regexp.exec(pattern).index );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").input",
+    escape(pattern),
+    escape(regexp.exec(pattern).input) );
+
+  AddTestCase(
+    str_regexp + ".exec(" + str_pattern +").toString()",
+    matches_array.toString(),
+    escape(regexp.exec(pattern).toString()) );
+
+  var limit = matches_array.length > regexp.exec(pattern).length
+    ? matches_array.length
+    : regexp.exec(pattern).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+    AddTestCase(
+      str_regexp + ".exec(" + str_pattern +")[" + matches +"]",
+      matches_array[matches],
+      escape(regexp.exec(pattern)[matches]) );
+  }
+
+}
new file mode 100644
index 0000000000000000000000000000000000000000..d9bcc20b445d4026d5f0ab7d22cef47ef2a0a92d
GIT binary patch
literal 24285
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
O1j8Suh8+G#hyMrog=f(K
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/properties-001.js
@@ -0,0 +1,91 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/properties-001.js
+ *  ECMA Section:       15.7.6.js
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/properties-001.js";
+var VERSION = "ECMA_2";
+var TITLE   = "Properties of RegExp Instances";
+var BUGNUMBER ="";
+
+startTest();
+
+AddRegExpCases( new RegExp, "(?:)",   false, false, false, 0 );
+AddRegExpCases( /.*/,       ".*", false, false, false, 0 );
+AddRegExpCases( /[\d]{5}/g, "[\\d]{5}", true, false, false, 0 );
+AddRegExpCases( /[\S]?$/i,  "[\\S]?$", false, true, false, 0 );
+AddRegExpCases( /^([a-z]*)[^\w\s\f\n\r]+/m,  "^([a-z]*)[^\\w\\s\\f\\n\\r]+", false, false, true, 0 );
+AddRegExpCases( /[\D]{1,5}[\ -][\d]/gi,      "[\\D]{1,5}[\\ -][\\d]", true, true, false, 0 );
+AddRegExpCases( /[a-zA-Z0-9]*/gm, "[a-zA-Z0-9]*", true, false, true, 0 );
+AddRegExpCases( /x|y|z/gim, "x|y|z", true, true, true, 0 );
+
+AddRegExpCases( /\u0051/im, "\\u0051", false, true, true, 0 );
+AddRegExpCases( /\x45/gm, "\\x45", true, false, true, 0 );
+AddRegExpCases( /\097/gi, "\\097", true, true, false, 0 );
+
+test();
+
+function AddRegExpCases( re, s, g, i, m, l ) {
+
+  AddTestCase( re + ".test == RegExp.prototype.test",
+	       true,
+	       re.test == RegExp.prototype.test );
+
+  AddTestCase( re + ".toString == RegExp.prototype.toString",
+	       true,
+	       re.toString == RegExp.prototype.toString );
+
+  AddTestCase( re + ".contructor == RegExp.prototype.constructor",
+	       true,
+	       re.constructor == RegExp.prototype.constructor );
+
+  AddTestCase( re + ".compile == RegExp.prototype.compile",
+	       true,
+	       re.compile == RegExp.prototype.compile );
+
+  AddTestCase( re + ".exec == RegExp.prototype.exec",
+	       true,
+	       re.exec == RegExp.prototype.exec );
+
+  // properties
+
+  AddTestCase( re + ".source",
+	       s,
+	       re.source );
+
+/*
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=225550 changed
+ * the behavior of toString() and toSource() on empty regexps.
+ * So branch if |s| is the empty string -
+ */
+  var S = s? s : '(?:)';
+
+  AddTestCase( re + ".toString()",
+	       "/" + S +"/" + (g?"g":"") + (i?"i":"") +(m?"m":""),
+	       re.toString() );
+
+  AddTestCase( re + ".global",
+	       g,
+	       re.global );
+
+  AddTestCase( re + ".ignoreCase",
+	       i,
+	       re.ignoreCase );
+
+  AddTestCase( re + ".multiline",
+	       m,
+	       re.multiline);
+
+  AddTestCase( re + ".lastIndex",
+	       l,
+	       re.lastIndex  );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..6016a0975a339e38ec83da0d647fa32271f9e893
GIT binary patch
literal 37553
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
WrA`a@1rnmf;7{|0<ZJILm;VP!r=Ow#
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/properties-002.js
@@ -0,0 +1,129 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/properties-002.js
+ *  ECMA Section:       15.7.6.js
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+//-----------------------------------------------------------------------------
+var SECTION = "RegExp/properties-002.js";
+var VERSION = "ECMA_2";
+var TITLE   = "Properties of RegExp Instances";
+var BUGNUMBER ="124339";
+
+startTest();
+
+re_1 = /\cA?/g;
+re_1.lastIndex = Math.pow(2,31);
+AddRegExpCases( re_1, "\\cA?", true, false, false, Math.pow(2,31) );
+
+re_2 = /\w*/i;
+re_2.lastIndex = Math.pow(2,32) -1;
+AddRegExpCases( re_2, "\\w*", false, true, false, Math.pow(2,32)-1 );
+
+re_3 = /\*{0,80}/m;
+re_3.lastIndex = Math.pow(2,31) -1;
+AddRegExpCases( re_3, "\\*{0,80}", false, false, true, Math.pow(2,31) -1 );
+
+re_4 = /^./gim;
+re_4.lastIndex = Math.pow(2,30) -1;
+AddRegExpCases( re_4, "^.", true, true, true, Math.pow(2,30) -1 );
+
+re_5 = /\B/;
+re_5.lastIndex = Math.pow(2,30);
+AddRegExpCases( re_5, "\\B", false, false, false, Math.pow(2,30) );
+
+/*
+ * Brendan: "need to test cases Math.pow(2,32) and greater to see
+ * whether they round-trip." Reason: thanks to the work done in
+ * http://bugzilla.mozilla.org/show_bug.cgi?id=124339, lastIndex
+ * is now stored as a double instead of a uint32_t (unsigned integer).
+ *
+ * Note 2^32 -1 is the upper bound for uint32's, but doubles can go
+ * all the way up to Number.MAX_VALUE. So that's why we need cases
+ * between those two numbers.
+ *
+ */
+re_6 = /\B/;
+re_6.lastIndex = Math.pow(2,32);
+AddRegExpCases( re_6, "\\B", false, false, false, Math.pow(2,32) );
+
+re_7 = /\B/;
+re_7.lastIndex = Math.pow(2,32) + 1;
+AddRegExpCases( re_7, "\\B", false, false, false, Math.pow(2,32) + 1 );
+
+re_8 = /\B/;
+re_8.lastIndex = Math.pow(2,32) * 2;
+AddRegExpCases( re_8, "\\B", false, false, false, Math.pow(2,32) * 2 );
+
+re_9 = /\B/;
+re_9.lastIndex = Math.pow(2,40);
+AddRegExpCases( re_9, "\\B", false, false, false, Math.pow(2,40) );
+
+re_10 = /\B/;
+re_10.lastIndex = Number.MAX_VALUE;
+AddRegExpCases( re_10, "\\B", false, false, false, Number.MAX_VALUE );
+
+
+
+//-----------------------------------------------------------------------------
+test();
+//-----------------------------------------------------------------------------
+
+
+
+function AddRegExpCases( re, s, g, i, m, l ){
+
+  AddTestCase( re + ".test == RegExp.prototype.test",
+	       true,
+	       re.test == RegExp.prototype.test );
+
+  AddTestCase( re + ".toString == RegExp.prototype.toString",
+	       true,
+	       re.toString == RegExp.prototype.toString );
+
+  AddTestCase( re + ".contructor == RegExp.prototype.constructor",
+	       true,
+	       re.constructor == RegExp.prototype.constructor );
+
+  AddTestCase( re + ".compile == RegExp.prototype.compile",
+	       true,
+	       re.compile == RegExp.prototype.compile );
+
+  AddTestCase( re + ".exec == RegExp.prototype.exec",
+	       true,
+	       re.exec == RegExp.prototype.exec );
+
+  // properties
+
+  AddTestCase( re + ".source",
+	       s,
+	       re.source );
+
+  AddTestCase( re + ".toString()",
+	       "/" + s +"/" + (g?"g":"") + (i?"i":"") +(m?"m":""),
+	       re.toString() );
+
+  AddTestCase( re + ".global",
+	       g,
+	       re.global );
+
+  AddTestCase( re + ".ignoreCase",
+	       i,
+	       re.ignoreCase );
+
+  AddTestCase( re + ".multiline",
+	       m,
+	       re.multiline);
+
+  AddTestCase( re + ".lastIndex",
+	       l,
+	       re.lastIndex  );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..46a072dcbda16db1e1d6aac6e35538c7f93cb5d5
GIT binary patch
literal 14934
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/regexp-enumerate-001.js
@@ -0,0 +1,88 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          regexp-enumerate-001.js
+   ECMA V2 Section:
+   Description:        Regression Test.
+
+   If instance Native Object have properties that are enumerable,
+   JavaScript enumerated through the properties twice. This only
+   happened if objects had been instantiated, but their properties
+   had not been enumerated.  ie, the object inherited properties
+   from its prototype that are enumerated.
+
+   In the core JavaScript, this is only a problem with RegExp
+   objects, since the inherited properties of most core JavaScript
+   objects are not enumerated.
+
+   Author:             christine@netscape.com, pschwartau@netscape.com
+   Date:               12 November 1997
+   Modified:           14 July 2002
+   Reason:             See http://bugzilla.mozilla.org/show_bug.cgi?id=155291
+   ECMA-262 Ed.3  Sections 15.10.7.1 through 15.10.7.5
+   RegExp properties should be DontEnum
+   *
+   */
+//    onerror = err;
+
+var SECTION = "regexp-enumerate-001";
+var VERSION = "ECMA_2";
+var TITLE   = "Regression Test for Enumerating Properties";
+
+var BUGNUMBER="339403";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+/*
+ *  This test expects RegExp instances to have four enumerated properties:
+ *  source, global, ignoreCase, and lastIndex
+ *
+ *  99.01.25:  now they also have a multiLine instance property.
+ *
+ */
+
+
+var r = new RegExp();
+
+var e = new Array();
+
+var t = new TestRegExp();
+
+for ( p in r ) { e[e.length] = { property:p, value:r[p] }; t.addProperty( p, r[p]) };
+
+new TestCase( SECTION,
+	      "r = new RegExp(); e = new Array(); "+
+	      "for ( p in r ) { e[e.length] = { property:p, value:r[p] }; e.length",
+	      0,
+	      e.length );
+
+test();
+
+function TestRegExp() {
+  this.addProperty = addProperty;
+}
+function addProperty(name, value) {
+  var pass = false;
+
+  if ( eval("this."+name) != void 0 ) {
+    pass = true;
+  } else {
+    eval( "this."+ name+" = "+ false );
+  }
+
+  new TestCase( SECTION,
+		"Property: " + name +" already enumerated?",
+		false,
+		pass );
+
+  if ( gTestcases[ gTestcases.length-1].passed == false ) {
+    gTestcases[gTestcases.length-1].reason = "property already enumerated";
+
+  }
+
+}
new file mode 100644
index 0000000000000000000000000000000000000000..49323cd76f7d57849b5a7c8a4937a7855b0a889e
GIT binary patch
literal 8227
zc%0=~-EPxJ6rNJb{vcTK0xMrFAVdR|R(lh5m4+-TqFL0WaDh-Yu}_@=$F^q1RU+{o
zd$$j?53$d{{a(PCaZ)?>*tLmC8*Ofq%<-I`Z@%+0Nn1vt2m9?YP-lN&a~4XnO$ZTo
z5CU-+2V1gp5JX5SVFJDsq}|d_x6@lYLI9WGyrz7hx86i09!!}{J#Y35Y>#qq`gDS-
z&M9ABuxTixi*I8po@u+ibLw3f^O%tPN~wCaTl#Cf_!lnhs6`<;^WFWs__^aa$Kdv+
zVV4RJ?bckhc;p9s<ly9a|K#YPcbt=chtff>J3RcepOYy=!^7dro^jXf-tk~*SK7~v
z^Y}gousAgSGa=ur#Wd6iF{2|7VhpKdflqGWLm!y$5NEy^@Z_B4&ZuKW=o9C(iT`kQ
z>oOAo*A_--0e2GSGihYOLHxj>gFInp47gV9<FRI)F=D&`B(3r#lfbDr(2wAOau7mA
zyrrY@qMYV?D2UG<*Qbx4JbAkNUgT|DyvJ~xOg9Vkr>g@xPs=8NzJ-Eb_o#EacMZ_J
zyLBb#8p=T<*#3fo7Xyof3)9e|zC8}qx)t~qOhP%cCREyEYZSTH0Q)Oqc0mzu1b<bH
z_n!Xx+gG8R7#J*?rnUr$VN>K??35|r6k4iz0uajGsJQheP-P-30u5U^mqQRTADyuk
zWkcVTSjz^1rGWoI`!}-${#q9m4$MA+$!N(*wLciW$FYWl90w#WXU6Sws>V)d_J>rW
z&?jdeb#u9?0-zs1j&g%Ze3aS1Q@daab^$VPOsQQvo6H`RWKeAjKcS$dqHpc0Xdc|Z
z|FBX;=;J|hW|x_WbK%qPMl~JI=`6Dwyv&@uZX`E6Z51VDGu7#j$hTE<OZPc75HZma
zGvCJd=io!!okDzI0(c(r{bdw5v-p$tQA>qhO^9K<0liw*v#s-XzEtzN^LPE5%`JWH
z@?AO3iSD3Cj}0JBsp741b3Ah7L_g}j!B4Z|N*A1Ka#6GvDVQ3K=YXsbQ1yYON<Ug+
zZ@?$iyWo@1`Gyq(d5AeAGxcT5(8H?xW;*)SqAg_1N?J|)UQJ_3T4V}pTK{Q3^1L}Y
zVs%yO(19u+>J-a=SShCP3*^v^>?vR8Vtza3yqY!@;|pr~9#+Y119>S=H&^w9nw)gG
z_TWqs&fKxgnpCblN(_Btm9<;A!uf$!&fZ!OUzTW%3|Q*kU_IO|N<EW}6$jy37?hQ-
znw4XN+^#YK1w1JVs-)<Pw;HcV6gnta8fm`aj|Bgk=HK=F{FU$V4O|Ea$>Cmdp;@Ky
zw9SR57SSrhuuk?@=)6^uz!1fWrgjEyCSGwkW77n8{Q=3mIM{TFepFEJaeig4uhMCV
zZ4%_F95k}U3+xXX^Z0L=Oa6N)o<%evKkpbaZ}Vq{dpjFDGi-*+|H)*tttXqe)wDNP
rbQ|$q3EoxH-3=yTg!k^U(tb(uH(lJ<2kg3ouX>wqKI(#zaFyjR*8GeD
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/regress-001.js
@@ -0,0 +1,45 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/regress-001.js
+ *  ECMA Section:       N/A
+ *  Description:        Regression test case:
+ *  JS regexp anchoring on empty match bug
+ *  http://bugzilla.mozilla.org/show_bug.cgi?id=2157
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/hex-001.js";
+var VERSION = "ECMA_2";
+var TITLE   = "JS regexp anchoring on empty match bug";
+var BUGNUMBER = "2157";
+
+startTest();
+
+AddRegExpCases( /a||b/.exec(''),
+		"/a||b/.exec('')",
+		1,
+		[''] );
+
+test();
+
+function AddRegExpCases( regexp, str_regexp, length, matches_array ) {
+
+  AddTestCase(
+    "( " + str_regexp + " ).length",
+    regexp.length,
+    regexp.length );
+
+
+  for ( var matches = 0; matches < matches_array.length; matches++ ) {
+    AddTestCase(
+      "( " + str_regexp + " )[" + matches +"]",
+      matches_array[matches],
+      regexp[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..a13614c49a1b337b8c25c2d8b45adedfa780e9c1
GIT binary patch
literal 18223
zc%1E9O>f&a7*>|7URP|l-Fon`LAN*wb~G}$t~&&1vm*A2eRK$DiILgLl0Z_K{WFH`
zxa)vnz%IM(yx*|venSttZzLsKUz8(9loK_~#SSUH<oob_9=@dLE)9GK9(5-WSVuz>
zBcB@EhG7uX^PyoO3{8qIATbC96i%T_iP7zdr@P6fJwhO+(0T#zP&D0PMjSXpCUBhj
zV`w@6L+b=gnW+na(*-8*X|Vin0?1?0@8AMB%g!7`=n*%{|GFLVZ&)~I1-zn5C`PV*
z^dbA+v#e8S4`zNJ5J<Y6sA};@i#;+N^hd{EoaE}>Wp$(D(bIvn)r-ODFx4tKlFabf
zX9Q94;C~(%1|M(=Oa>wXV+V#P0g61=c!xdo8o8EXMTH)YXCfL5pEw3?JUG$Cf2?%t
zvMxL<dKj}FSW5%Bh)U=AQTV{I#UcTnBZ!4*mrY!DFj9;cfFw;mMHFJ-48<dC$}l8^
zd%PvQae|!Xk61-GyPd#Arf0!V_V*9=UXgr1%g+#US@&weesg_b=R;Ek*mqdPp#Q9Q
zc6bBO-PyVpbS09Y1l#+(Klpt+4CV)IA5dn&{kVPZ0GqUTuY`Eq@o*v8VgxWAkPMAJ
z)9J*RIf7ieAv6HCgJR*2;mdd|1M)6kSt!7C1PRT1CzZ*p>rL@>)iRWF_;=QSD;v~N
zEQPHzV~xVZ5K$uI>&sw&|I>rq`W2$8G=kq_6`ioVj$+fiqIYdJPgodWWUewAhUuHn
zl$bFLshJ+eV4i6WolG7kqUbBx!lMeHEER7FGyhP^%+`{bhnt}0-I$t(s=3L1?MV`X
zO&M(*JHJ-K&LV^~JvBWwJvBXV7Cry0C9gfOH=5TT*s96NH<KAZuEB2ODEd+fMOT1y
zOIiA>QkG`+5A_k0pAU6<P1tkFHso&;G4;k%Jt=?Fq^vocm1g^zmYSBEJE_gab$z_t
z5xi{1HuJ3~rrvATz|3Ftf~k*x^jcXzBl%K7)x5lY61XP650JbXz&VUakIY?@eSQvI
z7{1W=*#lF^CM3LEH1@1{_)Uya)Dlq|M~3uz((|;PZJ`8F(VBOW{$*|XG0_^=j`-;V
zaxFN^)$mQC16`X=a#bI&swtr61d=nrLt1(-Dbh2kVGL~+I=QNQ27eik&x)G9AJu1@
zm%8yJ1OFQChP4;WPCylbS;3+5H%H1WU@1;`cnX|lloG*WCPXZ{88d0x<5St9SAJ}=
z(5U8ZVZ>CjDh=;yCJRHqnpqi(t67vNMm2*g)FiV)CGDS`1dbE&A~aV<*dK8{<^jC=
z8fh_mC-<Y9olRLC?}c>dx0^WG3l_<rm`~dh-U6IVSNIc5EW`EBf#=k~$evJH*6}dz
zsCg#W0(c#Txzg6Ny$5H|d{BJzu2O8Q)Es3mu6Fl|M5wY8WfhK76PeH8beuBFS?7&k
zF)=WF%)^Gxm6Ek$w`)UD6o!dpnTJz>4tyiqcC0mql}lqL1urp!4d0uTQ{Nx7`fBy9
zNqt*FeG3w{%084#2DSFyRP9|cfww|>f7H^erMG73^#jS-WMv;ppFwExz1iX`504Uu
z)gF#jcSo2)RGfqxfp4*j)ai4osoI~w{UgI}Ge0oQADk8w_bM-M3Z_Gq40jdCaA_De
zNyrjsdSy0$5-+|Kp`C#nk>?nmqgjl*_`-sDF|o;ah7Su?zaBGayPQrVCT);bjX`O&
zIG*`hU>^RQ{gU6X7oT#9fc&c^VP5l-vcK=>q^xNsb?T@xb>!^Z{kEp8aV^2R(w&3v
o%GvIFQ<nTdYt@=`iE61{l{N>g0_SyVu0A!dHvkIK`YOf$1Gm*+@&Et;
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/RegExp/unicode-001.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/unicode-001.js
+ *  ECMA Section:       15.7.3.1
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *  Positive test cases for constructing a RegExp object
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/unicode-001.js";
+var VERSION = "ECMA_2";
+var TITLE   = "new RegExp( pattern, flags )";
+
+startTest();
+
+// These examples come from 15.7.1, UnicodeEscapeSequence
+
+AddRegExpCases( /\u0041/, "/\\u0041/",   "A", "A", 1, 0, ["A"] );
+AddRegExpCases( /\u00412/, "/\\u00412/", "A2", "A2", 1, 0, ["A2"] );
+AddRegExpCases( /\u00412/, "/\\u00412/", "A2", "A2", 1, 0, ["A2"] );
+AddRegExpCases( /\u001g/, "/\\u001g/", "u001g", "u001g", 1, 0, ["u001g"] );
+
+AddRegExpCases( /A/,  "/A/",  "\u0041", "\\u0041",   1, 0, ["A"] );
+AddRegExpCases( /A/,  "/A/",  "\u00412", "\\u00412", 1, 0, ["A"] );
+AddRegExpCases( /A2/, "/A2/", "\u00412", "\\u00412", 1, 0, ["A2"]);
+AddRegExpCases( /A/,  "/A/",  "A2",      "A2",       1, 0, ["A"] );
+
+test();
+
+function AddRegExpCases(
+  regexp, str_regexp, pattern, str_pattern, length, index, matches_array ) {
+
+  AddTestCase(
+    str_regexp + " .exec(" + str_pattern +").length",
+    length,
+    regexp.exec(pattern).length );
+
+  AddTestCase(
+    str_regexp + " .exec(" + str_pattern +").index",
+    index,
+    regexp.exec(pattern).index );
+
+  AddTestCase(
+    str_regexp + " .exec(" + str_pattern +").input",
+    pattern,
+    regexp.exec(pattern).input );
+
+  for ( var matches = 0; matches < matches_array.length; matches++ ) {
+    AddTestCase(
+      str_regexp + " .exec(" + str_pattern +")[" + matches +"]",
+      matches_array[matches],
+      regexp.exec(pattern)[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..85ae6ee5c176d39596c26ea68d6c6f69feb8be0a
GIT binary patch
literal 7579
zc%1E7&2AGh5Z;ths5ro(2P7_g1eN}X^QzFM0V;*GB566H%Gq@j3uia7y-mYo@DjWN
zuY|bt!kw{qvw!h!H|a(tQhRA)kH<6L{CH+!34ciOp4G?5*=yU342AK)Fbr;cLu@#N
zVOx+(%ndG(zys_GZdf~t+DabX=NvPEoioJR>gXykq4<i}h|=*PwkcxRX`unIx<o9!
zV56b%qi=o057oVmOGKl~DB)sHGL?VUj`|ubeuo9QVR6BT+uM5zpPQ(QDR%0fD~Ri3
zYbV^B&^!W~cB9@oI&MwvJ%qi^QK#9^o;quMZl_KqMKOV(mJmgIO>h8o2=U9;?9U6s
zcp?{*NCUzIbtw)YM1pv(u>wTji0c?mxahIiOyRxKs(^efhq~hLMB<_=Jf?2w!VPfJ
zATAMFCpZWQjvR0kazQXttX;5bRv0}nA+IFMCJ~q++Eyfut0BXjOO0zv8|qJSmUubd
zs81-~+TDFK%{}@b0Ij>UT8OXj4&rHNtpegT*l5&0?VtY-=x)^R1YJ#%s07>B%6+%D
zx0MH*BO>}HGHH;`OgqeHW|WQRvOp|Id%{Oagku49=+q&VCv=dA%IuD@fmqMae;Z;r
zGYIH_U6+rKKumNn*J!6rmRZ%8Mb~GrK4Rb^A7K@<j@R^hIV%6sxjDEiV&lX`GDP6<
z4LqLW3t=$Q>x=BYlF?>-(Sljd1j*ta2DxG8hs)d&7i5B*P+T@QEi9-~Uit$lSF&Cj
zTB-%&Fk%;(%824R-{7U$T)(}?|F*#0<3AhzzjgSZW-{tZGNY;wQ1@t()s{Y;-o_61
zX1%+x+IUw9{s}fqj=!wpL^Va;d*8KXACYV+WF<lPJ|DX_{QrR6Fye+lFu(wMFsJBx
z&N%p_WK_Fct;V=(CmkngKC(`VSkE}t_zGv``B^3yYk?JkpLT#j$$$v`kRk)D{<S@C
z`ILrafuuUB^8He&U`v_QV*^AZkhyX~h!rpnIF?8Q_){04vo&*Bz;30j&N!K<EeCdy
zvmZzwm0A~1>GH=*{(9(k6=V#E3es~WbtZ32dhXKaJCI_qC;_ruC#9N%c}ma1H&Z$?
zcyf%8)KoR;smzgdhmq&?Jx~9nA9`P8x1VMwQ)8N2RehROL7!Fv{F%F`oDkH8BK7QV
z3Z`ICeZzD*KfqKV9M?4IW6nT09XddrF%01+3}29|+`2DH{Zfq0oJP937%75wlAhCA
z2hLr>uWu+$DlAf3c(m{u<uR<wK~x>_yyEcrYWVZR;%6SqG4ELpmUI5FU<Py9mzqgZ
n)w#5ish0%Gv=%k@njvG)EV&G5^VI?bFDlL|w_#2eEVKL%5%{mw
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-001.js
@@ -0,0 +1,44 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          dowhile-001
+ *  ECMA Section:
+ *  Description:        do...while statements
+ *
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "dowhile-002";
+var VERSION = "ECMA_2";
+var TITLE   = "do...while with a labeled continue statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+LabeledContinue( 0, 1 );
+LabeledContinue( 1, 1 );
+LabeledContinue( -1, 1 );
+LabeledContinue( 5, 5 );
+
+test();
+
+function LabeledContinue( limit, expect ) {
+  i = 0;
+woohoo:
+  do {
+    i++;
+    continue woohoo;
+  } while ( i < limit );
+
+  new TestCase(
+    SECTION,
+    "do while ( " + i +" < " + limit +" )",
+    expect,
+    i );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f01d870b318523bd57abdb14d3f8a3d644572e49
GIT binary patch
literal 10641
zc%1E8PjeeJ6kn&IrNaRZWv0h%FVJb56i!TMCp2*kWG0vncFT$B$h)$wvAi;pHcl9B
ze1m?8eueUJIB?+B3wNHh>-`t)W^J$Q+LK&j>(A4BzxP*9c4RQ2_`n%r<Q;TePA1a2
zVOf@N*#ui2;n<br3=2z0B=H#gQdrKuUhSl}9twfE#NJE9J9_Ib5TW>-xQNn=W9(AI
zvDZdpAa#a#cECjw8N}a)NF3{PTW5&IhfyNrfg-B@oPGT@9Q+*y)Py4>C;s5zQ}}#}
zdYEFb$$Uxt06Y89+-%J)Skq}WyC*-jFU@@fbKR5fY0J3lW$WioW>=aO8x}NDtQe08
zH-HQge#Mgg{e@+Hq6X7Q1HuILC=MY+k}%)efkh+YdzKdsGM=a@I#+2GkWcu~NBlSA
zxa<hV^$9&V0d`u%C(>vHN8y4K56p!03Fex#4_eJLV+JOol_q&gB<6^A^pe*3gkvF;
z#0@PC4K7huczJ9(Bose>^5pBw)Z_ml(56G{h4|h2Aiiv@bwGR*CR)uO4_|!<=-z3p
z1zkgss0G_c+I;u+_Ou1tQzC~pvS}F3Y&VK$b{vft(m=vUXGTYJgcAl$=rkder({rw
zs_2ffh4>&S&J78iIRs3=-d4#+A}+gF7^E`>%e?5DBI{=`KILE{KfoyFU3SU_1tPyS
znK_s%;uoodl#4*}4K1GHzO*<Q3}yaYMd)F2(27aU1<C3XgPO35-DP2pOCmvmD{h*Z
zmKIbQD}4<sck)&mX{rtEaN?G!%8LEESmBk)y!-YV|7C%@#(zHi|25(NA{SA2(h*gE
zfV#&JtR9=g=`wn_R_prQ>dv!T@K2H1aQsyjC+jKlz6*R;-6PUh3ROuEaVRc)7yf^b
z{mA1cuwaY<^srCSW8OvhN%N>@g&s|CH+DLnXX&UqDJDH<TjN*QtM<>+!MGV}5$G8k
z7?g~OG&d=7z?!q|t9C$Xv@GP*w5s}jsgkp0RLb}m(HLZ*jSzeVlmmt(vjDy^Ip}<s
zxjbM?No!J0&TFfIU1sb@%0`vc<z2es_R{EcOM6Kj5d*w}41BdZ7dK{i?#lbS5Mr>b
z0J0h<l`aX3l%6Yys%yYVsTW8FRDM<Sb!u0~J0VJLJzIjDq06-f<aF?a=$YWA<kyX%
zOtwmgpebWR#tJU_l({2KBW(3w(cdo)Q96`7yJZN#$Ltr?#L9B4GJcj}1DHpQQH=aD
zG#lm+U8_|8>>8w6(1c%1JXoD;tPt^><32erybr`BfnwufL4&2f*jd^X=_m5um?_d_
zzQDf)Y79|OoewL_;xBj!x>tXj%Bi7ERU!Ax-9##=K+1Gduetx#FjY|;qfyq<!=O_k
z-fT+-s5^J=!$cnu`qaj19$@g2j=qihKrYqv?<oyjZ5Ji|{;TWD)m<gGDs_JoDGqy2
zZO{uFVVecgW__D7HhE<C;ET^>JUG*!a?`mrSfdi!c)IfI{Kqh^-fWsk6!lT=?nW>5
z3m;PXd0;c1MmB@wf^YD4_=NeT;nAh;yjzQNE1+y=RZm1$WcQ^wR}O7ISOMc@eT>?5
zxb4yJkH&k8esf#UeU*?^odI8F*$dhFhX|1ys|5GnF2YM8R9LfZy@mbx0bAGuqlL{X
Uq|{GdHqFpXKY}tFTBYIt0lI#)TmS$7
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-002.js
@@ -0,0 +1,71 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          dowhile-002
+ *  ECMA Section:
+ *  Description:        do...while statements
+ *
+ *  Verify that code after a labeled break is not executed.  Verify that
+ *  a labeled break breaks you out of the whole labeled block, and not
+ *  just the current iteration statement.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "dowhile-002";
+var VERSION = "ECMA_2";
+var TITLE   = "do...while with a labeled continue statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+LabeledContinue( 0, 1 );
+LabeledContinue( 1, 1 );
+LabeledContinue( -1, 1 );
+LabeledContinue( 5, 5 );
+
+test();
+
+// The labeled statement contains statements after the labeled break.
+// Verify that the statements after the break are not executed.
+
+function LabeledContinue( limit, expect ) {
+  i = 0;
+  result1 = "pass";
+  result2 = "pass";
+
+woohoo: {
+    do {
+      i++;
+      if ( ! (i < limit) ) {
+	break woohoo;
+	result1 = "fail: evaluated statement after a labeled break";
+      }
+    } while ( true );
+
+    result2 = "failed:  broke out of loop, but not out of labeled block";
+  }
+
+  new TestCase(
+    SECTION,
+    "do while ( " + i +" < " + limit +" )",
+    expect,
+    i );
+
+  new TestCase(
+    SECTION,
+    "breaking out of a do... while loop",
+    "pass",
+    result1 );
+
+
+  new TestCase(
+    SECTION,
+    "breaking out of a labeled do...while loop",
+    "pass",
+    result2 );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f0edb7221df7a68969684b2845a7abe73413620b
GIT binary patch
literal 12604
zc%1E8OLHSN5SE>N@#a8r;N<&~WD5=)aG7Ki!=@_hO<`|1Zpkx>Eh5i&B{_+!xKo_C
z@M9?c0C!ICFZRNDX=%ouho$k1Jx&~xTr$?9)&2FSmef*Rj)sgh>V1OUM%&?ZDA5)|
zNI3qGAeVCDNP0m85)w-?Af6PczN=f;<6ZZKAY2mn6!W(3dJlv!az!1?*!Yk*40GbP
z@Bl<zV4f^+@KBDXzxr4l>T#PFm`w*`RLF)Bs{ZP``e#u18x-7Eg+g-b^%@W1`_TWP
zPZ_E2hGmnw52Csk-5+6$nHH*dyLr$#deNGxQ=@c_I>$|8uhZuD?L@D*k~L^hNhvuq
zOwa+W3z4<k%y$t|wj_K2*i+nPBmfsn>U*dPjn1j(A~!7bdE~%wT;*@@Nu-A!;@^qJ
zSwr|-kI;n?peLdpl}36z4H_J|Kp=WX3D=@M@ON4nGccj7xX5EF3CFChn>4S6oCu*T
zu4rr6Xh!mTP~rNQ%J<t(o_skgefmED+B9gn5Wl%Oh-b-K2E-4bqIvLq|J4_3fbJ)i
z8$s6)Buc^db4}l!ogK~K+9j3!8m=+iC5*T=#|OQ<5vfh%^g<qp6lqW7XpKmupb4D=
z2=Xx-6rw8b6M``BjqIyN1ZN5X6R_{7Wl3T#J46_)GX~4F>9@t!kD>gM14W)eDd8Re
z*zZ|P{@p}#peyF%*g$HEz_J`Lo{=+&IPLXidR!&waWv41MHYf&bqj;4sM)8>!Ww5p
z0?SmqZ8SA*wG!<7#l+4Qxm>ww89Tj%g8x9ft+aw6g<7Btr%o1!f^hTZn=B??w-|)1
z{JNvt2GDKq*S#`$Qj(ZEx@|b!o|VIslEmE6ZNuqyvR-tHt;zp4x_wn$bGrRpG0^R0
z>X=fEA5-*)=bBCc+vYRMGJIJbi*MG*_!QmD$)WNHvYa%-w<FI{nXGtHOU*qh_Qlw9
z;Qx2T3q3c41_J`V2y*CM-yH{ET1Q<gbZO)cV;24-DM!tbspx_!_n)AzGB<w){gLva
z=W5!_RKBY$S7cK-2xEpl)iIv-PT`J>fWK;u7z>*PhL~FAPw3@{MhSoWe1O^1141(t
zOa{*Z>tqt$x26TNSgtV**HX6H+_RiiGb2)=BA*MhX4q3TF%;U_*H-phmEJvrHx>+2
zFcoRfQ>|0MYLaT6(_alno#$lGB|MVVffz?*5biY>(U7ZfFULk9ojw(@;Z1-RV^ZP#
zm(AzpuM4*f@FFv<5bE;;-$9=pjur-fPL!LoU)sE#!`INa8rwN!-OE3iI(dnO{|4V6
ze1?+O`|6u6VM?*fT<bAz;eE*|GG8j?RLbbiwOj5#{V?3x#-*2g2mQAR$JO6Kr|DO6
z+RYro;?hG#Myp6QJWwTKkaZDApKNo4|3aZUi=PFz*35U#wUWV$sX5Q2>`d2KKDxhQ
z8_*l_%FCe(NTu$osW{=}j9yt2C6&o2%DQb!s^qr8vchfOVko0H%8xBC1JcMY9`iD9
z^UorCw<ZC~fn76sJyK<uL5%dEg)JN}{2-!H!h?wNgZ!Q$ua~fx6MUYeh<<;R)=YW!
zEy`AH{+hqK6ykN{u+?cmJybft!j@nEvtrnPtjU|0kCbnHe^|?VMqRVzdu7LKTbS8&
zvi?<FU$VYG<-<;n&B2;6HGekZT5dj+#;{%hHWniMVLH;R8KznLp<MS=xr+Y-%Ka-<
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-003.js
@@ -0,0 +1,63 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          dowhile-003
+ *  ECMA Section:
+ *  Description:        do...while statements
+ *
+ *  Test do while, when the while expression is a JavaScript Number object.
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "dowhile-003";
+var VERSION = "ECMA_2";
+var TITLE   = "do...while with a labeled continue statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DoWhile( new DoWhileObject( 1, 1, 0 ));
+DoWhile( new DoWhileObject( 1000, 1000, 0 ));
+DoWhile( new DoWhileObject( 1001, 1001, 0 ));
+DoWhile( new DoWhileObject( 1002, 1001, 1 ));
+DoWhile( new DoWhileObject( -1, 1001, -1002 ));
+
+test();
+
+function DoWhileObject( value, iterations, endvalue ) {
+  this.value = value;
+  this.iterations = iterations;
+  this.endvalue = endvalue;
+}
+
+function DoWhile( object ) {
+  var i = 0;
+
+  do {
+    object.value =  --object.value;
+    i++;
+    if ( i > 1000 )
+      break;
+  } while( object.value );
+
+  new TestCase(
+    SECTION,
+    "loop iterations",
+    object.iterations,
+    i
+    );
+
+  new TestCase(
+    SECTION,
+    "object.value",
+    object.endvalue,
+    Number( object.value )
+    );
+
+}
new file mode 100644
index 0000000000000000000000000000000000000000..958ab1defc18b6220e1661844e02e2df7ddb36c9
GIT binary patch
literal 10573
zc%1E8OK;mo5T+bANzqFWDbOREOB<xI)5j?gocN)(23$3$<n(B)$d$D4imUD}{Q!FF
zKj?ob`U?v5@ATMPE<Lw1ONt_?B~3|`9U1n;(mrNqzIpDfnmQbFy3-s|;_q}k$;R5b
z=Qxh?#F#ohlho7fj4DTIqUneRS~<;av$~nyx~mkGn)+{u?3k^aK!no^<`K>>52(k9
zq<))>fYce0*#VD?b(nk`5_MqCZJiOG9LAZ_J4h7&n%m}UG$>&JCz?u277TVCz~=+;
z(~xo6+>Xc6bDh?H_wa}I%-nl0*FEeWwXD0|w0`VlcBNTxVL>Cu!pt$z2H-u$tyrSp
zKXsfBa4?N9Aj?RP(+E1EnFyQ>Saiw)-|^!?A*bqz&qZwl;!{4%5&up&E;~X<b3zYJ
zfSnEtn6@f^FIsTugL$w%qtcKLK%04H?7+md(j<?VrjqcES<<=~OR5w~+%VGcaE3DC
z<%@IF`m^WHzn-O@{EvXP9a=BMZ*LCbS!1mO;`=bs+W&s{<jZ#e-A9cZLDv!_YQgq%
zW4>EkTgHOjbEbzbaXINxPJP!Cz*i7bH;KXvX<*7oXF|ttM5hee(AkF&o{|9(#i&lH
zL*yVV&IwaEa|qageIJvKCQ^5)vPfqQmU+?FMb-~t{9J;Gd<UaccEynx6o~wn&CJ1E
ziM&i5gf0R}H?nw6``VFgFx2^Tk<ioWK`SOX7bL4o3^?HyyUW5HmqdaBS6nwUwH8tt
z>--H?Y~-yo)=(SRkjyJnk(2myv7#%JdHeDX_eBA_!@U~r|JZOp&PC3RbmTN2puVvL
zrDyiAxeWey>b!n8di1Im+*4%M9CxhJbUj7fH(}u6Jt2K%K(#Wpt1bf%{(nn@*we<a
zU_=4*sQ=It{$=#Z@Mvb08J*&8?O?pl(!n|?Aw6fi;u!Yg{wke``;qp5j<qqt*@$U-
z^C1VQJ)54iL(b!65r?)_^W8EFohze4AxDHKpekc@;2WR}FeIG?><^nm&UZP>1GSWt
zHl^gev>M1|#=VC&iBgw$+lt#oCm%V+E9!_4;00_D;ObnQnB1W&@9#oLp}GRdIL;~+
z{fm^8D~O^ufDx(}NQPX0QS<d^)5JHWN^UW?1UXCBYANKtf{8wX0O-GPds3WISA^OX
z{iJJ?II$ZBQ52y*znl-~BcuhyrZ6L1=7dZ#OE=5<LKIx`x$sU6fvCNIMNhvtoSCrm
z@PQ>*$2lR(E>;6sZY{v?3Bf4|%8+l^!+EVz{k>_CYC&^99{aF5*HmHZwWNJ^QFup4
z$^~TOX+d+PzBpUj5b00ly*E*$Cjv!(4sncdP+b5k?BXwYG5Vzb7FDx`7FC5jHFpE4
zpjs)@NxkO&XTw%;NlH$$mL5f%oCLV>Kc^g$b<7lX=h*EyQ@n5~&I1hT<UsmBF4gSs
zA^KO_L`k3j>N<3FSIk?L;;R=&s{^!6&sTnBe+c9F?y^r*QLp6V&G?mlseVkQ7XNxY
zZ>$H&1>e!#=o#`e%fm_C`Lh;BMWEc~s-AhS$kI!3jt=cUSpnl^y^Gp)c-y1jFO6%9
zesf#UV@$4CGr*V06_mK<#{{t(b0NmpmKm2qsIdOJ^%nN)J8WT3tQIz@S5rS*SvNzo
M{gBCSXqATl2O_$eRsaA1
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-004.js
@@ -0,0 +1,67 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          dowhile-004
+ *  ECMA Section:
+ *  Description:        do...while statements
+ *
+ *  Test a labeled do...while.  Break out of the loop with no label
+ *  should break out of the loop, but not out of the label.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "dowhile-004";
+var VERSION = "ECMA_2";
+var TITLE   = "do...while with a labeled continue statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DoWhile( 0, 1 );
+DoWhile( 1, 1 );
+DoWhile( -1, 1 );
+DoWhile( 5, 5 );
+
+test();
+
+function DoWhile( limit, expect ) {
+  i = 0;
+  result1 = "pass";
+  result2 = "failed: broke out of labeled statement unexpectedly";
+
+foo: {
+    do {
+      i++;
+      if ( ! (i < limit) ) {
+	break;
+	result1 = "fail: evaluated statement after a labeled break";
+      }
+    } while ( true );
+
+    result2 = "pass";
+  }
+
+  new TestCase(
+    SECTION,
+    "do while ( " + i +" < " + limit +" )",
+    expect,
+    i );
+
+  new TestCase(
+    SECTION,
+    "breaking out of a do... while loop",
+    "pass",
+    result1 );
+
+
+  new TestCase(
+    SECTION,
+    "breaking out of a labeled do...while loop",
+    "pass",
+    result2 );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f10c7cf3127672b75ff78b04e893cd4738ef24f3
GIT binary patch
literal 9375
zc%1E7+iu%77*@J$-LRWoY#4SY6vKMaHR%Bzu)zzKgVzQ~-J*6n>|!Wr>9<XU7B!N}
z;XU>ieSy8m-lHhc`~IXXTarn~c9i&l<;FHi{fF=W_#c#-N@4~(wH}agrx^$uEAJD}
z^JKtd@IopeQ1ld}Clyi9he%1Uwrx(=@{jIH2|_{mnuw-(bQ6UzIHv(&?BW0dMg)Wn
z(nnFJL=+bS602nRt4HL4(OW+yY^aP;sdltb{a4#IKhwp3aN$$ED3zd5cjpWIzIXhz
zar}I*{;IY;Sj~37#N7r+H1&wIfsO6o#{Fh}zjgScF}A0*v<_QGb?Z~F>#v%Hr}9Sn
zcwi%Eq*YD&0D3n-*6s6ucRWw~S%?8*Pf43W3NBHUN8T+wbV8%h3kQo_i~=~&tK*F^
z8QEb}e8?=Gq=E~hp^X~wNsmTUS?RHt9ykn<K(s?a7|{{NyKIadn1QUk$Rnyi5Y{wD
z>gTZlDYeHN#v7K5N!F1M`B{%Lxc}h6lX2<8&lG5z(rO`ow>XH$$yx=(pW#M*|M~8l
zM@xY2*Bc8#*ODYE!S+W(->t1J!(ji6s-91Lrjr<ie!$VLC;@+%r<WiC?-#>wM**me
z;g28w^yufubKyHu(ahpxbiqiq&G&sQqB-j{Ub?OVctms)cU2yNRr1XR8?r~J7M90x
z@2thB?E0$s`W3F92@L)-Tm{kMN4)EB`CnTaK{66?kyE5E0Jc3TpBZ$NCup~)%6he+
zdm}~HEOI7DuCMUw4c~oT=C*i3rgdD!Riml1SzXIZsr^vZ<euM?DA2_#U&l1Tsoa$p
zQGlOMAsSq*7!ULTIh_tJZ602v-;9lBSDMw#-cl~eMxU2OIr{nzMb9|rd|#Rt+&sw5
z1SNbtD==>w31fp}sY2VS>1*w!3@t>3i#}mPoTT9qW)s90xuJ>}l*2up7n8`ar(>v9
zP9AIBQ`fU^EK}E<HwsxpyOBO!x>s2vH1+c>yn>*nh?QQaQ|0ysUTHytNy*(C0#r`9
z)n%OpV5E}-icFY#SaB8HH2FZv3B_tnkh2VbS3>SCZgdD`zxW{y{fH~SM-@&yA^4<&
zvV0n0F83Md@%n>nnL8FhOOxzz?i}H!{WrsCp;YEuHJ+epj^3B?;KYbX-#cFNveBLX
zO`87owxwe~;D6}3xoEKNHj4IE)sffijvmJ$>Mx0;@}+<dJs-(7UvT2ia&0DA+kDT_
z>{nM1swfP9{x(ruwE=&E^x7;3d>)FLL~;`peT%T&8XGDFkdtC2O3l68(sjvhRTtem
zh0@X10Q;DSeBQ~5hP`XOxjAyJD)oHDWES3+ipZ*sxY~snzqw}ImS-tlGih+;bUT4(
zTV8d#SKT}PFxHqBGK}Hsv>B!XY#VTP?F9ZD*Y*41eImiZ;lDO4)p$u>MSiC>CjB<X
z1p}lf2H%L#uLmqytD@2PhA#8^Q0VU^rqH)KSy>th>-2d|)$~fRI6JNXX|+tW8dQ%J
Nqm}I+|5s=|J^~xx6wLqt
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-005.js
@@ -0,0 +1,73 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          dowhile-005
+ *  ECMA Section:
+ *  Description:        do...while statements
+ *
+ *  Test a labeled do...while.  Break out of the loop with no label
+ *  should break out of the loop, but not out of the label.
+ *
+ *  Currently causes an infinite loop in the monkey.  Uncomment the
+ *  print statement below and it works OK.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               26 August 1998
+ */
+var SECTION = "dowhile-005";
+var VERSION = "ECMA_2";
+var TITLE   = "do...while with a labeled continue statement";
+var BUGNUMBER = "316293";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+NestedLabel();
+
+
+test();
+
+function NestedLabel() {
+  i = 0;
+  result1 = "pass";
+  result2 = "fail: did not hit code after inner loop";
+  result3 = "pass";
+
+outer: {
+    do {
+    inner: {
+//                    print( i );
+	break inner;
+	result1 = "fail: did break out of inner label";
+      }
+      result2 = "pass";
+      break outer;
+      print(i);
+    } while ( i++ < 100 );
+
+  }
+
+  result3 = "fail: did not break out of outer label";
+
+  new TestCase(
+    SECTION,
+    "number of loop iterations",
+    0,
+    i );
+
+  new TestCase(
+    SECTION,
+    "break out of inner loop",
+    "pass",
+    result1 );
+
+  new TestCase(
+    SECTION,
+    "break out of outer loop",
+    "pass",
+    result2 );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..d922d717ebefd0d840f09906f08ab6834cef4f7f
GIT binary patch
literal 16022
zc%1E9OK&SR6rR551%z}Z{y>oK4z;~pAvT1HK60T_Z+mG%5vwa_#%WBQnP7X`MqG(M
z!GeFl3W+5WE7tq~egP{s2#Gz%o@wUgnapG+&!(!>#E;|S&)+#dK6dNE?Nhv8?_y-_
zH%&(R!q_kjgPTqt8x~>M6yyeTg9{{Z58Hwp^*z<P9`1U;Ic5S|mxwi0*G&*Y@f|S{
zrGsN^QpB)zhI%0C2C-;?iTc7Fe(NHBtj2BJAUYh35-#?oQ2A5eQ(wKpU!dR(S;z$=
z_SOD2d_H!*>Jp0Udw$t{-8(_udHWj}Bhf<kZZ?iuC+BC0x-F<{owQCH+FqB9i>9uZ
ztfP+8htEM>cmj23upXO0nhF`h02O~l(y{sh#*!FB)(+N;pf<(cq98#WTj_I6Y|F6x
zLWczl?~f~a0&5xQp@#SmO4mjW;V?Bq8%BVh2C<3I((2G_aAE=RNQYpiMBBiVxH4MM
z?g0slJS74%M4PHf<F3yz=W@ntYBtnONPZhCEaz5oX6NbCkCM`de?6degH{XiKeK~4
zLGnr<mgd_ydU5dT*&Lwz?`+W3IG0MWeM`}IcX#(T>Jbaz8w}ID-v!ioI2c|x_akuq
zAq^#7ayP)(K<vs*-%A3pV)N6%_NLsd1Y)9vxk%1V>k8vjUzE8%hVokm1o#|EF>5)e
z&Q;2ke_hj%7|4j&AT*FP0NAWOK2zKg1|wHp5g%6ydOsLw!XgVnGC8*|D{ATHGPcGU
zcAjF2i$+sz02X2AcRF^S;oFI;mJ$C&6#N6)ZNwGyDRk&K6eBx}Lq-+_%l1D5Fc>j2
z`>UTPpQbWuMX<#t*xFnW%vcd@SqWCwgJlvlH^CmQ2)3*QE9=3kA=u+(C73+&h-ywm
z&t2P;N9yqDTJo3h13s`#`1={Q{eZs@4SE>Xz)J$Q9c$oyQaY+yu1bSt(54YzM&(GJ
z4Mi8s8GdXevulYAS||_U#7Q4YpT%I)JIPmPE~S1mPY+$IVriFT%1^gY4(lO0gpR9e
zgFyh~Ko=2(<x-dB$gh+Zsi^7X!z7Dwhmt6A64`m^^mON6oBrBYV76cOEodD(=@R~u
z;SRYAj=buFZ3X+NkB(GhXGeeHm3k2K1@5&m0}CKmwp6MG?f?s=zlXHZXHvQtly?tV
z%NNQUDQ_xQf@d67bqC^30PTkFi3}6O;BQ@7hA0TOp+#EGY^<DuTIo+lLmYFy^9XLK
zsNBe0n?vfD*J|S49nXl1opj4p7WTc)ja*=G&Bd&1oX9js=5o;|yEbaF1;UjD-^YK1
zzFVPvJl|Dbn_+Z)Vkhbz-PfJF$&P8(8Oq?v4VlkTkdPy4A3IdIfI&CM4;A!Kmyd}O
zOIuE45tm%-RwvGtxeJrN*!E4Uf-otFUt-(r{Z-kB{*}Z+tuEoA;dOwHvFe3_fHL9J
z!+<`+G{#0f%iJD3;Q1YKA<VPIu3*o-R~616rb=Cbo;zt$81z)B4=*IwrPk73-c^!X
zo8c=%-6K7qi%Z1^+JlEz_e?+8iiGJwDi%ej-a@Q0i&=E|@Lf&FT<trwKXo`x=apZA
zi&fn=PyI39%t6$=Xq*Cwr>Ko7#a6Jz%L!6h8rdVlakJwJ67mC+OQZd?t;x!dqcO4V
z>1h1hmPTXWb4C?bneK?b;Vx6VTTTs9)O5bq8AW9&?y03?|6bRuO1Z0tIlCq(kUEpC
zq5-{UJEIM~SbDPh>z+BoJb!Aj0OT=GH6G-Xdy-K0a2G$&%_hvyT$U_1a+Spvvp{Yd
zZ<(b3l>ZlSgm~IJtKT;?mm72P1pPgz=n_#g9She`2YT1!#$F>f{M!Dv>@klVprMSR
zQ8@6J?w$PW*9&ncpWE@zncn&GuVoJ%RXLVYW|q2PEWMlhd3_<>6oi^nbyEvvnoDGo
Ny8qiO^iU;Q{67KDsPO;*
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-006.js
@@ -0,0 +1,89 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          dowhile-006
+ *  ECMA Section:
+ *  Description:        do...while statements
+ *
+ *  A general do...while test.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               26 August 1998
+ */
+var SECTION = "dowhile-006";
+var VERSION = "ECMA_2";
+var TITLE   = "do...while";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DoWhile( new DoWhileObject( false, false, 10 ) );
+DoWhile( new DoWhileObject( true, false, 2 ) );
+DoWhile( new DoWhileObject( false, true, 3 ) );
+DoWhile( new DoWhileObject( true, true, 4 ) );
+
+test();
+
+function looping( object ) {
+  object.iterations--;
+
+  if ( object.iterations <= 0 ) {
+    return false;
+  } else {
+    return true;
+  }
+}
+function DoWhileObject( breakOut, breakIn, iterations, loops ) {
+  this.iterations = iterations;
+  this.loops = loops;
+  this.breakOut = breakOut;
+  this.breakIn  = breakIn;
+  this.looping  = looping;
+}
+function DoWhile( object ) {
+  var result1 = false;
+  var result2 = false;
+
+outie: {
+  innie: {
+      do {
+	if ( object.breakOut )
+	  break outie;
+
+	if ( object.breakIn )
+	  break innie;
+
+      } while ( looping(object) );
+
+      //  statements should be executed if:
+      //  do...while exits normally
+      //  do...while exits abruptly with no label
+
+      result1 = true;
+
+    }
+
+//  statements should be executed if:
+//  do...while breaks out with label "innie"
+//  do...while exits normally
+//  do...while does not break out with "outie"
+
+    result2 = true;
+  }
+
+  new TestCase(
+    SECTION,
+    "hit code after loop in inner loop",
+    ( object.breakIn || object.breakOut ) ? false : true ,
+    result1 );
+
+  new TestCase(
+    SECTION,
+    "hit code after loop in outer loop",
+    ( object.breakOut ) ? false : true,
+    result2 );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..cce237e35f4ca4dec2ca750778025496dea35477
GIT binary patch
literal 21874
zc%1E9Pj4eN6nENgmjx=ZH;z4VLA1**5)wp}+B86=Zi`4%jw@%zO-!9}@OYYyv|oTb
zCq4mZ#DN=EE_?vK1w!JEJu}Jt^Gqh`r1cEWC5ivMXFvbm&(EGWZSGA7I%<y)w2yig
z!xIj+0RXN=CkWV>A&cW%<N}vNj>gF0E@&V6t=sXg$F7SQNA?wDJ-_RY5JJ#vY(YY1
zr^q6ZA^QT3g{WJ|k_8r=aBuN%1l?0#Z}%3Gg))L&ek6s;Py5jS8x;O13LeQqmow}P
zj~<KPr}WzqCa8TFmd)$-qPok$cS1*|h3wtycKT<R7nwS#rGM5x?<#v;b-(E)dc_C1
zFB-H`gUqN2I*8eYmd&5@&piO1%EI^>2-{;gASf^{<d`~OOEkK{jt%Uvkg{k2L%njn
z#hOIp@KyXfA90Zi%6tt2p+WQn*uh*0kCULmnJoZ>uQ6i2Xh*DfdN69kgtFoy&oM^~
zlAhnB`+CBV>&h9o{MisMBl#UsVbiHx`;VSI`!p+k@f{dirL<ZT|NU?#&VscH6Yq+O
zZs+CktLGY6_n(Kcu7V^gvF+PFd=Cx|rb%X7!M>52-ki;SeJE0|ntMl3cx;5yUXs-j
z0+0>8{5>HuR%(7KvptcU4u_2Qk;}8QQ&M4i>UEjxd!l^G1OUDgrHJ+EIUVLq`L~t=
z!~%?v&0>nA1BgvGz%xPD956f_@w8qk=)*|ShDEMqlFiY+tk}<Ym$gS+;O9B6ST~p|
z1E~Z$e^sIL0!=qQw1PM;$rwVwPI`bLgia_W2s%X=0!0w4RsS>;4KnME%$7FDGRQQ@
ztP+{}Alo3*AXBIQ2AKw#y7xE8Y!)*0i4zSn4KnpamO-XLrk=<$$TY}o5@$B`1SFS~
zSM%KK3(v9SgVXpkR0(|S9=kKg65n4UCw#0k5e>#j7(Yna7*Kl_{PM@>*Sdb`!v0C%
z&67U9PRfywjuxU<%<%XDB$GLoCu~S<*!eh9E{#S#o?G!eui}L|gCn&FYFBu5;Smxx
z3udKiRsLae30_DnK4oJ_7R%xKa24JqmQg^ECr#Z^aY^~1W$k;nsb-g@5_vDGl9$0*
zihIhzpvYxUq^HRhD^9!0&kFkMkzz&H<UQfrc<9L1DfXMEN-XIwm0{~88V?YQWc3AU
zBJRtfKAypZ$*0VGrWDd2VK=5;Wzbl1&wwF#bLsI*N3p-(iJR3p-@tBDW2^V4w0f%-
z<q`dFt-cqx`iP+opk2Y5#_o^jc0Y3}w0Qo$lKyUd@b|gsyA=!miZXe37t5<rxK?<=
zTsu&^0_q&Fl7muOO1s$Q_YVMgqDkzM=8}>tFGPA|SwOtjVOKxuy_1QS#Q4TUWZALB
zn27LC?$<=;aDWIwc4QzqQ6ftd+hjaHR76rZwiCp~h1*0@n!E!_3aj#-?u1b5#@7?P
z-LvGCp8So#C+yq3@TMja`CLa6+MZ9yqK=Ec_hcC)VhWCEu{54b0jf+Sw^G<uv@5Q2
zrmWVuJ>`}!$CC8V0DjAnmlH#-zwg(PFe=-bTN@(`>^O}jjQ4jHw^NNJjHTBhhA^}z
zjLPEFa)i++UnqT9qM0A07})qhm4}ghKghY<YP_4Qc$cf0vzSd|gU8ZJoMlZ5-bc>M
zTcTXP?Aw8EUOvuGTdI&zkM~L!!QMV~&}aL_(mPZDPu`Qlcrr=t*=wZ}@`EJ(s`ign
z@soRc++5a?CjR%!b{+hWPw9R6-@32K%N2a{Mt!iavrlV0cI5%QfxM(jk!U(E{jsAj
zFYQIVB;)xyGm~Mv+Kjz4+i5n3!fT=ivb8F)s_AU~r^amk?t-nasmBaiYfTo0thK+a
QY#?PTF7)y);K~&L2Vs6?bN~PV
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/dowhile-007.js
@@ -0,0 +1,97 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          dowhile-007
+ *  ECMA Section:
+ *  Description:        do...while statements
+ *
+ *  A general do...while test.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               26 August 1998
+ */
+var SECTION = "dowhile-007";
+var VERSION = "ECMA_2";
+var TITLE   = "do...while";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DoWhile( new DoWhileObject( false, false, false, false ));
+DoWhile( new DoWhileObject( true, false, false, false ));
+DoWhile( new DoWhileObject( true, true, false, false ));
+DoWhile( new DoWhileObject( true, true, true, false ));
+DoWhile( new DoWhileObject( true, true, true, true ));
+DoWhile( new DoWhileObject( false, false, false, true ));
+DoWhile( new DoWhileObject( false, false, true, true ));
+DoWhile( new DoWhileObject( false, true, true, true ));
+DoWhile( new DoWhileObject( false, false, true, false ));
+
+test();
+
+function DoWhileObject( out1, out2, out3, in1 ) {
+  this.breakOutOne = out1;
+  this.breakOutTwo = out2;
+  this.breakOutThree = out3;
+  this.breakIn = in1;
+}
+function DoWhile( object ) {
+  result1 = false;
+  result2 = false;
+  result3 = false;
+  result4 = false;
+
+outie:
+  do {
+    if ( object.breakOutOne ) {
+      break outie;
+    }
+    result1 = true;
+
+  innie:
+    do {
+      if ( object.breakOutTwo ) {
+	break outie;
+      }
+      result2 = true;
+
+      if ( object.breakIn ) {
+	break innie;
+      }
+      result3 = true;
+
+    } while ( false );
+    if ( object.breakOutThree ) {
+      break outie;
+    }
+    result4 = true;
+  } while ( false );
+
+  new TestCase(
+    SECTION,
+    "break one: ",
+    (object.breakOutOne) ? false : true,
+    result1 );
+
+  new TestCase(
+    SECTION,
+    "break two: ",
+    (object.breakOutOne||object.breakOutTwo) ? false : true,
+    result2 );
+
+  new TestCase(
+    SECTION,
+    "break three: ",
+    (object.breakOutOne||object.breakOutTwo||object.breakIn) ? false : true,
+    result3 );
+
+  new TestCase(
+    SECTION,
+    "break four: ",
+    (object.breakOutOne||object.breakOutTwo||object.breakOutThree) ? false: true,
+    result4 );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..a06c4d5ba011885984ca45b8a981be7997ee9aa6
GIT binary patch
literal 59902
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/forin-001.js
@@ -0,0 +1,297 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          forin-001.js
+ *  ECMA Section:
+ *  Description:        The forin-001 statement
+ *
+ *  Verify that the property name is assigned to the property on the left
+ *  hand side of the for...in expression.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               28 August 1998
+ */
+var SECTION = "forin-001";
+var VERSION = "ECMA_2";
+var TITLE   = "The for...in  statement";
+var BUGNUMBER="330890";
+var BUGNUMBER="http://scopus.mcom.com/bugsplat/show_bug.cgi?id=344855";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+ForIn_1( { length:4, company:"netscape", year:2000, 0:"zero" } );
+ForIn_2( { length:4, company:"netscape", year:2000, 0:"zero" } );
+ForIn_3( { length:4, company:"netscape", year:2000, 0:"zero" } );
+
+//    ForIn_6({ length:4, company:"netscape", year:2000, 0:"zero" });
+//    ForIn_7({ length:4, company:"netscape", year:2000, 0:"zero" });
+ForIn_8({ length:4, company:"netscape", year:2000, 0:"zero" });
+
+test();
+
+/**
+ *  Verify that the left side argument is evaluated with every iteration.
+ *  Verify that the name of each property of the object is assigned to a
+ *  a property.
+ *
+ */
+function ForIn_1( object ) {
+  PropertyArray = new Array();
+  ValueArray = new Array();
+
+  for ( PropertyArray[PropertyArray.length] in object ) {
+    ValueArray[ValueArray.length] =
+      object[PropertyArray[PropertyArray.length-1]];
+  }
+
+  for ( var i = 0; i < PropertyArray.length; i++ ) {
+    new TestCase(
+      SECTION,
+      "object[" + PropertyArray[i] +"]",
+      object[PropertyArray[i]],
+      ValueArray[i]
+      );
+  }
+
+  new TestCase(
+    SECTION,
+    "object.length",
+    PropertyArray.length,
+    object.length );
+}
+
+/**
+ *  Similar to ForIn_1, except it should increment the counter variable
+ *  every time the left hand expression is evaluated.
+ */
+function ForIn_2( object ) {
+  PropertyArray = new Array();
+  ValueArray = new Array();
+  var i = 0;
+
+  for ( PropertyArray[i++] in object ) {
+    ValueArray[ValueArray.length] =
+      object[PropertyArray[PropertyArray.length-1]];
+  }
+
+  for ( i = 0; i < PropertyArray.length; i++ ) {
+    new TestCase(
+      SECTION,
+      "object[" + PropertyArray[i] +"]",
+      object[PropertyArray[i]],
+      ValueArray[i]
+      );
+  }
+
+  new TestCase(
+    SECTION,
+    "object.length",
+    PropertyArray.length,
+    object.length );
+}
+
+/**
+ *  Break out of a for...in loop
+ *
+ *
+ */
+function ForIn_3( object ) {
+  var checkBreak = "pass";
+  var properties = new Array();
+  var values = new Array();
+
+  for ( properties[properties.length] in object ) {
+    values[values.length] = object[properties[properties.length-1]];
+    break;
+    checkBreak = "fail";
+  }
+
+  new TestCase(
+    SECTION,
+    "check break out of for...in",
+    "pass",
+    checkBreak );
+
+  new TestCase(
+    SECTION,
+    "properties.length",
+    1,
+    properties.length );
+
+  new TestCase(
+    SECTION,
+    "object["+properties[0]+"]",
+    values[0],
+    object[properties[0]] );
+}
+
+/**
+ *  Break out of a labeled for...in loop.
+ */
+function ForIn_4( object ) {
+  var result1 = 0;
+  var result2 = 0;
+  var result3 = 0;
+  var result4 = 0;
+  var i = 0;
+  var property = new Array();
+
+butterbean: {
+    result1++;
+
+    for ( property[i++] in object ) {
+      result2++;
+      break;
+      result4++;
+    }
+    result3++;
+  }
+
+  new TestCase(
+    SECTION,
+    "verify labeled statement is only executed once",
+    true,
+    result1 == 1 );
+
+  new TestCase(
+    SECTION,
+    "verify statements in for loop are evaluated",
+    true,
+    result2 == i );
+
+  new TestCase(
+    SECTION,
+    "verify break out of labeled for...in loop",
+    true,
+    result4 == 0 );
+
+  new TestCase(
+    SECTION,
+    "verify break out of labeled block",
+    true,
+    result3 == 0 );
+}
+
+/**
+ *  Labeled break out of a labeled for...in loop.
+ */
+function ForIn_5 (object) {
+  var result1 = 0;
+  var result2 = 0;
+  var result3 = 0;
+  var result4 = 0;
+  var i = 0;
+  var property = new Array();
+
+bigredbird: {
+    result1++;
+    for ( property[i++] in object ) {
+      result2++;
+      break bigredbird;
+      result4++;
+    }
+    result3++;
+  }
+
+  new TestCase(
+    SECTION,
+    "verify labeled statement is only executed once",
+    true,
+    result1 == 1 );
+
+  new TestCase(
+    SECTION,
+    "verify statements in for loop are evaluated",
+    true,
+    result2 == i );
+
+  new TestCase(
+    SECTION,
+    "verify break out of labeled for...in loop",
+    true,
+    result4 == 0 );
+
+  new TestCase(
+    SECTION,
+    "verify break out of labeled block",
+    true,
+    result3 == 0 );
+}
+
+/**
+ *  Labeled continue from a labeled for...in loop
+ */
+function ForIn_7( object ) {
+  var result1 = 0;
+  var result2 = 0;
+  var result3 = 0;
+  var result4 = 0;
+  var i = 0;
+  var property = new Array();
+
+bigredbird:
+  for ( property[i++] in object ) {
+    result2++;
+    continue bigredbird;
+    result4++;
+  }
+
+  new TestCase(
+    SECTION,
+    "verify statements in for loop are evaluated",
+    true,
+    result2 == i );
+
+  new TestCase(
+    SECTION,
+    "verify break out of labeled for...in loop",
+    true,
+    result4 == 0 );
+
+  new TestCase(
+    SECTION,
+    "verify break out of labeled block",
+    true,
+    result3 == 1 );
+}
+
+
+/**
+ *  continue in a for...in loop
+ *
+ */
+function ForIn_8( object ) {
+  var checkBreak = "pass";
+  var properties = new Array();
+  var values = new Array();
+
+  for ( properties[properties.length] in object ) {
+    values[values.length] = object[properties[properties.length-1]];
+    break;
+    checkBreak = "fail";
+  }
+
+  new TestCase(
+    SECTION,
+    "check break out of for...in",
+    "pass",
+    checkBreak );
+
+  new TestCase(
+    SECTION,
+    "properties.length",
+    1,
+    properties.length );
+
+  new TestCase(
+    SECTION,
+    "object["+properties[0]+"]",
+    values[0],
+    object[properties[0]] );
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..ef9d88a7870a6ccf0ffde8824ce786300a1f212c
GIT binary patch
literal 16140
zc%1E8-EQMV6n2*F?skO`TmUy*SSulQRgsq6OOlE<%|b<+A`;5Q3RR9XO@?*sXgp~*
zkHIC+zzgtHfV2+)XU2B?lQXUzoL`)qB=d95%y+&yXU@#j_;_TIquPKNy`#3t=!k3Y
zX`1Gm&WLC|%81G7EpauM8=MS@&0Vc_AY0d>U5{OtFiv_`25ZZ%4?&1U-cr-BtjQ@c
zErXF>%NT;FTZ6?5Ok>2y(|-fQJ(YT!w}v%UW>J?P38CUsJCJ|9!r!6bktlRIqjvx3
zG5mhzurvGm%i4ioHe2^%rtS&UT}&>!zkq7AW4qbtoL#nN>UN;6bJjU;qP?z~KeS`L
zqGQ*gK_xNv88u#qO6|Z0Tn)v3UDG}gg;CRhNvP4ah=;kssbgyopwSy@_q3j0=&;bP
zzFt8CFjY7Xsp4HQ;xrWwlN!390eWiGrW|F>iPzw)2fU&;lrSmU1{x#>g9GEsii$j^
zoG`;`%O=gYBSu_T%(x<FV~uAd??T0m13$kwJbW=Ld;0CcjHxUZ;J;S~@GMn}09dTe
zX5-@cdL7XHXEo>|E}{@@KNWHZL<a&_t5s_2`qWR)1$L;j9mtW&NjMe^hz2<M$Z!RC
z!tWEJ8LU56M~x7<#AGoH#X^PIG2S6AGCR~OCa1nBbNvv??-;P*TPP*0<D5Hv#gzZ3
zAdCiP8f+3#Bvu22Wslqzx#1e4{Q*zv6@vCdMGF?03zEe}08yc<m&@EEPFeJdrHH9~
zHMULR^rHSxU_squcVe6H{SC2wD~zDQkihi4Jy_T2O}t-nc(T@&rNK}Wv<Y@`-^b+$
zOHW1T+_HTIeIG=2IH|j=oxnu+ZYi<4H59Mw*4VQAX5KikR@q%QK48>R4jUTQ6gyYW
z8^{Ql166n&mmje}lrNwpk&1IF8zyOtI}t<?b4X7E)Z5YKQ%&1R&T&q+3)G~2TeMC%
z-yllg(_bi~<^>sc2@7R)z-JRK<v7y9+K36C#wVzd&VafR^%$V{+vh*|6P3-2k8>La
z_~QVa%bRq_TjXxx;am8OU==CC_5fS|xkJ}SP{9azVq50`RW;oulx&F_h&vw68$p+0
zA$0i!ql><;KYLbkCL?EBW1(&%IAayUnU58mIV>r2FJ*QmWlkK&A_iimHROz22xmSE
zIpa@$FG`;0xv8_^={$NQ9mD-4hI<C0Z4EHU;a~|&8e{&#fLWFoQ76Q5Y^Nz+#CHg3
zZlt2L;<gx7#rEH@!@M;y>YuA3oPbRkLzl|8ZKvONDLBH$moRFk;piO!J^6ZD027B=
zyqL>|Ejz_cyJLSe-9~3R#jT)tt?)fTmO^~c`EFa4;XTHiJZH*R*z(OjDAaKAl^hkk
zqC@5D_mN5dMEM}}ACW{Zx=iMG1Zl{`u(llYja2WwpUL=WMs^Dqse<N(vO4ja<lR#Q
zR7ubfRc~n1Yd$5i$-Fw_9ZQgM7kFU4^=A8g7ctwM5p`L+OmTbPFkIx6+KV*M=3#P5
zi@7M?j7#!T<XVf&eKw{;#T|qz-Ey3fPHo)?U+;*bs;=)X$p;qldO~=L=dTy=d?Gz4
z6f$;kqx!R6uV;Mykz2lSMFeW}y+yn)Spq=9xae`MT6nH}yNJap##pc8tFz$@M`H-p
z-id!AzWH0kd*b3kb{q?~^U|_oL2gALe~l$0Mb2AsW3a&D|3yMS`!K#t=<_7>$k|$%
z(C1F*%iMF_bI)I~BZKlBrcCI|guWEH!6M6qUMmxNmHaZHFBAGQq2HQ>K3@DU4|J?>
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/forin-002.js
@@ -0,0 +1,77 @@
+// |reftest| skip-if(Android) -- bug - nsIDOMWindow.crypto throws NS_ERROR_NOT_IMPLEMENTED on Android
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          forin-002.js
+ *  ECMA Section:
+ *  Description:        The forin-001 statement
+ *
+ *  Verify that the property name is assigned to the property on the left
+ *  hand side of the for...in expression.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               28 August 1998
+ */
+var SECTION = "forin-002";
+var VERSION = "ECMA_2";
+var TITLE   = "The for...in  statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function MyObject( value ) {
+  this.value = value;
+  this.valueOf = new Function ( "return this.value" );
+  this.toString = new Function ( "return this.value + \"\"" );
+  this.toNumber = new Function ( "return this.value + 0" );
+  this.toBoolean = new Function ( "return Boolean( this.value )" );
+}
+
+ForIn_1(this);
+ForIn_2(this);
+
+ForIn_1(new MyObject(true));
+ForIn_2(new MyObject(new Boolean(true)));
+
+ForIn_2(3);
+
+test();
+
+/**
+ *  For ... In in a With Block
+ *
+ */
+function ForIn_1( object) {
+  with ( object ) {
+    for ( property in object ) {
+      new TestCase(
+	SECTION,
+	"with loop in a for...in loop.  ("+object+")["+property +"] == "+
+	"eval ( " + property +" )",
+	true,
+	object[property] == eval(property) );
+    }
+  }
+}
+
+/**
+ *  With block in a For...In loop
+ *
+ */
+function ForIn_2(object) {
+  for ( property in object ) {
+    with ( object ) {
+      new TestCase(
+	SECTION,
+	"with loop in a for...in loop.  ("+object+")["+property +"] == "+
+	"eval ( " + property +" )",
+	true,
+	object[property] == eval(property) );
+    }
+  }
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..98bc68e2a3059a0c143533b45c3731dc56b9ccf2
GIT binary patch
literal 5482
zc%0o>-EPw`6n0_!NnC)qhg^aHb(^@DP^q+b5mefWw07fia+A}>nwJ#Y={6pLCqm*y
zcnf~+xZ^lUn=ExYtxA=R-ZVM3&++-rXMc7YDjaiYHawtiv*!plR^&DzL^{D3h|2^x
zicLTgsi=Yz@RcNudepm-9l9+g2nFsT6}@Qa8am-{#vID|`3^Xo3UIsh1YJ$2xM*<b
zScS7UkIJ1Wu05fA7K}5gn%b%UHR{o8Z2XRfd)g?KVE(B20H0e2@4E+kEqlLFPps2c
z-Lq%6`<;*7xwbpl*6;LpZR4mzd%tHIRl_!Fv<~L1chM?9hFqmh*<7Asdo7boaeu@h
z!M_-pFHZ=0sEyf5VTBkSaEMDl6$^ZF3p*V%-z9Eh3`APyB(7!!RxX`K6yo=E!iz!#
zB8o7;2sn~3pD81WT5*Sti!@_H1|o9pBP;TgF;;O3NY>>pQy?hsMP2N(F@h;|#<eIL
z9vVFl1Mzx&ePiD9>^}zC6tG-)e^m$X9NkNSR}<Q9?`<D#UITRhR)el#n<)j`$J(z4
z78_dDY`eY&F#o9r<^mlkjm8^qwzf8xqj4IdH?30?3)0Z0+}o(7nb~Q)w7dckDn?<k
zIHzFcaw~!j*&|dRq=7v~waKS`Q*wQT_EUky|A1By{a`m36{P&FW*{+=k&5$7AiV(a
z^b_-$!%z{yMxM&Y)s9}KfmZDDN|3BhS#^U|yj+%^@q+ENU@5MC%llEymX|w<E+|_U
zmylr2qPmgUBCkp~DnxPc|DgD@8WfFJm$I~XO!2<yE~UMlVX8wKFoiNloWPgxIn*}F
zaXvowD7xpek*^2m#A%A$C9;-|@1u@^DrZq&X}>I>x5;md2hMSnUi>}al8*pK-H`Ky
z?Q!b`3H@Y}&?S!t71Uv6gnp{8oRo2J-&z*6-dO`ndO^rtOMnW6Z>=vN`sIW#u1bl=
zwJw~l{Iqso3q7vZHkD9tO8bgq*YXs*Cg-0zHsIClc~asRudGuK1mG+6T{KX99t6s>
ha3iAJQh}-NE897j25ix?xZ&4>wL~74yain}{{yQi{rUg^
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/if-001.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          if-001.js
+ *  ECMA Section:
+ *  Description:        The if statement
+ *
+ *  Verify that assignment in the if expression is evaluated correctly.
+ *  Verifies the fix for bug http://scopus/bugsplat/show_bug.cgi?id=148822.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               28 August 1998
+ */
+var SECTION = "for-001";
+var VERSION = "ECMA_2";
+var TITLE   = "The if  statement";
+var BUGNUMBER="148822";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var a = 0;
+var b = 0;
+var result = "passed";
+
+if ( a = b ) {
+  result = "failed:  a = b should return 0";
+}
+
+new TestCase(
+  SECTION,
+  "if ( a = b ), where a and b are both equal to 0",
+  "passed",
+  result );
+
+
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..636402c5aa0f1636a4c26e4d2c40459b5774a2bc
GIT binary patch
literal 8204
zc%1E7&2k$>5FRU#1d0R2fn!ik98xK#;6^DXwxWQmj0i{x$JA)IB~N*@BW7l8>lrvu
z#Y^xCJVst155O%|+&IxayVm}AR=+EoRIH1nnVtUmy8GMS-j<Cg682ihz{9;>pvA<p
zTZ}Ois0px8Xb7x01;dQx7RC@+!&<xU>Q?^fzA>OJgfF@7xuYMT5DDiZ;8ISXLLj+@
zu*=6N>Xhr^Lck|Bp8Y%K=Bd-$IpuPuObTQ7NGN?;yY6qYXmNoyTE=P-jrKmm-$#4^
zvJb|#cGK01-8;D3>$LlaKXxzeeTaMg!~Rjnd+KH9=U(Ad-iRh%u#+>wt0p;s)~Co-
z`!u-6*eA4@#~85{d>|nKk6WQ4*1(HSL=>_xT~s;?P^y>WiI``0I2Hd~SUgXK(oVww
zHQ-4mB4NGZKS(Y(3^75(P=I!#BaCO+7(Xznth~r0VL@}*bC-0^CmM_)k9V9mGQK34
z;w~xf4<9}H`m*fVcLK9dWxW8uy*_|1r)nJl-^Ptj`-lBkU;Piz{r7s%^-x4D*nW0F
zS`aofs$C1`OkM9nkkbp989of!NYpt?2{+<y0LJwwu4euWw344b_^3wFJ#CBJJeLs5
zuD>h3ev0d78WZ7rTm{`%M`~2z@?SfiWX7cAdYV&2g@Cu#B(Eh5Ez@FjY|DB{(1T3T
zmPM`v$@a*fHk#GtvbM!@>b;^A-?cQYXqO84`3GLpDCcJyqb?evMKCW&Y*x|Lp<YMK
z4f4xD_V(Lakk5&E50L-chy05Ye>U>`>3(1@<DsU9e)8NT0-Fc)$?s3zr-1%8r<4wq
zlE9<6klnD?RYSgWLt6#NsWZ0qG|tcBD4-{>{KFV^XTt28X%yi1cMzq#Ho*(VfS@On
zoq-Cc$uDQ4+cj=A!`(X@dR~-6z2{8yii4nE@GPBQZsv14i62Vxj(nsT3+o^2lpytU
zz%|akzF@_%6M2eR6w6KgS^jBw0S6QkPU$h1vlK9{M6i-Eb<kj2^z~04Z>;u^UJmL;
ze)<xq#3^~fue!06Db9(UWlHgYDu}$EKXt86hR;7vi=x1m6dnm-#%83#&B+Qio1eCv
zDdq21Fo>BPvcXMMh>}=532~z+a(mOCH|$!bKi=}Hxhq&a;MwFUzE#6h{FYECw4)wz
zFI<L|+!p4!hM_pG?80Z%NU89kVu*nZE=Cb$bsulnU^h$!Z_uO)PFy}FuT~bkPpPI5
zmlv-ap8P)?X2p3cZ53FcA_Kq1w8kaIBcdv;sDib!id=g9_zKf%<@rs;tzi36`pL&q
z2O9WEvA0avco7jV!wj{W-}jl{RtSC+LyaCRTK0A6<B6SSCiq;ap{eh}+17jdySPr>
zQ=1#8=<C01q%SzvR<iWmbqfRHl}EYv>7GqR(p0f+s$r8iW%_1hsB}{*HTlLf>b)w8
SSeetR8po{=<%*?MSpE-v;cwgk
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-001.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          label-001.js
+ *  ECMA Section:
+ *  Description:        Labeled statements
+ *
+ *  Labeled break and continue within a for loop.
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "label-003";
+var VERSION = "ECMA_2";
+var TITLE   = "Labeled statements";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+LabelTest(0, 0);
+LabelTest(1, 1)
+  LabelTest(-1, 1000);
+LabelTest(false,  0);
+LabelTest(true, 1);
+
+test();
+
+function LabelTest( limit, expect) {
+woo: for ( var result = 0; result < 1000; result++ ) { if (result == limit) { break woo; } else { continue woo; } };
+
+  new TestCase(
+    SECTION,
+    "break out of a labeled for loop: "+ limit,
+    expect,
+    result );
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..692150e890bc0d3370c984f977233d7586eed1a8
GIT binary patch
literal 13862
zc%1E8%W~sH6jf}7K#B#$7ic+Dppuzl1x~8+Fp#QDCSWrgYHF%&b?hdxTGeW0#xV00
z`~fWB6Xq8vHp7|^U`rJ{iUoaJlJ#)6EZb6IC(6cgKknn)NB8aP7WZ8n@3)2+S^J$n
zBQ7_ZhGBSp>SDtp4EH&?!k*!A#PJ9_+%sA`a&;@Y^}zEm<JfwFSVwMsOAxW~3(`ln
zJwC>L8!>F1p^+eUg;;u^k6i9gz73IgEcv#tkUe2$6OZo$QTS`^$gjcRk7D2+40@aq
zXR!aS`2Q63u-(NTZ|#Jm(d<@o_Tkj@rkL)ukGdz1&!*;pN%y3C+E(s*(*C-W+Le^i
z6bm*IGAh{w8-#KpuzHoBeqtE!!C=w^0(ydaHV&{woKVMTh((vgu?#C5q%5{y$QR5l
zOcKi>S^N`8oX3JP$)P7Wh@A#;2v>T?VX)xD68=Lj2xgMBBg~x@Mh#3zD@pQ{aLkb1
zkxSYyT!uXlG~STf*!~n{a0?p@|MBkb!)e-+&j4l>%W?t!`{n?icGWTfep^hmj~*R7
zTLpCgy%}^BDWVi?KZvpxw#+yaFNAZ<t`iZGd~qy>3WFn&#}kqQZjjnBHV_;5`hy_`
zEu*IjK8R7F9^>iMotqG|s;`T#?~C#0OgO@qVidD3J*5MU%C9#R&Mce~v2lVC1cEqu
z1HZQM1veNO40)C>5ZaCzRZMa&NUBTzFk$M$WnqbP;$0Jp>*l7K+f>Rw{}im7S^s?8
z`ws4KX$~#}cj5$l>5JVPG1<scI7S?u2OGw6R?0U6l+ZPzeQ>4Jy9E$+AC&BCfW(k|
zRLtA1Nk_$zyp)a*sis32Ba0nEb2HouK-KbGns`WAZMfSX!f%!i;oom2gkfU0WPgAw
z#`l=fRS993s3J>I2VYP0Ziav=87@s(P}Nv#z2jE*RFMkYKkBo$K6|T;UM;8<s&NM*
z_qY1Ut&iNwf>sY`MLMi^!~$HroJXh6eWwqvm&u1rNOr_K@WxJGe13tQ@J+=P3r1Mj
zAZVKOs5K7$lQPO#PmV_NW`aFxyPT)#fR!es=j^fgVlSv$tevtM*iTS;kTW;kXMx9J
zDs!E>VUhvdP$K>8%(v}uS)hSxRq@x`8HG~H$drvlE{QPqq+5z$66O-F#?z4gXDBj#
zaj}$GEv2Z^YGsjBJ^u%mEoQsCm^y?|0I2gjllsot&s(8)myno5@R5N7t25~-YA6)m
z-xZk*^MbA*Nc#2+SC~7m2S8~LCKU?^6dPMHWT3k2u%$9qQuHyULz*~}Qm$sx{-vZ5
z^qyxlob~=A?fh3$5pp7EPZB1E`NX4kO6Vo+^iF(h8|PbUu2ZUTCMXrldksbVVbQ~!
zj$G<HmNIry?S`BnN>o?ddung0Ft$JiU!1v*@TixvT4Q3JStwLu^tp)UJE-=vz$I_w
z@^S1EGY@Bm(Pi3$f)r99dsHXYg3f)0pI3fS1;fGh<Oq3+Tew8x*QVl(TaiZGR}(va
zYF<!g-ZvvJG>KydZf<^P{$K`?Xm0O?gWpE$o_=P&GJD`QW<bb%RY=A|N^OjsJRvu9
zcc6v3qG11*FU#$;0?j>5%9}f>6iIe-yN&i*SvIum07Kp{Ve*sL?XNShGIeHwALiYf
zLUY#pU|nghf2H};R`|2jy3)MWmFDZFqB^Q8&4sZ1rlDwP)RpEPtTeBwMy#N8yi1kl
dFDqPWo|jQ+rt8eQ&|J9+t1dLFDKyi={{zM!<njOj
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-002.js
@@ -0,0 +1,56 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          label-002.js
+ *  ECMA Section:
+ *  Description:        Labeled statements
+ *
+ *  Labeled break and continue within a for-in loop.
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "label-002";
+var VERSION = "ECMA_2";
+var TITLE   = "Labeled statements";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+LabelTest( { p1:"hi,", p2:" norris" }, "hi, norris", " norrishi," );
+LabelTest( { 0:"zero", 1:"one" }, "zeroone", "onezero" );
+
+LabelTest2( { p1:"hi,", p2:" norris" }, "hi,", " norris" );
+LabelTest2( { 0:"zero", 1:"one" }, "zero", "one" );
+
+test();
+
+function LabelTest( object, expect1, expect2 ) {
+  result = "";
+
+yoohoo:  { for ( property in object ) { result += object[property]; }; break yoohoo };
+
+  new TestCase(
+    SECTION,
+    "yoohoo: for ( property in object ) { result += object[property]; } break yoohoo }",
+    true,
+    result == expect1 || result == expect2 );
+}
+
+function LabelTest2( object, expect1, expect2 ) {
+  result = "";
+
+yoohoo:  { for ( property in object ) { result += object[property]; break yoohoo } }; ;
+
+  new TestCase(
+    SECTION,
+    "yoohoo: for ( property in object ) { result += object[property]; break yoohoo }}",
+    true,
+    result == expect1 || result == expect2 );
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..094149a6095f3eaf233b27e6de87ef9cb182fd17
GIT binary patch
literal 2344
zc%0=`&2HN;3|89}+odnCm&gkk+156P0Yxqub}bl-O@%0yOUXg{EPIf>&91%n5k^V=
zi5)v_fb>u_7e_Stk^DYVPF#^|94Ge(ay&~(<xZRlA#7@L6jBkUPOZ@j>%id(GiOCI
z3f{?f=nrd=9LnE7vk>};K{Reu3R*v2W2%8rPGQARYoN9vh1?bO=^pHL$U9ksu9InH
z-PnWrUor~EX#C2C6K}MRRJIuV|C?k~o(^|q^s=+zoc}(H&|!-M?p?uLV{8tbGMPAK
zr=`lIkfqU3LtvTL^Ua(zb%Ydut6KM^FcdP(IRi%ul_}RN&t-J@DOo^ur;q}4#(Z~+
z=~7anY=hlS3$05|Vr=DAKO<Fr!8b5Rtx?XZc?u0^ZxwSRAG`IOS8tn|T8(LwE(1iI
z*cZlhxb#r*9|k(>az5GQgx0c}P0gMqtnEV^p%$6<ZU9<hy*mCE&;s3Yw7XFb3G}pB
zA*pn$vXd}`x~M_p)IWdQ6}JcWk`R_{dZMH+tJw$lp(z*N2PyCD)e)(?;%mA?n!mXb
z1v60$FH}QOr?Eb=zOWs_hhp-u%URq&b~){C;6X{=cnRLO0vBv2%ni9Kv&#7kJRrl9
h=(z|F9%ONxeb@^#3+3-ase1Q}n&oc81CqAQ{{b^N`WgTL
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/label-003.js
@@ -0,0 +1,15 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+// The colon for a labeled statement may be on a separate line.
+var x;
+label
+: {
+    x = 1;
+    break label;
+    x = 2;
+}
+assertEq(x, 1);
+reportCompare(0, 0, 'ok');
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..fead3406c68e67f150c8abaccc3ce35a91ba0d4f
GIT binary patch
literal 12559
zc%1E8O>^5s7~X_ZQcj+scXTf_DGc;t(!`0|W+pY6+9^FSWY*Hg-l;5!-Br@u=(#uO
zoeMMk1^x{GfJ2Aj$bolPvc9|$QY6>uL^;Ir?&|$`p7-6a*InUzHreh@3AVO}CZnD}
zA0ULd>3RfNlo3<VGr|!USdbZU1V`OXHM*O8b(eF(1hJlBHdL?P03kMcNlk3q7yHDt
zF(cLh&p^}}X6XhKd%};tO)=kBdi!VCj+EJyi)|@X{&hFi*P!tiX!uYza>1xG*}etO
zz2irN<0rlT)9z;2I`91mdWZeJ(ZRQag}#qv-#HcLbVRsV=$1-G2cyHjR_L?-(_u<z
z(nbRYtR-yJS`oYe&V|6{yZmqyp-*IEk^+F9;;~HvY_XuOgVtft3+h<N3L9M(^B3xs
zbOR-^9ZJPNbBl{qxJ+png9dmLQHKg`bo7D&2NuK+J*9*x(GJj^HAW9iC@U%QkP5=E
zJyb*bFFi&$mmaSvZ)|@-vLu%)azEeNy0<7i`V4T^>1-C^x2r>VF;<&E_$GAp_nz#Y
zd~pTP{dYC!YUYSWu)QtiPKgmjuo2D1R{-h1SA%rUG~ZYxe|hh#`(NL`6uz;F;hZO>
zi^QsRzVE?OnXpdcC09>E5M~oUf9;LI%J`NC8$=Hi=_Rgk&B?m{zWCaK_Hzd0KZaJq
zM(&|I$#MCQHBAshFk*I*P$UxoHa9^$+vHRrMkiB|)hh+vi4`qbWF<(Jx4y~_BR^d(
zZE?Yjnv;s}TbSl;J5vGrGYneK253mq04!nDEMf^oDV@)CSusDI?6lBVh5qe>CZI<x
z^p}YGokpPlp@qIOW*f~w|9uO6Wz0IwK!4OiUm3I8%|QSBdO`oX0Q#Qm+5|gAn60&#
zzjMqR*-l<J%wH8wF)1s99ebdnMY=N5f9a4u&K$tyfan0O9vmyHO<stcxzy4hz-yes
zT2d>M`fEY@RJ*O%Ds=;L4SA5^E}FR>eCRu-ykAaUHOo6F%6IvNW5VYn;)KcP!GIY7
z(1Qx%*tIT#CuO7R<*GHtU0Z`ZO3RTqY?0`S1;^*`u6(~_h45xTAc)cy52@q%Nl+6N
zy$q)Mg>{8R)=yEofGItNF!Jpjf69;7yIQ^u@PCs=DjHoj!*&!OT;&g>Im8thC(=0l
zuA6A8Rf4jF*K$-BT$u?cDfmS0CA2$;qCD-%^pai|m;Unu<xMBdn56V(3r>Hcl@y$`
zA>6>aq1g@;)Rux!kJgOusF?1PQw&zA*}$UQWOPOy4C@JK4*T{n2O_Qb3-VkpQk}I|
zje>wz?)(Px{*5ecfji2g^>Ecert5I>qc2xPol!OLRdyWfN<Eidj@_B(`i=!NGo3i{
zt-R9CJP<VkL$sv-cfQeYF=P27Sm%jYWw`DvhHKfdT`JFs8}^px`aE~8D$j`kY<aHF
zvvE~<-e`GllIN|`JZm<S0p0VBhSZ=TyJe|9OFN}m3U0V`XupHp?6kSrB<n|2bF;x4
zr2#o#`i0U4w9C`EjLDqSL4RFyI#|w6o0jk!tjhO~577MA$OinM8jfp>8No03XNCzN
t88K<xz>FA<KN}Oq?;3_WVi}Yh#ZESLbgM19=-Q%|(7Z&<xs@!{{2z|r3R?gG
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-001.js
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          switch-001.js
+ *  ECMA Section:
+ *  Description:        The switch Statement
+ *
+ *  A simple switch test with no abrupt completions.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ *
+ */
+var SECTION = "switch-001";
+var VERSION = "ECMA_2";
+var TITLE   = "The switch statement";
+
+var BUGNUMBER="315767";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+SwitchTest( 0, 126 );
+SwitchTest( 1, 124 );
+SwitchTest( 2, 120 );
+SwitchTest( 3, 112 );
+SwitchTest( 4, 64 );
+SwitchTest( 5, 96 );
+SwitchTest( true, 96 );
+SwitchTest( false, 96 );
+SwitchTest( null, 96 );
+SwitchTest( void 0, 96 );
+SwitchTest( "0", 96 );
+
+test();
+
+function SwitchTest( input, expect ) {
+  var result = 0;
+
+  switch ( input ) {
+  case 0:
+    result += 2;
+  case 1:
+    result += 4;
+  case 2:
+    result += 8;
+  case 3:
+    result += 16;
+  default:
+    result += 32;
+  case 4:
+    result +=64;
+  }
+
+  new TestCase(
+    SECTION,
+    "switch with no breaks, case expressions are numbers.  input is "+
+    input,
+    expect,
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..a85dc6f701a332dbb2336da9a96a64c1585929ec
GIT binary patch
literal 11920
zc%1E8y>r_(6o=e4aXa*!yAIjPOdZmmeI0wM>n}C&o$LB4CGD1jNLa#!B3S^m<FRwM
z`~$g8`4{rfbnMn4L&x5=?|~G*1TvyYMah{SED8YM$M1arcu##51}@v}PZ@P~hqmB>
zA|DV!r0oZcI9xDW@e3x2R8+AU^OPk0ZN0jmeRW?-CKPiXQ!&)9eh5Td_Ke%qb+3+?
z?NY&<Q#u1u7gXd2Y#OLA`8K8UNb?<BP&Z-ba;bKaDE{@g_19=HgaMrBOC`8B*}V<V
z!@=R`_{Y=!c04wp`vm7Mxw5AtCe_09M=(7)9-RypW{~LP!B4{+(X12}Ea<&Sis%Ip
zKZdScslUD?<PHvIK?ZO+9lI<-k1FnaWCIpG<(@;Fc+eNAg<`&FPyjuZL$mm2E^!qL
zUuX_v-~ewD?r~+b|3S3i*Z~jW=bQ;m+5>|Yg)svY)5?-O;fe|B4)v13vp_H@QRAN0
z#tj!Jqj9A+?pHfIUoR3*J|mn>JljS1_4*KA^wl;Hz6BG5!yopaybI|5yB>56IieM8
zKSR1xW<?%sCHeMRNT&>kb2^$cO9e5Za0tmdBP$|@`I|99#Uw1x{wZt)O-%rPjA5#%
zQ27*GnG=huzc0FO!T6;BS9l1cOpN>!e^R3ItDeD~!7Zt{$}qxEfbBK%Y?qxYBKTyg
zihPmK{gly)N!Eg7b@?ABtnzTVw!{??UlNM%o12y$i*gS792RX99W*x5DM%u?U1cSb
zgmk&BmnL&}uY<lWX0N|%1^TTH`ubkK*9!C}9rU#^+iVB=haL1yGDQ<IXEzJ_-z%U$
z@O_t2uL`qXE12(fnAgC(oioi1!~D0(6qA!OIyOcuI;3kO{kI9}M}=D;E=X>H`oVLG
z-0)U@;d94)3v6%|=!{z1s4ptQr{0x$XQ^xW4YUKgyK1LK^?m5sSnkYLKCuwO<-WY~
zZ1{Y@yg2v*STJJ%delf6`_5JLq-E5zQjey%8(T4Fc{*6;Nl4f1yZi$0;`>XsQEo*B
z1X9Kh3-^Lh6`LYPOwAkX8hcHjlYEy4H3c^c-4cD4UvE}*`Lgtzl19!OeKDhM;vZ7S
z4}>}R6$q#DIJ`6^ntJ8(qQM&}YI3eZ!pRbTf@cZi38E@a4=}t?>*@|@xubk~Cytmb
z^>+Iof0DKIKa4Ki!oFcR4pcNaB3DoLjGwuh9<g%@Qt52qaA^xZ;~s_m1UScYhg5<g
zo%9O{e5rDijdzU-hmV?qx8rv8qB>fljd<4~w(m*yYlu6dNvH<+YB?U6`VH6Jj{RBS
zhn@qOnNK`?tE|5;cSHlh7%kNQ{<r2MW=ekq`#e+Ybl1H_cU{(PS8C@>nODp4N6(PI
zJ3C*e++DG890*3A=CO3?n7Jmc|0AV4*P47L<IG)dXznxCyP6v|J3F^&=bfePY&e)k
z=AIu~kb}Y4T?TKrAo2DxcvN{a#n)Si^Q|t<+w`Ebx^doOrR$VkuDsB-3FBBbK%XqR
zwS2K*xV5b2cRwrmfl}?d=shz3DX9hjr<UhiW6Tfo8_Uv{JBv%JT8*|Yjg4tn6-*it
NEeo}hdgxNa{{ujVIU)c6
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-002.js
@@ -0,0 +1,63 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          switch-002.js
+ *  ECMA Section:
+ *  Description:        The switch Statement
+ *
+ *  A simple switch test with no abrupt completions.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ *
+ */
+var SECTION = "switch-002";
+var VERSION = "ECMA_2";
+var TITLE   = "The switch statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+SwitchTest( 0, 6 );
+SwitchTest( 1, 4 );
+SwitchTest( 2, 56 );
+SwitchTest( 3, 48 );
+SwitchTest( 4, 64 );
+SwitchTest( true, 32 );
+SwitchTest( false, 32 );
+SwitchTest( null, 32 );
+SwitchTest( void 0, 32 );
+SwitchTest( "0", 32 );
+
+test();
+
+function SwitchTest( input, expect ) {
+  var result = 0;
+
+  switch ( input ) {
+  case 0:
+    result += 2;
+  case 1:
+    result += 4;
+    break;
+  case 2:
+    result += 8;
+  case 3:
+    result += 16;
+  default:
+    result += 32;
+    break;
+  case 4:
+    result += 64;
+  }
+
+  new TestCase(
+    SECTION,
+    "switch with no breaks:  input is " + input,
+    expect,
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..61cce3be62830642b4f14314bce5dea919a7ea7c
GIT binary patch
literal 12765
zc%1E8&vWB66jlqAWrqU?_Kf$$%<eGlEH@@}rrQSSOeqY>EZlY!TTL|U*j`C)n*E2k
z@S6+&5;qPUIq;tBB)0RMCaFTQBt0~-WIsK9-=`<#JvU66gyOi-6FfL>`AQ~+y}=mM
zew+vvNF{tDuZ3pXa3lI6GMY6G?cI&yqbFJmWkm3dtCoHAO)wIQ8|m{f9G(e3<VpmW
zybq?XxhgmKJTd9`s>k)29k+SS!|`CD)aDqC;$P#?US^FcG+;+V8zrOe@!Rmd)jVyV
ze|6b7%-cqN_pxsvjo)hvZKk^4g6{Tt`=UA3gGQe<ziE|>7QOJ`hP~Uo$Q}UqbLi?P
z_2h`L_pq@DGJq?2Clnca+{id$`*70>83ioJ8)G$LC?6LI1<)sc*dhKNc|2=~SlJOe
zFakWuWF!sA|I_S-^8gegucT1cbOeM}ouPrrZ52&kNFx*vTlSXbO`?R>IO9D#n=qZS
zjO1!d?ng&QA5R+}e`YvSW4cB7uk|53tyLEYA3#U*^vjdyPc{JEf7XL85hI*n`##$3
z2`^KyH;%VUAw3zeHL_zz786G(6iy*n7kowJFn$Zcxay|$(SHJ4Wu_E>@8B{uT$yqR
zo*5IXQ-59NiXnWUKnh<#t5EIuBJS2q`Hww9&LB&!hJ}G}DZuucDLWKbhAG+Ynd-P`
z=<#Hr6`NcLlGVk3?C|QB%hDdtSn)MW@pY4F-La@7(4XL@{i;BhB8fXD9u>?xK0(hG
z(DI`*S~`wtu^aD}vhss7RtNxBVRIWu`PmsMfn!qeyz^*lLzp{Wu6MjR<mDG<ybK)k
zf=9B!_7d}}Gh%L5kRiC)VrG7G#>~($Gx)n}xXsl3?u?pOj;XnaHvg~O;1+7!WO_bJ
zBOjB7#rz@4TIv%$jC}a~Tts;yBY_+G0*J`U5uG>~X5XxjwpZKMk-rsTj0zfGm+jzB
z&9UhPs~6wFv-td+#fXE9KrlttDP)wSMNkXHg9@gM1aplQn-5sIR)RAH8Kq&(eCEHO
zp6dL`-P;05NsY1U^Kh&WZPyPheb5y+XUaHyPX(XFlFn7a?=(?LT$O-RH2nNB4a1zs
z%+5UP^eHYcob~KFV!covJjho}(Yo6z!k=s{RRmJPF7}cP!zD@vne4~=$G6h-&cqc5
z4{c-!r1q8U%ZS6?0&e7er(6T6!Q_G^u{Nd7JMSPf#BZnb?!CMKJUt!j(SE)IF+Yy9
zc$wnvNIB)|EMT4LQ0e?-_vyHw#Ay^j$d=s*pQ=mWj}%H6EF|R~e@f@^C-&QL01#%K
zI<CQXVL`860mMOlrvOI^Ah6v)1rR@?cM5Q%00P?$Q~;6R+9|-10tjqxE5A-3U^5|%
z4m7p~GA)B0WsWF&v@m7%>iz+7-2bnZFj17=>A{g62y8bnh!geiodO&wfWUSG6+mQP
zcM5Q%04lRR*Ea4j;e9CvE6;ahG9QzNsMZ=eeYj5~ELQUp-3s3JTbTWaZ1i5X2mgCs
o6nh;d_zV4s=h?iDCpGcj-YW7%ceXt%Z+a)Ab?dICEHYQ~zunk^I{*Lx
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-003.js
@@ -0,0 +1,57 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          switch-003.js
+ *  ECMA Section:
+ *  Description:        The switch Statement
+ *
+ *  Attempt to verify that case statements are evaluated in source order
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ *
+ */
+var SECTION = "switch-003";
+var VERSION = "ECMA_2";
+var TITLE   = "The switch statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+SwitchTest( "a", "abc" );
+SwitchTest( "b", "bc" );
+SwitchTest( "c", "c" );
+SwitchTest( "d", "*abc" );
+SwitchTest( "v", "*abc" );
+SwitchTest( "w", "w*abc" );
+SwitchTest( "x", "xw*abc" );
+SwitchTest( "y", "yxw*abc" );
+SwitchTest( "z", "zyxw*abc" );
+//    SwitchTest( new java.lang.String("z"), "*abc" );
+
+test();
+
+function SwitchTest( input, expect ) {
+  var result = "";
+
+  switch ( input ) {
+  case "z": result += "z";
+  case "y": result += "y";
+  case "x": result += "x";
+  case "w": result += "w";
+  default: result += "*";
+  case "a": result += "a";
+  case "b": result += "b";
+  case "c": result += "c";
+  }
+
+  new TestCase(
+    SECTION,
+    "switch with no breaks:  input is " + input,
+    expect,
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..4eae68618bb6f870f64113b7a03741f7fe54cb80
GIT binary patch
literal 28680
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/switch-004.js
@@ -0,0 +1,94 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          switch-003.js
+ *  ECMA Section:
+ *  Description:        The switch Statement
+ *
+ *  This uses variables and objects as case expressions in switch statements.
+ * This verifies a bunch of bugs:
+ *
+ * http://scopus.mcom.com/bugsplat/show_bug.cgi?id=315988
+ * http://scopus.mcom.com/bugsplat/show_bug.cgi?id=315975
+ * http://scopus.mcom.com/bugsplat/show_bug.cgi?id=315954
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ *
+ */
+var SECTION = "switch-003";
+var VERSION = "ECMA_2";
+var TITLE   = "The switch statement";
+var BUGNUMBER= "315988";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+ONE = new Number(1);
+ZERO = new Number(0);
+var A = new String("A");
+var B = new String("B");
+TRUE = new Boolean( true );
+FALSE = new Boolean( false );
+UNDEFINED  = void 0;
+NULL = null;
+
+SwitchTest( ZERO, "ZERO" );
+SwitchTest( NULL, "NULL" );
+SwitchTest( UNDEFINED, "UNDEFINED" );
+SwitchTest( FALSE, "FALSE" );
+SwitchTest( false,  "false" );
+SwitchTest( 0,      "0" );
+
+SwitchTest ( TRUE, "TRUE" );
+SwitchTest( 1,     "1" );
+SwitchTest( ONE,   "ONE" );
+SwitchTest( true,  "true" );
+
+SwitchTest( "a",   "a" );
+SwitchTest( A,     "A" );
+SwitchTest( "b",   "b" );
+SwitchTest( B,     "B" );
+
+SwitchTest( new Boolean( true ), "default" );
+SwitchTest( new Boolean(false ), "default" );
+SwitchTest( new String( "A" ),   "default" );
+SwitchTest( new Number( 0 ),     "default" );
+
+test();
+
+function SwitchTest( input, expect ) {
+  var result = "";
+
+  switch ( input ) {
+  default:   result += "default"; break;
+  case "a":  result += "a";       break;
+  case "b":  result += "b";       break;
+  case A:    result += "A";       break;
+  case B:    result += "B";       break;
+  case new Boolean(true): result += "new TRUE";   break;
+  case new Boolean(false): result += "new FALSE"; break;
+  case NULL: result += "NULL";    break;
+  case UNDEFINED: result += "UNDEFINED"; break;
+  case true: result += "true";    break;
+  case false: result += "false";  break;
+  case TRUE:  result += "TRUE";   break;
+  case FALSE: result += "FALSE";  break;
+  case 0:    result += "0";       break;
+  case 1:    result += "1";       break;
+  case new Number(0) : result += "new ZERO";  break;
+  case new Number(1) : result += "new ONE";   break;
+  case ONE:  result += "ONE";     break;
+  case ZERO: result += "ZERO";    break;
+  }
+
+  new TestCase(
+    SECTION,
+    "switch with no breaks:  input is " + input,
+    expect,
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f98fdf203c04652a13561b7b88df5589b0a603bc
GIT binary patch
literal 13611
zc%1E8y>lBy6hGM{frh{g6$Nupkpb*UAO$mui7YEY8C!s*Xy`Pn(@NT8eW&cL<cP^%
z0e=BidT8iqn4zPiprd9e($ewXo<2^ez0;j^XIZx0*xuWFZ}<0p?_=LyUiN#O?&Z6b
zwDzi&U_EJU8;0RpPLCQbCa5LZfVze&iKHjgmadWCRkQQ{R|~F7g`}-I5moi-YaoQv
z=gcCU4-crtiJ+|tIRQ}vB4!6H(v$tke_i4pD7~ct;S*(?xpEJM;!l28{p$_>0Rz`@
z(3OJOoxOMA?{cMHI4mDD9u?|^M!8ZeJuDqJVCZovzdM>Xo_+(SS4+iO`K!v@vup6I
zR<0e+zx6gg5yJ{SeMAPNY)jgqLMyvoI<D$uzX{Lmkk|d&6EJT(o9!)L0w6uIayb5f
z-Z6}uIOyjC@PLsfr=FpSWR7iY!KA0mZW*o7pd+Sa8tKKI0zanfP%8d`(cB^xj!+t!
zpaI@An9Zb?s{7uAatp}J+KdV%+6L|g7o){)42WOkA(K=PUR6^{&wGNpF77y|cEkH~
zl06WEA}7B+bak52#r4(taGi6DRB**OP%0i38h6eCy8o>QT}{wR1zQ#Jy3~|nXil=h
zQZP@oRmXCaS~^{Y4uT@265m1*Hq0)R8boyZ;kjvwSzwzw^xnYaCy9_X>S}hU4THh0
zZ^~ZZg7H%UJopkusi--JPA6o`zvMJr22K(&^eI9=faLGdn$xy41nYEVP%jGlXsRe<
zk%=J5F683_Gu&O4UU7uGhqz+)k?&(2Te6RQaZ96A?754|Y<R?4rkY^39brC!T55+A
zyR$Q@s7%YT;f=lp`@L|%azPb56G485xm!U_Bt{+m^V6N%pWVLud9*zf?IS61HazYp
zG25>?vnA4oA)-PSgwrc?rDLw|BfP8v3lhwVax-I6*@TD4WyD+}3*66XEbur`)ol5z
z8ubUHSxv$4iN2&sYKd20L_&Z5R(FZ`l8VRrAWX{=m&XD>t(@XsSG8apOW0wGc`jP)
zhFb^^(K4Mg_Jh7{;fck6c)>!ExdnG<Tk!iKwMXHs2NO;xxP{lIZaS@@_m^6udg`jt
zsb^>#-Cxhj!6IiOI$>A)-k5(e+OodrJJ9!w1HkE1d85+jd^F8liEdW>lUHOXS!Xdv
zoDe?2&{g|~U<KF%Z{#dK-x&JdL(H`Wv6^+Cc&J3NZXd~l>yN%I32&hPctaC^mULa9
zC+pZaJK(_MV|MKKYvAit#_Tt$ToP^aGYKl#|AlPV42|_Q9hVZRh^EtAA*0Iy?Wsw(
zM^VtgHUWLs$1%deC2W`x)(%;!LxzCAc#&?`4Q0N6PcL&>dm}c?I-+RAU`^V50uE;M
z1TIYu)5$?cM0V%R>Em{rJG$15viG+u(<#DxBAP;}saThzUQ_8=+ZH%;V6~}_JJwUR
zckd>A!S#1|=1{6$>ULA>3g<LYaL=|$vY2)0g7Sk7lw%4tQ?itowl9Q5@(W*wHjLRX
z4dQ*{aNV;INYs8l5d_;;_q;bIz@q8;8g`AJoO}>iIbIsVF^%xRrD4*tJbqCd^L)E>
z&HYk$CQfz-9it|UFHpy_^H<6LeA7@Y%<yXMFJ08k{%S3Z;o(iEeaGRH*pW@AB*_QZ
z{s0%ihqKkQijfwPR=3DW-=*F%*>|uR?Uqx`VgKqbIydL&hF%3C`+R{(&!i-b(?eKW
zZ5V@~MIQ(KX7eZU6<QdJLTReJ{`-p8srDqi3+_yN5-W2#dsf}rY*uBG19PjGXG!d!
zYRsJVcz1y~6^W~1rrO$XTbgPqo3FJt<4d)~U&HuPW*wh@Xr_4kl(21-c=5<P^Hv65
z#6_JIRuUSPQm#Dp%2O}0r@o^+)$B59w!I^m*~G#ik-9{=aA_zO<mhC*z1iXa0m#F1
AmH+?%
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-001.js
@@ -0,0 +1,83 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-001.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This test contains try, catch, and finally blocks.  An exception is
+ *  sometimes thrown by a function called from within the try block.
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var INVALID_JAVA_INTEGER_VALUE = "Invalid value for java.lang.Integer constructor";
+
+TryNewJavaInteger( "3.14159", INVALID_JAVA_INTEGER_VALUE );
+TryNewJavaInteger( NaN, INVALID_JAVA_INTEGER_VALUE );
+TryNewJavaInteger( 0,  0 );
+TryNewJavaInteger( -1, -1 );
+TryNewJavaInteger( 1,  1 );
+TryNewJavaInteger( Infinity, Infinity );
+
+test();
+
+/**
+ *  Check to see if the input is valid for java.lang.Integer. If it is
+ *  not valid, throw INVALID_JAVA_INTEGER_VALUE.  If input is valid,
+ *  return Number( v )
+ *
+ */
+
+function newJavaInteger( v ) {
+  value = Number( v );
+  if ( Math.floor(value) != value || isNaN(value) ) {
+    throw ( INVALID_JAVA_INTEGER_VALUE );
+  } else {
+    return value;
+  }
+}
+
+/**
+ *  Call newJavaInteger( value ) from within a try block.  Catch any
+ *  exception, and store it in result.  Verify that we got the right
+ *  return value from newJavaInteger in cases in which we do not expect
+ *  exceptions, and that we got the exception in cases where an exception
+ *  was expected.
+ */
+function TryNewJavaInteger( value, expect ) {
+  var finalTest = false;
+
+  try {
+    result = newJavaInteger( value );
+  } catch ( e ) {
+    result = String( e );
+  } finally {
+    finalTest = true;
+  }
+  new TestCase(
+    SECTION,
+    "newJavaValue( " + value +" )",
+    expect,
+    result);
+
+  new TestCase(
+    SECTION,
+    "newJavaValue( " + value +" ) hit finally block",
+    true,
+    finalTest);
+
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..876a7002460be237171591193eabf594a5b8d183
GIT binary patch
literal 12957
zc%1E8L2u(k6n3_SU04oq;ev#$N=P6?Q>Yf9DqEB|ZX1zJtHxa|2UJa*X*^oT4m0Dn
z;eT)ii66k3e}K61OW??jHxnnZlX2ptPSb2sscJGae)HzN@4ffEaSJ@?xcIQ(VAMRU
z+mv*;wxwwrv;7X%nuKDTlWWX0#u3MD>~W?Q@^W<{`e>0cOgV18M6@m+-3B2pz9lwt
z-EJA%E~2<uLv0Xsjc9zpMjajuzB!1M<-X=MatE8agz-ZmRQwe3@@sGKXBc=(3^GoM
z*E)O$K9??zYZos{=6N9>j`n9C!))C&tjcL^Y)(kADpu7Tn|V*n&~DvtWA4C!QtV6f
zydD!9)l!EAxrmlZJ$eu13i;5q$%p=XPt%@?!Kf3!_yjdv+_Ns?#P_sEu;?}Mnp!g)
z^y$!p;l9G*;FO^ra*Kca8c*87r*ek|>;O+{#3NjZk5X?zr3nZkR|Hcj+5?A=Dx)?`
zC@U(mN;sy-t;;3mZHHpU#EEnAG;W}j%xU+Fy}kW$$%DT=Bda#d*1Z2L&%EP6&BDBI
z!-Q$PC|-W`0Id7pa;&S!Aeq?q10mPJI>1*SWa0;4=AGP9%$$(oGconoFyV0CImqWl
z5e(RF+xFYL@SAT0E!J@n&ojrrxrA@Kc8h#Vn$P#Y+<*4Xv$^~+RH@$gtJDn-RaM!_
zfU+7njj*q%v>0oMwu0n3Jv8o!Et1R(XrtW1Oo29Kbs9bTs+{$G7{8$amJ=Ao)bgu-
zE8)n0s6Y?kMYJ2)NCXTJp&tHSe8n|NS`HuGR|xuixY2?|&Sa9sRbnxrCx^@28c#^S
z38A=ZFij?+F^K*O%N~tFbY?d_fr(rFxxV9&om2=Y`M!&hH%Yd(W}f&h6Hf@L&mHRD
z=sOMH&&(OQHFL%<nK<L|z!{1@V$B^P=m5`#EgS`&E$C^KsS48*R%BhzhQG(y3yWa~
z7J%z<c=^!qo88_gsiT}_a&(Y};uz>(U!29|h=My1J>y*kf@ilP4gb_Dgm+^u9Gia9
zM_nA=kvoAA<K~oBUE)PennAVF={tkzi690spSF=Za5|Gg0YM930XOjYnSNI#kMx=)
zx%Y18O+ZCFnM6fj)&kcJE#8xqCI(9)bj0B&-v}nV`RT`+4Bjjf89<n{Jh6Hto%K7+
z)X!Ux`7lojE8;=6IRZ`&ags3~{sbnDik0etUapk&+Nq_VR4lzxtC{EeQKeR_R=?Lv
z)l=iU3A|Rtov(&=-3k-4X8Rt)KL%n9xuB;9EAF26C*v@NZP&M7OLz6|n5SGUC*xJ(
z>XoV&TOC}9q~HhO1p{&0$rx21g{U&i2Y@Nvd}WwtqM6f;;>GcaH62S6t}U|lVsYce
zL@$bTdRDC0XLeVH)Nx4}SK9PGGw$hyb+?QQ)Fae4o_Qtpv;{g07X=J!S7H_U2@IgT
z37svv`kYQaHe{{|tS(a$H}bCPcv}(3>u!{ChS}}jnm7z6PiW$P&=lvHX@hB8I3bfw
zs7J{KW^q-^SnaB{U`~7Ix;4SuMkHxOjTG(h=WM8?ukMq<eyB>BYrxz$oNocKvuU)J
z*=QX^NTgA;jFYq!GF=ATRJ7&x3=g3btKpl4(?3xW#2bGDF-0YmNBawQ-o6tBO#O0s
zHD0XG_1{v0V}Gi65572FokbW3(CMEoNO*FL&25zFJok+c*FQJmx(U}63D;>%?TruC
UO>Nx->#79nbjCefYZD*-AMB^6l>h($
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-003.js
@@ -0,0 +1,82 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-003.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This test has a try with no catch, and a finally.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-003";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement";
+var BUGNUMBER="http://scopus.mcom.com/bugsplat/show_bug.cgi?id=313585";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// Tests start here.
+
+TrySomething( "x = \"hi\"", false );
+TrySomething( "throw \"boo\"", true );
+TrySomething( "throw 3", true );
+
+test();
+
+/**
+ *  This function contains a try block with no catch block,
+ *  but it does have a finally block.  Try to evaluate expressions
+ *  that do and do not throw exceptions.
+ */
+
+function TrySomething( expression, throwing ) {
+  innerFinally = "FAIL: DID NOT HIT INNER FINALLY BLOCK";
+  if (throwing) {
+    outerCatch = "FAILED: NO EXCEPTION CAUGHT";
+  } else {
+    outerCatch = "PASS";
+  }
+  outerFinally = "FAIL: DID NOT HIT OUTER FINALLY BLOCK";
+
+  try {
+    try {
+      eval( expression );
+    } finally {
+      innerFinally = "PASS";
+    }
+  } catch ( e  ) {
+    if (throwing) {
+      outerCatch = "PASS";
+    } else {
+      outerCatch = "FAIL: HIT OUTER CATCH BLOCK";
+    }
+  } finally {
+    outerFinally = "PASS";
+  }
+
+
+  new TestCase(
+    SECTION,
+    "eval( " + expression +" )",
+    "PASS",
+    innerFinally );
+  new TestCase(
+    SECTION,
+    "eval( " + expression +" )",
+    "PASS",
+    outerCatch );
+  new TestCase(
+    SECTION,
+    "eval( " + expression +" )",
+    "PASS",
+    outerFinally );
+
+
+}
new file mode 100644
index 0000000000000000000000000000000000000000..72e1a796546b35abc5baa4e61d41217e4f15c7e9
GIT binary patch
literal 8354
zc%0=~&2HO95MCutnx8}3dr=TMB?wvvLDQ39z+u$ZfbFD}5abrD$cePgiWGL2w)Gf&
zioQY*eTKe3Z$0$f9((J|k`gIuDU%Wn$F(n#_Gf1Hn{Q@k$6b?5CG2&_z{9<Mpv2U$
zn~X6X#8Y6QP!Je#0-9;V4NM?1nss;W>TYrCzSf`&gm1X&+pRk&M8cT}xRkS(5J;{d
zJmwP=b;8y1K)|OaS^OGv{nF~~op8BOCWSV8B$WQTyY^=~_%jaNqCstxh(>##;P-yd
z9~`_o?(Sw|^Ep~KI2auER%U3|V65U(P%CryXim)rvCmB~c5Z#s`?0^IuxO!&3p(dn
zm~QBFcQaV45B$d$jNPZfq5}|k!G{u3WVsP>#BSiC4<ZU#m<`4%_g<!#oQ)32?XW8T
znOnS0MXaobA!@*#Ohm#sx$z=ha1bJU#CrkCijL6PWn<jHWU`7P4}}56W#2C8olO;J
zO(*Wy)5ydr*{Io<PoI9hDtYmlg6vY*F1&wV9=xkWZ3EuhIMMTu_TN4G2+;laa?o|;
zmR7L+%w{I=kiOm`3vUE-uB|_pW7R@#g$n{7Q+UBpf{n5|0OM+uRNo0XW~F1g(7Q{Q
zj^WA-Ks!$7%!cKoUzM|disPpWdGI}sf*Qn!@u=d+zjhp4Mow}yD=4Bkz)Lr!wS@PE
zDKQ$GvR)GOBv*97A{#++ahabcyy|e-*y1(eUJ;5{jiyy)&k{i&;O-k`f^Kv@A8|AO
z>h-~T_Y+DYID*M==?G*&Jp2iZMmAMMTQl4K{5zRZs}^OyNvq4?>)`j_SQ~!7msj17
zo<D9m^6%h;&lAjA-t+6}q`z8ml2>rjLmf}RQ#=aei3eu^OsQCV*tY9F&t2zK_`h=}
z<r>pY<@0S41%y$tn5O(H^uC@&0e*f5QFgIUalr)8Iq9Q)7>Bd;o3+u-YCAf&x5TCS
zv;Xz794a0bq8q;PznOEk#>3q5$NlCmA;z3gy*o~%%$B7lxK=fLV6E8d^iixPTrN=4
z_QV(@h&D3CEF<!R>pfH7s4_^)0aFi-bv%1P^dS4!cZ;g~8NRE=wJ<h{(+enJH>zW@
zytSSHjgmu^2b-6hS3Ebo#l1HRx#66~-0hS!D9YIgv>vRLJvvS>FR|xYXV7hQ{k(Br
zg|Try`^8n2H0!gJUANUiT{QXlvgGe~9H^mxtatK6X`5Q4E1+>-@<f9>UCKE4V3()8
z{+bPbyDg983c9z-?ov<uPuF#^VQq(}5~GM#mnyt@U$FN60TzQ`YO)PQCep#SODQ`6
zol;SDzI9a|jk_cj!CG-$)#zjT1!@<aRlJP0D3;DkEX@L^I$fmY?)6}E<9f$Mn0ob2
zi%-8}IKA)?q%H;ZynU`6XHI)9sCj3rFs$8Py&A3Mjs8DHdG1l0W%;_?)<zSA_~tn}
VD_a}BuHe~9XjLYtiqty8{{i;Nt<3-c
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-004.js
@@ -0,0 +1,54 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-004.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This test has a try with one catch block but no finally.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-004";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+TryToCatch( "Math.PI", Math.PI );
+TryToCatch( "Thrower(5)",   "Caught 5" );
+TryToCatch( "Thrower(\"some random exception\")", "Caught some random exception" );
+
+test();
+
+function Thrower( v ) {
+  throw "Caught " + v;
+}
+
+/**
+ *  Evaluate a string.  Catch any exceptions thrown.  If no exception is
+ *  expected, verify the result of the evaluation.  If an exception is
+ *  expected, verify that we got the right exception.
+ */
+
+function TryToCatch( value, expect ) {
+  try {
+    result = eval( value );
+  } catch ( e ) {
+    result = e;
+  }
+
+  new TestCase(
+    SECTION,
+    "eval( " + value +" )",
+    expect,
+    result );
+}
+
+
new file mode 100644
index 0000000000000000000000000000000000000000..0096aca7dc32cef0145635ab00faf7dc62219092
GIT binary patch
literal 9331
zc%1E7&2HO95MDKIng#{h-g^*yN>H>8S|mjQ!GNu(jRD(DBO>T6SdkNH8;TTmm$uax
zD$pnBp-<C8&&jd3&MqnOM?;E~XxNVHi_HC*nf+$w+u7Zoj%GgW_a?x-{h=$xOtU+T
zG3ACcV4jfRYH<dNDa|!ZA<&BT_U!0hcItsrAT@X|xg6T5J1E453*mC#pFaiH=MubA
zK1ESyT;>~GKGV_iYr@r2t9Nk5{iQNrD7|lln!nzj{fry`z=pe~QE4fHu^nWl_V$v7
zMaM_jF&y-rqn}P!`aZ-y=g2u8kh7eL49`KX^xZdoa_)qEuH6Ya_2uBjFsCqU`u8~C
zgN;p(C3Sjxi6hD(`fZo7PfTOhW#}rwM?S>9;97)%HRg>7Jmw{hp-laq=r!SiE==vP
zD&AphXPt^rS`8!AfHRp0geIfuFdlH^VZ4dg0;ClkV0aXbp@B(cWkntf4U+pqJ7jP%
zlc1DYamTL4k4VW{&cAx}=<%xL<!=l!rLbLi-(DTOs}bA=ye4A@{gZ=N-&_N9|GgS?
z3DRi=+s`d!K^McfyX5VSU{19S7jmpxNUfkC=p*T83^lNseE@)QIgZMAkrcDSGAZ;v
zHrtfuQahlC)sbviT>4E}>u1=0E-?<CVJk={JPyYtOa8M%#4^Stm-CDwlLxp>$6@Wm
zYt5t>PjpeQ5%guM=#oV?g5>g;-*j}#(`93eE7H9r6>nOYmeoVK0R6O+6g^vS&nH|@
zzJ7jG?S6xja8F=5$}PcI5RQJuGLy}u30pnie*HU%QL7du-$pBC@NMw>U#tzk-%rc&
z2ag}NocZ^#qt7E`tu9sc-2x~5(~6V287J+ka0*??123F*;lhQPDb{w|cHI}L>qv#~
zojVQJ=yocfAELlD7-frT!>>XesCnSx?~f298~Y3gOaYw}AM;0{H;@0bHrifgTNm~g
zVrg+v@H{Wa6c0<$4Q~aW6i(4qCw3b@^kKY!7$c#2bsG78GAuTM8rAH8wPGvjqfkz{
zzeG*h6=RYh+88N1kI2u|d8WQmMUe6dQxA@+I6E}qVeGHIUn;-P=u<VWg|ShdUP1}G
zQ5}=;R&@Y0B8M^$HZM1CI5&LDYTmHbCx#A*(-mHT)@h`Tu1^W8xcyI3Yuxf3MN%&S
z9equ!2_XGz*WysVYK4(#273RA=@*=PCqqnYo)YfHae|`ArwhBaT%)pP-C1K}()gV^
zpESF1En>CRLMgvoKPqzX5vZYmtanl}ve(;2muuSlK93ZT)N<&D?i)KiekWY>I9R@F
zYu(=zQEqtj!b}z8z>F?X=HlAE_IwA~6?DxIK#`G8gus>XIK59VS!X*QugIV>E~mTm
z(4_H}byk*=w<r_VWqYg9{N#2-bK}jQ3YdDkev3CVr*MAhDQGSc&68B0D`L&@RVZrS
z*(wcdzkb||m!FNEk4?S$pv_Zr6}Po<M`_}%OI&<zZFp4`vX#&>CTLc+=bQfn!VBiC
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-005.js
@@ -0,0 +1,57 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-005.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This test has a try with one catch block but no finally.  Same
+ *  as try-004, but the eval statement is called from a function, not
+ *  directly from within the try block.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-005";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+TryToCatch( "Math.PI", Math.PI );
+TryToCatch( "Thrower(5)",   "Caught 5" );
+TryToCatch( "Thrower(\"some random exception\")", "Caught some random exception" );
+
+test();
+
+function Thrower( v ) {
+  throw "Caught " + v;
+}
+function Eval( v ) {
+  return eval( v );
+}
+
+/**
+ *  Evaluate a string.  Catch any exceptions thrown.  If no exception is
+ *  expected, verify the result of the evaluation.  If an exception is
+ *  expected, verify that we got the right exception.
+ */
+
+function TryToCatch( value, expect ) {
+  try {
+    result = Eval( value );
+  } catch ( e ) {
+    result = e;
+  }
+
+  new TestCase(
+    SECTION,
+    "eval( " + value +" )",
+    expect,
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..a2ba12367c9613b2e8bf7ff9475e1d709ff7ccdb
GIT binary patch
literal 13580
zc%1E8%WfMt6r~f#sZpe8|3HhP4-~C~EV4)i1Gb{31{^uC1h?qMphmQZH8rD>9NYSa
zF4AA<qU&zkziJl++FkFZM$%}+8O@AFFFW4YCOMav=broEqpE|RVEa{<(awI;k-VqL
zLqdph{2n76E}5hGHB&@ss#%wLT9N9W8C{KjdY}}Onsv^oY?@EEL5N_t+@V7BUouBf
z$vO?%1yR>jPBu8Sr-RXdE>$nhy!C4;Mw1Dy^gas3pX#3ZchLARG`xq6N=xot?tch>
z*T1jT-?WZS8t2W{=~3fVbua834tflOn)MnEnd*B4eXXO`aeb<17kgy?r2QkPXO#)P
z-*N3)`_Ag8P1}6$L!al@Zynat-1nyXKY)JiO8>?(Bnm_w#yuznh=EjqIW%!H_<uel
z<Ow!L$p9qav@O`c$`my=id}K9LpoujFUL#@=SAWHImUXJDgK7mtyxp}(#+6?8Q@F8
zJ+7@hJsb=;>Hw4Z1!vNT_JDYCW$eI&vZ5l7xn`1zrWsPd?MbE-u6WC=Mg&&LTK2zu
z`t<p<<k9Z|$hHZ~h4-)3!8_#;rNFy`w6DEBIDfVV=>E4FbS)vQ6l_02xh|^!eJi7k
zPzdJnY|Wt@Gc6lyVS}Is=_H~k!iE`!F+$~Kker{!n8lW9Ll46|tWN3{Q<l|PqhWmM
zo3d6+5;qcf@GZ15+47J5%Y-HWv1Q>haFWV?WFqtfC;$eu7VJV3$uC_UpBDvvF`j6_
zB6C5qxX6zkm1K7*tZ|CFC%B?*%5MVC!EhIie24{C2deKm@cR|>LM!xOK$pSt2i0EN
z@AL<M8TCxBGOa^ZW3(C8i*F|7pruEma~6l64nu9uvMJ`t#EQ*%BM>4SHki{kDtmxV
zRnBG`Uv{Y&p`}bT0Qv#SKn_h(%j9eeNu$IeS`w#B-w`C&iEkfRVn+)B$Q2UrV6;iE
z(n|?DXt);{<4)0}gJ$H;Yu0T~tQx=f&31|OB%-SO*3VlmSCP+b{ES3rv&xf;f~h%2
zNG!J)+_ojq#TSE1U>MegqexaUfz5kSs4m>_B=m7C2_^3BSDt~AHM@i9=M$UfoiecL
za!T?|ijJGTpRpdoO#twljSCHSvy^S6<@9huIXo|T7*{TLIL7^e%Y^XLy*iinc`MdX
z=|kTajCyHWZzXc?u2b>Xb*AD!rBD&Wjq3|qA`^3EuIw}<ca(-`0bR~P)`k~n629Gz
z6ldwzIlIPwNtZIH$3-yR{%A<6H7fOHczfYO&zh|A9a6`knrod?Hkltb3jtzbVGXL=
zpLarDmk^S`?f9jKqho<-xFMbKeYDaY%W6S9V|oGgZblB}K21%Kxquw7VSvwYin%J1
zG-tc_z^Cr)mR&#Mdy8TCN~kMbVySHl9V|(+Pp@cz>Z>HbOh4(ne{8`R=D5tcD$zv~
z)9d}aYx<f@KD9}E`m-}K?i!VZse9AH1>u>^=d&wiMQZJ;t>2%7wx94!*{@OUxZ{{&
zVgt_QV0%r_KryRR9}3^OGQ$Ut?q<BSOJ23n?ibrd8=84ivoP93y{33zNVD7GR{GX<
zc(S7C9*^i5$qpg|F$1)voDrm?i!!d%Qto?d5$}isp2*DX;l$W|nT&jXKNy*dSqVnS
zN}TcvxMh{a_-3p|m1WIli9bBH?9~_ZJZUo?OXS`X?2b#9&n%A`l8WvE*KVaH!R!YM
zb0LH4s(haDore!$1nVIxV&=rNV&eFoVm}4wTU3A=9(dX!ZZ^w?ILGnCX1K?@w?r%F
Y)ckkq??9OWN^b3v>Xdws8YY|n2gm7g9RL6T
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-006.js
@@ -0,0 +1,87 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-006.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  Throw an exception from within a With block in a try block.  Verify
+ *  that any expected exceptions are caught.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-006";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+/**
+ *  This is the "check" function for test objects that will
+ *  throw an exception.
+ */
+function throwException() {
+  throw EXCEPTION_STRING +": " + this.valueOf();
+}
+var EXCEPTION_STRING = "Exception thrown:";
+
+/**
+ *  This is the "check" function for test objects that do not
+ *  throw an exception
+ */
+function noException() {
+  return this.valueOf();
+}
+
+/**
+ *  Add test cases here
+ */
+TryWith( new TryObject( "hello", throwException, true ));
+TryWith( new TryObject( "hola",  noException, false ));
+
+/**
+ *  Run the test.
+ */
+
+test();
+
+/**
+ *  This is the object that will be the "this" in a with block.
+ */
+function TryObject( value, fun, exception ) {
+  this.value = value;
+  this.exception = exception;
+
+  this.valueOf = new Function ( "return this.value" );
+  this.check = fun;
+}
+
+/**
+ *  This function has the try block that has a with block within it.
+ *  Test cases are added in this function.  Within the with block, the
+ *  object's "check" function is called.  If the test object's exception
+ *  property is true, we expect the result to be the exception value.
+ *  If exception is false, then we expect the result to be the value of
+ *  the object.
+ */
+function TryWith( object ) {
+  try {
+    with ( object ) {
+      result = check();
+    }
+  } catch ( e ) {
+    result = e;
+  }
+
+  new TestCase(
+    SECTION,
+    "TryWith( " + object.value +" )",
+    (object.exception ? EXCEPTION_STRING +": " + object.valueOf() : object.valueOf()),
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..69c38aae4eaa4fdc2a2cccc93acb1b358087965b
GIT binary patch
literal 14697
zc%1E8%Wm676r~;8b^3z4$R;Z-iarno4!URnLor}0N-DsS14}i!Ge*=%WIf`r!=Y_`
zMZcko{zLzwztS$c=&tt;^`NLBMM~6zO1-f?9Nv59+;bl@oU-&?Mo-HYCGFFODQs67
zj|{``Ozu*nZ3}8j`;K~sCyAsz>PXKhAFJ8r@T+H@M}?&AYa$xz)jbfx=!0z%#`>?R
z$%vrsI_ZI^J0d0rOyWv^^q)n%*Gg~oj<At3W_$7!h2l^7Sp6Fe{tE+#IOs`XJKfVG
z_`CX3rTV^EyR6?dnpd^@+w$??;c(JNFsV_k;FPIn`|zw;YhF~Ro}ikh=)d8j=1e_&
z96Y>i{S3Bi6<$}b8ajoaz%z$eA57{>n@>yr9G*){@O#aaFcMXmx0?$RfmFbG;Ny7o
zpS(1T&u}oz24I0rT8sv6CTOuT?ACVLMtd;G#h6M1y~sRZ$Jh>~;%^w;nWcgYrJ)5H
z;7!AJY^f#cc`%{Y1}fVfn+he`0p>-G(E~G(6&876ODYI!s43M4S5VKx74N9kFkdTK
zivIH#FJ4Yd9{mnL)+x*v-oMrd?^HnK0`CFRzVhzu=DQ6*cXwwk=xTCUF4#UrxfU$}
zeM_T~a8fFDxOi?mbKyN!+ZYN|`svsl9TpWREFp^#Kdd#B8boyc_)0YfFS1@8jF{75
znL;+HC#P4ZO^eZ`7iFzjE$#&n;s+R|qRB6KH)hFy=tvFZB%&WugaHAqK)`QCJJJw#
z*OF1aDCpT((UL`Gf@FCm03Vd%!)0!Z6XHH56m=@!_>PHrFPs7q3)?&M`i=>|-%@Ab
z1s5jtC@eqd`&zu+5B^f-si&SA9hw@U&9HNPKPd-2JrbR<P5gRT(K7Z=kw`YQ*xb~8
z#s<>@ow`}+Gj*bII^S^7BW#40r?LUi4^RejNF%XfPPdRGN}Qu7QDySpAiiPzbyt%+
zng~Fql(>c2Cb?bDCGDW&PEzKbd5aFZ(Kg@FUTb32_&!&ABf}Mls_biDZ(6n&dQHdA
zP<B?UyzI<bnlq%te7nNE^>l?RVAvO^VwlNFDzP~ybM=J<FG62Nicst(f9(}0-m)z$
zKVRu0?}~y?SJRRgDLWQ>Kchdan?T@q9U1EMekJ=#%~|1uad@uzC~92he2g0ci!#QO
z!#b1oSzFeD(dV2qN}MFCcVfx6^<4aIlezd$E?mTfV{t}uq++Jpm7a&jmhuoiAoDrO
zDtLP);N87YdzSq5=CSf$-1ix@qvKDH?+<CULCxNbXrH^)(^ji&=hacD7Fy?&PZozw
zLx4zH*ns}_=y1U698wa5o!xbCb|f(kx1=-P5BIubSxv}iR4$?8P069m=czF=mrw%=
z2KbDiSg0dO3bqd(cx0t%QS&xO&|?$k|8OU6rFB_6Bz9RXQM$e$&sjx3`T5hx=j3N)
zCpc+p&x~{J^t+aVxASFV^6FFKO|65Gt2U@HPd*};I}opRtWR&17OIVFdizHM?@t7p
z=vRm|t#NRx3WK^#9Ir6qdsG{v=Zu@TYI<-Fa>nJy_*E<GtOJb;l%L0@A@@UH7{kF6
zQ#pfbm%@cO?&jDiBvE2{Abz^90kPJZL=cZQ43j$^{l&*I!XQ2zn33xzWL(m#SNadW
zKSo6EhDEABoVE^7*>@@L=w()T&-Ec)CY78SHESsj&LlL3g-Pil^ZDXo(88L@+lJ+F
z^qKBz!<t&;IT8i>9Yp$UhTrEssr(RlyvVhKY=t!4N4rVCjjLXmNwLKyeVd>Ny~=X%
zz3ywt_JvwzYNj}+nnB7O0A0mbE7dMTxvvmUvu3r#iv!J3=yL9V7UMQr=7RchXixG@
zX+=F`ZWrB3-=@6i#v#nHXCN#BceZ|V!GnR^0L*?mTMYUZ`7-5(aU;di()L)NS$$k(
K&UQ~~a`-<2DBc?Y
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-007.js
@@ -0,0 +1,92 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-007.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This test has a for-in statement within a try block.
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-007";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement:  for-in";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+/**
+ *  This is the "check" function for test objects that will
+ *  throw an exception.
+ */
+function throwException() {
+  throw EXCEPTION_STRING +": " + this.valueOf();
+}
+var EXCEPTION_STRING = "Exception thrown:";
+
+/**
+ *  This is the "check" function for test objects that do not
+ *  throw an exception
+ */
+function noException() {
+  return this.valueOf();
+}
+
+/**
+ *  Add test cases here
+ */
+TryForIn( new TryObject( "hello", throwException, true ));
+TryForIn( new TryObject( "hola",  noException, false ));
+
+/**
+ *  Run the test.
+ */
+
+test();
+
+/**
+ *  This is the object that will be the "this" in a with block.
+ *  The check function is either throwException() or noException().
+ *  See above.
+ *
+ */
+function TryObject( value, fun, exception ) {
+  this.value = value;
+  this.exception = exception;
+
+  this.check = fun;
+  this.valueOf = function () { return this.value; }
+}
+
+/**
+ *  This function has a for-in statement within a try block.  Test cases
+ *  are added after the try-catch-finally statement.  Within the for-in
+ *  block, call a function that can throw an exception.  Verify that any
+ *  exceptions are properly caught.
+ */
+
+function TryForIn( object ) {
+  try {
+    for ( p in object ) {
+      if ( typeof object[p] == "function" ) {
+	result = object[p]();
+      }
+    }
+  } catch ( e ) {
+    result = e;
+  }
+
+  new TestCase(
+    SECTION,
+    "TryForIn( " + object+ " )",
+    (object.exception ? EXCEPTION_STRING +": " + object.value : object.value),
+    result );
+
+}
new file mode 100644
index 0000000000000000000000000000000000000000..71d5d8873e35123188c1f003573695ffebb401c9
GIT binary patch
literal 12251
zc%1E8PjBNy6nDE_wna$Gg}c!nb^&#};)GV&YTGm{L2W=yTI~U;nmChWwi7#yC+$Y+
zH{ieli3=Cbd;%mch>yZ2fCGExy|EL!&e*XXCr#AurSZ)8y?O8b-d}G?4*Hz#mb#R*
zcI%d4eQDe?48ygYJ~diQP)o84>Kd*jlJ=-AU8A(4PM5;3?zt`%lD1BXsH;~ufC#5=
znMF7s9#D%DL0dJ_15y`6TwkzAUk=7kUE&@nzLg8Y$ILi$<t`G%f2AGu=q>&M3-95g
zD+RMVyC1>tYVCCIuzGM-tu-pID#vH=bW$np_$NjuAK*z_(he2cy?UkGsD4wM*t-vV
zjcVgiPw}*JT-UwzKI~atYMq}FKA^#NSeCEh%zAEFChqHz26g$SidW*F+lKKF7sEyc
zV=~g@)Uy_m%(2z&&Y9gZTK=LV0z~+H5kO$%;2w&_zp%PCjfEo=hbC}<Hw|Vpsm0sA
zcc9t=M6x!cLXoxsK+((S730$ilRRXS3c~B^Nabx`P}fC?*OWA1G96_phTG4ceKARS
z{MS>mj$yIt{paS?JAwE@)Qdh{DIe{feZB<ReYkcb+SNpwLUj8W>2|3J@HNMg{keK%
zwn<FOvEk&v0+DhlKe$7EL|t8m26xjbrVPm<bbVAN<_}5@B07Wk>=S4*BD_wgTbSM?
z5wbyDIVqhsMn*+n6<I%o^-BTh_zG63XgG&XCr0GobqEKf5-|)hLhpd|?tz`twloCm
zbY+w;68bD)G-r~TR5HJOfE#AKyX3xcLJ){?MIFm82eySlFdPq27tGyrhqeWOUs2n)
zLLUzFD2VUXa!sc-^nR)9sa;pCj;<Pk&8Qmu_BtK3^q6$U((g6AdoNTOCDm?Q%KI$Z
zM<KP<+eLf{7IA$;tIV_7fOG$tcS+r;Y*}<d8m$!_(Ib4US69Ui04mr6U?i{W?6*-h
znLqhN6*ZHTF?NZ7IGvu8Aij^tM8T8$m-uS<>I0498e&)`(&`3LUL||vW#M|6lYvY1
z37<RGxjOFkRa2U&c&XLx9<6I4b<QjVp2|8lo{r?AQ4urcePqV0Bid_H5zuNt3ZtHW
zoaP%afzcNj;^k0Fq|s$=h`mnmY>-??ZjJ5d!nS&?tI9J+{}_>DqJE0{tQ-Pt*xKQk
zp3}({=%z%BLfzrhJ9n6qJA|c)yq`vnOfZjujsLuft+wNpVmV9plulCsh-&n5?!gBY
zg8fUGxN)K9S3t+cOra-rsk|C(Lgs>gE2zqzXbSteg!CdB5rmxiNjl<X2Lc-wO@v33
zEwP@&K>+=JfXF8tu3>{86w`ty6oRV<txVFV80r=VgXi;VNHgGf#xzn$I$YX&#bl%D
z{d}?W&Br%0-&~X{?5Ic%TdZZO17_P1<{NTBo^oP$p88RK=DFvJ4_RIq*FQhSwK(Y}
zDUU|IPpS`Kiy5>`Yua+pT26G0ULmuV<r#~Z4|L6JJ1CB`mkoJyF^X|@RcwAonjgQ=
z(_DoX3T<{oWH+{pLXfq&ql;||A66`?_*lp&=)MZ^HKJ*gZfpuPzk$n|Zs5}B3g<FY
zn|xQ<uViJP!k>$U+fO>@Ii^t2WE;yAu87>F`x4KU5<f&K$$l_2-$r}{*Wen0SxFG~
z%8JdGNsh4ZIGhqYk<6{p_s=?gXX1fDP@9|bsebL&sJ;-W8~VoP4(gNo{$*yUZz>*b
zoJ<Uh!u##f|KB?OpF~Qk^>9h0e%LKtJ++-Ugiql<@1A`3<6r+7FBA2B7q%wN_)cfW
erD{YmBOTT>|F3g-O}mgja>JjW<o(2XZTWwe54JJ@
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-008.js
@@ -0,0 +1,59 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-008.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This test has a try block in a constructor.
+ *
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-008";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement: try in a constructor";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function Integer( value, exception ) {
+  try {
+    this.value = checkValue( value );
+  } catch ( e ) {
+    this.value = e.toString();
+  }
+
+  new TestCase(
+    SECTION,
+    "Integer( " + value +" )",
+    (exception ? INVALID_INTEGER_VALUE +": " + value : this.value),
+    this.value );
+}
+
+var INVALID_INTEGER_VALUE = "Invalid value for java.lang.Integer constructor";
+
+function checkValue( value ) {
+  if ( Math.floor(value) != value || isNaN(value) ) {
+    throw ( INVALID_INTEGER_VALUE +": " + value );
+  } else {
+    return value;
+  }
+}
+
+// add test cases
+
+new Integer( 3, false );
+new Integer( NaN, true );
+new Integer( 0, false );
+new Integer( Infinity, false );
+new Integer( -2.12, true );
+new Integer( Math.LN2, true );
+
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..9e86032965593a4b56a0fd1fc3445311e651656b
GIT binary patch
literal 14090
zc%1E8TW=dh6kd}wp%iFU#2XSTfz(zAQXyWbtVoG#ilx-4Vk`6oMdS6<9x~o_XU9qW
z$`cR#3MBpmKa0K~@dW40uI;_d-t3JpP4kjuXME1gH{X2c;;qWjkkkEYpOWr=%MxrT
zjV;44T+10!qss)fB)g!l;YuRufZEbEs(Wg7HTcm3*QG+z?kN#1_0erG!s!*W2<PLc
z)Z#?YZj%ha)CCdY2NoI1(e%GQai1!`^$WtM&Ny@BJ{rZJ>Yn=7d-z4gFmB^RR|;nL
z_V2;p^_R8!i+1C<dDd#5G@8$<d;Z{L(kC#fd3=^R?+(s$>Q@#WO6J(H@m&~i)oW-X
zHg*ff+Ku*6JvQ<&j`W3dnQZt2oFc{z`=>tRG&X$O8$Ry*0zhe3by`1Zg;o{BYycCs
zt_w3QCZ2aVIiEGj=h^+vFc6>+zkpYabU5{hLl83KJ(zUP?5@%EA39=2PTwzX68JV-
zhjQ@-o>sD4I6`^ofCu=b!E7eA)IanlG`es(*egbbGHnBwql?i4<J$_FJYtdx!dq%e
z{c0$v>*9_pYBzkOwJgQ>>&K73k6WJp_CVG-EEnFtR|jvL^<}`jgV&?>{NU`{H9+@n
zWhLlp)T|V2A1E!PCeYWM2AL=7UuK)cyhQyoJKV9(=K_DWhStQoS`3}7O$SU3;#Oe!
z2quOyN(~}<qvSw1Lo%{?9j2(_uxBCL)RpnwX*Dvs^-b9;hL}qM?D!F$QqgvfoL<6~
z|I#rWm`cPr;0SLAWEvjXIejG!!Fqie^^1nSnmM{=lZ7C;zIcEGX7Y8Jd&MatkZ={R
zUk`7sMi0|drczGvKDwA>h^EAZ(SDM0tV;_)cUA*=W&&CY>Yu8V-=yULzs{1JRAYq1
z_)pzgH|gb4f}^Iy2`%p5NgcD$iKD9ZDd$c)lM1aqt;9>A>7nCrO6;^%R}!UmvlE0|
zZ2V)L+4xUsY$V+2lM>mO*v43lipE<?Ma;QnIVt%MBilmAgMk<GKIR^{W7~q?&#3KZ
zoI{u}pa8ztLhCr)vG<o+qZ)P9(<%O8s!f`3FT!?^l2g+KJ8on6>~^40l-_s3IvKDX
z@%Ye32r25}1Q2bzOtDMfvif||R7mj^Z88PHIcttM_m9onpl(+FWF$inLL6|!fbi+5
zxQexK$>20$2QrK}I*f@(u`)f1;zIjOIk?3PYY#B2ANkHN?b;pUZ9%xxTiMCoNNZbj
z9CK<H+)viCadt$(COLA(=g}Fnp3^~xikYo82p^Toj-$wE3<Vaka;!Dd?lU*wUI%C~
zDitmu6Kq~Xu-GubcPCekiV`8uae?1KpC(3gBcG~p#oHzuo=QB31n|@fDWJd+Szb<b
zFIv783h~iEvj$=AH(gz&04Q|pSKU!9-joaKOhl=c7EN!S7JM1eg5>&i)k09Ha^7?m
z_+6(0Clt=KSnyx949wLiey0ShPy%qFAkO*T%g*#P)<`3=I+t@x#HpeGBD6q-9Rq9a
zD(s){txts=tuz*FV`#dnh;fEYq@k`DHiHDWhK<V5rCs=Yg%I2D#S7)fdnGXAJ-}oR
zsk8oUSC?jrag9i;AKsSQk%iA|oQzzm4>YB&?#)(tOq{n*y<ik7T%RWCL!OqzvffWw
z<6C_bGo7+IRwN(N9f6?aJj^FfI+RCOg4_GgNQ{I!)3t#71o@Vzw)tbTqJ0LpN)@+X
zD}JK&c3;Rs<V-k(C9-Xfgn!O6TgI2<?_(ki=}3*ZNnhZ<-0{CqoZCt6x8^qEjlsh2
z2jI~?G)rz%Czc7xnQZ<Qe+UEL_*ulmN9Ln^ZfXu_304?{M*vqDujSY-eLX_<6AlZq
l;Vx`KMztxK#nM};D@ZHW3GW-0$t|>ujMoNo2G#K6{{erv9Etz{
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-009.js
@@ -0,0 +1,66 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-009.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This test has a try block within a while block.  Verify that an exception
+ *  breaks out of the while.  I don't really know why this is an interesting
+ *  test case but Mike Shaver had two of these so what the hey.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-009";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement: try in a while block";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var EXCEPTION_STRING = "Exception thrown: ";
+var NO_EXCEPTION_STRING = "No exception thrown: ";
+
+
+TryInWhile( new TryObject( "hello", ThrowException, true ) );
+TryInWhile( new TryObject( "aloha", NoException, false ));
+
+test();
+
+function TryObject( value, throwFunction, result ) {
+  this.value = value;
+  this.thrower = throwFunction;
+  this.result = result;
+}
+function ThrowException() {
+  throw EXCEPTION_STRING + this.value;
+}
+function NoException() {
+  return NO_EXCEPTION_STRING + this.value;
+}
+function TryInWhile( object ) {
+  result = null;
+  while ( true ) {
+    try {
+      object.thrower();
+      result = NO_EXCEPTION_STRING + object.value;
+      break;
+    } catch ( e ) {
+      result = e;
+      break;
+    }
+  }
+
+  new TestCase(
+    SECTION,
+    "( "+ object  +".thrower() )",
+    (object.result
+     ? EXCEPTION_STRING + object.value :
+     NO_EXCEPTION_STRING + object.value),
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..7f1177a26615e9a9f31e4e048ea372e05f6d31f5
GIT binary patch
literal 17028
zc%1E9&2HO95MDcR(zHbpBt=gxDg*_32nwe;28v@_krM-soLZ{Un?X@)iw#ApyDQu3
zsmC6A>kITT`YgTl71B58%#srSmJ~@*66MerS={C9?l&{v%+9XrVl*`APQ6dH-cDO*
z#!!%3gb=RVLrQuEqq;CIDJNWLf)1!9IH_;T-gW=0dz@1yXzx^GZTaeL5Mt76L)T1m
z{F3UX#%Qml4M5bT#)1!YZ74?5Z+(rwl;bupHFG+cX>hTFLh-M@Ex$SsA8inF4<B;D
z4C`X&KK$SOsnLAfIXrHiwL2$=tylGJw{g<xA#`dTpUv!tf?Jfs$~tTuY5fFS?dG*k
zhr+O}Nc&xAZ#Nq_K%{L8+B%1wqh_S#Gi>QI`zl^AP75Y<-2EAFQVx6CJZT4p^+Ps*
z4!0HsnR3z2=%6^)XyVoR?+Ze3J^}Lrvof@<Ngcb<5EHTqo!%K%kM!J!HuG%L9Tyh~
z=H|^q4)Gs6-Iz6m&EyDO7y;fShGht)<?lNk4twAm#<@Y66m5YihbN;3#+Bt4d1MI6
zG_x(cG_Qw@a*iwBkgG9AO38wazkBlilc?nBrvtKTz+&NjzdCrMR$m0XchEf=Z}!ff
zmH^#PH&%kKg02d|_8Uodv<Bu|o5q-D@~dIhH2kM)+WNa($a@oLPejX^P;X)?R2mSo
zd~-)6F^o}4G<GqH4}u<yp_QuuMGA)nGtq(Y5?!5=Aj3;vm$f3FUokL^*YK3Gj(ucb
z#4P!5m3f1iYHaKq2welR49C(<dM*evF8U%oE(&_=4YXj9nIKtQFu;adyu0L{aRLLx
zxZ>i;aBDSWn4B*aqQwU|#3cW#2}}pAX9;S(>G5Y~_E`w(U&w^MMkB!IL%z(M9J8|t
zknw{}g|1ulYAKUb>~8{-JBOEVhbNa=<DWYkpSl{a$*q@_Y*?8V6T3@Xu4EUQ7U+l>
zdJ;A==lHF;8_VnKosFci{IAMv`M(rm`Cm@T44(00%6&WnIW;9RxfhjG(I~YOkk^$H
ze27kPXjz3j!Q#R|R`<#p2@XDFC#aR#3B)3uVBZ#f^Z~vukzm1oaC3tJnvf`_40SNF
zbVT02*~D6h!T0#s(&6(JwcIMp5IPJf=)gHL>e{`r^PilfY~}K)rv~Mr)7zjN+_z3e
zXFOs06W+x_N4kR+r1T!;^4LsuOoN4Ez<y*#U&ST?f-M@?)VZ?Nr#D{{myr@i37@z4
zVLNM$Ow(1UvvgIj^jq^8L=~_On+-H`sxL0>8N3km3@Z>pUHqUTxAfDBRnB~?RVl6z
zi9vnOEiqydL8?k;5J?`skB*7@OFkuzKk55tOQGMKGznB-Tv*sUM3$2h)QtCWFhhSs
z2VKfMSsmb5Dx@4+S~nRotPzW`Qb?z7aNqDMK=asU<}5Q&@&aPint`9zgEQftB(#D&
zEyd-5Tq(4IJShgu1$k^>34h-BWbxZjB9^%S@CCk5G+a)WmUVNKDOC%{_Y!0mzpKuv
zBmkMbe%0s1*^e6iJQHH7Vi{&@vP-VGK*)P6elCcw_N|%-GSwm1ody0-vA_uhon{OE
ztEPcm$KMqbtbz%i!@HX#SVD@wLVRbcj1p1AjJkMkf;c7W%Uv1D8WF5YSJt@u(7jw;
zf;~rgpD}0c$S*o;@tlxYP6&_=8y^7In&#L83el84tZPE=H%x8BDLKbp#;>pvC12y6
zQHhlEONJRgUx+sqsnUBN7pKy^1^qe6Jo7d$&e2lTJC=5L)gBD(k=0XrNgzNcxQjb^
z#PRWSb)+tl7rlS6zFzd#rW+V5FG^Fws=R1%v1m7Kej2nn&u{!O*q>hJ%xt8ZW}N;M
z>We?B_C=Ker8S`YsST)7Wyw`p%dE<ZA}YI@ZC6h!inuAN+?`96IdNXb6~m9<IsW{x
kq4BtF+@np!C5^@W(ye5<d8RuWC7b*54}VjIO7-La0mPN)2LJ#7
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-010.js
@@ -0,0 +1,73 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-010.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This has a try block nested in the try block.  Verify that the
+ *  exception is caught by the right try block, and all finally blocks
+ *  are executed.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-010";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement: try in a tryblock";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var EXCEPTION_STRING = "Exception thrown: ";
+var NO_EXCEPTION_STRING = "No exception thrown:  ";
+
+
+NestedTry( new TryObject( "No Exceptions Thrown",  NoException, NoException, 43 ) );
+NestedTry( new TryObject( "Throw Exception in Outer Try", ThrowException, NoException, 48 ));
+NestedTry( new TryObject( "Throw Exception in Inner Try", NoException, ThrowException, 45 ));
+NestedTry( new TryObject( "Throw Exception in Both Trys", ThrowException, ThrowException, 48 ));
+
+test();
+
+function TryObject( description, tryOne, tryTwo, result ) {
+  this.description = description;
+  this.tryOne = tryOne;
+  this.tryTwo = tryTwo;
+  this.result = result;
+}
+function ThrowException() {
+  throw EXCEPTION_STRING + this.value;
+}
+function NoException() {
+  return NO_EXCEPTION_STRING + this.value;
+}
+function NestedTry( object ) {
+  result = 0;
+  try {
+    object.tryOne();
+    result += 1;
+    try {
+      object.tryTwo();
+      result += 2;
+    } catch ( e ) {
+      result +=4;
+    } finally {
+      result += 8;
+    }
+  } catch ( e ) {
+    result += 16;
+  } finally {
+    result += 32;
+  }
+
+  new TestCase(
+    SECTION,
+    object.description,
+    object.result,
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..e09b960a80de1f4a3b409a1b3800eff1bb0d77a2
GIT binary patch
literal 13131
zc%1E8PjBNy6nEOfE`JVi;exapDj|UoDodpWRoP03<F*mmv})YdazLwzGf774+F?9y
z8%{`wkH8fqJ^*Jv0$&7)y#Y6Fycs)*?TiyAbv8|#Uee5r-+S}k@4flWbBf&W*<`=i
zCAhWUuo&%eZBx@U&vJW2Yf(llPA`b3c^q?cP8{xO#T~i27=5(ld4zG&dWu;?KDq@$
zY;r{{Y}@?`v24sptB%h>)CFeo0SouIKm69kUPbCPF0egRW>b&v3!&n#xFf#?gFnH*
zYhuvjj5?kDH{k#B*<t<cN!d6p?u4U**?TbCFm$teTpybgQp~DZGsb4#7Bj5haL)<v
z!hlljQ{%J|6C1S>!Gc1>N~Ima1BK#F=-Tv6fB#U^-V%e+Ab|5JZrUX9F6PvAv<+DF
zf;ug&6%M*=6v0rh2si{~WQSDo&%okIDqJQtG(iJAsZob=B|gf*f@%v8MB9`wDcXU6
zCyh}%CX^KwS)-gVY&YZ*<EqDq=ZPH`<Zf(VDVekWr=LCid|dMIGjOs>VZQGDdwK31
z2WlSfeH|tY{YmNhP4Mo2%ki$Fg5=`ccZJ+8K>%Mgti(6K&HpaP%_${5HyH2kKKk;D
z`CvR!(HO)@>LMf6s=e!QOh&8|{t_oAAsS{KKmFVtIV-WZG`9hI7&nQhK#%gYNp5{r
z_WBNtUor^(5sVUMx;3|xvgO|k3J?PrG3!SZi39**6X4k<ZLTre>GGsrA?TBlq6Leb
z$t8<BS;YiOPnWqZo={FxQgPK_nocZZ5d8&~Z6qN&bC~YK#1(psw!3sY69USvYZL5D
zl3loCk@z*2NC@iAyUe{r+fCP92V>4){G3ZL?hS*nyADLcH-ZlEeAvQ)?^uFvMwzE@
zJ@ran-?8BHkT~IC*n<TSdJ;Ahnr^Ef{3mUcvz{Cs*qgw>pdE1%mm?0`q39WV4;Y@^
zj9lQSwgldcg>Y>8{s47xct`H|3Fj7+UR`42CCi}N=<G~?dLf8G%w^};9tPc$NdZX<
zV1Y33_?~`K6_4zerG@u;`%OVbyqH8qKd<|?9eO;FlqCntB6Y;(CwKVL!~F7rCX+Xh
zLIx0~9Y?HAl(WH&G4t~#R6fEp!iqXjZ4Q8wL!RW!hd+dggHpA&hbq+ysvn!^sA{5W
zy>6VMgKE80t9^~iwPXFO3A|Rto!cY7Zia<fvs}j`-}+(<+hC^yE3RMnC*v@NZQHe8
z$Z!Qc<0*~ebi7JjJyYGqRtHz2D7ZdELC4(c=8UTMLsS`+J-`$)p6SMkxXdBFbar@T
zPRG)Owne^CEUlxM8bwh~PfCr(%;CzBIxeZ=N}s;UihF!!Ua#T;^$6{aS6)dyErAZ*
z#=b|iwpc~K0|zKOo3mxtfYZsxM$9#Z)#Xa!67Qb=*it0&a-1@y<ou|qEEOl%Oqme^
zuMYPoMy*N6(}s@AUS-qwa4XRA!-j%UuU3g#ASujV_*bbpKwz&a&4F)JDLIpZX?LuY
z6EfRy++Cxp6$M$e#W3fMP6q2$Qt0<oHTw=+9oD3C0i<(%(_7|EZ!f}P^^&O{W#zE5
z6~@H{SzqlSFZj}O6Rv`Fa=CDxAWj7FlLH-lijz=o?Jv;0buF%t`R(><yxE`YcPoO7
zeWZ91zc>PxM;d$p6X@eTB&_!Vx-BGGIBEw;hnk`!El78I3eN4b>DP!`pUr=+v-!?u
yGaAcgd4eL@7z%PZ<4=WdLNZUIdAB~5U#?U6&ZhEqn95_hyuv5*WIBJHhSLAp_v9V`
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/try-012.js
@@ -0,0 +1,95 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          try-012.js
+ *  ECMA Section:
+ *  Description:        The try statement
+ *
+ *  This test has a try with no catch, and a finally.  This is like try-003,
+ *  but throws from a finally block, not the try block.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "try-012";
+var VERSION = "ECMA_2";
+var TITLE   = "The try statement";
+var BUGNUMBER="336872";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+// Tests start here.
+
+TrySomething( "x = \"hi\"", true );
+TrySomething( "throw \"boo\"", true );
+TrySomething( "throw 3", true );
+
+test();
+
+/**
+ *  This function contains a try block with no catch block,
+ *  but it does have a finally block.  Try to evaluate expressions
+ *  that do and do not throw exceptions.
+ *
+ * The productioni TryStatement Block Finally is evaluated as follows:
+ * 1. Evaluate Block
+ * 2. Evaluate Finally
+ * 3. If Result(2).type is normal return result 1 (in the test case, result 1 has
+ *    the completion type throw)
+ * 4. return result 2 (does not get hit in this case)
+ *
+ */
+
+function TrySomething( expression, throwing ) {
+  innerFinally = "FAIL: DID NOT HIT INNER FINALLY BLOCK";
+  if (throwing) {
+    outerCatch = "FAILED: NO EXCEPTION CAUGHT";
+  } else {
+    outerCatch = "PASS";
+  }
+  outerFinally = "FAIL: DID NOT HIT OUTER FINALLY BLOCK";
+
+
+  // If the inner finally does not throw an exception, the result
+  // of the try block should be returned.  (Type of inner return
+  // value should be throw if finally executes correctly
+
+  try {
+    try {
+      throw 0;
+    } finally {
+      innerFinally = "PASS";
+      eval( expression );
+    }
+  } catch ( e  ) {
+    if (throwing) {
+      outerCatch = "PASS";
+    } else {
+      outerCatch = "FAIL: HIT OUTER CATCH BLOCK";
+    }
+  } finally {
+    outerFinally = "PASS";
+  }
+
+
+  new TestCase(
+    SECTION,
+    "eval( " + expression +" ): evaluated inner finally block",
+    "PASS",
+    innerFinally );
+  new TestCase(
+    SECTION,
+    "eval( " + expression +" ): evaluated outer catch block ",
+    "PASS",
+    outerCatch );
+  new TestCase(
+    SECTION,
+    "eval( " + expression +" ):  evaluated outer finally block",
+    "PASS",
+    outerFinally );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..7ab0037ef99fd9e0ade570423c68085ee2eff850
GIT binary patch
literal 5078
zc%1E6&2AGh5O&(~cLMPQd*i@Q3rDnyXwm?cN<btk$I98ABvzf>$o96)Bk%~k36F)u
zfg_B)o9v%=NkXC)L@vpW?fLoUoAGR16-_xb-7!$V+4BUODzZxmkzP0j;xhrBVizEZ
zR8+wP0wsyNZ+5%cqlZ$0P~e|Z(KAQ)Pzi@C=26aPN8oWP!0*xts=A;eFYxG8MT@5~
zl}E;I=YsNuG0voFYNh()?wiM0C{UmmT&V;LM$J3;`zZW0W*pr8M3!Cab=v*o_ubOk
zEnMp#_fI<3Q>UGez1*p+3l45*6kI5oi4UOf32xO9J$p#VT`kNajL0%N;1EMc6$=Bh
zgPYD-;1fR)h9XT*VpnGq5l{UvCce)-t}_t|V_|?6@FZaYQ`Y3S;tj_>(t`~d2%|c{
zY!;od1C!{=sytx|1m!)mrE@hEAf=ADVWQztN%K8ixYRj+dT{W(tb6et!)!CTS%AM?
zAHZd*ZUW%jxX@|8J3M=F1JM0(J?L6m#73~aKPRuVXtQg9oZ9Nm^%$d&`d|Z~jXgT!
zrUp&7Z2&^WD5`GyDPn~nZP@7o#ps0UgS13v?S{qB|CU%E=zI!f!CRDq=!Ylas3PRA
z4GWWzkyOkwhIAF+ts0Y>!%z{yMq^d9s}(&?4Q*NFN|0=?^Xmntx?I-wxTe@EO7U-_
zsdZBNCks-?p*GWZUPpnaZ?Eh{rh#PgP|gAmzu!QRl+_eBOaS>D&%}e!pT)n7k7iXG
z>D=E!ADB<oAM$#1=`K{SI6~V-)iMV%!)O5;Vg==_8*!d&i;dZKtv1F~GBcNrP)sOa
z;3Exxu!A73$O)B?y_n|ZBB&!lOXp6TtbbFg9`&E#ShZVh|7%tfvW1NTy}M9P^9g9_
z^L;EmP)p=V4~3{Q;+D$#qo%%RC@y79@3ojQgh?^mNvb|qVm7~8VaS07b&lD2-{PTn
zZtTP_%)fa{t|plw!)LU*^Pdb>G7Kr>tC684fS%_u<8%PLs9l5dlUQ_b?aJ%I<<@UJ
z{r`cUwA)lxUG85R$sZ>-aHxA#ej|G6_+ju!IiL@qEM0M!bW+Im(~xpo*js8zYvWf}
KF%|S%O8g6cK!8^O
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-001.js
@@ -0,0 +1,42 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          while-001
+ *  ECMA Section:
+ *  Description:        while statement
+ *
+ *  Verify that the while statement is not executed if the while expression is
+ *  false
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "while-001";
+var VERSION = "ECMA_2";
+var TITLE   = "while statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DoWhile();
+test();
+
+function DoWhile() {
+  result = "pass";
+
+  while (false) {
+    result = "fail";
+    break;
+  }
+
+  new TestCase(
+    SECTION,
+    "while statement: don't evaluate statement is expression is false",
+    "pass",
+    result );
+
+}
new file mode 100644
index 0000000000000000000000000000000000000000..63c56f5338211bc908060bc967b95622e3c5aba0
GIT binary patch
literal 14109
zc%1E8&2A$_5FUH8KkRA+99AF%(kO@3B7_nl!GSoDvWbB}HVfEfPphRp(~g^rXH0ib
zvX=J9BXHsYcmPgF9FP!i!v(~FD^)$t{JCd5<BXH>D!C-->8`5&>Z_{$Ye|3P(5=>h
z5__v-aW<01HN!B3<&CIeGfpkZPN*=1B$5uPD}~WoQ@va9q1!@GE~$M;ct;Ig0U-{3
z&Me|M<6UYwgj4%~3_;Wh;mHPzjHDm_Hy~nH>2047CsgJzA-7N{{<PNAzd_@V&~P0a
zh2+dV+PVpU?|M%L%%QEdN!!`CyV1ADz3)KBR1X~8Y43FR9v@77LoMCC?tWW4>ahKF
zCow8+qzN4wDI=%U1OpnawF$D>bMAa-7&w=N4*+{cdJYZ1C6alr(S%ON%(V@B(&+KX
zffK#xZ}3TEhf?wHnZ<c3JgzkKKm&|4n9HP=9uI>Kdo~b=^%><#v<v=D8>0tiA}cO(
zpGnGz(@|a8&qtgJfirHX**N}`<X7OsDSH0>_4N;?Wrx25m~|?v1^DmF19+OMRRDYg
zKD2ipZ9l66y8m4cx|$SG3AV4Ek=G0p@mwHBx;kfalu{bmpaWnBvUto)1Pv2Ar3T?g
zes)=i5KB!`haCne%#O=06`I*;vtfGb%QDy3(4QPw@ENpH-u3pqql_v4+R!i=7)kgz
zrU;_|>TW=4hxVnx+0j6z^`fBnB1H=pSqhTHWq$l%W{1n%7Uu+eMkp>DO|@&O1UvuH
zvGahQF5I-7rCh?mZ4huRZD45%y&2};$So!lrt3RSA+{d)33mlKEKpGi$M@g^bn+c(
zZknro!kmvyG4OoHHeFAe19AeU<4B;G9TgE_GS>_y)^j}Tc%#QDIo9ww#p9Qq*1cxU
zY5hwjw0<Xp*1l`gK69y^&+Ttg6{8ui80rsLx}{WN1wZkat*;niv<xX{R^Akha3zpK
z!qR|zUQrmCS8)_<X6qhDUsV!E_cG#Wy<lx9&-Qbf`$eTJ-?*arZ*`~non{p@e>;Qb
z$dw1HtMBHs{X%?&<ps^jz~PDRSfDfxK_t!~{Z$>RQGnj9dw@Qzqz=825ugWT#-6&=
zoY2mh60az~@H{80IVbzXcP%_^jUT*XL@}`~#;ygwKc((uQ9ptXLkgY^Zh3m1Jr4d-
zHma{ewMGjU?LE<#Njb=<P;|*lp#hA==@!4^K}>CJ>-3EgwhH~7&Ra(EPA4TG=&E0_
zJ;URGnTG(ykDUu-nS{qZJ|s@)1EDwy@d~~J-pM4se;Jz0RNS-_*yo#P8sc*c6PbCU
zn7i`g=^=&zBAb7WntjXn?TQBZIg=6u9y@ZecPcfVU4G0MkII<!hz@&{N3yz*(Wnge
z{fc+Sh~vIrj<rI%114r1f=#?}2VtW^T}VUM3X4|;9~V#umJIUniYe+|G3=Viy@LI=
zVZ^dR#fa<DTl)7)zd+c4vCUYW&U+woBlNGn=BM&>LyOlXK87jMs5iRY3xdqu*4)dC
zL*352xKUci)vlud@cLw}T7x{7&TR!j4z_3&@BLO(c#8t*Dy~LRFv6@k*%Bqv%Vk4$
zJK@ND*y5EZeXCNS=9H=qdGS(aL7+_~xDQum2hRu#z8zG<qI92;Fe}ZEske4N>n^kF
zehQFt+WEUKr`C*Rv(`Tu>yyPD-(1A0;4Ns!S57-bWSv<4bW2kz7W1HHIUW<0E-D}4
z2g+H0Y{~(V=G4LHDG{*~#Rrqa#vawY6{>Ln&7G#_dPk+X<5}<uAdyr(sMEL-BTkB2
zs_<K$E9mz=20C%T02dsq^})RKL?6F+Q7z?B=H{ke<}y-kZUbg5m8wi#h~WMEdeASV
za$i^bXYDPDO8<W@LFq1*d9rUsYXS6A9njVCHe&^IacOfdv3LV_84p`)vi|y`abfGP
YnuT?#v-brtw)C8`jwQ-%ACk@g1HjHiHUIzs
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-002.js
@@ -0,0 +1,86 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          while-002
+ *  ECMA Section:
+ *  Description:        while statement
+ *
+ *  Verify that the while statement is not executed if the while expression is
+ *  false
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "while-002";
+var VERSION = "ECMA_2";
+var TITLE   = "while statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DoWhile( new DoWhileObject(
+	   "while expression is null",
+	   null,
+	   "result = \"fail: should not have evaluated statements in while block;break"
+	   ) );
+
+DoWhile( new DoWhileObject(
+	   "while expression is undefined",
+	   void 0,
+	   "result = \"fail: should not have evaluated statements in while block; break"
+	   ));
+
+DoWhile( new DoWhileObject(
+	   "while expression is 0",
+	   0,
+	   "result = \"fail: should not have evaluated statements in while block; break;"
+	   ));
+
+DoWhile( new DoWhileObject(
+	   "while expression is eval(\"\")",
+	   eval(""),
+	   "result = \"fail: should not have evaluated statements in while block; break"
+	   ));
+
+DoWhile( new DoWhileObject(
+	   "while expression is NaN",
+	   NaN,
+	   "result = \"fail: should not have evaluated statements in while block; break"
+	   ));
+
+test();
+
+function DoWhileObject( d, e, s ) {
+  this.description = d;
+  this.whileExpression = e;
+  this.statements = s;
+}
+
+function DoWhile( object ) {
+  result = "pass";
+
+  while ( expression = object.whileExpression ) {
+    eval( object.statements );
+  }
+
+  // verify that the while expression was evaluated
+
+  new TestCase(
+    SECTION,
+    "verify that while expression was evaluated (should be "+
+    object.whileExpression +")",
+    "pass",
+    (object.whileExpression == expression ||
+     ( isNaN(object.whileExpression) && isNaN(expression) )
+      ) ? "pass" : "fail" );
+
+  new TestCase(
+    SECTION,
+    object.description,
+    "pass",
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..b3d206661e1b6a8679efcff0bceb5587f627b010
GIT binary patch
literal 13938
zc%1E8&2A$_5N>C)KP*DPN+6D-96}I6SvH6R>jdS;K%}e}VJn=_(jIr>CY>46-A>kM
zZ@dC0o`6T-hJ+9YUVw+-vVsH0rK@M+@r-LGGv0ABUXn|ap6;sZufD3T{;BIhU$BjO
zkJ0W%%ay#Z$u&ZVa{WFdT`rlc`3X}*X{y;V^Ry!MRolBhK6FzlCN=BsQ`xdZ7mX0X
z9&?upG2CIUpptc)^w@|xp)%g!(!L&y{_9b-WA!#ps2C{|T<HxE3P1H#`)|<rgK4-9
zjY>=I9d6t-fA9ET_PAj6)v)dC+bhwxhn;VXj)@*Hy4Bcj?>=l!d;=}*-S%Ds9kt*1
zq7@r8Zlq&6)DlKcs0jwt>Z>8L>2v<+143XfF&`N0Iqe7*fJ-&^J+fdr9dWNqx?!U)
zBL{|h!QaLwksVgWKW7$asqm%M&@md!NWwj?QF?3z9d^5hK>UC+X+?X+-$`R|U_x2r
zBKNpvl8Tn?(s<mLOevUg&CW&)CM3UPKAeK*-@AKvZBq8=cK|b{vRr_lULL@cR4oJG
z8|Fh}`@!a;dlf+U-^)Q4NfD)B`|25aolzp53gk#v>r9SS$|4&u0JcpQA2Sm`gT&4l
zq4IE$zAQwDB_@es2LWnkCv}@CWOisaOiq1X=K31=QyLb0W?GqS`+NRj%9MYuAxt)m
zq;fc>2%^BOy8)>MJJ3Y(!=6s+1wrpdie@ab5G1q9{P4j^50|Me&ItCDP@FfKqP0|v
zoxfu2Y_ijto0d_^#SFY-1YAoRSeQa@jq-2g7KbZG%K?H6qH4?c1*2Y;u39;4hty&^
z4TN^qouxiiYUw^g&;&7Gbe{fRb)LRi3Qyli;pzLiNZK@$mfX!!6fD0_KfdDX?6~^f
zLdCiIM=4xgPT{J@PMt7at{hOI*gM(ey$EE$X`xLinCxI1j{M1=<f-1T;;WSSTB~||
zeP2p^IT`U4s9&i-WWlLHCKzd3zN^3}Juv>PdXe<@OpE!Y9$zYX>j`l6c*#QlkK~0c
zpvyTI`efj_aJo2t&<L@?)utMHuKE2b^TK0~zUgqxjDLb#jgH?P27g%_?N?=6qxu-V
z7x_Fc2RJ+uUGNg5XU4*G^WSLzrd_mk@`eOj6@G`2z?h)mK57nx2)hMFW4-bpsOHEF
zG2i;~n2HhF%CgbKm+_Ken2sa)7eTT~e$x`LKHoeO-gtgtDm5eIb5~a6Yysf`+3X9#
z^!ux?7ZK#AOg|>X_@M{A6G`aoSpS^ypp3f@*l~x+NLJhAE~c#<-|~+1B^-w8Au6QZ
z<7!Mj259JwmjO1W>{YAjn(gvJDKdqRGsyUJ2KngnB<fx=>`3HZ!G4>Nv8+%s;#hi1
z{(j+0f%|6c!dNMg_4MJ!$iKN(cl<E=5}$eGX~c~#b~m27Lz=qG*eCb}UQVM>$5n1c
zfA)G<l~y3nC39O&kb^B%$$Pam^WlJU@sShV+$)EBPOt&(2;V(&PMKtm=WB<74AZON
zGHw|gLA(&|m15cGvJt)=^LsYR;|o>7z&uM-;q#}o@G4S2pqU4}Yt0Vc)8%|bXNN_r
zLrQ)vHJv6No&8-47nXTC9)RFUIUe{0OTiUm*?Hwsj&f#8GI|tuj-VYTlGeZ!pOL9l
zOi6-^I7GZ<+TrQYHdSc{oIl<|R;k&%QkjnzI)&G>58(ro{9x$l9@WmoIqE4@(K6<&
zsGdI%U8lp42RIcD#;H^ORF9L8YnW1GFWS9@I%n^-?VB|pia;t7+_FW4>wAiQJAgo^
z!WiHg$D%%%mY(3_Cr`?yJjh&M$7RkV)uuM!yt1pz)CCAGFXNzJNELA1Zrz&{NzFF>
z|279@K)%eAeid2?pufU^E|<4>sd9m7b1Jd06}*hsq7|vX;I-%l)n640>q5u=Gh%Gv
OIi;P5qy=A|=Klbd#si@M
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-003.js
@@ -0,0 +1,87 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          while-003
+ *  ECMA Section:
+ *  Description:        while statement
+ *
+ *  The while expression evaluates to true, Statement returns abrupt completion.
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "while-003";
+var VERSION = "ECMA_2";
+var TITLE   = "while statement";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DoWhile( new DoWhileObject(
+	   "while expression is true",
+	   true,
+	   "result = \"pass\";" ));
+
+DoWhile( new DoWhileObject(
+	   "while expression is 1",
+	   1,
+	   "result = \"pass\";" ));
+
+DoWhile( new DoWhileObject(
+	   "while expression is new Boolean(false)",
+	   new Boolean(false),
+	   "result = \"pass\";" ));
+
+DoWhile( new DoWhileObject(
+	   "while expression is new Object()",
+	   new Object(),
+	   "result = \"pass\";" ));
+
+DoWhile( new DoWhileObject(
+	   "while expression is \"hi\"",
+	   "hi",
+	   "result = \"pass\";" ));
+/*
+  DoWhile( new DoWhileObject(
+  "while expression has a continue in it",
+  "true",
+  "if ( i == void 0 ) i = 0; result=\"pass\"; if ( ++i == 1 ) {continue;} else {break;} result=\"fail\";"
+  ));
+*/
+test();
+
+function DoWhileObject( d, e, s ) {
+  this.description = d;
+  this.whileExpression = e;
+  this.statements = s;
+}
+
+function DoWhile( object ) {
+  result = "fail:  statements in while block were not evaluated";
+
+  while ( expression = object.whileExpression ) {
+    eval( object.statements );
+    break;
+  }
+
+  // verify that the while expression was evaluated
+
+  new TestCase(
+    SECTION,
+    "verify that while expression was evaluated (should be "+
+    object.whileExpression +")",
+    "pass",
+    (object.whileExpression == expression ||
+     ( isNaN(object.whileExpression) && isNaN(expression) )
+      ) ? "pass" : "fail" );
+
+  new TestCase(
+    SECTION,
+    object.description,
+    "pass",
+    result );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..158355836abceb455ba5c77467d07fe1215552b9
GIT binary patch
literal 37266
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
C>J+B{
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/Statements/while-004.js
@@ -0,0 +1,217 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          while-004
+ *  ECMA Section:
+ *  Description:        while statement
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               11 August 1998
+ */
+var SECTION = "while-004";
+var VERSION = "ECMA_2";
+var TITLE   = "while statement";
+var BUGNUMBER="316725";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+DoWhile_1();
+DoWhile_2();
+DoWhile_3();
+DoWhile_4();
+DoWhile_5();
+
+test();
+
+/**
+ *  Break out of a while by calling return.
+ *
+ *  Tests:  12.6.2 step 6.
+ */
+function dowhile() {
+  result = "pass";
+
+  while (true) {
+    return result;
+    result = "fail: hit code after return statement";
+    break;
+  }
+}
+
+function DoWhile_1() {
+  description = "return statement in a while block";
+
+  result = dowhile();
+
+  new TestCase(
+    SECTION,
+    "DoWhile_1" + description,
+    "pass",
+    result );
+}
+
+/**
+ *  While with a labeled continue statement.  Verify that statements
+ *  after the continue statement are not evaluated.
+ *
+ *  Tests: 12.6.2 step 8.
+ *
+ */
+function DoWhile_2() {
+  var description = "while with a labeled continue statement";
+  var result1 = "pass";
+  var result2 = "fail: did not execute code after loop, but inside label";
+  var i = 0;
+  var j = 0;
+
+theloop:
+  while( i++ < 10  ) {
+    j++;
+    continue theloop;
+    result1 = "failed:  hit code after continue statement";
+  }
+  result2 = "pass";
+
+  new TestCase(
+    SECTION,
+    "DoWhile_2:  " +description + " - code inside the loop, before the continue should be executed ("+j+")",
+    true,
+    j == 10 );
+
+  new TestCase(
+    SECTION,
+    "DoWhile_2:  " +description +" - code after labeled continue should not be executed",
+    "pass",
+    result1 );
+
+  new TestCase(
+    SECTION,
+    "DoWhile_2:  " +description +" - code after loop but inside label should be executed",
+    "pass",
+    result2 );
+}
+
+/**
+ *  While with a labeled break.
+ *
+ */
+function DoWhile_3() {
+  var description = "while with a labeled break statement";
+  var result1 = "pass";
+  var result2 = "pass";
+  var result3 = "fail: did not get to code after label";
+
+woohoo: {
+    while( true ) {
+      break woohoo;
+      result1 = "fail: got to code after a break";
+    }
+    result2 = "fail: got to code outside of loop but inside label";
+  }
+
+  result3 = "pass";
+
+  new TestCase(
+    SECTION,
+    "DoWhile_3: " +description +" - verify break out of loop",
+    "pass",
+    result1 );
+
+
+  new TestCase(
+    SECTION,
+    "DoWhile_3: " +description +" - verify break out of label",
+    "pass",
+    result2 );
+
+  new TestCase(
+    SECTION,
+    "DoWhile_3: " +description + " - verify correct exit from label",
+    "pass",
+    result3 );
+}
+
+
+/**
+ *  Labled while with an unlabeled break
+ *
+ */
+function DoWhile_4() {
+  var description = "labeled while with an unlabeled break";
+  var result1 = "pass";
+  var result2 = "pass";
+  var result3 = "fail: did not evaluate statement after label";
+
+woohooboy: {
+    while( true ) {
+      break woohooboy;
+      result1 = "fail: got to code after the break";
+    }
+    result2 = "fail: broke out of while, but not out of label";
+  }
+  result3 = "pass";
+
+  new TestCase(
+    SECTION,
+    "DoWhile_4: " +description +" - verify break out of while loop",
+    "pass",
+    result1 );
+
+  new TestCase(
+    SECTION,
+    "DoWhile_4: " +description + " - verify break out of label",
+    "pass",
+    result2 );
+
+  new TestCase(
+    SECTION,
+    "DoWhile_4: " +description +" - verify that statements after label are evaluated",
+    "pass",
+    result3 );
+}
+
+/**
+ *  in this case, should behave the same way as
+ *
+ *
+ */
+function DoWhile_5() {
+  var description = "while with a labeled continue statement";
+  var result1 = "pass";
+  var result2 = "fail: did not execute code after loop, but inside label";
+  var i = 0;
+  var j = 0;
+
+theloop: {
+    j++;
+    while( i++ < 10  ) {
+      continue;
+      result1 = "failed:  hit code after continue statement";
+    }
+    result2 = "pass";
+  }
+
+  new TestCase(
+    SECTION,
+    "DoWhile_5: " +description + " - continue should not execute statements above the loop",
+    true,
+    ( j == 1 ) );
+
+  new TestCase(
+    SECTION,
+    "DoWhile_5: " +description +" - code after labeled continue should not be executed",
+    "pass",
+    result1 );
+
+  new TestCase(
+    SECTION,
+    "DoWhile_5: " +description +" - code after loop but inside label should be executed",
+    "pass",
+    result2 );
+}
+
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..c4c2b10c926316869712d0f51ab78bf9a14f2779
GIT binary patch
literal 22965
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-001.js
@@ -0,0 +1,106 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          String/match-001.js
+ *  ECMA Section:       15.6.4.9
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+
+/*
+ *  String.match( regexp )
+ *
+ *  If regexp is not an object of type RegExp, it is replaced with result
+ *  of the expression new RegExp(regexp). Let string denote the result of
+ *  converting the this value to a string.  If regexp.global is false,
+ *  return the result obtained by invoking RegExp.prototype.exec (see
+ *  section 15.7.5.3) on regexp with string as parameter.
+ *
+ *  Otherwise, set the regexp.lastIndex property to 0 and invoke
+ *  RegExp.prototype.exec repeatedly until there is no match. If there is a
+ *  match with an empty string (in other words, if the value of
+ *  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ *  The value returned is an array with the properties 0 through n-1
+ *  corresponding to the first element of the result of each matching
+ *  invocation of RegExp.prototype.exec.
+ *
+ *  Note that the match function is intentionally generic; it does not
+ *  require that its this value be a string object.  Therefore, it can be
+ *  transferred to other kinds of objects for use as a method.
+ */
+
+var SECTION = "String/match-001.js";
+var VERSION = "ECMA_2";
+var TITLE   = "String.prototype.match( regexp )";
+
+startTest();
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+// cases in which the regexp global property is false
+
+AddRegExpCases( 3, "3",   "1234567890", 1, 2, ["3"] );
+
+// cases in which the regexp object global property is true
+
+AddGlobalRegExpCases( /34/g, "/34/g", "343443444",  3, ["34", "34", "34"] );
+AddGlobalRegExpCases( /\d{1}/g,  "/d{1}/g",  "123456abcde7890", 10,
+		      ["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"] );
+
+AddGlobalRegExpCases( /\d{2}/g,  "/d{2}/g",  "123456abcde7890", 5,
+		      ["12", "34", "56", "78", "90"] );
+
+AddGlobalRegExpCases( /\D{2}/g,  "/d{2}/g",  "123456abcde7890", 2,
+		      ["ab", "cd"] );
+
+test();
+
+
+function AddRegExpCases(
+  regexp, str_regexp, string, length, index, matches_array ) {
+
+  AddTestCase(
+    "( " + string  + " ).match(" + str_regexp +").length",
+    length,
+    string.match(regexp).length );
+
+  AddTestCase(
+    "( " + string + " ).match(" + str_regexp +").index",
+    index,
+    string.match(regexp).index );
+
+  AddTestCase(
+    "( " + string + " ).match(" + str_regexp +").input",
+    string,
+    string.match(regexp).input );
+
+  for ( var matches = 0; matches < matches_array.length; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+      matches_array[matches],
+      string.match(regexp)[matches] );
+  }
+}
+
+function AddGlobalRegExpCases(
+  regexp, str_regexp, string, length, matches_array ) {
+
+  AddTestCase(
+    "( " + string  + " ).match(" + str_regexp +").length",
+    length,
+    string.match(regexp).length );
+
+  for ( var matches = 0; matches < matches_array.length; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+      matches_array[matches],
+      string.match(regexp)[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..71d8449ca7ecfaf40ff8d69e74c1d9f732043e95
GIT binary patch
literal 36871
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
I2qw7vKTnsU`v3p{
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-002.js
@@ -0,0 +1,174 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          String/match-002.js
+ *  ECMA Section:       15.6.4.9
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+
+/*
+ *  String.match( regexp )
+ *
+ *  If regexp is not an object of type RegExp, it is replaced with result
+ *  of the expression new RegExp(regexp). Let string denote the result of
+ *  converting the this value to a string.  If regexp.global is false,
+ *  return the result obtained by invoking RegExp.prototype.exec (see
+ *  section 15.7.5.3) on regexp with string as parameter.
+ *
+ *  Otherwise, set the regexp.lastIndex property to 0 and invoke
+ *  RegExp.prototype.exec repeatedly until there is no match. If there is a
+ *  match with an empty string (in other words, if the value of
+ *  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ *  The value returned is an array with the properties 0 through n-1
+ *  corresponding to the first element of the result of each matching
+ *  invocation of RegExp.prototype.exec.
+ *
+ *  Note that the match function is intentionally generic; it does not
+ *  require that its this value be a string object.  Therefore, it can be
+ *  transferred to other kinds of objects for use as a method.
+ *
+ *  This file tests cases in which regexp.global is false.  Therefore,
+ *  results should behave as regexp.exec with string passed as a parameter.
+ *
+ */
+
+var SECTION = "String/match-002.js";
+var VERSION = "ECMA_2";
+var TITLE   = "String.prototype.match( regexp )";
+
+startTest();
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+AddRegExpCases( /([\d]{5})([-\ ]?[\d]{4})?$/,
+		"/([\d]{5})([-\ ]?[\d]{4})?$/",
+		"Boston, Mass. 02134",
+		14,
+		["02134", "02134", undefined]);
+
+AddGlobalRegExpCases( /([\d]{5})([-\ ]?[\d]{4})?$/g,
+		      "/([\d]{5})([-\ ]?[\d]{4})?$/g",
+		      "Boston, Mass. 02134",
+		      ["02134"]);
+
+// set the value of lastIndex
+re = /([\d]{5})([-\ ]?[\d]{4})?$/;
+re.lastIndex = 0;
+
+s = "Boston, MA 02134";
+
+AddRegExpCases( re,
+		"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex =0",
+		s,
+		s.lastIndexOf("0"),
+		["02134", "02134", undefined]);
+
+
+re.lastIndex = s.length;
+
+AddRegExpCases( re,
+		"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+		s.length,
+		s,
+		s.lastIndexOf("0"),
+		["02134", "02134", undefined] );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddRegExpCases( re,
+		"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+		s.lastIndexOf("0"),
+		s,
+		s.lastIndexOf("0"),
+		["02134", "02134", undefined]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddRegExpCases( re,
+		"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+		s.lastIndexOf("0") +1,
+		s,
+		s.lastIndexOf("0"),
+		["02134", "02134", undefined]);
+
+test();
+
+function AddRegExpCases(
+  regexp, str_regexp, string, index, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(string) == null || matches_array == null ) {
+    AddTestCase(
+      string + ".match(" + regexp +")",
+      matches_array,
+      string.match(regexp) );
+
+    return;
+  }
+
+  AddTestCase(
+    "( " + string  + " ).match(" + str_regexp +").length",
+    matches_array.length,
+    string.match(regexp).length );
+
+  AddTestCase(
+    "( " + string + " ).match(" + str_regexp +").index",
+    index,
+    string.match(regexp).index );
+
+  AddTestCase(
+    "( " + string + " ).match(" + str_regexp +").input",
+    string,
+    string.match(regexp).input );
+
+  var limit = matches_array.length > string.match(regexp).length ?
+    matches_array.length :
+    string.match(regexp).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+      matches_array[matches],
+      string.match(regexp)[matches] );
+  }
+}
+
+function AddGlobalRegExpCases(
+  regexp, str_regexp, string, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(string) == null || matches_array == null ) {
+    AddTestCase(
+      regexp + ".exec(" + string +")",
+      matches_array,
+      regexp.exec(string) );
+
+    return;
+  }
+
+  AddTestCase(
+    "( " + string  + " ).match(" + str_regexp +").length",
+    matches_array.length,
+    string.match(regexp).length );
+
+  var limit = matches_array.length > string.match(regexp).length ?
+    matches_array.length :
+    string.match(regexp).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+      matches_array[matches],
+      string.match(regexp)[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..0648962ad78686b5bdf3589e67c0a266a6af1db5
GIT binary patch
literal 21588
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
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-003.js
@@ -0,0 +1,132 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          String/match-003.js
+ *  ECMA Section:       15.6.4.9
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+
+/*
+ *  String.match( regexp )
+ *
+ *  If regexp is not an object of type RegExp, it is replaced with result
+ *  of the expression new RegExp(regexp). Let string denote the result of
+ *  converting the this value to a string.  If regexp.global is false,
+ *  return the result obtained by invoking RegExp.prototype.exec (see
+ *  section 15.7.5.3) on regexp with string as parameter.
+ *
+ *  Otherwise, set the regexp.lastIndex property to 0 and invoke
+ *  RegExp.prototype.exec repeatedly until there is no match. If there is a
+ *  match with an empty string (in other words, if the value of
+ *  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ *  The value returned is an array with the properties 0 through n-1
+ *  corresponding to the first element of the result of each matching
+ *  invocation of RegExp.prototype.exec.
+ *
+ *  Note that the match function is intentionally generic; it does not
+ *  require that its this value be a string object.  Therefore, it can be
+ *  transferred to other kinds of objects for use as a method.
+ */
+
+var SECTION = "String/match-003.js";
+var VERSION = "ECMA_2";
+var TITLE   = "String.prototype.match( regexp )";
+
+startTest();
+
+// the regexp argument is not a RegExp object
+// this is not a string object
+
+
+//  [if regexp.global is true] set the regexp.lastIndex property to 0 and
+//  invoke RegExp.prototype.exec repeatedly until there is no match. If
+//  there is a match with an empty string (in other words, if the value of
+//  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+//  The value returned is an array with the properties 0 through n-1
+//  corresponding to the first element of the result of each matching invocation
+//  of RegExp.prototype.exec.
+
+
+// set the value of lastIndex
+re = /([\d]{5})([-\ ]?[\d]{4})?$/g;
+
+
+s = "Boston, MA 02134";
+
+AddGlobalRegExpCases( re,
+		      "re = " + re,
+		      s,
+		      ["02134" ]);
+
+re.lastIndex = 0;
+
+AddGlobalRegExpCases(
+  re,
+  "re = " + re + "; re.lastIndex = 0 ",
+  s,
+  ["02134"]);
+
+
+re.lastIndex = s.length;
+
+AddGlobalRegExpCases(
+  re,
+  "re = " + re + "; re.lastIndex = " + s.length,
+  s,
+  ["02134"] );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddGlobalRegExpCases(
+  re,
+  "re = "+ re +"; re.lastIndex = " + s.lastIndexOf("0"),
+  s,
+  ["02134"]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddGlobalRegExpCases(
+  re,
+  "re = " +re+ "; re.lastIndex = " + (s.lastIndexOf("0") +1),
+  s,
+  ["02134"]);
+
+test();
+
+function AddGlobalRegExpCases(
+  regexp, str_regexp, string, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( string.match(regexp) == null || matches_array == null ) {
+    AddTestCase(
+      string + ".match(" + str_regexp +")",
+      matches_array,
+      string.match(regexp) );
+
+    return;
+  }
+
+  AddTestCase(
+    "( " + string  + " ).match(" + str_regexp +").length",
+    matches_array.length,
+    string.match(regexp).length );
+
+  var limit = matches_array.length > string.match(regexp).length ?
+    matches_array.length :
+    string.match(regexp).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+      matches_array[matches],
+      string.match(regexp)[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..3e74b31329f816dcd1564d8c717dfe7f1d712661
GIT binary patch
literal 30998
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
IAgIv%KU8fR^Z)<=
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/match-004.js
@@ -0,0 +1,173 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          String/match-004.js
+ *  ECMA Section:       15.6.4.9
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+
+/*
+ *  String.match( regexp )
+ *
+ *  If regexp is not an object of type RegExp, it is replaced with result
+ *  of the expression new RegExp(regexp). Let string denote the result of
+ *  converting the this value to a string.  If regexp.global is false,
+ *  return the result obtained by invoking RegExp.prototype.exec (see
+ *  section 15.7.5.3) on regexp with string as parameter.
+ *
+ *  Otherwise, set the regexp.lastIndex property to 0 and invoke
+ *  RegExp.prototype.exec repeatedly until there is no match. If there is a
+ *  match with an empty string (in other words, if the value of
+ *  regexp.lastIndex is left unchanged) increment regexp.lastIndex by 1.
+ *  The value returned is an array with the properties 0 through n-1
+ *  corresponding to the first element of the result of each matching
+ *  invocation of RegExp.prototype.exec.
+ *
+ *  Note that the match function is intentionally generic; it does not
+ *  require that its this value be a string object.  Therefore, it can be
+ *  transferred to other kinds of objects for use as a method.
+ *
+ *
+ *  The match function should be intentionally generic, and not require
+ *  this to be a string.
+ *
+ */
+
+var SECTION = "String/match-004.js";
+var VERSION = "ECMA_2";
+var TITLE   = "String.prototype.match( regexp )";
+
+var BUGNUMBER="http://scopus/bugsplat/show_bug.cgi?id=345818";
+
+startTest();
+
+// set the value of lastIndex
+re = /0./;
+s = 10203040506070809000;
+
+Number.prototype.match = String.prototype.match;
+
+AddRegExpCases(  re,
+		 "re = " + re ,
+		 s,
+		 String(s),
+		 1,
+		 ["02"]);
+
+
+re.lastIndex = 0;
+AddRegExpCases(  re,
+		 "re = " + re +" [lastIndex is " + re.lastIndex+"]",
+		 s,
+		 String(s),
+		 1,
+		 ["02"]);
+/*
+
+re.lastIndex = s.length;
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.length,
+s,
+s.lastIndexOf("0"),
+null );
+
+re.lastIndex = s.lastIndexOf("0");
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.lastIndexOf("0"),
+s,
+s.lastIndexOf("0"),
+["02134"]);
+
+re.lastIndex = s.lastIndexOf("0") + 1;
+
+AddRegExpCases( re,
+"re = /([\d]{5})([-\ ]?[\d]{4})?$/; re.lastIndex = " +
+s.lastIndexOf("0") +1,
+s,
+0,
+null);
+*/
+test();
+
+function AddRegExpCases(
+  regexp, str_regexp, string, str_string, index, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(string) == null || matches_array == null ) {
+    AddTestCase(
+      string + ".match(" + regexp +")",
+      matches_array,
+      string.match(regexp) );
+
+    return;
+  }
+
+  AddTestCase(
+    "( " + string  + " ).match(" + str_regexp +").length",
+    matches_array.length,
+    string.match(regexp).length );
+
+  AddTestCase(
+    "( " + string + " ).match(" + str_regexp +").index",
+    index,
+    string.match(regexp).index );
+
+  AddTestCase(
+    "( " + string + " ).match(" + str_regexp +").input",
+    str_string,
+    string.match(regexp).input );
+
+  var limit = matches_array.length > string.match(regexp).length ?
+    matches_array.length :
+    string.match(regexp).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+      matches_array[matches],
+      string.match(regexp)[matches] );
+  }
+}
+
+function AddGlobalRegExpCases(
+  regexp, str_regexp, string, matches_array ) {
+
+  // prevent a runtime error
+
+  if ( regexp.exec(string) == null || matches_array == null ) {
+    AddTestCase(
+      regexp + ".exec(" + string +")",
+      matches_array,
+      regexp.exec(string) );
+
+    return;
+  }
+
+  AddTestCase(
+    "( " + string  + " ).match(" + str_regexp +").length",
+    matches_array.length,
+    string.match(regexp).length );
+
+  var limit = matches_array.length > string.match(regexp).length ?
+    matches_array.length :
+    string.match(regexp).length;
+
+  for ( var matches = 0; matches < limit; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).match(" + str_regexp +")[" + matches +"]",
+      matches_array[matches],
+      string.match(regexp)[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..ed471eaddc4db88ac7dd197e61a140a76cf578e6
GIT binary patch
literal 23323
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
N|CsI{)BQ8!_J5~#DHZ?#
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-001.js
@@ -0,0 +1,112 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          String/split-001.js
+ *  ECMA Section:       15.6.4.9
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+
+/*
+ * Since regular expressions have been part of JavaScript since 1.2, there
+ * are already tests for regular expressions in the js1_2/regexp folder.
+ *
+ * These new tests try to supplement the existing tests, and verify that
+ * our implementation of RegExp conforms to the ECMA specification, but
+ * does not try to be as exhaustive as in previous tests.
+ *
+ * The [,limit] argument to String.split is new, and not covered in any
+ * existing tests.
+ *
+ * String.split cases are covered in ecma/String/15.5.4.8-*.js.
+ * String.split where separator is a RegExp are in
+ * js1_2/regexp/string_split.js
+ *
+ */
+
+var SECTION = "ecma_2/String/split-001.js";
+var VERSION = "ECMA_2";
+var TITLE   = "String.prototype.split( regexp, [,limit] )";
+
+startTest();
+
+// the separator is not supplied
+// separator is undefined
+// separator is an empty string
+
+AddSplitCases( "splitme", "", "''", ["s", "p", "l", "i", "t", "m", "e"] );
+AddSplitCases( "splitme", new RegExp(), "new RegExp()", ["s", "p", "l", "i", "t", "m", "e"] );
+
+// separartor is a regexp
+// separator regexp value global setting is set
+// string is an empty string
+// if separator is an empty string, split each by character
+
+// this is not a String object
+
+// limit is not a number
+// limit is undefined
+// limit is larger than 2^32-1
+// limit is a negative number
+
+test();
+
+function AddSplitCases( string, separator, str_sep, split_array ) {
+
+  // verify that the result of split is an object of type Array
+  AddTestCase(
+    "( " + string  + " ).split(" + str_sep +").constructor == Array",
+    true,
+    string.split(separator).constructor == Array );
+
+  // check the number of items in the array
+  AddTestCase(
+    "( " + string  + " ).split(" + str_sep +").length",
+    split_array.length,
+    string.split(separator).length );
+
+  // check the value of each array item
+  var limit = (split_array.length > string.split(separator).length )
+    ? split_array.length : string.split(separator).length;
+
+  for ( var matches = 0; matches < split_array.length; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).split(" + str_sep +")[" + matches +"]",
+      split_array[matches],
+      string.split( separator )[matches] );
+  }
+}
+
+function AddLimitedSplitCases(
+  string, separator, str_sep, limit, str_limit, split_array ) {
+
+  // verify that the result of split is an object of type Array
+
+  AddTestCase(
+    "( " + string  + " ).split(" + str_sep +", " + str_limit +
+    " ).constructor == Array",
+    true,
+    string.split(separator, limit).constructor == Array );
+
+  // check the length of the array
+
+  AddTestCase(
+    "( " + string + " ).split(" + str_sep  +", " + str_limit + " ).length",
+    length,
+    string.split(separator).length );
+
+  // check the value of each array item
+
+  for ( var matches = 0; matches < split_array.length; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).split(" + str_sep +", " + str_limit + " )[" + matches +"]",
+      split_array[matches],
+      string.split( separator )[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..3be0280b7c09723fc4dff051428842a148a4b1a7
GIT binary patch
literal 72882
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
TY@xx+;;y2DQIea)k~;i9f8scM
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-002.js
@@ -0,0 +1,270 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          String/split-002.js
+ *  ECMA Section:       15.6.4.9
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+
+/*
+ * Since regular expressions have been part of JavaScript since 1.2, there
+ * are already tests for regular expressions in the js1_2/regexp folder.
+ *
+ * These new tests try to supplement the existing tests, and verify that
+ * our implementation of RegExp conforms to the ECMA specification, but
+ * does not try to be as exhaustive as in previous tests.
+ *
+ * The [,limit] argument to String.split is new, and not covered in any
+ * existing tests.
+ *
+ * String.split cases are covered in ecma/String/15.5.4.8-*.js.
+ * String.split where separator is a RegExp are in
+ * js1_2/regexp/string_split.js
+ *
+ */
+
+var SECTION = "ecma_2/String/split-002.js";
+var VERSION = "ECMA_2";
+var TITLE   = "String.prototype.split( regexp, [,limit] )";
+
+startTest();
+
+// the separator is not supplied
+// separator is undefined
+// separator is an empty string
+
+//    AddSplitCases( "splitme", "", "''", ["s", "p", "l", "i", "t", "m", "e"] );
+//    AddSplitCases( "splitme", new RegExp(), "new RegExp()", ["s", "p", "l", "i", "t", "m", "e"] );
+
+// separator is an empty regexp
+// separator is not supplied
+
+CompareSplit( "hello", "ll" );
+
+CompareSplit( "hello", "l" );
+CompareSplit( "hello", "x" );
+CompareSplit( "hello", "h" );
+CompareSplit( "hello", "o" );
+CompareSplit( "hello", "hello" );
+CompareSplit( "hello", undefined );
+
+CompareSplit( "hello", "");
+CompareSplit( "hello", "hellothere" );
+
+CompareSplit( new String("hello" ) );
+
+
+Number.prototype.split = String.prototype.split;
+
+CompareSplit( new Number(100111122133144155), 1 );
+CompareSplitWithLimit(new Number(100111122133144155), 1, 1 );
+
+CompareSplitWithLimit(new Number(100111122133144155), 1, 2 );
+CompareSplitWithLimit(new Number(100111122133144155), 1, 0 );
+CompareSplitWithLimit(new Number(100111122133144155), 1, 100 );
+CompareSplitWithLimit(new Number(100111122133144155), 1, void 0 );
+CompareSplitWithLimit(new Number(100111122133144155), 1, Math.pow(2,32)-1 );
+CompareSplitWithLimit(new Number(100111122133144155), 1, "boo" );
+CompareSplitWithLimit(new Number(100111122133144155), 1, -(Math.pow(2,32)-1) );
+CompareSplitWithLimit( "hello", "l", NaN );
+CompareSplitWithLimit( "hello", "l", 0 );
+CompareSplitWithLimit( "hello", "l", 1 );
+CompareSplitWithLimit( "hello", "l", 2 );
+CompareSplitWithLimit( "hello", "l", 3 );
+CompareSplitWithLimit( "hello", "l", 4 );
+
+
+/*
+  CompareSplitWithLimit( "hello", "ll", 0 );
+  CompareSplitWithLimit( "hello", "ll", 1 );
+  CompareSplitWithLimit( "hello", "ll", 2 );
+  CompareSplit( "", " " );
+  CompareSplit( "" );
+*/
+
+// separartor is a regexp
+// separator regexp value global setting is set
+// string is an empty string
+// if separator is an empty string, split each by character
+
+// this is not a String object
+
+// limit is not a number
+// limit is undefined
+// limit is larger than 2^32-1
+// limit is a negative number
+
+test();
+
+function CompareSplit( string, separator ) {
+  split_1 = string.split( separator );
+  split_2 = string_split( string, separator );
+
+  AddTestCase(
+    "( " + string +".split(" + separator + ") ).length" ,
+    split_2.length,
+    split_1.length );
+
+  var limit = split_1.length > split_2.length ?
+    split_1.length : split_2.length;
+
+  for ( var split_item = 0; split_item < limit; split_item++ ) {
+    AddTestCase(
+      string + ".split(" + separator + ")["+split_item+"]",
+      split_2[split_item],
+      split_1[split_item] );
+  }
+}
+
+function CompareSplitWithLimit( string, separator, splitlimit ) {
+  split_1 = string.split( separator, splitlimit );
+  split_2 = string_split( string, separator, splitlimit );
+
+  AddTestCase(
+    "( " + string +".split(" + separator + ", " + splitlimit+") ).length" ,
+    split_2.length,
+    split_1.length );
+
+  var limit = split_1.length > split_2.length ?
+    split_1.length : split_2.length;
+
+  for ( var split_item = 0; split_item < limit; split_item++ ) {
+    AddTestCase(
+      string + ".split(" + separator  + ", " + splitlimit+")["+split_item+"]",
+      split_2[split_item],
+      split_1[split_item] );
+  }
+}
+
+function string_split ( __this, separator, limit ) {
+  var S = String(__this );					  // 1
+
+  var A = new Array();                          // 2
+
+  if ( limit == undefined ) {                   // 3
+    lim = Math.pow(2, 31 ) -1;
+  } else {
+    lim = ToUint32( limit );
+  }
+
+  var s = S.length;                              // 4
+  var p = 0;                                     // 5
+
+  if  ( separator == undefined ) {              // 8
+    A[0] = S;
+    return A;
+  }
+
+  if ( separator.constructor == RegExp )         // 6
+    R = separator;
+  else
+    R = separator.toString();
+
+  if (lim == 0) return A;                       // 7
+
+  if  ( separator == undefined ) {              // 8
+    A[0] = S;
+    return A;
+  }
+
+  if (s == 0) {		                          // 9
+    z = SplitMatch(R, S, 0);
+    if (z != false) return A;
+    A[0] = S;
+    return A;
+  }
+
+  var q = p;									  // 10
+loop:
+  while (true ) {
+	
+    if ( q == s ) break;					  // 11
+
+    z = SplitMatch(R, S, q);                  // 12
+
+//print("Returned ", z);
+
+    if (z != false) {							// 13
+      e = z.endIndex;							// 14
+      cap = z.captures;						// 14
+      if (e != p) {							// 15
+//print("S = ", S, ", p = ", p, ", q = ", q);
+	T = S.slice(p, q);					// 16
+//print("T = ", T);
+	A[A.length] = T;					// 17
+	if (A.length == lim) return A;		// 18
+	p = e;								// 19
+	i = 0;								// 20
+	while (true) {						// 25
+	  if (i == cap.length) {              // 21
+	    q = p;                          // 10
+	    continue loop;
+	  }
+	  i = i + 1;							// 22
+	  A[A.length] = cap[i]				// 23
+	    if (A.length == lim) return A;		// 24
+	}
+      }
+    }
+
+    q = q + 1;                               // 26
+  }
+
+  T = S.slice(p, q);
+  A[A.length] = T;
+  return A;
+}
+
+function SplitMatch(R, S, q)
+{
+  if (R.constructor == RegExp) {			// 1
+    var reResult = R.match(S, q);		// 8
+    if (reResult == undefined)
+      return false;
+    else {
+      a = new Array(reResult.length - 1);
+      for (var i = 1; i < reResult.length; i++)
+	a[a.length] = reResult[i];
+      return { endIndex : reResult.index + reResult[0].length, captures : cap };
+    }
+  }
+  else {
+    var r = R.length;					// 2
+    s = S.length;						// 3
+    if ((q + r) > s) return false;		// 4
+    for (var i = 0; i < r; i++) {
+//print("S.charAt(", q + i, ") = ", S.charAt(q + i), ", R.charAt(", i, ") = ", R.charAt(i));
+      if (S.charAt(q + i) != R.charAt(i))			// 5
+	return false;
+    }
+    cap = new Array();								// 6
+    return { endIndex : q + r, captures : cap };	// 7
+  }
+}
+
+function ToUint32( n ) {
+  n = Number( n );
+  var sign = ( n < 0 ) ? -1 : 1;
+
+  if ( Math.abs( n ) == 0
+       || Math.abs( n ) == Number.POSITIVE_INFINITY
+       || n != n) {
+    return 0;
+  }
+  n = sign * Math.floor( Math.abs(n) )
+
+    n = n % Math.pow(2,32);
+
+  if ( n < 0 ){
+    n += Math.pow(2,32);
+  }
+
+  return ( n );
+}
new file mode 100644
index 0000000000000000000000000000000000000000..217f358c6760cf2b012c3dac82e0b7dabcfca30d
GIT binary patch
literal 40412
zc%1EBPmkL~6rbJg|EdTf1QMr!gw&;FQx#5-UD(|&RYkj0O^QHmwanVHS+|aD?8$a>
z<6Ce52_YoZLk}Df;=q9md<?z<l@Q{}%-BtAXY9oBIEmxeOA?R$X6DWB{ob4B*VzW`
zIwsj@91^T=G&R?7C|W@Xd7AAIq#G{LsBuI*<WWpXhgj4@jk>tI5q@;j^N34{{wa2w
z;?WaKh)IqO4Vz}~8qrMb5`7nUn5ZM{MlWdCq22zkL+o7>{q7uLv)`F%cyxmc<^LLW
z@zcNfJ-cv{U-YPJSnZ9M+4oIdziD&~HlU_s8gv_b#B0=p8=l{I!M`!(j??Up=FWEO
z#wWW&ZM@6Yjn>T_=~JKX+-XLh3XeE84fYwRGI^4(e~Zv-{9;(?OxXtBH;J!JOby#Y
z%j~8{hNUAtxM;hB6$=K#7nm)=U~qoFO9(BE>cVzK5BsbK_9QYagG%wR<==2aXNWNl
z4B`sW7F*!>V5B;Ju8^?En`}8<Y&OL$JI9VoJde+KNzBIV4oT+vB3cLUU9I~M)jht{
zZ(q6c&e}t7xU>GJuXouP)N1@0nwiFj@u@=Nr&z<z_N~pmt8<{;mu7=!2`?zo?OWVV
z#Md>)wW&>e4p|d`zF2cfn;birYxgdjob?{mRwvT`U>MEkY%j(`2E&u-W}8ubXa-!L
zob?Go*ll-{ea1kUvH8o?dX_sSie1_w9vz;YlsV&5FUwq098+YzEe8A(afD|E76<Gh
zF-<!iu)E}O;S=Zlafk3xXI$Z23OL6{Lmt<XdXB_7u8Vsyp~Q>@Mq+GFmV&S(*VuT&
zp<*TxV=h3ZSrVBNpvMWL8vM~&o+5t)a(yF<sldUMHCpJv#O)#P9)m&f>9c@RZ16Cm
zZq`*10B>5!t=(mzUBxpkKzWrgtkGM`h<*L4#06B#z5=PcY{^_hOB0Lwu|O^}O$-_<
z1=S170M(+Q`s{<8Q2kt%FHq)DDvkdy0RP2P^@lm}|CF^XmnovEv`PI8CRMmeoylub
zut@<k1v4$$OkV^u1vAZOrZ233nPxT9yB2nPvEkbe@n8FiFP0t`%+mo!wxJIsE6Pp)
z0RREyA%H(2nK-GR&S)Tpsy6_TTIBQm0|Ly<z|CA5(Y17PU|2*~g<Wts3+Hg4tOUwR
zLU@O=65x*_{r-Q`3|N6ia&Au{!krxHA5SyF1*A`c^xW^>KSL_sy(jqHN?Xr&U_JA0
zJ#+Hreu`0Rr7iLwu*iA0$T@lOU-ErqrLFw>G~XzKl}}>jx$6d6ODa-%CAV^54#mvz
zFEGcnnPY)U86bl_uQDNn9ku$Cun(G1gfzZzsMt`C`={XFr;YpB7kq$Qo>!R*@0Pjs
zQ8mZ9eAKlxer{0s2qAvnk>PE6JxgPs*NGK`%?`VvL)e1&CzkEode8qR#wc1nadi*~
zM{O%O^Xzt14$rFfMQ1$V>>Ct4%WU)!W#U{M;`nD74Yi)<t^DCV%!y#AovVg@-D47l
z+D`dx>}zOU#yQ1IrlT303-=xh-Z_N)kvJYns)Y`w+F`^aW}WKzM?{TLh!w%K?RK!)
zN0}#P#fXHVlUWvxs^YFJ<1_xyq>G+wvIzjqCsc~td?FJ~B}TGg>3h3f(+rT|3mb=<
zwm7BmHB3KVF&Wvv)Ff*>&jf$o2RuKzi{m|k=l?z_c_qOXFq-+`cl0wKCOM$UHQI+%
z<~T3OGar=|Inn0oVohP>nno{5;w8>DwbkHUyz%<TG=Ws&Q8I&9Si|a?W?SrcS7U2k
zTVJnjCQwpxhg-I75^SaQxRk`06XA|yWqn-^JkCglc8hfOBT5!Y%>9Rq1CitME@)3F
zN9F8R8L~qGhyZ2+|J_HD5~J*gBqsaXSo|C!=MdZ!T05Wc2;`Q0=Q5sSdjgIP99!ib
z+Zo~5Ok%aEtOQch#WeYQWcVLi=%hJ-%PWb?OIyS-Jd)aTs<%$f?40UYIz%?tZJP<?
zGsI?$vU$c%1P<iOF89gU<o~;pdFZ5pP0acmg+!G=4?qtS&;$4>0OC9WF+oBk@o2k)
ztrJfi3il!SyX)wjvBPgU3UqaU$<#QVKX@^m-%pNd^VCG8EJGd_*pR!x%pv|*YA73@
zNeku#uw%+LyxT50Fpd*T=TLZqcqw7Gxyb~!EpALLMskGaMW7TbrmZ~^8u$Ma(}+L6
zl>8z>z|lG*vAgo;RlYh6c@+=|*`G3Gf4I(9?-exkOw>A24bFq{WN+IYr%Q>R<~v95
zt6J|lJ+&&BI&3Bi*-R9RfrNZnw#$*-O1Vq8eq+yakc?k@o1BnKU+z&HkjCw4Xf9EW
z*ZU}1<0VCGc&_n`XK_Vd<JVlrw(8^8di^LX*@ap!Wx4N#EFSy)&4nx;`vLZXAQJY1
zrP&K!mgrnb!BGOQD;fB!zUrYkuX>xdpOEAPBbA%BLO>4%e=`Y2?n5vFA|V)oV5G=k
zBv3sRsz8{skYUPP6={Awn<7nV&Qda2sL}+^nHlHIad8{~u}VO!it|g~Qilf#m7h@g
znMDoREjGgr2TC$ST=mAeg)GT@_bg<-Kx9coLVgbNbH(N7R)p%I<P}O@q2zTDc4o!m
KN=X@Q^z#34%`db7
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/String/split-003.js
@@ -0,0 +1,123 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          String/split-003.js
+ *  ECMA Section:       15.6.4.9
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+
+/*
+ * Since regular expressions have been part of JavaScript since 1.2, there
+ * are already tests for regular expressions in the js1_2/regexp folder.
+ *
+ * These new tests try to supplement the existing tests, and verify that
+ * our implementation of RegExp conforms to the ECMA specification, but
+ * does not try to be as exhaustive as in previous tests.
+ *
+ * The [,limit] argument to String.split is new, and not covered in any
+ * existing tests.
+ *
+ * String.split cases are covered in ecma/String/15.5.4.8-*.js.
+ * String.split where separator is a RegExp are in
+ * js1_2/regexp/string_split.js
+ *
+ */
+
+var SECTION = "ecma_2/String/split-003.js";
+var VERSION = "ECMA_2";
+var TITLE   = "String.prototype.split( regexp, [,limit] )";
+
+startTest();
+
+// separator is a regexp
+// separator regexp value global setting is set
+// string is an empty string
+// if separator is an empty string, split each by character
+
+
+AddSplitCases( "hello", new RegExp, "new RegExp", ["h","e","l","l","o"] );
+
+AddSplitCases( "hello", /l/, "/l/", ["he","","o"] );
+AddLimitedSplitCases( "hello", /l/, "/l/", 0, [] );
+AddLimitedSplitCases( "hello", /l/, "/l/", 1, ["he"] );
+AddLimitedSplitCases( "hello", /l/, "/l/", 2, ["he",""] );
+AddLimitedSplitCases( "hello", /l/, "/l/", 3, ["he","","o"] );
+AddLimitedSplitCases( "hello", /l/, "/l/", 4, ["he","","o"] );
+AddLimitedSplitCases( "hello", /l/, "/l/", void 0, ["he","","o"] );
+AddLimitedSplitCases( "hello", /l/, "/l/", "hi", [] );
+AddLimitedSplitCases( "hello", /l/, "/l/", undefined, ["he","","o"] );
+
+AddSplitCases( "hello", new RegExp, "new RegExp", ["h","e","l","l","o"] );
+AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 0, [] );
+AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 1, ["h"] );
+AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 2, ["h","e"] );
+AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 3, ["h","e","l"] );
+AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 4, ["h","e","l","l"] );
+AddLimitedSplitCases( "hello", new RegExp, "new RegExp", void 0,  ["h","e","l","l","o"] );
+AddLimitedSplitCases( "hello", new RegExp, "new RegExp", "hi",  [] );
+AddLimitedSplitCases( "hello", new RegExp, "new RegExp", undefined,  ["h","e","l","l","o"] );
+
+test();
+
+function AddSplitCases( string, separator, str_sep, split_array ) {
+  // verify that the result of split is an object of type Array
+  AddTestCase(
+    "( " + string  + " ).split(" + str_sep +").constructor == Array",
+    true,
+    string.split(separator).constructor == Array );
+
+  // check the number of items in the array
+  AddTestCase(
+    "( " + string  + " ).split(" + str_sep +").length",
+    split_array.length,
+    string.split(separator).length );
+
+  // check the value of each array item
+  var limit = (split_array.length > string.split(separator).length )
+    ? split_array.length : string.split(separator).length;
+
+  for ( var matches = 0; matches < split_array.length; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).split(" + str_sep +")[" + matches +"]",
+      split_array[matches],
+      string.split( separator )[matches] );
+  }
+}
+
+function AddLimitedSplitCases(
+  string, separator, str_sep, limit, split_array ) {
+
+  // verify that the result of split is an object of type Array
+
+  AddTestCase(
+    "( " + string  + " ).split(" + str_sep +", " + limit +
+    " ).constructor == Array",
+    true,
+    string.split(separator, limit).constructor == Array );
+
+  // check the length of the array
+
+  AddTestCase(
+    "( " + string + " ).split(" + str_sep  +", " + limit + " ).length",
+    split_array.length,
+    string.split(separator, limit).length );
+
+  // check the value of each array item
+
+  var slimit = (split_array.length > string.split(separator).length )
+    ? split_array.length : string.split(separator, limit).length;
+
+  for ( var matches = 0; matches < slimit; matches++ ) {
+    AddTestCase(
+      "( " + string + " ).split(" + str_sep +", " + limit + " )[" + matches +"]",
+      split_array[matches],
+      string.split( separator, limit )[matches] );
+  }
+}
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..562dbd32920938189b3a901344fd3a3bca6ee9e0
GIT binary patch
literal 3789
zc%0Q%O>fgc5ZzKJAVA{8nPWLX3RkR1AvIE@Hbu47YqYV4bYWv#yW_O^vHS-P{Q=Cb
zli0N#x1{-iC{p6tnRzpBci-5-G?CDDE`f(_FHj;uw$B*TL7V^!g@ORZ1T@pg5ylXq
zW=_j`JH^nB)}Ro=3$8pH`k0bPxE2AIa(WDb<O;$*A5*FcSGNrTPcU6PU2=VFaoq`*
z3ot1(woOv=aa#5<Gmgn%795RAM5Fdo`tP}2zjxMmS~J^x?Fp^<J^#e5teB_^_uQ+C
zdPHjqa&r;AR1*EpXjxwH*H?@^GsYr;M4aG52^ljSMI14M`%^?A3uney<?PRjF`Gq%
z=EY@Y>@o9ghKQ9#7!m?SG7$-^-P<pjLocM=7vBXan>wP+Di>2r{hW|u$`gU0xb&=x
zdz~oI+H|~UyOC)n^BY<?2jkib;)slCK=r>rI{H`zTKs05*Ws_1?cZ!?Y*&u#TG&3I
z1-E<J8GQN&*uB{eyERg=7H(e}Jh*zBo#w-LD>0k{d2?O1h>#ah*L|17xKN{E%;+-!
z<7$*HSNEK*QipZKJvZY6xk4W_R=ca!#d7Ow=#?gt7)8dr)bad`+!1fUL~sh@A*ei;
zPecLQJn`@c4Jno=8g~k(cP1&7ai8$N;{9MDkyX+QTSI^t<1~S#Ua!fEn(Ruh^|x7h
z&6nVTZEl;TGn@2*ESU+8adz(;?(oLt@$+s*edV2~rqMoJZCq`dPW`>4=08>07i8~*
zq0!hb*EJhq+xkV}`{l#2(#uzIWPKP6?EM%FHYy8SR=-_UzU(Fys&3$Wa|3iM$JpFX
KT>U-aw)qd>zu)Nq
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/constructor-001.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/constructor-001.js
+ *  ECMA Section:       15.7.3.3
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/constructor-001";
+var VERSION = "ECMA_2";
+var TITLE   = "new RegExp()";
+
+startTest();
+
+/*
+ * for each test case, verify:
+ * - verify that [[Class]] property is RegExp
+ * - prototype property should be set to RegExp.prototype
+ * - source is set to the empty string
+ * - global property is set to false
+ * - ignoreCase property is set to false
+ * - multiline property is set to false
+ * - lastIndex property is set to 0
+ */
+
+RegExp.prototype.getClassProperty = Object.prototype.toString;
+var re = new RegExp();
+
+AddTestCase(
+  "new RegExp().__proto__",
+  RegExp.prototype,
+  re.__proto__
+  );
+
+test()
new file mode 100644
index 0000000000000000000000000000000000000000..4069aac5f28287760a7755acfc9ce569a1fb8b35
GIT binary patch
literal 3798
zc%0Q%OK;Oa5Z+QKAcTa3gnG=em4FnkSdl{NL!>rAb<}ILu_x)m#<q4RY4c<G5Bve7
z&TgF8wVkAoJRldx^PX>Kzp;a(SVGOY0v^;nUx^smK4VP#Q4A~)3Vak}&`cvo7($4e
zIaO=zWL@i8gF*-{x$>;*a|$BiM)+LH$tn1fD+pSANTJ4D-4*ye#?k!kitAIG*Bx^?
zPbP)Nnh9!tPSw6ng+me;g`-i4a8P?m|2?<SX|`KVHIdD9FG$yEcFx>_#&})27hajy
zGtwzY#o6q+lIWShvbf;(TgF})VHQ9FPVk<DDKZ>I6f%?dmk0wEB*I9g=qJUP!y-V_
z;%th)B;8w;B2qR(k1~)a6QRJ;v;96bXa;opqAx(%&><aGzL-+zXMkiwo(TlSrDsjt
zn^=L?rsF-^jT{vszbC~77}IKh6#539PbVi|idp8*Dd1(v*9-NZ-9cTL*R?=>Knk~U
zUhjVW2hcTT?f~5qo>&XEhx0K$s>B@0JN#JbOFqz*<42*LCiP|nZL>pKOc@dlV&zP|
z20cU60F0}_Xfe&F(B--<1M#)lBghqYKx47HQi9C4zJ^|DHHkrJtaBaD=4FMyNhbVr
z81_J=u{s14pp6ste$uvLv7)`FaI!K;u8jM*KM41O`H&Ss&m0XU#0V!bEVOz@R@7ue
za;<+P<t@JuPi%ABD79_SC!%ClIYv_sSaOFqPL<zwLzRV(qmo8jaJ_N1SvK|eqMHAd
zW#5pz9t4JC8(fzhgl+3Lx$ozP<H76egQ)?oE6EBw{@m@_`_b)gloqzke!HrC(M`%!
Vy#(*gEzqruvALc2`0s?f;#-mA;?V#A
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/function-001.js
@@ -0,0 +1,41 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          RegExp/function-001.js
+ *  ECMA Section:       15.7.2.1
+ *  Description:        Based on ECMA 2 Draft 7 February 1999
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               19 February 1999
+ */
+var SECTION = "RegExp/function-001";
+var VERSION = "ECMA_2";
+var TITLE   = "RegExp( pattern, flags )";
+
+startTest();
+
+/*
+ * for each test case, verify:
+ * - verify that [[Class]] property is RegExp
+ * - prototype property should be set to RegExp.prototype
+ * - source is set to the empty string
+ * - global property is set to false
+ * - ignoreCase property is set to false
+ * - multiline property is set to false
+ * - lastIndex property is set to 0
+ */
+
+RegExp.prototype.getClassProperty = Object.prototype.toString;
+var re = new RegExp();
+
+AddTestCase(
+  "new RegExp().__proto__",
+  RegExp.prototype,
+  re.__proto__
+  );
+
+test()
new file mode 100644
index 0000000000000000000000000000000000000000..9611ab1e9815991a06ee3e9653521b99bc575711
GIT binary patch
literal 30254
zc%1E>L2uhO6oBa_>ADUZ_77&{FtiQ2q#3YXjI43uZ2{6`n4Mk?#bz9Bieyl95+4Wj
zNA0)lupcmNL$T9N!yYNwmL*b>WyzME*Gm$T;v?UCeD5Pot2I98TlAoIO^xnBv%}0j
zCmVzix8w9F>6(moxOq!m;&Ox28)|cx)OKa-TJX_B*QJcp?puR3<)fR>iAC?tj$v8D
zW7@F{M!RRm4Rm#Du<3%1(dUElU)P3vEaf(C4QnjSGF^TkIu-wFyYf%3@S_SLPeq~2
znQ8ZAqwlD_SKIXqLKUxc75lo1FLf1%x{7+FLX7al1})khdVUqD{s5|*jic7d`B|iH
z3+h@Yt<#3`ske<En^R8(byI}~m4I%PV!Q`HslGw=s{YF*<b@~<njTDU8kZLJY-(`R
zvB@K7^s{MqN!KrQ*u-yqxx&rB6(-}5BK{qXI8KDaq=ZY508bLrHo4L(>t2JCF8Hl^
zWl|=)w!zK9gHbES?<?5lsmUobtfp+zxbHLSx?;u^IU8#b>G>0=Fnz;2S1<SWUPT3r
ze|oxB$<0^G@0X|LsK4f+<;PIbIC^u~-Y<c6|5=W96>%aL-9DZ2;7t0Rh-r@Uh?GYs
z;#G4$g5(hxq0pDeCzKL{^#=NEG*MP)ek!$nDAFA_7;jORM`x#uhT*BN%3ME%@;e3&
z@I91L)^bjro@UCwRuoPQ&S<b<K#*7fknTNyw&)cn%<NtBuw2p6&O}hbUCyME;v&DO
zsOpzX<`KuNbInpziTrk8cSM{EhCHDQ(>-*Db_ad}$M{z0LxUR%)A!i!(&-Mp-{kOQ
ztt(4MLk+pjhz@_4?nhX9-1Uqocn{BR2FNCXuO52~5W0#~JrVwP`4d#Nqi7hY+*c!3
zC^QhIvfF0^%krCflTfuvAL@0pRT|o1H-<G<y(>ct_%fIbJdIDQ^*^ZFP^|it<5KH#
zzPV~lFjt={cL=SWbmog&S#_}>gtFteQF`3IfMGrg8zW<SfhB16Y|%QDWJUmz`uP^*
zBg#`M8M+);3MJ=}0d!oFIk2Yp-mKlm(P{ojaYpY7Ckin+0ZvDTOEn~Mx8aBC;&b$B
z@JRt(W`dJv#W;D)26wI@e+(7RtCJO91Y4zBtC_ox%R6&*s*AH45L|yg{F?Z=GwCRA
zYvgVv!n^2T=LWkA)tSU>XA5C1m5!G_-%`Nql6Xl7GdpkS%_U`Fc9Q*gQHJ!H2>g7g
z?4)&Vx&iSjg(ll)u6?G?=J~_QiYZ*cXU_|O&@$D@!5J_YGdppq&U5M~uTjxc8JRmC
zCB&<FQMfybR~p>?MHOjhhMgBOsY9-_tJ}{Y7i{lvP}vs~m)qGMqtNs1^oc(`0Iafm
z&16%3whc5858^7H(G0;(Lc>_R6~#G!yA1-l({5{9tz5Xd%_ZD?77RCjtPul(DC1cw
zLyTGf-9+@pK#6w~35Tb+n+WYDet%S+(^uS0thd68+)WTYXCMWpiIRm<V2pLp3_6UH
z5XXo81Y0bE(Dc}u>f*@5VWsG2>m_ETgpdD_m5`N?mDZ4z-hYFvls@SxqGX}06k{DU
z!|Je-g6)u%rZg1&?n;SSX%ATmSqWLGlnO8OT!|nnrB8Z_C|T^elHNLKhSgyu1=}Gj
zO=&3l9o!PL(jl_aOsw=3-snSCDlaRgzh5CL6pJ6VzH;|%-l@Xw%>M9_1n%36?(tQf
ztE&2{AKviG1Ev%Uu+;FUfYr?KhqlhN-zqf1uP2a4-+fbJAg?2kBakDImr~({1G!@H
zqt+3~5y%$>X^I6{JfuCKRiCd-X4oWMgkEqU2RwSgf&9hps^s4~W;gZ)2f2JYm7kRt
z^3txPm;K1N@*7crnXk0E<5<+N<CIpJpJl|(#g~+7)utE~SwQeCj|tyZ6ee6ml8v>T
z9NKYAj-AJjWpcL43S{aGZ(-W>C_3Sjrv;vBDMo^)T4{8rwqhVT$9%h0nM$VuU))i`
zT87&{R2efTqZF`4FoPzW^k7*TG~><IdF3Tsy+k)bH%akrCUg^YlN2uqC>Kein=H#s
z65dLOZc<J+ne{S3Y1jnaWS!k4H#R{xS!XvvHbFN*HYv(YUOyB!5wFTVmuIu+C|Mk(
t{!knx{@w|mo+P`<-z1OY_2iAj(#`s?BEX+zG%JSnSZ(v{|FPY4@&9`Q9gP40
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-001.js
@@ -0,0 +1,111 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          instanceof-001.js
+ *  ECMA Section:       11.8.6
+ *  Description:
+ *
+ *  RelationalExpression instanceof Identifier
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               2 September 1998
+ */
+var SECTION = "instanceof-001";
+var VERSION = "ECMA_2";
+var TITLE   = "instanceof"
+
+  startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function InstanceOf( object_1, object_2, expect ) {
+  result = object_1 instanceof object_2;
+
+  new TestCase(
+    SECTION,
+    "(" + object_1 + ") instanceof " + object_2,
+    expect,
+    result );
+}
+
+function Gen3(value) {
+  this.value = value;
+  this.generation = 3;
+  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
+}
+Gen3.name = 3;
+Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
+
+function Gen2(value) {
+  this.value = value;
+  this.generation = 2;
+}
+Gen2.name = 2;
+Gen2.prototype = new Gen3();
+
+function Gen1(value) {
+  this.value = value;
+  this.generation = 1;
+}
+Gen1.name = 1;
+Gen1.prototype = new Gen2();
+
+function Gen0(value) {
+  this.value = value;
+  this.generation = 0;
+}
+Gen0.name = 0;
+Gen0.prototype = new Gen1();
+
+
+function GenA(value) {
+  this.value = value;
+  this.generation = "A";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+
+}
+GenA.prototype = new Gen0();
+GenA.name = "A";
+
+function GenB(value) {
+  this.value = value;
+  this.generation = "B";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+}
+GenB.name = "B"
+  GenB.prototype = void 0;
+
+// RelationalExpression is not an object.
+
+InstanceOf( true, Boolean, false );
+InstanceOf( new Boolean(false), Boolean, true );
+
+// __proto__ of RelationalExpression is null.  should return false
+genA = new GenA();
+genA.__proto__ = null;
+
+InstanceOf( genA, GenA, false );
+
+// RelationalExpression.__proto__ ==  (but not ===) Identifier.prototype
+
+InstanceOf( new Gen2(), Gen0, false );
+InstanceOf( new Gen2(), Gen1, false );
+InstanceOf( new Gen2(), Gen2, true );
+InstanceOf( new Gen2(), Gen3, true );
+
+// RelationalExpression.__proto__.__proto__ === Identifier.prototype
+InstanceOf( new Gen0(), Gen0, true );
+InstanceOf( new Gen0(), Gen1, true );
+InstanceOf( new Gen0(), Gen2, true );
+InstanceOf( new Gen0(), Gen3, true );
+
+InstanceOf( new Gen0(), Object, true );
+InstanceOf( new Gen0(), Function, false );
+
+InstanceOf( Gen0, Function, true );
+InstanceOf( Gen0, Object, true );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..6dcf07da92845ec8c14a76bce8819212aedf9be6
GIT binary patch
literal 26586
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
VHS>r6LcUO+1Dj6&e*^r*{{w+Hhz9@w
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-002.js
@@ -0,0 +1,127 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          instanceof-002.js
+   Section:
+   Description:        Determining Instance Relationships
+
+   This test is the same as js1_3/inherit/proto-002, except that it uses
+   the builtin instanceof operator rather than a user-defined function
+   called InstanceOf.
+
+   This tests Object Hierarchy and Inheritance, as described in the document
+   Object Hierarchy and Inheritance in JavaScript, last modified on 12/18/97
+   15:19:34 on http://devedge.netscape.com/.  Current URL:
+   http://devedge.netscape.com/docs/manuals/communicator/jsobj/contents.htm
+
+   This tests the syntax ObjectName.prototype = new PrototypeObject using the
+   Employee example in the document referenced above.
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+//    onerror = err;
+
+var SECTION = "instanceof-002";
+var VERSION = "ECMA_2";
+var TITLE   = "Determining Instance Relationships";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function InstanceOf( object, constructor ) {
+  while ( object != null ) {
+    if ( object == constructor.prototype ) {
+      return true;
+    }
+    object = object.__proto__;
+  }
+  return false;
+}
+
+function Employee ( name, dept ) {
+  this.name = name || "";
+  this.dept = dept || "general";
+}
+
+function Manager () {
+  this.reports = [];
+}
+Manager.prototype = new Employee();
+
+function WorkerBee ( name, dept, projs ) {
+  this.base = Employee;
+  this.base( name, dept)
+    this.projects = projs || new Array();
+}
+WorkerBee.prototype = new Employee();
+
+function SalesPerson () {
+  this.dept = "sales";
+  this.quota = 100;
+}
+SalesPerson.prototype = new WorkerBee();
+
+function Engineer ( name, projs, machine ) {
+  this.base = WorkerBee;
+  this.base( name, "engineering", projs )
+    this.machine = machine || "";
+}
+Engineer.prototype = new WorkerBee();
+
+var pat = new Engineer();
+
+new TestCase( SECTION,
+	      "pat.__proto__ == Engineer.prototype",
+	      true,
+	      pat.__proto__ == Engineer.prototype );
+
+new TestCase( SECTION,
+	      "pat.__proto__.__proto__ == WorkerBee.prototype",
+	      true,
+	      pat.__proto__.__proto__ == WorkerBee.prototype );
+
+new TestCase( SECTION,
+	      "pat.__proto__.__proto__.__proto__ == Employee.prototype",
+	      true,
+	      pat.__proto__.__proto__.__proto__ == Employee.prototype );
+
+new TestCase( SECTION,
+	      "pat.__proto__.__proto__.__proto__.__proto__ == Object.prototype",
+	      true,
+	      pat.__proto__.__proto__.__proto__.__proto__ == Object.prototype );
+
+new TestCase( SECTION,
+	      "pat.__proto__.__proto__.__proto__.__proto__.__proto__ == null",
+	      true,
+	      pat.__proto__.__proto__.__proto__.__proto__.__proto__ == null );
+
+new TestCase( SECTION,
+	      "pat instanceof Engineer",
+	      true,
+	      pat instanceof Engineer );
+
+new TestCase( SECTION,
+	      "pat instanceof WorkerBee )",
+	      true,
+	      pat instanceof WorkerBee );
+
+new TestCase( SECTION,
+	      "pat instanceof Employee )",
+	      true,
+	      pat instanceof Employee );
+
+new TestCase( SECTION,
+	      "pat instanceof Object )",
+	      true,
+	      pat instanceof Object );
+
+new TestCase( SECTION,
+	      "pat instanceof SalesPerson )",
+	      false,
+	      pat instanceof SalesPerson );
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..93f1b637665437be83ea61cb6a5766c7632420e9
GIT binary patch
literal 22602
zc%1E=&2Hm15XYHhv)vCA=mQj}kVCQCAWfPD+KZ9acHA~VHXE#+pf^L2X@{*W85Etw
z#{zw*K1|VPSoGLK(IF+<vP8<VEIG25xg-`Te*9-R^P{Y=!iEDIpHyzK**R%ilnfZ!
zK?r%4JHV(zD7F~6!yfXO$#5S#%tMt!QM(epwd#48GTgZ~X;a+#1RAmN1F=lo9-U&#
zHYx60n0;vK&ZM&!EOWqylTWv%cPjdA+?n>IGn;tqgg456Du?2ufAQrOLNEA5k5S_E
zM5Ujwb5uDDE<_5xQ577k3f`y+s;YuotbmX3%mEc03%~2eia&wkW~1IZdv_5l+l8{$
zS?jzZz3aO1zBzMOSQ`T>Y=yLucH`dwq6P+4Oa1&Bq0jlnu<60%#JsVwZ&Q;I*FoD*
z={MqZP$#(P(y8AB{c<-0SD21Nbn)+a#7SMaRP=BIJ;0raID|>PvgTJf>ww>qF2PhZ
z?SPv_2O}3IXe-?0IboQZc2iVoJPauIJU-(sF&ldrYxy%MAc5iC?!nQ~n*%4_#pJiI
zwyfuTb^h>pI>$XW51pSvL8Jb*+CDCUy8k?mx{^qdi?%Ojd^nT7({7sMOd|Tj)9z(+
zuS5C>jgafbGYZDYq`jd!A5F!I%ugoUbDr>+Nm&bfEIvDFJd93#UFOQe(LDtR_!+KZ
z+H%j`o?^;>Zb_UNoYADCP)B?LK*IO^*~VRlDCym@XurIn{b@%9H@T1`#l?PJV5pZ%
z<`E~XbH!4Wb@}7av3Q&dhdizY@v7d)vEVn5OkjlpROn-vzE5{IZfE5GC59(TJ#lqB
z)QH=R`S5bK9d7AK(+k4j1Kj&0#5QvX>#4s0p{ZEWGwyFUzd}(v4u_$_V>x6+LIaYD
z-M$#wc2LcqgsfKjP_LS;)X*;NoAyL{PlOimWiT0d8k?2%KPcOgtooGWl54r#Tooo*
zs!f?YMAl9^^ChjU8eb4x?BtD<8n~}unA=ffWK1ux1WC`~wIfMp3?QlRZ$Uo7ETzcM
z<j|IgoJR&waY^RDn%;Y}Hk(AJ`6I;zzAv08_~bY^)lCm8NaB7c2-U^s==I=}0-DSO
zC$EZea>?4sg{MA+g4f1$#TUU=>DFrI=9BWyQjMzOtO5i#pAWx7LGGOQFmHG4ZY9FI
z_+Xa?yDQl<iN&5RL{%ysFMYWyf!9akCEgja-s1iZrcrhh?f6j!4JZ%%Y$R=@bxXWZ
z_cB4}+h?hLrpo5|!^)Zo&f&A?2SBKq>dC<cFc&3OQmXTv`q>X!=$VYnT%Qt>WnLBT
zj^mXAcYl{f+J#}~E0NS8*Ez=CE64?V`wS%edg^lfdlM9Ty_Y`mrw4#_cCUqOs?N5d
z3j9XB$`>?4xRJ;(R&PcAoWI?M4w>6-D{HM?xVg(E+<XxZH$kl71A-{yTPj10+5Fu^
z{GEXk?<VFvJk`62$Zq2A?eaW*)w_w!7QD#a1X6Q`roc2&vQP?4u#Pr^3gZOCvC&|T
zEmlEjYV1t);>gFtO7ZX3OUz1hzW&p!q*+O`(gw29hwn8jrB8a2C|M{gC0IwBVSQLh
z!giXKW)zD5_ezOb=}5DZW+lx^r4+o-=SoPkQu?GPiIT-WS5jL?n_+!eNy2uTm1Y!*
z{}*nFS*fa7X(3knR=?4wS*g6Nl>Yq+ULaZgTJ^Pi-{ucl*j?Bk4p8WQoAG;mhTApd
zulngX{PKV)$pS1j{7GOnGyG{=XWDNS8sRq+$m6Hqlo-fs8pt(}YalPB;DrOZWbtd&
zHIQo{UlpWD7GUv^_7Sc6d~LG8Ch012z=0U>_<#fPhtrYuf9H};;sFP_d^=ShD`z-W
z<t1D{Z8Yoe&n^o%vx=YZI30vRJi~FBVH#a!4BiY?d7f$fa@nZ28mBo+${7z+>e7{H
xw~}Mz<{dvJGTmQDvQ-GwtGTX?O(#jdtt9oAy+0r8t@l}gJl?YGM;^{z{vY!!O0)m~
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-003-n.js
@@ -0,0 +1,88 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          instanceof-001.js
+ *  ECMA Section:       11.8.6
+ *  Description:
+ *
+ *  RelationalExpression instanceof Identifier
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               2 September 1998
+ */
+var SECTION = "instanceof-003-n";
+var VERSION = "ECMA_2";
+var TITLE   = "instanceof"
+
+  startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function InstanceOf( object_1, object_2, expect ) {
+
+  result = object_1 instanceof object_2;
+
+  new TestCase(
+    SECTION,
+    "(" + object_1 + ") instanceof " + object_2,
+    expect,
+    result );
+}
+
+function Gen3(value) {
+  this.value = value;
+  this.generation = 3;
+  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
+}
+Gen3.name = 3;
+Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
+
+function Gen2(value) {
+  this.value = value;
+  this.generation = 2;
+}
+Gen2.name = 2;
+Gen2.prototype = new Gen3();
+
+function Gen1(value) {
+  this.value = value;
+  this.generation = 1;
+}
+Gen1.name = 1;
+Gen1.prototype = new Gen2();
+
+function Gen0(value) {
+  this.value = value;
+  this.generation = 0;
+}
+Gen0.name = 0;
+Gen0.prototype = new Gen1();
+
+
+function GenA(value) {
+  this.value = value;
+  this.generation = "A";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+
+}
+GenA.prototype = new Gen0();
+GenA.name = "A";
+
+function GenB(value) {
+  this.value = value;
+  this.generation = "B";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+}
+GenB.name = "B"
+  GenB.prototype = void 0;
+
+// Identifier is not a function
+DESCRIPTION = "Identifier is not a function";
+EXPECTED = "error";
+
+InstanceOf( true, true, "error" );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..67ff7b009433c062401737eab09b1df13c9a336f
GIT binary patch
literal 22772
zc%1E=PjBNy6u>9#c3F0X#0Nkk>H+Oim6n3w5*3<1K&5WC+N2e?$Z;m=fMZAFN!uKe
z5MPK3pN7w{;>ZE<X6z)6J>xizojTd+rHyC&-pqS%-usQ?PKAwz7Cx=qVxxQ7G$|P}
zw2KgOO=pNvmr!gna)({yGK1j(wwa46N1}Hnc<Y(#V#;v$#-L4c>k|-S;Rj+GmNl+p
z(=sUTUK#@sb!X7|3#Kt-qv@wx!>tRwjXT4dDzk{oPPtJ2Q#leJy^AkO2tDT)T}FxB
z7oC2@_HpINzYuEpQq^#xYWPakaHeXgMjH4C&uy@xZQ?h*Nb?8K+-%fZ=Wi|}ZF|tx
zI&WPxq<7sk-Ztm%3fiU&9ZCV)NY!{ZfKh#is!jdp4MLyri$T|e%Zbsku;){Q5ywV5
z(CJrVcTv~B=+If*_<DJmK`6||AyoW38F8EnhYAfH&;WNLViP8f%Bt7lybEzldIVD;
z+J-O-4@PbnUsh1$1!0&PR#S9oJPavzT|VQIn2j}xNd6cai0^o(cX)jK^`RYAG5zgX
zTc$Z%JHLB8J4Yin3p+oBhDPo6S^J~_*8S&ktSiYBnb`LETnwkO?@Uc|Qb~k9JX0^5
zdkxA*V1(RWyrN)?4B8*5>(R_uq4~+o_8~8L%%H4=T^604G#`eizA1C%>FAz90Q>}3
zF>N^)PG2$Qze<uIhF~=4IG~6x04VrgJX^TO5GDOv7S_uJ9n2KvEOIH6<d^$-Ls`9C
zQja)hohz22Oyv(F+vIsJnDV$Sh<oOaZ4-V2$@pFvLWco{>3ek7ak^vgFEKpP>WZtA
zp@za{!iQJ$a=53bqL+lh2e|i1fNd5K)>Cf*f~ZK-Gahf9U!bWSg~LGOi5#**sR2oi
z-M$=Imfy{rgsfNcRIi$?)X@$d7}nJEu1GBq%iuDIG&XP6|DbJGvg#9#OK!{6=BjYP
zN-|~P5L!FQ+!wd9s(e9kW5;i#)WCfW!`ulwBV~DkB}n=<?;R>K697qke+%jnW(kc9
zB1e|Q$XQeX6_=z=tjVJ{t=Kp^%^oQ(@qO+@!6(PTsb;uXK@#`7eyYyDMsEh6<RCH?
zoV?5@$R%qh6Q24A8eWxWD?SglO14&0i;t^2D+yKQSp^7gKOcUJ{MxzbVcy;(+zNzu
z(ZQ|^cGt3J63abX2wSOey!6?g1YRGBm$))wzQ%(NreSsxa=a{qhLk6MHkJx$-4ZvT
zUS`n6{#j|Csq%UDu(DwW=kVG05+L+U^yJ_Yn2QoKuGD!!{p@>f=(&o_9FG#>&Acw$
zo#ZP8?*1mrv`fRz=c1@Xt+UJfFQFFfA22Z47qgH%*q@@%tNrAKKREzwa(FG}Q+2fs
zbl^AYRlcMff<i*WSicwfbN+T46f&pXR`%MsbaR(Uy7@GiZv0%s2LxHh^Hho)v;Dh?
z=sN=i-c2lcc&c|3q20vaJH>hWs&^CHZSXvI6G+V&ngWw#$y_Ng#yi>#DvT2l$Hv12
zzE}sLsj)NBizDw3D@DIsFEA@D`1((?l4d2%N?XWE@4nNll)UIkvShBT6yqK3hRtCm
z3EOE_nzK;!zgG&(O2?X&G%IOVDx|@4eXfKwD<v;_k}R3;b0xKRv>P^ul_YGZS!vEf
z(f`6NFe{yDR$7XczR_>=X;vyOD<yxwf;UJOzqb0uy>IioEbT5G4~Ho5zRl!4zOvIR
z%U|`=Z}?>aQ<4Q(X!w)BYHIk?zD~8@$~D7pCy+-^zbP<~S2d7pAlE=%NQ37N<dVg&
zt*(Jw1NpijO|k&<hqU)-)o1IIB{oUdp#u)YfF}nWh(GMEO#hujy0HfwWb*A)alD-3
zRFxNSz20cn-kx9OaAp-h-*GmGGI7hc!^%dvr_90IVO3sd8b4n(YOO{+W0P{m!<0I7
zEw)?BF>;HJpAwbskCJ4ounuP6Tj;9eSlCb@Lp=r={5#`3TT<2ZbmHV2-b~|cvrjGL
Mm4T%{oN@m0|L@O%>Hq)$
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-004-n.js
@@ -0,0 +1,88 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          instanceof-001.js
+ *  ECMA Section:       11.8.6
+ *  Description:
+ *
+ *  RelationalExpression instanceof Identifier
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               2 September 1998
+ */
+var SECTION = "instanceof-004-n";
+var VERSION = "ECMA_2";
+var TITLE   = "instanceof"
+
+  startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function InstanceOf( object_1, object_2, expect ) {
+  result = object_1 instanceof object_2;
+
+  new TestCase(
+    SECTION,
+    "(" + object_1 + ") instanceof " + object_2,
+    expect,
+    result );
+}
+
+function Gen3(value) {
+  this.value = value;
+  this.generation = 3;
+  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
+}
+Gen3.name = 3;
+Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
+
+function Gen2(value) {
+  this.value = value;
+  this.generation = 2;
+}
+Gen2.name = 2;
+Gen2.prototype = new Gen3();
+
+function Gen1(value) {
+  this.value = value;
+  this.generation = 1;
+}
+Gen1.name = 1;
+Gen1.prototype = new Gen2();
+
+function Gen0(value) {
+  this.value = value;
+  this.generation = 0;
+}
+Gen0.name = 0;
+Gen0.prototype = new Gen1();
+
+
+function GenA(value) {
+  this.value = value;
+  this.generation = "A";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+
+}
+GenA.prototype = new Gen0();
+GenA.name = "A";
+
+function GenB(value) {
+  this.value = value;
+  this.generation = "B";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+}
+GenB.name = "B"
+  GenB.prototype = void 0;
+
+// Identifier is not a function
+
+DESCRIPTION = "Identifier is not a function";
+EXPECTED = "error";
+
+InstanceOf( new Boolean(true), false, "error" );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..be9087a50254b060c8dcb9f30a1ec2d22142ac5e
GIT binary patch
literal 22762
zc%1EA!EWO=5T%pNcDsuL{eS`$awvA2rb$z@y%=d7$88N{v%%U4dNUN6cG$|2LD5cp
zEYP3nAM|Vb4T~OoC_1EMTb4*!RwPHxGM6MAYKD9>oOz^WR@rE1<KyZLHoM0yi;^Kj
z+Xx}ga)%go3B?v8W9%W1nG6rG!#q?y5WTD6M{AykDZ||>leWa8Pe6%{?}%mE_T&^>
zwn=gK+#G<au}K#jEOW?4v;S^P?^M`rj7@uH%qAW?=1Tcb^+5dVH@>JK^qe<(j1s3W
zI{k#5!|FlM5D|Q(5*(=nU#kQ)mEa^M;3I50fTCmJH@%qn0}!_w^>*{kc}%tgvUan5
z){s7R)p*-lcq)vI0UatKY@}xV2LRN-p=zlAyh7*`-WYa0xSW{RHuimLGU7UD3p)Kq
zoG$7HjV_(XO<<RY8HB=o9KyuE(-9|`aH+6x4Hn=@L>$7TQF-EbXm%lPNsnMER67u6
z(ZR@p33P>3o)LzrX}3g|#@&!&&*L+$h}qbqnC6c`Kmy0Rz5T<(Z}y$IiP>)-ZJFhK
zaenu3IL9M451gNZpizHa>l~E;-G3eiT}h_M1>5HfF`NnCxtZ3qk_dZvZeBL`I+Tyl
z2svK7qF{_n+8?Rw(HyME{A93w$O|4bDQjbo#b+nYhta8T%3OImx}^{RKSL{~ZTHOW
zE2jKcMH0jij3%9g4Dkg31>cWn8}}HZq<_PrcDbUxxuJqpt^`SOxt|LR^>WEP;)Hds
zSc)=}KaL!W=ecmo<5&={=1m+6egl&UyfB0g0}Rvm+1<6<o%nx=;R&fHTBk#egw2#6
zUM%Y2o}Q^*kqq9!vrj_YW(mW3>MuZ06%#$<@pk<yh&pj{7!n@INme8^ASu|L^O0=_
z-TX<&dZkbGs@X~%?b3m1&!G22YJpe=mqDblMOgm>*|ucWryQ3Y%lpk$;evbVl!ZfN
z?WA*G(#ksF3xb24ypd89?n@ZvR@508%L^<)(sy|8NRgQmkkrq&p&ntD5@b+0vLztr
zQ2|uEBy(a-AH7-CCb84}DaARyEu2yC$#LRTH$ALi61UqysxH1pZw5apKxHO!^0Js9
zm#m#!_|!)rcxB92d=cC#-CE78KB?~9OQ|Z)Dv03Y=ZD{+pmr`h%-flUTZ!mhe6aT>
zc9*g<iPg>)q9~P)FMYNnA+Ha_m$)%vy~cxUOrzXM=<%}*8d9G4*+i<OeM7vEc^RO~
z{d2E<rpo8}la&nvoRiPKp8%m}s*{6r;9QhgNu|yY>SsS_pcg7KbA6VO4D-6^?lfO1
z=<e^bOuI7K`CJrrsCAC9`x0uw?j8fkzMO~L-tLSFz1mG*_|p@BO%AV>e5$Utp$_~(
zy~<Z~Ls&^<80+^UKj-gsz#wxw9c8bLOE=?O(#@ygbQ9znJ|M_4zNa$en8&}Hh`%#X
z;@!lO!&AMRi0mf*-YU=OtKLmKZorG&O&~ST&@3=bmMoM7CU{4?K}F*PiDQ%D5?`!?
zp{Z$SsuxGzAFdStY`w%>Y01Zbnk#9pq`A@~<Vx?p*IX%m(UWA!Lb+0cceEQehbu|A
zo#sjl2*tm>Qev)jsJW8nN}4N`67WLLm5}C2>5HBuOBQ>sr1p+>!{%@$3AfW+X#t`5
zw{T0$m1>$Rt;ChS)o=7^u2f#Gl>Yq+E|4sKjrzvDZ}W#N?XDaT`zZ9j&GbD!!|fUJ
zSN-%GetD27$pS1j`IC^<%;Zn|I@5lu&<y`L33>eXn-UZ96HUl9A=iYwlz<mb$R&$k
zqpk_LCgkfPX_5t4JV|?xR(-xcSz(iO8M)v<40w9Mf%wDe%IuF_(oMYJAeT?4%H!n>
zx2n8=_R~hI{<e8hz@1emAeaxrAf90wy&(U7Va&YG6XRkx$7P1;1YZ`~h!vIrdtQwi
zzg#rx?Z#=&z;h;uDRt>uuv^PzbIUHN67}$^BH2)^@r*^1?h?;f3b0pL+-&w;g&Z)J
K{Yu8g=Klf8c77ZH
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-005-n.js
@@ -0,0 +1,89 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          instanceof-001.js
+ *  ECMA Section:       11.8.6
+ *  Description:
+ *
+ *  RelationalExpression instanceof Identifier
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               2 September 1998
+ */
+var SECTION = "instanceof-005-n";
+var VERSION = "ECMA_2";
+var TITLE   = "instanceof"
+
+  startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function InstanceOf( object_1, object_2, expect ) {
+  result = object_1 instanceof object_2;
+
+  new TestCase(
+    SECTION,
+    "(" + object_1 + ") instanceof " + object_2,
+    expect,
+    result );
+}
+
+function Gen3(value) {
+  this.value = value;
+  this.generation = 3;
+  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
+}
+Gen3.name = 3;
+Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
+
+function Gen2(value) {
+  this.value = value;
+  this.generation = 2;
+}
+Gen2.name = 2;
+Gen2.prototype = new Gen3();
+
+function Gen1(value) {
+  this.value = value;
+  this.generation = 1;
+}
+Gen1.name = 1;
+Gen1.prototype = new Gen2();
+
+function Gen0(value) {
+  this.value = value;
+  this.generation = 0;
+}
+Gen0.name = 0;
+Gen0.prototype = new Gen1();
+
+
+function GenA(value) {
+  this.value = value;
+  this.generation = "A";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+
+}
+GenA.prototype = new Gen0();
+GenA.name = "A";
+
+function GenB(value) {
+  this.value = value;
+  this.generation = "B";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+}
+GenB.name = "B"
+  GenB.prototype = void 0;
+
+
+// Identifier is a function, prototype of Identifier is not an object
+
+DESCRIPTION = "Identifier is a function, prototype of Identifier is not an object";
+EXPECTED = "error";
+
+InstanceOf( new GenB(), GenB, "error" );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..68925e8dffd80ec20b105c3fbaf9b2c79b935930
GIT binary patch
literal 22110
zc%1E=L2uhO6oBcZX}b;^b{<g7$YE#~bV)N{yBOK*#M=U-?l3#O8j3_a++@k1XeT}n
z*pJ$;*>5Oz+G*G$CEKz@%Camuvddf&i{yLcdynsZloi$3XlUcJ+ATJ$v$jdekfD8q
zkY~C>j4VR2$;cRc$YTb>1MDyl)s98)T6k#P^Dt%DdS}qK82Si=*!Z59hHXzSuxT3<
zTP<S%qQ(YYykHtbHky69HM|R<w>dWKnKGMr?2HTLKec1=(ZBd{1)*pBqQ@w4`l8cM
z*g2^k2Nxm@uT>4Fs)lb=4RuvRBi6uYc<F!@9TUIp#hRZ$bGv!oxqRD-wH-iP=dyFv
zl#Y7W{I$I>Dr}o7bf|=EBUR%M0HX#DRh#;G2cggT#jxwa<;1wLvF}rZ5!XR`(CK&L
zSjY-4x^x~lfnFYF5DN2o2o?WMXPl(Mr9#6EXn>K3ID|=~vf+2Qv><Ltk6<c9I}m2k
z$;b^8$O?<RA`DZ*Zi_C>`ys`i$5&httFcEh$)7?42^{bCUY(r0jw_h`_H8ZGo3EAM
zKb)20@tTK~A45a){7t=kS_13-^Dx$x<cVBt`)nbCGud~prai4ALLZ*1m#zIAibrUM
z++Mt%V2ljfAE~R++*pzI$;|c<FL%tKtb;ukU!61?Mwh-VYyAwa-%$vFpW!N|9rw!Z
zE0+9MMH0jij0T;A6!8rJ<=&5H8}}HZq<_nzdbyyZxuSwau4IzpGCyyqs<%t#87J&>
z#a5K5{Bh)%JkNzw9=8SY>fXdL;Wuzh;DsS{7+_ew&vrMiHSzxv(-W<pxH_F`By6U1
z_{*Xk?&+E66;bdW#y$#>%@V$P>~BC26>ECR<L%}*XzIq%Fw}S|N32L{KvH9OTO->J
zy7`Nc^-7=WRjZXc+NA@-o|)bgsRd#gTn3TG7R~w}wCziFead;sZMoiB6)spyrYsyH
zdncXyl6F>uZwPMe<YSZ?x36KEdr@a(EHAJHN#EhUBSmHkAgRZ9pdMkC(#RlkWJ`>k
zM+H!EN#?|wK6<l?O`_BMk)nm~3MUG_I1WzdhKCg-akn3&>f&qkcJN67A~V6si(-O2
z;efl=ls|!nm(}@>FM_So?bXcUlj_b|LREQI0fM{Fhu@)~b}qY>cQ6gN65(BZvTK9g
zwd|h6YWEhRRw^AYeR&{(*9YPyu8f#(@Zbj1C_4!`ewIN)$`e1ENQHE6i5F5YGw5>v
ztaZ**`8<DE*)oH3`0V=$5PGJ%bI=0jqQp!pb$(Dk{XrXgp&~Qar-WoPZwhy(`AUJi
zf5<ZJ%CPg5DC$t_oa*5Vs0D{d3{3X*JmiiJXDIaYFn!@q4*=U7UMu-jU2Q`h_&~kO
zS9C*INMstD_aeW~-|d1z=61WvUR#%L#<`@MFT&|2$TfUIkY#*NWymqRf0~FtF;L>u
z#FCq*`ZN(aP5ixAp1ZI5G_l(TFY+{j)SRIyFin;$lmZjHqurpwI012NGF;+|O%R$I
zJ5xP4^5L*j{JZrMv(l2U|1>LUR?@7rgRJ!ad(BGei=HG)7RpKq-qCK@9#)dDoo1y4
z3&sC;rNpdsqFG6^l4hk+8obc^N=UO(`l2VvlEvOvQhP_cVS89f!giXK7AzG1AKVhN
zQeCssO04v)exgsaQh8Y^{qq&PL9+R^)wk|>n?Ge~cjb6^g+kBUOrPVcy1lCWQ9u2J
zUmh?e*?^^nKMAa6hCl7=Oy{jaGyHA>dHmfsB?j__267GL8pum&@WO#yviY^uHIQo{
z-xQ=tHem6P_5tnse0{RQA?Z5uf&($(=?f0TAC4u{KX!?g_=1C6zMaa?%Nu!V*Rq%W
z_*t+b0kchHXntU6xUP*2Rf4`qNYKH^M1QI>XfadHHp$8c()>n(jqgI1{Y7|-m;VQM
C8lMvY
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/extensions/instanceof-006.js
@@ -0,0 +1,86 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          instanceof-001.js
+ *  ECMA Section:       11.8.6
+ *  Description:
+ *
+ *  RelationalExpression instanceof Identifier
+ *
+ *  Author:             christine@netscape.com
+ *  Date:               2 September 1998
+ */
+var SECTION = "instanceof-001";
+var VERSION = "ECMA_2";
+var TITLE   = "instanceof"
+
+  startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+function InstanceOf( object_1, object_2, expect ) {
+  result = object_1 instanceof object_2;
+
+  new TestCase(
+    SECTION,
+    "(" + object_1 + ") instanceof " + object_2,
+    expect,
+    result );
+}
+
+function Gen3(value) {
+  this.value = value;
+  this.generation = 3;
+  this.toString = new Function ( "return \"(Gen\"+this.generation+\" instance)\"" );
+}
+Gen3.name = 3;
+Gen3.__proto__.toString = new Function( "return \"(\"+this.name+\" object)\"");
+
+function Gen2(value) {
+  this.value = value;
+  this.generation = 2;
+}
+Gen2.name = 2;
+Gen2.prototype = new Gen3();
+
+function Gen1(value) {
+  this.value = value;
+  this.generation = 1;
+}
+Gen1.name = 1;
+Gen1.prototype = new Gen2();
+
+function Gen0(value) {
+  this.value = value;
+  this.generation = 0;
+}
+Gen0.name = 0;
+Gen0.prototype = new Gen1();
+
+
+function GenA(value) {
+  this.value = value;
+  this.generation = "A";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+
+}
+GenA.prototype = new Gen0();
+GenA.name = "A";
+
+function GenB(value) {
+  this.value = value;
+  this.generation = "B";
+  this.toString = new Function ( "return \"(instance of Gen\"+this.generation+\")\"" );
+}
+GenB.name = "B"
+  GenB.prototype = void 0;
+
+// RelationalExpression is not an object.
+
+//    InstanceOf( true, Boolean, false );
+InstanceOf( new Boolean(false), Boolean, true );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..fc12ec2eff984be50e6d0939e7e51ec5cc6be1b6
GIT binary patch
literal 4547
zc%1E5O>f#j5M9#G^i-*T!0M@04oJPmK}v|FB2gmMDA#Ij53udVM!O3n|17_$r`~(%
z?Al;s)@fte36aVLJhMA*=IzY$;;O}*L(iQ7je344*j$lkgb*1fb085D5Gu9=Nu;6*
zt{_&DxLvc_Ep9!P5`=>2k_z8!eU3pmT(gjJesc~Xrvjo8y~0pSDz*(FovX#>X-4I_
z!S$AuZ@@T{s;7hMkJ~kmsga{WJ6x#*i>JL;_}lmT<H5zq?Pj*M?*;nCgYnSY@#tNb
z-dEqYtAoBEw-&)m8R2)vN_D;`ZwWcn#v*^n8>0b-lo+a55|aa5^n=9_i85m%a`Lle
z^jRUFd2$BgCt5pygGhuy2oM2x5*9OMJ=(K$!63rJXA=g(gpTp7%E?%nUlURcIb;e1
z<-S?sUC#wbsVnZ7YWQL&a!O)3<mNkN*M`(AufHCT*PY&Mgx8no@cLg)zkS*Rc7Hz(
zyB1Aogxh!MU@_`u96~a2P!vu2wTRB~{Iw1nV94{Zk<dr+Eu^Z6(|Qa*sF*IQ)jVgd
zRH%(Vtz}rHP-Bp4w>qm3mP>yswW4&BmB3E;j8+iiWSC4VO1|w_x*5BYikkwEo`iL0
z;QMl-h+xy1D&y)vM>$Z-A@4;=d!nx$PW8Cd&iIajuNcMlweQ&0E$wSx`DSCOa|El_
z$4d9mS(0#|aZLefUOOM6?$^2#Q8oKiLPg>453<|s9uDYH+R9GgoH#M8oa_icd^|=|
z;ni1pv=;Pi?OpI4>;Aer_-5-h-GCte!%Q_d9QP2cr#%OUdprmFrnlAb7r}S@|N6h*
aYsJ(5Nva5Jzuh0?8mSvu)xRxooBsgv4AEWy
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-001.js
@@ -0,0 +1,34 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          instanceof-1.js
+   ECMA Section:
+   Description:        instanceof operator
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "";
+var VERSION = "ECMA_2";
+var TITLE   = "instanceof operator";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var b = new Boolean();
+
+new TestCase( SECTION,
+              "var b = new Boolean(); b instanceof Boolean",
+              true,
+              b instanceof Boolean );
+
+new TestCase( SECTION,
+              "b instanceof Object",
+              true,
+              b instanceof Object );
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..5d68bc8800d6e67787b3a75d25cdd5503ad6ce6a
GIT binary patch
literal 6800
zc%1E6OK;jh5MI(pny81W4^_EYJ+;aKsn@tjgjgyPB~n4TR*OBrwi_GmE)f1%e^XEW
z0aevm+hE76X`zOI2p8j--FbZT&3J8F4F?=5b|0u$X}N+86nQ`hk!~;m;xPfPVk3}5
zDyrZbd?krp4p-ahtyL*ODDbYRXoXuJq7e=^%%z-9F2LnffY+qgXlg{oZGlS%YB;;=
zQ+W~kbw-rWoN*>qMH|&WyByv|LXHBhu%!~r?^O=*f6J-0>z7Tt9LuJ<N2qJp+YM(<
zqjz07pIfF~CDe5iY1(-vBD}_^<i~q_Lda7sOyh^RG1}n}0YeoFd~$$`zA@h;UMvhm
z0)8Bft`*{$1Q)vafzs07Tm&NY&_NHllQ5qtV`<N$1$7UL&$<jmXxhhGWrHyyKLsRh
zvcVJx%3I+Q=Vl;4N}X{j%!Uu=EJq+_P0p?nx+YJ>;`;OMaGm33A-Fz9g;V=f{qlYb
z(EW8c=o)51A=tjucKcw}Z~|Jjz(?`W#rRi3I&s*V4&u-=B!QSv(7sc#YUK1l1|U@Q
zhWX<>fi07%3BV)$yiioAHb^y}opBOoQ{R<bpP_s#kP07B3Zfk}f?iI_-%AEMBQ2?z
zq#Ws1z~^PeYz|#T1nc!x)~_~nnmAgs$)zA!-_+L%E5BV<j(9=G=d|Mbhu@irE$bhC
z*`tji&nAr5-d37J=Rv@M`YR5Q;%Db3@_wS3h*PshCFCUj<{&=aZefF-MpU*s)(6Xn
zu@#r_?YlD+F?`}t--V!S<(AgqJzl%WeaX0g)j4>K%aT|N7>NJSQ^hsM5(8_u``~Dc
z`{0GHc$)B+ov-);d(Zck?CF=1JOKBG?uT1U_vcx<SB0RHqS#LMi|zU_nuFioko|XQ
zd&&M975L^3Ydp_vp7H<t?72U`EY0y(TRhNDk_zqZDP|!{cl0c?kxycp)N1uFf49Yd
E0K}ca+yDRo
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-002.js
@@ -0,0 +1,51 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:
+   ECMA Section:
+   Description:        Call Objects
+
+
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+*/
+var SECTION = "";
+var VERSION = "ECMA_2";
+var TITLE   = "The Call Constructor";
+
+startTest();
+writeHeaderToLog( SECTION + " "+ TITLE);
+
+var b = new Boolean();
+
+new TestCase( SECTION,
+	      "var b = new Boolean(); b instanceof Boolean",
+	      true,
+	      b instanceof Boolean );
+
+new TestCase( SECTION,
+	      "b instanceof Object",
+	      true,
+	      b instanceof Object );
+
+new TestCase( SECTION,
+	      "b instanceof Array",
+	      false,
+	      b instanceof Array );
+
+new TestCase( SECTION,
+	      "true instanceof Boolean",
+	      false,
+	      true instanceof Boolean );
+
+new TestCase( SECTION,
+	      "Boolean instanceof Object",
+	      true,
+	      Boolean instanceof Object );
+test();
+
new file mode 100644
index 0000000000000000000000000000000000000000..2ac9b2d0c018aca5646d4ce86aded8bc8e66c5b3
GIT binary patch
literal 6615
zc%0o>&2G~`5O!MrE4Uy55+LOWLePo|I5b2`(zL47rl?7Ktv2>HS-P>U-A&a9@iJU^
z1fGG{;0ZV)abb2H#~XW{zq%xCE=gv8X6Bo3e(Zwi`V<!nZH$~^-DboW*0N<;-1dBI
zIfP+bkTc9JE|9<-><VrbR@Lr;eze3nW&%4$h}G568*mB5=fp;o_BOFi5yMUmb>ONq
z#D)bn@<n&>uZ{So(px=4bfAn9E{gI}`6;Zbzk%=@2yRIs7mT>A;$8S%KHRPy?v<+t
zh1I?^T$Rpkd0s+(8|3wBrLnVLORU|5wZ=|kw`x3fR6VGhPUT=t)1#Xl^8>#7Sf+dV
z^oeENmqHzNK%1Z@#Q~g15YM%iVACma9n0wpJr;#b0|BBC8K+eI0cmcW3XdrbP0#=*
zE#eYkBt$vbu;Tz_$O*wrUF|}I<Hi_~4*}7y+$91tMC)ox_1tHebLnwTc|*I2n;*ae
zae=w6jlGlCYisLC1%vMZYm?q=QT{zYloL$N1ZA0f)yiJ!`0WCq`*%L*8Y)C4*ghO$
za2^V)GJgSpo)e8zihCwt%ewpF{rbC^(2W$-!%nF*;YhK`^9r;_%{Gaa?3fr^h_$-u
z{WgLs=2;qOz#%3Yn2V%$#-<Z@U01%<b!|x>ok_C35MJUv*M{$H>;_D=eAv*z5Q$(c
zXnIaB_@xY0t6WJ#qhpi`2a8X`_efF>uAXv=cotGOZ6uheRqI9`*SeJUw*`t!yC!FO
z(jrq7Jk~*UfD2dT0nP)SKnO8<a+=KgQNb_Em`RnRhs5-WW*Wv-JHF^ei8T)C8IuvX
zMp~}i9ZSiufK7b90ojYi1d+Z2a?!><^Te2N?>9e7HV<bzoP(Ai2p$7?qL3{PXi^!m
z_i(3)SsXxhkEa|DUF}`G9HwTMRxVXQM9;^ggEE!g(XqaS(EOL?vI6pw<H*)hLEM0s
zV&HdBz8oJHpdcdF({#uk;fw=Mk0-)nq}3L2mC}?~k)jJVedssVNx!7!ffX-a=0E1Y
zeBH>0k?Q}2r8fgofGk|z$Y(r-Jl0r}*JeK>V@GH#dmhEe9i`IT%w~<sy`fpv9G(pG
zCHwSGner}wmi{%LSvvlL;?kQ=`t;mjy$TX`J1TF=S2<$XQeL5`%dy#C>e;7id+^R`
z%!{h@VMkf_W62PTt6zS9<_zU`>eBQ`5~g1dhicOp7EP^4K2BrCOb@yXS*a$-q%7_m
zQ=mrVS4B%Ay^81$UKgk$W2U5RQ*`Bers(r)nW9<VI~nb->KrY*r<ncy%&_<$AP9Jv
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/instanceof-003.js
@@ -0,0 +1,65 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+   File Name:          instanceof-003.js
+   ECMA Section:
+   Description:        http://bugzilla.mozilla.org/show_bug.cgi?id=7635
+
+   js> function Foo() {}
+   js> theproto = {};
+   [object Object]
+   js> Foo.prototype = theproto
+   [object Object]
+   js> theproto instanceof Foo
+   true
+
+   I think this should be 'false'
+
+
+   Author:             christine@netscape.com
+   Date:               12 november 1997
+
+   Modified to conform to ECMA3
+   https://bugzilla.mozilla.org/show_bug.cgi?id=281606
+*/
+var SECTION = "instanceof-003";
+var VERSION = "ECMA_2";
+var TITLE   = "instanceof operator";
+var BUGNUMBER ="7635";
+
+startTest();
+
+function Foo() {};
+theproto = {};
+Foo.prototype = theproto;
+
+AddTestCase(
+  "function Foo() = {}; theproto = {}; Foo.prototype = theproto; " +
+  "theproto instanceof Foo",
+  false,
+  theproto instanceof Foo );
+
+
+var o = {};
+
+// https://bugzilla.mozilla.org/show_bug.cgi?id=281606
+try
+{
+  AddTestCase(
+    "o = {}; o instanceof o",
+    "error",
+    o instanceof o );
+}
+catch(e)
+{
+  AddTestCase(
+    "o = {}; o instanceof o",
+    "error",
+    "error" );
+}
+
+test();
new file mode 100644
index 0000000000000000000000000000000000000000..58c554d5972cbc0902d21fa4f9caeaad90a4dc0c
GIT binary patch
literal 5869
zc%1E6OK;Oa5OyffB97cRSRkSHLInsoG>w#`ZdIvGQIqysZR|<1u(7S(P1}I@GyD_&
z5eFo$%&z0a@gpxB5)i#Op52|tH{Z^TTa-PYL8;gQ;*{z(r@k~c48st%=Y!!;4z{FM
zAPgaigf6&J7{wjEyBIxM76P~g=YsIMK6)FKFu0*MVXVIoHX|II8tI~{E5gSGHt}U|
z_|_p}U)!~=2pbw>RLGK2s{V>Q`ZW-KMZsMq6p~Z7U3!4OE9Zx`^OK5oR@@m#!&MdB
zf#)UU_fTH9s*R)5T4L=Et~HJt$5!g83+t?&cB+7Dt&ue9ax4yf4zSFQ^5tX0c%+0;
z)Ddk;nhXLsiKL!u+`>&Csp}ZdK<M#N$|4|O7Dmo#6F*Q|m}bJ`+Cmd8;7NnJRHhQ5
z5^OkfkTSGIfos(+W;pIlD)J#9QI*G30w=7lw^%nm2O(6%1sx6RB{Xm10(FtOt_@x*
zseJeha89$CFT&qfhj4<Wxgf0WomD+4U%pxcbT<ntK{us3<bv%}TsVXFV4o>LNVDZ}
zv(jsSqKpyq*}J!|->d=dD`Is<ozDe(Re~2rcVwU*Hcf2_MuyWOuVSZ+_@>ZO%@e>N
zyxq%gy(6e%k!68~1(C}J(kU5TYX6Cc9yNZ@b8SVRD3esVp`tAMu8q$_a3RRQj~lvx
znFuC?rswp7U)oW<Dzr3oI!38*#&|!jN0D-<dd`93Nl4wS>0qX=9d+`u)?;k2Eija}
zYj&0=Jxa@h$Ge0LaS@t4$a%yQ2_YvBQL}kJDftzZGi7q}yqG=Q%)__^Zx@n>wq3P5
zcE`esH1qieUPq8Kr0zb-We0rj$tn3eZGKSn9KXJJ&PTpen1W!UGOZ72${4jzpxXo<
z2T<$rbl_pA{ok)|nb##!|8zoR--pRbnal3vTrVLtSV0KyM?6!JD-?C9Wzdoar|pi6
zJDN2UFDdf;6S)K||48S3i1M=IsJ>ezB87YUHvh!q8}V6c?(wCrK0OD;*+dk#w$0C9
zcFizN=AM4Vg%`uSfU<BovT?)|b7~VBcv<m02E?7@W_suR&*<sRFW<qvxS9{9_&-Kc
z;;g~-(l4Y+b2z~)I0^ry9|5zKqHnpBqUQng%oY|H7p~0^@vZG$ltt>x6h{0r)nx|u
V=b>+oqO#6ZRX0#B{;4`H{sqbwhsyu}
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/instanceof/regress-7635.js
@@ -0,0 +1,55 @@
+/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+
+/**
+ *  File Name:          regress-7635.js
+ *  Reference:          http://bugzilla.mozilla.org/show_bug.cgi?id=7635
+ *  Description:        instanceof tweaks
+ *  Author:            
+ */
+
+var SECTION = "instanceof";       // provide a document reference (ie, ECMA section)
+var VERSION = "ECMA_2"; // Version of JavaScript or ECMA
+var TITLE   = "Regression test for Bugzilla #7635";       // Provide ECMA section title or a description
+var BUGNUMBER = "7635";     // Provide URL to bugsplat or bugzilla report
+
+startTest();               // leave this alone
+
+/*
+ * Calls to AddTestCase here. AddTestCase is a function that is defined
+ * in shell.js and takes three arguments:
+ * - a string representation of what is being tested
+ * - the expected result
+ * - the actual result
+ *
+ * For example, a test might look like this:
+ *
+ * var zip = /[\d]{5}$/;
+ *
+ * AddTestCase(
+ * "zip = /[\d]{5}$/; \"PO Box 12345 Boston, MA 02134\".match(zip)",   // description of the test
+ *  "02134",                                                           // expected result
+ *  "PO Box 12345 Boston, MA 02134".match(zip) );                      // actual result
+ *
+ */
+
+function Foo() {}
+theproto = {};
+Foo.prototype = theproto
+  theproto instanceof Foo
+
+
+  AddTestCase( "function Foo() {}; theproto = {}; Foo.prototype = theproto; theproto instanceof Foo",
+	       false,
+	       theproto instanceof Foo );
+
+var f = new Function();
+
+AddTestCase( "var f = new Function(); f instanceof f", false, f instanceof f );
+
+
+test();       // leave this alone.  this executes the test cases and
+// displays results.
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..f47fdb2f5de56de01a3d82817acb3e89415d664e
GIT binary patch
literal 147
zc${sE!3lsc5Cj*rpEM9sf*%WzkQ{h$YRFxzUz7+w+~4l(cxy!{_?2P~bE;en0{~4&
oA!M$Uj89UiMWc;&Q+W5h{a0P4CW1RJbsY<<g%RlRssCd)E`XRT!2kdN
new file mode 100644
new file mode 100644
index 0000000000000000000000000000000000000000..2c8df74e57a51a3f9af031b897700fbfd50f10f7
GIT binary patch
literal 2251
zc%0pp+iJo<5Qf(t>C*_kP6f502x`How`EPHx^zv#?nLYxm(q(qLT5K>Vh$9FkhZx=
zGPCo~%(t72gGnr*<E(%O9nV)HMt05^(|!~K3xon6#RfFf$Pv~MqGnFpu6FXFU9CYO
z1aq!D8+t(^61KwUQoi1UFS&wX%-1Bf;p*7n^B9xE+luRZo7dfNc}OOO#*Ps+m(#Yd
zsS(Lw9F9gM!e!@%o_n*0@ody{Cr*23-FvUe>$&~u;Bj2?U6OA)m=4{_sJT1wj-v8K
z6e^?pj!u2ucO-gcjCqd4Pw<6=6c9%dh3t$Ly@)Vi!Oj?|Y!i0Hm^~w|S#dVSJ6T)b
zrHGWxu%HYS$wVlya*KQEf<ZusKs*ajRyw3TD;879cn>5mITQ$rOV2KGx3L1PO~)<U
zjZ8|)Da4}W;hxg1%5++;pUrVCpTbjcHRsUnkGfB{zku#rGjuDy{{M7lKboOh^EYmm
zY$opQ$C}LoS<<Sm`!vgPbs17-ya6z-mP!3^%rF(Yssl#DR^b#hmb<H*C&kwPO0T95
J{CS(l<}ZQF*7X1Y
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/tester/spidermonkey/ecma_2/template.js
@@ -0,0 +1,26 @@
+/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
+/*
+ * Any copyright is dedicated to the Public Domain.
+ * http://creativecommons.org/licenses/publicdomain/
+ * Contributor: 
+ */
+
+
+/**
+ *  File Name:          template.js
+ *  Reference:          ** replace with bugzilla URL or document reference **
+ *  Description:        ** replace with description of test **
+ *  Author:             ** replace with your e-mail address **
+ */
+
+var SECTION = "";          // if ECMA test, provide section number
+var VERSION = "ECMA_2";    // Version of JavaScript or ECMA
+var TITLE   = "";          // Provide ECMA section title or description
+var BUGNUMBER = "";        // Provide URL to bugsplat or bugzilla report
+
+startTest();               // leave this alone
+
+
+/* Calls to AddTestCase here */
+
+test();                    // leave this alone
deleted file mode 100644
index c9118cc73707008c915e4dfb7a429e9e9dae4cd4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/split-001.js
+++ /dev/null
@@ -1,112 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          String/split-001.js
- *  ECMA Section:       15.6.4.9
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-
-/*
- * Since regular expressions have been part of JavaScript since 1.2, there
- * are already tests for regular expressions in the js1_2/regexp folder.
- *
- * These new tests try to supplement the existing tests, and verify that
- * our implementation of RegExp conforms to the ECMA specification, but
- * does not try to be as exhaustive as in previous tests.
- *
- * The [,limit] argument to String.split is new, and not covered in any
- * existing tests.
- *
- * String.split cases are covered in ecma/String/15.5.4.8-*.js.
- * String.split where separator is a RegExp are in
- * js1_2/regexp/string_split.js
- *
- */
-
-var SECTION = "ecma_2/String/split-001.js";
-var VERSION = "ECMA_2";
-var TITLE   = "String.prototype.split( regexp, [,limit] )";
-
-startTest();
-
-// the separator is not supplied
-// separator is undefined
-// separator is an empty string
-
-AddSplitCases( "splitme", "", "''", ["s", "p", "l", "i", "t", "m", "e"] );
-AddSplitCases( "splitme", new RegExp(), "new RegExp()", ["s", "p", "l", "i", "t", "m", "e"] );
-
-// separartor is a regexp
-// separator regexp value global setting is set
-// string is an empty string
-// if separator is an empty string, split each by character
-
-// this is not a String object
-
-// limit is not a number
-// limit is undefined
-// limit is larger than 2^32-1
-// limit is a negative number
-
-test();
-
-function AddSplitCases( string, separator, str_sep, split_array ) {
-
-  // verify that the result of split is an object of type Array
-  AddTestCase(
-    "( " + string  + " ).split(" + str_sep +").constructor == Array",
-    true,
-    string.split(separator).constructor == Array );
-
-  // check the number of items in the array
-  AddTestCase(
-    "( " + string  + " ).split(" + str_sep +").length",
-    split_array.length,
-    string.split(separator).length );
-
-  // check the value of each array item
-  var limit = (split_array.length > string.split(separator).length )
-    ? split_array.length : string.split(separator).length;
-
-  for ( var matches = 0; matches < split_array.length; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).split(" + str_sep +")[" + matches +"]",
-      split_array[matches],
-      string.split( separator )[matches] );
-  }
-}
-
-function AddLimitedSplitCases(
-  string, separator, str_sep, limit, str_limit, split_array ) {
-
-  // verify that the result of split is an object of type Array
-
-  AddTestCase(
-    "( " + string  + " ).split(" + str_sep +", " + str_limit +
-    " ).constructor == Array",
-    true,
-    string.split(separator, limit).constructor == Array );
-
-  // check the length of the array
-
-  AddTestCase(
-    "( " + string + " ).split(" + str_sep  +", " + str_limit + " ).length",
-    length,
-    string.split(separator).length );
-
-  // check the value of each array item
-
-  for ( var matches = 0; matches < split_array.length; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).split(" + str_sep +", " + str_limit + " )[" + matches +"]",
-      split_array[matches],
-      string.split( separator )[matches] );
-  }
-}
deleted file mode 100644
index 918343cc2e0648f6ea57a586bd626b8ccc7b089f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/split-002.js
+++ /dev/null
@@ -1,270 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          String/split-002.js
- *  ECMA Section:       15.6.4.9
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-
-/*
- * Since regular expressions have been part of JavaScript since 1.2, there
- * are already tests for regular expressions in the js1_2/regexp folder.
- *
- * These new tests try to supplement the existing tests, and verify that
- * our implementation of RegExp conforms to the ECMA specification, but
- * does not try to be as exhaustive as in previous tests.
- *
- * The [,limit] argument to String.split is new, and not covered in any
- * existing tests.
- *
- * String.split cases are covered in ecma/String/15.5.4.8-*.js.
- * String.split where separator is a RegExp are in
- * js1_2/regexp/string_split.js
- *
- */
-
-var SECTION = "ecma_2/String/split-002.js";
-var VERSION = "ECMA_2";
-var TITLE   = "String.prototype.split( regexp, [,limit] )";
-
-startTest();
-
-// the separator is not supplied
-// separator is undefined
-// separator is an empty string
-
-//    AddSplitCases( "splitme", "", "''", ["s", "p", "l", "i", "t", "m", "e"] );
-//    AddSplitCases( "splitme", new RegExp(), "new RegExp()", ["s", "p", "l", "i", "t", "m", "e"] );
-
-// separator is an empty regexp
-// separator is not supplied
-
-CompareSplit( "hello", "ll" );
-
-CompareSplit( "hello", "l" );
-CompareSplit( "hello", "x" );
-CompareSplit( "hello", "h" );
-CompareSplit( "hello", "o" );
-CompareSplit( "hello", "hello" );
-CompareSplit( "hello", undefined );
-
-CompareSplit( "hello", "");
-CompareSplit( "hello", "hellothere" );
-
-CompareSplit( new String("hello" ) );
-
-
-Number.prototype.split = String.prototype.split;
-
-CompareSplit( new Number(100111122133144155), 1 );
-CompareSplitWithLimit(new Number(100111122133144155), 1, 1 );
-
-CompareSplitWithLimit(new Number(100111122133144155), 1, 2 );
-CompareSplitWithLimit(new Number(100111122133144155), 1, 0 );
-CompareSplitWithLimit(new Number(100111122133144155), 1, 100 );
-CompareSplitWithLimit(new Number(100111122133144155), 1, void 0 );
-CompareSplitWithLimit(new Number(100111122133144155), 1, Math.pow(2,32)-1 );
-CompareSplitWithLimit(new Number(100111122133144155), 1, "boo" );
-CompareSplitWithLimit(new Number(100111122133144155), 1, -(Math.pow(2,32)-1) );
-CompareSplitWithLimit( "hello", "l", NaN );
-CompareSplitWithLimit( "hello", "l", 0 );
-CompareSplitWithLimit( "hello", "l", 1 );
-CompareSplitWithLimit( "hello", "l", 2 );
-CompareSplitWithLimit( "hello", "l", 3 );
-CompareSplitWithLimit( "hello", "l", 4 );
-
-
-/*
-  CompareSplitWithLimit( "hello", "ll", 0 );
-  CompareSplitWithLimit( "hello", "ll", 1 );
-  CompareSplitWithLimit( "hello", "ll", 2 );
-  CompareSplit( "", " " );
-  CompareSplit( "" );
-*/
-
-// separartor is a regexp
-// separator regexp value global setting is set
-// string is an empty string
-// if separator is an empty string, split each by character
-
-// this is not a String object
-
-// limit is not a number
-// limit is undefined
-// limit is larger than 2^32-1
-// limit is a negative number
-
-test();
-
-function CompareSplit( string, separator ) {
-  split_1 = string.split( separator );
-  split_2 = string_split( string, separator );
-
-  AddTestCase(
-    "( " + string +".split(" + separator + ") ).length" ,
-    split_2.length,
-    split_1.length );
-
-  var limit = split_1.length > split_2.length ?
-    split_1.length : split_2.length;
-
-  for ( var split_item = 0; split_item < limit; split_item++ ) {
-    AddTestCase(
-      string + ".split(" + separator + ")["+split_item+"]",
-      split_2[split_item],
-      split_1[split_item] );
-  }
-}
-
-function CompareSplitWithLimit( string, separator, splitlimit ) {
-  split_1 = string.split( separator, splitlimit );
-  split_2 = string_split( string, separator, splitlimit );
-
-  AddTestCase(
-    "( " + string +".split(" + separator + ", " + splitlimit+") ).length" ,
-    split_2.length,
-    split_1.length );
-
-  var limit = split_1.length > split_2.length ?
-    split_1.length : split_2.length;
-
-  for ( var split_item = 0; split_item < limit; split_item++ ) {
-    AddTestCase(
-      string + ".split(" + separator  + ", " + splitlimit+")["+split_item+"]",
-      split_2[split_item],
-      split_1[split_item] );
-  }
-}
-
-function string_split ( __this, separator, limit ) {
-  var S = String(__this );					  // 1
-
-  var A = new Array();                          // 2
-
-  if ( limit == undefined ) {                   // 3
-    lim = Math.pow(2, 31 ) -1;
-  } else {
-    lim = ToUint32( limit );
-  }
-
-  var s = S.length;                              // 4
-  var p = 0;                                     // 5
-
-  if  ( separator == undefined ) {              // 8
-    A[0] = S;
-    return A;
-  }
-
-  if ( separator.constructor == RegExp )         // 6
-    R = separator;
-  else
-    R = separator.toString();
-
-  if (lim == 0) return A;                       // 7
-
-  if  ( separator == undefined ) {              // 8
-    A[0] = S;
-    return A;
-  }
-
-  if (s == 0) {		                          // 9
-    z = SplitMatch(R, S, 0);
-    if (z != false) return A;
-    A[0] = S;
-    return A;
-  }
-
-  var q = p;									  // 10
-loop:
-  while (true ) {
-	
-    if ( q == s ) break;					  // 11
-
-    z = SplitMatch(R, S, q);                  // 12
-
-//print("Returned ", z);
-
-    if (z != false) {							// 13
-      e = z.endIndex;							// 14
-      cap = z.captures;						// 14
-      if (e != p) {							// 15
-//print("S = ", S, ", p = ", p, ", q = ", q);
-	T = S.slice(p, q);					// 16
-//print("T = ", T);
-	A[A.length] = T;					// 17
-	if (A.length == lim) return A;		// 18
-	p = e;								// 19
-	i = 0;								// 20
-	while (true) {						// 25
-	  if (i == cap.length) {              // 21
-	    q = p;                          // 10
-	    continue loop;
-	  }
-	  i = i + 1;							// 22
-	  A[A.length] = cap[i]				// 23
-	    if (A.length == lim) return A;		// 24
-	}
-      }
-    }
-
-    q = q + 1;                               // 26
-  }
-
-  T = S.slice(p, q);
-  A[A.length] = T;
-  return A;
-}
-
-function SplitMatch(R, S, q)
-{
-  if (R.constructor == RegExp) {			// 1
-    var reResult = R.match(S, q);		// 8
-    if (reResult == undefined)
-      return false;
-    else {
-      a = new Array(reResult.length - 1);
-      for (var i = 1; i < reResult.length; i++)
-	a[a.length] = reResult[i];
-      return { endIndex : reResult.index + reResult[0].length, captures : cap };
-    }
-  }
-  else {
-    var r = R.length;					// 2
-    s = S.length;						// 3
-    if ((q + r) > s) return false;		// 4
-    for (var i = 0; i < r; i++) {
-//print("S.charAt(", q + i, ") = ", S.charAt(q + i), ", R.charAt(", i, ") = ", R.charAt(i));
-      if (S.charAt(q + i) != R.charAt(i))			// 5
-	return false;
-    }
-    cap = new Array();								// 6
-    return { endIndex : q + r, captures : cap };	// 7
-  }
-}
-
-function ToUint32( n ) {
-  n = Number( n );
-  var sign = ( n < 0 ) ? -1 : 1;
-
-  if ( Math.abs( n ) == 0
-       || Math.abs( n ) == Number.POSITIVE_INFINITY
-       || n != n) {
-    return 0;
-  }
-  n = sign * Math.floor( Math.abs(n) )
-
-    n = n % Math.pow(2,32);
-
-  if ( n < 0 ){
-    n += Math.pow(2,32);
-  }
-
-  return ( n );
-}
deleted file mode 100644
index ce86209d718ad3b09a210323f8be3f32d97964c7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/split-003.js
+++ /dev/null
@@ -1,123 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          String/split-003.js
- *  ECMA Section:       15.6.4.9
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-
-/*
- * Since regular expressions have been part of JavaScript since 1.2, there
- * are already tests for regular expressions in the js1_2/regexp folder.
- *
- * These new tests try to supplement the existing tests, and verify that
- * our implementation of RegExp conforms to the ECMA specification, but
- * does not try to be as exhaustive as in previous tests.
- *
- * The [,limit] argument to String.split is new, and not covered in any
- * existing tests.
- *
- * String.split cases are covered in ecma/String/15.5.4.8-*.js.
- * String.split where separator is a RegExp are in
- * js1_2/regexp/string_split.js
- *
- */
-
-var SECTION = "ecma_2/String/split-003.js";
-var VERSION = "ECMA_2";
-var TITLE   = "String.prototype.split( regexp, [,limit] )";
-
-startTest();
-
-// separator is a regexp
-// separator regexp value global setting is set
-// string is an empty string
-// if separator is an empty string, split each by character
-
-
-AddSplitCases( "hello", new RegExp, "new RegExp", ["h","e","l","l","o"] );
-
-AddSplitCases( "hello", /l/, "/l/", ["he","","o"] );
-AddLimitedSplitCases( "hello", /l/, "/l/", 0, [] );
-AddLimitedSplitCases( "hello", /l/, "/l/", 1, ["he"] );
-AddLimitedSplitCases( "hello", /l/, "/l/", 2, ["he",""] );
-AddLimitedSplitCases( "hello", /l/, "/l/", 3, ["he","","o"] );
-AddLimitedSplitCases( "hello", /l/, "/l/", 4, ["he","","o"] );
-AddLimitedSplitCases( "hello", /l/, "/l/", void 0, ["he","","o"] );
-AddLimitedSplitCases( "hello", /l/, "/l/", "hi", [] );
-AddLimitedSplitCases( "hello", /l/, "/l/", undefined, ["he","","o"] );
-
-AddSplitCases( "hello", new RegExp, "new RegExp", ["h","e","l","l","o"] );
-AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 0, [] );
-AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 1, ["h"] );
-AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 2, ["h","e"] );
-AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 3, ["h","e","l"] );
-AddLimitedSplitCases( "hello", new RegExp, "new RegExp", 4, ["h","e","l","l"] );
-AddLimitedSplitCases( "hello", new RegExp, "new RegExp", void 0,  ["h","e","l","l","o"] );
-AddLimitedSplitCases( "hello", new RegExp, "new RegExp", "hi",  [] );
-AddLimitedSplitCases( "hello", new RegExp, "new RegExp", undefined,  ["h","e","l","l","o"] );
-
-test();
-
-function AddSplitCases( string, separator, str_sep, split_array ) {
-  // verify that the result of split is an object of type Array
-  AddTestCase(
-    "( " + string  + " ).split(" + str_sep +").constructor == Array",
-    true,
-    string.split(separator).constructor == Array );
-
-  // check the number of items in the array
-  AddTestCase(
-    "( " + string  + " ).split(" + str_sep +").length",
-    split_array.length,
-    string.split(separator).length );
-
-  // check the value of each array item
-  var limit = (split_array.length > string.split(separator).length )
-    ? split_array.length : string.split(separator).length;
-
-  for ( var matches = 0; matches < split_array.length; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).split(" + str_sep +")[" + matches +"]",
-      split_array[matches],
-      string.split( separator )[matches] );
-  }
-}
-
-function AddLimitedSplitCases(
-  string, separator, str_sep, limit, split_array ) {
-
-  // verify that the result of split is an object of type Array
-
-  AddTestCase(
-    "( " + string  + " ).split(" + str_sep +", " + limit +
-    " ).constructor == Array",
-    true,
-    string.split(separator, limit).constructor == Array );
-
-  // check the length of the array
-
-  AddTestCase(
-    "( " + string + " ).split(" + str_sep  +", " + limit + " ).length",
-    split_array.length,
-    string.split(separator, limit).length );
-
-  // check the value of each array item
-
-  var slimit = (split_array.length > string.split(separator).length )
-    ? split_array.length : string.split(separator, limit).length;
-
-  for ( var matches = 0; matches < slimit; matches++ ) {
-    AddTestCase(
-      "( " + string + " ).split(" + str_sep +", " + limit + " )[" + matches +"]",
-      split_array[matches],
-      string.split( separator, limit )[matches] );
-  }
-}
deleted file mode 100644
index 6b06c09c12642fe477212351360c1f68c963ce9b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-001.js
+++ /dev/null
@@ -1,47 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          statement-001.js
-   Corresponds To:     12.6.2-9-n.js
-   ECMA Section:       12.6.2 The for Statement
-
-   1. first expression is not present.
-   2. second expression is not present
-   3. third expression is not present
-
-
-   Author:             christine@netscape.com
-   Date:               15 september 1997
-*/
-
-var SECTION = "statement-001.js";
-//     var SECTION = "12.6.2-9-n";
-var VERSION = "ECMA_1";
-var TITLE   = "The for statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("for (i) {\n}");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "for(i) {}" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index cfc1b8b7e7485104438a10e3b4c4581f894de9f0..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-002.js
+++ /dev/null
@@ -1,69 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          statement-002.js
-   Corresponds To:     12.6.3-1.js
-   ECMA Section:       12.6.3 The for...in Statement
-   Description:
-   The production IterationStatement : for ( LeftHandSideExpression in Expression )
-   Statement is evaluated as follows:
-
-   1.  Evaluate the Expression.
-   2.  Call GetValue(Result(1)).
-   3.  Call ToObject(Result(2)).
-   4.  Let C be "normal completion".
-   5.  Get the name of the next property of Result(3) that doesn't have the
-   DontEnum attribute. If there is no such property, go to step 14.
-   6.  Evaluate the LeftHandSideExpression ( it may be evaluated repeatedly).
-   7.  Call PutValue(Result(6), Result(5)).  PutValue( V, W ):
-   1.  If Type(V) is not Reference, generate a runtime error.
-   2.  Call GetBase(V).
-   3.  If Result(2) is null, go to step 6.
-   4.  Call the [[Put]] method of Result(2), passing GetPropertyName(V)
-   for the property name and W for the value.
-   5.  Return.
-   6.  Call the [[Put]] method for the global object, passing
-   GetPropertyName(V) for the property name and W for the value.
-   7.  Return.
-   8.  Evaluate Statement.
-   9.  If Result(8) is a value completion, change C to be "normal completion
-   after value V" where V is the value carried by Result(8).
-   10. If Result(8) is a break completion, go to step 14.
-   11. If Result(8) is a continue completion, go to step 5.
-   12. If Result(8) is a return completion, return Result(8).
-   13. Go to step 5.
-   14. Return C.
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "statement-002";
-var VERSION = "JS1_4";
-var TITLE   = "The for..in statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval(" for ( var i, p in this) { result += this[p]; }");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "more than one member expression" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
deleted file mode 100644
index c77fa4f7e1e8fb83aa578062499b3b9ca0b78c2f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-003.js
+++ /dev/null
@@ -1,80 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          statement-003
-   Corresponds To:     12.6.3-7-n.js
-   ECMA Section:       12.6.3 The for...in Statement
-   Description:
-   The production IterationStatement : for ( LeftHandSideExpression in Expression )
-   Statement is evaluated as follows:
-
-   1.  Evaluate the Expression.
-   2.  Call GetValue(Result(1)).
-   3.  Call ToObject(Result(2)).
-   4.  Let C be "normal completion".
-   5.  Get the name of the next property of Result(3) that doesn't have the
-   DontEnum attribute. If there is no such property, go to step 14.
-   6.  Evaluate the LeftHandSideExpression ( it may be evaluated repeatedly).
-   7.  Call PutValue(Result(6), Result(5)).  PutValue( V, W ):
-   1.  If Type(V) is not Reference, generate a runtime error.
-   2.  Call GetBase(V).
-   3.  If Result(2) is null, go to step 6.
-   4.  Call the [[Put]] method of Result(2), passing GetPropertyName(V)
-   for the property name and W for the value.
-   5.  Return.
-   6.  Call the [[Put]] method for the global object, passing
-   GetPropertyName(V) for the property name and W for the value.
-   7.  Return.
-   8.  Evaluate Statement.
-   9.  If Result(8) is a value completion, change C to be "normal completion
-   after value V" where V is the value carried by Result(8).
-   10. If Result(8) is a break completion, go to step 14.
-   11. If Result(8) is a continue completion, go to step 5.
-   12. If Result(8) is a return completion, return Result(8).
-   13. Go to step 5.
-   14. Return C.
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "statement-003";
-var VERSION = "JS1_4";
-var TITLE   = "The for..in statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var o = new MyObject();
-  var result = 0;
-
-  eval("for ( this in o) {\n"
-       + "result += this[p];\n"
-       + "}\n");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "bad left-hand side expression" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function MyObject() {
-  this.value = 2;
-  this[0] = 4;
-  return this;
-}
deleted file mode 100644
index f91dfd20bc69d53739f1e0288f1d85f223826a80..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-004.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          statement-004.js
-   Corresponds To:     12.6.3-1.js
-   ECMA Section:       12.6.3 The for...in Statement
-   Description:
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "statement-004";
-var VERSION = "JS1_4";
-var TITLE   = "The for..in statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var o = new MyObject();
-
-  eval("for ( \"a\" in o) {\n"
-       + "result += this[p];\n"
-       + "}");
-
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "bad left-hand side expression" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
-function MyObject() {
-  this.value = 2;
-  this[0] = 4;
-  return this;
-}
deleted file mode 100644
index 165dcc1a11393fe53dfd410555fd934845914403..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-005.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          statement-005.js
-   Corresponds To:     12.6.3-8-n.js
-   ECMA Section:       12.6.3 The for...in Statement
-   Description:
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "statement-005";
-var VERSION = "JS1_4";
-var TITLE   = "The for..in statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var o = new MyObject();
-  result = 0;
-
-  eval("for (1 in o) {\n"
-       + "result += this[p];"
-       + "}\n");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "bad left-hand side expression" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function MyObject() {
-  this.value = 2;
-  this[0] = 4;
-  return this;
-}
deleted file mode 100644
index f5bc9952a0ecc69d2b3b825803b27bc8c5a1bc2c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-006.js
+++ /dev/null
@@ -1,51 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          statement-006.js
-   Corresponds To:     12.6.3-9-n.js
-   ECMA Section:       12.6.3 The for...in Statement
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               11 september 1997
-*/
-var SECTION = "statement-006";
-var VERSION = "JS1_4";
-var TITLE   = "The for..in statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var o = new MyObject();
-  var result = 0;
-  for ( var o in foo) {
-    result += this[o];
-  }
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "object is not defined" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-function MyObject() {
-  this.value = 2;
-  this[0] = 4;
-  return this;
-}
deleted file mode 100644
index f873474cbea4987859fc239ea04e19ccbabbfd20..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-007.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          statement-007.js
-   Corresponds To:     12.7-1-n.js
-   ECMA Section:       12.7 The continue statement
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "statement-007";
-var VERSION = "JS1_4";
-var TITLE   = "The continue statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("continue;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "continue outside of an iteration statement" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index a2b521f4985583dcc6f6154f9f1af1b8652ce0e4..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-008.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          statement-008.js
-   Corresponds To:     12.8-1-n.js
-   ECMA Section:       12.8 The break statement
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "statement-008";
-var VERSION = "JS1_4";
-var TITLE   = "The break in statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("break;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "break outside of an iteration statement" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 1b521624dfe9c5996172b36505896108f4073533..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/statement-009.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          12.9-1-n.js
-   ECMA Section:       12.9 The return statement
-   Description:
-
-   Author:             christine@netscape.com
-   Date:               12 november 1997
-*/
-var SECTION = "12.9-1-n";
-var VERSION = "ECMA_1";
-var TITLE   = "The return statement";
-
-startTest();
-writeHeaderToLog( SECTION + " The return statement");
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  eval("return;");
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "return outside of a function" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 47330264d8ad85cd782ad6894bcec1085903520c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/string-001.js
+++ /dev/null
@@ -1,53 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          string-001.js
-   Corresponds To:     15.5.4.2-2-n.js
-   ECMA Section:       15.5.4.2 String.prototype.toString()
-
-   Description:        Returns this string value.  Note that, for a String
-   object, the toString() method happens to return the same
-   thing as the valueOf() method.
-
-   The toString function is not generic; it generates a
-   runtime error if its this value is not a String object.
-   Therefore it connot be transferred to the other kinds of
-   objects for use as a method.
-
-   Author:             christine@netscape.com
-   Date:               1 october 1997
-*/
-var SECTION = "string-001";
-var VERSION = "JS1_4";
-var TITLE   = "String.prototype.toString";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  OBJECT = new Object();
-  OBJECT.toString = String.prototype.toString();
-  result = OBJECT.toString();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "OBJECT = new Object; "+
-  " OBJECT.toString = String.prototype.toString; OBJECT.toString()" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
deleted file mode 100644
index 732b8e6cf1fb5bee1212637e8b8b5afca253d837..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/string-002.js
+++ /dev/null
@@ -1,52 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
-   File Name:          string-002.js
-   Corresponds To:     15.5.4.3-3-n.js
-   ECMA Section:       15.5.4.3 String.prototype.valueOf()
-
-   Description:        Returns this string value.
-
-   The valueOf function is not generic; it generates a
-   runtime error if its this value is not a String object.
-   Therefore it connot be transferred to the other kinds of
-   objects for use as a method.
-
-   Author:             christine@netscape.com
-   Date:               1 october 1997
-*/
-var SECTION = "string-002";
-var VERSION = "JS1_4";
-var TITLE   = "String.prototype.valueOf";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var result = "Failed";
-var exception = "No exception thrown";
-var expect = "Passed";
-
-try {
-  var OBJECT =new Object();
-  OBJECT.valueOf = String.prototype.valueOf;
-  result = OBJECT.valueOf();
-} catch ( e ) {
-  result = expect;
-  exception = e.toString();
-}
-
-new TestCase(
-  SECTION,
-  "OBJECT = new Object; OBJECT.valueOf = String.prototype.valueOf;"+
-  "result = OBJECT.valueOf();" +
-  " (threw " + exception +")",
-  expect,
-  result );
-
-test();
-
-
deleted file mode 100644
index 8fb0718c119783214fd073991c0e492be268cf0e..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/switch-001.js
+++ /dev/null
@@ -1,65 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          switch-001.js
- *  ECMA Section:
- *  Description:        The switch Statement
- *
- *  A simple switch test with no abrupt completions.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- *
- */
-var SECTION = "switch-001";
-var VERSION = "ECMA_2";
-var TITLE   = "The switch statement";
-
-var BUGNUMBER="315767";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-SwitchTest( 0, 126 );
-SwitchTest( 1, 124 );
-SwitchTest( 2, 120 );
-SwitchTest( 3, 112 );
-SwitchTest( 4, 64 );
-SwitchTest( 5, 96 );
-SwitchTest( true, 96 );
-SwitchTest( false, 96 );
-SwitchTest( null, 96 );
-SwitchTest( void 0, 96 );
-SwitchTest( "0", 96 );
-
-test();
-
-function SwitchTest( input, expect ) {
-  var result = 0;
-
-  switch ( input ) {
-  case 0:
-    result += 2;
-  case 1:
-    result += 4;
-  case 2:
-    result += 8;
-  case 3:
-    result += 16;
-  default:
-    result += 32;
-  case 4:
-    result +=64;
-  }
-
-  new TestCase(
-    SECTION,
-    "switch with no breaks, case expressions are numbers.  input is "+
-    input,
-    expect,
-    result );
-}
deleted file mode 100644
index 1906560b1d9b725689ae1af03e40752e1ea40d5f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/switch-002.js
+++ /dev/null
@@ -1,63 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          switch-002.js
- *  ECMA Section:
- *  Description:        The switch Statement
- *
- *  A simple switch test with no abrupt completions.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- *
- */
-var SECTION = "switch-002";
-var VERSION = "ECMA_2";
-var TITLE   = "The switch statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-SwitchTest( 0, 6 );
-SwitchTest( 1, 4 );
-SwitchTest( 2, 56 );
-SwitchTest( 3, 48 );
-SwitchTest( 4, 64 );
-SwitchTest( true, 32 );
-SwitchTest( false, 32 );
-SwitchTest( null, 32 );
-SwitchTest( void 0, 32 );
-SwitchTest( "0", 32 );
-
-test();
-
-function SwitchTest( input, expect ) {
-  var result = 0;
-
-  switch ( input ) {
-  case 0:
-    result += 2;
-  case 1:
-    result += 4;
-    break;
-  case 2:
-    result += 8;
-  case 3:
-    result += 16;
-  default:
-    result += 32;
-    break;
-  case 4:
-    result += 64;
-  }
-
-  new TestCase(
-    SECTION,
-    "switch with no breaks:  input is " + input,
-    expect,
-    result );
-}
deleted file mode 100644
index 21fd56d2cc4ac2a0e62963189770566c5049302c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/switch-003.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          switch-003.js
- *  ECMA Section:
- *  Description:        The switch Statement
- *
- *  Attempt to verify that case statements are evaluated in source order
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- *
- */
-var SECTION = "switch-003";
-var VERSION = "ECMA_2";
-var TITLE   = "The switch statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-SwitchTest( "a", "abc" );
-SwitchTest( "b", "bc" );
-SwitchTest( "c", "c" );
-SwitchTest( "d", "*abc" );
-SwitchTest( "v", "*abc" );
-SwitchTest( "w", "w*abc" );
-SwitchTest( "x", "xw*abc" );
-SwitchTest( "y", "yxw*abc" );
-SwitchTest( "z", "zyxw*abc" );
-//    SwitchTest( new java.lang.String("z"), "*abc" );
-
-test();
-
-function SwitchTest( input, expect ) {
-  var result = "";
-
-  switch ( input ) {
-  case "z": result += "z";
-  case "y": result += "y";
-  case "x": result += "x";
-  case "w": result += "w";
-  default: result += "*";
-  case "a": result += "a";
-  case "b": result += "b";
-  case "c": result += "c";
-  }
-
-  new TestCase(
-    SECTION,
-    "switch with no breaks:  input is " + input,
-    expect,
-    result );
-}
deleted file mode 100644
index cc3af70a45719503ae28e8d9e19ba254dc8a589b..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/switch-004.js
+++ /dev/null
@@ -1,94 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          switch-003.js
- *  ECMA Section:
- *  Description:        The switch Statement
- *
- *  This uses variables and objects as case expressions in switch statements.
- * This verifies a bunch of bugs:
- *
- * http://scopus.mcom.com/bugsplat/show_bug.cgi?id=315988
- * http://scopus.mcom.com/bugsplat/show_bug.cgi?id=315975
- * http://scopus.mcom.com/bugsplat/show_bug.cgi?id=315954
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- *
- */
-var SECTION = "switch-003";
-var VERSION = "ECMA_2";
-var TITLE   = "The switch statement";
-var BUGNUMBER= "315988";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-ONE = new Number(1);
-ZERO = new Number(0);
-var A = new String("A");
-var B = new String("B");
-TRUE = new Boolean( true );
-FALSE = new Boolean( false );
-UNDEFINED  = void 0;
-NULL = null;
-
-SwitchTest( ZERO, "ZERO" );
-SwitchTest( NULL, "NULL" );
-SwitchTest( UNDEFINED, "UNDEFINED" );
-SwitchTest( FALSE, "FALSE" );
-SwitchTest( false,  "false" );
-SwitchTest( 0,      "0" );
-
-SwitchTest ( TRUE, "TRUE" );
-SwitchTest( 1,     "1" );
-SwitchTest( ONE,   "ONE" );
-SwitchTest( true,  "true" );
-
-SwitchTest( "a",   "a" );
-SwitchTest( A,     "A" );
-SwitchTest( "b",   "b" );
-SwitchTest( B,     "B" );
-
-SwitchTest( new Boolean( true ), "default" );
-SwitchTest( new Boolean(false ), "default" );
-SwitchTest( new String( "A" ),   "default" );
-SwitchTest( new Number( 0 ),     "default" );
-
-test();
-
-function SwitchTest( input, expect ) {
-  var result = "";
-
-  switch ( input ) {
-  default:   result += "default"; break;
-  case "a":  result += "a";       break;
-  case "b":  result += "b";       break;
-  case A:    result += "A";       break;
-  case B:    result += "B";       break;
-  case new Boolean(true): result += "new TRUE";   break;
-  case new Boolean(false): result += "new FALSE"; break;
-  case NULL: result += "NULL";    break;
-  case UNDEFINED: result += "UNDEFINED"; break;
-  case true: result += "true";    break;
-  case false: result += "false";  break;
-  case TRUE:  result += "TRUE";   break;
-  case FALSE: result += "FALSE";  break;
-  case 0:    result += "0";       break;
-  case 1:    result += "1";       break;
-  case new Number(0) : result += "new ZERO";  break;
-  case new Number(1) : result += "new ONE";   break;
-  case ONE:  result += "ONE";     break;
-  case ZERO: result += "ZERO";    break;
-  }
-
-  new TestCase(
-    SECTION,
-    "switch with no breaks:  input is " + input,
-    expect,
-    result );
-}
deleted file mode 100644
index 6f46fa05719732865f6495f810f59397a41fafc9..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-001.js
+++ /dev/null
@@ -1,83 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-001.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This test contains try, catch, and finally blocks.  An exception is
- *  sometimes thrown by a function called from within the try block.
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var INVALID_JAVA_INTEGER_VALUE = "Invalid value for java.lang.Integer constructor";
-
-TryNewJavaInteger( "3.14159", INVALID_JAVA_INTEGER_VALUE );
-TryNewJavaInteger( NaN, INVALID_JAVA_INTEGER_VALUE );
-TryNewJavaInteger( 0,  0 );
-TryNewJavaInteger( -1, -1 );
-TryNewJavaInteger( 1,  1 );
-TryNewJavaInteger( Infinity, Infinity );
-
-test();
-
-/**
- *  Check to see if the input is valid for java.lang.Integer. If it is
- *  not valid, throw INVALID_JAVA_INTEGER_VALUE.  If input is valid,
- *  return Number( v )
- *
- */
-
-function newJavaInteger( v ) {
-  value = Number( v );
-  if ( Math.floor(value) != value || isNaN(value) ) {
-    throw ( INVALID_JAVA_INTEGER_VALUE );
-  } else {
-    return value;
-  }
-}
-
-/**
- *  Call newJavaInteger( value ) from within a try block.  Catch any
- *  exception, and store it in result.  Verify that we got the right
- *  return value from newJavaInteger in cases in which we do not expect
- *  exceptions, and that we got the exception in cases where an exception
- *  was expected.
- */
-function TryNewJavaInteger( value, expect ) {
-  var finalTest = false;
-
-  try {
-    result = newJavaInteger( value );
-  } catch ( e ) {
-    result = String( e );
-  } finally {
-    finalTest = true;
-  }
-  new TestCase(
-    SECTION,
-    "newJavaValue( " + value +" )",
-    expect,
-    result);
-
-  new TestCase(
-    SECTION,
-    "newJavaValue( " + value +" ) hit finally block",
-    true,
-    finalTest);
-
-}
-
deleted file mode 100644
index 22050d00b2cc12240d8c5621574e581a94c67185..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-003.js
+++ /dev/null
@@ -1,82 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-003.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This test has a try with no catch, and a finally.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-003";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement";
-var BUGNUMBER="http://scopus.mcom.com/bugsplat/show_bug.cgi?id=313585";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-// Tests start here.
-
-TrySomething( "x = \"hi\"", false );
-TrySomething( "throw \"boo\"", true );
-TrySomething( "throw 3", true );
-
-test();
-
-/**
- *  This function contains a try block with no catch block,
- *  but it does have a finally block.  Try to evaluate expressions
- *  that do and do not throw exceptions.
- */
-
-function TrySomething( expression, throwing ) {
-  innerFinally = "FAIL: DID NOT HIT INNER FINALLY BLOCK";
-  if (throwing) {
-    outerCatch = "FAILED: NO EXCEPTION CAUGHT";
-  } else {
-    outerCatch = "PASS";
-  }
-  outerFinally = "FAIL: DID NOT HIT OUTER FINALLY BLOCK";
-
-  try {
-    try {
-      eval( expression );
-    } finally {
-      innerFinally = "PASS";
-    }
-  } catch ( e  ) {
-    if (throwing) {
-      outerCatch = "PASS";
-    } else {
-      outerCatch = "FAIL: HIT OUTER CATCH BLOCK";
-    }
-  } finally {
-    outerFinally = "PASS";
-  }
-
-
-  new TestCase(
-    SECTION,
-    "eval( " + expression +" )",
-    "PASS",
-    innerFinally );
-  new TestCase(
-    SECTION,
-    "eval( " + expression +" )",
-    "PASS",
-    outerCatch );
-  new TestCase(
-    SECTION,
-    "eval( " + expression +" )",
-    "PASS",
-    outerFinally );
-
-
-}
deleted file mode 100644
index aad744afd13e0a8bcfbad0dc7540f88c43dc60af..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-004.js
+++ /dev/null
@@ -1,54 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-004.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This test has a try with one catch block but no finally.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-004";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-TryToCatch( "Math.PI", Math.PI );
-TryToCatch( "Thrower(5)",   "Caught 5" );
-TryToCatch( "Thrower(\"some random exception\")", "Caught some random exception" );
-
-test();
-
-function Thrower( v ) {
-  throw "Caught " + v;
-}
-
-/**
- *  Evaluate a string.  Catch any exceptions thrown.  If no exception is
- *  expected, verify the result of the evaluation.  If an exception is
- *  expected, verify that we got the right exception.
- */
-
-function TryToCatch( value, expect ) {
-  try {
-    result = eval( value );
-  } catch ( e ) {
-    result = e;
-  }
-
-  new TestCase(
-    SECTION,
-    "eval( " + value +" )",
-    expect,
-    result );
-}
-
-
deleted file mode 100644
index e1320df37a93baf488a0f25bdb68dc66499e5de3..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-005.js
+++ /dev/null
@@ -1,57 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-005.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This test has a try with one catch block but no finally.  Same
- *  as try-004, but the eval statement is called from a function, not
- *  directly from within the try block.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-005";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-TryToCatch( "Math.PI", Math.PI );
-TryToCatch( "Thrower(5)",   "Caught 5" );
-TryToCatch( "Thrower(\"some random exception\")", "Caught some random exception" );
-
-test();
-
-function Thrower( v ) {
-  throw "Caught " + v;
-}
-function Eval( v ) {
-  return eval( v );
-}
-
-/**
- *  Evaluate a string.  Catch any exceptions thrown.  If no exception is
- *  expected, verify the result of the evaluation.  If an exception is
- *  expected, verify that we got the right exception.
- */
-
-function TryToCatch( value, expect ) {
-  try {
-    result = Eval( value );
-  } catch ( e ) {
-    result = e;
-  }
-
-  new TestCase(
-    SECTION,
-    "eval( " + value +" )",
-    expect,
-    result );
-}
deleted file mode 100644
index 237641e6393ba1f5ef525bd576e91490e294d554..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-006.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-006.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  Throw an exception from within a With block in a try block.  Verify
- *  that any expected exceptions are caught.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-006";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-/**
- *  This is the "check" function for test objects that will
- *  throw an exception.
- */
-function throwException() {
-  throw EXCEPTION_STRING +": " + this.valueOf();
-}
-var EXCEPTION_STRING = "Exception thrown:";
-
-/**
- *  This is the "check" function for test objects that do not
- *  throw an exception
- */
-function noException() {
-  return this.valueOf();
-}
-
-/**
- *  Add test cases here
- */
-TryWith( new TryObject( "hello", throwException, true ));
-TryWith( new TryObject( "hola",  noException, false ));
-
-/**
- *  Run the test.
- */
-
-test();
-
-/**
- *  This is the object that will be the "this" in a with block.
- */
-function TryObject( value, fun, exception ) {
-  this.value = value;
-  this.exception = exception;
-
-  this.valueOf = new Function ( "return this.value" );
-  this.check = fun;
-}
-
-/**
- *  This function has the try block that has a with block within it.
- *  Test cases are added in this function.  Within the with block, the
- *  object's "check" function is called.  If the test object's exception
- *  property is true, we expect the result to be the exception value.
- *  If exception is false, then we expect the result to be the value of
- *  the object.
- */
-function TryWith( object ) {
-  try {
-    with ( object ) {
-      result = check();
-    }
-  } catch ( e ) {
-    result = e;
-  }
-
-  new TestCase(
-    SECTION,
-    "TryWith( " + object.value +" )",
-    (object.exception ? EXCEPTION_STRING +": " + object.valueOf() : object.valueOf()),
-    result );
-}
deleted file mode 100644
index 1a7d5b74195dc3106bc2097b90c53930f6888e8c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-007.js
+++ /dev/null
@@ -1,92 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-007.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This test has a for-in statement within a try block.
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-007";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement:  for-in";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-/**
- *  This is the "check" function for test objects that will
- *  throw an exception.
- */
-function throwException() {
-  throw EXCEPTION_STRING +": " + this.valueOf();
-}
-var EXCEPTION_STRING = "Exception thrown:";
-
-/**
- *  This is the "check" function for test objects that do not
- *  throw an exception
- */
-function noException() {
-  return this.valueOf();
-}
-
-/**
- *  Add test cases here
- */
-TryForIn( new TryObject( "hello", throwException, true ));
-TryForIn( new TryObject( "hola",  noException, false ));
-
-/**
- *  Run the test.
- */
-
-test();
-
-/**
- *  This is the object that will be the "this" in a with block.
- *  The check function is either throwException() or noException().
- *  See above.
- *
- */
-function TryObject( value, fun, exception ) {
-  this.value = value;
-  this.exception = exception;
-
-  this.check = fun;
-  this.valueOf = function () { return this.value; }
-}
-
-/**
- *  This function has a for-in statement within a try block.  Test cases
- *  are added after the try-catch-finally statement.  Within the for-in
- *  block, call a function that can throw an exception.  Verify that any
- *  exceptions are properly caught.
- */
-
-function TryForIn( object ) {
-  try {
-    for ( p in object ) {
-      if ( typeof object[p] == "function" ) {
-	result = object[p]();
-      }
-    }
-  } catch ( e ) {
-    result = e;
-  }
-
-  new TestCase(
-    SECTION,
-    "TryForIn( " + object+ " )",
-    (object.exception ? EXCEPTION_STRING +": " + object.value : object.value),
-    result );
-
-}
deleted file mode 100644
index 0c3174f12fef9a2fc9ae0c9f8c4f00fed8bb614f..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-008.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-008.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This test has a try block in a constructor.
- *
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-008";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement: try in a constructor";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-function Integer( value, exception ) {
-  try {
-    this.value = checkValue( value );
-  } catch ( e ) {
-    this.value = e.toString();
-  }
-
-  new TestCase(
-    SECTION,
-    "Integer( " + value +" )",
-    (exception ? INVALID_INTEGER_VALUE +": " + value : this.value),
-    this.value );
-}
-
-var INVALID_INTEGER_VALUE = "Invalid value for java.lang.Integer constructor";
-
-function checkValue( value ) {
-  if ( Math.floor(value) != value || isNaN(value) ) {
-    throw ( INVALID_INTEGER_VALUE +": " + value );
-  } else {
-    return value;
-  }
-}
-
-// add test cases
-
-new Integer( 3, false );
-new Integer( NaN, true );
-new Integer( 0, false );
-new Integer( Infinity, false );
-new Integer( -2.12, true );
-new Integer( Math.LN2, true );
-
-
-test();
deleted file mode 100644
index de1e54faa0038e1717d16bff228cc06b1781a049..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-009.js
+++ /dev/null
@@ -1,66 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-009.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This test has a try block within a while block.  Verify that an exception
- *  breaks out of the while.  I don't really know why this is an interesting
- *  test case but Mike Shaver had two of these so what the hey.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-009";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement: try in a while block";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var EXCEPTION_STRING = "Exception thrown: ";
-var NO_EXCEPTION_STRING = "No exception thrown: ";
-
-
-TryInWhile( new TryObject( "hello", ThrowException, true ) );
-TryInWhile( new TryObject( "aloha", NoException, false ));
-
-test();
-
-function TryObject( value, throwFunction, result ) {
-  this.value = value;
-  this.thrower = throwFunction;
-  this.result = result;
-}
-function ThrowException() {
-  throw EXCEPTION_STRING + this.value;
-}
-function NoException() {
-  return NO_EXCEPTION_STRING + this.value;
-}
-function TryInWhile( object ) {
-  result = null;
-  while ( true ) {
-    try {
-      object.thrower();
-      result = NO_EXCEPTION_STRING + object.value;
-      break;
-    } catch ( e ) {
-      result = e;
-      break;
-    }
-  }
-
-  new TestCase(
-    SECTION,
-    "( "+ object  +".thrower() )",
-    (object.result
-     ? EXCEPTION_STRING + object.value :
-     NO_EXCEPTION_STRING + object.value),
-    result );
-}
deleted file mode 100644
index 182f449ab696c139a86b558f5be543e3d99f328a..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-010.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-010.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This has a try block nested in the try block.  Verify that the
- *  exception is caught by the right try block, and all finally blocks
- *  are executed.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-010";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement: try in a tryblock";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-var EXCEPTION_STRING = "Exception thrown: ";
-var NO_EXCEPTION_STRING = "No exception thrown:  ";
-
-
-NestedTry( new TryObject( "No Exceptions Thrown",  NoException, NoException, 43 ) );
-NestedTry( new TryObject( "Throw Exception in Outer Try", ThrowException, NoException, 48 ));
-NestedTry( new TryObject( "Throw Exception in Inner Try", NoException, ThrowException, 45 ));
-NestedTry( new TryObject( "Throw Exception in Both Trys", ThrowException, ThrowException, 48 ));
-
-test();
-
-function TryObject( description, tryOne, tryTwo, result ) {
-  this.description = description;
-  this.tryOne = tryOne;
-  this.tryTwo = tryTwo;
-  this.result = result;
-}
-function ThrowException() {
-  throw EXCEPTION_STRING + this.value;
-}
-function NoException() {
-  return NO_EXCEPTION_STRING + this.value;
-}
-function NestedTry( object ) {
-  result = 0;
-  try {
-    object.tryOne();
-    result += 1;
-    try {
-      object.tryTwo();
-      result += 2;
-    } catch ( e ) {
-      result +=4;
-    } finally {
-      result += 8;
-    }
-  } catch ( e ) {
-    result += 16;
-  } finally {
-    result += 32;
-  }
-
-  new TestCase(
-    SECTION,
-    object.description,
-    object.result,
-    result );
-}
deleted file mode 100644
index 7974cc3db15e2a835305ff4ec9d52af0da448127..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/try-012.js
+++ /dev/null
@@ -1,95 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          try-012.js
- *  ECMA Section:
- *  Description:        The try statement
- *
- *  This test has a try with no catch, and a finally.  This is like try-003,
- *  but throws from a finally block, not the try block.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "try-012";
-var VERSION = "ECMA_2";
-var TITLE   = "The try statement";
-var BUGNUMBER="336872";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-// Tests start here.
-
-TrySomething( "x = \"hi\"", true );
-TrySomething( "throw \"boo\"", true );
-TrySomething( "throw 3", true );
-
-test();
-
-/**
- *  This function contains a try block with no catch block,
- *  but it does have a finally block.  Try to evaluate expressions
- *  that do and do not throw exceptions.
- *
- * The productioni TryStatement Block Finally is evaluated as follows:
- * 1. Evaluate Block
- * 2. Evaluate Finally
- * 3. If Result(2).type is normal return result 1 (in the test case, result 1 has
- *    the completion type throw)
- * 4. return result 2 (does not get hit in this case)
- *
- */
-
-function TrySomething( expression, throwing ) {
-  innerFinally = "FAIL: DID NOT HIT INNER FINALLY BLOCK";
-  if (throwing) {
-    outerCatch = "FAILED: NO EXCEPTION CAUGHT";
-  } else {
-    outerCatch = "PASS";
-  }
-  outerFinally = "FAIL: DID NOT HIT OUTER FINALLY BLOCK";
-
-
-  // If the inner finally does not throw an exception, the result
-  // of the try block should be returned.  (Type of inner return
-  // value should be throw if finally executes correctly
-
-  try {
-    try {
-      throw 0;
-    } finally {
-      innerFinally = "PASS";
-      eval( expression );
-    }
-  } catch ( e  ) {
-    if (throwing) {
-      outerCatch = "PASS";
-    } else {
-      outerCatch = "FAIL: HIT OUTER CATCH BLOCK";
-    }
-  } finally {
-    outerFinally = "PASS";
-  }
-
-
-  new TestCase(
-    SECTION,
-    "eval( " + expression +" ): evaluated inner finally block",
-    "PASS",
-    innerFinally );
-  new TestCase(
-    SECTION,
-    "eval( " + expression +" ): evaluated outer catch block ",
-    "PASS",
-    outerCatch );
-  new TestCase(
-    SECTION,
-    "eval( " + expression +" ):  evaluated outer finally block",
-    "PASS",
-    outerFinally );
-}
deleted file mode 100644
index 537e8e34c2bb7819af0fbd313189daee41993b1d..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/unicode-001.js
+++ /dev/null
@@ -1,59 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          RegExp/unicode-001.js
- *  ECMA Section:       15.7.3.1
- *  Description:        Based on ECMA 2 Draft 7 February 1999
- *  Positive test cases for constructing a RegExp object
- *  Author:             christine@netscape.com
- *  Date:               19 February 1999
- */
-var SECTION = "RegExp/unicode-001.js";
-var VERSION = "ECMA_2";
-var TITLE   = "new RegExp( pattern, flags )";
-
-startTest();
-
-// These examples come from 15.7.1, UnicodeEscapeSequence
-
-AddRegExpCases( /\u0041/, "/\\u0041/",   "A", "A", 1, 0, ["A"] );
-AddRegExpCases( /\u00412/, "/\\u00412/", "A2", "A2", 1, 0, ["A2"] );
-AddRegExpCases( /\u00412/, "/\\u00412/", "A2", "A2", 1, 0, ["A2"] );
-AddRegExpCases( /\u001g/, "/\\u001g/", "u001g", "u001g", 1, 0, ["u001g"] );
-
-AddRegExpCases( /A/,  "/A/",  "\u0041", "\\u0041",   1, 0, ["A"] );
-AddRegExpCases( /A/,  "/A/",  "\u00412", "\\u00412", 1, 0, ["A"] );
-AddRegExpCases( /A2/, "/A2/", "\u00412", "\\u00412", 1, 0, ["A2"]);
-AddRegExpCases( /A/,  "/A/",  "A2",      "A2",       1, 0, ["A"] );
-
-test();
-
-function AddRegExpCases(
-  regexp, str_regexp, pattern, str_pattern, length, index, matches_array ) {
-
-  AddTestCase(
-    str_regexp + " .exec(" + str_pattern +").length",
-    length,
-    regexp.exec(pattern).length );
-
-  AddTestCase(
-    str_regexp + " .exec(" + str_pattern +").index",
-    index,
-    regexp.exec(pattern).index );
-
-  AddTestCase(
-    str_regexp + " .exec(" + str_pattern +").input",
-    pattern,
-    regexp.exec(pattern).input );
-
-  for ( var matches = 0; matches < matches_array.length; matches++ ) {
-    AddTestCase(
-      str_regexp + " .exec(" + str_pattern +")[" + matches +"]",
-      matches_array[matches],
-      regexp.exec(pattern)[matches] );
-  }
-}
deleted file mode 100644
index 8ca95ad2805f27e8aa7e69554aadb6a20c8bc72c..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/while-001.js
+++ /dev/null
@@ -1,42 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          while-001
- *  ECMA Section:
- *  Description:        while statement
- *
- *  Verify that the while statement is not executed if the while expression is
- *  false
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "while-001";
-var VERSION = "ECMA_2";
-var TITLE   = "while statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DoWhile();
-test();
-
-function DoWhile() {
-  result = "pass";
-
-  while (false) {
-    result = "fail";
-    break;
-  }
-
-  new TestCase(
-    SECTION,
-    "while statement: don't evaluate statement is expression is false",
-    "pass",
-    result );
-
-}
deleted file mode 100644
index 19ca8c9db45f7ed60477891c24c917320f46ff12..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/while-002.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          while-002
- *  ECMA Section:
- *  Description:        while statement
- *
- *  Verify that the while statement is not executed if the while expression is
- *  false
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "while-002";
-var VERSION = "ECMA_2";
-var TITLE   = "while statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DoWhile( new DoWhileObject(
-	   "while expression is null",
-	   null,
-	   "result = \"fail: should not have evaluated statements in while block;break"
-	   ) );
-
-DoWhile( new DoWhileObject(
-	   "while expression is undefined",
-	   void 0,
-	   "result = \"fail: should not have evaluated statements in while block; break"
-	   ));
-
-DoWhile( new DoWhileObject(
-	   "while expression is 0",
-	   0,
-	   "result = \"fail: should not have evaluated statements in while block; break;"
-	   ));
-
-DoWhile( new DoWhileObject(
-	   "while expression is eval(\"\")",
-	   eval(""),
-	   "result = \"fail: should not have evaluated statements in while block; break"
-	   ));
-
-DoWhile( new DoWhileObject(
-	   "while expression is NaN",
-	   NaN,
-	   "result = \"fail: should not have evaluated statements in while block; break"
-	   ));
-
-test();
-
-function DoWhileObject( d, e, s ) {
-  this.description = d;
-  this.whileExpression = e;
-  this.statements = s;
-}
-
-function DoWhile( object ) {
-  result = "pass";
-
-  while ( expression = object.whileExpression ) {
-    eval( object.statements );
-  }
-
-  // verify that the while expression was evaluated
-
-  new TestCase(
-    SECTION,
-    "verify that while expression was evaluated (should be "+
-    object.whileExpression +")",
-    "pass",
-    (object.whileExpression == expression ||
-     ( isNaN(object.whileExpression) && isNaN(expression) )
-      ) ? "pass" : "fail" );
-
-  new TestCase(
-    SECTION,
-    object.description,
-    "pass",
-    result );
-}
deleted file mode 100644
index accc07368888cd6033498c6374bf77404c2883cd..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/while-003.js
+++ /dev/null
@@ -1,87 +0,0 @@
-/* -*- tab-width: 2; indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          while-003
- *  ECMA Section:
- *  Description:        while statement
- *
- *  The while expression evaluates to true, Statement returns abrupt completion.
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "while-003";
-var VERSION = "ECMA_2";
-var TITLE   = "while statement";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DoWhile( new DoWhileObject(
-	   "while expression is true",
-	   true,
-	   "result = \"pass\";" ));
-
-DoWhile( new DoWhileObject(
-	   "while expression is 1",
-	   1,
-	   "result = \"pass\";" ));
-
-DoWhile( new DoWhileObject(
-	   "while expression is new Boolean(false)",
-	   new Boolean(false),
-	   "result = \"pass\";" ));
-
-DoWhile( new DoWhileObject(
-	   "while expression is new Object()",
-	   new Object(),
-	   "result = \"pass\";" ));
-
-DoWhile( new DoWhileObject(
-	   "while expression is \"hi\"",
-	   "hi",
-	   "result = \"pass\";" ));
-/*
-  DoWhile( new DoWhileObject(
-  "while expression has a continue in it",
-  "true",
-  "if ( i == void 0 ) i = 0; result=\"pass\"; if ( ++i == 1 ) {continue;} else {break;} result=\"fail\";"
-  ));
-*/
-test();
-
-function DoWhileObject( d, e, s ) {
-  this.description = d;
-  this.whileExpression = e;
-  this.statements = s;
-}
-
-function DoWhile( object ) {
-  result = "fail:  statements in while block were not evaluated";
-
-  while ( expression = object.whileExpression ) {
-    eval( object.statements );
-    break;
-  }
-
-  // verify that the while expression was evaluated
-
-  new TestCase(
-    SECTION,
-    "verify that while expression was evaluated (should be "+
-    object.whileExpression +")",
-    "pass",
-    (object.whileExpression == expression ||
-     ( isNaN(object.whileExpression) && isNaN(expression) )
-      ) ? "pass" : "fail" );
-
-  new TestCase(
-    SECTION,
-    object.description,
-    "pass",
-    result );
-}
deleted file mode 100644
index 81253bbc76fee0f6129e5689f5db17f4eb5718b7..0000000000000000000000000000000000000000
GIT binary patch
literal 0
Hc$@<O00001
deleted file mode 100644
--- a/js/src/jsapi-tests/binast/parser/tester/while-004.js
+++ /dev/null
@@ -1,217 +0,0 @@
-/* -*- indent-tabs-mode: nil; js-indent-level: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-
-/**
- *  File Name:          while-004
- *  ECMA Section:
- *  Description:        while statement
- *
- *  Author:             christine@netscape.com
- *  Date:               11 August 1998
- */
-var SECTION = "while-004";
-var VERSION = "ECMA_2";
-var TITLE   = "while statement";
-var BUGNUMBER="316725";
-
-startTest();
-writeHeaderToLog( SECTION + " "+ TITLE);
-
-DoWhile_1();
-DoWhile_2();
-DoWhile_3();
-DoWhile_4();
-DoWhile_5();
-
-test();
-
-/**
- *  Break out of a while by calling return.
- *
- *  Tests:  12.6.2 step 6.
- */
-function dowhile() {
-  result = "pass";
-
-  while (true) {
-    return result;
-    result = "fail: hit code after return statement";
-    break;
-  }
-}
-
-function DoWhile_1() {
-  description = "return statement in a while block";
-
-  result = dowhile();
-
-  new TestCase(
-    SECTION,
-    "DoWhile_1" + description,
-    "pass",
-    result );
-}
-
-/**
- *  While with a labeled continue statement.  Verify that statements
- *  after the continue statement are not evaluated.
- *
- *  Tests: 12.6.2 step 8.
- *
- */
-function DoWhile_2() {
-  var description = "while with a labeled continue statement";
-  var result1 = "pass";
-  var result2 = "fail: did not execute code after loop, but inside label";
-  var i = 0;
-  var j = 0;
-
-theloop:
-  while( i++ < 10  ) {
-    j++;
-    continue theloop;
-    result1 = "failed:  hit code after continue statement";
-  }
-  result2 = "pass";
-
-  new TestCase(
-    SECTION,
-    "DoWhile_2:  " +description + " - code inside the loop, before the continue should be executed ("+j+")",
-    true,
-    j == 10 );
-
-  new TestCase(
-    SECTION,
-    "DoWhile_2:  " +description +" - code after labeled continue should not be executed",
-    "pass",
-    result1 );
-
-  new TestCase(
-    SECTION,
-    "DoWhile_2:  " +description +" - code after loop but inside label should be executed",
-    "pass",
-    result2 );
-}
-
-/**
- *  While with a labeled break.
- *
- */
-function DoWhile_3() {
-  var description = "while with a labeled break statement";
-  var result1 = "pass";
-  var result2 = "pass";
-  var result3 = "fail: did not get to code after label";
-
-woohoo: {
-    while( true ) {
-      break woohoo;
-      result1 = "fail: got to code after a break";
-    }
-    result2 = "fail: got to code outside of loop but inside label";
-  }
-
-  result3 = "pass";
-
-  new TestCase(
-    SECTION,
-    "DoWhile_3: " +description +" - verify break out of loop",
-    "pass",
-    result1 );
-
-
-  new TestCase(
-    SECTION,
-    "DoWhile_3: " +description +" - verify break out of label",
-    "pass",
-    result2 );
-
-  new TestCase(
-    SECTION,
-    "DoWhile_3: " +description + " - verify correct exit from label",
-    "pass",
-    result3 );
-}
-
-
-/**
- *  Labled while with an unlabeled break
- *
- */
-function DoWhile_4() {
-  var description = "labeled while with an unlabeled break";
-  var result1 = "pass";
-  var result2 = "pass";
-  var result3 = "fail: did not evaluate statement after label";
-
-woohooboy: {
-    while( true ) {
-      break woohooboy;
-      result1 = "fail: got to code after the break";
-    }
-    result2 = "fail: broke out of while, but not out of label";
-  }
-  result3 = "pass";
-
-  new TestCase(
-    SECTION,
-    "DoWhile_4: " +description +" - verify break out of while loop",
-    "pass",
-    result1 );
-
-  new TestCase(
-    SECTION,
-    "DoWhile_4: " +description + " - verify break out of label",
-    "pass",
-    result2 );
-
-  new TestCase(
-    SECTION,
-    "DoWhile_4: " +description +" - verify that statements after label are evaluated",
-    "pass",
-    result3 );
-}
-
-/**
- *  in this case, should behave the same way as
- *
- *
- */
-function DoWhile_5() {
-  var description = "while with a labeled continue statement";
-  var result1 = "pass";
-  var result2 = "fail: did not execute code after loop, but inside label";
-  var i = 0;
-  var j = 0;
-
-theloop: {
-    j++;
-    while( i++ < 10  ) {
-      continue;
-      result1 = "failed:  hit code after continue statement";
-    }
-    result2 = "pass";
-  }
-
-  new TestCase(
-    SECTION,
-    "DoWhile_5: " +description + " - continue should not execute statements above the loop",
-    true,
-    ( j == 1 ) );
-
-  new TestCase(
-    SECTION,
-    "DoWhile_5: " +description +" - code after labeled continue should not be executed",
-    "pass",
-    result1 );
-
-  new TestCase(
-    SECTION,
-    "DoWhile_5: " +description +" - code after loop but inside label should be executed",
-    "pass",
-    result2 );
-}
-
new file mode 100644
index 0000000000000000000000000000000000000000..ccbc7b97e22234c721b07205cc77149931b8f74f
GIT binary patch
literal 1042
zc$~dbOK!qI44r;%(L->7C{i1`s8q25bz7Mkw^$6BXvT@)W<5%eQ)ecGKm%QsY$mqs
z=l7nSaa~!=vlW8L=h{=n>P{&Yw5w1V@~D{_3@R`%Zm{H_vPrDYhOLhwpl37-SG{6`
zb{_lh1<B%;G+4WvqPF1C%wQvU4fx}PhKlPxT0xk`;m-}&exjwoc?;Tp*(8Q3`5=j#
zHW}Dc`I+C!KW?*07arA~0La@ZIS>CWcrE0S<~Q&JON&VdFu5`ot*JE1bV=tAhIM3G
ze?|U*TpaPWS8!>B^KrsbCP=5El6Z6-PpRO=$inD@&`0P}tUV?3%cu@!i1t3Kt?f)n
z&HJkUO<s*PFZ`|m)~oscfRX}dcCvEG7Z&P(<0`Dv>sX%7@sArkPjhs!V`Pf~qoL7}
N?*AKo9l@8E_XGHTNBIB%
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/unit/catch_explicit.js
@@ -0,0 +1,6 @@
+var ex;
+try {
+
+} catch (ex) {
+
+}
new file mode 100644
index 0000000000000000000000000000000000000000..80e7df9f2aabfbf370a53cca808b027dd0fe37ed
GIT binary patch
literal 724
zc$~da%TB~F4D<s3(;tW`L6-v(+DrG2Ok!w+x2<BgqMyYdlBV6NE6U?UE|$k*dpt4P
zwM@CG2wh&<;9G@j01(@>1kMMt>U$CpMWqwfDqyn2HtW_~5eiD~*tCz-6PKy~CQf2{
z_ZFFlJz2&;?trH_ug7o+SZuXhvI=FNmf!ct%SQI1`8afZCQIqx!5C-B-?x110Cpp|
zKJFNX0@YUK*#o$Wl;_3`QFX)%#!hI{mpg9kTcS^n{$k_Pp<|v^P1PSIpNs1e#Y$0<
t>1*ff*GcZC#EJ0WqALI5DI^2x_zeqPG(<)|;$*Tp+uZ&?_kM{N<xf5a;SB%)
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/unit/catch_implicit.js
@@ -0,0 +1,6 @@
+// `e` is neither a var, a let, a param, nor a free variable.
+try {
+
+} catch (e) {
+
+}
new file mode 100644
index 0000000000000000000000000000000000000000..5267d317c02560b565d12d2efae240511085ca2d
GIT binary patch
literal 1267
zc$~dcQBK1!49ysD3%J5AP!(<3hLENTX^3BxC5A<$X%(l{b}}x*Avgj~mW{5o(>@TD
zs<e*nm-qaVxT@5UCTrj_T?(s8$A*kC6h#S4DhtA?8jzvm4stLKSuzUQNwai}2-bmo
zD#``apqHWkk~(SFD8aSfPC;mHL1sLsel@qp0l`aG9sbrFrvZFcbA3S63SD|bO$YQQ
z=&UktsRwa@E*Zr@G75RSY`^QDQ$boIm;REEVMJ}Ro>zwCDa?)u_n+*Vk`#_{YXq(L
zV1PCX8x=Lgj+K;~BU=@6yQkJ_{Eu?pw&c9>ASzdXqGyxSL>Wo#9weDay(+K)HVCpm
zQ2#_b`ppZQbN%SG1P2z`g;$<Tip)~+G0XO`n~h$wO6$10E7`+!!p50T{PaBJ=}Xct
zS~lo#)HAn=uQW6r<w4#_JSJnXu-KMt7_8AyEI@p+Ga$&D9$~c`4^u|D&MSWY{JJdE
pq2z*wWx39(9IO(vO-W-zPuTY*pH}d5JN)x?_iHdw&%WQz@HgaEkPZL<
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/unit/let_in_fun.js
@@ -0,0 +1,3 @@
+function test() {
+    let limit = 1;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..ad97c6df96dd835172e716b2e6d8f4d4134fd5aa
GIT binary patch
literal 1012
zc%0QzQBK1!3^jvmaE4wWsstKHNYj3X_(g7Fm_?RWiCe)bxH4&)tzA|4K|-QGt)J}o
zo}a6vZ7h{)PiV@W_S^_u0zlApLtxmG7VaoO5EMF)lK`qn-D)~|69Rc5^H?_<>d5ZW
z{8ePK^v)Ws{aBN>=*evH5cxXv=YYmW+Eca1uukH49omzk<sfBG+CQpD<pADCp!cnU
zcy_PlMf^rp<Z6mmi>MyaDeX)vzVp)GJNaAz^o(cmJfUZ-EDbB8aP1)W!5cdRCWEyf
zv(0Aum10t(xg>GD%FF&FQTwD&MTIyC>{u2rcRMsZn0Q-$Ve-kni&vPNnPqy6VoLVB
cZLQ6j4710srS8A6T>U@G`nQ(z54l`^0b=|>aR2}S
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/unit/toplevel_var.js
@@ -0,0 +1,1 @@
+var a, b, c;
new file mode 100644
index 0000000000000000000000000000000000000000..b8367b996ec95b81e25398f74cd06329785dc579
GIT binary patch
literal 1267
zc$~dcQBK1!49ysD3%J5AP!(<3hLENTX^3BxB?cnWw2ISeI~kYZ5F7y~%eFGoX<t;T
z(m1wX-+NBxnp#7iy#tr|Qdm_xHe`&UsA^zRSrAUOfD9dXP=ayDvQfy+x}{@8uny!?
zRWG0gy$to2)Jely39j{K3PN)Wvfw54Yq|X$5WIHHe)rCC8o*~Q*Ly^*(B(JObU<&0
z&MNbkdk_ccvQZ3VqmZ}F_NV?i6{IzC=`Z;lM$|6rd1FYP%50f%|H-Z?N#PhbM$mc>
z2I!!&QBgzeSWUSlvQ;HFJ8DOb|545)+uI|JuRO9U)p;Tx^z3q)C?l!zLDCSZR|Pg8
z1VMH`)bD7b-@LLV*N<LHaA1*Lc;#tGky$D}&9d9*rD(K{r`wVpToN{VKJo5($kUgk
zU*lqsn5buN6<=xSPLv1vAn}-t!OG&XWd6?53>*{-5MS&J2%1fgu-e+glu<5u#n1OI
qH7yAx7i5;@x@bzUO3c<Z*@m9*Adt}w9BzkyzVH4R6ZP!dCc{6iP>>P;
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/unit/var_in_fun.js
@@ -0,0 +1,3 @@
+function test() {
+    var limit = 1;
+}
new file mode 100644
index 0000000000000000000000000000000000000000..471a265632c3edbcac28b38601a029d54f90dfeb
GIT binary patch
literal 1346
zc$~ddQEtL83=JFO7TXoLK-CEZOp{PGiD|!6Xgr9Prd6C)aMvATN0<`=6i5+Yi&V9B
zZNI$dmnOEZ6r{--xJVbdk(Filj4{m13Yd@vaw{7^hL&3>KwD(V&}S#@(h(vU3*x=3
z=Fosz`1(F|Qm~OZS86+fTyX;;;|29=xH%2vyt4J-ZOw7w!KV#Z2Sg>&rjOLLM^}Q@
zNWDrOhy}FCFa(mJ&)a3YuWnrn(minLE*bO#YMb?})+A4<cTBi@WCKc)IKr*Y>HY#5
z=tF6OqMF#TigF8N%TjFj)Xp0JqnuH;PiGoGIAmGK+eAL<+2%BsT2SSyAQQ<i3C1IM
zLG~N!o@k`stTY8zZ%#|FV36H8<;kST3>BZUT(HRaZr_nR65OmVHxyK8cm2$2rGgy0
zCWqu0i(sL#GlOGr{mgZbEbB!WesClCQbF6G4&<AdGZBKN!5Ck%)RC`;_=$;l4nbCT
z2+N(eOloPPe~jD3kC`u`<eX-2xXS7RjLfH-id=w>aL<!bH5?C{Tffg2g9&<ey+*@-
D+ux~P
new file mode 100644
--- /dev/null
+++ b/js/src/jsapi-tests/binast/parser/unit/var_in_fun_plus_arg.js
@@ -0,0 +1,3 @@
+function test(arg) {
+    var limit = 1;
+}
--- a/js/src/jsapi-tests/testBinASTReader.cpp
+++ b/js/src/jsapi-tests/testBinASTReader.cpp
@@ -4,17 +4,19 @@
 /* This Source Code Form is subject to the terms of the Mozilla Public
  * License, v. 2.0. If a copy of the MPL was not distributed with this
  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
 
 
 #if defined(XP_UNIX)
 
 #include <dirent.h>
+#include <fcntl.h>
 #include <sys/stat.h>
+#include <unistd.h>
 
 #elif defined(XP_WIN)
 
 #include <windows.h>
 
 #endif
 
 #include "jsapi.h"
@@ -46,111 +48,162 @@ readFull(JSContext* cx, const char* path
 
     js::Vector<uint8_t> intermediate(cx);
     readFull(path, intermediate);
 
     if (!buf.appendAll(intermediate))
         MOZ_CRASH("Couldn't read data");
 }
 
-BEGIN_TEST(testBinASTReaderECMAScript2)
+// Invariant: `path` must end with directory separator.
+void
+runTestFromPath(JSContext* cx, const char* path)
 {
     const char BIN_SUFFIX[] = ".binjs";
     const char TXT_SUFFIX[] = ".js";
-
-    CompileOptions options(cx);
-    options.setIntroductionType("unit test parse")
-           .setFileAndLine("<string>", 1);
+    fprintf(stderr, "runTestFromPath: entering directory '%s'\n", path);
+    const size_t pathlen = strlen(path);
 
 #if defined(XP_UNIX)
-
-    const char PATH[] = "jsapi-tests/binast/parser/tester/";
+    MOZ_ASSERT(path[pathlen - 1] == '/');
 
     // Read the list of files in the directory.
     enterJsDirectory();
-    DIR* dir = opendir(PATH);
+    DIR* dir = opendir(path);
     exitJsDirectory();
     if (!dir)
         MOZ_CRASH("Couldn't open directory");
 
 
     while (auto entry = readdir(dir)) {
-        // Find files whose name ends with ".binjs".
         const char* d_name = entry->d_name;
+        const bool isDirectory = entry->d_type == DT_DIR;
+
 
 #elif defined(XP_WIN)
+    MOZ_ASSERT(path[pathlen - 1] == '\\');
 
-    const char PATTERN[] = "jsapi-tests\\binast\\parser\\tester\\*.binjs";
-    const char PATH[] = "jsapi-tests\\binast\\parser\\tester\\";
+    const char PATTERN[] = "*";
 
     WIN32_FIND_DATA FindFileData;
     enterJsDirectory();
     HANDLE hFind = FindFirstFile(PATTERN, &FindFileData);
     exitJsDirectory();
     for (bool found = (hFind != INVALID_HANDLE_VALUE);
             found;
             found = FindNextFile(hFind, &FindFileData))
     {
         const char* d_name = FindFileData.cFileName;
+        const bool isDirectory = FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY;
 
 #endif // defined(XP_UNIX) || defined(XP_WIN)
 
         const size_t namlen = strlen(d_name);
+
+        // Recurse through subdirectories.
+        if (isDirectory) {
+            if (strcmp(d_name, ".") == 0)
+                continue;
+            if (strcmp(d_name, "..") == 0)
+                continue;
+
+            Vector<char> subPath(cx);
+            // Start with `path` (including directory separator).
+            if (!subPath.append(path, pathlen))
+                MOZ_CRASH();
+            if (!subPath.append(d_name, namlen))
+                MOZ_CRASH();
+            // Append same directory separator.
+            if (!subPath.append(path[pathlen - 1]))
+                MOZ_CRASH();
+            if (!subPath.append(0))
+                MOZ_CRASH();
+            runTestFromPath(cx, subPath.begin());
+            continue;
+        }
+
+        {
+            // Make sure that we run GC between two tests. Otherwise, since we're running
+            // everything from the same cx and without returning to JS, there is nothing
+            // to deallocate the ASTs.
+            JS::PrepareForFullGC(cx);
+            cx->runtime()->gc.gc(GC_NORMAL, JS::gcreason::NO_REASON);
+        }
+        LifoAllocScope allocScope(&cx->tempLifoAlloc());
+
+        // Find files whose name ends with ".binjs".
+        fprintf(stderr, "Considering %s\n", d_name);
         if (namlen < sizeof(BIN_SUFFIX))
             continue;
-        if (strncmp(d_name + namlen - (sizeof(BIN_SUFFIX) - 1), BIN_SUFFIX, sizeof(BIN_SUFFIX)) != 0)
+        if (strncmp(d_name + namlen - (sizeof(BIN_SUFFIX) - 1),
+                    BIN_SUFFIX,
+                    sizeof(BIN_SUFFIX)
+            ) != 0)
             continue;
 
         // Find text file.
-        UniqueChars txtPath(static_cast<char*>(js_malloc(namlen + sizeof(PATH) + 1)));
-        strncpy(txtPath.get(), PATH, sizeof(PATH));
-        strncpy(txtPath.get() + sizeof(PATH) - 1, d_name, namlen);
-        strncpy(txtPath.get() + sizeof(PATH) + namlen - sizeof(BIN_SUFFIX), TXT_SUFFIX, sizeof(TXT_SUFFIX));
-        txtPath[sizeof(PATH) + namlen - sizeof(BIN_SUFFIX) + sizeof(TXT_SUFFIX) - 1] = 0;
-        fprintf(stderr, "Testing %s\n", txtPath.get());
+        Vector<char> txtPath(cx);
+        if (!txtPath.append(path, pathlen))
+            MOZ_CRASH();
+        if (!txtPath.append(d_name, namlen))
+            MOZ_CRASH();
+        txtPath.shrinkBy(sizeof(BIN_SUFFIX) - 1);
+        if (!txtPath.append(TXT_SUFFIX, sizeof(TXT_SUFFIX)))
+            MOZ_CRASH();
+        fprintf(stderr, "Testing %s\n", txtPath.begin());
 
         // Read text file.
         js::Vector<char16_t> txtSource(cx);
-        readFull(cx, txtPath.get(), txtSource);
+        readFull(cx, txtPath.begin(), txtSource);
 
         // Parse text file.
+        CompileOptions txtOptions(cx);
+        txtOptions.setFileAndLine(txtPath.begin(), 0);
+
         UsedNameTracker txtUsedNames(cx);
         if (!txtUsedNames.init())
             MOZ_CRASH("Couldn't initialize used names");
-        js::frontend::Parser<js::frontend::FullParseHandler, char16_t> parser(cx, cx->tempLifoAlloc(), options, txtSource.begin(), txtSource.length(),
-                                                  /* foldConstants = */ false, txtUsedNames, nullptr,
-                                                  nullptr);
-        if (!parser.checkOptions())
+        js::frontend::Parser<js::frontend::FullParseHandler, char16_t> txtParser(
+            cx, allocScope.alloc(), txtOptions, txtSource.begin(), txtSource.length(),
+            /* foldConstants = */ false, txtUsedNames, nullptr,
+            nullptr);
+        if (!txtParser.checkOptions())
             MOZ_CRASH("Bad options");
 
-        auto txtParsed = parser.parse(); // Will be deallocated once `parser` goes out of scope.
+        auto txtParsed = txtParser.parse(); // Will be deallocated once `parser` goes out of scope.
         RootedValue txtExn(cx);
         if (!txtParsed) {
             // Save exception for more detailed error message, if necessary.
             if (!js::GetAndClearException(cx, &txtExn))
                 MOZ_CRASH("Couldn't clear exception");
         }
 
         // Read binary file.
-        UniqueChars binPath(static_cast<char*>(js_malloc(namlen + sizeof(PATH) + 1)));
-        strncpy(binPath.get(), PATH, sizeof(PATH));
-        strncpy(binPath.get() + sizeof(PATH) - 1, d_name, namlen);
-        binPath[namlen + sizeof(PATH) - 1] = 0;
+        Vector<char> binPath(cx);
+        if (!binPath.append(path, pathlen))
+            MOZ_CRASH();
+        if (!binPath.append(d_name, namlen))
+            MOZ_CRASH();
+        if (!binPath.append(0))
+            MOZ_CRASH();
 
         js::Vector<uint8_t> binSource(cx);
-        readFull(binPath.get(), binSource);
+        readFull(binPath.begin(), binSource);
 
         // Parse binary file.
+        CompileOptions binOptions(cx);
+        binOptions.setFileAndLine(binPath.begin(), 0);
+
         js::frontend::UsedNameTracker binUsedNames(cx);
         if (!binUsedNames.init())
             MOZ_CRASH("Couldn't initialized binUsedNames");
 
-        js::frontend::BinASTParser reader(cx, cx->tempLifoAlloc(), binUsedNames, options);
+        js::frontend::BinASTParser binParser(cx, allocScope.alloc(), binUsedNames, binOptions);
 
-        auto binParsed = reader.parse(binSource); // Will be deallocated once `reader` goes out of scope.
+        auto binParsed = binParser.parse(binSource); // Will be deallocated once `reader` goes out of scope.
         RootedValue binExn(cx);
         if (binParsed.isErr()) {
             // Save exception for more detailed error message, if necessary.
             if (!js::GetAndClearException(cx, &binExn))
                 MOZ_CRASH("Couldn't clear binExn");
         }
 
         // The binary parser should accept the file iff the text parser has.
@@ -172,45 +225,76 @@ BEGIN_TEST(testBinASTReaderECMAScript2)
             if (!report.init(cx, binExn, js::ErrorReport::WithSideEffects))
                 MOZ_CRASH("Couldn't report binExn");
 
             PrintError(cx, stderr, report.toStringResult(), report.report(), /* reportWarnings */ true);
             MOZ_CRASH("Binary parser rejected a file that text parser accepted");
         }
 
         if (binParsed.isErr()) {
-            fprintf(stderr, "Binary parser and text parser agree that %s is invalid\n", txtPath.get());
+            fprintf(stderr, "Binary parser and text parser agree that %s is invalid\n", txtPath.begin());
             continue;
         }
 
 #if defined(DEBUG) // Dumping an AST is only defined in DEBUG builds
         // Compare ASTs.
         Sprinter binPrinter(cx);
         if (!binPrinter.init())
             MOZ_CRASH("Couldn't display binParsed");
         DumpParseTree(binParsed.unwrap(), binPrinter);
 
         Sprinter txtPrinter(cx);
         if (!txtPrinter.init())
             MOZ_CRASH("Couldn't display txtParsed");
         DumpParseTree(txtParsed, txtPrinter);
 
         if (strcmp(binPrinter.string(), txtPrinter.string()) != 0) {
-            fprintf(stderr, "Got distinct ASTs when parsing %s:\n\tBINARY\n%s\n\n\tTEXT\n%s\n", txtPath.get(), binPrinter.string(), txtPrinter.string());
+            fprintf(stderr, "Got distinct ASTs when parsing %s (%lu/%lu):\n\tBINARY\n%s\n\n\tTEXT\n%s\n",
+                txtPath.begin(),
+                binPrinter.getOffset(), txtPrinter.getOffset(),
+                binPrinter.string(), txtPrinter.string());
+#if 0 // Not for release, but useful for debugging.
+      // In case of error, this dumps files to /tmp, so they may
+      // easily be diffed.
+            auto fd = open("/tmp/bin.ast", O_CREAT | O_TRUNC | O_WRONLY, 0666);
+            if (!fd)
+                MOZ_CRASH("Could not open bin.ast");
+            auto result = write(fd, binPrinter.string(), binPrinter.stringEnd() - binPrinter.string());
+            if (result <= 0)
+                MOZ_CRASH("Could not write to bin.ast");
+            result = close(fd);
+            if (result != 0)
+                MOZ_CRASH("Could not close bin.ast");
+
+            fd = open("/tmp/txt.ast", O_CREAT | O_TRUNC | O_WRONLY, 0666);
+            if (!fd)
+                MOZ_CRASH("Could not open txt.ast");
+            result = write(fd, txtPrinter.string(), txtPrinter.stringEnd() - txtPrinter.string());
+            if (result <= 0)
+                MOZ_CRASH("Could not write to txt.ast");
+            result = close(fd);
+            if (result != 0)
+                MOZ_CRASH("Could not close txt.ast");
+#endif // 0
             MOZ_CRASH("Got distinct ASTs");
         }
-        fprintf(stderr, "Got the same AST when parsing %s\n", txtPath.get());
 
+        fprintf(stderr, "Got the same AST when parsing %s\n%s\n", txtPath.begin(), binPrinter.string());
 #endif // defined(DEBUG)
     }
 
 #if defined(XP_WIN)
     if (!FindClose(hFind))
         MOZ_CRASH("Could not close Find");
 #elif defined(XP_UNIX)
     if (closedir(dir) != 0)
         MOZ_CRASH("Could not close dir");
 #endif // defined(XP_WIN)
+}
+
+BEGIN_TEST(testBinASTReaderECMAScript2)
+{
+    runTestFromPath(cx, "jsapi-tests/binast/parser/tester/");
 
     return true;
 }
 END_TEST(testBinASTReaderECMAScript2)