[
  {
    "path": ".babelrc",
    "content": "{\n  \"presets\": [\n    \"es2015\"\n  ],\n  \"plugins\": [\n    \"transform-object-rest-spread\"\n  ]\n}\n"
  },
  {
    "path": ".editorconfig",
    "content": "# This file is for unifying the coding style for different editors and IDEs\n# editorconfig.org\n\nroot = true\n\n[*]\ncharset = utf-8\ntrim_trailing_whitespace = true\ninsert_final_newline = true\nindent_style = space\nindent_size = 2\n"
  },
  {
    "path": ".eslintrc",
    "content": "{\n  \"parser\": \"babel-eslint\",\n  \"extends\": \"eslint:recommended\",\n  \"rules\": {\n    \"quotes\": [2, \"single\", \"avoid-escape\"],\n    \"strict\": 0,\n    \"no-underscore-dangle\": 0,\n    \"curly\": 2,\n    \"no-multi-spaces\": 2,\n    \"key-spacing\": 2,\n    \"no-return-assign\": 0,\n    \"consistent-return\": 0,\n    \"no-shadow\": 0,\n    \"comma-dangle\": 1,\n    \"no-use-before-define\": 0,\n    \"no-empty\": 2,\n    \"new-parens\": 2,\n    \"no-cond-assign\": 0,\n    \"no-fallthrough\": 0,\n    \"new-cap\": 0,\n    \"no-loop-func\": 0,\n    \"no-unreachable\": 0,\n    \"no-labels\": 0,\n    \"no-process-exit\": 0,\n    \"camelcase\": 0,\n    \"no-console\": 0\n  },\n  \"env\": {\n    \"node\": true\n  },\n  \"globals\": {\n    \"window\": true,\n    \"Node\": true,\n    \"XMLHttpRequest\": true,\n    \"document\": true,\n    \"jQuery\": true,\n    \"$\": true,\n    \"globalQuail\": true,\n    \"guessLanguage\": true,\n    \"process\": true,\n    \"quailBuilderTests\": true,\n    \"require\": true,\n    \"phantom\": true,\n    \"console\": true,\n    \"module\": true,\n    \"define\": true,\n    \"chai\": true,\n    \"__dirname\": true,\n    \"global\": true,\n    \"before\": true,\n    \"beforeEach\": true,\n    \"after\": true,\n    \"afterEach\": true,\n    \"describe\": true,\n    \"it\": true,\n    \"expect\": true,\n    \"assert\": true,\n    \"should\": true\n  }\n}\n"
  },
  {
    "path": ".gitignore",
    "content": "_site/*\n.htaccess\n.idea\n*.DS_Store\nexamples/wysiwyg/editors/aloha/*\nexamples/wysiwyg/editors/tinymce/*\nexamples/wysiwyg/editors/ckeditor/*\nexamples/wysiwyg/editors/ckeditor4/*\nnode_modules/*\n.grunt/*\nlib\ntest/quail-testing.jquery.js\ntest/accessibility-tests/_tests.json\ntest/quail-testrunner.js\ntest/accessibility-tests/_tests.json\ntest/core/_tests.json\nanalyses/*\nkarma_html/*\ntmp/*\nlogs/*\nphantomjsdriver.log\nvendor/*\n"
  },
  {
    "path": ".jscsrc",
    "content": "{\n  \"disallowKeywords\": [\"with\"],\n  \"disallowMixedSpacesAndTabs\": true,\n  \"disallowMultipleLineBreaks\": true,\n  \"disallowMultipleSpaces\": true,\n  \"disallowNewlineBeforeBlockStatements\": true,\n  \"disallowQuotedKeysInObjects\": \"allButReserved\",\n  \"disallowSpaceAfterObjectKeys\": true,\n  \"disallowSpaceAfterPrefixUnaryOperators\": [\"++\", \"--\", \"~\", \"!\"],\n  \"disallowSpaceBeforePostfixUnaryOperators\": [\"++\", \"--\"],\n  \"disallowSpacesInCallExpression\": true,\n  \"disallowSpacesInsideArrayBrackets\": \"all\",\n  \"disallowSpacesInsideObjectBrackets\": \"all\",\n  \"disallowSpacesInsideParentheses\": true,\n  \"disallowTrailingComma\": true,\n  \"disallowTrailingWhitespace\": true,\n  \"disallowYodaConditions\": true,\n  //  \"jsDoc\": {\n  //    \"checkAnnotations\": \"JSDoc3\",\n  //    \"checkParamNames\": true,\n  //    \"checkRedundantAccess\": true,\n  //    \"checkRedundantParams\": true,\n  //    \"checkRedundantReturns\": true,\n  //    \"checkTypes\": \"strictNativeCase\",\n  //    \"enforceExistence\": \"exceptExports\",\n  //    \"leadingUnderscoreAccess\": \"private\",\n  //    \"requireHyphenBeforeDescription\": true,\n  //    \"requireNewlineAfterDescription\": true,\n  //    \"requireDescriptionCompleteSentence\": true,\n  //    \"requireParamDescription\": true,\n  //    \"requireParamTypes\": true,\n  //    \"requireReturnTypes\": true\n  //  },\n  \"requireCamelCaseOrUpperCaseIdentifiers\": \"ignoreProperties\",\n  \"requireCapitalizedConstructors\": true,\n  \"requireCommaBeforeLineBreak\": true,\n  \"requireCurlyBraces\": [\n    \"if\",\n    \"else\",\n    \"for\",\n    \"while\",\n    \"do\",\n    \"try\",\n    \"catch\"\n  ],\n  \"requireDotNotation\": true,\n  \"requireKeywordsOnNewLine\": [\"else\"],\n  \"requireLineFeedAtFileEnd\": true,\n  \"requireLineBreakAfterVariableAssignment\": true,\n  \"requireOperatorBeforeLineBreak\": [\n    \"?\",\n    \"=\",\n    \"+\",\n    \"-\",\n    \"/\",\n    \"*\",\n    \"==\",\n    \"===\",\n    \"!=\",\n    \"!==\",\n    \">\",\n    \">=\",\n    \"<\",\n    \"<=\"\n  ],\n  \"requireParenthesesAroundIIFE\": true,\n  \"requireSpaceAfterBinaryOperators\": [\n    \"=\",\n    \",\",\n    \"+\",\n    \"-\",\n    \"/\",\n    \"*\",\n    \"==\",\n    \"===\",\n    \"!=\",\n    \"!==\"\n  ],\n  \"requireSpaceAfterKeywords\": [\n    \"do\",\n    \"for\",\n    \"if\",\n    \"else\",\n    \"switch\",\n    \"case\",\n    \"try\",\n    \"catch\",\n    \"void\",\n    \"while\",\n    \"with\",\n    \"return\",\n    \"typeof\"\n  ],\n  \"requireSpaceAfterLineComment\": true,\n  \"requireSpaceBeforeBinaryOperators\": [\n    \"=\",\n    \"+\",\n    \"-\",\n    \"/\",\n    \"*\",\n    \"==\",\n    \"===\",\n    \"!=\",\n    \"!==\"\n  ],\n  \"requireSpaceBeforeBlockStatements\": true,\n  \"requireSpaceBeforeObjectValues\": true,\n  \"requireSpacesInConditionalExpression\": {\n    \"afterTest\": true,\n    \"beforeConsequent\": true,\n    \"afterConsequent\": true,\n    \"beforeAlternate\": true\n  },\n  \"requireSpacesInFunctionDeclaration\": {\n    \"beforeOpeningRoundBrace\": true,\n    \"beforeOpeningCurlyBrace\": true\n  },\n  \"requireSpacesInFunctionExpression\": {\n    \"beforeOpeningRoundBrace\": true,\n    \"beforeOpeningCurlyBrace\": true\n  },\n  \"requireSpacesInNamedFunctionExpression\": {\n    \"beforeOpeningRoundBrace\": true,\n    \"beforeOpeningCurlyBrace\": true\n  },\n  \"safeContextKeyword\": [\"self\", \"that\"],\n  \"validateIndentation\": 2,\n  \"validateQuoteMarks\": \"'\",\n  \"validateParameterSeparator\": \", \"\n}\n"
  },
  {
    "path": ".jshintrc",
    "content": "{\n  \"boss\": true,\n  \"browser\": true,\n  \"curly\": true,\n  \"eqeqeq\": true,\n  \"eqnull\": true,\n  \"expr\": true,\n  \"forin\": true,\n  \"loopfunc\": true,\n  \"globals\": {\n    \"guessLanguage\": true,\n    \"process\": true,\n    \"quail\": true,\n    \"quailBuilderTests\": true,\n    \"require\": true,\n    \"phantom\": true,\n    \"console\": true,\n    \"module\": true,\n    \"define\": true,\n    \"chai\": true,\n    \"__dirname\": true,\n    \"global\": true,\n    \"before\": true,\n    \"beforeEach\": true,\n    \"after\": true,\n    \"afterEach\": true,\n    \"describe\": true,\n    \"it\": true,\n    \"expect\": true,\n    \"assert\": true\n  },\n  \"immed\": true,\n  \"indent\": 2,\n  \"jquery\": true,\n  \"latedef\": true,\n  \"noarg\": true,\n  \"node\": true,\n  \"smarttabs\": true,\n  \"sub\": true,\n  \"trailing\": true,\n  \"undef\": true\n}\n"
  },
  {
    "path": ".nvmrc",
    "content": "0.12\n"
  },
  {
    "path": ".quailrc",
    "content": "{\n  \"assessmentSpecsPath\": \"test/assessmentSpecs/specs\",\n  \"quail\": \"dist/runInBrowser.js\",\n  \"requireModules\": [],\n  \"requireAssessmentModules\": [\n    \"config/all_assessments.json\"\n  ],\n  \"requirePaths\": [\n    \"./src/assessments\"\n  ]\n}\n"
  },
  {
    "path": ".travis.yml",
    "content": "language: node_js\nnode_js:\n- 0.12\n# Selenium 2.44.0 does not work with PhantomJS. Use 2.43.0\n# @see https://code.google.com/p/selenium/issues/detail?id=8088\nbefore_script:\n- \"curl -O http://selenium-release.storage.googleapis.com/2.43/selenium-server-standalone-2.43.1.jar\"\n- \"java -jar selenium-server-standalone-2.43.1.jar 2>&1 >/dev/null &\"\n\n# Use Travis' new container-based running system.\nsudo: false\n\ninstall:\n- npm install\naddons:\n  sauce_connect: true\nenv:\n  global:\n  - secure: DkVmhBxHBkRFeVwfAifwjYzPGgj2TO/wX27zchhE9cTaS9kWnmn6W7p/m5Pps6yhZocZhSfSedL31501L94zIGCivM2Svi0mlAbEoXFaBhbOvFEy3dHwLmnzR36hdcdkzXqPxymw0o14lw2DwBGrsldGOnFetlux/7G8+i0NYDk=\n  - secure: LNqb5VmAhD1mJsdBbkgc68d8e93QyRLWTlBfX9wksV09a4PJ+UVTncG/L52yDh3jpQ7je2SAzMiauZ/mXiPTveTAhioC4SA6f8NUJX2FhkUUfeMmxfzFMI3KkFr+Q9WPw+iAPxCkdpgxiVdbTDqi6p9NjDYxgaFP71KQy75aq2c=\n  matrix:\n  # - _BROWSER: \"chrome\"\n  #   _PLATFORM: \"Windows_8\"\n  #   _VERSION: \"34\"\n  #   _ENV: \"desktop\"\n  # - _BROWSER: \"firefox\"\n  #   _PLATFORM: \"Windows_8\"\n  #   _VERSION: \"29\"\n  #   _ENV: \"desktop\"\n  # - _BROWSER: \"internet_explorer\"\n  #   _PLATFORM: \"Windows_8\"\n  #   _VERSION: \"10\"\n  #   _ENV: \"desktop\"\n  # - _BROWSER: \"safari\"\n  #   _PLATFORM: \"OS X 10.9\"\n  #   _VERSION: \"7\"\n  #   _ENV: \"desktop\"\n  - _BROWSER: phantomjs\n    _ENV: functional\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "QUAIL Changelog\n===============\n\n3.0.0\n------\n- The order of the arguments to the test runners has changed. It was\n```\n// args[0]: The test runner script.\n// args[1]: The URL to evaluate.\n// args[2]: The current working directory.\n// args[3]: The file to write analysis to.\n```\nand it is now\n```\n// args[0]: The test runner script.\n// args[1]: The URL to evaluate.\n// args[2]: The current working directory.\n// args[3]: The configuration for the phantomjs instance.\n// args[4]: The file to write analysis to.\n```\n\n2.2.17\n------\n- Added --output option to the commandline\n\n2.2.16\n------\n- Fixes for pNotUsedAsHeader (@mlewand)\n\n2.2.15\n------\n- Downgraded the testability of pNotUsedAsHeader to 0.5 from 1.0\n\n2.2.14\n------\n- Fixes for videosEmbeddedOrLinkedNeedCaptions\n\n2.2.13\n------\n- Flubbed up version, please ignore.\n\n2.2.12\n------\n- Make the address to test available to page.evaluate\n\n2.2.11\n------\n- Pulled the color tests into separate tests (PR #296)\n- Introduction WCAG2 test runner option\n- Implemented tableHeaders in linkHasAUniqueContext\n- Added tableHeaders.js\n- Fixed inputImageHasAlt test\n- Refactored tagsAreNestCorrectly to be a pass/fail test\n- Rewrote aInPHasADistinctStyle\n\n2.2.10\n------\n- No release, skipped.\n\n2.1\n---\n- Changed license to MIT\n- Quail is now split into various components and custom callbacks that are build using `grunt build`\n- Configuration is now in YAML format\n- Tests are explicitly aligned with WCAG techniques or success criteria.\n- Tests can have translatable titles and default descriptions.\n- Tests now support different configurations based on guideline alignment.\n\n2.0.4\n-----\n- Moved source files to different files in `/src`, `/dist` is now built versions of quail.\n- Renamed all test files to match their accessibility tests.\n- Updated most test files to HTML5 doctype.\n- Got rid of dependencies for pxtoem and hasEvent libraries.\n- Made strings build into JS instead of needing ajax calls.\n\n2.0.3\n-----\n- Added tags to tests so that they could be categorized by implementations.\n- Cleaned up some Grunt linting.\n\n2.0.2\n-----\n - Added filtering as an extra option.\n - Allowed for adding custom tests through a customTests option.\n - Bug fixes on CSS color contrast\n\n2.0.1\n-----\n - Removed unused tests from OAC\n - A few bug fixes on test reporting\n\n2.0.0\n-----\n\nRebuild of QUAIL as a jQuery plugin instead of being a PHP library.\n"
  },
  {
    "path": "LICENSE-MIT",
    "content": "Copyright 2015 Jesse Beach and other contributors\nhttp://quailjs.org\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND\nNONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE\nLIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION\nOF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\nWITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "[![Build Status](https://secure.travis-ci.org/quailjs/quail.png?branch=master)](http://travis-ci.org/quailjs/quail)\n\n# Deprecation\n\nAll projects have a useful lifespan. Quail was born during a time when accessibility\ntesting, as a discipline, was maturing. There were numerous teams building solutions\nin parallel -- Quail was just one of these. In the end, we were all orbiting around\nthe same general approach. Technology may have been a distinguishing factor a couple\nyears ago, but even these advantages have largely dissolved as solutions have evolved\nand improved over time.\n\nGiven the realities of the market and the limited time that the Quail team can\ndevote to this project, we are initializing deprecation for this project. Folks\nare welcome to fork it or volunteer to maintain it, but realistically, there are\nbetter options out there.\n\nIf you are looking for one, we recommend [aXe: the Accessibility Engine](https://github.com/dequelabs/axe-core) by [Deque Labs](https://github.com/dequelabs).\n\n# Quail: Accessibility Information Library\n\n**The project website is [quailjs.io](http://quailjs.io/).**\n\nQuail is a Node module and a jQuery plugin that lets you easily check HTML for adherence to accessibility standards. It comes with over 200 tests which implement Open Accessibility Tests and comes with WCAG 1.0, WCAG 2.0, and Section 508 guidelines.\n\nDevelopers can build their own guidelines, or easily build a custom guideline that integrates with their project. While the project supports checking entire HTML pages, integration with a CMS to check partial HTML content is probably the most popular use case.\n\n**Notice for developers working in the 2.2.x version.**\n\nPlease base your changes on the [```master-2.2.x```](https://github.com/quailjs/quail/tree/master-2.2.x) branch.\n\n## Requirements\n\nYou will need the following installed on your system to run Quail.\n\n1. [Node.js](https://nodejs.org/download/)\n1. [Grunt & Grunt CLI](http://gruntjs.com/installing-grunt)\n1. [Bower](http://bower.io/)\n1. [Java JDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html) (To run Selenium Server)\n1. [Karma](http://karma-runner.github.io/0.8/intro/installation.html)\n\n## Using Quail\n\n### Setup\n\nRun the following commands to build Quail.\n\n```bash\ngit clone https://github.com/quailjs/quail.git\ncd quail\nnpm install\nbower install\ngrunt build\n```\n\n### Using Quail from the command line\n\nTo see the Quail CLI API, run the following. You can also add the Quail bin directory to your PATH if you are so inclined.\n\n```bash\n./bin/quail --help\n```\n\nOnce the command is set up, you can run the following to test any addressable web page.\n\n```bash\n./bin/quail eval http://placekitten.com\n```\n\nWrite the results as a JSON object out to file in an existing directory.\n\n```bash\n./bin/quail evaluate http://placekitten.com -o ./analyses\n```\n\nYou can also pass configurations to the evaluator.\n\n```bash\n./bin/quail evaluate http://placekitten.com -c ~/path/to/myconfig.json -o ./analyses\n```\n\nThis is the default set of configurations. Your configurations will replace the defaults.\n\n```json\n{\n  \"phantomjs\": {\n    \"resourceTimeout\": 5000\n  },\n  \"blacklists\": {\n    \"domains\": [\n      \"fbstatic.com\",\n      \"facebook.com\",\n      \"twitter.com\",\n      \"google-analytics.com\",\n      \"googleadservices.com\",\n      \"googlesyndication.com\",\n      \"perfectaudience.com\",\n      \"typekit.com\",\n      \"sharethis.com\",\n      \"doubleclick.com\",\n      \"optimizely.com\",\n      \"gigya.com\"\n    ],\n    \"mimetypes\": [\n      \"application/x-shockwave-flash\",\n      \"application/(ms)?(word|powerpoint|excel)\"\n    ],\n    \"headers\": []\n  }\n}\n```\n\nThe ```phantomjs``` configurations affect the PhantomJS runtime.\n\nThe ```blacklists``` block resource resource requests from PhantomJS by the resource's domain, its mime type or a header name in the request. Currently the only header value that can be blocked is the value of Accept (mime type).\n\nTo work on an existing assessment in a browser (so that breakpoints can be set in the console), run the following.\n\n```bash\n./bin/quail dev aMustHaveTitle\n```\n\nThe following is experimental, which means it probably won\\'t work. You can generate a new assessment with this command.\n\n```bash\n./bin/quail gen someNewAssessment\n```\n\n## Testing\n\n### Core unit tests in Karma\n\n```bash\n./node_modules/karma/bin/karma start ./config/karma-unit.conf.js\n```\n\n### Testing assessments in Selenium\n\nAll assessments. This takes about 10 minutes to run.\n\n```bash\nnode ./test/assessmentSpecs/testRunner.js\n```\n\nAn individual assessment. This takes about 2 seconds to run.\n\n```bash\nnode ./test/assessmentSpecs/testRunner.js -I aMustHaveTitle\n```\n\nIn a specific browser.\n\n```bash\n_BROWSER=chrome node ./test/assessmentSpecs/testRunner.js\n```\n\n## Documentation\n\n[Full documentation is available via readthedocs.org](https://quail.readthedocs.org/en/latest/).\n\n## Contributing\n\nPull requests should be made against the **master** branch.\n\nWe are currently looking for the following types of contritions.\n\n1. Help with our current [Milestone objectives](https://github.com/quailjs/quail/milestones/Refactoring%20to%20a%20Selenium-based%20test%20runner%20and%20Mocha/Chai%20assessment%20tests).\n1. JavaScript enthusiasts who want a chance to build out:\n  1. A dependency injection load pattern: [Replace our load-order-depending spinup with an Inversion of Control pattern](https://github.com/quailjs/quail/issues/297)\n  1. A pub/sub pattern: [Refactor the custom event bubbling code in the core Classes (e.g. TestCollection) to use a real event pub/sub library](https://github.com/quailjs/quail/issues/351)\n  1. Improve an NPM package, better build and test scripts, etc: [Improve the Quail NPM package](https://github.com/quailjs/quail/issues/352)\n\n## Credits\n\n- Quail is maintained by [Jesse Renée Beach](http://twitter.com/jessebeach)\n- The [Kwaliteitsinstituut Nederlandse Gemeenten (KING)](https://www.kinggemeenten.nl/), who have funded many developer hours.\n- The [CKEditor development team](http://ckeditor.com/about) for their contributions.\n\n## References\n\n[HTML Test Suite for WCAG 2.0, Sorted by Guideline](http://www.w3.org/WAI/GL/WCAG20/tests/)\n\n## Legal\n\nQUAIL is covered under the MIT License, and is copyright (c) 2015 by Jesse Beach. Current license is at http://quailjs.org/license.\n"
  },
  {
    "path": "bin/quail.js",
    "content": "#!/usr/bin/env node\n\nconsole.error(\"The CLI has been moved into the package `@quailjs/quail-cli`.\");\nconsole.log();\nconsole.log(\"$ npm install -g @quailjs/quail-cli\");\nconsole.log();\nprocess.exit(1);\n"
  },
  {
    "path": "config/all_assessments.json",
    "content": "[\n  \"AAdjacentWithSameResourceShouldBeCombined\",\n  \"AImgAltNotRepetitive\",\n  \"AInPHasADistinctStyle\",\n  \"ALinkTextDoesNotBeginWithRedundantWord\",\n  \"ALinkWithNonText\",\n  \"ALinksAreSeparatedByPrintableCharacters\",\n  \"ALinksDontOpenNewWindow\",\n  \"ALinksNotSeparatedBySymbols\",\n  \"ALinksToMultiMediaRequireTranscript\",\n  \"ALinksToSoundFilesNeedTranscripts\",\n  \"AMultimediaTextAlternative\",\n  \"AMustContainText\",\n  \"AMustHaveTitle\",\n  \"AMustNotHaveJavascriptHref\",\n  \"AppletContainsTextEquivalent\",\n  \"AppletContainsTextEquivalentInAlt\",\n  \"AppletProvidesMechanismToReturnToParent\",\n  \"AppletTextEquivalentsGetUpdated\",\n  \"AppletUIMustBeAccessible\",\n  \"AppletsDoNotFlicker\",\n  \"AppletsDonotUseColorAlone\",\n  \"ASuspiciousLinkText\",\n  \"ATitleDescribesDestination\",\n  \"AnimatedGifMayBePresent\",\n  \"AreaAltIdentifiesDestination\",\n  \"AreaAltRefersToText\",\n  \"AreaDontOpenNewWindow\",\n  \"AreaHasAltValue\",\n  \"AreaLinksToSoundFile\",\n  \"AudioMayBePresent\",\n  \"BasefontIsNotUsed\",\n  \"BlinkIsNotUsed\",\n  \"BlockquoteNotUsedForIndentation\",\n  \"BlockquoteUseForQuotations\",\n  \"BoldIsNotUsed\",\n  \"ButtonHasName\",\n  \"CheckboxHasLabel\",\n  \"ColorBackgroundGradientContrast\",\n  \"ColorBackgroundImageContrast\",\n  \"ColorElementBehindBackgroundGradientContrast\",\n  \"ColorElementBehindBackgroundImageContrast\",\n  \"ColorElementBehindContrast\",\n  \"ColorFontContrast\",\n  \"CssDocumentMakesSenseStyleTurnedOff\",\n  \"DefinitionListsAreUsed\",\n  \"DoctypeProvided\",\n  \"DocumentAcronymsHaveElement\",\n  \"DocumentAutoRedirectNotUsed\",\n  \"DocumentContentReadableWithoutStylesheets\",\n  \"DocumentHasTitleElement\",\n  \"DocumentIsWrittenClearly\",\n  \"DocumentLangIsISO639Standard\",\n  \"DocumentLangNotIdentified\",\n  \"DocumentMetaNotUsedWithTimeout\",\n  \"DocumentReadingDirection\",\n  \"DocumentStrictDocType\",\n  \"DocumentTitleDescribesDocument\",\n  \"DocumentTitleIsNotPlaceholder\",\n  \"DocumentTitleIsShort\",\n  \"DocumentTitleNotEmpty\",\n  \"DocumentVisualListsAreMarkedUp\",\n  \"EmbedHasAssociatedNoEmbed\",\n  \"EmbedMustHaveAltAttribute\",\n  \"FieldsetHasLabel\",\n  \"FileHasLabel\",\n  \"FontIsNotUsed\",\n  \"FormButtonsHaveValue\",\n  \"FormErrorMessageHelpsUser\",\n  \"FormHasGoodErrorMessage\",\n  \"FormHasSubmitButton\",\n  \"FormWithRequiredLabel\",\n  \"HeaderH1\",\n  \"HeaderH1Format\",\n  \"HeaderH2\",\n  \"HeaderH2Format\",\n  \"HeaderH3\",\n  \"HeaderH3Format\",\n  \"HeaderH4\",\n  \"HeaderH4Format\",\n  \"HeaderH5Format\",\n  \"HeaderH6Format\",\n  \"HeadersAttrRefersToATableCell\",\n  \"HeadersHaveText\",\n  \"HeadersUseToMarkSections\",\n  \"IIsNotUsed\",\n  \"IdrefsHasCorrespondingId\",\n  \"IframeMustNotHaveLongdesc\",\n  \"ImageMapServerSide\",\n  \"ImgAltIsDifferent\",\n  \"ImgAltIsTooLong\",\n  \"ImgAltNotEmptyInAnchor\",\n  \"ImgAltNotPlaceHolder\",\n  \"ImgHasAlt\",\n  \"ImgHasLongDesc\",\n  \"ImgImportantNoSpacerAlt\",\n  \"ImgNonDecorativeHasAlt\",\n  \"ImgServerSideMapNotUsed\",\n  \"ImgShouldNotHaveTitle\",\n  \"ImgWithMapHasUseMap\",\n  \"InputCheckboxRequiresFieldset\",\n  \"InputElementsDontHaveAlt\",\n  \"InputImageAltIsNotFileName\",\n  \"InputImageAltIsNotPlaceholder\",\n  \"InputImageAltIsShort\",\n  \"InputImageAltNotRedundant\",\n  \"InputImageHasAlt\",\n  \"InputTextHasLabel\",\n  \"InputTextHasValue\",\n  \"InputTextValueNotEmpty\",\n  \"InputWithoutLabelHasTitle\",\n  \"LabelDoesNotContainInput\",\n  \"LabelMustBeUnique\",\n  \"LabelMustNotBeEmpty\",\n  \"LabelsAreAssignedToAnInput\",\n  \"LanguageDirAttributeIsUsed\",\n  \"LanguageDirectionPunctuation\",\n  \"LanguageUnicodeDirection\",\n  \"LegendTextNotEmpty\",\n  \"LegendTextNotPlaceholder\",\n  \"LiDontUseImageForBullet\",\n  \"LinkHasAUniqueContext\",\n  \"ListNotUsedForFormatting\",\n  \"ListOfLinksUseList\",\n  \"MarqueeIsNotUsed\",\n  \"NewWindowIsOpened\",\n  \"ObjectMustContainText\",\n  \"ObjectMustHaveEmbed\",\n  \"ObjectMustHaveTitle\",\n  \"ObjectMustHaveValidTitle\",\n  \"PNotUsedAsHeader\",\n  \"PasswordHasLabel\",\n  \"PreShouldNotBeUsedForTabularLayout\",\n  \"RadioHasLabel\",\n  \"ScriptOnclickRequiresOnKeypress\",\n  \"ScriptOndblclickRequiresOnKeypress\",\n  \"ScriptOnmousedownRequiresOnKeypress\",\n  \"ScriptOnmousemove\",\n  \"ScriptOnmouseoutHasOnmouseblur\",\n  \"ScriptOnmouseoverHasOnfocus\",\n  \"ScriptOnmouseupHasOnkeyup\",\n  \"SelectHasAssociatedLabel\",\n  \"SelectJumpMenu\",\n  \"SiteMap\",\n  \"SkipToContentLinkProvided\",\n  \"SvgContainsTitle\",\n  \"TabIndexFollowsLogicalOrder\",\n  \"TableDataShouldHaveTh\",\n  \"TableLayoutDataShouldNotHaveTh\",\n  \"TableLayoutHasNoCaption\",\n  \"TableLayoutHasNoSummary\",\n  \"TableLayoutMakesSenseLinearized\",\n  \"TableNotUsedForLayout\",\n  \"TableShouldUseHeaderIDs\",\n  \"TableSummaryDoesNotDuplicateCaption\",\n  \"TableSummaryIsEmpty\",\n  \"TableSummaryIsNotTooLong\",\n  \"TableUseColGroup\",\n  \"TableUsesAbbreviationForHeader\",\n  \"TableUsesCaption\",\n  \"TableUsesScopeForRow\",\n  \"TabularDataIsInTable\",\n  \"TextIsNotSmall\",\n  \"TextareaHasAssociatedLabel\",\n  \"VideoMayBePresent\",\n  \"VideosEmbeddedOrLinkedNeedCaptions\",\n  \"WhiteSpaceInWord\",\n  \"WhiteSpaceNotUsedForFormatting\"\n]\n"
  },
  {
    "path": "dist/bundle.js",
    "content": "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AcronymComponent = function AcronymComponent(test) {\n  test.get('scope').forEach(function (scope) {\n    var alreadyReported = {};\n    var predefined = {};\n\n    // Find defined acronyms within this scope.\n    DOM.scry('acronym[title], abbr[title]', scope).forEach(function (element) {\n      predefined[element.innerText.trim().replace(/\\n/g, '').replace(/( ){2,}/g, ' ').toUpperCase()] = element.getAttribute('title');\n    });\n\n    // Consider all block-level html elements that contain text.\n    DOM.scry('p, span, h1, h2, h3, h4, h5', scope).forEach(function (element) {\n      var self = element;\n      var text = self.innerText;\n      var words = text.split(' ');\n      // Keep a list of words that might be acronyms.\n      var infractions = [];\n      // If there is more than one word and ??.\n      if (words.length > 1 && text.toUpperCase() !== text) {\n        // Check each word.\n        words.forEach(function (word) {\n          // Only consider words great than one character.\n          if (word.length < 2) {\n            return;\n          }\n          // Only consider words that have not been predefined.\n          // Remove any non-alpha characters.\n          word = word.replace(/[^a-zA-Zs]/, '');\n          // If this is an uppercase word that has not been defined, it fails.\n          if (word.toUpperCase() === word && typeof predefined[word.toUpperCase().trim()] === 'undefined') {\n            if (typeof alreadyReported[word.toUpperCase()] === 'undefined') {\n              infractions.push(word);\n            }\n            alreadyReported[word.toUpperCase()] = word;\n          }\n        });\n        // If undefined acronyms are discovered, fail this case.\n        if (infractions.length) {\n          test.add(Case({\n            element: self,\n            info: {\n              acronyms: infractions\n            },\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: self,\n            status: 'passed'\n          }));\n        }\n      } else {\n        test.add(Case({\n          element: self,\n          status: 'passed'\n        }));\n      }\n    });\n  });\n};\nmodule.exports = AcronymComponent;\n\n},{\"Case\":33,\"DOM\":34}],2:[function(require,module,exports){\n'use strict';\n\nvar DOM = require('DOM');\nvar BorderDetailsComponent = function BorderDetailsComponent(element) {\n  var borders = new Map();\n  ['top', 'right', 'bottom', 'left'].forEach(function (side) {\n    var width = DOM.getComputedStyle(element, 'border-' + side + '-width');\n    width = parseInt(width.slice(0, -2), 10);\n    var style = DOM.getComputedStyle(element, 'border-' + side + '-style');\n    var color = DOM.getComputedStyle(element, 'border-' + side + '-color');\n    borders.set(side, {\n      width: width,\n      style: style,\n      color: color\n    });\n  });\n  return borders;\n};\nmodule.exports = BorderDetailsComponent;\n\n},{\"DOM\":34}],3:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = function CleanStringComponent(string) {\n  return string.toLowerCase().replace(/^\\s\\s*/, '');\n};\n\nmodule.exports = CleanStringComponent;\n\n},{}],4:[function(require,module,exports){\n'use strict';\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _typeof(obj) {\n  return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n}\n\n/**\n * Test callback for color tests. This handles both WAI and WCAG\n * color contrast/luminosity.\n */\nvar ConvertToPx = require('ConvertToPxComponent');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\n\nvar ColorComponent = function () {\n\n  function buildCase(test, Case, element, status, id, message) {\n    test.add(Case({\n      element: element,\n      message: message,\n      status: status\n    }));\n  }\n\n  var colors = {\n    cache: {},\n    /**\n     * Returns the lumosity of a given foreground and background object,\n     * in the format of {r: red, g: green, b: blue } in rgb color values.\n     */\n    getLuminosity: function getLuminosity(foreground, background) {\n      var cacheKey = 'getLuminosity_' + foreground + '_' + background;\n      foreground = colors.parseColor(foreground);\n      background = colors.parseColor(background);\n\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      var RsRGB = foreground.r / 255;\n      var GsRGB = foreground.g / 255;\n      var BsRGB = foreground.b / 255;\n      var R = RsRGB <= 0.03928 ? RsRGB / 12.92 : Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n      var G = GsRGB <= 0.03928 ? GsRGB / 12.92 : Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n      var B = BsRGB <= 0.03928 ? BsRGB / 12.92 : Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n\n      var RsRGB2 = background.r / 255;\n      var GsRGB2 = background.g / 255;\n      var BsRGB2 = background.b / 255;\n      var R2 = RsRGB2 <= 0.03928 ? RsRGB2 / 12.92 : Math.pow((RsRGB2 + 0.055) / 1.055, 2.4);\n      var G2 = GsRGB2 <= 0.03928 ? GsRGB2 / 12.92 : Math.pow((GsRGB2 + 0.055) / 1.055, 2.4);\n      var B2 = BsRGB2 <= 0.03928 ? BsRGB2 / 12.92 : Math.pow((BsRGB2 + 0.055) / 1.055, 2.4);\n      var l1, l2;\n      l1 = 0.2126 * R + 0.7152 * G + 0.0722 * B;\n      l2 = 0.2126 * R2 + 0.7152 * G2 + 0.0722 * B2;\n\n      colors.cache[cacheKey] = Math.round((Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05) * 10) / 10;\n      return colors.cache[cacheKey];\n    },\n\n    /**\n     * Returns the average color for a given image\n     * using a canvas element.\n     */\n    fetchImageColorAtPixel: function fetchImageColorAtPixel(img, x, y) {\n      x = typeof x !== 'undefined' ? x : 1;\n      y = typeof y !== 'undefined' ? y : 1;\n      var can = document.createElement('canvas');\n      var context = can.getContext('2d');\n      context.drawImage(img, 0, 0);\n      var data = context.getImageData(x, y, 1, 1).data;\n      return 'rgb(' + data[0] + ',' + data[1] + ',' + data[2] + ')';\n    },\n\n    /**\n     * Returns whether an element's color passes\n     * WCAG at a certain contrast ratio.\n     */\n    passesWCAG: function passesWCAG(element, level) {\n      return this.passesWCAGColor(element, this.getColor(element, 'foreground'), this.getColor(element, 'background'), level);\n    },\n\n    testElmContrast: function testElmContrast(algorithm, element, level) {\n      var background = colors.getColor(element, 'background');\n      return colors.testElmBackground(algorithm, element, background, level);\n    },\n\n    testElmBackground: function testElmBackground(algorithm, element, background, level) {\n      var foreground = colors.getColor(element, 'foreground');\n      var res;\n      if (algorithm === 'wcag') {\n        res = colors.passesWCAGColor(element, foreground, background, level);\n      } else if (algorithm === 'wai') {\n        res = colors.passesWAIColor(foreground, background);\n      }\n      return res;\n    },\n\n    /**\n     * Returns whether an element's color passes\n     * WCAG at a certain contrast ratio.\n     */\n    passesWCAGColor: function passesWCAGColor(element, foreground, background, level) {\n      var pxfsize = ConvertToPx(DOM.getComputedStyle(element, 'font-size'));\n      if (typeof level === 'undefined') {\n        if (pxfsize >= 18) {\n          level = 3;\n        } else {\n          var fweight = DOM.getComputedStyle(element, 'font-weight');\n          if (pxfsize >= 14 && (fweight === 'bold' || parseInt(fweight, 10) >= 700)) {\n            level = 3;\n          } else {\n            level = 4.5;\n          }\n        }\n      }\n      return this.getLuminosity(foreground, background) > level;\n    },\n\n    /**\n     * Returns whether an element's color passes\n     * WAI brightness levels.\n     */\n    passesWAI: function passesWAI(element) {\n      var foreground = this.parseColor(this.getColor(element, 'foreground'));\n      var background = this.parseColor(this.getColor(element, 'background'));\n      return this.passesWAIColor(foreground, background);\n    },\n\n    /**\n     * Returns whether an element's color passes\n     * WAI brightness levels.\n     */\n    passesWAIColor: function passesWAIColor(foreground, background) {\n      var contrast = colors.getWAIErtContrast(foreground, background);\n      var brightness = colors.getWAIErtBrightness(foreground, background);\n\n      return contrast > 500 && brightness > 125;\n    },\n\n    /**\n     * Compused contrast of a foreground and background\n     * per the ERT contrast spec.\n     */\n    getWAIErtContrast: function getWAIErtContrast(foreground, background) {\n      var diffs = colors.getWAIDiffs(foreground, background);\n      return diffs.red + diffs.green + diffs.blue;\n    },\n\n    /**\n     * Computed contrast of a foreground and background\n     * per the ERT brightness spec.\n     */\n    getWAIErtBrightness: function getWAIErtBrightness(foreground, background) {\n      var diffs = colors.getWAIDiffs(foreground, background);\n      return (diffs.red * 299 + diffs.green * 587 + diffs.blue * 114) / 1000;\n    },\n\n    /**\n     * Returns differences between two colors.\n     */\n    getWAIDiffs: function getWAIDiffs(foreground, background) {\n      return {\n        red: Math.abs(foreground.r - background.r),\n        green: Math.abs(foreground.g - background.g),\n        blue: Math.abs(foreground.b - background.b)\n      };\n    },\n\n    /**\n     * Retrieves the background or foreground of an element.\n     * There are some normalizations here for the way\n     * different browsers can return colors, and handling transparencies.\n     */\n    getColor: function getColor(element, type) {\n      var self = colors;\n      var cacheId = DOM.getData(element, 'quail-cache-id');\n      if (!cacheId) {\n        cacheId = 'id_' + Math.random();\n        DOM.setData(element, 'quail-cache-id', cacheId);\n      }\n      var cacheKey = 'getColor_' + type + '_' + cacheId;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      if (type === 'foreground') {\n        colors.cache[cacheKey] = DOM.getComputedStyle(element, 'color') ? DOM.getComputedStyle(element, 'color') : 'rgb(0,0,0)';\n        return colors.cache[cacheKey];\n      }\n\n      var bcolor = DOM.getComputedStyle(element, 'background-color');\n      if (colors.hasBackgroundColor(bcolor)) {\n        colors.cache[cacheKey] = bcolor;\n        return colors.cache[cacheKey];\n      }\n\n      DOM.parents(element).forEach(function (element) {\n        var pcolor = DOM.getComputedStyle(element, 'background-color');\n        if (colors.hasBackgroundColor(pcolor)) {\n          return self.cache[cacheKey] = pcolor;\n        }\n      });\n      // Assume the background is white.\n      colors.cache[cacheKey] = 'rgb(255,255,255)';\n      return colors.cache[cacheKey];\n    },\n\n    getForeground: function getForeground(element) {\n      return colors.getColor(element, 'foreground');\n    },\n\n    /**\n     * Returns an object with rgba taken from a string.\n     */\n    parseColor: function parseColor(color) {\n      if ((typeof color === 'undefined' ? 'undefined' : _typeof(color)) === 'object') {\n        return color;\n      }\n\n      if (color.substr(0, 1) === '#') {\n        return {\n          r: parseInt(color.substr(1, 2), 16),\n          g: parseInt(color.substr(3, 2), 16),\n          b: parseInt(color.substr(5, 2), 16),\n          a: false\n        };\n      }\n\n      if (color.substr(0, 3) === 'rgb') {\n        color = color.replace('rgb(', '').replace('rgba(', '').replace(')', '').split(',');\n        return {\n          r: color[0],\n          g: color[1],\n          b: color[2],\n          a: typeof color[3] === 'undefined' ? false : color[3]\n        };\n      }\n    },\n\n    /**\n     * Returns background image of an element or its parents.\n     */\n    getBackgroundImage: function getBackgroundImage(element) {\n      var cacheId = DOM.getData(element, 'quail-cache-id');\n      if (!cacheId) {\n        cacheId = 'id_' + Math.random();\n        DOM.setData(element, 'quail-cache-id', cacheId);\n      }\n\n      var cacheKey = 'getBackgroundImage_' + cacheId;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n      while (element && element.nodeType === 1 && element.nodeName !== 'BODY' && element.nodeName !== 'HTML') {\n        var bimage = DOM.getComputedStyle(element, 'background-image');\n        if (bimage && bimage !== 'none' && bimage.search(/^(.*?)url(.*?)$/i) !== -1) {\n          colors.cache[cacheKey] = bimage.replace('url(', '').replace(/['\"]/g, '').replace(')', '');\n          return colors.cache[cacheKey];\n        }\n        element = element.parentNode;\n      }\n      colors.cache[cacheKey] = false;\n      return false;\n    },\n\n    /**\n     * Returns background image of an element or its parents.\n     */\n    getBackgroundGradient: function getBackgroundGradient(element) {\n      var cacheId = DOM.getData(element, 'quail-cache-id');\n      if (!cacheId) {\n        cacheId = 'id_' + Math.random();\n        DOM.setData(element, 'quail-cache-id', cacheId);\n      }\n\n      var cacheKey = 'getBackgroundGradient_' + cacheId;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      var notEmpty = function notEmpty(s) {\n        return typeof s === 'string' && s.trim() !== '';\n      };\n      while (element && element.nodeType === 1 && element.nodeName !== 'BODY' && element.nodeName !== 'HTML') {\n        // Exit if element has a background color.\n        if (colors.hasBackgroundColor(DOM.getComputedStyle(element, 'background-color'))) {\n          colors.cache[cacheKey] = false;\n          return false;\n        }\n        var bimage = DOM.getComputedStyle(element, 'background-image');\n        if (bimage && bimage !== 'none' && bimage.search(/^(.*?)gradient(.*?)$/i) !== -1) {\n          var gradient = bimage.match(/gradient(\\(.*\\))/g);\n          if (gradient.length > 0) {\n            gradient = gradient[0].replace(/(linear|radial|\\d+deg|from|\\bto\\b|gradient|top|left|bottom|right|color-stop|center|\\d*%)/g, '');\n            colors.cache[cacheKey] = gradient.match(/(rgb\\([^\\)]+\\)|#[a-z\\d]*|[a-z]*)/g).filter(notEmpty);\n            return colors.cache[cacheKey];\n          }\n        }\n        element = element.parentNode;\n      }\n      colors.cache[cacheKey] = false;\n      return false;\n    },\n\n    /**\n     * Calculates average color of an image.\n     */\n    getAverageRGB: function getAverageRGB(img) {\n      var cacheKey = img.src;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      var blockSize = 5,\n\n      // only visit every 5 pixels\n      defaultRGB = {\n        r: 0,\n        g: 0,\n        b: 0\n      },\n\n      // for non-supporting envs\n      canvas = document.createElement('canvas'),\n          context = canvas.getContext && canvas.getContext('2d'),\n          data,\n          width,\n          height,\n          i = -4,\n          length,\n          rgb = {\n        r: 0,\n        g: 0,\n        b: 0,\n        a: 0\n      },\n          count = 0;\n\n      if (!context) {\n        colors.cache[cacheKey] = defaultRGB;\n        return defaultRGB;\n      }\n\n      height = canvas.height = img.height;\n      width = canvas.width = img.width;\n      context.drawImage(img, 0, 0);\n\n      try {\n        data = context.getImageData(0, 0, width, height);\n      } catch (e) {\n        colors.cache[cacheKey] = defaultRGB;\n        return defaultRGB;\n      }\n\n      length = data.data.length;\n\n      while ((i += blockSize * 4) < length) {\n        ++count;\n        rgb.r += data.data[i];\n        rgb.g += data.data[i + 1];\n        rgb.b += data.data[i + 2];\n      }\n\n      // ~~ used to floor values\n      rgb.r = ~ ~(rgb.r / count);\n      rgb.g = ~ ~(rgb.g / count);\n      rgb.b = ~ ~(rgb.b / count);\n\n      colors.cache[cacheKey] = rgb;\n      return rgb;\n    },\n\n    /**\n     * Convert color to hex value.\n     */\n    colorToHex: function colorToHex(c) {\n      var m = /rgba?\\((\\d+), (\\d+), (\\d+)/.exec(c);\n      return m ? '#' + (1 << 24 | m[1] << 16 | m[2] << 8 | m[3]).toString(16).substr(1) : c;\n    },\n\n    /**\n     * Check if element has a background color.\n     */\n    hasBackgroundColor: function hasBackgroundColor(bcolor) {\n      return bcolor !== 'rgba(0, 0, 0, 0)' && bcolor !== 'transparent';\n    },\n\n    /**\n     * Traverse visual tree for background property.\n     */\n    traverseVisualTreeForBackground: function traverseVisualTreeForBackground(element, property) {\n      var cacheId = DOM.getData(element, 'quail-cache-id');\n      if (!cacheId) {\n        cacheId = 'id_' + Math.random();\n        DOM.setData(element, 'quail-cache-id', cacheId);\n      }\n\n      var cacheKey = 'traverseVisualTreeForBackground_' + cacheId + '_' + property;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      var notempty = function notempty(s) {\n        return typeof s === 'string' && s.trim() !== '';\n      };\n\n      var foundIt;\n      var scannedElements = [];\n\n      // Scroll to make sure element is visible.\n      element.scrollIntoView();\n\n      // Get relative x and y.\n      var x = DOM.offset(element).left - window.scrollX;\n      var y = DOM.offset(element).top - window.scrollY;\n\n      // Hide current element.\n      scannedElements.push({\n        element: element,\n        visibility: DOM.getComputedStyle(element, 'visibility')\n      });\n      DOM.setAttributes(element, {\n        style: {\n          visibility: 'hidden'\n        }\n      });\n\n      // Get element at position x, y. This only selects visible elements.\n      var el = document.elementFromPoint(x, y);\n      var MAX_LOOPS = 200;\n      var count = 1;\n      while (foundIt === undefined && el && el.tagName !== 'BODY' && el.tagName !== 'HTML' && count <= MAX_LOOPS) {\n        count++;\n        var bcolor = DOM.getComputedStyle(el, 'background-color');\n        var bimage;\n        // Only check visible elements.\n        switch (property) {\n          case 'background-color':\n            if (colors.hasBackgroundColor(bcolor)) {\n              foundIt = bcolor;\n            }\n            break;\n          case 'background-gradient':\n            // Bail out if the element has a background color.\n            if (colors.hasBackgroundColor(bcolor)) {\n              foundIt = false;\n              continue;\n            }\n\n            bimage = DOM.getComputedStyle(el, 'background-image');\n            if (bimage && bimage !== 'none' && bimage.search(/^(.*?)gradient(.*?)$/i) !== -1) {\n              var gradient = bimage.match(/gradient(\\(.*\\))/g);\n              if (gradient.length > 0) {\n                gradient = gradient[0].replace(/(linear|radial|\\d+deg|from|\\bto\\b|gradient|top|left|bottom|right|color-stop|center|\\d*%)/g, '');\n                foundIt = gradient.match(/(rgb\\([^\\)]+\\)|#[a-z\\d]*|[a-z]*)/g).filter(notempty);\n              }\n            }\n            break;\n          case 'background-image':\n            // Bail out if the element has a background color.\n            if (colors.hasBackgroundColor(bcolor)) {\n              foundIt = false;\n              continue;\n            }\n            bimage = DOM.getComputedStyle(el, 'background-image');\n            if (bimage && bimage !== 'none' && bimage.search(/^(.*?)url(.*?)$/i) !== -1) {\n              foundIt = bimage.replace('url(', '').replace(/['\"]/g, '').replace(')', '');\n            }\n            break;\n        }\n        scannedElements.push({\n          element: el,\n          visibility: DOM.getComputedStyle(el, 'visibility')\n        });\n        DOM.setAttributes(el, {\n          style: {\n            visibility: 'hidden'\n          }\n        });\n        el = document.elementFromPoint(x, y);\n      }\n\n      // Reset visibility.\n      for (var i = 0; i < scannedElements.length; i++) {\n        DOM.setAttributes(scannedElements[i].element, {\n          style: {\n            visibility: scannedElements[i].visibility\n          }\n        });\n      }\n\n      colors.cache[cacheKey] = foundIt;\n      return foundIt;\n    },\n\n    /**\n     * Get first element behind current with a background color.\n     */\n    getBehindElementBackgroundColor: function getBehindElementBackgroundColor(element) {\n      return colors.traverseVisualTreeForBackground(element, 'background-color');\n    },\n\n    /**\n     * Get first element behind current with a background gradient.\n     */\n    getBehindElementBackgroundGradient: function getBehindElementBackgroundGradient(element) {\n      return colors.traverseVisualTreeForBackground(element, 'background-gradient');\n    },\n\n    /**\n     * Get first element behind current with a background image.\n     */\n    getBehindElementBackgroundImage: function getBehindElementBackgroundImage(element) {\n      return colors.traverseVisualTreeForBackground(element, 'background-image');\n    }\n  };\n\n  function textShouldBeTested(textNode) {\n    // We want a tag, not just the text node.\n    var element = textNode.parentNode;\n    var $this = element;\n\n    // The nodeType of the element must be 1. Nodes of type 1 implement the Element\n    // interface which is required of the first argument passed to window.getComputedStyle.\n    // Failure to pass an Element <node> to window.getComputedStyle will raised an exception\n    // if Firefox.\n    if (element.nodeType !== 1) {\n      return false;\n    } else if (['script', 'style', 'title', 'object', 'applet', 'embed', 'template', 'noscript'].indexOf(element.nodeName.toLowerCase()) !== -1) {\n      // Ignore elements whose content isn't displayed to the page.\n      return false;\n    } else if (IsUnreadable(DOM.text($this))) {\n      // Bail out if the text is not readable.\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  /**\n   * For the color test, if any case passes for a given element, then all the\n   * cases for that element pass.\n   */\n  function postInvoke(test) {\n    var passed = {};\n    var groupsBySelector = test.groupCasesBySelector();\n\n    /**\n     * Determine the length of an object.\n     *\n     * @param object obj\n     *   The object whose size will be determined.\n     *\n     * @return number\n     *   The size of the object determined by the number of keys.\n     */\n    function size(obj) {\n      return Object.keys(obj).length;\n    }\n\n    // Go through each selector group.\n    var nub = '';\n    for (var selector in groupsBySelector) {\n      if (groupsBySelector.hasOwnProperty(selector)) {\n        var cases = groupsBySelector[selector];\n        cases.forEach(function (_case) {\n          if (_case.get('status') === passed) {\n            // This can just be an empty string. We only need the passed hash\n            // to contain keys, not values.\n            passed[selector] = nub;\n          }\n        });\n      }\n    }\n\n    return size(passed) === size(groupsBySelector);\n  }\n\n  return {\n    colors: colors,\n    textShouldBeTested: textShouldBeTested,\n    postInvoke: postInvoke,\n    buildCase: buildCase\n  };\n}();\nmodule.exports = ColorComponent;\n\n},{\"ConvertToPxComponent\":5,\"DOM\":34,\"IsUnreadable\":12}],5:[function(require,module,exports){\n'use strict';\n\n/**\n * Converts units to pixels.\n */\n\nvar DOM = require('DOM');\nvar ConvertToPxComponent = function ConvertToPxComponent(unit) {\n  if (unit.search('px') > -1) {\n    return parseInt(unit, 10);\n  }\n  var div = document.createElement('div');\n  div.style.display = 'none';\n  div.style.height = unit;\n  document.body.appendChild(div);\n  var height = DOM.getComputedStyle(div, 'height');\n  document.body.removeChild(div);\n  return parseInt(height, 10);\n};\nmodule.exports = ConvertToPxComponent;\n\n},{\"DOM\":34}],6:[function(require,module,exports){\n'use strict';\n\n/**\n * Test callback for tests that look for script events\n *  (like a mouse event has a keyboard event as well).\n */\n\nvar Case = require('Case');\nvar HasEventListenerComponent = require('HasEventListenerComponent');\nvar DOM = require('DOM');\n\nvar EventComponent = function EventComponent(test, options) {\n  test.get('scope').forEach(function (scope) {\n    var $items = options.selector && DOM.scry(options.selector, scope);\n    // Bail if nothing was found.\n    if ($items.length === 0) {\n      test.add(Case({\n        element: scope,\n        status: 'inapplicable'\n      }));\n      return;\n    }\n    var searchEvent = options.searchEvent || '';\n    var correspondingEvent = options.correspondingEvent || '';\n    $items.forEach(function (item) {\n      var eventName = searchEvent.replace('on', '');\n      var hasOnListener = HasEventListenerComponent(item, eventName);\n      // Determine if the element has jQuery listeners for the event.\n      var jqevents;\n      var $ = window.jQuery || window.$ || {};\n      if ($._data) {\n        jqevents = $._data(this, 'events');\n      }\n      var hasjQueryOnListener = jqevents && jqevents[eventName] && !!jqevents[eventName].length;\n      var hasCorrespondingEvent = !!correspondingEvent.length;\n      var hasSpecificCorrespondingEvent = HasEventListenerComponent(item, correspondingEvent.replace('on', ''));\n      var _case = test.add(Case({\n        element: item\n      }));\n      if ((hasOnListener || hasjQueryOnListener) && (!hasCorrespondingEvent || !hasSpecificCorrespondingEvent)) {\n        _case.set({\n          status: 'failed'\n        });\n      } else {\n        _case.set({\n          status: 'passed'\n        });\n      }\n    });\n  });\n};\nmodule.exports = EventComponent;\n\n},{\"Case\":33,\"DOM\":34,\"HasEventListenerComponent\":8}],7:[function(require,module,exports){\n'use strict';\n\n/**\n *  Returns text contents for nodes depending on their semantics\n */\n\nvar DOM = require('DOM');\nvar getTextContentsComponent = function getTextContentsComponent($element) {\n  if (DOM.is($element, 'p, pre, blockquote, ol, ul, li, dl, dt, dd, figure, figcaption')) {\n    return DOM.text($element);\n  }\n  // Loop through all text nodes to get everything around children.\n  var text = '';\n  var children = $element.childNodes;\n  for (var i = 0, il = children.length; i < il; i += 1) {\n    // Only text nodes.\n    if (children[i].nodeType === 3) {\n      text += children[i].nodeValue;\n    }\n  }\n  return text;\n};\n\nmodule.exports = getTextContentsComponent;\n\n},{\"DOM\":34}],8:[function(require,module,exports){\n'use strict';\n\n/**\n * Returns whether an element has an event handler or not.\n */\n\nvar DOM = require('DOM');\nvar HasEventListenerComponent = function HasEventListenerComponent(element, event) {\n  var onEventAttr = DOM.getAttribute(element, 'on' + event);\n  if (onEventAttr) {\n    return true;\n  }\n  // jQuery events are stored in private objects\n  var $ = window.jQuery || window.$ || {};\n  if ($._data) {\n    if ($._data(element, 'events') && typeof $._data(element, 'events')[event] !== 'undefined') {\n      return true;\n    }\n  }\n  // Certain elements always have default events, so we create a new element to compare default events.\n  if (DOM.is(element, 'a[href], input, button, video, textarea') && typeof element[event] !== 'undefined' && (event === 'click' || event === 'focus')) {\n    if (element[event].toString().search(/^\\s*function\\s*(\\b[a-z$_][a-z0-9$_]*\\b)*\\s*\\((|([a-z$_][a-z0-9$_]*)(\\s*,[a-z$_][a-z0-9$_]*)*)\\)\\s*{\\s*\\[native code\\]\\s*}\\s*$/i) > -1) {\n      return false;\n    }\n  }\n  return typeof element[event] !== 'undefined';\n};\nmodule.exports = HasEventListenerComponent;\n\n},{\"DOM\":34}],9:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar HeadingSelectorComponent = require('HeadingSelectorComponent');\nvar HeadingLevelComponent = function HeadingLevelComponent(test, options) {\n  var priorLevel = false;\n  test.get('scope').forEach(function (scope) {\n    HeadingSelectorComponent(scope).forEach(function (element) {\n      var level = parseInt(element.tagName.substr(-1, 1), 10);\n      if (priorLevel === options.headingLevel && level > priorLevel + 1) {\n        test.add(Case({\n          element: element,\n          status: 'failed'\n        }));\n      } else {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      }\n      priorLevel = level;\n    });\n  });\n};\nmodule.exports = HeadingLevelComponent;\n\n},{\"Case\":33,\"HeadingSelectorComponent\":10}],10:[function(require,module,exports){\n'use strict';\n\nvar DOM = require('DOM');\n\nvar selector = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].join(', ');\n\nvar HeadingSelectorComponent = function HeadingSelectorComponent(context) {\n  return DOM.scry(selector, context);\n};\n\nmodule.exports = HeadingSelectorComponent;\n\n},{\"DOM\":34}],11:[function(require,module,exports){\n'use strict';\n\n/**\n * Read more about this function here: https://github.com/quailjs/quail/wiki/Layout-versus-data-tables\n */\n\nvar DOM = require('DOM');\nvar IsDataTableComponent = function IsDataTableComponent(table) {\n  // If there are less than three rows, why do a table?\n  if (DOM.scry('tr', table).length < 3) {\n    return false;\n  }\n  // If you are scoping a table, it's probably not being used for layout\n  if (DOM.scry('th[scope]', table).length) {\n    return true;\n  }\n  var index;\n  var numberRows = DOM.scry('tr', table).filter(function (element) {\n    return DOM.scry('td', element).length > 0;\n  }).length;\n  // Check for odd cell spanning\n  var spanCells = DOM.scry('td[rowspan], td[colspan]', table);\n  var isDataTable = true;\n  if (spanCells.length) {\n    var spanIndex = {};\n    spanCells.forEach(function (cell) {\n      index = DOM.index(cell);\n      if (typeof spanIndex[index] === 'undefined') {\n        spanIndex[index] = 0;\n      }\n      spanIndex[index]++;\n    });\n    for (var ii in spanIndex) {\n      if (spanIndex.hasOwnProperty(ii)) {\n        var count = spanIndex[ii];\n        if (count < numberRows) {\n          isDataTable = false;\n        }\n      }\n    }\n  }\n  // If there are sub tables, but not in the same column row after row, this is a layout table\n  var subTables = DOM.scry('table', table);\n  if (subTables.length) {\n    var subTablesIndexes = {};\n    subTables.forEach(function (table) {\n      var td = DOM.parent(table, 'td');\n      var parentIndex = DOM.index(td);\n      if (parentIndex !== false && typeof subTablesIndexes[parentIndex] === 'undefined') {\n        subTablesIndexes[parentIndex] = 0;\n      }\n      subTablesIndexes[parentIndex]++;\n    });\n    for (var sii in subTablesIndexes) {\n      if (subTablesIndexes.hasOwnProperty(sii)) {\n        var count = subTablesIndexes[sii];\n        if (count < numberRows) {\n          isDataTable = false;\n        }\n      }\n    }\n  }\n  return isDataTable;\n};\n\nmodule.exports = IsDataTableComponent;\n\n},{\"DOM\":34}],12:[function(require,module,exports){\n'use strict';\n\n/**\n * Helper function to determine if a string of text is even readable.\n * @todo - This will be added to in the future... we should also include\n * phonetic tests.\n */\n\nvar IsUnreadable = function IsUnreadable(text) {\n  if (typeof text !== 'string') {\n    return true;\n  }\n  return text.trim().length ? false : true;\n};\n\nmodule.exports = IsUnreadable;\n\n},{}],13:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LabelComponent = function LabelComponent(test, options) {\n\n  options = options || {};\n\n  test.get('scope').forEach(function (scope) {\n    DOM.scry(options.selector, scope).forEach(function (element) {\n      var label = DOM.scry('label[for=\\\"' + element.getAttribute('id') + '\\\"]', scope)[0];\n      var labelParent = DOM.parents(element).find(function (parent) {\n        return DOM.is(parent, 'label');\n      });\n      var hasLabelText = false;\n      var hasLabelParentText = false;\n      if (label) {\n        hasLabelText = /\\S/.test(label.innerText);\n      }\n      if (labelParent) {\n        hasLabelParentText = /\\S/.test(labelParent.innerText);\n      }\n      if (!hasLabelText && !hasLabelParentText) {\n        test.add(Case({\n          element: element,\n          status: 'failed'\n        }));\n      } else {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      }\n    });\n  });\n};\nmodule.exports = LabelComponent;\n\n},{\"Case\":33,\"DOM\":34}],14:[function(require,module,exports){\n'use strict';\n\nvar LanguageCodesStringsComponent = ['bh', 'bi', 'nb', 'bs', 'br', 'bg', 'my', 'es', 'ca', 'km', 'ch', 'ce', 'ny', 'ny', 'zh', 'za', 'cu', 'cu', 'cv', 'kw', 'co', 'cr', 'hr', 'cs', 'da', 'dv', 'dv', 'nl', 'dz', 'en', 'eo', 'et', 'ee', 'fo', 'fj', 'fi', 'nl', 'fr', 'ff', 'gd', 'gl', 'lg', 'ka', 'de', 'ki', 'el', 'kl', 'gn', 'gu', 'ht', 'ht', 'ha', 'he', 'hz', 'hi', 'ho', 'hu', 'is', 'io', 'ig', 'id', 'ia', 'ie', 'iu', 'ik', 'ga', 'it', 'ja', 'jv', 'kl', 'kn', 'kr', 'ks', 'kk', 'ki', 'rw', 'ky', 'kv', 'kg', 'ko', 'kj', 'ku', 'kj', 'ky', 'lo', 'la', 'lv', 'lb', 'li', 'li', 'li', 'ln', 'lt', 'lu', 'lb', 'mk', 'mg', 'ms', 'ml', 'dv', 'mt', 'gv', 'mi', 'mr', 'mh', 'ro', 'ro', 'mn', 'na', 'nv', 'nv', 'nd', 'nr', 'ng', 'ne', 'nd', 'se', 'no', 'nb', 'nn', 'ii', 'ny', 'nn', 'ie', 'oc', 'oj', 'cu', 'cu', 'cu', 'or', 'om', 'os', 'os', 'pi', 'pa', 'ps', 'fa', 'pl', 'pt', 'pa', 'ps', 'qu', 'ro', 'rm', 'rn', 'ru', 'sm', 'sg', 'sa', 'sc', 'gd', 'sr', 'sn', 'ii', 'sd', 'si', 'si', 'sk', 'sl', 'so', 'st', 'nr', 'es', 'su', 'sw', 'ss', 'sv', 'tl', 'ty', 'tg', 'ta', 'tt', 'te', 'th', 'bo', 'ti', 'to', 'ts', 'tn', 'tr', 'tk', 'tw', 'ug', 'uk', 'ur', 'ug', 'uz', 'ca', 've', 'vi', 'vo', 'wa', 'cy', 'fy', 'wo', 'xh', 'yi', 'yo', 'za', 'zu'];\nmodule.exports = LanguageCodesStringsComponent;\n\n},{}],15:[function(require,module,exports){\n'use strict';\n\nvar DOM = require('DOM');\nvar LanguageComponent = {\n\n  /**\n   * The maximum distance possible between two trigram models.\n   */\n  maximumDistance: 300,\n\n  /**\n   * Regular expressions to capture unicode blocks that are either\n   * explicitly right-to-left or left-to-right.\n   */\n  textDirection: {\n    rtl: /[\\u0600-\\u06FF]|[\\u0750-\\u077F]|[\\u0590-\\u05FF]|[\\uFE70-\\uFEFF]/mg,\n    ltr: /[\\u0041-\\u007A]|[\\u00C0-\\u02AF]|[\\u0388-\\u058F]/mg\n  },\n\n  /**\n   * Special characters that indicate text direction changes.\n   */\n  textDirectionChanges: {\n    rtl: /[\\u200E]|&rlm;/mg,\n    ltr: /[\\u200F]|&lrm;/mg\n  },\n\n  /**\n   * List of single-script blocks that encapsulate a list of languages.\n   */\n  scripts: {\n    basicLatin: {\n      regularExpression: /[\\u0041-\\u007F]/g,\n      languages: ['ceb', 'en', 'eu', 'ha', 'haw', 'id', 'la', 'nr', 'nso', 'so', 'ss', 'st', 'sw', 'tlh', 'tn', 'ts', 'xh', 'zu', 'af', 'az', 'ca', 'cs', 'cy', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'is', 'it', 'lt', 'lv', 'nl', 'no', 'pl', 'pt', 'ro', 'sk', 'sl', 'sq', 'sv', 'tl', 'tr', 've', 'vi']\n    },\n    arabic: {\n      regularExpression: /[\\u0600-\\u06FF]/g,\n      languages: ['ar', 'fa', 'ps', 'ur']\n    },\n    cryllic: {\n      regularExpression: /[\\u0400-\\u04FF]|[\\u0500-\\u052F]/g,\n      languages: ['bg', 'kk', 'ky', 'mk', 'mn', 'ru', 'sr', 'uk', 'uz']\n    }\n  },\n\n  /**\n   * List of regular expressions that capture only unicode text blocks that are\n   * associated with a single language.\n   */\n  scriptSingletons: {\n    bn: /[\\u0980-\\u09FF]/g,\n    bo: /[\\u0F00-\\u0FFF]/g,\n    el: /[\\u0370-\\u03FF]/g,\n    gu: /[\\u0A80-\\u0AFF]/g,\n    he: /[\\u0590-\\u05FF]/g,\n    hy: /[\\u0530-\\u058F]/g,\n    ja: /[\\u3040-\\u309F]|[\\u30A0-\\u30FF]/g,\n    ka: /[\\u10A0-\\u10FF]/g,\n    km: /[\\u1780-\\u17FF]|[\\u19E0-\\u19FF]/g,\n    kn: /[\\u0C80-\\u0CFF]/g,\n    ko: /[\\u1100-\\u11FF]|[\\u3130-\\u318F]|[\\uAC00-\\uD7AF]/g,\n    lo: /[\\u0E80-\\u0EFF]/g,\n    ml: /[\\u0D00-\\u0D7F]/g,\n    mn: /[\\u1800-\\u18AF]/g,\n    or: /[\\u0B00-\\u0B7F]/g,\n    pa: /[\\u0A00-\\u0A7F]/g,\n    si: /[\\u0D80-\\u0DFF]/g,\n    ta: /[\\u0B80-\\u0BFF]/g,\n    te: /[\\u0C00-\\u0C7F]/g,\n    th: /[\\u0E00-\\u0E7F]/g,\n    zh: /[\\u3100-\\u312F]|[\\u2F00-\\u2FDF]/g\n  },\n\n  /**\n   * Determines the document's language by looking at\n   * first the browser's default, then the HTML element's 'lang' attribute,\n   * then the 'lang' attribute of the element passed to quail.\n   */\n  getDocumentLanguage: function getDocumentLanguage(scope, returnIso) {\n    var language = navigator.language || navigator.userLanguage;\n    var langScope = DOM.parents(scope).find(function (parent) {\n      return DOM.hasAttribute(parent, 'lang');\n    })[0];\n    if (langScope) {\n      language = DOM.getAttribute(langScope, 'lang');\n    }\n    var langAttr = DOM.getAttribute(scope, 'lang');\n    language = langAttr || language || '';\n    language = language.toLowerCase().trim();\n    if (returnIso) {\n      return language.split('-')[0];\n    }\n    return language;\n  }\n};\nmodule.exports = LanguageComponent;\n\n},{\"DOM\":34}],16:[function(require,module,exports){\n\"use strict\";\n\nvar NewWindowStringsComponent = [/new (browser )?(window|frame)/, /popup (window|frame)/];\nmodule.exports = NewWindowStringsComponent;\n\n},{}],17:[function(require,module,exports){\n'use strict';\n\n/**\n * Placeholder test - checks that an attribute or the content of an\n * element itself is not a placeholder (i.e. 'click here' for links).\n */\n\nvar Case = require('Case');\nvar CleanStringComponent = require('CleanStringComponent');\nvar IsUnreadable = require('IsUnreadable');\nvar PlaceholdersStringsComponent = require('PlaceholdersStringsComponent');\nvar DOM = require('DOM');\n\nvar PlaceholderComponent = function PlaceholderComponent(test, options) {\n\n  var resolve = function resolve(element, resolution) {\n    test.add(Case({\n      element: element,\n      status: resolution\n    }));\n  };\n\n  test.get('scope').forEach(function (scope) {\n    DOM.scry(options.selector, scope).forEach(function (element) {\n      var text = '';\n      if (element.style.display === 'none' && !DOM.is(element, 'title')) {\n        resolve(element, 'inapplicable');\n        return;\n      }\n      if (typeof options.attribute !== 'undefined') {\n        if ((typeof DOM.getAttribute(element, options.attribute) === 'undefined' || options.attribute === 'tabindex' && DOM.getAttribute(element, options.attribute) <= 0) && !options.content) {\n          resolve(element, 'failed');\n          return;\n        } else {\n          if (DOM.getAttribute(element, options.attribute) && DOM.getAttribute(element, options.attribute) !== 'undefined') {\n            text += DOM.getAttribute(element, options.attribute);\n          }\n        }\n      }\n      if (typeof options.attribute === 'undefined' || !options.attribute || options.content) {\n        text += DOM.text(element);\n        DOM.scry('img[alt]', element).forEach(function (element) {\n          text += element.getAttribute('alt');\n        });\n      }\n      if (typeof text === 'string' && text.length > 0) {\n        text = CleanStringComponent(text);\n        var regex = /^([0-9]*)(k|kb|mb|k bytes|k byte)$/g;\n        var regexResults = regex.exec(text.toLowerCase());\n        if (regexResults && regexResults[0].length) {\n          resolve(element, 'failed');\n        } else if (options.empty && IsUnreadable(text)) {\n          resolve(element, 'failed');\n        } else if (PlaceholdersStringsComponent.indexOf(text) > -1) {\n          resolve(element, 'failed');\n        }\n        // It passes.\n        else {\n            resolve(element, 'passed');\n          }\n      } else {\n        if (options.empty && typeof text !== 'number') {\n          resolve(element, 'failed');\n        }\n      }\n    });\n  });\n};\nmodule.exports = PlaceholderComponent;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34,\"IsUnreadable\":12,\"PlaceholdersStringsComponent\":18}],18:[function(require,module,exports){\n'use strict';\n\nvar PlaceholdersStringsComponent = ['title', 'untitled', 'untitled document', 'this is the title', 'the title', 'content', ' ', 'new page', 'new', 'nbsp', '&nbsp;', 'spacer', 'image', 'img', 'photo', 'frame', 'frame title', 'iframe', 'iframe title', 'legend'];\nmodule.exports = PlaceholdersStringsComponent;\n\n},{}],19:[function(require,module,exports){\n'use strict';\n\nvar RedundantStringsComponent = {\n  inputImage: ['submit', 'button'],\n  link: ['link to', 'link', 'go to', 'click here', 'link', 'click', 'more'],\n  required: ['*']\n};\nmodule.exports = RedundantStringsComponent;\n\n},{}],20:[function(require,module,exports){\n'use strict';\n\nvar SiteMapStringsComponent = ['site map', 'map', 'sitemap'];\nmodule.exports = SiteMapStringsComponent;\n\n},{}],21:[function(require,module,exports){\n\"use strict\";\n\nvar SkipContentStringsComponent = [/(jump|skip) (.*) (content|main|post)/i];\nmodule.exports = SkipContentStringsComponent;\n\n},{}],22:[function(require,module,exports){\n'use strict';\n\n/**\n * Suspect CSS styles that might indicate a paragraph tag is being used as a header.\n */\n\nvar SuspectPCSSStyles = ['color', 'font-weight', 'font-size', 'font-family'];\n\nmodule.exports = SuspectPCSSStyles;\n\n},{}],23:[function(require,module,exports){\n'use strict';\n\n/**\n * Suspect tags that would indicate a paragraph is being used as a header.\n */\n\nvar SuspectPHeaderTags = ['strong', 'b', 'em', 'i', 'u', 'font'];\n\nmodule.exports = SuspectPHeaderTags;\n\n},{}],24:[function(require,module,exports){\n'use strict';\n\nvar SuspiciousLinksStringsComponent = ['click here', 'click', 'more', 'here', 'read more', 'download', 'add', 'delete', 'clone', 'order', 'view', 'read', 'clic aqu&iacute;', 'clic', 'haga clic', 'm&aacute;s', 'aqu&iacute;', 'image'];\nmodule.exports = SuspiciousLinksStringsComponent;\n\n},{}],25:[function(require,module,exports){\n'use strict';\n\nvar SymbolsStringsComponent = ['|', '*', /\\*/g, '<br>*', '&bull;', '&#8226', '♦', '›', '»', '‣', '▶', '.', '◦', '✓', '◽', '•', '—', '◾'];\nmodule.exports = SymbolsStringsComponent;\n\n},{}],26:[function(require,module,exports){\n'use strict';\n\nvar DOM = require('DOM');\n\nvar scopeValues = ['row', 'col', 'rowgroup', 'colgroup'];\n\nfunction isColumnHeader(tableMap, cell, x, y) {\n  var height = cell.getAttribute('rowspan') || 1;\n  var scope = cell.getAttribute('scope');\n  if (scope === 'col') {\n    return true;\n  } else if (scopeValues.indexOf(scope) !== -1) {\n    return false;\n  }\n\n  for (var i = 0; i < height * tableMap[y].length - 1; i += 1) {\n    var currCell = tableMap[y + i % height][~ ~(i / height)];\n    if (DOM.is(currCell, 'td')) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction isRowHeader(tableMap, cell, x, y) {\n  var width = cell.getAttribute('colspan') || 1;\n  var scope = cell.getAttribute('scope');\n\n  if (scope === 'row') {\n    return true;\n  } else if (scopeValues.indexOf(scope) !== -1 || isColumnHeader(tableMap, cell, x, y)) {\n    return false;\n  }\n\n  for (var i = 0; i < width * tableMap.length - 1; i += 1) {\n    var currCell = tableMap[~ ~(i / width)][x + i % width];\n    if (DOM.is(currCell, 'td')) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction scanHeaders(tableMap, x, y, deltaX, deltaY) {\n  var headerList = [];\n  var cell = tableMap[y][x];\n  var opaqueHeaders = [];\n  var inHeaderBlock;\n  var headersFromCurrBlock;\n\n  if (DOM.is(cell, 'th')) {\n    headersFromCurrBlock = [{\n      cell: cell,\n      x: x,\n      y: y\n    }];\n\n    inHeaderBlock = true;\n  } else {\n    inHeaderBlock = false;\n    headersFromCurrBlock = [];\n  }\n\n  for (; x >= 0 && y >= 0; x += deltaX, y += deltaY) {\n    var currCell = tableMap[y][x];\n    var dir = deltaX === 0 ? 'col' : 'row';\n\n    if (DOM.is(currCell, 'th')) {\n      inHeaderBlock = true;\n      headersFromCurrBlock.push({\n        cell: currCell,\n        x: x,\n        y: y\n      });\n      var blocked = false;\n      if (deltaY === -1 && isRowHeader(tableMap, currCell, x, y) || deltaX === -1 && isColumnHeader(tableMap, currCell, x, y)) {\n        blocked = true;\n      } else {\n        opaqueHeaders.forEach(function (opaqueHeader) {\n          var currSize = +currCell.getAttribute(dir + 'span') || 1;\n          var opaqueSize = +DOM.getAttribute(opaqueHeader.cell, dir + 'span') || 1;\n          if (currSize === opaqueSize) {\n            if (deltaY === -1 && opaqueHeader.x === x || deltaX === -1 && opaqueHeader.y === y) {\n              blocked = true;\n            }\n          }\n        });\n      }\n      if (blocked === false) {\n        headerList.push(currCell);\n      }\n    } else if (DOM.is(currCell, 'td') && inHeaderBlock === true) {\n      inHeaderBlock = false;\n      opaqueHeaders.push(headersFromCurrBlock);\n      headersFromCurrBlock = [];\n    }\n  }\n  return headerList;\n}\n\n/**\n * Get header cells based on the headers getAttributeibute of a cell\n */\nfunction getHeadersFromAttr(cell) {\n  var table = DOM.parents(cell).find(function (parent) {\n    return DOM.is(parent, 'table');\n  })[0];\n  var ids = cell.getAttribute('headers').split(/\\s/);\n  var headerCells = [];\n  // For each IDREF select an element with that ID from the table\n  // Only th/td cells in the same table can be headers\n  ids.forEach(function (id) {\n    headerCells.push(DOM.scry('th#' + id + ', td#' + id, table));\n  });\n  return headerCells;\n}\n\nfunction findCellInTableMap(tableMap, cell) {\n  var i = 0;\n  var y = 0;\n  var x;\n  // Locate the x and y coordinates of the current cell\n  while (x === undefined) {\n    if (tableMap[y] === undefined) {\n      return;\n    } else if (tableMap[y][i] === cell[0]) {\n      x = i;\n    } else if (i + 1 === tableMap[y].length) {\n      y += 1;\n      i = 0;\n    } else {\n      i += 1;\n    }\n  }\n  return { x: x, y: y };\n}\n\nfunction getHeadersFromScope(cell, tableMap) {\n  var i;\n  var headerCells = [];\n  var coords = findCellInTableMap(tableMap, cell);\n\n  // Grab the width and height, undefined, invalid or 0 become 1\n  var height = +cell.getAttribute('rowspan') || 1;\n  var width = +cell.getAttribute('colspan') || 1;\n\n  for (i = 0; i < width; i++) {\n    headerCells.push(scanHeaders(tableMap, coords.x + i, coords.y, 0, -1));\n  }\n\n  for (i = 0; i < height; i++) {\n    headerCells.push(scanHeaders(tableMap, coords.x, coords.y + i, -1, 0));\n  }\n  return headerCells;\n}\n\nfunction getHeadersFromGroups(cell, tableMap) {\n  var cellCoords = findCellInTableMap(tableMap, cell);\n  var headers = [];\n  var parents = DOM.parents(cell);\n  var thead = parents.find(function (parent) {\n    return DOM.is(parent, 'thead');\n  });\n  var tbody = parents.find(function (parent) {\n    return DOM.is(parent, 'tbody');\n  });\n  var tfoot = parents.find(function (parent) {\n    return DOM.is(parent, 'tfoot');\n  });\n  DOM.scry('th[scope=rowgroup]', [thead, tbody, tfoot]).forEach(function (element) {\n    var headerCoords = findCellInTableMap(tableMap, element);\n    if (headerCoords.x <= cellCoords.x && headerCoords.y <= cellCoords.y) {\n      headers.push(element);\n    }\n  });\n\n  // TODO colgroups\n}\nvar TableHeadersComponent = {\n  getTableMap: function getTableMap(table) {\n    var map = [];\n    DOM.scry('tr', table).forEach(function (element, y) {\n      if (typeof map[y] === 'undefined') {\n        map[y] = [];\n      }\n      var row = map[y];\n      DOM.children(element).forEach(function (cell) {\n        var x;\n        var i, il;\n\n        // Grab the width and height, undefined, invalid or 0 become 1\n        var height = +cell.getAttribute('rowspan') || 1;\n        var width = +cell.getAttribute('colspan') || 1;\n        // Make x the first undefined cell in the row\n        for (i = 0, il = row.length; i <= il; i += 1) {\n          if (x === undefined && row[i] === undefined) {\n            x = i;\n          }\n        }\n        // add 'this' to each coordinate in the map based on width and height\n        for (i = 0, il = width * height; i < il; i += 1) {\n          // Create a new row if it doesn't exist yet\n          if (map[y + ~ ~(i / width)] === undefined) {\n            map[y + ~ ~(i / width)] = [];\n          }\n          // Add the cell to the correct x / y coordinates\n          map[y + ~ ~(i / width)][x + i % width] = cell;\n        }\n      });\n    });\n    return map;\n  },\n\n  tableHeaders: function tableHeaders(elements) {\n    var headers = [];\n    elements.forEach(function (element) {\n      if (!DOM.is(element, 'td, th')) {\n        return;\n      }\n\n      if (element.hasAttribute('headers')) {\n        headers.push(getHeadersFromAttr(element));\n      } else {\n        var table = DOM.closest(element, 'table');\n        var map = TableHeadersComponent.getTableMap(table);\n        headers.push(getHeadersFromScope(element, map));\n        headers.push(getHeadersFromGroups(element, map));\n      }\n    });\n    return headers.filter(function (header) {\n      return (/\\S/.test(header.innerHTML)\n      );\n    });\n  }\n};\n\nmodule.exports = TableHeadersComponent;\n\n},{\"DOM\":34}],27:[function(require,module,exports){\n\"use strict\";\n\n/**\n * Returns DOM nodes that contain at least one text node.\n */\n\nvar TextNodeFilterComponent = function TextNodeFilterComponent(element) {\n  var nodes = Array.prototype.slice.call(element.childNodes);\n  var hasTextNode = false;\n  var node;\n  for (var i = 0, il = nodes.length; i < il; ++i) {\n    node = nodes[i];\n    // Determine if,\n    // 1) this is a text node, and\n    // 2) it has content other than whitespace.\n    if (node.nodeType === 3 && /\\S/.test(node.textContent)) {\n      hasTextNode = true;\n      break;\n    }\n  }\n  return hasTextNode;\n};\nmodule.exports = TextNodeFilterComponent;\n\n},{}],28:[function(require,module,exports){\n'use strict';\n\n/**\n * A list of HTML elements that can contain actual text.\n */\n\nvar TextSelectorComponent = ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'span', 'bdo', 'address', 'div', 'a', 'object', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'pre', 'q', 'ins', 'del', 'dt', 'dd', 'li', 'label', 'option', 'textarea', 'fieldset', 'legend', 'button', 'caption', 'td', 'th'].join(', ');\nmodule.exports = TextSelectorComponent;\n\n},{}],29:[function(require,module,exports){\n'use strict';\n\n/**\n * Utility object that runs text statistics, like sentence count,\n * reading level, etc.\n */\n\nvar TextStatisticsComponent = {\n\n  cleanText: function cleanText(text) {\n    return text.replace(/[,:;()\\-]/, ' ').replace(/[\\.!?]/, '.').replace(/[ ]*(\\n|\\r\\n|\\r)[ ]*/, ' ').replace(/([\\.])[\\. ]+/, '$1').replace(/[ ]*([\\.])/, '$1').replace(/[ ]+/, ' ').toLowerCase();\n  },\n\n  sentenceCount: function sentenceCount(text) {\n    return text.split('.').length + 1;\n  },\n\n  wordCount: function wordCount(text) {\n    return text.split(' ').length + 1;\n  },\n\n  averageWordsPerSentence: function averageWordsPerSentence(text) {\n    return this.wordCount(text) / this.sentenceCount(text);\n  },\n\n  averageSyllablesPerWord: function averageSyllablesPerWord(text) {\n    var that = this;\n    var count = 0;\n    var wordCount = that.wordCount(text);\n    if (!wordCount) {\n      return 0;\n    }\n    text.split(' ').forEach(function (word) {\n      count += that.syllableCount(word);\n    });\n    return count / wordCount;\n  },\n\n  syllableCount: function syllableCount(word) {\n    var matchedWord = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '').match(/[aeiouy]{1,2}/g);\n    if (!matchedWord || matchedWord.length === 0) {\n      return 1;\n    }\n    return matchedWord.length;\n  }\n};\nmodule.exports = TextStatisticsComponent;\n\n},{}],30:[function(require,module,exports){\n'use strict';\n\n/**\n * Helper function to determine if a given URL is even valid.\n */\n\nvar ValidURLComponent = function ValidURLComponent(url) {\n  return url.search(' ') === -1;\n};\n\nmodule.exports = ValidURLComponent;\n\n},{}],31:[function(require,module,exports){\n'use strict';\n\n/**\n* Helper object that tests videos.\n* @todo - allow this to be exteded more easily.\n*/\n\nvar AJAX = require('AJAX');\nvar DOM = require('DOM');\nvar Language = require('LanguageComponent');\n\nvar VideoComponent = {\n\n  /**\n   * Iterates over listed video providers and runs their `isVideo` method.\n   * @param Element element\n   *\n   * @return Boolean\n   *   Whether the element is a video.\n   */\n  isVideo: function isVideo(element) {\n    var isVideo = false;\n    for (var name in this.providers) {\n      if (this.providers.hasOwnProperty(name)) {\n        var provider = this.providers[name];\n        if (DOM.is(element, provider.selector) && provider.isVideo(element)) {\n          isVideo = true;\n        }\n      }\n    }\n    return isVideo;\n  },\n\n  findVideos: function findVideos(element, callback) {\n    for (var name in this.providers) {\n      if (this.providers.hasOwnProperty(name)) {\n        var provider = this.providers[name];\n        DOM.scry(provider.selector, element).forEach(function (video) {\n          if (provider.isVideo(video)) {\n            provider.hasCaptions(video, callback);\n          }\n        });\n      }\n    }\n  },\n\n  providers: {\n\n    youTube: {\n\n      selector: 'a, iframe',\n\n      apiUrl: 'http://gdata.youtube.com/feeds/api/videos/?q=%video&caption&v=2&alt=json',\n\n      isVideo: function isVideo(element) {\n        return this.getVideoId(element) !== false ? true : false;\n      },\n\n      getVideoId: function getVideoId(element) {\n        var attribute = DOM.is(element, 'iframe') ? 'src' : 'href';\n        var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&\\?]*).*/;\n        var match = DOM.getAttribute(element, attribute).match(regExp);\n        if (match && match[7].length === 11) {\n          return match[7];\n        }\n        return false;\n      },\n\n      hasCaptions: function hasCaptions(element, callback) {\n        var videoId = this.getVideoId(element);\n        var request = new AJAX(this.apiUrl.replace('%video', videoId));\n        request.then(function (raw) {\n          var data = JSON.parse(raw);\n          callback(element, data.feed.openSearch$totalResults.$t > 0);\n        });\n      }\n    },\n\n    flash: {\n\n      selector: 'object',\n\n      isVideo: function isVideo(element) {\n        var isVideo = false;\n        if (DOM.scry('param', element).length === 0) {\n          return false;\n        }\n        DOM.scry('param[name=flashvars]', element).forEach(function (element) {\n          if (element.getAttribute('value').search(/\\.(flv|mp4)/i) > -1) {\n            isVideo = true;\n          }\n        });\n        return isVideo;\n      },\n\n      hasCaptions: function hasCaptions(element, callback) {\n        var hasCaptions = false;\n        DOM.scry('param[name=flashvars]', element).forEach(function (element) {\n          var val = element.getAttribute('value') || '';\n          if (val.search('captions') > -1 && val.search('.srt') > -1 || val.search('captions.pluginmode') > -1) {\n            hasCaptions = true;\n          }\n        });\n        callback(element, hasCaptions);\n      }\n    },\n\n    videoElement: {\n\n      selector: 'video',\n\n      isVideo: function isVideo(element) {\n        return DOM.is(element, 'video');\n      },\n\n      hasCaptions: function hasCaptions(element, callback) {\n        var $captions = DOM.scry('track[kind=subtitles], track[kind=captions]', element);\n        if (!$captions.length) {\n          callback(element, false);\n          return;\n        }\n        var language = Language.getDocumentLanguage(element, true);\n        var langScope = DOM.parents(element).find(function (parent) {\n          return DOM.hasAttribute(parent, 'lang');\n        })[0];\n        if (langScope) {\n          language = DOM.getAttribute(langScope, 'lang').split('-')[0];\n        }\n        $captions.forEach(function (caption) {\n          var srclang = caption.getAttribute('srclang');\n          if (!srclang || srclang.toLowerCase() === language) {\n            var request = new AJAX(DOM.getAttribute(caption, 'src'));\n            request.then(function () {\n              callback(element, true);\n            }, function () {\n              callback(element, false);\n            });\n          }\n        });\n      }\n    }\n  }\n\n};\n\nmodule.exports = VideoComponent;\n\n},{\"AJAX\":32,\"DOM\":34,\"LanguageComponent\":15}],32:[function(require,module,exports){\n'use strict';\n\nvar _createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n  };\n}();\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nvar Q = require('q');\n\nvar AJAX = function () {\n  function AJAX(url, type) {\n    _classCallCheck(this, AJAX);\n\n    var contentType = this._resolveContentType(type);\n\n    return Q.Promise(function (resolve, reject, notify) {\n      var request = new XMLHttpRequest();\n\n      function onReadyStateChange() {\n        if (type === 'HEAD' && request.readyState === 2) {\n          resolve(request.getAllResponseHeaders());\n        } else if (request.readyState === 4) {\n          if ([200, 301, 302].indexOf(request.status) > -1) {\n            resolve(request.responseText);\n          } else {\n            reject('Request failed: ' + request.status);\n          }\n        }\n      }\n\n      function onError() {\n        reject('AJAX request to \\'' + url + '\\' failed: ' + JSON.stringify(url));\n      }\n\n      function onProgress(event) {\n        notify(event.loaded / event.total);\n      }\n\n      request.open('GET', url, true);\n      request.setRequestHeader('Content-Type', contentType);\n      request.onreadystatechange = onReadyStateChange;\n      request.onerror = onError;\n      request.onprogress = onProgress;\n      request.send();\n    });\n  }\n\n  _createClass(AJAX, [{\n    key: '_resolveContentType',\n    value: function _resolveContentType(name) {\n      var type = undefined;\n      switch (name) {\n        case 'json':\n          type = 'application/json';\n          break;\n        default:\n          type = 'text/html';\n      }\n      return type;\n    }\n  }]);\n\n  return AJAX;\n}();\n\nmodule.exports = AJAX;\n\n},{\"q\":238}],33:[function(require,module,exports){\n'use strict';\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _typeof(obj) {\n  return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n}\n\n/**\n * @providesModule Case\n */\nvar DOM = require('DOM');\nvar Case = function () {\n\n  /**\n   * A Case is a test against an element.\n   */\n  function Case(attributes) {\n    return new Case.fn.init(attributes);\n  }\n\n  // Prototype object of the Case.\n  Case.fn = Case.prototype = {\n    constructor: Case,\n    init: function init(attributes) {\n      this.listeners = {};\n      this.timeout = null;\n      this.attributes = attributes || {};\n\n      var that = this;\n      // Dispatch a resolve event if the case is initiated with a status.\n      if (this.attributes.status) {\n        // Delay the status dispatch to the next execution cycle so that the\n        // Case will register listeners in this execution cycle first.\n        setTimeout(function () {\n          that.resolve();\n        }, 0);\n      }\n      // Set up a time out for this case to resolve within.\n      else {\n          this.attributes.status = 'untested';\n          this.timeout = setTimeout(function () {\n            that.giveup();\n          }, 350);\n        }\n\n      return this;\n    },\n    // Details of the Case.\n    attributes: null,\n    get: function get(attr) {\n      return this.attributes[attr];\n    },\n    set: function set(attr, value) {\n      var isStatusChanged = false;\n      // Allow an object of attributes to be passed in.\n      if ((typeof attr === 'undefined' ? 'undefined' : _typeof(attr)) === 'object') {\n        for (var prop in attr) {\n          if (attr.hasOwnProperty(prop)) {\n            if (prop === 'status') {\n              isStatusChanged = true;\n            }\n            this.attributes[prop] = attr[prop];\n          }\n        }\n      }\n      // Assign a single attribute value.\n      else {\n          if (attr === 'status') {\n            isStatusChanged = true;\n          }\n          this.attributes[attr] = value;\n        }\n\n      if (isStatusChanged) {\n        this.resolve();\n      }\n      return this;\n    },\n    /**\n     * A test that determines if a case has one of a set of statuses.\n     *\n     * @return boolean\n     *   A bit that indicates if the case has one of the supplied statuses.\n     */\n    hasStatus: function hasStatus(statuses) {\n      // This is a rought test of arrayness.\n      if ((typeof statuses === 'undefined' ? 'undefined' : _typeof(statuses)) !== 'object') {\n        statuses = [statuses];\n      }\n      var status = this.get('status');\n      for (var i = 0, il = statuses.length; i < il; ++i) {\n        if (statuses[i] === status) {\n          return true;\n        }\n      }\n      return false;\n    },\n    /**\n     * Dispatches the resolve event; clears the timeout fallback event.\n     */\n    resolve: function resolve() {\n      clearTimeout(this.timeout);\n\n      var el = this.attributes.element;\n      var outerEl;\n\n      // Get a selector and HTML if an element is provided.\n      if (el && el.nodeType && el.nodeType === 1) {\n        // Allow a test to provide a selector. Programmatically find one if none\n        // is provided.\n        this.attributes.selector = this.defineUniqueSelector(el);\n\n        // Get a serialized HTML representation of the element the raised the error\n        // if the Test did not provide it.\n        if (!this.attributes.html) {\n          this.attributes.html = '';\n\n          // If the element is either the <html> or <body> elements,\n          // just report that. Otherwise we might be returning the entire page\n          // as a string.\n          if (el.nodeName === 'HTML' || el.nodeName === 'BODY') {\n            this.attributes.html = '<' + el.nodeName + '>';\n          }\n          // Get the parent node in order to get the innerHTML for the selected\n          // element. Trim wrapping whitespace, remove linebreaks and spaces.\n          else if (typeof el.outerHTML === 'string') {\n              outerEl = el.outerHTML.trim().replace(/(\\r\\n|\\n|\\r)/gm, '').replace(/>\\s+</g, '><');\n              // Guard against insanely long elements.\n              // @todo, make this length configurable eventually.\n              if (outerEl.length > 200) {\n                outerEl = outerEl.substr(0, 200) + '... [truncated]';\n              }\n              this.attributes.html = outerEl;\n            }\n        }\n      }\n\n      this.dispatch('resolve', this);\n    },\n    /**\n     * Abandons the Case if it not resolved within the timeout period.\n     */\n    giveup: function giveup() {\n      clearTimeout(this.timeout);\n      // @todo, the set method should really have a 'silent' option.\n      this.attributes.status = 'untested';\n      this.dispatch('timeout', this);\n    },\n    // @todo, make this a set of methods that all classes extend.\n    listenTo: function listenTo(dispatcher, eventName, handler) {\n      handler = handler.bind(this);\n      dispatcher.registerListener.call(dispatcher, eventName, handler);\n    },\n    registerListener: function registerListener(eventName, handler) {\n      if (!this.listeners[eventName]) {\n        this.listeners[eventName] = [];\n      }\n      this.listeners[eventName].push(handler);\n    },\n    dispatch: function dispatch(eventName) {\n      if (this.listeners[eventName] && this.listeners[eventName].length) {\n        var eventArgs = [].slice.call(arguments);\n        this.listeners[eventName].forEach(function (handler) {\n          // Pass any additional arguments from the event dispatcher to the\n          // handler function.\n          handler.apply(null, eventArgs);\n        });\n      }\n    },\n\n    /**\n     * Creates a page-unique selector for the selected DOM element.\n     *\n     * @param {jQuery} element\n     *   An element in a jQuery wrapper.\n     *\n     * @return {string}\n     *   A unique selector for this element.\n     */\n    defineUniqueSelector: function defineUniqueSelector(element) {\n      /**\n       * Indicates whether the selector string represents a unique DOM element.\n       *\n       * @param {string} selector\n       *   A string selector that can be used to query a DOM element.\n       *\n       * @return Boolean\n       *   Whether or not the selector string represents a unique DOM element.\n       */\n      function isUniquePath(selector) {\n        return DOM.scry(selector).length === 1;\n      }\n\n      /**\n       * Creates a selector from the element's id attribute.\n       *\n       * Temporary IDs created by the module that contain \"visitorActions\" are excluded.\n       *\n       * @param {HTMLElement} element\n       *\n       * @return {string}\n       *   An id selector or an empty string.\n       */\n      function applyID(element) {\n        var selector = '';\n        var id = element.id || '';\n        if (id.length > 0) {\n          selector = '#' + id;\n        }\n        return selector;\n      }\n\n      /**\n       * Creates a selector from classes on the element.\n       *\n       * Classes with known functional components like the word 'active' are\n       * excluded because these often denote state, not identity.\n       *\n       * @param {HTMLElement} element\n       *\n       * @return {string}\n       *   A selector of classes or an empty string.\n       */\n      function applyClasses(element) {\n        var selector = '';\n        // Try to make a selector from the element's classes.\n        var classes = element.className || '';\n        if (classes.length > 0) {\n          classes = classes.split(/\\s+/);\n          // Filter out classes that might represent state.\n          classes = reject(classes, function (cl) {\n            return (/active|enabled|disabled|first|last|only|collapsed|open|clearfix|processed/.test(cl)\n            );\n          });\n          if (classes.length > 0) {\n            return '.' + classes.join('.');\n          }\n        }\n        return selector;\n      }\n\n      /**\n       * Finds attributes on the element and creates a selector from them.\n       *\n       * @param {HTMLElement} element\n       *\n       * @return {string}\n       *   A selector of attributes or an empty string.\n       */\n      function applyAttributes(element) {\n        var selector = '';\n        // Whitelisted attributes to include in a selector to disambiguate it.\n        var attributes = ['href', 'type', 'title', 'alt'];\n        var value;\n        if (typeof element === 'undefined' || typeof element.attributes === 'undefined' || element.attributes === null) {\n          return selector;\n        }\n        // Try to make a selector from the element's classes.\n        for (var i = 0, len = attributes.length; i < len; i++) {\n          value = element.attributes[attributes[i]] && element.attributes[attributes[i]].value;\n          if (value) {\n            selector += '[' + attributes[i] + '=\"' + value + '\"]';\n          }\n        }\n        return selector;\n      }\n\n      /**\n       * Creates a unique selector using id, classes and attributes.\n       *\n       * It is possible that the selector will not be unique if there is no\n       * unique description using only ids, classes and attributes of an\n       * element that exist on the page already. If uniqueness cannot be\n       * determined and is required, you will need to add a unique identifier\n       * to the element through theming development.\n       *\n       * @param {HTMLElement} element\n       *\n       * @return {string}\n       *   A unique selector for the element.\n       */\n      function generateSelector(element) {\n        var selector = '';\n        var scopeSelector = '';\n        var pseudoUnique = false;\n        var firstPass = true;\n\n        do {\n          scopeSelector = '';\n          // Try to apply an ID.\n          if ((scopeSelector = applyID(element)).length > 0) {\n            selector = scopeSelector + ' ' + selector;\n            // Assume that a selector with an ID in the string is unique.\n            break;\n          }\n\n          // Try to apply classes.\n          if (!pseudoUnique && (scopeSelector = applyClasses(element)).length > 0) {\n            // If the classes don't create a unique path, tack them on and\n            // continue.\n            selector = scopeSelector + ' ' + selector;\n            // If the classes do create a unique path, mark this selector as\n            // pseudo unique. We will keep attempting to find an ID to really\n            // guarantee uniqueness.\n            if (isUniquePath(selector)) {\n              pseudoUnique = true;\n            }\n          }\n\n          // Process the original element.\n          if (firstPass) {\n            // Try to add attributes.\n            if ((scopeSelector = applyAttributes(element)).length > 0) {\n              // Do not include a space because the attributes qualify the\n              // element. Append classes if they exist.\n              selector = scopeSelector + selector;\n            }\n\n            // Add the element nodeName.\n            selector = element.nodeName.toLowerCase() + selector;\n\n            // The original element has been processed.\n            firstPass = false;\n          }\n\n          // Try the parent element to apply some scope.\n          element = element.parentNode;\n        } while (element && element.nodeType === 1 && element.nodeName !== 'BODY' && element.nodeName !== 'HTML');\n\n        return selector.trim();\n      }\n\n      /**\n       * Helper function to filter items from a list that pass the comparator\n       * test.\n       *\n       * @param {Array} list\n       * @param {function} comparator\n       *   A function that return a boolean. True means the list item will be\n       *   discarded from the list.\n       * @return array\n       *   A list of items the excludes items that passed the comparator test.\n       */\n      function reject(list, comparator) {\n        var keepers = [];\n        for (var i = 0, il = list.length; i < il; i++) {\n          if (!comparator.call(null, list[i])) {\n            keepers.push(list[i]);\n          }\n        }\n        return keepers;\n      }\n\n      return element && generateSelector(element);\n    },\n    push: [].push,\n    sort: [].sort,\n    concat: [].concat,\n    splice: [].splice\n  };\n\n  // Give the init function the Case prototype.\n  Case.fn.init.prototype = Case.fn;\n\n  return Case;\n}();\nmodule.exports = Case;\n\n},{\"DOM\":34}],34:[function(require,module,exports){\n'use strict';\n\n/**\n * Wrapper library for DOM operations.\n */\n\nvar DataSet = require('data-set');\nvar documentOffset = require('document-offset');\nvar isDom = require('is-dom');\nvar select = require('dom-select');\n\nvar _isDomError = function _isDomError(methodName) {\n  throw new Error('Non-DOM object passed to the method DOM.' + methodName);\n};\n\nvar _assertIsDom = function _assertIsDom(element, methodName) {\n  var isObjectNode = typeof element === 'function' && element.nodeName === 'OBJECT';\n  if (!element || !isDom(element) && !isObjectNode) {\n    _isDomError(methodName);\n  }\n};\n\nvar DOM = {\n  scry: function scry(selector, context) {\n    var elements = [];\n    if (Array.isArray(context)) {\n      context.forEach(function (ct) {\n        ct && _assertIsDom(ct, 'scry');\n        elements = elements.concat(select.all(selector, ct));\n      });\n    } else if (context && context.constructor === NodeList) {\n      for (var i = 0, il = context.length; i < il; i++) {\n        var ct = context[i];\n        ct && _assertIsDom(ct, 'scry');\n        elements = elements.concat(select.all(selector, ct));\n      }\n    } else {\n      context && _assertIsDom(context, 'scry');\n      elements = elements.concat(select.all(selector, context));\n    }\n    return elements;\n  },\n  parent: function parent(element) {\n    _assertIsDom(element, 'parent');\n    return element.parentElement;\n  },\n  parents: function parents(element) {\n    _assertIsDom(element, 'parents');\n    var parentElements = [];\n    var node = element;\n    while (node.parentElement) {\n      parentElements.push(node.parentElement);\n      node = node.parentElement;\n    }\n    return parentElements;\n  },\n  children: function children(element) {\n    _assertIsDom(element, 'children');\n    return Array.prototype.slice.call(element.children);\n  },\n  hasAttribute: function hasAttribute(element, attrName) {\n    _assertIsDom(element, 'hasAttribute');\n    return typeof element[attrName] !== 'undefined';\n  },\n  /**\n   * Sets attributes on a node.\n   */\n  setAttributes: function setAttributes(element, attributes) {\n    _assertIsDom(element, 'setAttributes');\n    // The type attribute needs to be set first in IE, so we special case it.\n    if (attributes.type) {\n      element.type = attributes.type;\n    }\n\n    for (var attribute in attributes) {\n      var value = attributes[attribute];\n\n      if (attribute == 'type') {\n        continue; // The type attribute needs to be set first in IE.\n      } else if (attribute == 'style') {\n          if (typeof value == 'string') {\n            element.style.cssText = value;\n          } else {\n            Object.assign(element.style, value);\n          }\n        } else if (attribute in element) {\n          element[attribute] = value;\n        } else if (element.setAttribute) {\n          element.setAttribute(attribute, value);\n        }\n    }\n  },\n  getAttribute: function getAttribute(element, name) {\n    _assertIsDom(element, 'getAttribute');\n    return element.getAttribute(name);\n  },\n  getStyle: function getStyle(element, name) {\n    _assertIsDom(element, 'getStyle');\n    var value;\n    try {\n      value = element.style[name];\n    } catch (error) {\n      throw new Error(error);\n    }\n    return value;\n  },\n  getComputedStyle: function getComputedStyle(element, name) {\n    _assertIsDom(element, 'getComputedStyle');\n    var value;\n    try {\n      value = window.getComputedStyle(element).getPropertyValue(name);\n    } catch (error) {\n      throw new Error(error);\n    }\n    return value;\n  },\n  next: function next(element) {\n    _assertIsDom(element, 'next');\n    var parentElement = element.parentElement;\n    var children;\n    var index;\n    if (parentElement) {\n      children = DOM.children(parentElement);\n      index = children.indexOf(element);\n    }\n    if (index > -1 && index <= children.length - 2) {\n      return children[index + 1];\n    }\n  },\n  prev: function prev(element) {\n    _assertIsDom(element, 'prev');\n    var parentElement = element.parentElement;\n    var children;\n    var index;\n    if (parentElement) {\n      children = DOM.children(parentElement);\n      index = children.indexOf(element);\n    }\n    if (index > 0) {\n      return children[index - 1];\n    }\n  },\n  nextAll: function nextAll(element) {\n    _assertIsDom(element, 'nextAll');\n    var parentElement = element.parentElement;\n    var children;\n    var index;\n    if (parentElement) {\n      children = DOM.children(parentElement);\n      index = children.indexOf(element);\n    }\n    return children.slice(index + 1);\n  },\n  prevAll: function prevAll(element) {\n    _assertIsDom(element, 'prevAll');\n    var parentElement = element.parentElement;\n    var children;\n    var index;\n    if (parentElement) {\n      children = DOM.children(parentElement);\n      index = children.indexOf(element);\n    }\n    return children.slice(0, index);\n  },\n  index: function index(element) {\n    var siblings = DOM.children(element.parentElement);\n    return siblings.indexOf(element);\n  },\n  is: function is(element, nodeName) {\n    _assertIsDom(element, 'is');\n    var elementNodeName = element.nodeName.toLowerCase();\n    var names;\n    if (typeof nodeName === 'string') {\n      names = nodeName.split(/, ?/);\n    } else {\n      // Assume it is an Array. Promptly shoot self in foot.\n      names = nodeName;\n    }\n    names = names.map(function (name) {\n      return name.toLowerCase();\n    });\n    var expandedNames = [];\n    // Expand colon-prefixed selectors to sets of selectors.\n    names.forEach(function (name) {\n      switch (name) {\n        case ':input':\n          expandedNames = expandedNames.concat(['input', 'button', 'select', 'textarea']);\n          break;\n        default:\n          expandedNames.push(name);\n      }\n    });\n    return expandedNames.indexOf(elementNodeName) > -1;\n  },\n  setData: function setData(element, key, value) {\n    _assertIsDom(element, 'setData');\n    var dataKey = 'data-' + key;\n    var attrs = [];\n    attrs[dataKey] = value;\n    DOM.setAttributes(element, attrs);\n    DataSet(element);\n  },\n  getData: function getData(element, key) {\n    _assertIsDom(element, 'getData');\n    return DataSet(element)[key];\n  },\n  removeData: function removeData(element, key) {\n    _assertIsDom(element, 'removeData');\n    var dataKey = 'data-' + key;\n    element.removeAttribute(dataKey);\n    DataSet(element);\n  },\n  text: function text(element) {\n    _assertIsDom(element, 'text');\n    return element.textContent || element.innerText;\n  },\n  offset: function offset(element) {\n    _assertIsDom(element, 'offset');\n    return documentOffset(element);\n  },\n  isVisible: function isVisible(element) {\n    _assertIsDom(element, 'isVisible');\n    var display = DOM.getComputedStyle(element, 'display');\n    var visibility = DOM.getComputedStyle(element, 'visibility');\n    return !(display === 'none') && !(visibility === 'hidden');\n  }\n};\n\nmodule.exports = DOM;\n\n},{\"data-set\":230,\"document-offset\":231,\"dom-select\":232,\"is-dom\":236}],35:[function(require,module,exports){\n'use strict';\n\nvar Guideline = {\n  guidelines: {\n    wcag: {\n      /**\n       * Perform WCAG specific setup.\n       */\n      setup: function setup(tests, listener, callbacks) {\n        callbacks = callbacks || {};\n        // Associate Success Criteria with the TestCollection.\n        for (var sc in this.successCriteria) {\n          if (this.successCriteria.hasOwnProperty(sc)) {\n            var criteria = this.successCriteria[sc];\n            criteria.registerTests(tests);\n            if (listener && listener.listenTo && typeof listener.listenTo === 'function') {\n              // Allow the invoker to listen to successCriteriaEvaluated events\n              // on each SuccessCriteria.\n              if (callbacks.successCriteriaEvaluated) {\n                listener.listenTo(criteria, 'successCriteriaEvaluated', callbacks.successCriteriaEvaluated);\n              }\n            }\n          }\n        }\n      },\n      successCriteria: {}\n    }\n  }\n};\n\nmodule.exports = Guideline;\n\n},{}],36:[function(require,module,exports){\n/**\n * @providesModule Quail\n */\n\n'use strict';\n\nvar _extends = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }return target;\n};\n\nrequire('babel-polyfill');\n\nvar globalQuail = window.globalQuail || {};\n\nvar DOM = require('DOM');\nvar Guideline = require('Guideline');\nvar TestCollection = require('TestCollection');\nvar _Assessments = require('_Assessments');\n\nvar Quail = {\n  /**\n   * Main run function for Quail.\n   */\n  run: function run(options) {\n    function buildTests(assessmentList, options) {\n      var htmlElement = options.html || DOM.scry('html');\n      var keys = undefined;\n      // Create an empty TestCollection.\n      var testCollection = TestCollection([], {\n        scope: htmlElement\n      });\n      var assessmentsToRun = [];\n      if (assessmentList && assessmentList.length) {\n        assessmentsToRun = assessmentList;\n      } else {\n        keys = _Assessments.keys();\n        var key = undefined,\n            next = undefined;\n        do {\n          next = keys.next();\n          key = next.value;\n          assessmentsToRun.push(key);\n        } while (!next.done);\n      }\n      assessmentsToRun.forEach(function (name) {\n        var mod = _Assessments.get(name);\n        if (mod) {\n          testCollection.set(name, _extends({\n            scope: htmlElement,\n            callback: mod.run\n          }, mod.meta));\n        }\n      });\n      return testCollection;\n    }\n\n    /**\n     * A private, internal run function.\n     *\n     * This function is called when the tests are collected, which might occur\n     * after an AJAX request for a test JSON file.\n     */\n    function _run(testCollection) {\n      // Set up Guideline-specific behaviors.\n      var noop = function noop() {};\n      for (var guideline in Guideline) {\n        if (Guideline[guideline] && typeof Guideline[guideline].setup === 'function') {\n          Guideline[guideline].setup(testCollection, Quail, {\n            successCriteriaEvaluated: options.successCriteriaEvaluated || noop\n          });\n        }\n      }\n\n      // Invoke all the registered tests.\n      testCollection.run({\n        preFilter: options.preFilter || function () {},\n        caseResolve: options.caseResolve || function () {},\n        testComplete: options.testComplete || function () {},\n        testCollectionComplete: options.testCollectionComplete || function () {},\n        complete: options.complete || function () {}\n      });\n    }\n\n    // Let wcag2 run itself, will call Quail again when it knows what\n    // to\n    // if (options.guideline === 'wcag2') {\n    //   wcag2.run(options);\n    // }\n\n    // If a list of specific tests is provided, use them.\n    _run(buildTests(options.assessments, options));\n  },\n\n  // @todo, make this a set of methods that all classes extend.\n  listenTo: function listenTo(dispatcher, eventName, handler) {\n    handler = handler.bind(this);\n    dispatcher.registerListener.call(dispatcher, eventName, handler);\n  },\n\n  getConfiguration: function getConfiguration(testName) {\n    var test = this.tests.find(testName);\n    var guidelines = test && test.get('guidelines');\n    var guideline = guidelines && this.options.guidelineName && guidelines[this.options.guidelineName];\n    var configuration = guideline && guideline.configuration;\n    if (configuration) {\n      return configuration;\n    }\n    return false;\n  }\n};\n\nglobalQuail.run = globalQuail.run || function () {\n  Quail.run.apply(Quail, arguments);\n};\n\nwindow.globalQuail = globalQuail;\n\nmodule.exports = Quail;\n\n},{\"DOM\":34,\"Guideline\":35,\"TestCollection\":38,\"_Assessments\":39,\"babel-polyfill\":40}],37:[function(require,module,exports){\n'use strict';\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _typeof(obj) {\n  return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n}\n\nvar Case = require('Case');\n\nvar Test = function () {\n\n  /**\n   * A collection of Cases.\n   */\n  function Test(name, attributes) {\n    return new Test.fn.init(name, attributes);\n  }\n\n  // Prototype object of the Test.\n  Test.fn = Test.prototype = {\n    constructor: Test,\n    init: function init(name, attributes) {\n      this.listeners = {};\n      this.length = 0;\n      if (!name) {\n        return this;\n      }\n      this.attributes = attributes || {};\n      this.attributes.name = name;\n      this.attributes.status = 'untested';\n      this.attributes.complete = false;\n\n      return this;\n    },\n    // Setting a length property makes it behave like an array.\n    length: 0,\n    // Details of the test.\n    attributes: null,\n    get: function get(attr) {\n      return this.attributes[attr];\n    },\n    set: function set(attr, value) {\n      var isStatusChanged = false;\n      // Allow an object of attributes to be passed in.\n      if ((typeof attr === 'undefined' ? 'undefined' : _typeof(attr)) === 'object') {\n        for (var prop in attr) {\n          if (attr.hasOwnProperty(prop)) {\n            if (prop === 'status') {\n              isStatusChanged = true;\n            }\n            this.attributes[prop] = attr[prop];\n          }\n        }\n      }\n      // Assign a single attribute value.\n      else {\n          if (attr === 'status') {\n            isStatusChanged = true;\n          }\n          this.attributes[attr] = value;\n        }\n\n      if (isStatusChanged) {\n        this.resolve();\n      }\n      return this;\n    },\n    add: function add(_case) {\n      this.listenTo(_case, 'resolve', this.caseResponded);\n      this.listenTo(_case, 'timeout', this.caseResponded);\n      // If the case is already resolved because it has a status, then trigger\n      // its resolve event.\n      if (_case.status) {\n        _case.dispatch('resolve', _case);\n      }\n      this.push(_case);\n      return _case;\n    },\n    invoke: function invoke() {\n      var name = this.get('name');\n      // This test is already running.\n      if (this.testComplete) {\n        throw new Error('The test ' + name + ' is already running.');\n      }\n      // This test has already been run.\n      if (this.attributes.complete) {\n        throw new Error('The test ' + name + ' has already been run.');\n      }\n\n      var options = this.get('options');\n      var callback = this.get('callback');\n      var self = this;\n\n      // Set the test complete method to the closure function that dispatches\n      // the complete event. This method needs to be debounced so it is only\n      // called after a pause of invocations.\n      this.testComplete = debounce(testComplete.bind(this), 400);\n\n      // Invoke the complete dispatcher to prevent the test from never\n      // completing in the off chance that no Cases are created.\n      this.testComplete(false);\n\n      // Record the time the test started for performance monitoring.\n      var start = new Date();\n      this.set('startTime', start);\n\n      if (callback && typeof callback.call === 'function') {\n        try {\n          callback.call(self, self, options);\n        } catch (error) {\n          if (window.console && window.console.error) {\n            window.console.error(error.stack);\n          }\n        }\n      } else {\n        window.console.log('Skipping ' + name + ' because it does not have an associated method on Quail');\n      }\n\n      // Invoke the complete dispatcher to prevent the test from never\n      // completing in the off chance that no Cases are created.\n      this.testComplete();\n\n      return this;\n    },\n    /**\n     * Finds cases by their status.\n     */\n    findByStatus: function findByStatus(statuses) {\n      if (!statuses) {\n        return;\n      }\n      var test = new Test();\n      // A single status or an array of statuses is allowed. Always act on an\n      // array.\n      if (typeof statuses === 'string') {\n        statuses = [statuses];\n      }\n      // Loop the through the statuses and find tests with them.\n      for (var i = 0, il = statuses.length; i < il; ++i) {\n        var status = statuses[i];\n        // Loop through the cases.\n        this.forEach(function (_case) {\n          var caseStatus = _case.get('status');\n          if (caseStatus === status) {\n            test.add(_case);\n          }\n        });\n      }\n      return test;\n    },\n    /**\n     * Returns a set of cases with corresponding to th supplied selector.\n     */\n    findCasesBySelector: function findCasesBySelector(selector) {\n      var cases = this.groupCasesBySelector();\n      if (cases.hasOwnProperty(selector)) {\n        return cases[selector];\n      }\n      return new Test();\n    },\n    /**\n     * Returns a single Case object the matches the supplied HTML.\n     *\n     * We make the assumption, rightly or wrongly, that if the HTML is the\n     * same for a number of cases in a Test, then the outcome will also\n     * be the same, so only use this method if you are probing the result\n     * of the case, not other specifics of it.\n     *\n     * @param string html\n     *   A string representing an HTML structure.\n     *\n     * @needstests\n     */\n    findCaseByHtml: function findCaseByHtml(html) {\n      var _case;\n      for (var i = 0, il = this.length; i < il; ++i) {\n        _case = this[i];\n        if (html === _case.get('html')) {\n          return _case;\n        }\n      }\n      // Always return a Case object.\n      return Case();\n    },\n    /**\n     * Groups the cases by element selector.\n     *\n     * @return object\n     *  A hash of cases, keyed by the element selector.\n     */\n    groupCasesBySelector: function groupCasesBySelector() {\n      var casesBySelector = {};\n      // Loop through the cases.\n      this.forEach(function (_case) {\n        var selector = _case.get('selector');\n        if (!casesBySelector[selector]) {\n          casesBySelector[selector] = new Test();\n        }\n        casesBySelector[selector].add(_case);\n      });\n      return casesBySelector;\n    },\n    /**\n     * Groups the cases by serialized HTML string.\n     *\n     * @todo, the html string index needs to be hashed to a uniform length.\n     *\n     * @return object\n     *  A hash of cases, keyed by the element selector.\n     */\n    groupCasesByHtml: function groupCasesByHtml() {\n      var casesByHtml = {};\n      // Loop through the cases.\n      this.forEach(function (_case) {\n        var html = _case.get('html');\n        if (!casesByHtml[html]) {\n          casesByHtml[html] = new Test();\n        }\n        casesByHtml[html].add(_case);\n      });\n      return casesByHtml;\n    },\n    /**\n     * @needsdoc\n     */\n    getGuidelineCoverage: function getGuidelineCoverage(name) {\n      var config = this.get('guidelines');\n      return config && config[name] || {};\n    },\n    /**\n     * Adds the test that owns the Case to the set of arguments passed up to\n     * listeners of this test's cases.\n     */\n    caseResponded: function caseResponded(eventName, _case) {\n      this.dispatch(eventName, this, _case);\n      // Attempt to declare the Test complete.\n      if (typeof this.testComplete === 'function') {\n        this.testComplete();\n      }\n    },\n    /**\n     * Evaluates the test's cases and sets the test's status.\n     */\n    determineStatus: function determineStatus() {\n      // CantTell.\n      if (this.findByStatus(['cantTell']).length === this.length) {\n        this.set({\n          status: 'cantTell'\n        });\n      }\n      // inapplicable.\n      else if (this.findByStatus(['inapplicable']).length === this.length) {\n          this.set({\n            status: 'inapplicable'\n          });\n        }\n        // Failed.\n        else if (this.findByStatus(['failed', 'untested']).length) {\n            this.set({\n              status: 'failed'\n            });\n          } else {\n            this.set({\n              status: 'passed'\n            });\n          }\n    },\n    resolve: function resolve() {\n      this.dispatch('complete', this);\n    },\n    /**\n     * A stub method implementation.\n     *\n     * It is assigned a function value when the Test is invoked. See the\n     * testComplete function in outer scope.\n     */\n    testComplete: null,\n    // @todo, make this a set of methods that all classes extend.\n    listenTo: function listenTo(dispatcher, eventName, handler) {\n      handler = handler.bind(this);\n      dispatcher.registerListener.call(dispatcher, eventName, handler);\n    },\n    registerListener: function registerListener(eventName, handler) {\n      // nb: 'this' is the dispatcher object, not the one that invoked listenTo.\n      if (!this.listeners[eventName]) {\n        this.listeners[eventName] = [];\n      }\n\n      this.listeners[eventName].push(handler);\n    },\n    dispatch: function dispatch(eventName) {\n      if (this.listeners[eventName] && this.listeners[eventName].length) {\n        var eventArgs = [].slice.call(arguments);\n        this.listeners[eventName].forEach(function (handler) {\n          // Pass any additional arguments from the event dispatcher to the\n          // handler function.\n          handler.apply(null, eventArgs);\n        });\n      }\n    },\n    concat: [].concat,\n    forEach: [].forEach,\n    push: [].push,\n    sort: [].sort,\n    splice: [].splice\n  };\n\n  /**\n   * Dispatches the complete event.\n   *\n   * This function is meant to be bound to a Test as a method through\n   * a debounced proxy function.\n   */\n  function testComplete(complete) {\n    complete = typeof complete === 'undefined' ? true : complete;\n    // @todo, this iteration would be faster with _.findWhere, that breaks on\n    // the first match.\n    this.forEach(function (_case) {\n      if (!_case.get('status')) {\n        complete = false;\n      }\n    });\n    // If all the Cases have been evaluated, dispatch the event.\n    if (complete) {\n      // Set the end time for performance monitoring.\n      var end = new Date();\n      this.set('endTime', end);\n      // Null out the testComplete callback on this test.\n      this.testComplete = null;\n      // @todo, this should be set with the set method and a silent flag.\n      this.attributes.complete = true;\n      this.determineStatus();\n    }\n    // Otherwise attempt to the complete the Test again after the debounce\n    // period has expired.\n    else {\n        this.testComplete();\n      }\n  }\n\n  /**\n   * Limits the invocations of a function in a given time frame.\n   *\n   * Adapted from underscore.js. Replace with debounce from underscore once class\n   * loading with modules is in place.\n   *\n   * @param {Function} callback\n   *   The function to be invoked.\n   *\n   * @param {Number} wait\n   *   The time period within which the callback function should only be\n   *   invoked once. For example if the wait period is 250ms, then the callback\n   *   will only be called at most 4 times per second.\n   */\n  function debounce(func, wait, immediate) {\n    'use strict';\n\n    var timeout, result;\n    return function () {\n      var self = this;\n      var args = arguments;\n      var later = function later() {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(self, args);\n        }\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(self, args);\n      }\n      return result;\n    };\n  }\n\n  // Give the init function the Test prototype.\n  Test.fn.init.prototype = Test.fn;\n\n  return Test;\n}();\nmodule.exports = Test;\n\n},{\"Case\":33}],38:[function(require,module,exports){\n'use strict';\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _typeof(obj) {\n  return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n}\n\nvar Test = require('Test');\nvar TestCollection = function () {\n\n  /**\n   * A Collection of Tests.\n   */\n  function TestCollection(tests) {\n    return new TestCollection.fn.init(tests);\n  }\n\n  // Prototype object of the TestCollection.\n  TestCollection.fn = TestCollection.prototype = {\n    constructor: TestCollection,\n    init: function init(tests, options) {\n      this.listeners = {};\n      options = options || {};\n      if (!tests) {\n        return this;\n      }\n      if ((typeof tests === 'undefined' ? 'undefined' : _typeof(tests)) === 'object') {\n        var test;\n        for (var name in tests) {\n          if (tests.hasOwnProperty(name)) {\n            tests[name].scope = tests[name].scope || options.scope;\n            test = new Test(name, tests[name]);\n            this.listenTo(test, 'results', this.report);\n            this.push(test);\n          }\n        }\n        return this;\n      }\n      return this;\n    },\n    // Setting a length property makes it behave like an array.\n    length: 0,\n    // Invoke all the tests in a set.\n    run: function run(callbacks) {\n      var self = this;\n      callbacks = callbacks || {};\n      this.forEach(function (test) {\n        // Allow a prefilter to remove a case.\n        if (callbacks.preFilter) {\n          self.listenTo(test, 'resolve', function (eventName, test, _case) {\n            var result = callbacks.preFilter(eventName, test, _case);\n            if (result === false) {\n              // Manipulate the attributes directly so that change events\n              // are not triggered.\n              _case.attributes.status = 'untested';\n            }\n          });\n        }\n        // Allow the invoker to listen to resolve events on each Case.\n        if (callbacks.caseResolve) {\n          self.listenTo(test, 'resolve', callbacks.caseResolve);\n        }\n        // Allow the invoker to listen to complete events on each Test.\n        if (callbacks.testComplete) {\n          self.listenTo(test, 'complete', callbacks.testComplete);\n        }\n      });\n\n      // Allow the invoker to listen to complete events for the\n      // TestCollection.\n      if (callbacks.testCollectionComplete) {\n        self.listenTo(self, 'complete', callbacks.testCollectionComplete);\n      }\n\n      // Set the test complete method to the closure function that dispatches\n      // the complete event. This method needs to be debounced so it is\n      // only called after a pause of invocations.\n      this.testsComplete = debounce(testsComplete.bind(this), 500);\n\n      // Invoke each test.\n      this.forEach(function (test) {\n        test.invoke();\n      });\n\n      // Invoke the complete dispatcher to prevent the collection from never\n      // completing in the off chance that no Tests are run.\n      this.testsComplete();\n\n      return this;\n    },\n    /**\n     * Add a Test object to the set.\n     */\n    add: function add(test) {\n      // Don't add a test that already exists in this set.\n      if (!this.find(test.get('name'))) {\n        this.push(test);\n      }\n    },\n    /**\n     * Finds a test by its name.\n     */\n    find: function find(testname) {\n      for (var i = 0, il = this.length; i < il; ++i) {\n        if (this[i].get('name') === testname) {\n          return this[i];\n        }\n      }\n      return null;\n    },\n    /**\n     * @info, this should be a static method.\n     */\n    findByGuideline: function findByGuideline(guidelineName) {\n\n      var methods = {\n        wcag: function wcag(section, technique) {\n\n          function findAllTestsForTechnique(guidelineName, sectionId, techniqueName) {\n            // Return a TestCollection instance.\n            var tests = new TestCollection();\n            this.forEach(function (test) {\n              // Get the configured guidelines for the test.\n              var guidelines = test.get('guidelines');\n              // If this test is configured for this section and it has\n              // associated techniques, then loop thorugh them.\n              var testTechniques = guidelines[guidelineName] && guidelines[guidelineName][sectionId] && guidelines[guidelineName][sectionId].techniques;\n              if (testTechniques) {\n                for (var i = 0, il = testTechniques.length; i < il; ++i) {\n                  // If this test is configured for the techniqueName, add it\n                  // to the list of tests.\n                  if (testTechniques[i] === techniqueName) {\n                    tests.listenTo(test, 'results', tests.report);\n                    tests.add(test);\n                  }\n                }\n              }\n            });\n            return tests;\n          }\n          var sectionId = section.id;\n          var techniqueName = technique.get('name');\n          if (sectionId && techniqueName) {\n            return findAllTestsForTechnique.call(this, guidelineName, sectionId, techniqueName);\n          }\n        }\n      };\n      // Process the request using a specific guideline finding method.\n      // @todo, make these pluggable eventually.\n      if (methods[guidelineName]) {\n        var args = [].slice.call(arguments, 1);\n        return methods[guidelineName].apply(this, args);\n      }\n    },\n    /**\n     * Finds tests by their status.\n     */\n    findByStatus: function findByStatus(statuses) {\n      if (!statuses) {\n        return;\n      }\n      var tests = new TestCollection();\n      // A single status or an array of statuses is allowed. Always act on an\n      // array.\n      if (typeof statuses === 'string') {\n        statuses = [statuses];\n      }\n      // Loop the through the statuses and find tests with them.\n      for (var i = 0, il = statuses.length; i < il; ++i) {\n        var status = statuses[i];\n        // Loop through the tests.\n        this.forEach(function (test) {\n          var testStatus = test.get('status');\n          if (testStatus === status) {\n            tests.add(test);\n          }\n        });\n      }\n      return tests;\n    },\n    /**\n     * Create a new test from a name and details.\n     */\n    set: function set(testname, details) {\n      for (var i = 0, il = this.length; i < il; ++i) {\n        if (this[i].get('name') === testname) {\n          this[i].set(details);\n          return this[i];\n        }\n      }\n      var test = Test(testname, details);\n      this.push(test);\n      return test;\n    },\n    /**\n     * A stub method implementation.\n     *\n     * It is assigned a function value when the collection is run. See the\n     * testsComplete function in outer scope.\n     */\n    testsComplete: null,\n    report: function report() {\n      this.dispatch.apply(this, arguments);\n    },\n    // @todo, make this a set of methods that all classes extend.\n    listenTo: function listenTo(dispatcher, eventName, handler) {\n      handler = handler.bind(this);\n      dispatcher.registerListener.call(dispatcher, eventName, handler);\n    },\n    registerListener: function registerListener(eventName, handler) {\n      // nb: 'this' is the dispatcher object, not the one that invoked listenTo.\n      if (!this.listeners[eventName]) {\n        this.listeners[eventName] = [];\n      }\n\n      this.listeners[eventName].push(handler);\n    },\n    dispatch: function dispatch(eventName) {\n      if (this.listeners[eventName] && this.listeners[eventName].length) {\n        var eventArgs = [].slice.call(arguments);\n        this.listeners[eventName].forEach(function (handler) {\n          // Pass any additional arguments from the event dispatcher to the\n          // handler function.\n          handler.apply(null, eventArgs);\n        });\n      }\n    },\n    forEach: [].forEach,\n    push: [].push,\n    sort: [].sort,\n    splice: [].splice\n  };\n\n  /**\n   * Dispatches the complete event.\n   *\n   * This function is meant to be bound to a Test as a method through\n   * a debounced proxy function.\n   */\n  function testsComplete() {\n    var complete = true;\n    // @todo, this iteration would be faster with _.findWhere, that breaks on\n    // the first match.\n    this.forEach(function (test) {\n      if (!test.get('complete')) {\n        complete = false;\n      }\n    });\n    // If all the Tests have completed, dispatch the event.\n    if (complete) {\n      this.testsComplete = null;\n      this.dispatch('complete', this);\n    }\n    // Otherwise attempt to the complete the Tests again after the debounce\n    // period has expired.\n    else {\n        this.testsComplete();\n      }\n  }\n\n  /**\n   * Limits the invocations of a function in a given time frame.\n   *\n   * Adapted from underscore.js. Replace with debounce from underscore once class\n   * loading with modules is in place.\n   *\n   * @param {Function} callback\n   *   The function to be invoked.\n   *\n   * @param {Number} wait\n   *   The time period within which the callback function should only be\n   *   invoked once. For example if the wait period is 250ms, then the callback\n   *   will only be called at most 4 times per second.\n   */\n  function debounce(func, wait, immediate) {\n    'use strict';\n\n    var timeout, result;\n    return function () {\n      var self = this;\n      var args = arguments;\n      var later = function later() {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(self, args);\n        }\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(self, args);\n      }\n      return result;\n    };\n  }\n\n  // Give the init function the TestCollection prototype.\n  TestCollection.fn.init.prototype = TestCollection.fn;\n\n  return TestCollection;\n}();\nmodule.exports = TestCollection;\n\n},{\"Test\":37}],39:[function(require,module,exports){\n'use strict';\n\nvar WhiteSpaceNotUsedForFormatting = require('WhiteSpaceNotUsedForFormatting');\nvar WhiteSpaceInWord = require('WhiteSpaceInWord');\nvar VideosEmbeddedOrLinkedNeedCaptions = require('VideosEmbeddedOrLinkedNeedCaptions');\nvar VideoMayBePresent = require('VideoMayBePresent');\nvar TextareaHasAssociatedLabel = require('TextareaHasAssociatedLabel');\nvar TextIsNotSmall = require('TextIsNotSmall');\nvar TabularDataIsInTable = require('TabularDataIsInTable');\nvar TableUsesScopeForRow = require('TableUsesScopeForRow');\nvar TableUsesCaption = require('TableUsesCaption');\nvar TableUsesAbbreviationForHeader = require('TableUsesAbbreviationForHeader');\nvar TableUseColGroup = require('TableUseColGroup');\nvar TableSummaryIsNotTooLong = require('TableSummaryIsNotTooLong');\nvar TableSummaryIsEmpty = require('TableSummaryIsEmpty');\nvar TableSummaryDoesNotDuplicateCaption = require('TableSummaryDoesNotDuplicateCaption');\nvar TableShouldUseHeaderIDs = require('TableShouldUseHeaderIDs');\nvar TableNotUsedForLayout = require('TableNotUsedForLayout');\nvar TableLayoutMakesSenseLinearized = require('TableLayoutMakesSenseLinearized');\nvar TableLayoutHasNoSummary = require('TableLayoutHasNoSummary');\nvar TableLayoutHasNoCaption = require('TableLayoutHasNoCaption');\nvar TableLayoutDataShouldNotHaveTh = require('TableLayoutDataShouldNotHaveTh');\nvar TableDataShouldHaveTh = require('TableDataShouldHaveTh');\nvar TabIndexFollowsLogicalOrder = require('TabIndexFollowsLogicalOrder');\nvar SvgContainsTitle = require('SvgContainsTitle');\nvar SkipToContentLinkProvided = require('SkipToContentLinkProvided');\nvar SiteMap = require('SiteMap');\nvar SelectJumpMenu = require('SelectJumpMenu');\nvar SelectHasAssociatedLabel = require('SelectHasAssociatedLabel');\nvar ScriptOnmouseupHasOnkeyup = require('ScriptOnmouseupHasOnkeyup');\nvar ScriptOnmouseoverHasOnfocus = require('ScriptOnmouseoverHasOnfocus');\nvar ScriptOnmouseoutHasOnmouseblur = require('ScriptOnmouseoutHasOnmouseblur');\nvar ScriptOnmousemove = require('ScriptOnmousemove');\nvar ScriptOnmousedownRequiresOnKeypress = require('ScriptOnmousedownRequiresOnKeypress');\nvar ScriptOndblclickRequiresOnKeypress = require('ScriptOndblclickRequiresOnKeypress');\nvar ScriptOnclickRequiresOnKeypress = require('ScriptOnclickRequiresOnKeypress');\nvar RadioHasLabel = require('RadioHasLabel');\nvar PreShouldNotBeUsedForTabularLayout = require('PreShouldNotBeUsedForTabularLayout');\nvar PasswordHasLabel = require('PasswordHasLabel');\nvar PNotUsedAsHeader = require('PNotUsedAsHeader');\nvar ObjectMustHaveValidTitle = require('ObjectMustHaveValidTitle');\nvar ObjectMustHaveTitle = require('ObjectMustHaveTitle');\nvar ObjectMustHaveEmbed = require('ObjectMustHaveEmbed');\nvar ObjectMustContainText = require('ObjectMustContainText');\nvar NewWindowIsOpened = require('NewWindowIsOpened');\nvar MarqueeIsNotUsed = require('MarqueeIsNotUsed');\nvar ListOfLinksUseList = require('ListOfLinksUseList');\nvar ListNotUsedForFormatting = require('ListNotUsedForFormatting');\nvar LinkHasAUniqueContext = require('LinkHasAUniqueContext');\nvar LiDontUseImageForBullet = require('LiDontUseImageForBullet');\nvar LegendTextNotPlaceholder = require('LegendTextNotPlaceholder');\nvar LegendTextNotEmpty = require('LegendTextNotEmpty');\nvar LanguageUnicodeDirection = require('LanguageUnicodeDirection');\nvar LanguageDirectionPunctuation = require('LanguageDirectionPunctuation');\nvar LanguageDirAttributeIsUsed = require('LanguageDirAttributeIsUsed');\nvar LabelsAreAssignedToAnInput = require('LabelsAreAssignedToAnInput');\nvar LabelMustNotBeEmpty = require('LabelMustNotBeEmpty');\nvar LabelMustBeUnique = require('LabelMustBeUnique');\nvar LabelDoesNotContainInput = require('LabelDoesNotContainInput');\nvar InputWithoutLabelHasTitle = require('InputWithoutLabelHasTitle');\nvar InputTextValueNotEmpty = require('InputTextValueNotEmpty');\nvar InputTextHasValue = require('InputTextHasValue');\nvar InputTextHasLabel = require('InputTextHasLabel');\nvar InputImageHasAlt = require('InputImageHasAlt');\nvar InputImageAltNotRedundant = require('InputImageAltNotRedundant');\nvar InputImageAltIsShort = require('InputImageAltIsShort');\nvar InputImageAltIsNotPlaceholder = require('InputImageAltIsNotPlaceholder');\nvar InputImageAltIsNotFileName = require('InputImageAltIsNotFileName');\nvar InputElementsDontHaveAlt = require('InputElementsDontHaveAlt');\nvar InputCheckboxRequiresFieldset = require('InputCheckboxRequiresFieldset');\nvar ImgWithMapHasUseMap = require('ImgWithMapHasUseMap');\nvar ImgShouldNotHaveTitle = require('ImgShouldNotHaveTitle');\nvar ImgServerSideMapNotUsed = require('ImgServerSideMapNotUsed');\nvar ImgNonDecorativeHasAlt = require('ImgNonDecorativeHasAlt');\nvar ImgImportantNoSpacerAlt = require('ImgImportantNoSpacerAlt');\nvar ImgHasLongDesc = require('ImgHasLongDesc');\nvar ImgHasAlt = require('ImgHasAlt');\nvar ImgAltNotPlaceHolder = require('ImgAltNotPlaceHolder');\nvar ImgAltNotEmptyInAnchor = require('ImgAltNotEmptyInAnchor');\nvar ImgAltIsTooLong = require('ImgAltIsTooLong');\nvar ImgAltIsDifferent = require('ImgAltIsDifferent');\nvar ImageMapServerSide = require('ImageMapServerSide');\nvar IframeMustNotHaveLongdesc = require('IframeMustNotHaveLongdesc');\nvar IdrefsHasCorrespondingId = require('IdrefsHasCorrespondingId');\nvar IIsNotUsed = require('IIsNotUsed');\nvar HeadersUseToMarkSections = require('HeadersUseToMarkSections');\nvar HeadersHaveText = require('HeadersHaveText');\nvar HeadersAttrRefersToATableCell = require('HeadersAttrRefersToATableCell');\nvar HeaderH6Format = require('HeaderH6Format');\nvar HeaderH5Format = require('HeaderH5Format');\nvar HeaderH4Format = require('HeaderH4Format');\nvar HeaderH4 = require('HeaderH4');\nvar HeaderH3Format = require('HeaderH3Format');\nvar HeaderH3 = require('HeaderH3');\nvar HeaderH2Format = require('HeaderH2Format');\nvar HeaderH2 = require('HeaderH2');\nvar HeaderH1Format = require('HeaderH1Format');\nvar HeaderH1 = require('HeaderH1');\nvar FormWithRequiredLabel = require('FormWithRequiredLabel');\nvar FormHasSubmitButton = require('FormHasSubmitButton');\nvar FormHasGoodErrorMessage = require('FormHasGoodErrorMessage');\nvar FormErrorMessageHelpsUser = require('FormErrorMessageHelpsUser');\nvar FormButtonsHaveValue = require('FormButtonsHaveValue');\nvar FontIsNotUsed = require('FontIsNotUsed');\nvar FileHasLabel = require('FileHasLabel');\nvar FieldsetHasLabel = require('FieldsetHasLabel');\nvar EmbedMustHaveAltAttribute = require('EmbedMustHaveAltAttribute');\nvar EmbedHasAssociatedNoEmbed = require('EmbedHasAssociatedNoEmbed');\nvar DocumentVisualListsAreMarkedUp = require('DocumentVisualListsAreMarkedUp');\nvar DocumentTitleNotEmpty = require('DocumentTitleNotEmpty');\nvar DocumentTitleIsShort = require('DocumentTitleIsShort');\nvar DocumentTitleIsNotPlaceholder = require('DocumentTitleIsNotPlaceholder');\nvar DocumentTitleDescribesDocument = require('DocumentTitleDescribesDocument');\nvar DocumentStrictDocType = require('DocumentStrictDocType');\nvar DocumentReadingDirection = require('DocumentReadingDirection');\nvar DocumentMetaNotUsedWithTimeout = require('DocumentMetaNotUsedWithTimeout');\nvar DocumentLangNotIdentified = require('DocumentLangNotIdentified');\nvar DocumentLangIsISO639Standard = require('DocumentLangIsISO639Standard');\nvar DocumentIsWrittenClearly = require('DocumentIsWrittenClearly');\nvar DocumentHasTitleElement = require('DocumentHasTitleElement');\nvar DocumentContentReadableWithoutStylesheets = require('DocumentContentReadableWithoutStylesheets');\nvar DocumentAutoRedirectNotUsed = require('DocumentAutoRedirectNotUsed');\nvar DocumentAcronymsHaveElement = require('DocumentAcronymsHaveElement');\nvar DoctypeProvided = require('DoctypeProvided');\nvar DefinitionListsAreUsed = require('DefinitionListsAreUsed');\nvar CssDocumentMakesSenseStyleTurnedOff = require('CssDocumentMakesSenseStyleTurnedOff');\nvar ColorFontContrast = require('ColorFontContrast');\nvar ColorElementBehindContrast = require('ColorElementBehindContrast');\nvar ColorElementBehindBackgroundImageContrast = require('ColorElementBehindBackgroundImageContrast');\nvar ColorElementBehindBackgroundGradientContrast = require('ColorElementBehindBackgroundGradientContrast');\nvar ColorBackgroundImageContrast = require('ColorBackgroundImageContrast');\nvar ColorBackgroundGradientContrast = require('ColorBackgroundGradientContrast');\nvar CheckboxHasLabel = require('CheckboxHasLabel');\nvar ButtonHasName = require('ButtonHasName');\nvar BoldIsNotUsed = require('BoldIsNotUsed');\nvar BlockquoteUseForQuotations = require('BlockquoteUseForQuotations');\nvar BlockquoteNotUsedForIndentation = require('BlockquoteNotUsedForIndentation');\nvar BlinkIsNotUsed = require('BlinkIsNotUsed');\nvar BasefontIsNotUsed = require('BasefontIsNotUsed');\nvar AudioMayBePresent = require('AudioMayBePresent');\nvar AreaLinksToSoundFile = require('AreaLinksToSoundFile');\nvar AreaHasAltValue = require('AreaHasAltValue');\nvar AreaDontOpenNewWindow = require('AreaDontOpenNewWindow');\nvar AreaAltRefersToText = require('AreaAltRefersToText');\nvar AreaAltIdentifiesDestination = require('AreaAltIdentifiesDestination');\nvar AnimatedGifMayBePresent = require('AnimatedGifMayBePresent');\nvar ATitleDescribesDestination = require('ATitleDescribesDestination');\nvar ASuspiciousLinkText = require('ASuspiciousLinkText');\nvar AppletsDonotUseColorAlone = require('AppletsDonotUseColorAlone');\nvar AppletsDoNotFlicker = require('AppletsDoNotFlicker');\nvar AppletUIMustBeAccessible = require('AppletUIMustBeAccessible');\nvar AppletTextEquivalentsGetUpdated = require('AppletTextEquivalentsGetUpdated');\nvar AppletProvidesMechanismToReturnToParent = require('AppletProvidesMechanismToReturnToParent');\nvar AppletContainsTextEquivalentInAlt = require('AppletContainsTextEquivalentInAlt');\nvar AppletContainsTextEquivalent = require('AppletContainsTextEquivalent');\nvar AMustNotHaveJavascriptHref = require('AMustNotHaveJavascriptHref');\nvar AMustHaveTitle = require('AMustHaveTitle');\nvar AMustContainText = require('AMustContainText');\nvar AMultimediaTextAlternative = require('AMultimediaTextAlternative');\nvar ALinksToSoundFilesNeedTranscripts = require('ALinksToSoundFilesNeedTranscripts');\nvar ALinksToMultiMediaRequireTranscript = require('ALinksToMultiMediaRequireTranscript');\nvar ALinksNotSeparatedBySymbols = require('ALinksNotSeparatedBySymbols');\nvar ALinksDontOpenNewWindow = require('ALinksDontOpenNewWindow');\nvar ALinksAreSeparatedByPrintableCharacters = require('ALinksAreSeparatedByPrintableCharacters');\nvar ALinkWithNonText = require('ALinkWithNonText');\nvar ALinkTextDoesNotBeginWithRedundantWord = require('ALinkTextDoesNotBeginWithRedundantWord');\nvar AInPHasADistinctStyle = require('AInPHasADistinctStyle');\nvar AImgAltNotRepetitive = require('AImgAltNotRepetitive');\nvar AAdjacentWithSameResourceShouldBeCombined = require('AAdjacentWithSameResourceShouldBeCombined');\nvar map = new Map();\nmap.set('aAdjacentWithSameResourceShouldBeCombined', AAdjacentWithSameResourceShouldBeCombined);\nmap.set('aImgAltNotRepetitive', AImgAltNotRepetitive);\nmap.set('aInPHasADistinctStyle', AInPHasADistinctStyle);\nmap.set('aLinkTextDoesNotBeginWithRedundantWord', ALinkTextDoesNotBeginWithRedundantWord);\nmap.set('aLinkWithNonText', ALinkWithNonText);\nmap.set('aLinksAreSeparatedByPrintableCharacters', ALinksAreSeparatedByPrintableCharacters);\nmap.set('aLinksDontOpenNewWindow', ALinksDontOpenNewWindow);\nmap.set('aLinksNotSeparatedBySymbols', ALinksNotSeparatedBySymbols);\nmap.set('aLinksToMultiMediaRequireTranscript', ALinksToMultiMediaRequireTranscript);\nmap.set('aLinksToSoundFilesNeedTranscripts', ALinksToSoundFilesNeedTranscripts);\nmap.set('aMultimediaTextAlternative', AMultimediaTextAlternative);\nmap.set('aMustContainText', AMustContainText);\nmap.set('aMustHaveTitle', AMustHaveTitle);\nmap.set('aMustNotHaveJavascriptHref', AMustNotHaveJavascriptHref);\nmap.set('appletContainsTextEquivalent', AppletContainsTextEquivalent);\nmap.set('appletContainsTextEquivalentInAlt', AppletContainsTextEquivalentInAlt);\nmap.set('appletProvidesMechanismToReturnToParent', AppletProvidesMechanismToReturnToParent);\nmap.set('appletTextEquivalentsGetUpdated', AppletTextEquivalentsGetUpdated);\nmap.set('appletUIMustBeAccessible', AppletUIMustBeAccessible);\nmap.set('appletsDoNotFlicker', AppletsDoNotFlicker);\nmap.set('appletsDonotUseColorAlone', AppletsDonotUseColorAlone);\nmap.set('aSuspiciousLinkText', ASuspiciousLinkText);\nmap.set('aTitleDescribesDestination', ATitleDescribesDestination);\nmap.set('animatedGifMayBePresent', AnimatedGifMayBePresent);\nmap.set('areaAltIdentifiesDestination', AreaAltIdentifiesDestination);\nmap.set('areaAltRefersToText', AreaAltRefersToText);\nmap.set('areaDontOpenNewWindow', AreaDontOpenNewWindow);\nmap.set('areaHasAltValue', AreaHasAltValue);\nmap.set('areaLinksToSoundFile', AreaLinksToSoundFile);\nmap.set('audioMayBePresent', AudioMayBePresent);\nmap.set('basefontIsNotUsed', BasefontIsNotUsed);\nmap.set('blinkIsNotUsed', BlinkIsNotUsed);\nmap.set('blockquoteNotUsedForIndentation', BlockquoteNotUsedForIndentation);\nmap.set('blockquoteUseForQuotations', BlockquoteUseForQuotations);\nmap.set('boldIsNotUsed', BoldIsNotUsed);\nmap.set('buttonHasName', ButtonHasName);\nmap.set('checkboxHasLabel', CheckboxHasLabel);\nmap.set('colorBackgroundGradientContrast', ColorBackgroundGradientContrast);\nmap.set('colorBackgroundImageContrast', ColorBackgroundImageContrast);\nmap.set('colorElementBehindBackgroundGradientContrast', ColorElementBehindBackgroundGradientContrast);\nmap.set('colorElementBehindBackgroundImageContrast', ColorElementBehindBackgroundImageContrast);\nmap.set('colorElementBehindContrast', ColorElementBehindContrast);\nmap.set('colorFontContrast', ColorFontContrast);\nmap.set('cssDocumentMakesSenseStyleTurnedOff', CssDocumentMakesSenseStyleTurnedOff);\nmap.set('definitionListsAreUsed', DefinitionListsAreUsed);\nmap.set('doctypeProvided', DoctypeProvided);\nmap.set('documentAcronymsHaveElement', DocumentAcronymsHaveElement);\nmap.set('documentAutoRedirectNotUsed', DocumentAutoRedirectNotUsed);\nmap.set('documentContentReadableWithoutStylesheets', DocumentContentReadableWithoutStylesheets);\nmap.set('documentHasTitleElement', DocumentHasTitleElement);\nmap.set('documentIsWrittenClearly', DocumentIsWrittenClearly);\nmap.set('documentLangIsISO639Standard', DocumentLangIsISO639Standard);\nmap.set('documentLangNotIdentified', DocumentLangNotIdentified);\nmap.set('documentMetaNotUsedWithTimeout', DocumentMetaNotUsedWithTimeout);\nmap.set('documentReadingDirection', DocumentReadingDirection);\nmap.set('documentStrictDocType', DocumentStrictDocType);\nmap.set('documentTitleDescribesDocument', DocumentTitleDescribesDocument);\nmap.set('documentTitleIsNotPlaceholder', DocumentTitleIsNotPlaceholder);\nmap.set('documentTitleIsShort', DocumentTitleIsShort);\nmap.set('documentTitleNotEmpty', DocumentTitleNotEmpty);\nmap.set('documentVisualListsAreMarkedUp', DocumentVisualListsAreMarkedUp);\nmap.set('embedHasAssociatedNoEmbed', EmbedHasAssociatedNoEmbed);\nmap.set('embedMustHaveAltAttribute', EmbedMustHaveAltAttribute);\nmap.set('fieldsetHasLabel', FieldsetHasLabel);\nmap.set('fileHasLabel', FileHasLabel);\nmap.set('fontIsNotUsed', FontIsNotUsed);\nmap.set('formButtonsHaveValue', FormButtonsHaveValue);\nmap.set('formErrorMessageHelpsUser', FormErrorMessageHelpsUser);\nmap.set('formHasGoodErrorMessage', FormHasGoodErrorMessage);\nmap.set('formHasSubmitButton', FormHasSubmitButton);\nmap.set('formWithRequiredLabel', FormWithRequiredLabel);\nmap.set('headerH1', HeaderH1);\nmap.set('headerH1Format', HeaderH1Format);\nmap.set('headerH2', HeaderH2);\nmap.set('headerH2Format', HeaderH2Format);\nmap.set('headerH3', HeaderH3);\nmap.set('headerH3Format', HeaderH3Format);\nmap.set('headerH4', HeaderH4);\nmap.set('headerH4Format', HeaderH4Format);\nmap.set('headerH5Format', HeaderH5Format);\nmap.set('headerH6Format', HeaderH6Format);\nmap.set('headersAttrRefersToATableCell', HeadersAttrRefersToATableCell);\nmap.set('headersHaveText', HeadersHaveText);\nmap.set('headersUseToMarkSections', HeadersUseToMarkSections);\nmap.set('iIsNotUsed', IIsNotUsed);\nmap.set('idrefsHasCorrespondingId', IdrefsHasCorrespondingId);\nmap.set('iframeMustNotHaveLongdesc', IframeMustNotHaveLongdesc);\nmap.set('imageMapServerSide', ImageMapServerSide);\nmap.set('imgAltIsDifferent', ImgAltIsDifferent);\nmap.set('imgAltIsTooLong', ImgAltIsTooLong);\nmap.set('imgAltNotEmptyInAnchor', ImgAltNotEmptyInAnchor);\nmap.set('imgAltNotPlaceHolder', ImgAltNotPlaceHolder);\nmap.set('imgHasAlt', ImgHasAlt);\nmap.set('imgHasLongDesc', ImgHasLongDesc);\nmap.set('imgImportantNoSpacerAlt', ImgImportantNoSpacerAlt);\nmap.set('imgNonDecorativeHasAlt', ImgNonDecorativeHasAlt);\nmap.set('imgServerSideMapNotUsed', ImgServerSideMapNotUsed);\nmap.set('imgShouldNotHaveTitle', ImgShouldNotHaveTitle);\nmap.set('imgWithMapHasUseMap', ImgWithMapHasUseMap);\nmap.set('inputCheckboxRequiresFieldset', InputCheckboxRequiresFieldset);\nmap.set('inputElementsDontHaveAlt', InputElementsDontHaveAlt);\nmap.set('inputImageAltIsNotFileName', InputImageAltIsNotFileName);\nmap.set('inputImageAltIsNotPlaceholder', InputImageAltIsNotPlaceholder);\nmap.set('inputImageAltIsShort', InputImageAltIsShort);\nmap.set('inputImageAltNotRedundant', InputImageAltNotRedundant);\nmap.set('inputImageHasAlt', InputImageHasAlt);\nmap.set('inputTextHasLabel', InputTextHasLabel);\nmap.set('inputTextHasValue', InputTextHasValue);\nmap.set('inputTextValueNotEmpty', InputTextValueNotEmpty);\nmap.set('inputWithoutLabelHasTitle', InputWithoutLabelHasTitle);\nmap.set('labelDoesNotContainInput', LabelDoesNotContainInput);\nmap.set('labelMustBeUnique', LabelMustBeUnique);\nmap.set('labelMustNotBeEmpty', LabelMustNotBeEmpty);\nmap.set('labelsAreAssignedToAnInput', LabelsAreAssignedToAnInput);\nmap.set('languageDirAttributeIsUsed', LanguageDirAttributeIsUsed);\nmap.set('languageDirectionPunctuation', LanguageDirectionPunctuation);\nmap.set('languageUnicodeDirection', LanguageUnicodeDirection);\nmap.set('legendTextNotEmpty', LegendTextNotEmpty);\nmap.set('legendTextNotPlaceholder', LegendTextNotPlaceholder);\nmap.set('liDontUseImageForBullet', LiDontUseImageForBullet);\nmap.set('linkHasAUniqueContext', LinkHasAUniqueContext);\nmap.set('listNotUsedForFormatting', ListNotUsedForFormatting);\nmap.set('listOfLinksUseList', ListOfLinksUseList);\nmap.set('marqueeIsNotUsed', MarqueeIsNotUsed);\nmap.set('newWindowIsOpened', NewWindowIsOpened);\nmap.set('objectMustContainText', ObjectMustContainText);\nmap.set('objectMustHaveEmbed', ObjectMustHaveEmbed);\nmap.set('objectMustHaveTitle', ObjectMustHaveTitle);\nmap.set('objectMustHaveValidTitle', ObjectMustHaveValidTitle);\nmap.set('pNotUsedAsHeader', PNotUsedAsHeader);\nmap.set('passwordHasLabel', PasswordHasLabel);\nmap.set('preShouldNotBeUsedForTabularLayout', PreShouldNotBeUsedForTabularLayout);\nmap.set('radioHasLabel', RadioHasLabel);\nmap.set('scriptOnclickRequiresOnKeypress', ScriptOnclickRequiresOnKeypress);\nmap.set('scriptOndblclickRequiresOnKeypress', ScriptOndblclickRequiresOnKeypress);\nmap.set('scriptOnmousedownRequiresOnKeypress', ScriptOnmousedownRequiresOnKeypress);\nmap.set('scriptOnmousemove', ScriptOnmousemove);\nmap.set('scriptOnmouseoutHasOnmouseblur', ScriptOnmouseoutHasOnmouseblur);\nmap.set('scriptOnmouseoverHasOnfocus', ScriptOnmouseoverHasOnfocus);\nmap.set('scriptOnmouseupHasOnkeyup', ScriptOnmouseupHasOnkeyup);\nmap.set('selectHasAssociatedLabel', SelectHasAssociatedLabel);\nmap.set('selectJumpMenu', SelectJumpMenu);\nmap.set('siteMap', SiteMap);\nmap.set('skipToContentLinkProvided', SkipToContentLinkProvided);\nmap.set('svgContainsTitle', SvgContainsTitle);\nmap.set('tabIndexFollowsLogicalOrder', TabIndexFollowsLogicalOrder);\nmap.set('tableDataShouldHaveTh', TableDataShouldHaveTh);\nmap.set('tableLayoutDataShouldNotHaveTh', TableLayoutDataShouldNotHaveTh);\nmap.set('tableLayoutHasNoCaption', TableLayoutHasNoCaption);\nmap.set('tableLayoutHasNoSummary', TableLayoutHasNoSummary);\nmap.set('tableLayoutMakesSenseLinearized', TableLayoutMakesSenseLinearized);\nmap.set('tableNotUsedForLayout', TableNotUsedForLayout);\nmap.set('tableShouldUseHeaderIDs', TableShouldUseHeaderIDs);\nmap.set('tableSummaryDoesNotDuplicateCaption', TableSummaryDoesNotDuplicateCaption);\nmap.set('tableSummaryIsEmpty', TableSummaryIsEmpty);\nmap.set('tableSummaryIsNotTooLong', TableSummaryIsNotTooLong);\nmap.set('tableUseColGroup', TableUseColGroup);\nmap.set('tableUsesAbbreviationForHeader', TableUsesAbbreviationForHeader);\nmap.set('tableUsesCaption', TableUsesCaption);\nmap.set('tableUsesScopeForRow', TableUsesScopeForRow);\nmap.set('tabularDataIsInTable', TabularDataIsInTable);\nmap.set('textIsNotSmall', TextIsNotSmall);\nmap.set('textareaHasAssociatedLabel', TextareaHasAssociatedLabel);\nmap.set('videoMayBePresent', VideoMayBePresent);\nmap.set('videosEmbeddedOrLinkedNeedCaptions', VideosEmbeddedOrLinkedNeedCaptions);\nmap.set('whiteSpaceInWord', WhiteSpaceInWord);\nmap.set('whiteSpaceNotUsedForFormatting', WhiteSpaceNotUsedForFormatting);\nmodule.exports = map;\n\n},{\"AAdjacentWithSameResourceShouldBeCombined\":241,\"AImgAltNotRepetitive\":242,\"AInPHasADistinctStyle\":243,\"ALinkTextDoesNotBeginWithRedundantWord\":244,\"ALinkWithNonText\":245,\"ALinksAreSeparatedByPrintableCharacters\":246,\"ALinksDontOpenNewWindow\":247,\"ALinksNotSeparatedBySymbols\":248,\"ALinksToMultiMediaRequireTranscript\":249,\"ALinksToSoundFilesNeedTranscripts\":250,\"AMultimediaTextAlternative\":251,\"AMustContainText\":252,\"AMustHaveTitle\":253,\"AMustNotHaveJavascriptHref\":254,\"ASuspiciousLinkText\":255,\"ATitleDescribesDestination\":256,\"AnimatedGifMayBePresent\":257,\"AppletContainsTextEquivalent\":258,\"AppletContainsTextEquivalentInAlt\":259,\"AppletProvidesMechanismToReturnToParent\":260,\"AppletTextEquivalentsGetUpdated\":261,\"AppletUIMustBeAccessible\":262,\"AppletsDoNotFlicker\":263,\"AppletsDonotUseColorAlone\":264,\"AreaAltIdentifiesDestination\":265,\"AreaAltRefersToText\":266,\"AreaDontOpenNewWindow\":267,\"AreaHasAltValue\":268,\"AreaLinksToSoundFile\":269,\"AudioMayBePresent\":270,\"BasefontIsNotUsed\":271,\"BlinkIsNotUsed\":272,\"BlockquoteNotUsedForIndentation\":273,\"BlockquoteUseForQuotations\":274,\"BoldIsNotUsed\":275,\"ButtonHasName\":276,\"CheckboxHasLabel\":277,\"ColorBackgroundGradientContrast\":278,\"ColorBackgroundImageContrast\":279,\"ColorElementBehindBackgroundGradientContrast\":280,\"ColorElementBehindBackgroundImageContrast\":281,\"ColorElementBehindContrast\":282,\"ColorFontContrast\":283,\"CssDocumentMakesSenseStyleTurnedOff\":284,\"DefinitionListsAreUsed\":285,\"DoctypeProvided\":286,\"DocumentAcronymsHaveElement\":287,\"DocumentAutoRedirectNotUsed\":288,\"DocumentContentReadableWithoutStylesheets\":289,\"DocumentHasTitleElement\":290,\"DocumentIsWrittenClearly\":291,\"DocumentLangIsISO639Standard\":292,\"DocumentLangNotIdentified\":293,\"DocumentMetaNotUsedWithTimeout\":294,\"DocumentReadingDirection\":295,\"DocumentStrictDocType\":296,\"DocumentTitleDescribesDocument\":297,\"DocumentTitleIsNotPlaceholder\":298,\"DocumentTitleIsShort\":299,\"DocumentTitleNotEmpty\":300,\"DocumentVisualListsAreMarkedUp\":301,\"EmbedHasAssociatedNoEmbed\":302,\"EmbedMustHaveAltAttribute\":303,\"FieldsetHasLabel\":304,\"FileHasLabel\":305,\"FontIsNotUsed\":306,\"FormButtonsHaveValue\":307,\"FormErrorMessageHelpsUser\":308,\"FormHasGoodErrorMessage\":309,\"FormHasSubmitButton\":310,\"FormWithRequiredLabel\":311,\"HeaderH1\":312,\"HeaderH1Format\":313,\"HeaderH2\":314,\"HeaderH2Format\":315,\"HeaderH3\":316,\"HeaderH3Format\":317,\"HeaderH4\":318,\"HeaderH4Format\":319,\"HeaderH5Format\":320,\"HeaderH6Format\":321,\"HeadersAttrRefersToATableCell\":322,\"HeadersHaveText\":323,\"HeadersUseToMarkSections\":324,\"IIsNotUsed\":325,\"IdrefsHasCorrespondingId\":326,\"IframeMustNotHaveLongdesc\":327,\"ImageMapServerSide\":328,\"ImgAltIsDifferent\":329,\"ImgAltIsTooLong\":330,\"ImgAltNotEmptyInAnchor\":331,\"ImgAltNotPlaceHolder\":332,\"ImgHasAlt\":333,\"ImgHasLongDesc\":334,\"ImgImportantNoSpacerAlt\":335,\"ImgNonDecorativeHasAlt\":336,\"ImgServerSideMapNotUsed\":337,\"ImgShouldNotHaveTitle\":338,\"ImgWithMapHasUseMap\":339,\"InputCheckboxRequiresFieldset\":340,\"InputElementsDontHaveAlt\":341,\"InputImageAltIsNotFileName\":342,\"InputImageAltIsNotPlaceholder\":343,\"InputImageAltIsShort\":344,\"InputImageAltNotRedundant\":345,\"InputImageHasAlt\":346,\"InputTextHasLabel\":347,\"InputTextHasValue\":348,\"InputTextValueNotEmpty\":349,\"InputWithoutLabelHasTitle\":350,\"LabelDoesNotContainInput\":351,\"LabelMustBeUnique\":352,\"LabelMustNotBeEmpty\":353,\"LabelsAreAssignedToAnInput\":354,\"LanguageDirAttributeIsUsed\":355,\"LanguageDirectionPunctuation\":356,\"LanguageUnicodeDirection\":357,\"LegendTextNotEmpty\":358,\"LegendTextNotPlaceholder\":359,\"LiDontUseImageForBullet\":360,\"LinkHasAUniqueContext\":361,\"ListNotUsedForFormatting\":362,\"ListOfLinksUseList\":363,\"MarqueeIsNotUsed\":364,\"NewWindowIsOpened\":365,\"ObjectMustContainText\":366,\"ObjectMustHaveEmbed\":367,\"ObjectMustHaveTitle\":368,\"ObjectMustHaveValidTitle\":369,\"PNotUsedAsHeader\":370,\"PasswordHasLabel\":371,\"PreShouldNotBeUsedForTabularLayout\":372,\"RadioHasLabel\":373,\"ScriptOnclickRequiresOnKeypress\":374,\"ScriptOndblclickRequiresOnKeypress\":375,\"ScriptOnmousedownRequiresOnKeypress\":376,\"ScriptOnmousemove\":377,\"ScriptOnmouseoutHasOnmouseblur\":378,\"ScriptOnmouseoverHasOnfocus\":379,\"ScriptOnmouseupHasOnkeyup\":380,\"SelectHasAssociatedLabel\":381,\"SelectJumpMenu\":382,\"SiteMap\":383,\"SkipToContentLinkProvided\":384,\"SvgContainsTitle\":385,\"TabIndexFollowsLogicalOrder\":386,\"TableDataShouldHaveTh\":387,\"TableLayoutDataShouldNotHaveTh\":388,\"TableLayoutHasNoCaption\":389,\"TableLayoutHasNoSummary\":390,\"TableLayoutMakesSenseLinearized\":391,\"TableNotUsedForLayout\":392,\"TableShouldUseHeaderIDs\":393,\"TableSummaryDoesNotDuplicateCaption\":394,\"TableSummaryIsEmpty\":395,\"TableSummaryIsNotTooLong\":396,\"TableUseColGroup\":397,\"TableUsesAbbreviationForHeader\":398,\"TableUsesCaption\":399,\"TableUsesScopeForRow\":400,\"TabularDataIsInTable\":401,\"TextIsNotSmall\":402,\"TextareaHasAssociatedLabel\":403,\"VideoMayBePresent\":404,\"VideosEmbeddedOrLinkedNeedCaptions\":405,\"WhiteSpaceInWord\":406,\"WhiteSpaceNotUsedForFormatting\":407}],40:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nrequire(\"core-js/shim\");\n\nrequire(\"babel-regenerator-runtime\");\n\nif (global._babelPolyfill) {\n  throw new Error(\"only one instance of babel-polyfill is allowed\");\n}\nglobal._babelPolyfill = true;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"babel-regenerator-runtime\":41,\"core-js/shim\":228}],41:[function(require,module,exports){\n(function (process,global){\n\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!function (global) {\n  \"use strict\";\n\n  var hasOwn = Object.prototype.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var iteratorSymbol = typeof Symbol === \"function\" && Symbol.iterator || \"@@iterator\";\n\n  var inModule = (typeof module === \"undefined\" ? \"undefined\" : _typeof(module)) === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided, then outerFn.prototype instanceof Generator.\n    var generator = Object.create((outerFn || Generator).prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function (method) {\n      prototype[method] = function (arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function (genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor ? ctor === GeneratorFunction ||\n    // For the native GeneratorFunction constructor, the best we can\n    // do is to check its .name property.\n    (ctor.displayName || ctor.name) === \"GeneratorFunction\" : false;\n  };\n\n  runtime.mark = function (genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `value instanceof AwaitArgument` to determine if the yielded value is\n  // meant to be awaited. Some may consider the name of this method too\n  // cutesy, but they are curmudgeons.\n  runtime.awrap = function (arg) {\n    return new AwaitArgument(arg);\n  };\n\n  function AwaitArgument(arg) {\n    this.arg = arg;\n  }\n\n  function AsyncIterator(generator) {\n    // This invoke function is written in a style that assumes some\n    // calling function (or Promise) will handle exceptions.\n    function invoke(method, arg) {\n      var result = generator[method](arg);\n      var value = result.value;\n      return value instanceof AwaitArgument ? Promise.resolve(value.arg).then(invokeNext, invokeThrow) : Promise.resolve(value).then(function (unwrapped) {\n        // When a yielded Promise is resolved, its final value becomes\n        // the .value of the Promise<{value,done}> result for the\n        // current iteration. If the Promise is rejected, however, the\n        // result for this iteration will be rejected with the same\n        // reason. Note that rejections of yielded Promises are not\n        // thrown back into the generator function, as is the case\n        // when an awaited Promise is rejected. This difference in\n        // behavior between yield and await is important, because it\n        // allows the consumer to decide what to do with the yielded\n        // rejection (swallow it and continue, manually .throw it back\n        // into the generator, abandon iteration, whatever). With\n        // await, by contrast, there is no opportunity to examine the\n        // rejection reason outside the generator function, so the\n        // only option is to throw it from the await expression, and\n        // let the generator function handle the exception.\n        result.value = unwrapped;\n        return result;\n      });\n    }\n\n    if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && process.domain) {\n      invoke = process.domain.bind(invoke);\n    }\n\n    var invokeNext = invoke.bind(generator, \"next\");\n    var invokeThrow = invoke.bind(generator, \"throw\");\n    var invokeReturn = invoke.bind(generator, \"return\");\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return invoke(method, arg);\n      }\n\n      return previousPromise =\n      // If enqueue has been called before, then we want to wait until\n      // all previous Promises have been resolved before calling invoke,\n      // so that results are always delivered in the correct order. If\n      // enqueue has not been called before, then it is important to\n      // call invoke immediately, without waiting on a callback to fire,\n      // so that the async generator function has the opportunity to do\n      // any necessary setup in a predictable way. This predictability\n      // is why the Promise constructor synchronously invokes its\n      // executor callback, and why async functions synchronously\n      // execute code before the first await. Since we implement simple\n      // async functions in terms of async generators, it is especially\n      // important to get this right, even though it requires care.\n      previousPromise ? previousPromise.then(callInvokeWithMethodAndArg,\n      // Avoid propagating failures to Promises returned by later\n      // invocations of the iterator.\n      callInvokeWithMethodAndArg) : new Promise(function (resolve) {\n        resolve(callInvokeWithMethodAndArg());\n      });\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function (innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));\n\n    return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.\n    : iter.next().then(function (result) {\n      return result.done ? result.value : iter.next();\n    });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          if (method === \"return\" || method === \"throw\" && delegate.iterator[method] === undefined) {\n            // A return or throw (when the delegate iterator has no throw\n            // method) always terminates the yield* loop.\n            context.delegate = null;\n\n            // If the delegate iterator has a return method, give it a\n            // chance to clean up.\n            var returnMethod = delegate.iterator[\"return\"];\n            if (returnMethod) {\n              var record = tryCatch(returnMethod, delegate.iterator, arg);\n              if (record.type === \"throw\") {\n                // If the return method threw an exception, let that\n                // exception prevail over the original return or throw.\n                method = \"throw\";\n                arg = record.arg;\n                continue;\n              }\n            }\n\n            if (method === \"return\") {\n              // Continue with the outer return, now that the delegate\n              // iterator has been terminated.\n              continue;\n            }\n          }\n\n          var record = tryCatch(delegate.iterator[method], delegate.iterator, arg);\n\n          if (record.type === \"throw\") {\n            context.delegate = null;\n\n            // Like returning generator.throw(uncaught), but without the\n            // overhead of an extra function call.\n            method = \"throw\";\n            arg = record.arg;\n            continue;\n          }\n\n          // Delegate generator ran and handled its own exceptions so\n          // regardless of what the method was, we continue as if it is\n          // \"next\" with an undefined arg.\n          method = \"next\";\n          arg = undefined;\n\n          var info = record.arg;\n          if (info.done) {\n            context[delegate.resultName] = info.value;\n            context.next = delegate.nextLoc;\n          } else {\n            state = GenStateSuspendedYield;\n            return info;\n          }\n\n          context.delegate = null;\n        }\n\n        if (method === \"next\") {\n          context._sent = arg;\n\n          if (state === GenStateSuspendedYield) {\n            context.sent = arg;\n          } else {\n            context.sent = undefined;\n          }\n        } else if (method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw arg;\n          }\n\n          if (context.dispatchException(arg)) {\n            // If the dispatched exception was caught by a catch block,\n            // then let that catch block handle the exception normally.\n            method = \"next\";\n            arg = undefined;\n          }\n        } else if (method === \"return\") {\n          context.abrupt(\"return\", arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done ? GenStateCompleted : GenStateSuspendedYield;\n\n          var info = {\n            value: record.arg,\n            done: context.done\n          };\n\n          if (record.arg === ContinueSentinel) {\n            if (context.delegate && method === \"next\") {\n              // Deliberately forget the last sent value so that we don't\n              // accidentally pass it on to the delegate.\n              arg = undefined;\n            }\n          } else {\n            return info;\n          }\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(arg) call above.\n          method = \"throw\";\n          arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[iteratorSymbol] = function () {\n    return this;\n  };\n\n  Gp.toString = function () {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function (object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1,\n            next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function reset(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      this.sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function stop() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function dispatchException(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n        return !!caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function abrupt(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry && (type === \"break\" || type === \"continue\") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.next = finallyEntry.finallyLoc;\n      } else {\n        this.complete(record);\n      }\n\n      return ContinueSentinel;\n    },\n\n    complete: function complete(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" || record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = record.arg;\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n    },\n\n    finish: function finish(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function _catch(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      return ContinueSentinel;\n    }\n  };\n}(\n// Among the various tricks for obtaining a reference to the global\n// object, this seems to be the most reliable technique that does not\n// use indirect eval (which violates Content Security Policy).\n(typeof global === \"undefined\" ? \"undefined\" : _typeof(global)) === \"object\" ? global : (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\" ? window : (typeof self === \"undefined\" ? \"undefined\" : _typeof(self)) === \"object\" ? self : undefined);\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"_process\":237}],42:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n},{}],43:[function(require,module,exports){\n'use strict';\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./$.wks')('unscopables'),\n    ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./$.hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n},{\"./$.hide\":71,\"./$.wks\":123}],44:[function(require,module,exports){\n'use strict';\n\nvar isObject = require('./$.is-object');\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n},{\"./$.is-object\":78}],45:[function(require,module,exports){\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\n\nvar toObject = require('./$.to-object'),\n    toIndex = require('./$.to-index'),\n    toLength = require('./$.to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /*= 0*/, start /*= 0, end = @length*/) {\n  var O = toObject(this),\n      len = toLength(O.length),\n      to = toIndex(target, len),\n      from = toIndex(start, len),\n      $$ = arguments,\n      end = $$.length > 2 ? $$[2] : undefined,\n      count = Math.min((end === undefined ? len : toIndex(end, len)) - from, len - to),\n      inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];else delete O[to];\n    to += inc;\n    from += inc;\n  }return O;\n};\n\n},{\"./$.to-index\":116,\"./$.to-length\":119,\"./$.to-object\":120}],46:[function(require,module,exports){\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\n\nvar toObject = require('./$.to-object'),\n    toIndex = require('./$.to-index'),\n    toLength = require('./$.to-length');\nmodule.exports = [].fill || function fill(value /*, start = 0, end = @length */) {\n  var O = toObject(this),\n      length = toLength(O.length),\n      $$ = arguments,\n      $$len = $$.length,\n      index = toIndex($$len > 1 ? $$[1] : undefined, length),\n      end = $$len > 2 ? $$[2] : undefined,\n      endPos = end === undefined ? length : toIndex(end, length);\n  while (endPos > index) {\n    O[index++] = value;\n  }return O;\n};\n\n},{\"./$.to-index\":116,\"./$.to-length\":119,\"./$.to-object\":120}],47:[function(require,module,exports){\n'use strict';\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./$.to-iobject'),\n    toLength = require('./$.to-length'),\n    toIndex = require('./$.to-index');\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this),\n        length = toLength(O.length),\n        index = toIndex(fromIndex, length),\n        value;\n    // Array#includes uses SameValueZero equality algorithm\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      if (value != value) return true;\n      // Array#toIndex ignores holes, Array#includes - not\n    } else for (; length > index; index++) {\n        if (IS_INCLUDES || index in O) {\n          if (O[index] === el) return IS_INCLUDES || index;\n        }\n      }return !IS_INCLUDES && -1;\n  };\n};\n\n},{\"./$.to-index\":116,\"./$.to-iobject\":118,\"./$.to-length\":119}],48:[function(require,module,exports){\n'use strict';\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./$.ctx'),\n    IObject = require('./$.iobject'),\n    toObject = require('./$.to-object'),\n    toLength = require('./$.to-length'),\n    asc = require('./$.array-species-create');\nmodule.exports = function (TYPE) {\n  var IS_MAP = TYPE == 1,\n      IS_FILTER = TYPE == 2,\n      IS_SOME = TYPE == 3,\n      IS_EVERY = TYPE == 4,\n      IS_FIND_INDEX = TYPE == 6,\n      NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this),\n        self = IObject(O),\n        f = ctx(callbackfn, that, 3),\n        length = toLength(self.length),\n        index = 0,\n        result = IS_MAP ? asc($this, length) : IS_FILTER ? asc($this, 0) : undefined,\n        val,\n        res;\n    for (; length > index; index++) {\n      if (NO_HOLES || index in self) {\n        val = self[index];\n        res = f(val, index, O);\n        if (TYPE) {\n          if (IS_MAP) result[index] = res; // map\n          else if (res) switch (TYPE) {\n              case 3:\n                return true; // some\n              case 5:\n                return val; // find\n              case 6:\n                return index; // findIndex\n              case 2:\n                result.push(val); // filter\n            } else if (IS_EVERY) return false; // every\n        }\n      }\n    }return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n},{\"./$.array-species-create\":49,\"./$.ctx\":57,\"./$.iobject\":74,\"./$.to-length\":119,\"./$.to-object\":120}],49:[function(require,module,exports){\n'use strict';\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar isObject = require('./$.is-object'),\n    isArray = require('./$.is-array'),\n    SPECIES = require('./$.wks')('species');\nmodule.exports = function (original, length) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  }return new (C === undefined ? Array : C)(length);\n};\n\n},{\"./$.is-array\":76,\"./$.is-object\":78,\"./$.wks\":123}],50:[function(require,module,exports){\n'use strict';\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./$.cof'),\n    TAG = require('./$.wks')('toStringTag')\n// ES3 wrong here\n,\n    ARG = cof(function () {\n  return arguments;\n}()) == 'Arguments';\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n  // @@toStringTag case\n  : typeof (T = (O = Object(it))[TAG]) == 'string' ? T\n  // builtinTag case\n  : ARG ? cof(O)\n  // ES3 arguments fallback\n  : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n},{\"./$.cof\":51,\"./$.wks\":123}],51:[function(require,module,exports){\n\"use strict\";\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n},{}],52:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar $ = require('./$'),\n    hide = require('./$.hide'),\n    redefineAll = require('./$.redefine-all'),\n    ctx = require('./$.ctx'),\n    strictNew = require('./$.strict-new'),\n    defined = require('./$.defined'),\n    forOf = require('./$.for-of'),\n    $iterDefine = require('./$.iter-define'),\n    step = require('./$.iter-step'),\n    ID = require('./$.uid')('id'),\n    $has = require('./$.has'),\n    isObject = require('./$.is-object'),\n    setSpecies = require('./$.set-species'),\n    DESCRIPTORS = require('./$.descriptors'),\n    isExtensible = Object.isExtensible || isObject,\n    SIZE = DESCRIPTORS ? '_s' : 'size',\n    id = 0;\n\nvar fastKey = function fastKey(it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!$has(it, ID)) {\n    // can't set id to frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add id\n    if (!create) return 'E';\n    // add missing object id\n    hide(it, ID, ++id);\n    // return object id with prefix\n  }return 'O' + it[ID];\n};\n\nvar getEntry = function getEntry(that, key) {\n  // fast case\n  var index = fastKey(key),\n      entry;\n  if (index !== 'F') return that._i[index];\n  // frozen object case\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      strictNew(that, C, NAME);\n      that._i = $.create(null); // index\n      that._f = undefined; // first entry\n      that._l = undefined; // last entry\n      that[SIZE] = 0; // size\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = this, data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function _delete(key) {\n        var that = this,\n            entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.n,\n              prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        }return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /*, that = undefined */) {\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3),\n            entry;\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while (entry && entry.r) {\n            entry = entry.p;\n          }\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(this, key);\n      }\n    });\n    if (DESCRIPTORS) $.setDesc(C.prototype, 'size', {\n      get: function get() {\n        return defined(this[SIZE]);\n      }\n    });\n    return C;\n  },\n  def: function def(that, key, value) {\n    var entry = getEntry(that, key),\n        prev,\n        index;\n    // change existing entry\n    if (entry) {\n      entry.v = value;\n      // create new entry\n    } else {\n        that._l = entry = {\n          i: index = fastKey(key, true), // <- index\n          k: key, // <- key\n          v: value, // <- value\n          p: prev = that._l, // <- previous entry\n          n: undefined, // <- next entry\n          r: false // <- removed\n        };\n        if (!that._f) that._f = entry;\n        if (prev) prev.n = entry;\n        that[SIZE]++;\n        // add to index\n        if (index !== 'F') that._i[index] = entry;\n      }return that;\n  },\n  getEntry: getEntry,\n  setStrong: function setStrong(C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = iterated; // target\n      this._k = kind; // kind\n      this._l = undefined; // previous\n    }, function () {\n      var that = this,\n          kind = that._k,\n          entry = that._l;\n      // revert to the last existing entry\n      while (entry && entry.r) {\n        entry = entry.p;\n      } // get next entry\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n\n},{\"./$\":86,\"./$.ctx\":57,\"./$.defined\":58,\"./$.descriptors\":59,\"./$.for-of\":67,\"./$.has\":70,\"./$.hide\":71,\"./$.is-object\":78,\"./$.iter-define\":82,\"./$.iter-step\":84,\"./$.redefine-all\":100,\"./$.set-species\":105,\"./$.strict-new\":109,\"./$.uid\":122}],53:[function(require,module,exports){\n'use strict';\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar forOf = require('./$.for-of'),\n    classof = require('./$.classof');\nmodule.exports = function (NAME) {\n  return function toJSON() {\n    if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n    var arr = [];\n    forOf(this, false, arr.push, arr);\n    return arr;\n  };\n};\n\n},{\"./$.classof\":50,\"./$.for-of\":67}],54:[function(require,module,exports){\n'use strict';\n\nvar hide = require('./$.hide'),\n    redefineAll = require('./$.redefine-all'),\n    anObject = require('./$.an-object'),\n    isObject = require('./$.is-object'),\n    strictNew = require('./$.strict-new'),\n    forOf = require('./$.for-of'),\n    createArrayMethod = require('./$.array-methods'),\n    $has = require('./$.has'),\n    WEAK = require('./$.uid')('weak'),\n    isExtensible = Object.isExtensible || isObject,\n    arrayFind = createArrayMethod(5),\n    arrayFindIndex = createArrayMethod(6),\n    id = 0;\n\n// fallback for frozen keys\nvar frozenStore = function frozenStore(that) {\n  return that._l || (that._l = new FrozenStore());\n};\nvar FrozenStore = function FrozenStore() {\n  this.a = [];\n};\nvar findFrozen = function findFrozen(store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nFrozenStore.prototype = {\n  get: function get(key) {\n    var entry = findFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function has(key) {\n    return !!findFrozen(this, key);\n  },\n  set: function set(key, value) {\n    var entry = findFrozen(this, key);\n    if (entry) entry[1] = value;else this.a.push([key, value]);\n  },\n  'delete': function _delete(key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !! ~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      strictNew(that, C, NAME);\n      that._i = id++; // collection id\n      that._l = undefined; // leak store for frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function _delete(key) {\n        if (!isObject(key)) return false;\n        if (!isExtensible(key)) return frozenStore(this)['delete'](key);\n        return $has(key, WEAK) && $has(key[WEAK], this._i) && delete key[WEAK][this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        if (!isExtensible(key)) return frozenStore(this).has(key);\n        return $has(key, WEAK) && $has(key[WEAK], this._i);\n      }\n    });\n    return C;\n  },\n  def: function def(that, key, value) {\n    if (!isExtensible(anObject(key))) {\n      frozenStore(that).set(key, value);\n    } else {\n      $has(key, WEAK) || hide(key, WEAK, {});\n      key[WEAK][that._i] = value;\n    }return that;\n  },\n  frozenStore: frozenStore,\n  WEAK: WEAK\n};\n\n},{\"./$.an-object\":44,\"./$.array-methods\":48,\"./$.for-of\":67,\"./$.has\":70,\"./$.hide\":71,\"./$.is-object\":78,\"./$.redefine-all\":100,\"./$.strict-new\":109,\"./$.uid\":122}],55:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    $export = require('./$.export'),\n    redefine = require('./$.redefine'),\n    redefineAll = require('./$.redefine-all'),\n    forOf = require('./$.for-of'),\n    strictNew = require('./$.strict-new'),\n    isObject = require('./$.is-object'),\n    fails = require('./$.fails'),\n    $iterDetect = require('./$.iter-detect'),\n    setToStringTag = require('./$.set-to-string-tag');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME],\n      C = Base,\n      ADDER = IS_MAP ? 'set' : 'add',\n      proto = C && C.prototype,\n      O = {};\n  var fixMethod = function fixMethod(KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY, KEY == 'delete' ? function (a) {\n      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'has' ? function has(a) {\n      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'get' ? function get(a) {\n      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'add' ? function add(a) {\n      fn.call(this, a === 0 ? 0 : a);return this;\n    } : function set(a, b) {\n      fn.call(this, a === 0 ? 0 : a, b);return this;\n    });\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n  } else {\n    var instance = new C()\n    // early implementations not supports chaining\n    ,\n        HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    ,\n        THROWS_ON_PRIMITIVES = fails(function () {\n      instance.has(1);\n    })\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    ,\n        ACCEPT_ITERABLES = $iterDetect(function (iter) {\n      new C(iter);\n    }) // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    ,\n        BUGGY_ZERO;\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        strictNew(target, C, NAME);\n        var that = new Base();\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    IS_WEAK || instance.forEach(function (val, key) {\n      BUGGY_ZERO = 1 / key === -Infinity;\n    });\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n\n},{\"./$.export\":62,\"./$.fails\":64,\"./$.for-of\":67,\"./$.global\":69,\"./$.is-object\":78,\"./$.iter-detect\":83,\"./$.redefine\":101,\"./$.redefine-all\":100,\"./$.set-to-string-tag\":106,\"./$.strict-new\":109}],56:[function(require,module,exports){\n'use strict';\n\nvar core = module.exports = { version: '1.2.6' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n},{}],57:[function(require,module,exports){\n'use strict';\n\n// optional / simple context binding\nvar aFunction = require('./$.a-function');\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1:\n      return function (a) {\n        return fn.call(that, a);\n      };\n    case 2:\n      return function (a, b) {\n        return fn.call(that, a, b);\n      };\n    case 3:\n      return function (a, b, c) {\n        return fn.call(that, a, b, c);\n      };\n  }\n  return function () /* ...args */{\n    return fn.apply(that, arguments);\n  };\n};\n\n},{\"./$.a-function\":42}],58:[function(require,module,exports){\n\"use strict\";\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n},{}],59:[function(require,module,exports){\n'use strict';\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./$.fails')(function () {\n  return Object.defineProperty({}, 'a', { get: function get() {\n      return 7;\n    } }).a != 7;\n});\n\n},{\"./$.fails\":64}],60:[function(require,module,exports){\n'use strict';\n\nvar isObject = require('./$.is-object'),\n    document = require('./$.global').document\n// in old IE typeof document.createElement is 'object'\n,\n    is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n},{\"./$.global\":69,\"./$.is-object\":78}],61:[function(require,module,exports){\n'use strict';\n\n// all enumerable object keys, includes symbols\nvar $ = require('./$');\nmodule.exports = function (it) {\n  var keys = $.getKeys(it),\n      getSymbols = $.getSymbols;\n  if (getSymbols) {\n    var symbols = getSymbols(it),\n        isEnum = $.isEnum,\n        i = 0,\n        key;\n    while (symbols.length > i) {\n      if (isEnum.call(it, key = symbols[i++])) keys.push(key);\n    }\n  }\n  return keys;\n};\n\n},{\"./$\":86}],62:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    core = require('./$.core'),\n    hide = require('./$.hide'),\n    redefine = require('./$.redefine'),\n    ctx = require('./$.ctx'),\n    PROTOTYPE = 'prototype';\n\nvar $export = function $export(type, name, source) {\n  var IS_FORCED = type & $export.F,\n      IS_GLOBAL = type & $export.G,\n      IS_STATIC = type & $export.S,\n      IS_PROTO = type & $export.P,\n      IS_BIND = type & $export.B,\n      target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE],\n      exports = IS_GLOBAL ? core : core[name] || (core[name] = {}),\n      expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}),\n      key,\n      own,\n      out,\n      exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && key in target;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target && !own) redefine(target, key, out);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\nmodule.exports = $export;\n\n},{\"./$.core\":56,\"./$.ctx\":57,\"./$.global\":69,\"./$.hide\":71,\"./$.redefine\":101}],63:[function(require,module,exports){\n'use strict';\n\nvar MATCH = require('./$.wks')('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) {/* empty */}\n  }return true;\n};\n\n},{\"./$.wks\":123}],64:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n},{}],65:[function(require,module,exports){\n'use strict';\n\nvar hide = require('./$.hide'),\n    redefine = require('./$.redefine'),\n    fails = require('./$.fails'),\n    defined = require('./$.defined'),\n    wks = require('./$.wks');\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY),\n      original = ''[KEY];\n  if (fails(function () {\n    var O = {};\n    O[SYMBOL] = function () {\n      return 7;\n    };\n    return ''[KEY](O) != 7;\n  })) {\n    redefine(String.prototype, KEY, exec(defined, SYMBOL, original));\n    hide(RegExp.prototype, SYMBOL, length == 2\n    // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n    // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n    ? function (string, arg) {\n      return original.call(string, this, arg);\n    }\n    // 21.2.5.6 RegExp.prototype[@@match](string)\n    // 21.2.5.9 RegExp.prototype[@@search](string)\n    : function (string) {\n      return original.call(string, this);\n    });\n  }\n};\n\n},{\"./$.defined\":58,\"./$.fails\":64,\"./$.hide\":71,\"./$.redefine\":101,\"./$.wks\":123}],66:[function(require,module,exports){\n'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\n\nvar anObject = require('./$.an-object');\nmodule.exports = function () {\n  var that = anObject(this),\n      result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n},{\"./$.an-object\":44}],67:[function(require,module,exports){\n'use strict';\n\nvar ctx = require('./$.ctx'),\n    call = require('./$.iter-call'),\n    isArrayIter = require('./$.is-array-iter'),\n    anObject = require('./$.an-object'),\n    toLength = require('./$.to-length'),\n    getIterFn = require('./core.get-iterator-method');\nmodule.exports = function (iterable, entries, fn, that) {\n  var iterFn = getIterFn(iterable),\n      f = ctx(fn, that, entries ? 2 : 1),\n      index = 0,\n      length,\n      step,\n      iterator;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    call(iterator, f, step.value, entries);\n  }\n};\n\n},{\"./$.an-object\":44,\"./$.ctx\":57,\"./$.is-array-iter\":75,\"./$.iter-call\":80,\"./$.to-length\":119,\"./core.get-iterator-method\":124}],68:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./$.to-iobject'),\n    getNames = require('./$').getNames,\n    toString = {}.toString;\n\nvar windowNames = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) == 'object' && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function getWindowNames(it) {\n  try {\n    return getNames(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.get = function getOwnPropertyNames(it) {\n  if (windowNames && toString.call(it) == '[object Window]') return getWindowNames(it);\n  return getNames(toIObject(it));\n};\n\n},{\"./$\":86,\"./$.to-iobject\":118}],69:[function(require,module,exports){\n'use strict';\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n},{}],70:[function(require,module,exports){\n\"use strict\";\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n},{}],71:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    createDesc = require('./$.property-desc');\nmodule.exports = require('./$.descriptors') ? function (object, key, value) {\n  return $.setDesc(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n},{\"./$\":86,\"./$.descriptors\":59,\"./$.property-desc\":99}],72:[function(require,module,exports){\n'use strict';\n\nmodule.exports = require('./$.global').document && document.documentElement;\n\n},{\"./$.global\":69}],73:[function(require,module,exports){\n\"use strict\";\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n                  var un = that === undefined;\n                  switch (args.length) {\n                                    case 0:\n                                                      return un ? fn() : fn.call(that);\n                                    case 1:\n                                                      return un ? fn(args[0]) : fn.call(that, args[0]);\n                                    case 2:\n                                                      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);\n                                    case 3:\n                                                      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);\n                                    case 4:\n                                                      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);\n                  }return fn.apply(that, args);\n};\n\n},{}],74:[function(require,module,exports){\n'use strict';\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./$.cof');\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n},{\"./$.cof\":51}],75:[function(require,module,exports){\n'use strict';\n\n// check on default Array iterator\nvar Iterators = require('./$.iterators'),\n    ITERATOR = require('./$.wks')('iterator'),\n    ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n},{\"./$.iterators\":85,\"./$.wks\":123}],76:[function(require,module,exports){\n'use strict';\n\n// 7.2.2 IsArray(argument)\nvar cof = require('./$.cof');\nmodule.exports = Array.isArray || function (arg) {\n  return cof(arg) == 'Array';\n};\n\n},{\"./$.cof\":51}],77:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./$.is-object'),\n    floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n},{\"./$.is-object\":78}],78:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nmodule.exports = function (it) {\n  return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) === 'object' ? it !== null : typeof it === 'function';\n};\n\n},{}],79:[function(require,module,exports){\n'use strict';\n\n// 7.2.8 IsRegExp(argument)\nvar isObject = require('./$.is-object'),\n    cof = require('./$.cof'),\n    MATCH = require('./$.wks')('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n},{\"./$.cof\":51,\"./$.is-object\":78,\"./$.wks\":123}],80:[function(require,module,exports){\n'use strict';\n\n// call something on iterator step with safe closing on error\nvar anObject = require('./$.an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n    // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n},{\"./$.an-object\":44}],81:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    descriptor = require('./$.property-desc'),\n    setToStringTag = require('./$.set-to-string-tag'),\n    IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./$.hide')(IteratorPrototype, require('./$.wks')('iterator'), function () {\n  return this;\n});\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = $.create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n},{\"./$\":86,\"./$.hide\":71,\"./$.property-desc\":99,\"./$.set-to-string-tag\":106,\"./$.wks\":123}],82:[function(require,module,exports){\n'use strict';\n\nvar LIBRARY = require('./$.library'),\n    $export = require('./$.export'),\n    redefine = require('./$.redefine'),\n    hide = require('./$.hide'),\n    has = require('./$.has'),\n    Iterators = require('./$.iterators'),\n    $iterCreate = require('./$.iter-create'),\n    setToStringTag = require('./$.set-to-string-tag'),\n    getProto = require('./$').getProto,\n    ITERATOR = require('./$.wks')('iterator'),\n    BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n,\n    FF_ITERATOR = '@@iterator',\n    KEYS = 'keys',\n    VALUES = 'values';\n\nvar returnThis = function returnThis() {\n  return this;\n};\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function getMethod(kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS:\n        return function keys() {\n          return new Constructor(this, kind);\n        };\n      case VALUES:\n        return function values() {\n          return new Constructor(this, kind);\n        };\n    }return function entries() {\n      return new Constructor(this, kind);\n    };\n  };\n  var TAG = NAME + ' Iterator',\n      DEF_VALUES = DEFAULT == VALUES,\n      VALUES_BUG = false,\n      proto = Base.prototype,\n      $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT],\n      $default = $native || getMethod(DEFAULT),\n      methods,\n      key;\n  // Fix native\n  if ($native) {\n    var IteratorPrototype = getProto($default.call(new Base()));\n    // Set @@toStringTag to native iterators\n    setToStringTag(IteratorPrototype, TAG, true);\n    // FF fix\n    if (!LIBRARY && has(proto, FF_ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n    // fix Array#{values, @@iterator}.name in V8 / FF\n    if (DEF_VALUES && $native.name !== VALUES) {\n      VALUES_BUG = true;\n      $default = function values() {\n        return $native.call(this);\n      };\n    }\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: !DEF_VALUES ? $default : getMethod('entries')\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n},{\"./$\":86,\"./$.export\":62,\"./$.has\":70,\"./$.hide\":71,\"./$.iter-create\":81,\"./$.iterators\":85,\"./$.library\":88,\"./$.redefine\":101,\"./$.set-to-string-tag\":106,\"./$.wks\":123}],83:[function(require,module,exports){\n'use strict';\n\nvar ITERATOR = require('./$.wks')('iterator'),\n    SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () {\n    SAFE_CLOSING = true;\n  };\n  Array.from(riter, function () {\n    throw 2;\n  });\n} catch (e) {/* empty */}\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7],\n        iter = arr[ITERATOR]();\n    iter.next = function () {\n      safe = true;\n    };\n    arr[ITERATOR] = function () {\n      return iter;\n    };\n    exec(arr);\n  } catch (e) {/* empty */}\n  return safe;\n};\n\n},{\"./$.wks\":123}],84:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n},{}],85:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {};\n\n},{}],86:[function(require,module,exports){\n\"use strict\";\n\nvar $Object = Object;\nmodule.exports = {\n  create: $Object.create,\n  getProto: $Object.getPrototypeOf,\n  isEnum: {}.propertyIsEnumerable,\n  getDesc: $Object.getOwnPropertyDescriptor,\n  setDesc: $Object.defineProperty,\n  setDescs: $Object.defineProperties,\n  getKeys: $Object.keys,\n  getNames: $Object.getOwnPropertyNames,\n  getSymbols: $Object.getOwnPropertySymbols,\n  each: [].forEach\n};\n\n},{}],87:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    toIObject = require('./$.to-iobject');\nmodule.exports = function (object, el) {\n  var O = toIObject(object),\n      keys = $.getKeys(O),\n      length = keys.length,\n      index = 0,\n      key;\n  while (length > index) {\n    if (O[key = keys[index++]] === el) return key;\n  }\n};\n\n},{\"./$\":86,\"./$.to-iobject\":118}],88:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = false;\n\n},{}],89:[function(require,module,exports){\n\"use strict\";\n\n// 20.2.2.14 Math.expm1(x)\nmodule.exports = Math.expm1 || function expm1(x) {\n  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n};\n\n},{}],90:[function(require,module,exports){\n\"use strict\";\n\n// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n\n},{}],91:[function(require,module,exports){\n\"use strict\";\n\n// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n\n},{}],92:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    macrotask = require('./$.task').set,\n    Observer = global.MutationObserver || global.WebKitMutationObserver,\n    process = global.process,\n    Promise = global.Promise,\n    isNode = require('./$.cof')(process) == 'process',\n    head,\n    last,\n    notify;\n\nvar flush = function flush() {\n  var parent, domain, fn;\n  if (isNode && (parent = process.domain)) {\n    process.domain = null;\n    parent.exit();\n  }\n  while (head) {\n    domain = head.domain;\n    fn = head.fn;\n    if (domain) domain.enter();\n    fn(); // <- currently we use it only for Promise - try / catch not required\n    if (domain) domain.exit();\n    head = head.next;\n  }last = undefined;\n  if (parent) parent.enter();\n};\n\n// Node.js\nif (isNode) {\n  notify = function notify() {\n    process.nextTick(flush);\n  };\n  // browsers with MutationObserver\n} else if (Observer) {\n    var toggle = 1,\n        node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function notify() {\n      node.data = toggle = -toggle;\n    };\n    // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n      notify = function notify() {\n        Promise.resolve().then(flush);\n      };\n      // for other environments - macrotask based on:\n      // - setImmediate\n      // - MessageChannel\n      // - window.postMessag\n      // - onreadystatechange\n      // - setTimeout\n    } else {\n        notify = function notify() {\n          // strange IE + webpack dev server bug - use .call(global)\n          macrotask.call(global, flush);\n        };\n      }\n\nmodule.exports = function asap(fn) {\n  var task = { fn: fn, next: undefined, domain: isNode && process.domain };\n  if (last) last.next = task;\n  if (!head) {\n    head = task;\n    notify();\n  }last = task;\n};\n\n},{\"./$.cof\":51,\"./$.global\":69,\"./$.task\":115}],93:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar $ = require('./$'),\n    toObject = require('./$.to-object'),\n    IObject = require('./$.iobject');\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = require('./$.fails')(function () {\n  var a = Object.assign,\n      A = {},\n      B = {},\n      S = Symbol(),\n      K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) {\n    B[k] = k;\n  });\n  return a({}, A)[S] != 7 || Object.keys(a({}, B)).join('') != K;\n}) ? function assign(target, source) {\n  // eslint-disable-line no-unused-vars\n  var T = toObject(target),\n      $$ = arguments,\n      $$len = $$.length,\n      index = 1,\n      getKeys = $.getKeys,\n      getSymbols = $.getSymbols,\n      isEnum = $.isEnum;\n  while ($$len > index) {\n    var S = IObject($$[index++]),\n        keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S),\n        length = keys.length,\n        j = 0,\n        key;\n    while (length > j) {\n      if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n    }\n  }\n  return T;\n} : Object.assign;\n\n},{\"./$\":86,\"./$.fails\":64,\"./$.iobject\":74,\"./$.to-object\":120}],94:[function(require,module,exports){\n'use strict';\n\n// most Object methods by ES6 should accept primitives\nvar $export = require('./$.export'),\n    core = require('./$.core'),\n    fails = require('./$.fails');\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY],\n      exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () {\n    fn(1);\n  }), 'Object', exp);\n};\n\n},{\"./$.core\":56,\"./$.export\":62,\"./$.fails\":64}],95:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    toIObject = require('./$.to-iobject'),\n    isEnum = $.isEnum;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it),\n        keys = $.getKeys(O),\n        length = keys.length,\n        i = 0,\n        result = [],\n        key;\n    while (length > i) {\n      if (isEnum.call(O, key = keys[i++])) {\n        result.push(isEntries ? [key, O[key]] : O[key]);\n      }\n    }return result;\n  };\n};\n\n},{\"./$\":86,\"./$.to-iobject\":118}],96:[function(require,module,exports){\n'use strict';\n\n// all object keys, includes non-enumerable and symbols\nvar $ = require('./$'),\n    anObject = require('./$.an-object'),\n    Reflect = require('./$.global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = $.getNames(anObject(it)),\n      getSymbols = $.getSymbols;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.global\":69}],97:[function(require,module,exports){\n'use strict';\n\nvar path = require('./$.path'),\n    invoke = require('./$.invoke'),\n    aFunction = require('./$.a-function');\nmodule.exports = function () /* ...pargs */{\n  var fn = aFunction(this),\n      length = arguments.length,\n      pargs = Array(length),\n      i = 0,\n      _ = path._,\n      holder = false;\n  while (length > i) {\n    if ((pargs[i] = arguments[i++]) === _) holder = true;\n  }return function () /* ...args */{\n    var that = this,\n        $$ = arguments,\n        $$len = $$.length,\n        j = 0,\n        k = 0,\n        args;\n    if (!holder && !$$len) return invoke(fn, pargs, that);\n    args = pargs.slice();\n    if (holder) for (; length > j; j++) {\n      if (args[j] === _) args[j] = $$[k++];\n    }while ($$len > k) {\n      args.push($$[k++]);\n    }return invoke(fn, args, that);\n  };\n};\n\n},{\"./$.a-function\":42,\"./$.invoke\":73,\"./$.path\":98}],98:[function(require,module,exports){\n'use strict';\n\nmodule.exports = require('./$.global');\n\n},{\"./$.global\":69}],99:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n},{}],100:[function(require,module,exports){\n'use strict';\n\nvar redefine = require('./$.redefine');\nmodule.exports = function (target, src) {\n  for (var key in src) {\n    redefine(target, key, src[key]);\n  }return target;\n};\n\n},{\"./$.redefine\":101}],101:[function(require,module,exports){\n'use strict';\n\n// add fake Function#toString\n// for correct work wrapped methods / constructors with methods like LoDash isNative\nvar global = require('./$.global'),\n    hide = require('./$.hide'),\n    SRC = require('./$.uid')('src'),\n    TO_STRING = 'toString',\n    $toString = Function[TO_STRING],\n    TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./$.core').inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  if (typeof val == 'function') {\n    val.hasOwnProperty(SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n    val.hasOwnProperty('name') || hide(val, 'name', key);\n  }\n  if (O === global) {\n    O[key] = val;\n  } else {\n    if (!safe) delete O[key];\n    hide(O, key, val);\n  }\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n},{\"./$.core\":56,\"./$.global\":69,\"./$.hide\":71,\"./$.uid\":122}],102:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (regExp, replace) {\n  var replacer = replace === Object(replace) ? function (part) {\n    return replace[part];\n  } : replace;\n  return function (it) {\n    return String(it).replace(regExp, replacer);\n  };\n};\n\n},{}],103:[function(require,module,exports){\n\"use strict\";\n\n// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n},{}],104:[function(require,module,exports){\n'use strict';\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar getDesc = require('./$').getDesc,\n    isObject = require('./$.is-object'),\n    anObject = require('./$.an-object');\nvar check = function check(O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n  function (test, buggy, set) {\n    try {\n      set = require('./$.ctx')(Function.call, getDesc(Object.prototype, '__proto__').set, 2);\n      set(test, []);\n      buggy = !(test instanceof Array);\n    } catch (e) {\n      buggy = true;\n    }\n    return function setPrototypeOf(O, proto) {\n      check(O, proto);\n      if (buggy) O.__proto__ = proto;else set(O, proto);\n      return O;\n    };\n  }({}, false) : undefined),\n  check: check\n};\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.ctx\":57,\"./$.is-object\":78}],105:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    $ = require('./$'),\n    DESCRIPTORS = require('./$.descriptors'),\n    SPECIES = require('./$.wks')('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) $.setDesc(C, SPECIES, {\n    configurable: true,\n    get: function get() {\n      return this;\n    }\n  });\n};\n\n},{\"./$\":86,\"./$.descriptors\":59,\"./$.global\":69,\"./$.wks\":123}],106:[function(require,module,exports){\n'use strict';\n\nvar def = require('./$').setDesc,\n    has = require('./$.has'),\n    TAG = require('./$.wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n},{\"./$\":86,\"./$.has\":70,\"./$.wks\":123}],107:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    SHARED = '__core-js_shared__',\n    store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n  return store[key] || (store[key] = {});\n};\n\n},{\"./$.global\":69}],108:[function(require,module,exports){\n'use strict';\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./$.an-object'),\n    aFunction = require('./$.a-function'),\n    SPECIES = require('./$.wks')('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor,\n      S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n},{\"./$.a-function\":42,\"./$.an-object\":44,\"./$.wks\":123}],109:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (it, Constructor, name) {\n  if (!(it instanceof Constructor)) throw TypeError(name + \": use the 'new' operator!\");\n  return it;\n};\n\n},{}],110:[function(require,module,exports){\n'use strict';\n\nvar toInteger = require('./$.to-integer'),\n    defined = require('./$.defined');\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that)),\n        i = toInteger(pos),\n        l = s.length,\n        a,\n        b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n},{\"./$.defined\":58,\"./$.to-integer\":117}],111:[function(require,module,exports){\n'use strict';\n\n// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./$.is-regexp'),\n    defined = require('./$.defined');\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n},{\"./$.defined\":58,\"./$.is-regexp\":79}],112:[function(require,module,exports){\n'use strict';\n\n// https://github.com/ljharb/proposal-string-pad-left-right\nvar toLength = require('./$.to-length'),\n    repeat = require('./$.string-repeat'),\n    defined = require('./$.defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that)),\n      stringLength = S.length,\n      fillStr = fillString === undefined ? ' ' : String(fillString),\n      intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength) return S;\n  if (fillStr == '') fillStr = ' ';\n  var fillLen = intMaxLength - stringLength,\n      stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n},{\"./$.defined\":58,\"./$.string-repeat\":113,\"./$.to-length\":119}],113:[function(require,module,exports){\n'use strict';\n\nvar toInteger = require('./$.to-integer'),\n    defined = require('./$.defined');\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this)),\n      res = '',\n      n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n  for (; n > 0; (n >>>= 1) && (str += str)) {\n    if (n & 1) res += str;\n  }return res;\n};\n\n},{\"./$.defined\":58,\"./$.to-integer\":117}],114:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    defined = require('./$.defined'),\n    fails = require('./$.fails'),\n    spaces = '\\t\\n\\u000b\\f\\r   ᠎    ' + '         　\\u2028\\u2029﻿',\n    space = '[' + spaces + ']',\n    non = '​',\n    ltrim = RegExp('^' + space + space + '*'),\n    rtrim = RegExp(space + space + '*$');\n\nvar exporter = function exporter(KEY, exec) {\n  var exp = {};\n  exp[KEY] = exec(trim);\n  $export($export.P + $export.F * fails(function () {\n    return !!spaces[KEY]() || non[KEY]() != non;\n  }), 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n  string = String(defined(string));\n  if (TYPE & 1) string = string.replace(ltrim, '');\n  if (TYPE & 2) string = string.replace(rtrim, '');\n  return string;\n};\n\nmodule.exports = exporter;\n\n},{\"./$.defined\":58,\"./$.export\":62,\"./$.fails\":64}],115:[function(require,module,exports){\n'use strict';\n\nvar ctx = require('./$.ctx'),\n    invoke = require('./$.invoke'),\n    html = require('./$.html'),\n    cel = require('./$.dom-create'),\n    global = require('./$.global'),\n    process = global.process,\n    setTask = global.setImmediate,\n    clearTask = global.clearImmediate,\n    MessageChannel = global.MessageChannel,\n    counter = 0,\n    queue = {},\n    ONREADYSTATECHANGE = 'onreadystatechange',\n    defer,\n    channel,\n    port;\nvar run = function run() {\n  var id = +this;\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listner = function listner(event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [],\n        i = 1;\n    while (arguments.length > i) {\n      args.push(arguments[i++]);\n    }queue[++counter] = function () {\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (require('./$.cof')(process) == 'process') {\n    defer = function defer(id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n    // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n      channel = new MessageChannel();\n      port = channel.port2;\n      channel.port1.onmessage = listner;\n      defer = ctx(port.postMessage, port, 1);\n      // Browsers with postMessage, skip WebWorkers\n      // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n    } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n        defer = function defer(id) {\n          global.postMessage(id + '', '*');\n        };\n        global.addEventListener('message', listner, false);\n        // IE8-\n      } else if (ONREADYSTATECHANGE in cel('script')) {\n          defer = function defer(id) {\n            html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n              html.removeChild(this);\n              run.call(id);\n            };\n          };\n          // Rest old browsers\n        } else {\n            defer = function defer(id) {\n              setTimeout(ctx(run, id, 1), 0);\n            };\n          }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n},{\"./$.cof\":51,\"./$.ctx\":57,\"./$.dom-create\":60,\"./$.global\":69,\"./$.html\":72,\"./$.invoke\":73}],116:[function(require,module,exports){\n'use strict';\n\nvar toInteger = require('./$.to-integer'),\n    max = Math.max,\n    min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n},{\"./$.to-integer\":117}],117:[function(require,module,exports){\n\"use strict\";\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil,\n    floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n},{}],118:[function(require,module,exports){\n'use strict';\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./$.iobject'),\n    defined = require('./$.defined');\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n},{\"./$.defined\":58,\"./$.iobject\":74}],119:[function(require,module,exports){\n'use strict';\n\n// 7.1.15 ToLength\nvar toInteger = require('./$.to-integer'),\n    min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n},{\"./$.to-integer\":117}],120:[function(require,module,exports){\n'use strict';\n\n// 7.1.13 ToObject(argument)\nvar defined = require('./$.defined');\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n},{\"./$.defined\":58}],121:[function(require,module,exports){\n'use strict';\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./$.is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n},{\"./$.is-object\":78}],122:[function(require,module,exports){\n'use strict';\n\nvar id = 0,\n    px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n},{}],123:[function(require,module,exports){\n'use strict';\n\nvar store = require('./$.shared')('wks'),\n    uid = require('./$.uid'),\n    _Symbol = require('./$.global').Symbol;\nmodule.exports = function (name) {\n  return store[name] || (store[name] = _Symbol && _Symbol[name] || (_Symbol || uid)('Symbol.' + name));\n};\n\n},{\"./$.global\":69,\"./$.shared\":107,\"./$.uid\":122}],124:[function(require,module,exports){\n'use strict';\n\nvar classof = require('./$.classof'),\n    ITERATOR = require('./$.wks')('iterator'),\n    Iterators = require('./$.iterators');\nmodule.exports = require('./$.core').getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];\n};\n\n},{\"./$.classof\":50,\"./$.core\":56,\"./$.iterators\":85,\"./$.wks\":123}],125:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    DESCRIPTORS = require('./$.descriptors'),\n    createDesc = require('./$.property-desc'),\n    html = require('./$.html'),\n    cel = require('./$.dom-create'),\n    has = require('./$.has'),\n    cof = require('./$.cof'),\n    invoke = require('./$.invoke'),\n    fails = require('./$.fails'),\n    anObject = require('./$.an-object'),\n    aFunction = require('./$.a-function'),\n    isObject = require('./$.is-object'),\n    toObject = require('./$.to-object'),\n    toIObject = require('./$.to-iobject'),\n    toInteger = require('./$.to-integer'),\n    toIndex = require('./$.to-index'),\n    toLength = require('./$.to-length'),\n    IObject = require('./$.iobject'),\n    IE_PROTO = require('./$.uid')('__proto__'),\n    createArrayMethod = require('./$.array-methods'),\n    arrayIndexOf = require('./$.array-includes')(false),\n    ObjectProto = Object.prototype,\n    ArrayProto = Array.prototype,\n    arraySlice = ArrayProto.slice,\n    arrayJoin = ArrayProto.join,\n    defineProperty = $.setDesc,\n    getOwnDescriptor = $.getDesc,\n    defineProperties = $.setDescs,\n    factories = {},\n    IE8_DOM_DEFINE;\n\nif (!DESCRIPTORS) {\n  IE8_DOM_DEFINE = !fails(function () {\n    return defineProperty(cel('div'), 'a', { get: function get() {\n        return 7;\n      } }).a != 7;\n  });\n  $.setDesc = function (O, P, Attributes) {\n    if (IE8_DOM_DEFINE) try {\n      return defineProperty(O, P, Attributes);\n    } catch (e) {/* empty */}\n    if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n    if ('value' in Attributes) anObject(O)[P] = Attributes.value;\n    return O;\n  };\n  $.getDesc = function (O, P) {\n    if (IE8_DOM_DEFINE) try {\n      return getOwnDescriptor(O, P);\n    } catch (e) {/* empty */}\n    if (has(O, P)) return createDesc(!ObjectProto.propertyIsEnumerable.call(O, P), O[P]);\n  };\n  $.setDescs = defineProperties = function defineProperties(O, Properties) {\n    anObject(O);\n    var keys = $.getKeys(Properties),\n        length = keys.length,\n        i = 0,\n        P;\n    while (length > i) {\n      $.setDesc(O, P = keys[i++], Properties[P]);\n    }return O;\n  };\n}\n$export($export.S + $export.F * !DESCRIPTORS, 'Object', {\n  // 19.1.2.6 / 15.2.3.3 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $.getDesc,\n  // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n  defineProperty: $.setDesc,\n  // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n  defineProperties: defineProperties\n});\n\n// IE 8- don't enum bug keys\nvar keys1 = ('constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,' + 'toLocaleString,toString,valueOf').split(',')\n// Additional keys for getOwnPropertyNames\n,\n    keys2 = keys1.concat('length', 'prototype'),\n    keysLen1 = keys1.length;\n\n// Create object with `null` prototype: use iframe Object with cleared prototype\nvar _createDict = function createDict() {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = cel('iframe'),\n      i = keysLen1,\n      gt = '>',\n      iframeDocument;\n  iframe.style.display = 'none';\n  html.appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write('<script>document.F=Object</script' + gt);\n  iframeDocument.close();\n  _createDict = iframeDocument.F;\n  while (i--) {\n    delete _createDict.prototype[keys1[i]];\n  }return _createDict();\n};\nvar createGetKeys = function createGetKeys(names, length) {\n  return function (object) {\n    var O = toIObject(object),\n        i = 0,\n        result = [],\n        key;\n    for (key in O) {\n      if (key != IE_PROTO) has(O, key) && result.push(key);\n    } // Don't enum bug & hidden keys\n    while (length > i) {\n      if (has(O, key = names[i++])) {\n        ~arrayIndexOf(result, key) || result.push(key);\n      }\n    }return result;\n  };\n};\nvar Empty = function Empty() {};\n$export($export.S, 'Object', {\n  // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\n  getPrototypeOf: $.getProto = $.getProto || function (O) {\n    O = toObject(O);\n    if (has(O, IE_PROTO)) return O[IE_PROTO];\n    if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n      return O.constructor.prototype;\n    }return O instanceof Object ? ObjectProto : null;\n  },\n  // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $.getNames = $.getNames || createGetKeys(keys2, keys2.length, true),\n  // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n  create: $.create = $.create || function (O, /*?*/Properties) {\n    var result;\n    if (O !== null) {\n      Empty.prototype = anObject(O);\n      result = new Empty();\n      Empty.prototype = null;\n      // add \"__proto__\" for Object.getPrototypeOf shim\n      result[IE_PROTO] = O;\n    } else result = _createDict();\n    return Properties === undefined ? result : defineProperties(result, Properties);\n  },\n  // 19.1.2.14 / 15.2.3.14 Object.keys(O)\n  keys: $.getKeys = $.getKeys || createGetKeys(keys1, keysLen1, false)\n});\n\nvar construct = function construct(F, len, args) {\n  if (!(len in factories)) {\n    for (var n = [], i = 0; i < len; i++) {\n      n[i] = 'a[' + i + ']';\n    }factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n  }\n  return factories[len](F, args);\n};\n\n// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\n$export($export.P, 'Function', {\n  bind: function bind(that /*, args... */) {\n    var fn = aFunction(this),\n        partArgs = arraySlice.call(arguments, 1);\n    var bound = function bound() /* args... */{\n      var args = partArgs.concat(arraySlice.call(arguments));\n      return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n    };\n    if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n    return bound;\n  }\n});\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * fails(function () {\n  if (html) arraySlice.call(html);\n}), 'Array', {\n  slice: function slice(begin, end) {\n    var len = toLength(this.length),\n        klass = cof(this);\n    end = end === undefined ? len : end;\n    if (klass == 'Array') return arraySlice.call(this, begin, end);\n    var start = toIndex(begin, len),\n        upTo = toIndex(end, len),\n        size = toLength(upTo - start),\n        cloned = Array(size),\n        i = 0;\n    for (; i < size; i++) {\n      cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i];\n    }return cloned;\n  }\n});\n$export($export.P + $export.F * (IObject != Object), 'Array', {\n  join: function join(separator) {\n    return arrayJoin.call(IObject(this), separator === undefined ? ',' : separator);\n  }\n});\n\n// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\n$export($export.S, 'Array', { isArray: require('./$.is-array') });\n\nvar createArrayReduce = function createArrayReduce(isRight) {\n  return function (callbackfn, memo) {\n    aFunction(callbackfn);\n    var O = IObject(this),\n        length = toLength(O.length),\n        index = isRight ? length - 1 : 0,\n        i = isRight ? -1 : 1;\n    if (arguments.length < 2) for (;;) {\n      if (index in O) {\n        memo = O[index];\n        index += i;\n        break;\n      }\n      index += i;\n      if (isRight ? index < 0 : length <= index) {\n        throw TypeError('Reduce of empty array with no initial value');\n      }\n    }\n    for (; isRight ? index >= 0 : length > index; index += i) {\n      if (index in O) {\n        memo = callbackfn(memo, O[index], index, this);\n      }\n    }return memo;\n  };\n};\n\nvar methodize = function methodize($fn) {\n  return function (arg1 /*, arg2 = undefined */) {\n    return $fn(this, arg1, arguments[1]);\n  };\n};\n\n$export($export.P, 'Array', {\n  // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n  forEach: $.each = $.each || methodize(createArrayMethod(0)),\n  // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n  map: methodize(createArrayMethod(1)),\n  // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n  filter: methodize(createArrayMethod(2)),\n  // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n  some: methodize(createArrayMethod(3)),\n  // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n  every: methodize(createArrayMethod(4)),\n  // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n  reduce: createArrayReduce(false),\n  // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n  reduceRight: createArrayReduce(true),\n  // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n  indexOf: methodize(arrayIndexOf),\n  // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n  lastIndexOf: function lastIndexOf(el, fromIndex /* = @[*-1] */) {\n    var O = toIObject(this),\n        length = toLength(O.length),\n        index = length - 1;\n    if (arguments.length > 1) index = Math.min(index, toInteger(fromIndex));\n    if (index < 0) index = toLength(length + index);\n    for (; index >= 0; index--) {\n      if (index in O) if (O[index] === el) return index;\n    }return -1;\n  }\n});\n\n// 20.3.3.1 / 15.9.4.4 Date.now()\n$export($export.S, 'Date', { now: function now() {\n    return +new Date();\n  } });\n\nvar lz = function lz(num) {\n  return num > 9 ? num : '0' + num;\n};\n\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (fails(function () {\n  return new Date(-5e13 - 1).toISOString() != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n  new Date(NaN).toISOString();\n})), 'Date', {\n  toISOString: function toISOString() {\n    if (!isFinite(this)) throw RangeError('Invalid time value');\n    var d = this,\n        y = d.getUTCFullYear(),\n        m = d.getUTCMilliseconds(),\n        s = y < 0 ? '-' : y > 9999 ? '+' : '';\n    return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n  }\n});\n\n},{\"./$\":86,\"./$.a-function\":42,\"./$.an-object\":44,\"./$.array-includes\":47,\"./$.array-methods\":48,\"./$.cof\":51,\"./$.descriptors\":59,\"./$.dom-create\":60,\"./$.export\":62,\"./$.fails\":64,\"./$.has\":70,\"./$.html\":72,\"./$.invoke\":73,\"./$.iobject\":74,\"./$.is-array\":76,\"./$.is-object\":78,\"./$.property-desc\":99,\"./$.to-index\":116,\"./$.to-integer\":117,\"./$.to-iobject\":118,\"./$.to-length\":119,\"./$.to-object\":120,\"./$.uid\":122}],126:[function(require,module,exports){\n'use strict';\n\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./$.export');\n\n$export($export.P, 'Array', { copyWithin: require('./$.array-copy-within') });\n\nrequire('./$.add-to-unscopables')('copyWithin');\n\n},{\"./$.add-to-unscopables\":43,\"./$.array-copy-within\":45,\"./$.export\":62}],127:[function(require,module,exports){\n'use strict';\n\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./$.export');\n\n$export($export.P, 'Array', { fill: require('./$.array-fill') });\n\nrequire('./$.add-to-unscopables')('fill');\n\n},{\"./$.add-to-unscopables\":43,\"./$.array-fill\":46,\"./$.export\":62}],128:[function(require,module,exports){\n'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\n\nvar $export = require('./$.export'),\n    $find = require('./$.array-methods')(6),\n    KEY = 'findIndex',\n    forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () {\n  forced = false;\n});\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn /*, that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\nrequire('./$.add-to-unscopables')(KEY);\n\n},{\"./$.add-to-unscopables\":43,\"./$.array-methods\":48,\"./$.export\":62}],129:[function(require,module,exports){\n'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\n\nvar $export = require('./$.export'),\n    $find = require('./$.array-methods')(5),\n    KEY = 'find',\n    forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () {\n  forced = false;\n});\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn /*, that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\nrequire('./$.add-to-unscopables')(KEY);\n\n},{\"./$.add-to-unscopables\":43,\"./$.array-methods\":48,\"./$.export\":62}],130:[function(require,module,exports){\n'use strict';\n\nvar ctx = require('./$.ctx'),\n    $export = require('./$.export'),\n    toObject = require('./$.to-object'),\n    call = require('./$.iter-call'),\n    isArrayIter = require('./$.is-array-iter'),\n    toLength = require('./$.to-length'),\n    getIterFn = require('./core.get-iterator-method');\n$export($export.S + $export.F * !require('./$.iter-detect')(function (iter) {\n  Array.from(iter);\n}), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /*, mapfn = undefined, thisArg = undefined*/) {\n    var O = toObject(arrayLike),\n        C = typeof this == 'function' ? this : Array,\n        $$ = arguments,\n        $$len = $$.length,\n        mapfn = $$len > 1 ? $$[1] : undefined,\n        mapping = mapfn !== undefined,\n        index = 0,\n        iterFn = getIterFn(O),\n        length,\n        result,\n        step,\n        iterator;\n    if (mapping) mapfn = ctx(mapfn, $$len > 2 ? $$[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        result[index] = mapping ? call(iterator, mapfn, [step.value, index], true) : step.value;\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        result[index] = mapping ? mapfn(O[index], index) : O[index];\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n},{\"./$.ctx\":57,\"./$.export\":62,\"./$.is-array-iter\":75,\"./$.iter-call\":80,\"./$.iter-detect\":83,\"./$.to-length\":119,\"./$.to-object\":120,\"./core.get-iterator-method\":124}],131:[function(require,module,exports){\n'use strict';\n\nvar addToUnscopables = require('./$.add-to-unscopables'),\n    step = require('./$.iter-step'),\n    Iterators = require('./$.iterators'),\n    toIObject = require('./$.to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./$.iter-define')(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0; // next index\n  this._k = kind; // kind\n  // 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t,\n      kind = this._k,\n      index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n},{\"./$.add-to-unscopables\":43,\"./$.iter-define\":82,\"./$.iter-step\":84,\"./$.iterators\":85,\"./$.to-iobject\":118}],132:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./$.fails')(function () {\n  function F() {}\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of() /* ...args */{\n    var index = 0,\n        $$ = arguments,\n        $$len = $$.length,\n        result = new (typeof this == 'function' ? this : Array)($$len);\n    while ($$len > index) {\n      result[index] = $$[index++];\n    }result.length = $$len;\n    return result;\n  }\n});\n\n},{\"./$.export\":62,\"./$.fails\":64}],133:[function(require,module,exports){\n'use strict';\n\nrequire('./$.set-species')('Array');\n\n},{\"./$.set-species\":105}],134:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    isObject = require('./$.is-object'),\n    HAS_INSTANCE = require('./$.wks')('hasInstance'),\n    FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif (!(HAS_INSTANCE in FunctionProto)) $.setDesc(FunctionProto, HAS_INSTANCE, { value: function value(O) {\n    if (typeof this != 'function' || !isObject(O)) return false;\n    if (!isObject(this.prototype)) return O instanceof this;\n    // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n    while (O = $.getProto(O)) {\n      if (this.prototype === O) return true;\n    }return false;\n  } });\n\n},{\"./$\":86,\"./$.is-object\":78,\"./$.wks\":123}],135:[function(require,module,exports){\n'use strict';\n\nvar setDesc = require('./$').setDesc,\n    createDesc = require('./$.property-desc'),\n    has = require('./$.has'),\n    FProto = Function.prototype,\n    nameRE = /^\\s*function ([^ (]*)/,\n    NAME = 'name';\n// 19.2.4.2 name\nNAME in FProto || require('./$.descriptors') && setDesc(FProto, NAME, {\n  configurable: true,\n  get: function get() {\n    var match = ('' + this).match(nameRE),\n        name = match ? match[1] : '';\n    has(this, NAME) || setDesc(this, NAME, createDesc(5, name));\n    return name;\n  }\n});\n\n},{\"./$\":86,\"./$.descriptors\":59,\"./$.has\":70,\"./$.property-desc\":99}],136:[function(require,module,exports){\n'use strict';\n\nvar strong = require('./$.collection-strong');\n\n// 23.1 Map Objects\nrequire('./$.collection')('Map', function (get) {\n  return function Map() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(this, key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(this, key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n},{\"./$.collection\":55,\"./$.collection-strong\":52}],137:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.3 Math.acosh(x)\nvar $export = require('./$.export'),\n    log1p = require('./$.math-log1p'),\n    sqrt = Math.sqrt,\n    $acosh = Math.acosh;\n\n// V8 bug https://code.google.com/p/v8/issues/detail?id=3509\n$export($export.S + $export.F * !($acosh && Math.floor($acosh(Number.MAX_VALUE)) == 710), 'Math', {\n  acosh: function acosh(x) {\n    return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n  }\n});\n\n},{\"./$.export\":62,\"./$.math-log1p\":90}],138:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.5 Math.asinh(x)\nvar $export = require('./$.export');\n\nfunction asinh(x) {\n  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n$export($export.S, 'Math', { asinh: asinh });\n\n},{\"./$.export\":62}],139:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.7 Math.atanh(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  atanh: function atanh(x) {\n    return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n  }\n});\n\n},{\"./$.export\":62}],140:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./$.export'),\n    sign = require('./$.math-sign');\n\n$export($export.S, 'Math', {\n  cbrt: function cbrt(x) {\n    return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n  }\n});\n\n},{\"./$.export\":62,\"./$.math-sign\":91}],141:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.11 Math.clz32(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  clz32: function clz32(x) {\n    return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n  }\n});\n\n},{\"./$.export\":62}],142:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.12 Math.cosh(x)\nvar $export = require('./$.export'),\n    exp = Math.exp;\n\n$export($export.S, 'Math', {\n  cosh: function cosh(x) {\n    return (exp(x = +x) + exp(-x)) / 2;\n  }\n});\n\n},{\"./$.export\":62}],143:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.14 Math.expm1(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', { expm1: require('./$.math-expm1') });\n\n},{\"./$.export\":62,\"./$.math-expm1\":89}],144:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.16 Math.fround(x)\nvar $export = require('./$.export'),\n    sign = require('./$.math-sign'),\n    pow = Math.pow,\n    EPSILON = pow(2, -52),\n    EPSILON32 = pow(2, -23),\n    MAX32 = pow(2, 127) * (2 - EPSILON32),\n    MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function roundTiesToEven(n) {\n  return n + 1 / EPSILON - 1 / EPSILON;\n};\n\n$export($export.S, 'Math', {\n  fround: function fround(x) {\n    var $abs = Math.abs(x),\n        $sign = sign(x),\n        a,\n        result;\n    if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n    a = (1 + EPSILON32 / EPSILON) * $abs;\n    result = a - (a - $abs);\n    if (result > MAX32 || result != result) return $sign * Infinity;\n    return $sign * result;\n  }\n});\n\n},{\"./$.export\":62,\"./$.math-sign\":91}],145:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./$.export'),\n    abs = Math.abs;\n\n$export($export.S, 'Math', {\n  hypot: function hypot(value1, value2) {\n    // eslint-disable-line no-unused-vars\n    var sum = 0,\n        i = 0,\n        $$ = arguments,\n        $$len = $$.length,\n        larg = 0,\n        arg,\n        div;\n    while (i < $$len) {\n      arg = abs($$[i++]);\n      if (larg < arg) {\n        div = larg / arg;\n        sum = sum * div * div + 1;\n        larg = arg;\n      } else if (arg > 0) {\n        div = arg / larg;\n        sum += div * div;\n      } else sum += arg;\n    }\n    return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n  }\n});\n\n},{\"./$.export\":62}],146:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./$.export'),\n    $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./$.fails')(function () {\n  return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n  imul: function imul(x, y) {\n    var UINT16 = 0xffff,\n        xn = +x,\n        yn = +y,\n        xl = UINT16 & xn,\n        yl = UINT16 & yn;\n    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n  }\n});\n\n},{\"./$.export\":62,\"./$.fails\":64}],147:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.21 Math.log10(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  log10: function log10(x) {\n    return Math.log(x) / Math.LN10;\n  }\n});\n\n},{\"./$.export\":62}],148:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.20 Math.log1p(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', { log1p: require('./$.math-log1p') });\n\n},{\"./$.export\":62,\"./$.math-log1p\":90}],149:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.22 Math.log2(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  log2: function log2(x) {\n    return Math.log(x) / Math.LN2;\n  }\n});\n\n},{\"./$.export\":62}],150:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.28 Math.sign(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', { sign: require('./$.math-sign') });\n\n},{\"./$.export\":62,\"./$.math-sign\":91}],151:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.30 Math.sinh(x)\nvar $export = require('./$.export'),\n    expm1 = require('./$.math-expm1'),\n    exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./$.fails')(function () {\n  return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n  sinh: function sinh(x) {\n    return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n  }\n});\n\n},{\"./$.export\":62,\"./$.fails\":64,\"./$.math-expm1\":89}],152:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.33 Math.tanh(x)\nvar $export = require('./$.export'),\n    expm1 = require('./$.math-expm1'),\n    exp = Math.exp;\n\n$export($export.S, 'Math', {\n  tanh: function tanh(x) {\n    var a = expm1(x = +x),\n        b = expm1(-x);\n    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n  }\n});\n\n},{\"./$.export\":62,\"./$.math-expm1\":89}],153:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.34 Math.trunc(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  trunc: function trunc(it) {\n    return (it > 0 ? Math.floor : Math.ceil)(it);\n  }\n});\n\n},{\"./$.export\":62}],154:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    global = require('./$.global'),\n    has = require('./$.has'),\n    cof = require('./$.cof'),\n    toPrimitive = require('./$.to-primitive'),\n    fails = require('./$.fails'),\n    $trim = require('./$.string-trim').trim,\n    NUMBER = 'Number',\n    $Number = global[NUMBER],\n    Base = $Number,\n    proto = $Number.prototype\n// Opera ~12 has broken Object#toString\n,\n    BROKEN_COF = cof($.create(proto)) == NUMBER,\n    TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function toNumber(argument) {\n  var it = toPrimitive(argument, false);\n  if (typeof it == 'string' && it.length > 2) {\n    it = TRIM ? it.trim() : $trim(it, 3);\n    var first = it.charCodeAt(0),\n        third,\n        radix,\n        maxCode;\n    if (first === 43 || first === 45) {\n      third = it.charCodeAt(2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n        switch (it.charCodeAt(1)) {\n          case 66:case 98:\n            radix = 2;maxCode = 49;break; // fast equal /^0b[01]+$/i\n          case 79:case 111:\n            radix = 8;maxCode = 55;break; // fast equal /^0o[0-7]+$/i\n          default:\n            return +it;\n        }\n        for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n          code = digits.charCodeAt(i);\n          // parseInt parses a string to a first unavailable symbol\n          // but ToNumber should return NaN if a string contains unavailable symbols\n          if (code < 48 || code > maxCode) return NaN;\n        }return parseInt(digits, radix);\n      }\n  }return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n  $Number = function Number(value) {\n    var it = arguments.length < 1 ? 0 : value,\n        that = this;\n    return that instanceof $Number\n    // check on 1..constructor(foo) case\n     && (BROKEN_COF ? fails(function () {\n      proto.valueOf.call(that);\n    }) : cof(that) != NUMBER) ? new Base(toNumber(it)) : toNumber(it);\n  };\n  $.each.call(require('./$.descriptors') ? $.getNames(Base) : (\n  // ES3:\n  'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n  // ES6 (in case, if modules with ES6 Number statics required before):\n  'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), function (key) {\n    if (has(Base, key) && !has($Number, key)) {\n      $.setDesc($Number, key, $.getDesc(Base, key));\n    }\n  });\n  $Number.prototype = proto;\n  proto.constructor = $Number;\n  require('./$.redefine')(global, NUMBER, $Number);\n}\n\n},{\"./$\":86,\"./$.cof\":51,\"./$.descriptors\":59,\"./$.fails\":64,\"./$.global\":69,\"./$.has\":70,\"./$.redefine\":101,\"./$.string-trim\":114,\"./$.to-primitive\":121}],155:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.1 Number.EPSILON\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n\n},{\"./$.export\":62}],156:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./$.export'),\n    _isFinite = require('./$.global').isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n},{\"./$.export\":62,\"./$.global\":69}],157:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { isInteger: require('./$.is-integer') });\n\n},{\"./$.export\":62,\"./$.is-integer\":77}],158:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    return number != number;\n  }\n});\n\n},{\"./$.export\":62}],159:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./$.export'),\n    isInteger = require('./$.is-integer'),\n    abs = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n},{\"./$.export\":62,\"./$.is-integer\":77}],160:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n\n},{\"./$.export\":62}],161:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n\n},{\"./$.export\":62}],162:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.12 Number.parseFloat(string)\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { parseFloat: parseFloat });\n\n},{\"./$.export\":62}],163:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.13 Number.parseInt(string, radix)\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { parseInt: parseInt });\n\n},{\"./$.export\":62}],164:[function(require,module,exports){\n'use strict';\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./$.export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./$.object-assign') });\n\n},{\"./$.export\":62,\"./$.object-assign\":93}],165:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(it) : it;\n  };\n});\n\n},{\"./$.is-object\":78,\"./$.object-sap\":94}],166:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./$.to-iobject');\n\nrequire('./$.object-sap')('getOwnPropertyDescriptor', function ($getOwnPropertyDescriptor) {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n},{\"./$.object-sap\":94,\"./$.to-iobject\":118}],167:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./$.object-sap')('getOwnPropertyNames', function () {\n  return require('./$.get-names').get;\n});\n\n},{\"./$.get-names\":68,\"./$.object-sap\":94}],168:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./$.to-object');\n\nrequire('./$.object-sap')('getPrototypeOf', function ($getPrototypeOf) {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n},{\"./$.object-sap\":94,\"./$.to-object\":120}],169:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n},{\"./$.is-object\":78,\"./$.object-sap\":94}],170:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n},{\"./$.is-object\":78,\"./$.object-sap\":94}],171:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n},{\"./$.is-object\":78,\"./$.object-sap\":94}],172:[function(require,module,exports){\n'use strict';\n\n// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./$.export');\n$export($export.S, 'Object', { is: require('./$.same-value') });\n\n},{\"./$.export\":62,\"./$.same-value\":103}],173:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = require('./$.to-object');\n\nrequire('./$.object-sap')('keys', function ($keys) {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n},{\"./$.object-sap\":94,\"./$.to-object\":120}],174:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(it) : it;\n  };\n});\n\n},{\"./$.is-object\":78,\"./$.object-sap\":94}],175:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.17 Object.seal(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(it) : it;\n  };\n});\n\n},{\"./$.is-object\":78,\"./$.object-sap\":94}],176:[function(require,module,exports){\n'use strict';\n\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./$.export');\n$export($export.S, 'Object', { setPrototypeOf: require('./$.set-proto').set });\n\n},{\"./$.export\":62,\"./$.set-proto\":104}],177:[function(require,module,exports){\n'use strict';\n// 19.1.3.6 Object.prototype.toString()\n\nvar classof = require('./$.classof'),\n    test = {};\ntest[require('./$.wks')('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n  require('./$.redefine')(Object.prototype, 'toString', function toString() {\n    return '[object ' + classof(this) + ']';\n  }, true);\n}\n\n},{\"./$.classof\":50,\"./$.redefine\":101,\"./$.wks\":123}],178:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    LIBRARY = require('./$.library'),\n    global = require('./$.global'),\n    ctx = require('./$.ctx'),\n    classof = require('./$.classof'),\n    $export = require('./$.export'),\n    isObject = require('./$.is-object'),\n    anObject = require('./$.an-object'),\n    aFunction = require('./$.a-function'),\n    strictNew = require('./$.strict-new'),\n    forOf = require('./$.for-of'),\n    setProto = require('./$.set-proto').set,\n    same = require('./$.same-value'),\n    SPECIES = require('./$.wks')('species'),\n    speciesConstructor = require('./$.species-constructor'),\n    asap = require('./$.microtask'),\n    PROMISE = 'Promise',\n    process = global.process,\n    isNode = classof(process) == 'process',\n    P = global[PROMISE],\n    Wrapper;\n\nvar testResolve = function testResolve(sub) {\n  var test = new P(function () {});\n  if (sub) test.constructor = Object;\n  return P.resolve(test) === test;\n};\n\nvar USE_NATIVE = function () {\n  var works = false;\n  function P2(x) {\n    var self = new P(x);\n    setProto(self, P2.prototype);\n    return self;\n  }\n  try {\n    works = P && P.resolve && testResolve();\n    setProto(P2, P);\n    P2.prototype = $.create(P.prototype, { constructor: { value: P2 } });\n    // actual Firefox has broken subclass support, test that\n    if (!(P2.resolve(5).then(function () {}) instanceof P2)) {\n      works = false;\n    }\n    // actual V8 bug, https://code.google.com/p/v8/issues/detail?id=4162\n    if (works && require('./$.descriptors')) {\n      var thenableThenGotten = false;\n      P.resolve($.setDesc({}, 'then', {\n        get: function get() {\n          thenableThenGotten = true;\n        }\n      }));\n      works = thenableThenGotten;\n    }\n  } catch (e) {\n    works = false;\n  }\n  return works;\n}();\n\n// helpers\nvar sameConstructor = function sameConstructor(a, b) {\n  // library wrapper special case\n  if (LIBRARY && a === P && b === Wrapper) return true;\n  return same(a, b);\n};\nvar getConstructor = function getConstructor(C) {\n  var S = anObject(C)[SPECIES];\n  return S != undefined ? S : C;\n};\nvar isThenable = function isThenable(it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar PromiseCapability = function PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve), this.reject = aFunction(reject);\n};\nvar perform = function perform(exec) {\n  try {\n    exec();\n  } catch (e) {\n    return { error: e };\n  }\n};\nvar notify = function notify(record, isReject) {\n  if (record.n) return;\n  record.n = true;\n  var chain = record.c;\n  asap(function () {\n    var value = record.v,\n        ok = record.s == 1,\n        i = 0;\n    var run = function run(reaction) {\n      var handler = ok ? reaction.ok : reaction.fail,\n          resolve = reaction.resolve,\n          reject = reaction.reject,\n          result,\n          then;\n      try {\n        if (handler) {\n          if (!ok) record.h = true;\n          result = handler === true ? value : handler(value);\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        reject(e);\n      }\n    };\n    while (chain.length > i) {\n      run(chain[i++]);\n    } // variable length - can't use forEach\n    chain.length = 0;\n    record.n = false;\n    if (isReject) setTimeout(function () {\n      var promise = record.p,\n          handler,\n          console;\n      if (isUnhandled(promise)) {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      }record.a = undefined;\n    }, 1);\n  });\n};\nvar isUnhandled = function isUnhandled(promise) {\n  var record = promise._d,\n      chain = record.a || record.c,\n      i = 0,\n      reaction;\n  if (record.h) return false;\n  while (chain.length > i) {\n    reaction = chain[i++];\n    if (reaction.fail || !isUnhandled(reaction.promise)) return false;\n  }return true;\n};\nvar $reject = function $reject(value) {\n  var record = this;\n  if (record.d) return;\n  record.d = true;\n  record = record.r || record; // unwrap\n  record.v = value;\n  record.s = 2;\n  record.a = record.c.slice();\n  notify(record, true);\n};\nvar $resolve = function $resolve(value) {\n  var record = this,\n      then;\n  if (record.d) return;\n  record.d = true;\n  record = record.r || record; // unwrap\n  try {\n    if (record.p === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      asap(function () {\n        var wrapper = { r: record, d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      record.v = value;\n      record.s = 1;\n      notify(record, false);\n    }\n  } catch (e) {\n    $reject.call({ r: record, d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  P = function Promise(executor) {\n    aFunction(executor);\n    var record = this._d = {\n      p: strictNew(this, P, PROMISE), // <- promise\n      c: [], // <- awaiting reactions\n      a: undefined, // <- checked in isUnhandled reactions\n      s: 0, // <- state\n      d: false, // <- done\n      v: undefined, // <- value\n      h: false, // <- handled rejection\n      n: false // <- notify\n    };\n    try {\n      executor(ctx($resolve, record, 1), ctx($reject, record, 1));\n    } catch (err) {\n      $reject.call(record, err);\n    }\n  };\n  require('./$.redefine-all')(P.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = new PromiseCapability(speciesConstructor(this, P)),\n          promise = reaction.promise,\n          record = this._d;\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      record.c.push(reaction);\n      if (record.a) record.a.push(reaction);\n      if (record.s) notify(record, false);\n      return promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function _catch(onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: P });\nrequire('./$.set-to-string-tag')(P, PROMISE);\nrequire('./$.set-species')(PROMISE);\nWrapper = require('./$.core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = new PromiseCapability(this),\n        $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (!USE_NATIVE || testResolve(true)), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    // instanceof instead of internal slot check because we should fix it without replacement native Promise core\n    if (x instanceof P && sameConstructor(x.constructor, this)) return x;\n    var capability = new PromiseCapability(this),\n        $$resolve = capability.resolve;\n    $$resolve(x);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./$.iter-detect')(function (iter) {\n  P.all(iter)['catch'](function () {});\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = getConstructor(this),\n        capability = new PromiseCapability(C),\n        resolve = capability.resolve,\n        reject = capability.reject,\n        values = [];\n    var abrupt = perform(function () {\n      forOf(iterable, false, values.push, values);\n      var remaining = values.length,\n          results = Array(remaining);\n      if (remaining) $.each.call(values, function (promise, index) {\n        var alreadyCalled = false;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          results[index] = value;\n          --remaining || resolve(results);\n        }, reject);\n      });else resolve(results);\n    });\n    if (abrupt) reject(abrupt.error);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = getConstructor(this),\n        capability = new PromiseCapability(C),\n        reject = capability.reject;\n    var abrupt = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (abrupt) reject(abrupt.error);\n    return capability.promise;\n  }\n});\n\n},{\"./$\":86,\"./$.a-function\":42,\"./$.an-object\":44,\"./$.classof\":50,\"./$.core\":56,\"./$.ctx\":57,\"./$.descriptors\":59,\"./$.export\":62,\"./$.for-of\":67,\"./$.global\":69,\"./$.is-object\":78,\"./$.iter-detect\":83,\"./$.library\":88,\"./$.microtask\":92,\"./$.redefine-all\":100,\"./$.same-value\":103,\"./$.set-proto\":104,\"./$.set-species\":105,\"./$.set-to-string-tag\":106,\"./$.species-constructor\":108,\"./$.strict-new\":109,\"./$.wks\":123}],179:[function(require,module,exports){\n'use strict';\n\n// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./$.export'),\n    _apply = Function.apply;\n\n$export($export.S, 'Reflect', {\n  apply: function apply(target, thisArgument, argumentsList) {\n    return _apply.call(target, thisArgument, argumentsList);\n  }\n});\n\n},{\"./$.export\":62}],180:[function(require,module,exports){\n'use strict';\n\n// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    aFunction = require('./$.a-function'),\n    anObject = require('./$.an-object'),\n    isObject = require('./$.is-object'),\n    bind = Function.bind || require('./$.core').Function.prototype.bind;\n\n// MS Edge supports only 2 arguments\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\n$export($export.S + $export.F * require('./$.fails')(function () {\n  function F() {}\n  return !(Reflect.construct(function () {}, [], F) instanceof F);\n}), 'Reflect', {\n  construct: function construct(Target, args /*, newTarget*/) {\n    aFunction(Target);\n    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n    if (Target == newTarget) {\n      // w/o altered newTarget, optimization for 0-4 arguments\n      if (args != undefined) switch (anObject(args).length) {\n        case 0:\n          return new Target();\n        case 1:\n          return new Target(args[0]);\n        case 2:\n          return new Target(args[0], args[1]);\n        case 3:\n          return new Target(args[0], args[1], args[2]);\n        case 4:\n          return new Target(args[0], args[1], args[2], args[3]);\n      }\n      // w/o altered newTarget, lot of arguments case\n      var $args = [null];\n      $args.push.apply($args, args);\n      return new (bind.apply(Target, $args))();\n    }\n    // with altered newTarget, not support built-in constructors\n    var proto = newTarget.prototype,\n        instance = $.create(isObject(proto) ? proto : Object.prototype),\n        result = Function.apply.call(Target, instance, args);\n    return isObject(result) ? result : instance;\n  }\n});\n\n},{\"./$\":86,\"./$.a-function\":42,\"./$.an-object\":44,\"./$.core\":56,\"./$.export\":62,\"./$.fails\":64,\"./$.is-object\":78}],181:[function(require,module,exports){\n'use strict';\n\n// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    anObject = require('./$.an-object');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./$.fails')(function () {\n  Reflect.defineProperty($.setDesc({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n  defineProperty: function defineProperty(target, propertyKey, attributes) {\n    anObject(target);\n    try {\n      $.setDesc(target, propertyKey, attributes);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.export\":62,\"./$.fails\":64}],182:[function(require,module,exports){\n'use strict';\n\n// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./$.export'),\n    getDesc = require('./$').getDesc,\n    anObject = require('./$.an-object');\n\n$export($export.S, 'Reflect', {\n  deleteProperty: function deleteProperty(target, propertyKey) {\n    var desc = getDesc(anObject(target), propertyKey);\n    return desc && !desc.configurable ? false : delete target[propertyKey];\n  }\n});\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.export\":62}],183:[function(require,module,exports){\n'use strict';\n// 26.1.5 Reflect.enumerate(target)\n\nvar $export = require('./$.export'),\n    anObject = require('./$.an-object');\nvar Enumerate = function Enumerate(iterated) {\n  this._t = anObject(iterated); // target\n  this._i = 0; // next index\n  var keys = this._k = [] // keys\n  ,\n      key;\n  for (key in iterated) {\n    keys.push(key);\n  }\n};\nrequire('./$.iter-create')(Enumerate, 'Object', function () {\n  var that = this,\n      keys = that._k,\n      key;\n  do {\n    if (that._i >= keys.length) return { value: undefined, done: true };\n  } while (!((key = keys[that._i++]) in that._t));\n  return { value: key, done: false };\n});\n\n$export($export.S, 'Reflect', {\n  enumerate: function enumerate(target) {\n    return new Enumerate(target);\n  }\n});\n\n},{\"./$.an-object\":44,\"./$.export\":62,\"./$.iter-create\":81}],184:[function(require,module,exports){\n'use strict';\n\n// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    anObject = require('./$.an-object');\n\n$export($export.S, 'Reflect', {\n  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n    return $.getDesc(anObject(target), propertyKey);\n  }\n});\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.export\":62}],185:[function(require,module,exports){\n'use strict';\n\n// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./$.export'),\n    getProto = require('./$').getProto,\n    anObject = require('./$.an-object');\n\n$export($export.S, 'Reflect', {\n  getPrototypeOf: function getPrototypeOf(target) {\n    return getProto(anObject(target));\n  }\n});\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.export\":62}],186:[function(require,module,exports){\n'use strict';\n\n// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar $ = require('./$'),\n    has = require('./$.has'),\n    $export = require('./$.export'),\n    isObject = require('./$.is-object'),\n    anObject = require('./$.an-object');\n\nfunction get(target, propertyKey /*, receiver*/) {\n  var receiver = arguments.length < 3 ? target : arguments[2],\n      desc,\n      proto;\n  if (anObject(target) === receiver) return target[propertyKey];\n  if (desc = $.getDesc(target, propertyKey)) return has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined;\n  if (isObject(proto = $.getProto(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.export\":62,\"./$.has\":70,\"./$.is-object\":78}],187:[function(require,module,exports){\n'use strict';\n\n// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./$.export');\n\n$export($export.S, 'Reflect', {\n  has: function has(target, propertyKey) {\n    return propertyKey in target;\n  }\n});\n\n},{\"./$.export\":62}],188:[function(require,module,exports){\n'use strict';\n\n// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./$.export'),\n    anObject = require('./$.an-object'),\n    $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n  isExtensible: function isExtensible(target) {\n    anObject(target);\n    return $isExtensible ? $isExtensible(target) : true;\n  }\n});\n\n},{\"./$.an-object\":44,\"./$.export\":62}],189:[function(require,module,exports){\n'use strict';\n\n// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./$.export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./$.own-keys') });\n\n},{\"./$.export\":62,\"./$.own-keys\":96}],190:[function(require,module,exports){\n'use strict';\n\n// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./$.export'),\n    anObject = require('./$.an-object'),\n    $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n  preventExtensions: function preventExtensions(target) {\n    anObject(target);\n    try {\n      if ($preventExtensions) $preventExtensions(target);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n},{\"./$.an-object\":44,\"./$.export\":62}],191:[function(require,module,exports){\n'use strict';\n\n// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./$.export'),\n    setProto = require('./$.set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n  setPrototypeOf: function setPrototypeOf(target, proto) {\n    setProto.check(target, proto);\n    try {\n      setProto.set(target, proto);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n},{\"./$.export\":62,\"./$.set-proto\":104}],192:[function(require,module,exports){\n'use strict';\n\n// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar $ = require('./$'),\n    has = require('./$.has'),\n    $export = require('./$.export'),\n    createDesc = require('./$.property-desc'),\n    anObject = require('./$.an-object'),\n    isObject = require('./$.is-object');\n\nfunction set(target, propertyKey, V /*, receiver*/) {\n  var receiver = arguments.length < 4 ? target : arguments[3],\n      ownDesc = $.getDesc(anObject(target), propertyKey),\n      existingDescriptor,\n      proto;\n  if (!ownDesc) {\n    if (isObject(proto = $.getProto(target))) {\n      return set(proto, propertyKey, V, receiver);\n    }\n    ownDesc = createDesc(0);\n  }\n  if (has(ownDesc, 'value')) {\n    if (ownDesc.writable === false || !isObject(receiver)) return false;\n    existingDescriptor = $.getDesc(receiver, propertyKey) || createDesc(0);\n    existingDescriptor.value = V;\n    $.setDesc(receiver, propertyKey, existingDescriptor);\n    return true;\n  }\n  return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.export\":62,\"./$.has\":70,\"./$.is-object\":78,\"./$.property-desc\":99}],193:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    global = require('./$.global'),\n    isRegExp = require('./$.is-regexp'),\n    $flags = require('./$.flags'),\n    $RegExp = global.RegExp,\n    Base = $RegExp,\n    proto = $RegExp.prototype,\n    re1 = /a/g,\n    re2 = /a/g\n// \"new\" creates a new object, old webkit buggy here\n,\n    CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./$.descriptors') && (!CORRECT_NEW || require('./$.fails')(function () {\n  re2[require('./$.wks')('match')] = false;\n  // RegExp constructor can alter flags and IsRegExp works correct with @@match\n  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n  $RegExp = function RegExp(p, f) {\n    var piRE = isRegExp(p),\n        fiU = f === undefined;\n    return !(this instanceof $RegExp) && piRE && p.constructor === $RegExp && fiU ? p : CORRECT_NEW ? new Base(piRE && !fiU ? p.source : p, f) : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f);\n  };\n  $.each.call($.getNames(Base), function (key) {\n    key in $RegExp || $.setDesc($RegExp, key, {\n      configurable: true,\n      get: function get() {\n        return Base[key];\n      },\n      set: function set(it) {\n        Base[key] = it;\n      }\n    });\n  });\n  proto.constructor = $RegExp;\n  $RegExp.prototype = proto;\n  require('./$.redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./$.set-species')('RegExp');\n\n},{\"./$\":86,\"./$.descriptors\":59,\"./$.fails\":64,\"./$.flags\":66,\"./$.global\":69,\"./$.is-regexp\":79,\"./$.redefine\":101,\"./$.set-species\":105,\"./$.wks\":123}],194:[function(require,module,exports){\n'use strict';\n\n// 21.2.5.3 get RegExp.prototype.flags()\nvar $ = require('./$');\nif (require('./$.descriptors') && /./g.flags != 'g') $.setDesc(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: require('./$.flags')\n});\n\n},{\"./$\":86,\"./$.descriptors\":59,\"./$.flags\":66}],195:[function(require,module,exports){\n'use strict';\n\n// @@match logic\nrequire('./$.fix-re-wks')('match', 1, function (defined, MATCH) {\n  // 21.1.3.11 String.prototype.match(regexp)\n  return function match(regexp) {\n    'use strict';\n\n    var O = defined(this),\n        fn = regexp == undefined ? undefined : regexp[MATCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n  };\n});\n\n},{\"./$.fix-re-wks\":65}],196:[function(require,module,exports){\n'use strict';\n\n// @@replace logic\nrequire('./$.fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n  // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n  return function replace(searchValue, replaceValue) {\n    'use strict';\n\n    var O = defined(this),\n        fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n    return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue);\n  };\n});\n\n},{\"./$.fix-re-wks\":65}],197:[function(require,module,exports){\n'use strict';\n\n// @@search logic\nrequire('./$.fix-re-wks')('search', 1, function (defined, SEARCH) {\n  // 21.1.3.15 String.prototype.search(regexp)\n  return function search(regexp) {\n    'use strict';\n\n    var O = defined(this),\n        fn = regexp == undefined ? undefined : regexp[SEARCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n  };\n});\n\n},{\"./$.fix-re-wks\":65}],198:[function(require,module,exports){\n'use strict';\n\n// @@split logic\nrequire('./$.fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n  // 21.1.3.17 String.prototype.split(separator, limit)\n  return function split(separator, limit) {\n    'use strict';\n\n    var O = defined(this),\n        fn = separator == undefined ? undefined : separator[SPLIT];\n    return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n  };\n});\n\n},{\"./$.fix-re-wks\":65}],199:[function(require,module,exports){\n'use strict';\n\nvar strong = require('./$.collection-strong');\n\n// 23.2 Set Objects\nrequire('./$.collection')('Set', function (get) {\n  return function Set() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(this, value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n},{\"./$.collection\":55,\"./$.collection-strong\":52}],200:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $at = require('./$.string-at')(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n},{\"./$.export\":62,\"./$.string-at\":110}],201:[function(require,module,exports){\n// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\n\nvar $export = require('./$.export'),\n    toLength = require('./$.to-length'),\n    context = require('./$.string-context'),\n    ENDS_WITH = 'endsWith',\n    $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./$.fails-is-regexp')(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /*, endPosition = @length */) {\n    var that = context(this, searchString, ENDS_WITH),\n        $$ = arguments,\n        endPosition = $$.length > 1 ? $$[1] : undefined,\n        len = toLength(that.length),\n        end = endPosition === undefined ? len : Math.min(toLength(endPosition), len),\n        search = String(searchString);\n    return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;\n  }\n});\n\n},{\"./$.export\":62,\"./$.fails-is-regexp\":63,\"./$.string-context\":111,\"./$.to-length\":119}],202:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    toIndex = require('./$.to-index'),\n    fromCharCode = String.fromCharCode,\n    $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) {\n    // eslint-disable-line no-unused-vars\n    var res = [],\n        $$ = arguments,\n        $$len = $$.length,\n        i = 0,\n        code;\n    while ($$len > i) {\n      code = +$$[i++];\n      if (toIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));\n    }return res.join('');\n  }\n});\n\n},{\"./$.export\":62,\"./$.to-index\":116}],203:[function(require,module,exports){\n// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\n\nvar $export = require('./$.export'),\n    context = require('./$.string-context'),\n    INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./$.fails-is-regexp')(INCLUDES), 'String', {\n  includes: function includes(searchString /*, position = 0 */) {\n    return !! ~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n},{\"./$.export\":62,\"./$.fails-is-regexp\":63,\"./$.string-context\":111}],204:[function(require,module,exports){\n'use strict';\n\nvar $at = require('./$.string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./$.iter-define')(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n  this._i = 0; // next index\n  // 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t,\n      index = this._i,\n      point;\n  if (index >= O.length) return { value: undefined, done: true };\n  point = $at(O, index);\n  this._i += point.length;\n  return { value: point, done: false };\n});\n\n},{\"./$.iter-define\":82,\"./$.string-at\":110}],205:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    toIObject = require('./$.to-iobject'),\n    toLength = require('./$.to-length');\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw),\n        len = toLength(tpl.length),\n        $$ = arguments,\n        $$len = $$.length,\n        res = [],\n        i = 0;\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < $$len) res.push(String($$[i]));\n    }return res.join('');\n  }\n});\n\n},{\"./$.export\":62,\"./$.to-iobject\":118,\"./$.to-length\":119}],206:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export');\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: require('./$.string-repeat')\n});\n\n},{\"./$.export\":62,\"./$.string-repeat\":113}],207:[function(require,module,exports){\n// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\n\nvar $export = require('./$.export'),\n    toLength = require('./$.to-length'),\n    context = require('./$.string-context'),\n    STARTS_WITH = 'startsWith',\n    $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./$.fails-is-regexp')(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /*, position = 0 */) {\n    var that = context(this, searchString, STARTS_WITH),\n        $$ = arguments,\n        index = toLength(Math.min($$.length > 1 ? $$[1] : undefined, that.length)),\n        search = String(searchString);\n    return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;\n  }\n});\n\n},{\"./$.export\":62,\"./$.fails-is-regexp\":63,\"./$.string-context\":111,\"./$.to-length\":119}],208:[function(require,module,exports){\n'use strict';\n// 21.1.3.25 String.prototype.trim()\n\nrequire('./$.string-trim')('trim', function ($trim) {\n  return function trim() {\n    return $trim(this, 3);\n  };\n});\n\n},{\"./$.string-trim\":114}],209:[function(require,module,exports){\n'use strict';\n// ECMAScript 6 symbols shim\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar $ = require('./$'),\n    global = require('./$.global'),\n    has = require('./$.has'),\n    DESCRIPTORS = require('./$.descriptors'),\n    $export = require('./$.export'),\n    redefine = require('./$.redefine'),\n    $fails = require('./$.fails'),\n    shared = require('./$.shared'),\n    setToStringTag = require('./$.set-to-string-tag'),\n    uid = require('./$.uid'),\n    wks = require('./$.wks'),\n    keyOf = require('./$.keyof'),\n    $names = require('./$.get-names'),\n    enumKeys = require('./$.enum-keys'),\n    isArray = require('./$.is-array'),\n    anObject = require('./$.an-object'),\n    toIObject = require('./$.to-iobject'),\n    createDesc = require('./$.property-desc'),\n    getDesc = $.getDesc,\n    setDesc = $.setDesc,\n    _create = $.create,\n    getNames = $names.get,\n    $Symbol = global.Symbol,\n    $JSON = global.JSON,\n    _stringify = $JSON && $JSON.stringify,\n    setter = false,\n    HIDDEN = wks('_hidden'),\n    isEnum = $.isEnum,\n    SymbolRegistry = shared('symbol-registry'),\n    AllSymbols = shared('symbols'),\n    useNative = typeof $Symbol == 'function',\n    ObjectProto = Object.prototype;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(setDesc({}, 'a', {\n    get: function get() {\n      return setDesc(this, 'a', { value: 7 }).a;\n    }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = getDesc(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  setDesc(it, key, D);\n  if (protoDesc && it !== ObjectProto) setDesc(ObjectProto, key, protoDesc);\n} : setDesc;\n\nvar wrap = function wrap(tag) {\n  var sym = AllSymbols[tag] = _create($Symbol.prototype);\n  sym._k = tag;\n  DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, {\n    configurable: true,\n    set: function set(value) {\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    }\n  });\n  return sym;\n};\n\nvar isSymbol = function isSymbol(it) {\n  return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) == 'symbol';\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (D && has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) setDesc(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    }return setSymbolDesc(it, key, D);\n  }return setDesc(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P)),\n      i = 0,\n      l = keys.length,\n      key;\n  while (l > i) {\n    $defineProperty(it, key = keys[i++], P[key]);\n  }return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key);\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  var D = getDesc(it = toIObject(it), key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = getNames(toIObject(it)),\n      result = [],\n      i = 0,\n      key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN) result.push(key);\n  }return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var names = getNames(toIObject(it)),\n      result = [],\n      i = 0,\n      key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++])) result.push(AllSymbols[key]);\n  }return result;\n};\nvar $stringify = function stringify(it) {\n  if (it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n  var args = [it],\n      i = 1,\n      $$ = arguments,\n      replacer,\n      $replacer;\n  while ($$.length > i) {\n    args.push($$[i++]);\n  }replacer = args[1];\n  if (typeof replacer == 'function') $replacer = replacer;\n  if ($replacer || !isArray(replacer)) replacer = function replacer(key, value) {\n    if ($replacer) value = $replacer.call(this, key, value);\n    if (!isSymbol(value)) return value;\n  };\n  args[1] = replacer;\n  return _stringify.apply($JSON, args);\n};\nvar buggyJSON = $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n});\n\n// 19.4.1.1 Symbol([description])\nif (!useNative) {\n  $Symbol = function _Symbol() {\n    if (isSymbol(this)) throw TypeError('Symbol is not a constructor');\n    return wrap(uid(arguments.length > 0 ? arguments[0] : undefined));\n  };\n  redefine($Symbol.prototype, 'toString', function toString() {\n    return this._k;\n  });\n\n  isSymbol = function isSymbol(it) {\n    return it instanceof $Symbol;\n  };\n\n  $.create = $create;\n  $.isEnum = $propertyIsEnumerable;\n  $.getDesc = $getOwnPropertyDescriptor;\n  $.setDesc = $defineProperty;\n  $.setDescs = $defineProperties;\n  $.getNames = $names.get = $getOwnPropertyNames;\n  $.getSymbols = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !require('./$.library')) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n}\n\nvar symbolStatics = {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function _for(key) {\n    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(key) {\n    return keyOf(SymbolRegistry, key);\n  },\n  useSetter: function useSetter() {\n    setter = true;\n  },\n  useSimple: function useSimple() {\n    setter = false;\n  }\n};\n// 19.4.2.2 Symbol.hasInstance\n// 19.4.2.3 Symbol.isConcatSpreadable\n// 19.4.2.4 Symbol.iterator\n// 19.4.2.6 Symbol.match\n// 19.4.2.8 Symbol.replace\n// 19.4.2.9 Symbol.search\n// 19.4.2.10 Symbol.species\n// 19.4.2.11 Symbol.split\n// 19.4.2.12 Symbol.toPrimitive\n// 19.4.2.13 Symbol.toStringTag\n// 19.4.2.14 Symbol.unscopables\n$.each.call(('hasInstance,isConcatSpreadable,iterator,match,replace,search,' + 'species,split,toPrimitive,toStringTag,unscopables').split(','), function (it) {\n  var sym = wks(it);\n  symbolStatics[it] = useNative ? sym : wrap(sym);\n});\n\nsetter = true;\n\n$export($export.G + $export.W, { Symbol: $Symbol });\n\n$export($export.S, 'Symbol', symbolStatics);\n\n$export($export.S + $export.F * !useNative, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!useNative || buggyJSON), 'JSON', { stringify: $stringify });\n\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n},{\"./$\":86,\"./$.an-object\":44,\"./$.descriptors\":59,\"./$.enum-keys\":61,\"./$.export\":62,\"./$.fails\":64,\"./$.get-names\":68,\"./$.global\":69,\"./$.has\":70,\"./$.is-array\":76,\"./$.keyof\":87,\"./$.library\":88,\"./$.property-desc\":99,\"./$.redefine\":101,\"./$.set-to-string-tag\":106,\"./$.shared\":107,\"./$.to-iobject\":118,\"./$.uid\":122,\"./$.wks\":123}],210:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    redefine = require('./$.redefine'),\n    weak = require('./$.collection-weak'),\n    isObject = require('./$.is-object'),\n    has = require('./$.has'),\n    frozenStore = weak.frozenStore,\n    WEAK = weak.WEAK,\n    isExtensible = Object.isExtensible || isObject,\n    tmp = {};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = require('./$.collection')('WeakMap', function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      if (!isExtensible(key)) return frozenStore(this).get(key);\n      if (has(key, WEAK)) return key[WEAK][this._i];\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(this, key, value);\n  }\n}, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7) {\n  $.each.call(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype,\n        method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on leaky map\n      if (isObject(a) && !isExtensible(a)) {\n        var result = frozenStore(this)[key](a, b);\n        return key == 'set' ? this : result;\n        // store all the rest on native weakmap\n      }return method.call(this, a, b);\n    });\n  });\n}\n\n},{\"./$\":86,\"./$.collection\":55,\"./$.collection-weak\":54,\"./$.has\":70,\"./$.is-object\":78,\"./$.redefine\":101}],211:[function(require,module,exports){\n'use strict';\n\nvar weak = require('./$.collection-weak');\n\n// 23.4 WeakSet Objects\nrequire('./$.collection')('WeakSet', function (get) {\n  return function WeakSet() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(this, value, true);\n  }\n}, weak, false, true);\n\n},{\"./$.collection\":55,\"./$.collection-weak\":54}],212:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $includes = require('./$.array-includes')(true);\n\n$export($export.P, 'Array', {\n  // https://github.com/domenic/Array.prototype.includes\n  includes: function includes(el /*, fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\nrequire('./$.add-to-unscopables')('includes');\n\n},{\"./$.add-to-unscopables\":43,\"./$.array-includes\":47,\"./$.export\":62}],213:[function(require,module,exports){\n'use strict';\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./$.export');\n\n$export($export.P, 'Map', { toJSON: require('./$.collection-to-json')('Map') });\n\n},{\"./$.collection-to-json\":53,\"./$.export\":62}],214:[function(require,module,exports){\n'use strict';\n\n// http://goo.gl/XkBrjD\nvar $export = require('./$.export'),\n    $entries = require('./$.object-to-array')(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n},{\"./$.export\":62,\"./$.object-to-array\":95}],215:[function(require,module,exports){\n'use strict';\n\n// https://gist.github.com/WebReflection/9353781\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    ownKeys = require('./$.own-keys'),\n    toIObject = require('./$.to-iobject'),\n    createDesc = require('./$.property-desc');\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object),\n        setDesc = $.setDesc,\n        getDesc = $.getDesc,\n        keys = ownKeys(O),\n        result = {},\n        i = 0,\n        key,\n        D;\n    while (keys.length > i) {\n      D = getDesc(O, key = keys[i++]);\n      if (key in result) setDesc(result, key, createDesc(0, D));else result[key] = D;\n    }return result;\n  }\n});\n\n},{\"./$\":86,\"./$.export\":62,\"./$.own-keys\":96,\"./$.property-desc\":99,\"./$.to-iobject\":118}],216:[function(require,module,exports){\n'use strict';\n\n// http://goo.gl/XkBrjD\nvar $export = require('./$.export'),\n    $values = require('./$.object-to-array')(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n},{\"./$.export\":62,\"./$.object-to-array\":95}],217:[function(require,module,exports){\n'use strict';\n\n// https://github.com/benjamingr/RexExp.escape\nvar $export = require('./$.export'),\n    $re = require('./$.replacer')(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n$export($export.S, 'RegExp', { escape: function escape(it) {\n    return $re(it);\n  } });\n\n},{\"./$.export\":62,\"./$.replacer\":102}],218:[function(require,module,exports){\n'use strict';\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./$.export');\n\n$export($export.P, 'Set', { toJSON: require('./$.collection-to-json')('Set') });\n\n},{\"./$.collection-to-json\":53,\"./$.export\":62}],219:[function(require,module,exports){\n'use strict';\n// https://github.com/mathiasbynens/String.prototype.at\n\nvar $export = require('./$.export'),\n    $at = require('./$.string-at')(true);\n\n$export($export.P, 'String', {\n  at: function at(pos) {\n    return $at(this, pos);\n  }\n});\n\n},{\"./$.export\":62,\"./$.string-at\":110}],220:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $pad = require('./$.string-pad');\n\n$export($export.P, 'String', {\n  padLeft: function padLeft(maxLength /*, fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n},{\"./$.export\":62,\"./$.string-pad\":112}],221:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $pad = require('./$.string-pad');\n\n$export($export.P, 'String', {\n  padRight: function padRight(maxLength /*, fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n},{\"./$.export\":62,\"./$.string-pad\":112}],222:[function(require,module,exports){\n'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n\nrequire('./$.string-trim')('trimLeft', function ($trim) {\n  return function trimLeft() {\n    return $trim(this, 1);\n  };\n});\n\n},{\"./$.string-trim\":114}],223:[function(require,module,exports){\n'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n\nrequire('./$.string-trim')('trimRight', function ($trim) {\n  return function trimRight() {\n    return $trim(this, 2);\n  };\n});\n\n},{\"./$.string-trim\":114}],224:[function(require,module,exports){\n'use strict';\n\n// JavaScript 1.6 / Strawman array statics shim\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    $ctx = require('./$.ctx'),\n    $Array = require('./$.core').Array || Array,\n    statics = {};\nvar setStatics = function setStatics(keys, length) {\n  $.each.call(keys.split(','), function (key) {\n    if (length == undefined && key in $Array) statics[key] = $Array[key];else if (key in []) statics[key] = $ctx(Function.call, [][key], length);\n  });\n};\nsetStatics('pop,reverse,shift,keys,values,entries', 1);\nsetStatics('indexOf,every,some,forEach,map,filter,find,findIndex,includes', 3);\nsetStatics('join,slice,concat,push,splice,unshift,sort,lastIndexOf,' + 'reduce,reduceRight,copyWithin,fill');\n$export($export.S, 'Array', statics);\n\n},{\"./$\":86,\"./$.core\":56,\"./$.ctx\":57,\"./$.export\":62}],225:[function(require,module,exports){\n'use strict';\n\nrequire('./es6.array.iterator');\nvar global = require('./$.global'),\n    hide = require('./$.hide'),\n    Iterators = require('./$.iterators'),\n    ITERATOR = require('./$.wks')('iterator'),\n    NL = global.NodeList,\n    HTC = global.HTMLCollection,\n    NLProto = NL && NL.prototype,\n    HTCProto = HTC && HTC.prototype,\n    ArrayValues = Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array;\nif (NLProto && !NLProto[ITERATOR]) hide(NLProto, ITERATOR, ArrayValues);\nif (HTCProto && !HTCProto[ITERATOR]) hide(HTCProto, ITERATOR, ArrayValues);\n\n},{\"./$.global\":69,\"./$.hide\":71,\"./$.iterators\":85,\"./$.wks\":123,\"./es6.array.iterator\":131}],226:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $task = require('./$.task');\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n},{\"./$.export\":62,\"./$.task\":115}],227:[function(require,module,exports){\n'use strict';\n\n// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./$.global'),\n    $export = require('./$.export'),\n    invoke = require('./$.invoke'),\n    partial = require('./$.partial'),\n    navigator = global.navigator,\n    MSIE = !!navigator && /MSIE .\\./.test(navigator.userAgent); // <- dirty ie9- check\nvar wrap = function wrap(set) {\n  return MSIE ? function (fn, time /*, ...args */) {\n    return set(invoke(partial, [].slice.call(arguments, 2), typeof fn == 'function' ? fn : Function(fn)), time);\n  } : set;\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n  setTimeout: wrap(global.setTimeout),\n  setInterval: wrap(global.setInterval)\n});\n\n},{\"./$.export\":62,\"./$.global\":69,\"./$.invoke\":73,\"./$.partial\":97}],228:[function(require,module,exports){\n'use strict';\n\nrequire('./modules/es5');\nrequire('./modules/es6.symbol');\nrequire('./modules/es6.object.assign');\nrequire('./modules/es6.object.is');\nrequire('./modules/es6.object.set-prototype-of');\nrequire('./modules/es6.object.to-string');\nrequire('./modules/es6.object.freeze');\nrequire('./modules/es6.object.seal');\nrequire('./modules/es6.object.prevent-extensions');\nrequire('./modules/es6.object.is-frozen');\nrequire('./modules/es6.object.is-sealed');\nrequire('./modules/es6.object.is-extensible');\nrequire('./modules/es6.object.get-own-property-descriptor');\nrequire('./modules/es6.object.get-prototype-of');\nrequire('./modules/es6.object.keys');\nrequire('./modules/es6.object.get-own-property-names');\nrequire('./modules/es6.function.name');\nrequire('./modules/es6.function.has-instance');\nrequire('./modules/es6.number.constructor');\nrequire('./modules/es6.number.epsilon');\nrequire('./modules/es6.number.is-finite');\nrequire('./modules/es6.number.is-integer');\nrequire('./modules/es6.number.is-nan');\nrequire('./modules/es6.number.is-safe-integer');\nrequire('./modules/es6.number.max-safe-integer');\nrequire('./modules/es6.number.min-safe-integer');\nrequire('./modules/es6.number.parse-float');\nrequire('./modules/es6.number.parse-int');\nrequire('./modules/es6.math.acosh');\nrequire('./modules/es6.math.asinh');\nrequire('./modules/es6.math.atanh');\nrequire('./modules/es6.math.cbrt');\nrequire('./modules/es6.math.clz32');\nrequire('./modules/es6.math.cosh');\nrequire('./modules/es6.math.expm1');\nrequire('./modules/es6.math.fround');\nrequire('./modules/es6.math.hypot');\nrequire('./modules/es6.math.imul');\nrequire('./modules/es6.math.log10');\nrequire('./modules/es6.math.log1p');\nrequire('./modules/es6.math.log2');\nrequire('./modules/es6.math.sign');\nrequire('./modules/es6.math.sinh');\nrequire('./modules/es6.math.tanh');\nrequire('./modules/es6.math.trunc');\nrequire('./modules/es6.string.from-code-point');\nrequire('./modules/es6.string.raw');\nrequire('./modules/es6.string.trim');\nrequire('./modules/es6.string.iterator');\nrequire('./modules/es6.string.code-point-at');\nrequire('./modules/es6.string.ends-with');\nrequire('./modules/es6.string.includes');\nrequire('./modules/es6.string.repeat');\nrequire('./modules/es6.string.starts-with');\nrequire('./modules/es6.array.from');\nrequire('./modules/es6.array.of');\nrequire('./modules/es6.array.iterator');\nrequire('./modules/es6.array.species');\nrequire('./modules/es6.array.copy-within');\nrequire('./modules/es6.array.fill');\nrequire('./modules/es6.array.find');\nrequire('./modules/es6.array.find-index');\nrequire('./modules/es6.regexp.constructor');\nrequire('./modules/es6.regexp.flags');\nrequire('./modules/es6.regexp.match');\nrequire('./modules/es6.regexp.replace');\nrequire('./modules/es6.regexp.search');\nrequire('./modules/es6.regexp.split');\nrequire('./modules/es6.promise');\nrequire('./modules/es6.map');\nrequire('./modules/es6.set');\nrequire('./modules/es6.weak-map');\nrequire('./modules/es6.weak-set');\nrequire('./modules/es6.reflect.apply');\nrequire('./modules/es6.reflect.construct');\nrequire('./modules/es6.reflect.define-property');\nrequire('./modules/es6.reflect.delete-property');\nrequire('./modules/es6.reflect.enumerate');\nrequire('./modules/es6.reflect.get');\nrequire('./modules/es6.reflect.get-own-property-descriptor');\nrequire('./modules/es6.reflect.get-prototype-of');\nrequire('./modules/es6.reflect.has');\nrequire('./modules/es6.reflect.is-extensible');\nrequire('./modules/es6.reflect.own-keys');\nrequire('./modules/es6.reflect.prevent-extensions');\nrequire('./modules/es6.reflect.set');\nrequire('./modules/es6.reflect.set-prototype-of');\nrequire('./modules/es7.array.includes');\nrequire('./modules/es7.string.at');\nrequire('./modules/es7.string.pad-left');\nrequire('./modules/es7.string.pad-right');\nrequire('./modules/es7.string.trim-left');\nrequire('./modules/es7.string.trim-right');\nrequire('./modules/es7.regexp.escape');\nrequire('./modules/es7.object.get-own-property-descriptors');\nrequire('./modules/es7.object.values');\nrequire('./modules/es7.object.entries');\nrequire('./modules/es7.map.to-json');\nrequire('./modules/es7.set.to-json');\nrequire('./modules/js.array.statics');\nrequire('./modules/web.timers');\nrequire('./modules/web.immediate');\nrequire('./modules/web.dom.iterable');\nmodule.exports = require('./modules/$.core');\n\n},{\"./modules/$.core\":56,\"./modules/es5\":125,\"./modules/es6.array.copy-within\":126,\"./modules/es6.array.fill\":127,\"./modules/es6.array.find\":129,\"./modules/es6.array.find-index\":128,\"./modules/es6.array.from\":130,\"./modules/es6.array.iterator\":131,\"./modules/es6.array.of\":132,\"./modules/es6.array.species\":133,\"./modules/es6.function.has-instance\":134,\"./modules/es6.function.name\":135,\"./modules/es6.map\":136,\"./modules/es6.math.acosh\":137,\"./modules/es6.math.asinh\":138,\"./modules/es6.math.atanh\":139,\"./modules/es6.math.cbrt\":140,\"./modules/es6.math.clz32\":141,\"./modules/es6.math.cosh\":142,\"./modules/es6.math.expm1\":143,\"./modules/es6.math.fround\":144,\"./modules/es6.math.hypot\":145,\"./modules/es6.math.imul\":146,\"./modules/es6.math.log10\":147,\"./modules/es6.math.log1p\":148,\"./modules/es6.math.log2\":149,\"./modules/es6.math.sign\":150,\"./modules/es6.math.sinh\":151,\"./modules/es6.math.tanh\":152,\"./modules/es6.math.trunc\":153,\"./modules/es6.number.constructor\":154,\"./modules/es6.number.epsilon\":155,\"./modules/es6.number.is-finite\":156,\"./modules/es6.number.is-integer\":157,\"./modules/es6.number.is-nan\":158,\"./modules/es6.number.is-safe-integer\":159,\"./modules/es6.number.max-safe-integer\":160,\"./modules/es6.number.min-safe-integer\":161,\"./modules/es6.number.parse-float\":162,\"./modules/es6.number.parse-int\":163,\"./modules/es6.object.assign\":164,\"./modules/es6.object.freeze\":165,\"./modules/es6.object.get-own-property-descriptor\":166,\"./modules/es6.object.get-own-property-names\":167,\"./modules/es6.object.get-prototype-of\":168,\"./modules/es6.object.is\":172,\"./modules/es6.object.is-extensible\":169,\"./modules/es6.object.is-frozen\":170,\"./modules/es6.object.is-sealed\":171,\"./modules/es6.object.keys\":173,\"./modules/es6.object.prevent-extensions\":174,\"./modules/es6.object.seal\":175,\"./modules/es6.object.set-prototype-of\":176,\"./modules/es6.object.to-string\":177,\"./modules/es6.promise\":178,\"./modules/es6.reflect.apply\":179,\"./modules/es6.reflect.construct\":180,\"./modules/es6.reflect.define-property\":181,\"./modules/es6.reflect.delete-property\":182,\"./modules/es6.reflect.enumerate\":183,\"./modules/es6.reflect.get\":186,\"./modules/es6.reflect.get-own-property-descriptor\":184,\"./modules/es6.reflect.get-prototype-of\":185,\"./modules/es6.reflect.has\":187,\"./modules/es6.reflect.is-extensible\":188,\"./modules/es6.reflect.own-keys\":189,\"./modules/es6.reflect.prevent-extensions\":190,\"./modules/es6.reflect.set\":192,\"./modules/es6.reflect.set-prototype-of\":191,\"./modules/es6.regexp.constructor\":193,\"./modules/es6.regexp.flags\":194,\"./modules/es6.regexp.match\":195,\"./modules/es6.regexp.replace\":196,\"./modules/es6.regexp.search\":197,\"./modules/es6.regexp.split\":198,\"./modules/es6.set\":199,\"./modules/es6.string.code-point-at\":200,\"./modules/es6.string.ends-with\":201,\"./modules/es6.string.from-code-point\":202,\"./modules/es6.string.includes\":203,\"./modules/es6.string.iterator\":204,\"./modules/es6.string.raw\":205,\"./modules/es6.string.repeat\":206,\"./modules/es6.string.starts-with\":207,\"./modules/es6.string.trim\":208,\"./modules/es6.symbol\":209,\"./modules/es6.weak-map\":210,\"./modules/es6.weak-set\":211,\"./modules/es7.array.includes\":212,\"./modules/es7.map.to-json\":213,\"./modules/es7.object.entries\":214,\"./modules/es7.object.get-own-property-descriptors\":215,\"./modules/es7.object.values\":216,\"./modules/es7.regexp.escape\":217,\"./modules/es7.set.to-json\":218,\"./modules/es7.string.at\":219,\"./modules/es7.string.pad-left\":220,\"./modules/es7.string.pad-right\":221,\"./modules/es7.string.trim-left\":222,\"./modules/es7.string.trim-right\":223,\"./modules/js.array.statics\":224,\"./modules/web.dom.iterable\":225,\"./modules/web.immediate\":226,\"./modules/web.timers\":227}],229:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = createHash;\n\nfunction createHash(elem) {\n    var attributes = elem.attributes;\n    var hash = {};\n\n    if (attributes === null || attributes === undefined) {\n        return hash;\n    }\n\n    for (var i = 0; i < attributes.length; i++) {\n        var attr = attributes[i];\n\n        if (attr.name.substr(0, 5) !== \"data-\") {\n            continue;\n        }\n\n        hash[attr.name.substr(5)] = attr.value;\n    }\n\n    return hash;\n}\n\n},{}],230:[function(require,module,exports){\n'use strict';\n\nvar createHash = require('./create-hash.js');\n\nvar hashKey = '__DATA_SET_WEAK_KEY@4';\n\nmodule.exports = DataSet;\n\nfunction DataSet(elem) {\n    var hash = elem[hashKey];\n\n    if (!hash) {\n        hash = elem[hashKey] = createHash(elem);\n    }\n\n    return hash;\n}\n\n},{\"./create-hash.js\":229}],231:[function(require,module,exports){\n'use strict';\n\nvar support = require('dom-support');\nvar getDocument = require('get-document');\nvar withinElement = require('within-element');\n\n/**\n * Get offset of a DOM Element or Range within the document.\n *\n * @param {DOMElement|Range} el - the DOM element or Range instance to measure\n * @return {Object} An object with `top` and `left` Number values\n * @public\n */\n\nmodule.exports = function offset(el) {\n  var doc = getDocument(el);\n  if (!doc) return;\n\n  // Make sure it's not a disconnected DOM node\n  if (!withinElement(el, doc)) return;\n\n  var body = doc.body;\n  if (body === el) {\n    return bodyOffset(el);\n  }\n\n  var box = { top: 0, left: 0 };\n  if (typeof el.getBoundingClientRect !== \"undefined\") {\n    // If we don't have gBCR, just use 0,0 rather than error\n    // BlackBerry 5, iOS 3 (original iPhone)\n    box = el.getBoundingClientRect();\n\n    if (el.collapsed && box.left === 0 && box.top === 0) {\n      // collapsed Range instances sometimes report 0, 0\n      // see: http://stackoverflow.com/a/6847328/376773\n      var span = doc.createElement(\"span\");\n\n      // Ensure span has dimensions and position by\n      // adding a zero-width space character\n      span.appendChild(doc.createTextNode('​'));\n      el.insertNode(span);\n      box = span.getBoundingClientRect();\n\n      // Remove temp SPAN and glue any broken text nodes back together\n      var spanParent = span.parentNode;\n      spanParent.removeChild(span);\n      spanParent.normalize();\n    }\n  }\n\n  var docEl = doc.documentElement;\n  var clientTop = docEl.clientTop || body.clientTop || 0;\n  var clientLeft = docEl.clientLeft || body.clientLeft || 0;\n  var scrollTop = window.pageYOffset || docEl.scrollTop;\n  var scrollLeft = window.pageXOffset || docEl.scrollLeft;\n\n  return {\n    top: box.top + scrollTop - clientTop,\n    left: box.left + scrollLeft - clientLeft\n  };\n};\n\nfunction bodyOffset(body) {\n  var top = body.offsetTop;\n  var left = body.offsetLeft;\n\n  if (support.doesNotIncludeMarginInBodyOffset) {\n    top += parseFloat(body.style.marginTop || 0);\n    left += parseFloat(body.style.marginLeft || 0);\n  }\n\n  return {\n    top: top,\n    left: left\n  };\n}\n\n},{\"dom-support\":233,\"get-document\":235,\"within-element\":240}],232:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = one;\nmodule.exports.all = all;\n\nfunction one(selector, parent) {\n  parent || (parent = document);\n  return parent.querySelector(selector);\n}\n\nfunction all(selector, parent) {\n  parent || (parent = document);\n  var selection = parent.querySelectorAll(selector);\n  return Array.prototype.slice.call(selection);\n}\n\n},{}],233:[function(require,module,exports){\n\"use strict\";\n\nvar domready = require('domready');\n\nmodule.exports = function () {\n\n\tvar support,\n\t    all,\n\t    a,\n\t    select,\n\t    opt,\n\t    input,\n\t    fragment,\n\t    eventName,\n\t    i,\n\t    isSupported,\n\t    clickFn,\n\t    div = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute(\"className\", \"t\");\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Support tests won't run in some limited or non-browser environments\n\tall = div.getElementsByTagName(\"*\");\n\ta = div.getElementsByTagName(\"a\")[0];\n\tif (!all || !a || !all.length) {\n\t\treturn {};\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild(document.createElement(\"option\"));\n\tinput = div.getElementsByTagName(\"input\")[0];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: div.firstChild.nodeType === 3,\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test(a.getAttribute(\"style\")),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: a.getAttribute(\"href\") === \"/a\",\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.5/.test(a.style.opacity),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: input.value === \"on\",\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Tests for enctype support on a form (#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode(true).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode\n\t\tboxModel: document.compatMode === \"CSS1Compat\",\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tboxSizingReliable: true,\n\t\tpixelPosition: false\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode(true).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch (e) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif (!div.addEventListener && div.attachEvent && div.fireEvent) {\n\t\tdiv.attachEvent(\"onclick\", clickFn = function clickFn() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\t\tdiv.cloneNode(true).fireEvent(\"onclick\");\n\t\tdiv.detachEvent(\"onclick\", clickFn);\n\t}\n\n\t// Check if a radio maintains its value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute(\"type\", \"radio\");\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute(\"checked\", \"checked\");\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute(\"name\", \"t\");\n\n\tdiv.appendChild(input);\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild(div.lastChild);\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tfragment.removeChild(input);\n\tfragment.appendChild(div);\n\n\t// Technique from Juriy Zaytsev\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif (!div.addEventListener) {\n\t\tfor (i in {\n\t\t\tsubmit: true,\n\t\t\tchange: true,\n\t\t\tfocusin: true\n\t\t}) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = eventName in div;\n\t\t\tif (!isSupported) {\n\t\t\t\tdiv.setAttribute(eventName, \"return;\");\n\t\t\t\tisSupported = typeof div[eventName] === \"function\";\n\t\t\t}\n\t\t\tsupport[i + \"Bubbles\"] = isSupported;\n\t\t}\n\t}\n\n\t// Run tests that need a body at doc ready\n\tdomready(function () {\n\t\tvar container,\n\t\t    div,\n\t\t    tds,\n\t\t    marginDiv,\n\t\t    divReset = \"padding:0;margin:0;border:0;display:block;overflow:hidden;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t    body = document.getElementsByTagName(\"body\")[0];\n\n\t\tif (!body) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px\";\n\t\tbody.insertBefore(container, body.firstChild);\n\n\t\t// Construct the test element\n\t\tdiv = document.createElement(\"div\");\n\t\tcontainer.appendChild(div);\n\n\t\t//Check if table cells still have offsetWidth/Height when they are set\n\t\t//to display:none and there are still other visible table cells in a\n\t\t//table row; if so, offsetWidth/Height are not reliable for use when\n\t\t//determining if an element has been hidden directly using\n\t\t//display:none (it is still safe to use offsets if a parent element is\n\t\t//hidden; don safety goggles and see bug #4512 for more information).\n\t\t//(only IE 8 fails this test)\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[0].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = tds[0].offsetHeight === 0;\n\n\t\ttds[0].style.display = \"\";\n\t\ttds[1].style.display = \"none\";\n\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\t// (IE <= 8 fail this test)\n\t\tsupport.reliableHiddenOffsets = isSupported && tds[0].offsetHeight === 0;\n\n\t\t// Check box-sizing and margin behavior\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.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%;\";\n\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\tsupport.doesNotIncludeMarginInBodyOffset = body.offsetTop !== 1;\n\n\t\t// NOTE: To any future maintainer, we've window.getComputedStyle\n\t\t// because jsdom on node.js will break without it.\n\t\tif (window.getComputedStyle) {\n\t\t\tsupport.pixelPosition = (window.getComputedStyle(div, null) || {}).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = (window.getComputedStyle(div, null) || { width: \"4px\" }).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. For more\n\t\t\t// info see bug #3333\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = document.createElement(\"div\");\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\t\t\tdiv.appendChild(marginDiv);\n\t\t\tsupport.reliableMarginRight = !parseFloat((window.getComputedStyle(marginDiv, null) || {}).marginRight);\n\t\t}\n\n\t\tif (typeof div.style.zoom !== \"undefined\") {\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\t// (IE < 8 does this)\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = div.offsetWidth === 3;\n\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\t// (IE 6 does this)\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.style.overflow = \"visible\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = div.offsetWidth !== 3;\n\n\t\t\tcontainer.style.zoom = 1;\n\t\t}\n\n\t\t// Null elements to avoid leaks in IE\n\t\tbody.removeChild(container);\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tfragment.removeChild(div);\n\tall = a = select = opt = input = fragment = div = null;\n\n\treturn support;\n}();\n\n},{\"domready\":234}],234:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/*!\n  * domready (c) Dustin Diaz 2014 - License MIT\n  */\n!function (name, definition) {\n\n  if (typeof module != 'undefined') module.exports = definition();else if (typeof define == 'function' && _typeof(define.amd) == 'object') define(definition);else this[name] = definition();\n}('domready', function () {\n\n  var fns = [],\n      _listener,\n      doc = document,\n      hack = doc.documentElement.doScroll,\n      domContentLoaded = 'DOMContentLoaded',\n      loaded = (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState);\n\n  if (!loaded) doc.addEventListener(domContentLoaded, _listener = function listener() {\n    doc.removeEventListener(domContentLoaded, _listener);\n    loaded = 1;\n    while (_listener = fns.shift()) {\n      _listener();\n    }\n  });\n\n  return function (fn) {\n    loaded ? setTimeout(fn, 0) : fns.push(fn);\n  };\n});\n\n},{}],235:[function(require,module,exports){\n\"use strict\";\n\n/**\n * Module exports.\n */\n\nmodule.exports = getDocument;\n\n// defined by w3c\nvar DOCUMENT_NODE = 9;\n\n/**\n * Returns `true` if `w` is a Document object, or `false` otherwise.\n *\n * @param {?} d - Document object, maybe\n * @return {Boolean}\n * @private\n */\n\nfunction isDocument(d) {\n  return d && d.nodeType === DOCUMENT_NODE;\n}\n\n/**\n * Returns the `document` object associated with the given `node`, which may be\n * a DOM element, the Window object, a Selection, a Range. Basically any DOM\n * object that references the Document in some way, this function will find it.\n *\n * @param {Mixed} node - DOM node, selection, or range in which to find the `document` object\n * @return {Document} the `document` object associated with `node`\n * @public\n */\n\nfunction getDocument(node) {\n  if (isDocument(node)) {\n    return node;\n  } else if (isDocument(node.ownerDocument)) {\n    return node.ownerDocument;\n  } else if (isDocument(node.document)) {\n    return node.document;\n  } else if (node.parentNode) {\n    return getDocument(node.parentNode);\n\n    // Range support\n  } else if (node.commonAncestorContainer) {\n      return getDocument(node.commonAncestorContainer);\n    } else if (node.startContainer) {\n      return getDocument(node.startContainer);\n\n      // Selection support\n    } else if (node.anchorNode) {\n        return getDocument(node.anchorNode);\n      }\n}\n\n},{}],236:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/*global window*/\n\n/**\n * Check if object is dom node.\n *\n * @param {Object} val\n * @return {Boolean}\n * @api public\n */\n\nmodule.exports = function isNode(val) {\n  if (!val || (typeof val === 'undefined' ? 'undefined' : _typeof(val)) !== 'object') return false;\n  if (window && 'object' == _typeof(window.Node)) return val instanceof window.Node;\n  return 'number' == typeof val.nodeType && 'string' == typeof val.nodeName;\n};\n\n},{}],237:[function(require,module,exports){\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = setTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        setTimeout(drainQueue, 0);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],238:[function(require,module,exports){\n(function (process){\n\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n// vim:ts=4:sts=4:sw=4:\n/*!\n *\n * Copyright 2009-2012 Kris Kowal under the terms of the MIT\n * license found at http://github.com/kriskowal/q/raw/master/LICENSE\n *\n * With parts by Tyler Close\n * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found\n * at http://www.opensource.org/licenses/mit-license.html\n * Forked at ref_send.js version: 2009-05-11\n *\n * With parts by Mark Miller\n * Copyright (C) 2011 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n(function (definition) {\n    \"use strict\";\n\n    // This file will function properly as a <script> tag, or a module\n    // using CommonJS and NodeJS or RequireJS module formats.  In\n    // Common/Node/RequireJS, the module exports the Q API and when\n    // executed as a simple <script>, it creates a Q global instead.\n\n    // Montage Require\n\n    if (typeof bootstrap === \"function\") {\n        bootstrap(\"promise\", definition);\n\n        // CommonJS\n    } else if ((typeof exports === \"undefined\" ? \"undefined\" : _typeof(exports)) === \"object\" && (typeof module === \"undefined\" ? \"undefined\" : _typeof(module)) === \"object\") {\n            module.exports = definition();\n\n            // RequireJS\n        } else if (typeof define === \"function\" && define.amd) {\n                define(definition);\n\n                // SES (Secure EcmaScript)\n            } else if (typeof ses !== \"undefined\") {\n                    if (!ses.ok()) {\n                        return;\n                    } else {\n                        ses.makeQ = definition;\n                    }\n\n                    // <script>\n                } else if (typeof window !== \"undefined\" || typeof self !== \"undefined\") {\n                        // Prefer window over self for add-on scripts. Use self for\n                        // non-windowed contexts.\n                        var global = typeof window !== \"undefined\" ? window : self;\n\n                        // Get the `window` object, save the previous Q global\n                        // and initialize Q as a global.\n                        var previousQ = global.Q;\n                        global.Q = definition();\n\n                        // Add a noConflict function so Q can be removed from the\n                        // global namespace.\n                        global.Q.noConflict = function () {\n                            global.Q = previousQ;\n                            return this;\n                        };\n                    } else {\n                        throw new Error(\"This environment was not anticipated by Q. Please file a bug.\");\n                    }\n})(function () {\n    \"use strict\";\n\n    var hasStacks = false;\n    try {\n        throw new Error();\n    } catch (e) {\n        hasStacks = !!e.stack;\n    }\n\n    // All code after this point will be filtered from stack traces reported\n    // by Q.\n    var qStartingLine = captureLine();\n    var qFileName;\n\n    // shims\n\n    // used for fallback in \"allResolved\"\n    var noop = function noop() {};\n\n    // Use the fastest possible means to execute a task in a future turn\n    // of the event loop.\n    var nextTick = function () {\n        // linked list of tasks (single, with head node)\n        var head = { task: void 0, next: null };\n        var tail = head;\n        var flushing = false;\n        var requestTick = void 0;\n        var isNodeJS = false;\n        // queue for late tasks, used by unhandled rejection tracking\n        var laterQueue = [];\n\n        function flush() {\n            /* jshint loopfunc: true */\n            var task, domain;\n\n            while (head.next) {\n                head = head.next;\n                task = head.task;\n                head.task = void 0;\n                domain = head.domain;\n\n                if (domain) {\n                    head.domain = void 0;\n                    domain.enter();\n                }\n                runSingle(task, domain);\n            }\n            while (laterQueue.length) {\n                task = laterQueue.pop();\n                runSingle(task);\n            }\n            flushing = false;\n        }\n        // runs a single function in the async queue\n        function runSingle(task, domain) {\n            try {\n                task();\n            } catch (e) {\n                if (isNodeJS) {\n                    // In node, uncaught exceptions are considered fatal errors.\n                    // Re-throw them synchronously to interrupt flushing!\n\n                    // Ensure continuation if the uncaught exception is suppressed\n                    // listening \"uncaughtException\" events (as domains does).\n                    // Continue in next event to avoid tick recursion.\n                    if (domain) {\n                        domain.exit();\n                    }\n                    setTimeout(flush, 0);\n                    if (domain) {\n                        domain.enter();\n                    }\n\n                    throw e;\n                } else {\n                    // In browsers, uncaught exceptions are not fatal.\n                    // Re-throw them asynchronously to avoid slow-downs.\n                    setTimeout(function () {\n                        throw e;\n                    }, 0);\n                }\n            }\n\n            if (domain) {\n                domain.exit();\n            }\n        }\n\n        nextTick = function nextTick(task) {\n            tail = tail.next = {\n                task: task,\n                domain: isNodeJS && process.domain,\n                next: null\n            };\n\n            if (!flushing) {\n                flushing = true;\n                requestTick();\n            }\n        };\n\n        if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && process.toString() === \"[object process]\" && process.nextTick) {\n            // Ensure Q is in a real Node environment, with a `process.nextTick`.\n            // To see through fake Node environments:\n            // * Mocha test runner - exposes a `process` global without a `nextTick`\n            // * Browserify - exposes a `process.nexTick` function that uses\n            //   `setTimeout`. In this case `setImmediate` is preferred because\n            //    it is faster. Browserify's `process.toString()` yields\n            //   \"[object Object]\", while in a real Node environment\n            //   `process.nextTick()` yields \"[object process]\".\n            isNodeJS = true;\n\n            requestTick = function requestTick() {\n                process.nextTick(flush);\n            };\n        } else if (typeof setImmediate === \"function\") {\n            // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate\n            if (typeof window !== \"undefined\") {\n                requestTick = setImmediate.bind(window, flush);\n            } else {\n                requestTick = function requestTick() {\n                    setImmediate(flush);\n                };\n            }\n        } else if (typeof MessageChannel !== \"undefined\") {\n            // modern browsers\n            // http://www.nonblocking.io/2011/06/windownexttick.html\n            var channel = new MessageChannel();\n            // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create\n            // working message ports the first time a page loads.\n            channel.port1.onmessage = function () {\n                requestTick = requestPortTick;\n                channel.port1.onmessage = flush;\n                flush();\n            };\n            var requestPortTick = function requestPortTick() {\n                // Opera requires us to provide a message payload, regardless of\n                // whether we use it.\n                channel.port2.postMessage(0);\n            };\n            requestTick = function requestTick() {\n                setTimeout(flush, 0);\n                requestPortTick();\n            };\n        } else {\n            // old browsers\n            requestTick = function requestTick() {\n                setTimeout(flush, 0);\n            };\n        }\n        // runs a task after all other tasks have been run\n        // this is useful for unhandled rejection tracking that needs to happen\n        // after all `then`d tasks have been run.\n        nextTick.runAfter = function (task) {\n            laterQueue.push(task);\n            if (!flushing) {\n                flushing = true;\n                requestTick();\n            }\n        };\n        return nextTick;\n    }();\n\n    // Attempt to make generics safe in the face of downstream\n    // modifications.\n    // There is no situation where this is necessary.\n    // If you need a security guarantee, these primordials need to be\n    // deeply frozen anyway, and if you don’t need a security guarantee,\n    // this is just plain paranoid.\n    // However, this **might** have the nice side-effect of reducing the size of\n    // the minified code by reducing x.call() to merely x()\n    // See Mark Miller’s explanation of what this does.\n    // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming\n    var call = Function.call;\n    function uncurryThis(f) {\n        return function () {\n            return call.apply(f, arguments);\n        };\n    }\n    // This is equivalent, but slower:\n    // uncurryThis = Function_bind.bind(Function_bind.call);\n    // http://jsperf.com/uncurrythis\n\n    var array_slice = uncurryThis(Array.prototype.slice);\n\n    var array_reduce = uncurryThis(Array.prototype.reduce || function (callback, basis) {\n        var index = 0,\n            length = this.length;\n        // concerning the initial value, if one is not provided\n        if (arguments.length === 1) {\n            // seek to the first value in the array, accounting\n            // for the possibility that is is a sparse array\n            do {\n                if (index in this) {\n                    basis = this[index++];\n                    break;\n                }\n                if (++index >= length) {\n                    throw new TypeError();\n                }\n            } while (1);\n        }\n        // reduce\n        for (; index < length; index++) {\n            // account for the possibility that the array is sparse\n            if (index in this) {\n                basis = callback(basis, this[index], index);\n            }\n        }\n        return basis;\n    });\n\n    var array_indexOf = uncurryThis(Array.prototype.indexOf || function (value) {\n        // not a very good shim, but good enough for our one use of it\n        for (var i = 0; i < this.length; i++) {\n            if (this[i] === value) {\n                return i;\n            }\n        }\n        return -1;\n    });\n\n    var array_map = uncurryThis(Array.prototype.map || function (callback, thisp) {\n        var self = this;\n        var collect = [];\n        array_reduce(self, function (undefined, value, index) {\n            collect.push(callback.call(thisp, value, index, self));\n        }, void 0);\n        return collect;\n    });\n\n    var object_create = Object.create || function (prototype) {\n        function Type() {}\n        Type.prototype = prototype;\n        return new Type();\n    };\n\n    var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);\n\n    var object_keys = Object.keys || function (object) {\n        var keys = [];\n        for (var key in object) {\n            if (object_hasOwnProperty(object, key)) {\n                keys.push(key);\n            }\n        }\n        return keys;\n    };\n\n    var object_toString = uncurryThis(Object.prototype.toString);\n\n    function isObject(value) {\n        return value === Object(value);\n    }\n\n    // generator related shims\n\n    // FIXME: Remove this function once ES6 generators are in SpiderMonkey.\n    function isStopIteration(exception) {\n        return object_toString(exception) === \"[object StopIteration]\" || exception instanceof QReturnValue;\n    }\n\n    // FIXME: Remove this helper and Q.return once ES6 generators are in\n    // SpiderMonkey.\n    var QReturnValue;\n    if (typeof ReturnValue !== \"undefined\") {\n        QReturnValue = ReturnValue;\n    } else {\n        QReturnValue = function QReturnValue(value) {\n            this.value = value;\n        };\n    }\n\n    // long stack traces\n\n    var STACK_JUMP_SEPARATOR = \"From previous event:\";\n\n    function makeStackTraceLong(error, promise) {\n        // If possible, transform the error stack trace by removing Node and Q\n        // cruft, then concatenating with the stack trace of `promise`. See #57.\n        if (hasStacks && promise.stack && (typeof error === \"undefined\" ? \"undefined\" : _typeof(error)) === \"object\" && error !== null && error.stack && error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1) {\n            var stacks = [];\n            for (var p = promise; !!p; p = p.source) {\n                if (p.stack) {\n                    stacks.unshift(p.stack);\n                }\n            }\n            stacks.unshift(error.stack);\n\n            var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n            error.stack = filterStackString(concatedStacks);\n        }\n    }\n\n    function filterStackString(stackString) {\n        var lines = stackString.split(\"\\n\");\n        var desiredLines = [];\n        for (var i = 0; i < lines.length; ++i) {\n            var line = lines[i];\n\n            if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n                desiredLines.push(line);\n            }\n        }\n        return desiredLines.join(\"\\n\");\n    }\n\n    function isNodeFrame(stackLine) {\n        return stackLine.indexOf(\"(module.js:\") !== -1 || stackLine.indexOf(\"(node.js:\") !== -1;\n    }\n\n    function getFileNameAndLineNumber(stackLine) {\n        // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n        // In IE10 function name can have spaces (\"Anonymous function\") O_o\n        var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n        if (attempt1) {\n            return [attempt1[1], Number(attempt1[2])];\n        }\n\n        // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n        var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n        if (attempt2) {\n            return [attempt2[1], Number(attempt2[2])];\n        }\n\n        // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n        var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n        if (attempt3) {\n            return [attempt3[1], Number(attempt3[2])];\n        }\n    }\n\n    function isInternalFrame(stackLine) {\n        var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n\n        if (!fileNameAndLineNumber) {\n            return false;\n        }\n\n        var fileName = fileNameAndLineNumber[0];\n        var lineNumber = fileNameAndLineNumber[1];\n\n        return fileName === qFileName && lineNumber >= qStartingLine && lineNumber <= qEndingLine;\n    }\n\n    // discover own file name and line number range for filtering stack\n    // traces\n    function captureLine() {\n        if (!hasStacks) {\n            return;\n        }\n\n        try {\n            throw new Error();\n        } catch (e) {\n            var lines = e.stack.split(\"\\n\");\n            var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n            var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n            if (!fileNameAndLineNumber) {\n                return;\n            }\n\n            qFileName = fileNameAndLineNumber[0];\n            return fileNameAndLineNumber[1];\n        }\n    }\n\n    function deprecate(callback, name, alternative) {\n        return function () {\n            if (typeof console !== \"undefined\" && typeof console.warn === \"function\") {\n                console.warn(name + \" is deprecated, use \" + alternative + \" instead.\", new Error(\"\").stack);\n            }\n            return callback.apply(callback, arguments);\n        };\n    }\n\n    // end of shims\n    // beginning of real work\n\n    /**\n     * Constructs a promise for an immediate reference, passes promises through, or\n     * coerces promises from different systems.\n     * @param value immediate reference or promise\n     */\n    function Q(value) {\n        // If the object is already a Promise, return it directly.  This enables\n        // the resolve function to both be used to created references from objects,\n        // but to tolerably coerce non-promises to promises.\n        if (value instanceof Promise) {\n            return value;\n        }\n\n        // assimilate thenables\n        if (isPromiseAlike(value)) {\n            return coerce(value);\n        } else {\n            return fulfill(value);\n        }\n    }\n    Q.resolve = Q;\n\n    /**\n     * Performs a task in a future turn of the event loop.\n     * @param {Function} task\n     */\n    Q.nextTick = nextTick;\n\n    /**\n     * Controls whether or not long stack traces will be on\n     */\n    Q.longStackSupport = false;\n\n    // enable long stacks if Q_DEBUG is set\n    if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && process && process.env && process.env.Q_DEBUG) {\n        Q.longStackSupport = true;\n    }\n\n    /**\n     * Constructs a {promise, resolve, reject} object.\n     *\n     * `resolve` is a callback to invoke with a more resolved value for the\n     * promise. To fulfill the promise, invoke `resolve` with any value that is\n     * not a thenable. To reject the promise, invoke `resolve` with a rejected\n     * thenable, or invoke `reject` with the reason directly. To resolve the\n     * promise to another thenable, thus putting it in the same state, invoke\n     * `resolve` with that other thenable.\n     */\n    Q.defer = defer;\n    function defer() {\n        // if \"messages\" is an \"Array\", that indicates that the promise has not yet\n        // been resolved.  If it is \"undefined\", it has been resolved.  Each\n        // element of the messages array is itself an array of complete arguments to\n        // forward to the resolved promise.  We coerce the resolution value to a\n        // promise using the `resolve` function because it handles both fully\n        // non-thenable values and other thenables gracefully.\n        var messages = [],\n            progressListeners = [],\n            resolvedPromise;\n\n        var deferred = object_create(defer.prototype);\n        var promise = object_create(Promise.prototype);\n\n        promise.promiseDispatch = function (resolve, op, operands) {\n            var args = array_slice(arguments);\n            if (messages) {\n                messages.push(args);\n                if (op === \"when\" && operands[1]) {\n                    // progress operand\n                    progressListeners.push(operands[1]);\n                }\n            } else {\n                Q.nextTick(function () {\n                    resolvedPromise.promiseDispatch.apply(resolvedPromise, args);\n                });\n            }\n        };\n\n        // XXX deprecated\n        promise.valueOf = function () {\n            if (messages) {\n                return promise;\n            }\n            var nearerValue = nearer(resolvedPromise);\n            if (isPromise(nearerValue)) {\n                resolvedPromise = nearerValue; // shorten chain\n            }\n            return nearerValue;\n        };\n\n        promise.inspect = function () {\n            if (!resolvedPromise) {\n                return { state: \"pending\" };\n            }\n            return resolvedPromise.inspect();\n        };\n\n        if (Q.longStackSupport && hasStacks) {\n            try {\n                throw new Error();\n            } catch (e) {\n                // NOTE: don't try to use `Error.captureStackTrace` or transfer the\n                // accessor around; that causes memory leaks as per GH-111. Just\n                // reify the stack trace as a string ASAP.\n                //\n                // At the same time, cut off the first line; it's always just\n                // \"[object Promise]\\n\", as per the `toString`.\n                promise.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n            }\n        }\n\n        // NOTE: we do the checks for `resolvedPromise` in each method, instead of\n        // consolidating them into `become`, since otherwise we'd create new\n        // promises with the lines `become(whatever(value))`. See e.g. GH-252.\n\n        function become(newPromise) {\n            resolvedPromise = newPromise;\n            promise.source = newPromise;\n\n            array_reduce(messages, function (undefined, message) {\n                Q.nextTick(function () {\n                    newPromise.promiseDispatch.apply(newPromise, message);\n                });\n            }, void 0);\n\n            messages = void 0;\n            progressListeners = void 0;\n        }\n\n        deferred.promise = promise;\n        deferred.resolve = function (value) {\n            if (resolvedPromise) {\n                return;\n            }\n\n            become(Q(value));\n        };\n\n        deferred.fulfill = function (value) {\n            if (resolvedPromise) {\n                return;\n            }\n\n            become(fulfill(value));\n        };\n        deferred.reject = function (reason) {\n            if (resolvedPromise) {\n                return;\n            }\n\n            become(reject(reason));\n        };\n        deferred.notify = function (progress) {\n            if (resolvedPromise) {\n                return;\n            }\n\n            array_reduce(progressListeners, function (undefined, progressListener) {\n                Q.nextTick(function () {\n                    progressListener(progress);\n                });\n            }, void 0);\n        };\n\n        return deferred;\n    }\n\n    /**\n     * Creates a Node-style callback that will resolve or reject the deferred\n     * promise.\n     * @returns a nodeback\n     */\n    defer.prototype.makeNodeResolver = function () {\n        var self = this;\n        return function (error, value) {\n            if (error) {\n                self.reject(error);\n            } else if (arguments.length > 2) {\n                self.resolve(array_slice(arguments, 1));\n            } else {\n                self.resolve(value);\n            }\n        };\n    };\n\n    /**\n     * @param resolver {Function} a function that returns nothing and accepts\n     * the resolve, reject, and notify functions for a deferred.\n     * @returns a promise that may be resolved with the given resolve and reject\n     * functions, or rejected by a thrown exception in resolver\n     */\n    Q.Promise = promise; // ES6\n    Q.promise = promise;\n    function promise(resolver) {\n        if (typeof resolver !== \"function\") {\n            throw new TypeError(\"resolver must be a function.\");\n        }\n        var deferred = defer();\n        try {\n            resolver(deferred.resolve, deferred.reject, deferred.notify);\n        } catch (reason) {\n            deferred.reject(reason);\n        }\n        return deferred.promise;\n    }\n\n    promise.race = race; // ES6\n    promise.all = all; // ES6\n    promise.reject = reject; // ES6\n    promise.resolve = Q; // ES6\n\n    // XXX experimental.  This method is a way to denote that a local value is\n    // serializable and should be immediately dispatched to a remote upon request,\n    // instead of passing a reference.\n    Q.passByCopy = function (object) {\n        //freeze(object);\n        //passByCopies.set(object, true);\n        return object;\n    };\n\n    Promise.prototype.passByCopy = function () {\n        //freeze(object);\n        //passByCopies.set(object, true);\n        return this;\n    };\n\n    /**\n     * If two promises eventually fulfill to the same value, promises that value,\n     * but otherwise rejects.\n     * @param x {Any*}\n     * @param y {Any*}\n     * @returns {Any*} a promise for x and y if they are the same, but a rejection\n     * otherwise.\n     *\n     */\n    Q.join = function (x, y) {\n        return Q(x).join(y);\n    };\n\n    Promise.prototype.join = function (that) {\n        return Q([this, that]).spread(function (x, y) {\n            if (x === y) {\n                // TODO: \"===\" should be Object.is or equiv\n                return x;\n            } else {\n                throw new Error(\"Can't join: not the same: \" + x + \" \" + y);\n            }\n        });\n    };\n\n    /**\n     * Returns a promise for the first of an array of promises to become settled.\n     * @param answers {Array[Any*]} promises to race\n     * @returns {Any*} the first promise to be settled\n     */\n    Q.race = race;\n    function race(answerPs) {\n        return promise(function (resolve, reject) {\n            // Switch to this once we can assume at least ES5\n            // answerPs.forEach(function (answerP) {\n            //     Q(answerP).then(resolve, reject);\n            // });\n            // Use this in the meantime\n            for (var i = 0, len = answerPs.length; i < len; i++) {\n                Q(answerPs[i]).then(resolve, reject);\n            }\n        });\n    }\n\n    Promise.prototype.race = function () {\n        return this.then(Q.race);\n    };\n\n    /**\n     * Constructs a Promise with a promise descriptor object and optional fallback\n     * function.  The descriptor contains methods like when(rejected), get(name),\n     * set(name, value), post(name, args), and delete(name), which all\n     * return either a value, a promise for a value, or a rejection.  The fallback\n     * accepts the operation name, a resolver, and any further arguments that would\n     * have been forwarded to the appropriate method above had a method been\n     * provided with the proper name.  The API makes no guarantees about the nature\n     * of the returned object, apart from that it is usable whereever promises are\n     * bought and sold.\n     */\n    Q.makePromise = Promise;\n    function Promise(descriptor, fallback, inspect) {\n        if (fallback === void 0) {\n            fallback = function fallback(op) {\n                return reject(new Error(\"Promise does not support operation: \" + op));\n            };\n        }\n        if (inspect === void 0) {\n            inspect = function inspect() {\n                return { state: \"unknown\" };\n            };\n        }\n\n        var promise = object_create(Promise.prototype);\n\n        promise.promiseDispatch = function (resolve, op, args) {\n            var result;\n            try {\n                if (descriptor[op]) {\n                    result = descriptor[op].apply(promise, args);\n                } else {\n                    result = fallback.call(promise, op, args);\n                }\n            } catch (exception) {\n                result = reject(exception);\n            }\n            if (resolve) {\n                resolve(result);\n            }\n        };\n\n        promise.inspect = inspect;\n\n        // XXX deprecated `valueOf` and `exception` support\n        if (inspect) {\n            var inspected = inspect();\n            if (inspected.state === \"rejected\") {\n                promise.exception = inspected.reason;\n            }\n\n            promise.valueOf = function () {\n                var inspected = inspect();\n                if (inspected.state === \"pending\" || inspected.state === \"rejected\") {\n                    return promise;\n                }\n                return inspected.value;\n            };\n        }\n\n        return promise;\n    }\n\n    Promise.prototype.toString = function () {\n        return \"[object Promise]\";\n    };\n\n    Promise.prototype.then = function (fulfilled, rejected, progressed) {\n        var self = this;\n        var deferred = defer();\n        var done = false; // ensure the untrusted promise makes at most a\n        // single call to one of the callbacks\n\n        function _fulfilled(value) {\n            try {\n                return typeof fulfilled === \"function\" ? fulfilled(value) : value;\n            } catch (exception) {\n                return reject(exception);\n            }\n        }\n\n        function _rejected(exception) {\n            if (typeof rejected === \"function\") {\n                makeStackTraceLong(exception, self);\n                try {\n                    return rejected(exception);\n                } catch (newException) {\n                    return reject(newException);\n                }\n            }\n            return reject(exception);\n        }\n\n        function _progressed(value) {\n            return typeof progressed === \"function\" ? progressed(value) : value;\n        }\n\n        Q.nextTick(function () {\n            self.promiseDispatch(function (value) {\n                if (done) {\n                    return;\n                }\n                done = true;\n\n                deferred.resolve(_fulfilled(value));\n            }, \"when\", [function (exception) {\n                if (done) {\n                    return;\n                }\n                done = true;\n\n                deferred.resolve(_rejected(exception));\n            }]);\n        });\n\n        // Progress propagator need to be attached in the current tick.\n        self.promiseDispatch(void 0, \"when\", [void 0, function (value) {\n            var newValue;\n            var threw = false;\n            try {\n                newValue = _progressed(value);\n            } catch (e) {\n                threw = true;\n                if (Q.onerror) {\n                    Q.onerror(e);\n                } else {\n                    throw e;\n                }\n            }\n\n            if (!threw) {\n                deferred.notify(newValue);\n            }\n        }]);\n\n        return deferred.promise;\n    };\n\n    Q.tap = function (promise, callback) {\n        return Q(promise).tap(callback);\n    };\n\n    /**\n     * Works almost like \"finally\", but not called for rejections.\n     * Original resolution value is passed through callback unaffected.\n     * Callback may return a promise that will be awaited for.\n     * @param {Function} callback\n     * @returns {Q.Promise}\n     * @example\n     * doSomething()\n     *   .then(...)\n     *   .tap(console.log)\n     *   .then(...);\n     */\n    Promise.prototype.tap = function (callback) {\n        callback = Q(callback);\n\n        return this.then(function (value) {\n            return callback.fcall(value).thenResolve(value);\n        });\n    };\n\n    /**\n     * Registers an observer on a promise.\n     *\n     * Guarantees:\n     *\n     * 1. that fulfilled and rejected will be called only once.\n     * 2. that either the fulfilled callback or the rejected callback will be\n     *    called, but not both.\n     * 3. that fulfilled and rejected will not be called in this turn.\n     *\n     * @param value      promise or immediate reference to observe\n     * @param fulfilled  function to be called with the fulfilled value\n     * @param rejected   function to be called with the rejection exception\n     * @param progressed function to be called on any progress notifications\n     * @return promise for the return value from the invoked callback\n     */\n    Q.when = when;\n    function when(value, fulfilled, rejected, progressed) {\n        return Q(value).then(fulfilled, rejected, progressed);\n    }\n\n    Promise.prototype.thenResolve = function (value) {\n        return this.then(function () {\n            return value;\n        });\n    };\n\n    Q.thenResolve = function (promise, value) {\n        return Q(promise).thenResolve(value);\n    };\n\n    Promise.prototype.thenReject = function (reason) {\n        return this.then(function () {\n            throw reason;\n        });\n    };\n\n    Q.thenReject = function (promise, reason) {\n        return Q(promise).thenReject(reason);\n    };\n\n    /**\n     * If an object is not a promise, it is as \"near\" as possible.\n     * If a promise is rejected, it is as \"near\" as possible too.\n     * If it’s a fulfilled promise, the fulfillment value is nearer.\n     * If it’s a deferred promise and the deferred has been resolved, the\n     * resolution is \"nearer\".\n     * @param object\n     * @returns most resolved (nearest) form of the object\n     */\n\n    // XXX should we re-do this?\n    Q.nearer = nearer;\n    function nearer(value) {\n        if (isPromise(value)) {\n            var inspected = value.inspect();\n            if (inspected.state === \"fulfilled\") {\n                return inspected.value;\n            }\n        }\n        return value;\n    }\n\n    /**\n     * @returns whether the given object is a promise.\n     * Otherwise it is a fulfilled value.\n     */\n    Q.isPromise = isPromise;\n    function isPromise(object) {\n        return object instanceof Promise;\n    }\n\n    Q.isPromiseAlike = isPromiseAlike;\n    function isPromiseAlike(object) {\n        return isObject(object) && typeof object.then === \"function\";\n    }\n\n    /**\n     * @returns whether the given object is a pending promise, meaning not\n     * fulfilled or rejected.\n     */\n    Q.isPending = isPending;\n    function isPending(object) {\n        return isPromise(object) && object.inspect().state === \"pending\";\n    }\n\n    Promise.prototype.isPending = function () {\n        return this.inspect().state === \"pending\";\n    };\n\n    /**\n     * @returns whether the given object is a value or fulfilled\n     * promise.\n     */\n    Q.isFulfilled = isFulfilled;\n    function isFulfilled(object) {\n        return !isPromise(object) || object.inspect().state === \"fulfilled\";\n    }\n\n    Promise.prototype.isFulfilled = function () {\n        return this.inspect().state === \"fulfilled\";\n    };\n\n    /**\n     * @returns whether the given object is a rejected promise.\n     */\n    Q.isRejected = isRejected;\n    function isRejected(object) {\n        return isPromise(object) && object.inspect().state === \"rejected\";\n    }\n\n    Promise.prototype.isRejected = function () {\n        return this.inspect().state === \"rejected\";\n    };\n\n    //// BEGIN UNHANDLED REJECTION TRACKING\n\n    // This promise library consumes exceptions thrown in handlers so they can be\n    // handled by a subsequent promise.  The exceptions get added to this array when\n    // they are created, and removed when they are handled.  Note that in ES6 or\n    // shimmed environments, this would naturally be a `Set`.\n    var unhandledReasons = [];\n    var unhandledRejections = [];\n    var reportedUnhandledRejections = [];\n    var trackUnhandledRejections = true;\n\n    function resetUnhandledRejections() {\n        unhandledReasons.length = 0;\n        unhandledRejections.length = 0;\n\n        if (!trackUnhandledRejections) {\n            trackUnhandledRejections = true;\n        }\n    }\n\n    function trackRejection(promise, reason) {\n        if (!trackUnhandledRejections) {\n            return;\n        }\n        if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && typeof process.emit === \"function\") {\n            Q.nextTick.runAfter(function () {\n                if (array_indexOf(unhandledRejections, promise) !== -1) {\n                    process.emit(\"unhandledRejection\", reason, promise);\n                    reportedUnhandledRejections.push(promise);\n                }\n            });\n        }\n\n        unhandledRejections.push(promise);\n        if (reason && typeof reason.stack !== \"undefined\") {\n            unhandledReasons.push(reason.stack);\n        } else {\n            unhandledReasons.push(\"(no stack) \" + reason);\n        }\n    }\n\n    function untrackRejection(promise) {\n        if (!trackUnhandledRejections) {\n            return;\n        }\n\n        var at = array_indexOf(unhandledRejections, promise);\n        if (at !== -1) {\n            if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && typeof process.emit === \"function\") {\n                Q.nextTick.runAfter(function () {\n                    var atReport = array_indexOf(reportedUnhandledRejections, promise);\n                    if (atReport !== -1) {\n                        process.emit(\"rejectionHandled\", unhandledReasons[at], promise);\n                        reportedUnhandledRejections.splice(atReport, 1);\n                    }\n                });\n            }\n            unhandledRejections.splice(at, 1);\n            unhandledReasons.splice(at, 1);\n        }\n    }\n\n    Q.resetUnhandledRejections = resetUnhandledRejections;\n\n    Q.getUnhandledReasons = function () {\n        // Make a copy so that consumers can't interfere with our internal state.\n        return unhandledReasons.slice();\n    };\n\n    Q.stopUnhandledRejectionTracking = function () {\n        resetUnhandledRejections();\n        trackUnhandledRejections = false;\n    };\n\n    resetUnhandledRejections();\n\n    //// END UNHANDLED REJECTION TRACKING\n\n    /**\n     * Constructs a rejected promise.\n     * @param reason value describing the failure\n     */\n    Q.reject = reject;\n    function reject(reason) {\n        var rejection = Promise({\n            \"when\": function when(rejected) {\n                // note that the error has been handled\n                if (rejected) {\n                    untrackRejection(this);\n                }\n                return rejected ? rejected(reason) : this;\n            }\n        }, function fallback() {\n            return this;\n        }, function inspect() {\n            return { state: \"rejected\", reason: reason };\n        });\n\n        // Note that the reason has not been handled.\n        trackRejection(rejection, reason);\n\n        return rejection;\n    }\n\n    /**\n     * Constructs a fulfilled promise for an immediate reference.\n     * @param value immediate reference\n     */\n    Q.fulfill = fulfill;\n    function fulfill(value) {\n        return Promise({\n            \"when\": function when() {\n                return value;\n            },\n            \"get\": function get(name) {\n                return value[name];\n            },\n            \"set\": function set(name, rhs) {\n                value[name] = rhs;\n            },\n            \"delete\": function _delete(name) {\n                delete value[name];\n            },\n            \"post\": function post(name, args) {\n                // Mark Miller proposes that post with no name should apply a\n                // promised function.\n                if (name === null || name === void 0) {\n                    return value.apply(void 0, args);\n                } else {\n                    return value[name].apply(value, args);\n                }\n            },\n            \"apply\": function apply(thisp, args) {\n                return value.apply(thisp, args);\n            },\n            \"keys\": function keys() {\n                return object_keys(value);\n            }\n        }, void 0, function inspect() {\n            return { state: \"fulfilled\", value: value };\n        });\n    }\n\n    /**\n     * Converts thenables to Q promises.\n     * @param promise thenable promise\n     * @returns a Q promise\n     */\n    function coerce(promise) {\n        var deferred = defer();\n        Q.nextTick(function () {\n            try {\n                promise.then(deferred.resolve, deferred.reject, deferred.notify);\n            } catch (exception) {\n                deferred.reject(exception);\n            }\n        });\n        return deferred.promise;\n    }\n\n    /**\n     * Annotates an object such that it will never be\n     * transferred away from this process over any promise\n     * communication channel.\n     * @param object\n     * @returns promise a wrapping of that object that\n     * additionally responds to the \"isDef\" message\n     * without a rejection.\n     */\n    Q.master = master;\n    function master(object) {\n        return Promise({\n            \"isDef\": function isDef() {}\n        }, function fallback(op, args) {\n            return dispatch(object, op, args);\n        }, function () {\n            return Q(object).inspect();\n        });\n    }\n\n    /**\n     * Spreads the values of a promised array of arguments into the\n     * fulfillment callback.\n     * @param fulfilled callback that receives variadic arguments from the\n     * promised array\n     * @param rejected callback that receives the exception if the promise\n     * is rejected.\n     * @returns a promise for the return value or thrown exception of\n     * either callback.\n     */\n    Q.spread = spread;\n    function spread(value, fulfilled, rejected) {\n        return Q(value).spread(fulfilled, rejected);\n    }\n\n    Promise.prototype.spread = function (fulfilled, rejected) {\n        return this.all().then(function (array) {\n            return fulfilled.apply(void 0, array);\n        }, rejected);\n    };\n\n    /**\n     * The async function is a decorator for generator functions, turning\n     * them into asynchronous generators.  Although generators are only part\n     * of the newest ECMAScript 6 drafts, this code does not cause syntax\n     * errors in older engines.  This code should continue to work and will\n     * in fact improve over time as the language improves.\n     *\n     * ES6 generators are currently part of V8 version 3.19 with the\n     * --harmony-generators runtime flag enabled.  SpiderMonkey has had them\n     * for longer, but under an older Python-inspired form.  This function\n     * works on both kinds of generators.\n     *\n     * Decorates a generator function such that:\n     *  - it may yield promises\n     *  - execution will continue when that promise is fulfilled\n     *  - the value of the yield expression will be the fulfilled value\n     *  - it returns a promise for the return value (when the generator\n     *    stops iterating)\n     *  - the decorated function returns a promise for the return value\n     *    of the generator or the first rejected promise among those\n     *    yielded.\n     *  - if an error is thrown in the generator, it propagates through\n     *    every following yield until it is caught, or until it escapes\n     *    the generator function altogether, and is translated into a\n     *    rejection for the promise returned by the decorated generator.\n     */\n    Q.async = async;\n    function async(makeGenerator) {\n        return function () {\n            // when verb is \"send\", arg is a value\n            // when verb is \"throw\", arg is an exception\n            function continuer(verb, arg) {\n                var result;\n\n                // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only\n                // engine that has a deployed base of browsers that support generators.\n                // However, SM's generators use the Python-inspired semantics of\n                // outdated ES6 drafts.  We would like to support ES6, but we'd also\n                // like to make it possible to use generators in deployed browsers, so\n                // we also support Python-style generators.  At some point we can remove\n                // this block.\n\n                if (typeof StopIteration === \"undefined\") {\n                    // ES6 Generators\n                    try {\n                        result = generator[verb](arg);\n                    } catch (exception) {\n                        return reject(exception);\n                    }\n                    if (result.done) {\n                        return Q(result.value);\n                    } else {\n                        return when(result.value, callback, errback);\n                    }\n                } else {\n                    // SpiderMonkey Generators\n                    // FIXME: Remove this case when SM does ES6 generators.\n                    try {\n                        result = generator[verb](arg);\n                    } catch (exception) {\n                        if (isStopIteration(exception)) {\n                            return Q(exception.value);\n                        } else {\n                            return reject(exception);\n                        }\n                    }\n                    return when(result, callback, errback);\n                }\n            }\n            var generator = makeGenerator.apply(this, arguments);\n            var callback = continuer.bind(continuer, \"next\");\n            var errback = continuer.bind(continuer, \"throw\");\n            return callback();\n        };\n    }\n\n    /**\n     * The spawn function is a small wrapper around async that immediately\n     * calls the generator and also ends the promise chain, so that any\n     * unhandled errors are thrown instead of forwarded to the error\n     * handler. This is useful because it's extremely common to run\n     * generators at the top-level to work with libraries.\n     */\n    Q.spawn = spawn;\n    function spawn(makeGenerator) {\n        Q.done(Q.async(makeGenerator)());\n    }\n\n    // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.\n    /**\n     * Throws a ReturnValue exception to stop an asynchronous generator.\n     *\n     * This interface is a stop-gap measure to support generator return\n     * values in older Firefox/SpiderMonkey.  In browsers that support ES6\n     * generators like Chromium 29, just use \"return\" in your generator\n     * functions.\n     *\n     * @param value the return value for the surrounding generator\n     * @throws ReturnValue exception with the value.\n     * @example\n     * // ES6 style\n     * Q.async(function* () {\n     *      var foo = yield getFooPromise();\n     *      var bar = yield getBarPromise();\n     *      return foo + bar;\n     * })\n     * // Older SpiderMonkey style\n     * Q.async(function () {\n     *      var foo = yield getFooPromise();\n     *      var bar = yield getBarPromise();\n     *      Q.return(foo + bar);\n     * })\n     */\n    Q[\"return\"] = _return;\n    function _return(value) {\n        throw new QReturnValue(value);\n    }\n\n    /**\n     * The promised function decorator ensures that any promise arguments\n     * are settled and passed as values (`this` is also settled and passed\n     * as a value).  It will also ensure that the result of a function is\n     * always a promise.\n     *\n     * @example\n     * var add = Q.promised(function (a, b) {\n     *     return a + b;\n     * });\n     * add(Q(a), Q(B));\n     *\n     * @param {function} callback The function to decorate\n     * @returns {function} a function that has been decorated.\n     */\n    Q.promised = promised;\n    function promised(callback) {\n        return function () {\n            return spread([this, all(arguments)], function (self, args) {\n                return callback.apply(self, args);\n            });\n        };\n    }\n\n    /**\n     * sends a message to a value in a future turn\n     * @param object* the recipient\n     * @param op the name of the message operation, e.g., \"when\",\n     * @param args further arguments to be forwarded to the operation\n     * @returns result {Promise} a promise for the result of the operation\n     */\n    Q.dispatch = dispatch;\n    function dispatch(object, op, args) {\n        return Q(object).dispatch(op, args);\n    }\n\n    Promise.prototype.dispatch = function (op, args) {\n        var self = this;\n        var deferred = defer();\n        Q.nextTick(function () {\n            self.promiseDispatch(deferred.resolve, op, args);\n        });\n        return deferred.promise;\n    };\n\n    /**\n     * Gets the value of a property in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @param name      name of property to get\n     * @return promise for the property value\n     */\n    Q.get = function (object, key) {\n        return Q(object).dispatch(\"get\", [key]);\n    };\n\n    Promise.prototype.get = function (key) {\n        return this.dispatch(\"get\", [key]);\n    };\n\n    /**\n     * Sets the value of a property in a future turn.\n     * @param object    promise or immediate reference for object object\n     * @param name      name of property to set\n     * @param value     new value of property\n     * @return promise for the return value\n     */\n    Q.set = function (object, key, value) {\n        return Q(object).dispatch(\"set\", [key, value]);\n    };\n\n    Promise.prototype.set = function (key, value) {\n        return this.dispatch(\"set\", [key, value]);\n    };\n\n    /**\n     * Deletes a property in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @param name      name of property to delete\n     * @return promise for the return value\n     */\n    Q.del = // XXX legacy\n    Q[\"delete\"] = function (object, key) {\n        return Q(object).dispatch(\"delete\", [key]);\n    };\n\n    Promise.prototype.del = // XXX legacy\n    Promise.prototype[\"delete\"] = function (key) {\n        return this.dispatch(\"delete\", [key]);\n    };\n\n    /**\n     * Invokes a method in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @param name      name of method to invoke\n     * @param value     a value to post, typically an array of\n     *                  invocation arguments for promises that\n     *                  are ultimately backed with `resolve` values,\n     *                  as opposed to those backed with URLs\n     *                  wherein the posted value can be any\n     *                  JSON serializable object.\n     * @return promise for the return value\n     */\n    // bound locally because it is used by other methods\n    Q.mapply = // XXX As proposed by \"Redsandro\"\n    Q.post = function (object, name, args) {\n        return Q(object).dispatch(\"post\", [name, args]);\n    };\n\n    Promise.prototype.mapply = // XXX As proposed by \"Redsandro\"\n    Promise.prototype.post = function (name, args) {\n        return this.dispatch(\"post\", [name, args]);\n    };\n\n    /**\n     * Invokes a method in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @param name      name of method to invoke\n     * @param ...args   array of invocation arguments\n     * @return promise for the return value\n     */\n    Q.send = // XXX Mark Miller's proposed parlance\n    Q.mcall = // XXX As proposed by \"Redsandro\"\n    Q.invoke = function (object, name /*...args*/) {\n        return Q(object).dispatch(\"post\", [name, array_slice(arguments, 2)]);\n    };\n\n    Promise.prototype.send = // XXX Mark Miller's proposed parlance\n    Promise.prototype.mcall = // XXX As proposed by \"Redsandro\"\n    Promise.prototype.invoke = function (name /*...args*/) {\n        return this.dispatch(\"post\", [name, array_slice(arguments, 1)]);\n    };\n\n    /**\n     * Applies the promised function in a future turn.\n     * @param object    promise or immediate reference for target function\n     * @param args      array of application arguments\n     */\n    Q.fapply = function (object, args) {\n        return Q(object).dispatch(\"apply\", [void 0, args]);\n    };\n\n    Promise.prototype.fapply = function (args) {\n        return this.dispatch(\"apply\", [void 0, args]);\n    };\n\n    /**\n     * Calls the promised function in a future turn.\n     * @param object    promise or immediate reference for target function\n     * @param ...args   array of application arguments\n     */\n    Q[\"try\"] = Q.fcall = function (object /* ...args*/) {\n        return Q(object).dispatch(\"apply\", [void 0, array_slice(arguments, 1)]);\n    };\n\n    Promise.prototype.fcall = function () /*...args*/{\n        return this.dispatch(\"apply\", [void 0, array_slice(arguments)]);\n    };\n\n    /**\n     * Binds the promised function, transforming return values into a fulfilled\n     * promise and thrown errors into a rejected one.\n     * @param object    promise or immediate reference for target function\n     * @param ...args   array of application arguments\n     */\n    Q.fbind = function (object /*...args*/) {\n        var promise = Q(object);\n        var args = array_slice(arguments, 1);\n        return function fbound() {\n            return promise.dispatch(\"apply\", [this, args.concat(array_slice(arguments))]);\n        };\n    };\n    Promise.prototype.fbind = function () /*...args*/{\n        var promise = this;\n        var args = array_slice(arguments);\n        return function fbound() {\n            return promise.dispatch(\"apply\", [this, args.concat(array_slice(arguments))]);\n        };\n    };\n\n    /**\n     * Requests the names of the owned properties of a promised\n     * object in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @return promise for the keys of the eventually settled object\n     */\n    Q.keys = function (object) {\n        return Q(object).dispatch(\"keys\", []);\n    };\n\n    Promise.prototype.keys = function () {\n        return this.dispatch(\"keys\", []);\n    };\n\n    /**\n     * Turns an array of promises into a promise for an array.  If any of\n     * the promises gets rejected, the whole array is rejected immediately.\n     * @param {Array*} an array (or promise for an array) of values (or\n     * promises for values)\n     * @returns a promise for an array of the corresponding values\n     */\n    // By Mark Miller\n    // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled\n    Q.all = all;\n    function all(promises) {\n        return when(promises, function (promises) {\n            var pendingCount = 0;\n            var deferred = defer();\n            array_reduce(promises, function (undefined, promise, index) {\n                var snapshot;\n                if (isPromise(promise) && (snapshot = promise.inspect()).state === \"fulfilled\") {\n                    promises[index] = snapshot.value;\n                } else {\n                    ++pendingCount;\n                    when(promise, function (value) {\n                        promises[index] = value;\n                        if (--pendingCount === 0) {\n                            deferred.resolve(promises);\n                        }\n                    }, deferred.reject, function (progress) {\n                        deferred.notify({ index: index, value: progress });\n                    });\n                }\n            }, void 0);\n            if (pendingCount === 0) {\n                deferred.resolve(promises);\n            }\n            return deferred.promise;\n        });\n    }\n\n    Promise.prototype.all = function () {\n        return all(this);\n    };\n\n    /**\n     * Returns the first resolved promise of an array. Prior rejected promises are\n     * ignored.  Rejects only if all promises are rejected.\n     * @param {Array*} an array containing values or promises for values\n     * @returns a promise fulfilled with the value of the first resolved promise,\n     * or a rejected promise if all promises are rejected.\n     */\n    Q.any = any;\n\n    function any(promises) {\n        if (promises.length === 0) {\n            return Q.resolve();\n        }\n\n        var deferred = Q.defer();\n        var pendingCount = 0;\n        array_reduce(promises, function (prev, current, index) {\n            var promise = promises[index];\n\n            pendingCount++;\n\n            when(promise, onFulfilled, onRejected, onProgress);\n            function onFulfilled(result) {\n                deferred.resolve(result);\n            }\n            function onRejected() {\n                pendingCount--;\n                if (pendingCount === 0) {\n                    deferred.reject(new Error(\"Can't get fulfillment value from any promise, all \" + \"promises were rejected.\"));\n                }\n            }\n            function onProgress(progress) {\n                deferred.notify({\n                    index: index,\n                    value: progress\n                });\n            }\n        }, undefined);\n\n        return deferred.promise;\n    }\n\n    Promise.prototype.any = function () {\n        return any(this);\n    };\n\n    /**\n     * Waits for all promises to be settled, either fulfilled or\n     * rejected.  This is distinct from `all` since that would stop\n     * waiting at the first rejection.  The promise returned by\n     * `allResolved` will never be rejected.\n     * @param promises a promise for an array (or an array) of promises\n     * (or values)\n     * @return a promise for an array of promises\n     */\n    Q.allResolved = deprecate(allResolved, \"allResolved\", \"allSettled\");\n    function allResolved(promises) {\n        return when(promises, function (promises) {\n            promises = array_map(promises, Q);\n            return when(all(array_map(promises, function (promise) {\n                return when(promise, noop, noop);\n            })), function () {\n                return promises;\n            });\n        });\n    }\n\n    Promise.prototype.allResolved = function () {\n        return allResolved(this);\n    };\n\n    /**\n     * @see Promise#allSettled\n     */\n    Q.allSettled = allSettled;\n    function allSettled(promises) {\n        return Q(promises).allSettled();\n    }\n\n    /**\n     * Turns an array of promises into a promise for an array of their states (as\n     * returned by `inspect`) when they have all settled.\n     * @param {Array[Any*]} values an array (or promise for an array) of values (or\n     * promises for values)\n     * @returns {Array[State]} an array of states for the respective values.\n     */\n    Promise.prototype.allSettled = function () {\n        return this.then(function (promises) {\n            return all(array_map(promises, function (promise) {\n                promise = Q(promise);\n                function regardless() {\n                    return promise.inspect();\n                }\n                return promise.then(regardless, regardless);\n            }));\n        });\n    };\n\n    /**\n     * Captures the failure of a promise, giving an oportunity to recover\n     * with a callback.  If the given promise is fulfilled, the returned\n     * promise is fulfilled.\n     * @param {Any*} promise for something\n     * @param {Function} callback to fulfill the returned promise if the\n     * given promise is rejected\n     * @returns a promise for the return value of the callback\n     */\n    Q.fail = // XXX legacy\n    Q[\"catch\"] = function (object, rejected) {\n        return Q(object).then(void 0, rejected);\n    };\n\n    Promise.prototype.fail = // XXX legacy\n    Promise.prototype[\"catch\"] = function (rejected) {\n        return this.then(void 0, rejected);\n    };\n\n    /**\n     * Attaches a listener that can respond to progress notifications from a\n     * promise's originating deferred. This listener receives the exact arguments\n     * passed to ``deferred.notify``.\n     * @param {Any*} promise for something\n     * @param {Function} callback to receive any progress notifications\n     * @returns the given promise, unchanged\n     */\n    Q.progress = progress;\n    function progress(object, progressed) {\n        return Q(object).then(void 0, void 0, progressed);\n    }\n\n    Promise.prototype.progress = function (progressed) {\n        return this.then(void 0, void 0, progressed);\n    };\n\n    /**\n     * Provides an opportunity to observe the settling of a promise,\n     * regardless of whether the promise is fulfilled or rejected.  Forwards\n     * the resolution to the returned promise when the callback is done.\n     * The callback can return a promise to defer completion.\n     * @param {Any*} promise\n     * @param {Function} callback to observe the resolution of the given\n     * promise, takes no arguments.\n     * @returns a promise for the resolution of the given promise when\n     * ``fin`` is done.\n     */\n    Q.fin = // XXX legacy\n    Q[\"finally\"] = function (object, callback) {\n        return Q(object)[\"finally\"](callback);\n    };\n\n    Promise.prototype.fin = // XXX legacy\n    Promise.prototype[\"finally\"] = function (callback) {\n        callback = Q(callback);\n        return this.then(function (value) {\n            return callback.fcall().then(function () {\n                return value;\n            });\n        }, function (reason) {\n            // TODO attempt to recycle the rejection with \"this\".\n            return callback.fcall().then(function () {\n                throw reason;\n            });\n        });\n    };\n\n    /**\n     * Terminates a chain of promises, forcing rejections to be\n     * thrown as exceptions.\n     * @param {Any*} promise at the end of a chain of promises\n     * @returns nothing\n     */\n    Q.done = function (object, fulfilled, rejected, progress) {\n        return Q(object).done(fulfilled, rejected, progress);\n    };\n\n    Promise.prototype.done = function (fulfilled, rejected, progress) {\n        var onUnhandledError = function onUnhandledError(error) {\n            // forward to a future turn so that ``when``\n            // does not catch it and turn it into a rejection.\n            Q.nextTick(function () {\n                makeStackTraceLong(error, promise);\n                if (Q.onerror) {\n                    Q.onerror(error);\n                } else {\n                    throw error;\n                }\n            });\n        };\n\n        // Avoid unnecessary `nextTick`ing via an unnecessary `when`.\n        var promise = fulfilled || rejected || progress ? this.then(fulfilled, rejected, progress) : this;\n\n        if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && process && process.domain) {\n            onUnhandledError = process.domain.bind(onUnhandledError);\n        }\n\n        promise.then(void 0, onUnhandledError);\n    };\n\n    /**\n     * Causes a promise to be rejected if it does not get fulfilled before\n     * some milliseconds time out.\n     * @param {Any*} promise\n     * @param {Number} milliseconds timeout\n     * @param {Any*} custom error message or Error object (optional)\n     * @returns a promise for the resolution of the given promise if it is\n     * fulfilled before the timeout, otherwise rejected.\n     */\n    Q.timeout = function (object, ms, error) {\n        return Q(object).timeout(ms, error);\n    };\n\n    Promise.prototype.timeout = function (ms, error) {\n        var deferred = defer();\n        var timeoutId = setTimeout(function () {\n            if (!error || \"string\" === typeof error) {\n                error = new Error(error || \"Timed out after \" + ms + \" ms\");\n                error.code = \"ETIMEDOUT\";\n            }\n            deferred.reject(error);\n        }, ms);\n\n        this.then(function (value) {\n            clearTimeout(timeoutId);\n            deferred.resolve(value);\n        }, function (exception) {\n            clearTimeout(timeoutId);\n            deferred.reject(exception);\n        }, deferred.notify);\n\n        return deferred.promise;\n    };\n\n    /**\n     * Returns a promise for the given value (or promised value), some\n     * milliseconds after it resolved. Passes rejections immediately.\n     * @param {Any*} promise\n     * @param {Number} milliseconds\n     * @returns a promise for the resolution of the given promise after milliseconds\n     * time has elapsed since the resolution of the given promise.\n     * If the given promise rejects, that is passed immediately.\n     */\n    Q.delay = function (object, timeout) {\n        if (timeout === void 0) {\n            timeout = object;\n            object = void 0;\n        }\n        return Q(object).delay(timeout);\n    };\n\n    Promise.prototype.delay = function (timeout) {\n        return this.then(function (value) {\n            var deferred = defer();\n            setTimeout(function () {\n                deferred.resolve(value);\n            }, timeout);\n            return deferred.promise;\n        });\n    };\n\n    /**\n     * Passes a continuation to a Node function, which is called with the given\n     * arguments provided as an array, and returns a promise.\n     *\n     *      Q.nfapply(FS.readFile, [__filename])\n     *      .then(function (content) {\n     *      })\n     *\n     */\n    Q.nfapply = function (callback, args) {\n        return Q(callback).nfapply(args);\n    };\n\n    Promise.prototype.nfapply = function (args) {\n        var deferred = defer();\n        var nodeArgs = array_slice(args);\n        nodeArgs.push(deferred.makeNodeResolver());\n        this.fapply(nodeArgs).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    /**\n     * Passes a continuation to a Node function, which is called with the given\n     * arguments provided individually, and returns a promise.\n     * @example\n     * Q.nfcall(FS.readFile, __filename)\n     * .then(function (content) {\n     * })\n     *\n     */\n    Q.nfcall = function (callback /*...args*/) {\n        var args = array_slice(arguments, 1);\n        return Q(callback).nfapply(args);\n    };\n\n    Promise.prototype.nfcall = function () /*...args*/{\n        var nodeArgs = array_slice(arguments);\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        this.fapply(nodeArgs).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    /**\n     * Wraps a NodeJS continuation passing function and returns an equivalent\n     * version that returns a promise.\n     * @example\n     * Q.nfbind(FS.readFile, __filename)(\"utf-8\")\n     * .then(console.log)\n     * .done()\n     */\n    Q.nfbind = Q.denodeify = function (callback /*...args*/) {\n        var baseArgs = array_slice(arguments, 1);\n        return function () {\n            var nodeArgs = baseArgs.concat(array_slice(arguments));\n            var deferred = defer();\n            nodeArgs.push(deferred.makeNodeResolver());\n            Q(callback).fapply(nodeArgs).fail(deferred.reject);\n            return deferred.promise;\n        };\n    };\n\n    Promise.prototype.nfbind = Promise.prototype.denodeify = function () /*...args*/{\n        var args = array_slice(arguments);\n        args.unshift(this);\n        return Q.denodeify.apply(void 0, args);\n    };\n\n    Q.nbind = function (callback, thisp /*...args*/) {\n        var baseArgs = array_slice(arguments, 2);\n        return function () {\n            var nodeArgs = baseArgs.concat(array_slice(arguments));\n            var deferred = defer();\n            nodeArgs.push(deferred.makeNodeResolver());\n            function bound() {\n                return callback.apply(thisp, arguments);\n            }\n            Q(bound).fapply(nodeArgs).fail(deferred.reject);\n            return deferred.promise;\n        };\n    };\n\n    Promise.prototype.nbind = function () /*thisp, ...args*/{\n        var args = array_slice(arguments, 0);\n        args.unshift(this);\n        return Q.nbind.apply(void 0, args);\n    };\n\n    /**\n     * Calls a method of a Node-style object that accepts a Node-style\n     * callback with a given array of arguments, plus a provided callback.\n     * @param object an object that has the named method\n     * @param {String} name name of the method of object\n     * @param {Array} args arguments to pass to the method; the callback\n     * will be provided by Q and appended to these arguments.\n     * @returns a promise for the value or error\n     */\n    Q.nmapply = // XXX As proposed by \"Redsandro\"\n    Q.npost = function (object, name, args) {\n        return Q(object).npost(name, args);\n    };\n\n    Promise.prototype.nmapply = // XXX As proposed by \"Redsandro\"\n    Promise.prototype.npost = function (name, args) {\n        var nodeArgs = array_slice(args || []);\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        this.dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    /**\n     * Calls a method of a Node-style object that accepts a Node-style\n     * callback, forwarding the given variadic arguments, plus a provided\n     * callback argument.\n     * @param object an object that has the named method\n     * @param {String} name name of the method of object\n     * @param ...args arguments to pass to the method; the callback will\n     * be provided by Q and appended to these arguments.\n     * @returns a promise for the value or error\n     */\n    Q.nsend = // XXX Based on Mark Miller's proposed \"send\"\n    Q.nmcall = // XXX Based on \"Redsandro's\" proposal\n    Q.ninvoke = function (object, name /*...args*/) {\n        var nodeArgs = array_slice(arguments, 2);\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        Q(object).dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    Promise.prototype.nsend = // XXX Based on Mark Miller's proposed \"send\"\n    Promise.prototype.nmcall = // XXX Based on \"Redsandro's\" proposal\n    Promise.prototype.ninvoke = function (name /*...args*/) {\n        var nodeArgs = array_slice(arguments, 1);\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        this.dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    /**\n     * If a function would like to support both Node continuation-passing-style and\n     * promise-returning-style, it can end its internal promise chain with\n     * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user\n     * elects to use a nodeback, the result will be sent there.  If they do not\n     * pass a nodeback, they will receive the result promise.\n     * @param object a result (or a promise for a result)\n     * @param {Function} nodeback a Node.js-style callback\n     * @returns either the promise or nothing\n     */\n    Q.nodeify = nodeify;\n    function nodeify(object, nodeback) {\n        return Q(object).nodeify(nodeback);\n    }\n\n    Promise.prototype.nodeify = function (nodeback) {\n        if (nodeback) {\n            this.then(function (value) {\n                Q.nextTick(function () {\n                    nodeback(null, value);\n                });\n            }, function (error) {\n                Q.nextTick(function () {\n                    nodeback(error);\n                });\n            });\n        } else {\n            return this;\n        }\n    };\n\n    Q.noConflict = function () {\n        throw new Error(\"Q.noConflict only works when Q is used as a global\");\n    };\n\n    // All code before this point will be filtered from stack traces.\n    var qEndingLine = captureLine();\n\n    return Q;\n});\n\n}).call(this,require('_process'))\n},{\"_process\":237}],239:[function(require,module,exports){\n'use strict';\n\n/*\nRainbowVis-JS \nReleased under Eclipse Public License - v 1.0\n*/\n\nfunction Rainbow() {\n\t\"use strict\";\n\n\tvar gradients = null;\n\tvar minNum = 0;\n\tvar maxNum = 100;\n\tvar colours = ['ff0000', 'ffff00', '00ff00', '0000ff'];\n\tsetColours(colours);\n\n\tfunction setColours(spectrum) {\n\t\tif (spectrum.length < 2) {\n\t\t\tthrow new Error('Rainbow must have two or more colours.');\n\t\t} else {\n\t\t\tvar increment = (maxNum - minNum) / (spectrum.length - 1);\n\t\t\tvar firstGradient = new ColourGradient();\n\t\t\tfirstGradient.setGradient(spectrum[0], spectrum[1]);\n\t\t\tfirstGradient.setNumberRange(minNum, minNum + increment);\n\t\t\tgradients = [firstGradient];\n\n\t\t\tfor (var i = 1; i < spectrum.length - 1; i++) {\n\t\t\t\tvar colourGradient = new ColourGradient();\n\t\t\t\tcolourGradient.setGradient(spectrum[i], spectrum[i + 1]);\n\t\t\t\tcolourGradient.setNumberRange(minNum + increment * i, minNum + increment * (i + 1));\n\t\t\t\tgradients[i] = colourGradient;\n\t\t\t}\n\n\t\t\tcolours = spectrum;\n\t\t}\n\t}\n\n\tthis.setSpectrum = function () {\n\t\tsetColours(arguments);\n\t\treturn this;\n\t};\n\n\tthis.setSpectrumByArray = function (array) {\n\t\tsetColours(array);\n\t\treturn this;\n\t};\n\n\tthis.colourAt = function (number) {\n\t\tif (isNaN(number)) {\n\t\t\tthrow new TypeError(number + ' is not a number');\n\t\t} else if (gradients.length === 1) {\n\t\t\treturn gradients[0].colourAt(number);\n\t\t} else {\n\t\t\tvar segment = (maxNum - minNum) / gradients.length;\n\t\t\tvar index = Math.min(Math.floor((Math.max(number, minNum) - minNum) / segment), gradients.length - 1);\n\t\t\treturn gradients[index].colourAt(number);\n\t\t}\n\t};\n\n\tthis.colorAt = this.colourAt;\n\n\tthis.setNumberRange = function (minNumber, maxNumber) {\n\t\tif (maxNumber > minNumber) {\n\t\t\tminNum = minNumber;\n\t\t\tmaxNum = maxNumber;\n\t\t\tsetColours(colours);\n\t\t} else {\n\t\t\tthrow new RangeError('maxNumber (' + maxNumber + ') is not greater than minNumber (' + minNumber + ')');\n\t\t}\n\t\treturn this;\n\t};\n}\n\nfunction ColourGradient() {\n\t\"use strict\";\n\n\tvar startColour = 'ff0000';\n\tvar endColour = '0000ff';\n\tvar minNum = 0;\n\tvar maxNum = 100;\n\n\tthis.setGradient = function (colourStart, colourEnd) {\n\t\tstartColour = getHexColour(colourStart);\n\t\tendColour = getHexColour(colourEnd);\n\t};\n\n\tthis.setNumberRange = function (minNumber, maxNumber) {\n\t\tif (maxNumber > minNumber) {\n\t\t\tminNum = minNumber;\n\t\t\tmaxNum = maxNumber;\n\t\t} else {\n\t\t\tthrow new RangeError('maxNumber (' + maxNumber + ') is not greater than minNumber (' + minNumber + ')');\n\t\t}\n\t};\n\n\tthis.colourAt = function (number) {\n\t\treturn calcHex(number, startColour.substring(0, 2), endColour.substring(0, 2)) + calcHex(number, startColour.substring(2, 4), endColour.substring(2, 4)) + calcHex(number, startColour.substring(4, 6), endColour.substring(4, 6));\n\t};\n\n\tfunction calcHex(number, channelStart_Base16, channelEnd_Base16) {\n\t\tvar num = number;\n\t\tif (num < minNum) {\n\t\t\tnum = minNum;\n\t\t}\n\t\tif (num > maxNum) {\n\t\t\tnum = maxNum;\n\t\t}\n\t\tvar numRange = maxNum - minNum;\n\t\tvar cStart_Base10 = parseInt(channelStart_Base16, 16);\n\t\tvar cEnd_Base10 = parseInt(channelEnd_Base16, 16);\n\t\tvar cPerUnit = (cEnd_Base10 - cStart_Base10) / numRange;\n\t\tvar c_Base10 = Math.round(cPerUnit * (num - minNum) + cStart_Base10);\n\t\treturn formatHex(c_Base10.toString(16));\n\t}\n\n\tfunction formatHex(hex) {\n\t\tif (hex.length === 1) {\n\t\t\treturn '0' + hex;\n\t\t} else {\n\t\t\treturn hex;\n\t\t}\n\t}\n\n\tfunction isHexColour(string) {\n\t\tvar regex = /^#?[0-9a-fA-F]{6}$/i;\n\t\treturn regex.test(string);\n\t}\n\n\tfunction getHexColour(string) {\n\t\tif (isHexColour(string)) {\n\t\t\treturn string.substring(string.length - 6, string.length);\n\t\t} else {\n\t\t\tvar name = string.toLowerCase();\n\t\t\tif (colourNames.hasOwnProperty(name)) {\n\t\t\t\treturn colourNames[name];\n\t\t\t}\n\t\t\tthrow new Error(string + ' is not a valid colour.');\n\t\t}\n\t}\n\n\t// Extended list of CSS colornames s taken from\n\t// http://www.w3.org/TR/css3-color/#svg-color\n\tvar colourNames = {\n\t\taliceblue: \"F0F8FF\",\n\t\tantiquewhite: \"FAEBD7\",\n\t\taqua: \"00FFFF\",\n\t\taquamarine: \"7FFFD4\",\n\t\tazure: \"F0FFFF\",\n\t\tbeige: \"F5F5DC\",\n\t\tbisque: \"FFE4C4\",\n\t\tblack: \"000000\",\n\t\tblanchedalmond: \"FFEBCD\",\n\t\tblue: \"0000FF\",\n\t\tblueviolet: \"8A2BE2\",\n\t\tbrown: \"A52A2A\",\n\t\tburlywood: \"DEB887\",\n\t\tcadetblue: \"5F9EA0\",\n\t\tchartreuse: \"7FFF00\",\n\t\tchocolate: \"D2691E\",\n\t\tcoral: \"FF7F50\",\n\t\tcornflowerblue: \"6495ED\",\n\t\tcornsilk: \"FFF8DC\",\n\t\tcrimson: \"DC143C\",\n\t\tcyan: \"00FFFF\",\n\t\tdarkblue: \"00008B\",\n\t\tdarkcyan: \"008B8B\",\n\t\tdarkgoldenrod: \"B8860B\",\n\t\tdarkgray: \"A9A9A9\",\n\t\tdarkgreen: \"006400\",\n\t\tdarkgrey: \"A9A9A9\",\n\t\tdarkkhaki: \"BDB76B\",\n\t\tdarkmagenta: \"8B008B\",\n\t\tdarkolivegreen: \"556B2F\",\n\t\tdarkorange: \"FF8C00\",\n\t\tdarkorchid: \"9932CC\",\n\t\tdarkred: \"8B0000\",\n\t\tdarksalmon: \"E9967A\",\n\t\tdarkseagreen: \"8FBC8F\",\n\t\tdarkslateblue: \"483D8B\",\n\t\tdarkslategray: \"2F4F4F\",\n\t\tdarkslategrey: \"2F4F4F\",\n\t\tdarkturquoise: \"00CED1\",\n\t\tdarkviolet: \"9400D3\",\n\t\tdeeppink: \"FF1493\",\n\t\tdeepskyblue: \"00BFFF\",\n\t\tdimgray: \"696969\",\n\t\tdimgrey: \"696969\",\n\t\tdodgerblue: \"1E90FF\",\n\t\tfirebrick: \"B22222\",\n\t\tfloralwhite: \"FFFAF0\",\n\t\tforestgreen: \"228B22\",\n\t\tfuchsia: \"FF00FF\",\n\t\tgainsboro: \"DCDCDC\",\n\t\tghostwhite: \"F8F8FF\",\n\t\tgold: \"FFD700\",\n\t\tgoldenrod: \"DAA520\",\n\t\tgray: \"808080\",\n\t\tgreen: \"008000\",\n\t\tgreenyellow: \"ADFF2F\",\n\t\tgrey: \"808080\",\n\t\thoneydew: \"F0FFF0\",\n\t\thotpink: \"FF69B4\",\n\t\tindianred: \"CD5C5C\",\n\t\tindigo: \"4B0082\",\n\t\tivory: \"FFFFF0\",\n\t\tkhaki: \"F0E68C\",\n\t\tlavender: \"E6E6FA\",\n\t\tlavenderblush: \"FFF0F5\",\n\t\tlawngreen: \"7CFC00\",\n\t\tlemonchiffon: \"FFFACD\",\n\t\tlightblue: \"ADD8E6\",\n\t\tlightcoral: \"F08080\",\n\t\tlightcyan: \"E0FFFF\",\n\t\tlightgoldenrodyellow: \"FAFAD2\",\n\t\tlightgray: \"D3D3D3\",\n\t\tlightgreen: \"90EE90\",\n\t\tlightgrey: \"D3D3D3\",\n\t\tlightpink: \"FFB6C1\",\n\t\tlightsalmon: \"FFA07A\",\n\t\tlightseagreen: \"20B2AA\",\n\t\tlightskyblue: \"87CEFA\",\n\t\tlightslategray: \"778899\",\n\t\tlightslategrey: \"778899\",\n\t\tlightsteelblue: \"B0C4DE\",\n\t\tlightyellow: \"FFFFE0\",\n\t\tlime: \"00FF00\",\n\t\tlimegreen: \"32CD32\",\n\t\tlinen: \"FAF0E6\",\n\t\tmagenta: \"FF00FF\",\n\t\tmaroon: \"800000\",\n\t\tmediumaquamarine: \"66CDAA\",\n\t\tmediumblue: \"0000CD\",\n\t\tmediumorchid: \"BA55D3\",\n\t\tmediumpurple: \"9370DB\",\n\t\tmediumseagreen: \"3CB371\",\n\t\tmediumslateblue: \"7B68EE\",\n\t\tmediumspringgreen: \"00FA9A\",\n\t\tmediumturquoise: \"48D1CC\",\n\t\tmediumvioletred: \"C71585\",\n\t\tmidnightblue: \"191970\",\n\t\tmintcream: \"F5FFFA\",\n\t\tmistyrose: \"FFE4E1\",\n\t\tmoccasin: \"FFE4B5\",\n\t\tnavajowhite: \"FFDEAD\",\n\t\tnavy: \"000080\",\n\t\toldlace: \"FDF5E6\",\n\t\tolive: \"808000\",\n\t\tolivedrab: \"6B8E23\",\n\t\torange: \"FFA500\",\n\t\torangered: \"FF4500\",\n\t\torchid: \"DA70D6\",\n\t\tpalegoldenrod: \"EEE8AA\",\n\t\tpalegreen: \"98FB98\",\n\t\tpaleturquoise: \"AFEEEE\",\n\t\tpalevioletred: \"DB7093\",\n\t\tpapayawhip: \"FFEFD5\",\n\t\tpeachpuff: \"FFDAB9\",\n\t\tperu: \"CD853F\",\n\t\tpink: \"FFC0CB\",\n\t\tplum: \"DDA0DD\",\n\t\tpowderblue: \"B0E0E6\",\n\t\tpurple: \"800080\",\n\t\tred: \"FF0000\",\n\t\trosybrown: \"BC8F8F\",\n\t\troyalblue: \"4169E1\",\n\t\tsaddlebrown: \"8B4513\",\n\t\tsalmon: \"FA8072\",\n\t\tsandybrown: \"F4A460\",\n\t\tseagreen: \"2E8B57\",\n\t\tseashell: \"FFF5EE\",\n\t\tsienna: \"A0522D\",\n\t\tsilver: \"C0C0C0\",\n\t\tskyblue: \"87CEEB\",\n\t\tslateblue: \"6A5ACD\",\n\t\tslategray: \"708090\",\n\t\tslategrey: \"708090\",\n\t\tsnow: \"FFFAFA\",\n\t\tspringgreen: \"00FF7F\",\n\t\tsteelblue: \"4682B4\",\n\t\ttan: \"D2B48C\",\n\t\tteal: \"008080\",\n\t\tthistle: \"D8BFD8\",\n\t\ttomato: \"FF6347\",\n\t\tturquoise: \"40E0D0\",\n\t\tviolet: \"EE82EE\",\n\t\twheat: \"F5DEB3\",\n\t\twhite: \"FFFFFF\",\n\t\twhitesmoke: \"F5F5F5\",\n\t\tyellow: \"FFFF00\",\n\t\tyellowgreen: \"9ACD32\"\n\t};\n}\n\nif (typeof module !== 'undefined') {\n\tmodule.exports = Rainbow;\n}\n\n},{}],240:[function(require,module,exports){\n\"use strict\";\n\n/**\n * Check if the DOM element `child` is within the given `parent` DOM element.\n *\n * @param {DOMElement|Range} child - the DOM element or Range to check if it's within `parent`\n * @param {DOMElement} parent  - the parent node that `child` could be inside of\n * @return {Boolean} True if `child` is within `parent`. False otherwise.\n * @public\n */\n\nmodule.exports = function within(child, parent) {\n  // don't throw if `child` is null\n  if (!child) return false;\n\n  // Range support\n  if (child.commonAncestorContainer) child = child.commonAncestorContainer;else if (child.endContainer) child = child.endContainer;\n\n  // traverse up the `parentNode` properties until `parent` is found\n  var node = child;\n  while (node = node.parentNode) {\n    if (node == parent) return true;\n  }\n\n  return false;\n};\n\n},{}],241:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AAdjacentWithSameResourceShouldBeCombined = {\n  run: function run(test) {\n\n    function findAdjacent(element) {\n      // Find all the links\n      var links = DOM.scry('a', element);\n      // Sort them into singletons and coupletons.\n      var $singletons = [];\n      var $coupletons = [];\n\n      links.forEach(function (link) {\n        var next = DOM.next(link);\n        if (next && DOM.is(next, 'a')) {\n          $coupletons.push(link);\n        } else {\n          $singletons.push(link);\n        }\n      });\n\n      $singletons.forEach(excludeSingleLinks);\n      $coupletons.forEach(checkNextLink);\n    }\n\n    function checkNextLink(element) {\n      var thisHref = element.getAttribute('href');\n      var next = DOM.next(element);\n      var status = 'passed';\n      var _case = Case({\n        element: element\n      });\n      if (next) {\n        var nextHref = next.getAttribute('href');\n        if (thisHref === nextHref) {\n          status = 'failed';\n        }\n      }\n\n      test.add(_case);\n      _case.set({\n        status: status\n      });\n    }\n\n    function excludeSingleLinks(element) {\n      var _case = Case({\n        element: element\n      });\n      test.add(_case);\n      _case.set({\n        status: 'inapplicable'\n      });\n    }\n\n    test.get('scope').forEach(findAdjacent);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Adjacent links that point to the same location should be merged',\n      nl: 'Voeg naast elkaar gelegen links die naar dezelfde locatie verwijzen samen'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing two links right next to each other that point to the same location can be confusing. Try combining the links.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Voor hen zijn naast elkaar gelegen links die naar dezelfde locatie verwijzen verwarrend. Probeer de links samen te voegen.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: ['H2', 'F89']\n        },\n        '2.4.9': {\n          techniques: ['F89']\n        },\n        '4.1.2': {\n          techniques: ['F89']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AAdjacentWithSameResourceShouldBeCombined;\n\n},{\"Case\":33,\"DOM\":34}],242:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AImgAltNotRepetitive = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a img[alt]', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n\n        var alt = CleanStringComponent(DOM.getAttribute(element, 'alt'));\n        var link = DOM.parents(element);\n        link.unshift(element);\n        link = link.find(function (el) {\n          return DOM.is(el, 'a');\n        });\n        var linkText = CleanStringComponent(DOM.text(link));\n\n        if (alt.length > 0 && linkText.indexOf(alt) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'When an image is in a link, its \\\"alt\\\" attribute should not repeat other text in the link',\n      nl: 'Als een link een afbeelding bevat, moet het \\\"alt\\\"-attribuut niet dezelfde tekst bevatten als de linktekst'\n    },\n    description: {\n      en: 'Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice.',\n      nl: 'Als een link een afbeelding bevat, moet deze afbeelding een andere tekst in het alt-attribuut hebben dan de tekst in de link. Hiermee voorkom je dat een schermlezer dezelfde tekst twee keer voorleest.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H30']\n        },\n        '2.4.4': {\n          techniques: ['H30']\n        },\n        '2.4.9': {\n          techniques: ['H30']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AImgAltNotRepetitive;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34}],243:[function(require,module,exports){\n'use strict';\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar BorderDetailsComponent = require('BorderDetailsComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AInPHasADistinctStyle = {\n  run: function run(test) {\n\n    /**\n     * Checks if an element has a border set\n     * @param element\n     * @returns {boolean}\n     */\n    function hasBorder(element) {\n      var borders = BorderDetailsComponent(element);\n      var width = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = borders[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var border = _step.value;\n\n          var _border = _slicedToArray(border, 2);\n\n          var details = _border[1];\n\n          width += details.width;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return width > 0;\n    }\n\n    /**\n     * Test if two elements have a distinct style from it's ancestor\n     * @param  {jQuery node} $elm\n     * @param  {jQuery node} $parent\n     * @return {boolean}\n     */\n    function elmHasDistinctStyle($elm, $parent) {\n      var result = false;\n      var styleProperties = ['font-weight', 'font-style'];\n      var textDecoration = DOM.getComputedStyle($elm, 'text-decoration');\n\n      if (textDecoration !== 'none' && textDecoration !== DOM.getComputedStyle($parent, 'text-decoration')) {\n        result = true;\n      }\n\n      if (DOM.getComputedStyle($elm, 'background-color') !== 'rgba(0, 0, 0, 0)') {\n        styleProperties.push('background');\n      }\n\n      styleProperties.forEach(function (styleProp) {\n        if (!result && DOM.getComputedStyle($elm, styleProp) !== DOM.getComputedStyle($parent, styleProp)) {\n          result = true;\n        }\n      });\n\n      return result || hasBorder($elm);\n    }\n\n    function elmHasDistinctPosition($elm) {\n      var isBlock = DOM.getComputedStyle($elm, 'display') === 'block';\n      var position = DOM.getComputedStyle($elm, 'position');\n      var isPositioned = position !== 'relative' && position !== 'static';\n      return isBlock || isPositioned;\n    }\n\n    // Ignore links where the p only contains white space, <, >, |, \\, / and - chars\n    var allowedPText = /^([\\s|-]|>|<|\\\\|\\/|&(gt|lt);)*$/i;\n\n    test.get('scope').forEach(function (scope) {\n      var anchors = DOM.scry('p a[href]', scope);\n\n      anchors.forEach(function (element) {\n        var $p = DOM.parents(element).find(function (parent) {\n          return DOM.is(parent, 'p');\n        });\n        var $parent = element.parentNode;\n\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var aText = DOM.text(element).trim();\n\n        // Get all text of the p element with all anchors removed\n        var pClone = $p.cloneNode(true);\n        DOM.scry('a[href]', pClone).forEach(function (link) {\n          link.parentNode.removeChild(link);\n        });\n        var pText = DOM.text(pClone).trim();\n\n        if (aText === '' || pText.match(allowedPText)) {\n          _case.set('status', 'inapplicable');\n        } else if (DOM.getComputedStyle(element, 'color') === DOM.getComputedStyle($p, 'color')) {\n          _case.set('status', 'passed');\n        } else if (elmHasDistinctStyle(element, $p)) {\n          _case.set('status', 'passed');\n        } else if (elmHasDistinctPosition(element)) {\n          _case.set('status', 'passed');\n        } else if (DOM.scry('img', element).length > 0) {\n          _case.set('status', 'passed');\n        } else if (DOM.text($parent).trim() === aText && elmHasDistinctStyle($parent, $p)) {\n          _case.set('status', 'passed');\n        } else {\n          _case.set('status', 'failed');\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should be have a distinct style inside a p tag',\n      nl: 'Links moeten een afwijkende stijl hebben binnen een paragraaf'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AInPHasADistinctStyle;\n\n},{\"BorderDetailsComponent\":2,\"Case\":33,\"DOM\":34}],244:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar ALinkTextDoesNotBeginWithRedundantWord = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var self = element;\n        var $link = element;\n        var text = '';\n        var $img = DOM.scry('img[alt]', $link)[0];\n        if ($img) {\n          text = text + DOM.getAttribute($img, 'alt');\n        }\n        text = text + DOM.text($link);\n        text = text.toLowerCase();\n        var _case;\n        // Search the text for redundant words. Break as soon as one is detected.\n        for (var i = 0, il = RedundantStringsComponent.link.length; i < il; ++i) {\n          var phrase = RedundantStringsComponent.link[i];\n          if (text.search(phrase) > -1) {\n            _case = test.add(Case({\n              element: self,\n              status: 'failed'\n            }));\n            break;\n          }\n        }\n        // If the case didn't fail, then it passed.\n        if (!_case) {\n          test.add(Case({\n            element: self,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Link text should not begin with redundant text',\n      nl: 'Laat linkteksten niet beginnen met overbodige tekst'\n    },\n    description: {\n      en: 'Link text should not begin with redundant words or phrases like \\\"link\\\".',\n      nl: 'Laat linkteksten niet beginnen met overbodige woorden of woordcombinaties als \\\"link\\\" of \\\"klik hier\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.9': {\n          techniques: ['F84']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinkTextDoesNotBeginWithRedundantWord;\n\n},{\"Case\":33,\"DOM\":34,\"RedundantStringsComponent\":19}],245:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ALinkWithNonText = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var links = DOM.scry('a', scope);\n      var inapplicableLinks = [];\n      var applicableLinks = [];\n      links.forEach(function (link) {\n        var contents;\n        if (DOM.hasAttribute(link, 'href')) {\n          contents = DOM.scry('img, object, embed', link);\n          if (contents.length) {\n            applicableLinks.push(link);\n          } else {\n            inapplicableLinks.push(link);\n          }\n        } else {\n          inapplicableLinks.push(link);\n        }\n      });\n\n      inapplicableLinks.forEach(function (element) {\n        var _case = Case({\n          element: element,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n      });\n\n      applicableLinks.forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!IsUnreadable(DOM.text(element))) {\n          _case.set({\n            status: 'passed'\n          });\n          return;\n        }\n        var unreadable = 0;\n        DOM.scry('img, object, embed', element).forEach(function (element) {\n          if (DOM.is(element, 'img') && IsUnreadable(DOM.getAttribute(element, 'alt')) || !DOM.is(element, 'img') && IsUnreadable(DOM.getAttribute(element, 'title'))) {\n            unreadable++;\n          }\n        });\n        if (DOM.scry('img, object, embed', element).length === unreadable) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    title: {\n      en: 'Links with only non-text content should be readable',\n      nl: 'Links zonder tekstuele content moeten leesbaar zijn'\n    },\n    description: {\n      en: 'If a link contains only non-text content like an image, that content must be readable by assistive technology.',\n      nl: 'Als een link alleen maar niet-tekstuele content bevat zoals een afbeelding, moet deze content leesbaar worden gemaakt door middel van daarvoor geschikte technologie.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: ['H2', 'F89']\n        },\n        '2.4.9': {\n          techniques: ['F89']\n        },\n        '4.1.2': {\n          techniques: ['F89']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinkWithNonText;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],246:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ALinksAreSeparatedByPrintableCharacters = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        // Only test if there's another a tag.\n        var next = DOM.next(element);\n        if (next && DOM.is(next, 'a')) {\n          if (IsUnreadable(element.nextSibling.wholeText)) {\n            _case.set({\n              status: 'failed'\n            });\n          } else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Lists of links should be seperated by printable characters',\n      nl: 'Lijsten met links moeten gescheiden worden door afdrukbare tekens'\n    },\n    description: {\n      en: 'If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this.',\n      nl: 'Als een rij met links binnen eenzelfde element staat, moeten de links gescheiden zijn door een niet-gelinkt, afdrukbaar teken. Dit geldt niet voor een gestructureerde lijst.'\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinksAreSeparatedByPrintableCharacters;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],247:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar NewWindowStringsComponent = require('NewWindowStringsComponent');\nvar ALinksDontOpenNewWindow = {\n  run: function run(test) {\n    // Links without a target attribute pass.\n    test.get('scope').forEach(function (scope) {\n      var links = DOM.scry('a', scope);\n      var passLinks = [];\n      var checkLinks = [];\n      links.forEach(function (link) {\n        var target = DOM.getAttribute(link, 'target');\n        if (['_new', '_blank'].indexOf(target) > -1) {\n          checkLinks.push(link);\n        } else {\n          passLinks.push(link);\n        }\n      });\n      passLinks.forEach(function (element) {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      });\n      // Links with a target attribute pass if the link text indicates that the\n      // link will open a new window.\n      checkLinks.forEach(function (element) {\n        var $link = element;\n        var passes = false;\n        var i = 0;\n        var text = DOM.text($link) + ' ' + DOM.getAttribute($link, 'title');\n        var phrase = '';\n        // Test the link text against strings the indicate the link will open\n        // in a new window.\n        do {\n          phrase = NewWindowStringsComponent[i];\n          if (text.search(phrase) > -1) {\n            passes = true;\n          }\n          ++i;\n        } while (!passes && i < NewWindowStringsComponent.length);\n        // Build a Case.\n        if (passes) {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not open a new window without warning',\n      nl: 'Met links open je geen nieuw scherm zonder melding'\n    },\n    description: {\n      en: 'Links which open a new window using the \\\"target\\\" attribute should warn users.',\n      nl: 'Voordat links door middel van het \\\"target\\\"-attribuut een nieuw scherm openen moet de gebruiker een melding hiervan krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.5': {\n          techniques: ['H83', 'SCR24']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinksDontOpenNewWindow;\n\n},{\"Case\":33,\"DOM\":34,\"NewWindowStringsComponent\":16}],248:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SymbolsStringsComponent = require('SymbolsStringsComponent');\nvar ALinksNotSeparatedBySymbols = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var $link = element;\n        var next = DOM.next($link);\n        if (next && DOM.is(next, 'a')) {\n          var text = $link.nextSibling.wholeText;\n          // The string between the links is composed of symbols.\n          if (typeof text === 'string' && SymbolsStringsComponent.indexOf(text.toLowerCase().trim()) !== -1) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n          // The string between the links is composed of words.\n          else {\n              test.add(Case({\n                element: element,\n                status: 'passed'\n              }));\n            }\n        }\n        // If nothing follows the link, then there is nothing to test.\n        else {\n            test.add(Case({\n              element: element,\n              status: 'inapplicable'\n            }));\n          }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not be separated by symbols alone',\n      nl: 'Links mogen niet alleen door symbolen gescheidn worden'\n    },\n    description: {\n      en: 'Since symbols are either not read, or can be confusing when using a screen reader, do not separate links with un-readable symbols.',\n      nl: 'Symbolen worden niet voorgelezen of zijn verwarrend bij het gebruik van een schermlezer. Gebruik geen onleesbare symbolen om links van elkaar te scheiden.'\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinksNotSeparatedBySymbols;\n\n},{\"Case\":33,\"DOM\":34,\"SymbolsStringsComponent\":25}],249:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ALinksToMultiMediaRequireTranscript = {\n  run: function run(test) {\n    var selector = ['a[href$=\".wmv\"]', 'a[href$=\".mpg\"]', 'a[href$=\".mov\"]', 'a[href$=\".ram\"]', 'a[href$=\".aif\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any links to a multimedia file should also include a link to a transcript',\n      nl: 'Elke link naar een multimediabestand moet ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'Links to a multimedia file should be followed by a link to a transcript of the file.',\n      nl: 'Links naar een multimediabestand moeten worden gevolgd door een link naar de transcriptie van dit bestand.'\n    },\n    guidelines: {\n      508: ['c'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74']\n        }\n      }\n    },\n    tags: ['link', 'media', 'content']\n  }\n};\nmodule.exports = ALinksToMultiMediaRequireTranscript;\n\n},{\"Case\":33,\"DOM\":34}],250:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ALinksToSoundFilesNeedTranscripts = {\n  run: function run(test) {\n\n    var selector = ['a[href$=\".wav\"]', 'a[href$=\".snd\"]', 'a[href$=\".mp3\"]', 'a[href$=\".iff\"]', 'a[href$=\".svx\"]', 'a[href$=\".sam\"]', 'a[href$=\".smp\"]', 'a[href$=\".vce\"]', 'a[href$=\".vox\"]', 'a[href$=\".pcm\"]', 'a[href$=\".aif\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any links to a sound file should also include a link to a transcript',\n      nl: 'Elke link naar een geluidsbestand moet ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'Links to a sound file should be followed by a link to a transcript of the file.',\n      nl: 'Links naar een geluidsbestand moeten worden gevolgd door een link naar de transcriptie van dit bestand.'\n    },\n    guidelines: {\n      508: ['c'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74']\n        }\n      }\n    },\n    tags: ['link', 'media', 'content']\n  }\n};\nmodule.exports = ALinksToSoundFilesNeedTranscripts;\n\n},{\"Case\":33,\"DOM\":34}],251:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AMultimediaTextAlternative = {\n  run: function run(test) {\n\n    var selector = ['a[href$=\".aif\"]', 'a[href$=\".iff\"]', 'a[href$=\".mov\"]', 'a[href$=\".mp3\"]', 'a[href$=\".mpg\"]', 'a[href$=\".ram\"]', 'a[href$=\".sam\"]', 'a[href$=\".smp\"]', 'a[href$=\".snd\"]', 'a[href$=\".svx\"]', 'a[href$=\".pcm\"]', 'a[href$=\".vce\"]', 'a[href$=\".vox\"]', 'a[href$=\".wav\"]', 'a[href$=\".wmv\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: [],\n    tags: ['link', 'media', 'content']\n  }\n};\nmodule.exports = AMultimediaTextAlternative;\n\n},{\"Case\":33,\"DOM\":34}],252:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AMustContainText = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        if (!DOM.getAttribute(element, 'href') || DOM.getComputedStyle(element, 'display') === 'none') {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n\n        if (/\\S/.test(element.innerHTML)) {\n          _case.set({\n            status: 'passed'\n          });\n        } else {\n          _case.set({\n            status: 'failed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should contain text',\n      nl: 'Links moeten tekst bevatten'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty \\\"alt\\\" attributes and no other readable text) hinders these users.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Links zonder tekst (of met afbeeldingen die een leeg \\\"alt\\\"-attribuut hebben en geen andere leesbare tekst) hinderen deze gebruikers.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H30']\n        },\n        '2.4.4': {\n          techniques: ['H30']\n        },\n        '2.4.9': {\n          techniques: ['H30']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AMustContainText;\n\n},{\"Case\":33,\"DOM\":34}],253:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AMustHaveTitle = {\n  run: function run(test) {\n    test.get('scope').forEach(function (element) {\n      var links = DOM.scry('a', element);\n\n      links.forEach(function (link) {\n        // Has a title attribute and that attribute has a value, then pass.\n        var title = link.getAttribute('title');\n        if (typeof title === 'string' && title.length > 0) {\n          test.add(Case({\n            element: link,\n            status: 'passed'\n          }));\n        }\n        // Does not have a title attribute or the attribute does not have a value.\n        else if (!title || !title.length) {\n            test.add(Case({\n              element: link,\n              status: 'failed'\n            }));\n          }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All links must have a \\\"title\\\" attribute',\n      nl: 'Alle links moeten een \\\"title\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Every link must have a \\\"title\\\" attribute.',\n      nl: 'Zorg ervoor dat elke link is voorzien van een \\\"title\\\"-attribuut.'\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AMustHaveTitle;\n\n},{\"Case\":33,\"DOM\":34}],254:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AMustNotHaveJavascriptHref = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'a[href^=\"javascript:\"]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not use \\\"javascript\\\" in their location',\n      nl: 'Links moeten geen \\\"javascript\\\" in hun locatie hebben'\n    },\n    description: {\n      en: 'Anchor (<code>a</code>.  elements may not use the \\\"javascript\\\" protocol in their \\\"href\\\" attributes.',\n      nl: 'Anchor(<code>a</code>.-elementen mogen geen \\\"javascript\\\"protocol in hun \\\"href\\\"-attributen hebben staan.'\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AMustNotHaveJavascriptHref;\n\n},{\"Case\":33,\"DOM\":34}],255:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SuspiciousLinksStringsComponent = require('SuspiciousLinksStringsComponent');\nvar ASuspiciousLinkText = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!DOM.getAttribute(element, 'href')) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        var text = DOM.text(element);\n        DOM.scry('img[alt]', element).forEach(function (element) {\n          text = text + DOM.getAttribute(element, 'alt');\n        });\n        if (SuspiciousLinksStringsComponent.indexOf(CleanStringComponent(text)) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Link text should be useful',\n      nl: 'Linkteksten moeten bruikbaar en betekenisvol zijn'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing links with text that simply read \\\"click here\\\" gives no hint of the function of the link.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Links met de tekst \\\"klik hier\\\" zijn voor deze gebruikers niet betekenisvol en niet bruikbaar.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H30']\n        },\n        '2.4.4': {\n          techniques: ['H30']\n        },\n        '2.4.9': {\n          techniques: ['H30']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ASuspiciousLinkText;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34,\"SuspiciousLinksStringsComponent\":24}],256:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ATitleDescribesDestination = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'a[title]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The title attribute of all source a (anchor) elements describes the link destination.',\n      nl: 'Het titel-attribuut van alle source a (anchor)-elementen beschrijven de bestemming van de link'\n    },\n    description: {\n      en: 'Every link must have a \\\"title\\\" attribute which describes the purpose or destination of the link.',\n      nl: 'Elke link moet een \\\"title\\\"-attribuut hebben waarin het doel of de bestemming van de link wordt beschreven.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.9': {\n          techniques: ['H33', 'H25']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ATitleDescribesDestination;\n\n},{\"Case\":33,\"DOM\":34}],257:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AnimatedGifMayBePresent = {\n  run: function run(test) {\n\n    /**\n     * Test if gif is animated\n     * Implemented from: https://gist.github.com/3012623.git\n     * @param src\n     * @param ext\n     * @param cb\n     */\n    function isAnimatedGif(src, ext, cb) {\n\n      if (ext !== 'gif') {\n        cb(false);\n        return;\n      }\n\n      var request = new XMLHttpRequest();\n      request.open('GET', src, true);\n      request.responseType = 'arraybuffer';\n      request.addEventListener('load', function () {\n        var arr = new Uint8Array(request.response);\n        var frames = 0;\n\n        // make sure it's a gif (GIF8)\n        if (arr[0] !== 0x47 || arr[1] !== 0x49 || arr[2] !== 0x46 || arr[3] !== 0x38) {\n          cb(false);\n          return;\n        }\n\n        // ported from php http://www.php.net/manual/en/function.imagecreatefromgif.php#104473\n        // an animated gif contains multiple \"frames\", with each frame having a\n        // header made up of:\n        // * a static 4-byte sequence (\\x00\\x21\\xF9\\x04)\n        // * 4 variable bytes\n        // * a static 2-byte sequence (\\x00\\x2C) (some variants may use \\x00\\x21 ?)\n        // We read through the file til we reach the end of the file, or we've found\n        // at least 2 frame headers\n        for (var i = 0; i < arr.length - 9; i++) {\n          if (arr[i] === 0x00 && arr[i + 1] === 0x21 && arr[i + 2] === 0xF9 && arr[i + 3] === 0x04 && arr[i + 8] === 0x00 && (arr[i + 9] === 0x2C || arr[i + 9] === 0x21)) {\n            frames++;\n          }\n          if (frames > 1) {\n            cb(true);\n            return;\n          }\n        }\n\n        cb(false);\n      });\n      request.send();\n    }\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img', scope).forEach(function (element) {\n\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var imgSrc = DOM.getAttribute(element, 'src');\n        var ext = DOM.getAttribute(element, 'src').split('.').pop().toLowerCase();\n\n        if (ext !== 'gif') {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n\n        isAnimatedGif(imgSrc, ext, function (animated) {\n          if (animated) {\n            _case.set({\n              status: 'cantTell'\n            });\n            return;\n          } else {\n            _case.set({\n              status: 'inapplicable'\n            });\n            return;\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Test if a .gif is used on the page. Test if the .gif contains more then one frame',\n      nl: 'Test of een .gif afbeelding gebruikt is op de pagina. Test of het .gif bestand uit meer dan één frame bestaat'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'gif']\n  }\n};\nmodule.exports = AnimatedGifMayBePresent;\n\n},{\"Case\":33,\"DOM\":34}],258:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar AppletContainsTextEquivalent = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('applet', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (IsUnreadable(DOM.text(element))) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All applets should contain the same content within the body of the applet',\n      nl: 'Alle applets moeten dezelfde content bevatten in de body van de applet'\n    },\n    description: {\n      en: 'Applets should contain their text equivalents or description within the <code>applet</code> tag itself.',\n      nl: 'Applets moeten hun tekstuele equivalent of beschrijving bevatten in de <code>applet</code> tag.'\n    },\n    guidelines: {\n      508: ['m'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74', 'H35']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletContainsTextEquivalent;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],259:[function(require,module,exports){\n'use strict';\n\nvar PlaceholderComponent = require('PlaceholderComponent');\nvar AppletContainsTextEquivalentInAlt = {\n  run: function run(test) {\n    PlaceholderComponent(test, {\n      selector: 'applet',\n      attribute: 'alt',\n      empty: true\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All applets should contain a text equivalent in the \\\"alt\\\" attribute',\n      nl: 'Alle applets moeten een tekstuele equivalent bevatten in het \\\"alt\\\"-attribuut'\n    },\n    description: {\n      en: 'Applets should contain their text equivalents or description in an \\\"alt\\\" attribute.',\n      nl: 'Applets moeten hun tekstuele equivalent of beschrijving bevatten in een \\\"alt\\\"-attribuut.'\n    },\n    guidelines: {\n      508: ['m'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74', 'H35']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletContainsTextEquivalentInAlt;\n\n},{\"PlaceholderComponent\":17}],260:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletProvidesMechanismToReturnToParent = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All applets should provide a way for keyboard users to escape',\n      nl: 'Alle applets moeten door toetsenbordgebruikers kunnen worden verlaten'\n    },\n    description: {\n      en: 'Ensure that a user who has only a keyboard as an input device can escape an <code>applet</code> element. This requires manual confirmation.',\n      nl: 'Zorg ervoor dat gebruikers die alleen het toetsenbord gebruiken als bediening een <code>applet</code>-element kunnen verlaten. Hiervoor is handmatige bevestiging nodig.'\n    },\n    guidelines: [],\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletProvidesMechanismToReturnToParent;\n\n},{\"Case\":33,\"DOM\":34}],261:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletTextEquivalentsGetUpdated = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: {\n      508: ['m'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74', 'H35']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletTextEquivalentsGetUpdated;\n\n},{\"Case\":33,\"DOM\":34}],262:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletUIMustBeAccessible = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any user interface in an applet must be accessible',\n      nl: 'Elke user interface in een applet moet toegankelijk zijn'\n    },\n    description: {\n      en: 'Applet content should be assessed for accessibility.',\n      nl: 'Content in een applet moet getoetst worden op toegankelijkheid.'\n    },\n    guidelines: {\n      508: ['m'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74', 'H35']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletUIMustBeAccessible;\n\n},{\"Case\":33,\"DOM\":34}],263:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletsDoNotFlicker = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All applets do not flicker',\n      nl: 'Applets knipperen of flitsen niet'\n    },\n    description: {\n      en: 'Applets should not flicker.',\n      nl: 'Geen enkele applet mag knipperen of flitsen.'\n    },\n    guidelines: {\n      508: ['j'],\n      wcag: {\n        '2.2.2': {\n          techniques: ['F7']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletsDoNotFlicker;\n\n},{\"Case\":33,\"DOM\":34}],264:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletsDonotUseColorAlone = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Applets should not use color alone to communicate content',\n      nl: 'Applets mogen niet alleen kleur gebruiken om een boodschap over te brengen'\n    },\n    description: {\n      en: 'Applets should contain content that makes sense without color and is accessible to users who are color blind.',\n      nl: 'Applets moeten content bevatten die ook bruikbaar is zonder kleur en die toegankelijk is voor gebruikers met kleurenblindheid.'\n    },\n    guidelines: {\n      508: ['c']\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletsDonotUseColorAlone;\n\n},{\"Case\":33,\"DOM\":34}],265:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AreaAltIdentifiesDestination = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope).filter(function (element) {\n        var alt = DOM.getAttribute(element, 'alt');\n        return !(alt && alt.length > 0);\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All \\\"area\\\" elements must have an \\\"alt\\\" attribute which describes the link destination',\n      nl: 'Alle \\\"area\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben die de bestemming van de link beschrijft'\n    },\n    description: {\n      en: 'All <code>area</code> elements within a <code>map</code> must have an \\\"alt\\\" attribute',\n      nl: 'Alle <code>area</code>-elementen binnen een <code>map</code> moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content'],\n    options: {\n      test: 'area[alt]'\n    }\n  }\n};\nmodule.exports = AreaAltIdentifiesDestination;\n\n},{\"Case\":33,\"DOM\":34}],266:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AreaAltRefersToText = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Alt text for \\\"area\\\" elements should replicate the text found in the image',\n      nl: 'Alt-tekst voor \\\"area\\\"-elementen moeten de tekst bevatten zoals die ook in de afbeelding staat'\n    },\n    description: {\n      en: 'If an image is being used as a map, and an <code>area</code> encompasses text within the image, then the \\\"alt\\\" attribute of that <code>area</code> element should be the same as the text found in the image.',\n      nl: 'Als een afbeelding als kaart wordt gebruikt, en een <code>area</code> bevat tekst binnen de afbeelding, dan moet het \\\"alt\\\"-attribuut van dat <code>area</code>-element hetzelfde zijn als de tekst die in de afbeelding staat.'\n    },\n    guidelines: [],\n    tags: ['imagemap', 'content']\n  }\n};\nmodule.exports = AreaAltRefersToText;\n\n},{\"Case\":33,\"DOM\":34}],267:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar NewWindowStringsComponent = require('NewWindowStringsComponent');\n\nvar AreaDontOpenNewWindow = {\n  run: function run(test) {\n    // Links without a target attribute pass.\n    test.get('scope').forEach(function (scope) {\n      var areas = DOM.scry('area', scope);\n      var passAreas = [];\n      var checkAreas = [];\n      areas.forEach(function (link) {\n        var target = DOM.getAttribute(link, 'target');\n        if (['_new', '_blank'].indexOf(target) > -1) {\n          checkAreas.push(link);\n        } else {\n          passAreas.push(link);\n        }\n      });\n      passAreas.forEach(function (element) {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      });\n      // Links with a target attribute pass if the link text indicates that the\n      // link will open a new window.\n      checkAreas.forEach(function (element) {\n        var $link = element;\n        var passes = false;\n        var i = 0;\n        var text = DOM.text($link) + ' ' + DOM.getAttribute($link, 'title');\n        var phrase = '';\n        // Test the link text against strings the indicate the link will open\n        // in a new window.\n        do {\n          phrase = NewWindowStringsComponent[i];\n          if (text.search(phrase) > -1) {\n            passes = true;\n          }\n          ++i;\n        } while (!passes && i < NewWindowStringsComponent.length);\n        // Build a Case.\n        if (passes) {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'No \\\"area\\\" elements should open a new window without warning',\n      nl: '\\\"area\\\"-elementen mogen geen nieuw scherm openen zonder melding'\n    },\n    description: {\n      en: 'No <code>area</code> elements should open a new window without warning.',\n      nl: '<code>area</code>-elementen mogen geen nieuw scherm openen zonder dat de gebruiker hiervan een melding krijgt.'\n    },\n    guidelines: [],\n    tags: ['imagemap', 'content']\n  }\n};\nmodule.exports = AreaDontOpenNewWindow;\n\n},{\"Case\":33,\"DOM\":34,\"NewWindowStringsComponent\":16}],268:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AreaHasAltValue = {\n  run: function run(test) {\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (element.hasAttribute('alt') && (element.getAttribute('alt') || '').length > 0) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"area\\\" elements must have an \\\"alt\\\" attribute',\n      nl: 'Alle \\\"area\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>area</code> elements within a <code>map</code> must have an \\\"alt\\\" attribute.',\n      nl: 'Alle <code>area</code>-elementen binnen een <code>map</code> moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['F65', 'G74', 'H24']\n        },\n        '1.4.3': {\n          techniques: ['G145']\n        }\n      }\n    },\n    tags: ['imagemap', 'content']\n  }\n};\nmodule.exports = AreaHasAltValue;\n\n},{\"Case\":33,\"DOM\":34}],269:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AreaLinksToSoundFile = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = ['area[href$=\"wav\"]', 'area[href$=\"snd\"]', 'area[href$=\"mp3\"]', 'area[href$=\"iff\"]', 'area[href$=\"svx\"]', 'area[href$=\"sam\"]', 'area[href$=\"smp\"]', 'area[href$=\"vce\"]', 'area[href$=\"vox\"]', 'area[href$=\"pcm\"]', 'area[href$=\"aif\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"area\\\" elements which link to a sound file should also provide a link to a transcript',\n      nl: 'Alle \\\"area\\\"-elementen met een link naar een geluidsbestand moeten ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'All <code>area</code> elements which link to a sound file should have a text transcript.',\n      nl: 'Alle \\\"area\\\"-elementen met een link naar een geluidsbestand moeten een transcriptie hebben in tekst.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74']\n        }\n      }\n    },\n    tags: ['imagemap', 'media', 'content']\n  }\n};\nmodule.exports = AreaLinksToSoundFile;\n\n},{\"Case\":33,\"DOM\":34}],270:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AudioMayBePresent = {\n  run: function run(test) {\n    var audioExtensions = ['mp3', 'm4p', 'ogg', 'oga', 'opus', 'wav', 'wma', 'wv'];\n\n    test.get('scope').forEach(function (scope) {\n      var $this = scope;\n      var hasCase = false; // Test if a case has been created\n\n      // Audio is definately an audio, and objects could be too.\n      DOM.scry('object, audio', $this).forEach(function (element) {\n        hasCase = true;\n        test.add(Case({\n          element: element,\n          status: 'cantTell'\n        }));\n      });\n\n      // Links refering to files with an audio extensions are good indicators too\n      DOM.scry('a[href]', $this).forEach(function (element) {\n        var $this = element;\n        var extension = DOM.getAttribute($this, 'href').split('.').pop();\n        if (audioExtensions.indexOf(extension) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // if no case was added, return inapplicable\n      if (!hasCase) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Audio or object uses a link that points to a file with a video extension',\n      nl: 'Audio of object met een link naar een bestand met een video extensie'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'audio']\n  }\n};\nmodule.exports = AudioMayBePresent;\n\n},{\"Case\":33,\"DOM\":34}],271:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar BasefontIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'basefont';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Basefont should not be used',\n      nl: 'Basefont moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>basefont</code> tag is deprecated and should not be used. Investigate using stylesheets instead.',\n      nl: 'The <code>basefont</code>-tag is afgekeurd en moet niet worden gebruikt. Gebruik in plaats hiervan stylesheets.'\n    },\n    guidelines: [],\n    tags: ['document', 'deprecated']\n  }\n};\nmodule.exports = BasefontIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],272:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar BlinkIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'blink';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"blink\\\" tag should not be used',\n      nl: 'De \\\"blink\\\"-tag moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>blink</code> tag should not be used. Ever.',\n      nl: 'Het is nooit toegestaan om de \\\"blink\\\"-tag te gebruiken.'\n    },\n    guidelines: {\n      wcag: {\n        '2.2.2': {\n          techniques: ['F47']\n        }\n      }\n    },\n    tags: ['deprecated', 'content']\n  }\n};\nmodule.exports = BlinkIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],273:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar BlockquoteNotUsedForIndentation = {\n  run: function run(test) {\n\n    var selector = 'blockquote';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n\n          if (element.hasAttribute('cite') && (element.getAttribute('cite') || '').length > 0) {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          } else {\n            test.add(Case({\n              element: element,\n              status: 'cantTell'\n            }));\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The \\\"blockquote\\\" tag should not be used just for indentation',\n      nl: 'De \\\"blockquote\\\"-tag mag niet gebruikt worden om in te springen'\n    },\n    description: {\n      en: 'Blockquote tags are for long-form quotes, and should not be used to indent paragraphs. Use CSS to indent the paragraph instead.',\n      nl: 'Blockquotes zijn bedoeld voor lange stukken geciteerde tekst, en niet om tekst te laten inspringen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H49']\n        }\n      }\n    },\n    tags: ['blockquote', 'content']\n  }\n};\nmodule.exports = BlockquoteNotUsedForIndentation;\n\n},{\"Case\":33,\"DOM\":34}],274:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar BlockquoteUseForQuotations = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var blockquote = DOM.parents(element).find(function (parent) {\n          return DOM.is(parent, 'blockquote');\n        });\n        if (blockquote) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        if (DOM.text(element).substr(0, 1).search(/'|\"|«|“|「/) > -1 && DOM.text(element).substr(-1, 1).search(/'|\"|»|„|」/) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'If long quotes are in the document, use the \\\"blockquote\\\" element to mark them',\n      nl: 'Gebruik voor lange citaten in het document het \\\"blockquote\\\"-element'\n    },\n    description: {\n      en: 'If there is a paragraph or more of a quote, use the blockquote element to mark it as such.',\n      nl: 'Als er een hele alinea of meer alinea\\'s zijn van geciteerde tekst, gebruik dan blockquote om deze als zodanig te markeren.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H49']\n        }\n      }\n    },\n    tags: ['blockquote', 'content']\n  }\n};\nmodule.exports = BlockquoteUseForQuotations;\n\n},{\"Case\":33,\"DOM\":34}],275:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar BoldIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'bold';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"b\\\" (bold) element is not used',\n      nl: 'Het \\\"b\\\"-element (bold) wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>b</code> (bold) element provides no emphasis for non-sighted readers. Use the <code>strong</code> tag instead.',\n      nl: 'Het <code>b</code>-element voorziet niet in nadruk voor blinde en slechtziende gebruikers. Gebruik de <code>strong</code>-tag instead.'\n    },\n    guidelines: [],\n    tags: ['semantics', 'content']\n  }\n};\nmodule.exports = BoldIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],276:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ButtonHasName = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'button',\n      content: 'true',\n      empty: 'true',\n      attribute: 'title'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Button should contain text',\n      nl: 'Een knop moet tekst bevatten'\n    },\n    description: {\n      en: 'Buttons should contain a text value within the element, or have a value attribute.',\n      nl: 'Knoppen moeten een tekstwaarde binnen het element hebben, of een waarde-attribuut.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['content']\n  }\n};\nmodule.exports = ButtonHasName;\n\n},{\"PlaceholderComponent\":17}],277:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar CheckboxHasLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"checkbox\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All checkboxes must have a corresponding label',\n      nl: 'Alle keuzevakjes moeten een bijbehorend label hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"checkbox\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle  <code>input</code>-elementen met een \\\"keuzevakje\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: ['c'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = CheckboxHasLabel;\n\n},{\"LabelComponent\":13}],278:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar Rainbow = require('rainbowvis.js/rainbowvis.js');\n\nvar ColorBackgroundGradientContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorBackgroundGradientContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorBackgroundGradientContrast(test, Case, options, element) {\n      // Check if there's a background gradient using DOM.\n      var failureFound, numberOfSamples;\n      var rainbow = new Rainbow();\n      var backgroundGradientColors = colors.getBackgroundGradient(element);\n\n      if (!backgroundGradientColors) {\n        return;\n      }\n\n      // Convert colors to hex notation.\n      for (var i = 0; i < backgroundGradientColors.length; i++) {\n        if (backgroundGradientColors[i].substr(0, 3) === 'rgb') {\n          backgroundGradientColors[i] = colors.colorToHex(backgroundGradientColors[i]);\n        }\n      }\n\n      // Create a rainbow.\n      rainbow.setSpectrumByArray(backgroundGradientColors);\n      // @todo, make the number of samples configurable.\n      numberOfSamples = backgroundGradientColors.length * options.gradientSampleMultiplier;\n\n      // Check each color.\n      failureFound = false;\n      for (i = 0; !failureFound && i < numberOfSamples; i++) {\n        var testResult = colors.testElmBackground(options.algorithm, element, '#' + rainbow.colourAt(i));\n\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The background gradient makes the text unreadable');\n          failureFound = true;\n        }\n      }\n\n      // If no failure was found, the element passes for this case type.\n      if (!failureFound) {\n        buildCase(test, Case, element, 'passed', id, 'The background gradient does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and run testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorBackgroundGradientContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorBackgroundGradientContrast;\n\n},{\"Case\":33,\"ColorComponent\":4,\"rainbowvis.js/rainbowvis.js\":239}],279:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar ColorBackgroundImageContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorBackgroundImageContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorBackgroundImageContrast(test, Case, options, element) {\n      // Check if there's a backgroundImage using DOM.\n      var backgroundImage = colors.getBackgroundImage(element);\n      if (!backgroundImage) {\n        return;\n      }\n\n      var img = document.createElement('img');\n      img.crossOrigin = 'Anonymous';\n\n      // Get average color of the background image. The image must first load\n      // before information about it is available to the DOM.\n      img.onload = function () {\n        var averageColorBackgroundImage = colors.getAverageRGB(img);\n        var testResult = colors.testElmBackground(options.algorithm, element, averageColorBackgroundImage);\n\n        // Build a case.\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The element\\'s background image makes the text unreadable');\n        } else {\n          buildCase(test, Case, element, 'passed', id, 'The element\\'s background image does not affect readability');\n        }\n      };\n\n      img.onerror = img.onabort = function () {\n        buildCase(test, Case, element, 'cantTell', id, 'The element\\'s background image could not be loaded (' + backgroundImage + ')');\n      };\n\n      // Load the image.\n      img.src = backgroundImage;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorBackgroundImageContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorBackgroundImageContrast;\n\n},{\"Case\":33,\"ColorComponent\":4}],280:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar DOM = require('DOM');\nvar Rainbow = require('rainbowvis.js/rainbowvis.js');\n\nvar ColorElementBehindBackgroundGradientContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindBackgroundGradientContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorElementBehindBackgroundGradientContrast(test, Case, options, element) {\n      // Check if there's a background gradient using element behind current element.\n      var behindGradientColors;\n      var failureFound;\n      var rainbow = new Rainbow();\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        behindGradientColors = colors.getBehindElementBackgroundGradient(element);\n      }\n\n      if (!behindGradientColors) {\n        return;\n      }\n\n      // Convert colors to hex notation.\n      for (var i = 0; i < behindGradientColors.length; i++) {\n        if (behindGradientColors[i].substr(0, 3) === 'rgb') {\n          behindGradientColors[i] = colors.colorToHex(behindGradientColors[i]);\n        }\n      }\n\n      // Create a rainbow.\n      rainbow.setSpectrumByArray(behindGradientColors);\n      var numberOfSamples = behindGradientColors.length * options.gradientSampleMultiplier;\n\n      // Check each color.\n      failureFound = false;\n      for (i = 0; !failureFound && i < numberOfSamples; i++) {\n        failureFound = !colors.testElmBackground(options.algorithm, element, '#' + rainbow.colourAt(i));\n      }\n\n      // If no failure was found, the element passes for this case type.\n      if (failureFound) {\n        buildCase(test, Case, element, 'failed', id, 'The background gradient of the element behind this element makes the text unreadable');\n      } else {\n        buildCase(test, Case, element, 'passed', id, 'The background gradient of the element behind this element does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindBackgroundGradientContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorElementBehindBackgroundGradientContrast;\n\n},{\"Case\":33,\"ColorComponent\":4,\"DOM\":34,\"rainbowvis.js/rainbowvis.js\":239}],281:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar DOM = require('DOM');\nvar ColorElementBehindBackgroundImageContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindBackgroundImageContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorElementBehindBackgroundImageContrast(test, Case, options, element) {\n      // Check if there's a backgroundImage using element behind current element.\n      var behindBackgroundImage;\n\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        behindBackgroundImage = colors.getBehindElementBackgroundImage(element);\n      }\n\n      if (!behindBackgroundImage) {\n        return;\n      }\n\n      var img = document.createElement('img');\n      img.crossOrigin = 'Anonymous';\n      // The image must first load before information about it is available to\n      // the DOM.\n      img.onload = function () {\n\n        // Get average color of the background image.\n        var averageColorBehindBackgroundImage = colors.getAverageRGB(img);\n        var testResult = colors.testElmBackground(options.algorithm, element, averageColorBehindBackgroundImage);\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The background image of the element behind this element makes the text unreadable');\n        } else {\n          buildCase(test, Case, element, 'passed', id, 'The background image of the element behind this element does not affect readability');\n        }\n      };\n      img.onerror = img.onabort = function () {\n        buildCase(test, Case, element, 'cantTell', id, 'The background image of the element behind this element could not be loaded (' + behindBackgroundImage + ')');\n      };\n      // Load the image.\n      img.src = behindBackgroundImage;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindBackgroundImageContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorElementBehindBackgroundImageContrast;\n\n},{\"Case\":33,\"ColorComponent\":4,\"DOM\":34}],282:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar DOM = require('DOM');\nvar ColorElementBehindContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    function colorElementBehindContrast(test, Case, options, element) {\n      // Check text and background using element behind current element.\n      var backgroundColorBehind;\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        backgroundColorBehind = colors.getBehindElementBackgroundColor(element);\n      }\n      if (!backgroundColorBehind) {\n        return;\n      }\n\n      var testResult = colors.testElmBackground(options.algorithm, element, backgroundColorBehind);\n\n      // Build a case.\n      if (!testResult) {\n        buildCase(test, Case, element, 'failed', id, 'The element behind this element makes the text unreadable');\n      } else {\n        buildCase(test, Case, element, 'passed', id, 'The element behind this element does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorElementBehindContrast;\n\n},{\"Case\":33,\"ColorComponent\":4,\"DOM\":34}],283:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar ColorFontContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorFontContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorFontContrast(test, Case, options, element) {\n      // Check text and background color using DOM.\n      // Build a case.\n      if (!colors.testElmContrast(options.algorithm, element)) {\n        buildCase(test, Case, element, 'failed', id, 'The font contrast of the text impairs readability');\n      } else {\n        buildCase(test, Case, element, 'passed', id, 'The font contrast of the text is sufficient for readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorFontContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorFontContrast;\n\n},{\"Case\":33,\"ColorComponent\":4}],284:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n *\n * This test did not test anything, so now it just returns untested.\n */\nvar Case = require('Case');\n\nvar CssDocumentMakesSenseStyleTurnedOff = {\n  run: function run(test) {\n    test.get('scope').forEach(function () {\n      test.add(Case({\n        element: undefined,\n        status: 'untested'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The document must be readable with styles turned off',\n      nl: 'Het document moet leesbaar zijn met stijlen uit'\n    },\n    description: {\n      en: 'With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.',\n      nl: 'Als alle stijlen voor een pagina zijn uitgezet, moet de content van de pagina nog steeds betekenisvol zijn. Zet stijlen uit in de browser en controleer of de content op de pagina nog steeds leesbaar en duidelijk is.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['G140']\n        },\n        '1.4.5': {\n          techniques: ['G140']\n        },\n        '1.4.9': {\n          techniques: ['G140']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = CssDocumentMakesSenseStyleTurnedOff;\n\n},{\"Case\":33}],285:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar DefinitionListsAreUsed = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('dl', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        _case.set({\n          status: 'inapplicable'\n        });\n      });\n    });\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p, li', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var $item = element;\n        DOM.scry('span, strong, em, b, i', element).forEach(function (element) {\n          if (DOM.text(element).length < 50 && DOM.text($item).search(DOM.text(element)) === 0) {\n            if (DOM.is(element, 'span')) {\n              if (DOM.getComputedStyle(element, 'font-weight') === DOM.getComputedStyle($item, 'font-weight') && DOM.getComputedStyle(element, 'font-style') === DOM.getComputedStyle($item, 'font-style')) {\n                _case.set({\n                  status: 'passed'\n                });\n                return;\n              }\n            }\n            _case.set({\n              status: 'failed'\n            });\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use a definition list for defining terms',\n      nl: 'Gebruik een definition list voor definities'\n    },\n    description: {\n      en: 'When providing a list of terms or definitions, use a definition list.',\n      nl: 'Wanneer er gebruik wordt gemaakt van een lijst termen of definities, gebruik hiervoor dan een definition list.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H48']\n        }\n      }\n    },\n    tags: ['structure']\n  }\n};\nmodule.exports = DefinitionListsAreUsed;\n\n},{\"Case\":33,\"DOM\":34}],286:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DoctypeProvided = {\n  run: function run(test) {\n    test.get('scope').forEach(function (doc) {\n      if (!document.doctype) {\n        test.add(Case({\n          element: doc,\n          status: 'failed'\n        }));\n      } else {\n        test.add(Case({\n          element: doc,\n          status: 'passed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should contain a valid \\\"doctype\\\" declaration',\n      nl: 'Het document moet een geldige \\\"doctype\\\"-verklaring hebben'\n    },\n    description: {\n      en: 'Each document must contain a valid doctype declaration.',\n      nl: 'Ieder document moet een geldige doctype-verklaring hebben.'\n    },\n    guidelines: [],\n    tags: ['doctype']\n  }\n};\nmodule.exports = DoctypeProvided;\n\n},{\"Case\":33}],287:[function(require,module,exports){\n'use strict';\n\nvar AcronymComponent = require('AcronymComponent');\nvar DocumentAcronymsHaveElement = {\n  run: function run(test) {\n    AcronymComponent(test, 'acronym');\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Acronyms must be marked with an \\\"acronym\\\" element',\n      nl: 'Acroniemen moeten worden gemarkeerd met een \\\"acronym\\\"-element'\n    },\n    description: {\n      en: 'Acronyms should be marked with an <code>acronym</code> element, at least once on the page for each acronym.',\n      nl: 'Acroniemen moeten worden gemarkeerd door middel van het <code>acronym</code>-element. Doe dit ten minste een keer per pagina voor elke acroniem.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.4': {\n          techniques: ['H28']\n        }\n      }\n    },\n    tags: ['acronym', 'content']\n  }\n};\nmodule.exports = DocumentAcronymsHaveElement;\n\n},{\"AcronymComponent\":1}],288:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentAutoRedirectNotUsed = {\n  run: function run(test) {\n\n    var selector = 'meta[http-equiv=refresh]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Auto-redirect with \\\"meta\\\" elements must not be used',\n      nl: 'Auto-redirect met \\\"meta\\\"-elementen moeten niet worden gebruikt'\n    },\n    description: {\n      en: 'Because different users have different speeds and abilities when it comes to parsing the content of a page, a \\\"meta-refresh\\\" method to redirect users can prevent users from fully understanding the document before being redirected.',\n      nl: 'Omdat verschillende gebruikers verschillende snelheden en vaardigheden hebben met het scannen van content op een pagina, kan een \\\"meta-refresh\\\"-methode om gebruikers door te sturen hen verhinderen het document volledig te begrijpen voor ze worden doorgestuurd.'\n    },\n    guidelines: [],\n    tags: ['document']\n  }\n};\nmodule.exports = DocumentAutoRedirectNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],289:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n *\n * This test did not test anything, so now it just returns untested.\n */\nvar Case = require('Case');\n\nvar DocumentContentReadableWithoutStylesheets = {\n  run: function run(test) {\n    test.get('scope').forEach(function () {\n      test.add(Case({\n        element: undefined,\n        status: 'untested'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Content should be readable without style sheets',\n      nl: 'Content moet zonder stylesheets leesbaar zijn'\n    },\n    description: {\n      en: 'With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.',\n      nl: 'Ook als alle stijlen voor een pagina zijn uitgezet, moet de content van de pagina nog steeds betekenisvol zijn. Zet de stylesheets uit in de browser en controleer of de content nog steeds leesbaar en duidelijk is.'\n    },\n    guidelines: {\n      508: ['d'],\n      wcag: {\n        '1.3.1': {\n          techniques: ['G140']\n        },\n        '1.4.5': {\n          techniques: ['G140']\n        },\n        '1.4.9': {\n          techniques: ['G140']\n        }\n      }\n    },\n    tags: ['document', 'color']\n  }\n};\nmodule.exports = DocumentContentReadableWithoutStylesheets;\n\n},{\"Case\":33}],290:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentHasTitleElement = {\n  run: function run(test) {\n\n    var selector = 'head title';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (candidates.length === 1) {\n        test.add(Case({\n          element: candidates[0],\n          status: 'passed'\n        }));\n      } else if (candidates.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: 'failed'\n        }));\n      } else if (candidates.length > 1) {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should have a title element',\n      nl: 'Het document moet een titelelement hebben'\n    },\n    description: {\n      en: 'The document should have a title element.',\n      nl: 'Het document moet een titelelement hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: ['H25']\n        }\n      }\n    },\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentHasTitleElement;\n\n},{\"Case\":33,\"DOM\":34}],291:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar TextStatisticsComponent = require('TextStatisticsComponent');\nvar IsUnreadable = require('IsUnreadable');\nvar DocumentIsWrittenClearly = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var text = TextStatisticsComponent.cleanText(DOM.text(element));\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (IsUnreadable(text)) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        if (Math.round(206.835 - 1.015 * TextStatisticsComponent.averageWordsPerSentence(text) - 84.6 * TextStatisticsComponent.averageSyllablesPerWord(text)) < 60) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The document should be written to the target audience and read clearly',\n      nl: 'Het document moet geschreven zijn op het niveau van de doelgroep'\n    },\n    description: {\n      en: 'If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content.',\n      nl: 'Als de inhoud van een document moeilijker is dan het vastgestelde taalniveau, moet een samenvatting of andere begeleiding worden toegevoegd om de gebruiker te helpen met de content.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.5': {\n          techniques: ['G86']\n        }\n      }\n    },\n    tags: ['language', 'content']\n  }\n};\nmodule.exports = DocumentIsWrittenClearly;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28,\"TextStatisticsComponent\":29}],292:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LanguageCodesStringsComponent = require('LanguageCodesStringsComponent');\nvar DocumentLangIsISO639Standard = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var element = DOM.is(scope, 'html') ? scope : DOM.scry('html')[0];\n\n      var _case = Case({\n        element: element\n      });\n\n      var langAttr = DOM.getAttribute(element, 'lang');\n      var matchedLang = false; // Check to see if a languagecode was matched\n\n      test.add(_case);\n      if (!DOM.is(element, 'html') || !langAttr) {\n        _case.set({\n          status: 'inapplicable'\n        });\n      } else {\n        // Loop over all language codes, checking if the current lang attribute starts\n        // with a value that's in the languageCodes array\n        LanguageCodesStringsComponent.forEach(function (currentLangCode) {\n          if (!matchedLang && langAttr.indexOf(currentLangCode) === 0) {\n            matchedLang = true;\n          }\n        });\n\n        if (!matchedLang) {\n          _case.set({ status: 'failed' });\n        } else if (langAttr.match(/^[a-z]{2}(-[A-Z]{2})?$/) === null) {\n          _case.set({ status: 'failed' });\n        } else {\n          _case.set({ status: 'passed' });\n        }\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document\\'s language attribute should be a standard code',\n      nl: 'Het language-attribuut van het document moet een standaard code zijn'\n    },\n    description: {\n      en: 'The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639.',\n      nl: 'Het document moet een standaardtaal hebben en die taal moet de geldige 2- of 3-letterige taalcode hebben volgens de ISO-specificatie 639.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.1': {\n          techniques: ['H57']\n        }\n      }\n    },\n    tags: ['document', 'language']\n  }\n};\nmodule.exports = DocumentLangIsISO639Standard;\n\n},{\"Case\":33,\"DOM\":34,\"LanguageCodesStringsComponent\":14}],293:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DocumentLangNotIdentified = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var lang = document.documentElement.lang;\n      if (lang && lang.length > 1) {\n        test.add(Case({\n          element: scope,\n          status: 'passed'\n        }));\n      } else {\n        test.add(Case({\n          element: scope,\n          status: 'failed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document must have a \\\"lang\\\" attribute',\n      nl: 'Het document moet een \\\"lang\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'The document should have a default langauge, by setting the \\\"lang\\\" attribute in the <code>html</code> element.',\n      nl: 'Het document moet een standaardtaal hebben, vastgelegd in het \\\"lang\\\"-attribuut in het <code>html</code>-element.'\n    },\n    guidelines: [],\n    tags: ['document', 'language']\n  }\n};\nmodule.exports = DocumentLangNotIdentified;\n\n},{\"Case\":33}],294:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentMetaNotUsedWithTimeout = {\n  run: function run(test) {\n\n    var selector = 'meta';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('http-equiv') && element.getAttribute('http-equiv') === 'refresh') {\n            if (element.hasAttribute('content') && (element.getAttribute('content') || '').length > 0) {\n              status = 'failed';\n            }\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Meta elements must not be used to refresh the content of a page',\n      nl: 'Meta-elementen mogen niet worden gebruikt om content op een pagina te verversen'\n    },\n    description: {\n      en: 'Because different users have different speeds and abilities when it comes to parsing the content of a page, a \\\"meta-refresh\\\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \\\"refresh this\\\" link instead.',\n      nl: 'Omdat verschillende gebruikers verschillende snelheden en vaardigheden hebben met het scannen van content op een pagina, kan een \\\"meta-refresh\\\"-methode om de pagina te herladen gebruikers hinderen in toegang tot de content. Gebruik een \\\"refresh this\\\" link hiervoor.'\n    },\n    guidelines: {\n      wcag: {\n        '2.2.1': {\n          techniques: ['F40', 'F41']\n        },\n        '2.2.4': {\n          techniques: ['F40', 'F41']\n        },\n        '3.2.5': {\n          techniques: ['F41']\n        }\n      }\n    },\n    tags: ['document']\n  }\n};\nmodule.exports = DocumentMetaNotUsedWithTimeout;\n\n},{\"Case\":33,\"DOM\":34}],295:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentReadingDirection = {\n  run: function run(test) {\n\n    var selector = ['[lang=\"he\"]', '[lang=\"ar\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          if (element.hasAttribute('dir') && (element.getAttribute('dir') || '') === 'rtl') {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          } else {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Reading direction of text is correctly marked',\n      nl: 'De leesrichting van de tekst staat juist aangegeven'\n    },\n    description: {\n      en: 'Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared.',\n      nl: 'Voor talen die een andere leesrichting hebben, moet de leesrichting van (een deel van) de tekst in een document worden opgenomen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['H34']\n        }\n      }\n    },\n    tags: ['document', 'language']\n  }\n};\nmodule.exports = DocumentReadingDirection;\n\n},{\"Case\":33,\"DOM\":34}],296:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DocumentStrictDocType = {\n  run: function run(test) {\n    if (typeof document.doctype === 'undefined' || !document.doctype || document.doctype.systemId.search('strict') === -1) {\n      test.add(Case({\n        element: document,\n        status: 'failed'\n      }));\n    } else {\n      test.add(Case({\n        element: document,\n        status: 'passed'\n      }));\n    }\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The page uses a strict doctype',\n      nl: 'De pagina gebruikt een strikt doctype'\n    },\n    description: {\n      en: 'The doctype of the page or document should be either an HTML or XHTML strict doctype.',\n      nl: 'Het doctype van een pagina of document moet een HTML of XHTML strikt doctype zijn.'\n    },\n    guidelines: [],\n    tags: ['document', 'doctype']\n  }\n};\nmodule.exports = DocumentStrictDocType;\n\n},{\"Case\":33}],297:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentTitleDescribesDocument = {\n  run: function run(test) {\n\n    var selector = 'head title';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      var status = candidates.length === 1 ? 'passed' : 'failed';\n\n      if (candidates.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: status\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The title describes the document',\n      nl: 'De titel beschrijft het document'\n    },\n    description: {\n      en: 'The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another.',\n      nl: 'De documenttitel moet een beschrijving zijn van de pagina. Schermlezen gebruiken de titels van pagina\\'s om van het ene naar het andere scherm te navigeren.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: ['F25', 'G88']\n        }\n      }\n    },\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentTitleDescribesDocument;\n\n},{\"Case\":33,\"DOM\":34}],298:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar DocumentTitleIsNotPlaceholder = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'head > title',\n      content: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document title should not be placeholder text',\n      nl: 'De documenttitle moet geen placeholder tekst zijn'\n    },\n    description: {\n      en: 'The document title should not be wasted placeholder text which does not describe the page.',\n      nl: 'De documenttitel moet geen placeholder tekst zijn die geen goede beschrijving van de pagina is.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: ['F25', 'G88']\n        }\n      }\n    },\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentTitleIsNotPlaceholder;\n\n},{\"PlaceholderComponent\":17}],299:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar DocumentTitleIsShort = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var title = DOM.scry('head title', scope)[0];\n      test.add(Case({\n        element: title,\n        status: DOM.text(title).length > 150 ? 'failed' : 'passed'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The document title should be short',\n      nl: 'De documenttitel moet kort zijn'\n    },\n    description: {\n      en: 'The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion.',\n      nl: 'De documenttitel moet kort en beknopt zijn. Probeer bij een titel langer dan 150 tekense de titel in te korten waar mogelijk.'\n    },\n    guidelines: [],\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentTitleIsShort;\n\n},{\"Case\":33,\"DOM\":34}],300:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar DocumentTitleNotEmpty = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'head > title',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should not have an empty title',\n      nl: 'Het document mag geen lege titel hebben'\n    },\n    description: {\n      en: 'The document should have a title element that is not white space.',\n      nl: 'Het document moet een titelelement hebben dat is ingevuld.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: ['F25', 'H25']\n        }\n      }\n    },\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentTitleNotEmpty;\n\n},{\"PlaceholderComponent\":17}],301:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar DocumentVisualListsAreMarkedUp = {\n  run: function run(test) {\n\n    var itemStarters = ['♦', '›', '»', '‣', '▶', '◦', '✓', '◽', '•', '—', '◾', // single characters\n    '-\\\\D', // dash, except for negative numbers\n    '\\\\\\\\', // Just an escaped slash\n    '\\\\*(?!\\\\*)', // *, but not ** (which could be a foot note)\n    '\\\\.\\\\s', 'x\\\\s', // characters that should be followed by a space\n    '&bull;', '&#8226;', // HTML entities\n    '[0-9]+\\\\.', '\\\\(?[0-9]+\\\\)', // Numbers: 1., 13., 13), (14)\n    '[\\\\u25A0-\\\\u25FF]', // Unicode characters that look like bullets\n    '[IVX]{1,5}\\\\.\\\\s' // Roman numerals up to (at least) 27, followed by \". \" E.g. II. IV.\n    ];\n\n    var symbols = new RegExp('(^|<br[^>]*>)' + // Match the String start or a <br> element\n    '[\\\\s]*' + // Optionally followed by white space characters\n    '(' + itemStarters.join('|') + ')', // Followed by a character that could indicate a list\n    'gi'); // global (for counting), case insensitive (capitalisation in elements / entities)\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var text = element.innerHTML\n        // Get rid of runs of space.\n        .replace(/[ \\t\\n\\r][ \\t\\n\\r]*/g, ' ').trim();\n        var matches = text.match(symbols);\n        _case.set({\n          status: matches && matches.length > 2 ? 'failed' : 'passed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Visual lists of items are marked using ordered or unordered lists',\n      nl: 'Lijsten moeten gemarkeerd worden als ordered of unordered lists'\n    },\n    description: {\n      en: 'Use the ordered (<code>ol</code>) or unordered (<code>ul</code>) elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list.',\n      nl: 'Gebruik ordered (<code>ol</code>) of unordered (<code>ul</code>) elementen voor lijsten, in plaats van een nieuwe regel per item aan te maken die je laat beginnen met een nummer of teken om een visuele lijst te maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H28', 'H48', 'T2']\n        }\n      }\n    },\n    tags: ['list', 'semantics', 'content']\n  }\n};\nmodule.exports = DocumentVisualListsAreMarkedUp;\n\n},{\"Case\":33,\"DOM\":34,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],302:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar EmbedHasAssociatedNoEmbed = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('embed', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var noembeds = DOM.scry('noembed', element);\n        var next = DOM.next(element);\n        var hasSiblingNoembed = next && DOM.is(next, 'noembed');\n        _case.set({\n          status: noembeds.length || hasSiblingNoembed ? 'passed' : 'failed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"embed\\\" elements have an associated \\\"noembed\\\" element',\n      nl: 'Alle \\\"embed\\\" elementen moeten een bijbehorend \\\"noembed\\\"-element hebben'\n    },\n    description: {\n      en: 'Because some users cannot use the <code>embed</code> element, provide alternative content in a <code>noembed</code> element.',\n      nl: 'Sommige gebruikers kunnen het <code>embed</code>-element niet gebruiken. Biedt hiervoor alternatieve content aan in een <code>noembed</code>-element.'\n    },\n    guidelines: [],\n    tags: ['object', 'embed', 'content']\n  }\n};\nmodule.exports = EmbedHasAssociatedNoEmbed;\n\n},{\"Case\":33,\"DOM\":34}],303:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar EmbedMustHaveAltAttribute = {\n  run: function run(test) {\n\n    var selector = 'embed';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var alt = element.getAttribute('alt');\n          if (alt && typeof alt === 'string' && alt.length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: '\\\"Embed\\\" elements must have an \\\"alt\\\" attribute',\n      nl: '\\\"Embed\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>embed</code> elements must have an \\\"alt\\\" attribute.',\n      nl: 'Alle <code>embed</code>-elementen moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: [],\n    tags: ['object', 'embed', 'content']\n  }\n};\nmodule.exports = EmbedMustHaveAltAttribute;\n\n},{\"Case\":33,\"DOM\":34}],304:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FieldsetHasLabel = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'fieldset';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope).filter(function (element) {\n        return DOM.scry('legend', element).length === 0;\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Fieldsets require a label element',\n      nl: 'Fieldsets behoeven een label-element'\n    },\n    description: {\n      en: 'Fieldsets used to group similar form elements like checkboxes should have a label that describes the group of elements.',\n      nl: 'Fieldsets die een groep gelijkwaardige elementen bevatten moeten een label hebben die deze groep elementen beschrijft.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FieldsetHasLabel;\n\n},{\"Case\":33,\"DOM\":34}],305:[function(require,module,exports){\n'use strict';\n\n/**\n * Test for a label associated with a file input element.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FileHasLabel = {\n  run: function run(test) {\n\n    var sFiles = '[type=\"file\"]';\n    var sLabels = 'label';\n\n    function countOfLabelsById(id, labels) {\n      // Map labels by for attribute value.\n      var labelsByFor = 0;\n      for (var i = 0, il = labels.length; i < il; ++i) {\n        var $label = labels[i];\n        if (DOM.getAttribute($label, 'for') === id) {\n          labelsByFor++;\n        }\n      }\n      return labelsByFor;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var files = DOM.scry(sFiles, scope);\n      var labels = DOM.scry(sLabels, scope);\n\n      if (files.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        files.forEach(function (element) {\n          var $file = element;\n          var status = 'failed';\n\n          // Check for an associated label.\n          var id = DOM.getAttribute($file, 'id');\n          if (id) {\n            var labelCount = countOfLabelsById(id, labels);\n            if (labelCount === 1) {\n              status = 'passed';\n            }\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"file\\\" input elements have a corresponding label',\n      nl: 'Alle \\\"file\\\"-invoerelementen hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"file\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user.',\n      nl: 'Alle <code>input</code>-elementen van het type \\\"file\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: ['n'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FileHasLabel;\n\n},{\"Case\":33,\"DOM\":34}],306:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FontIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'font';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Font elements should not be used',\n      nl: 'Het font element moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>basefont</code> tag is deprecated and should not be used. Investigate using stylesheets instead.',\n      nl: 'De <code>basefont</code>-tag is afgekeurd en moet niet worden gebruikt. Gebruik in plaats hiervan stylesheets.'\n    },\n    guidelines: [],\n    tags: ['deprecated', 'content']\n  }\n};\nmodule.exports = FontIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],307:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FormButtonsHaveValue = {\n  run: function run(test) {\n\n    var selector = 'input[type=button], input[type=submit], input[type=reset]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          // If the button has a value, it passes.\n          var val = element.getAttribute('value');\n          if (val && typeof val === 'string' && val.length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Input elements for button, submit, or reset must have a value attribute',\n      nl: 'Invoerelementen voor knoppen, indienen of resetten moeten een waarde-attribuut hebben'\n    },\n    description: {\n      en: 'Any form element that is rendered as a button has to have a readable value attribute.',\n      nl: 'Elk invoerelement dat eruit ziet als een knop moet een leesbaar waarde-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormButtonsHaveValue;\n\n},{\"Case\":33,\"DOM\":34}],308:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FormErrorMessageHelpsUser = {\n  run: function run(test) {\n\n    var selector = 'form';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Forms offer the user a way to check the results of their form before performing an irrevocable action',\n      nl: 'Formulieren bieden gebruikers de gelegenheid om hun formulier te controleren voor ze een onomkeerbare actie uitvoeren'\n    },\n    description: {\n      en: 'If the form allows users to perform some irrevocable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation.',\n      nl: 'Als een formulier een gebruiker toestaat om een onomkeerbare actie uit te voeren, zoals het bestellen van een product, zorg er dan voor dat ze eerst het formulier kunnen controleren. Dit kan niet met een automatische test en moet handmatig gecontroleerd en bevestigd worden.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormErrorMessageHelpsUser;\n\n},{\"Case\":33,\"DOM\":34}],309:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FormHasGoodErrorMessage = {\n  run: function run(test) {\n\n    var selector = 'form';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Form error messages should assist in solving errors',\n      nl: 'Foutmeldingen in formulieren moeten fouten helpen oplossen'\n    },\n    description: {\n      en: 'If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \\\"required\\\" or \\\"error\\\" within the <code>label</code> element of input items where the errors happened.',\n      nl: 'Als het formulier verplichte velden heeft of op andere manier verkeerd ingevuld kan worden, controleer dan of de bijbehorende foutmelding begrijpelijk is. Gebruik de woorden \\\"required\\\" of \\\"error\\\" in het <code>label</code>-element of in de invoeritems waar de fout is opgetredenitems where the errors happened.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormHasGoodErrorMessage;\n\n},{\"Case\":33,\"DOM\":34}],310:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar FormHasSubmitButton = {\n  run: function run(test) {\n\n    var selector = 'input[type=submit], button[type=submit]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('form', scope);\n\n      if (candidates.length === 0) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var submitButton = DOM.scry(selector, element);\n\n          var status = submitButton.length === 1 ? 'passed' : 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Form should have a submit button',\n      nl: 'Formulieren moeten een indienknop hebben'\n    },\n    description: {\n      en: 'Forms should have a button that allows the user to select when they want to submit the form.',\n      nl: 'Formulieren moeten een knop hebben waarmee de gebruiker kan bepalen wanneer zij een formulieren willen versturen.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.2': {\n          techniques: ['H32', 'G80']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormHasSubmitButton;\n\n},{\"Case\":33,\"DOM\":34}],311:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar FormWithRequiredLabel = {\n  run: function run(test) {\n    var redundant = RedundantStringsComponent;\n    var lastStyle,\n        currentStyle = false;\n    redundant.required[redundant.required.indexOf('*')] = /\\*/g;\n    test.get('scope').forEach(function (scope) {\n      var $local = scope;\n      DOM.scry('label', $local).forEach(function (element) {\n        var text = DOM.text(element).toLowerCase();\n        var $label = element;\n        var _case = test.add(Case({\n          element: element\n        }));\n        var input = DOM.scry('#' + DOM.getAttribute($label, 'for'), scope)[0];\n        var isAriaRequired = DOM.getAttribute(input, 'aria-required') === 'true';\n        for (var word in redundant.required) {\n          if (text.search(word) >= 0 && !isAriaRequired) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n        }\n        currentStyle = DOM.getComputedStyle($label, 'color') + DOM.getComputedStyle($label, 'font-weight') + DOM.getComputedStyle($label, 'background-color');\n        if (lastStyle && currentStyle !== lastStyle) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        lastStyle = currentStyle;\n        if (typeof _case.get('status') === 'undefined') {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Input items which are required are marked as so in the label element',\n      nl: 'Invoervelden die verplicht zijn, zijn zo gemarkeerd in het label-element'\n    },\n    description: {\n      en: 'If a form element is required, it should be marked as so. This should not be a mere red asterisk, but instead either a \\'required\\' image with alt text of \\\"required\\\" or the actual text \\\"required\\\". The indicator that an item is required should be included in the input element\\'s <code>label</code> element.',\n      nl: 'Als een formulierveld verplicht is, moet het ook zichtbaar zijn. Doe dit niet alleen met een asterisk achter het veld, maar met bijvoorbeeld een afbeelding met als alttekst \\\"required\\\" of de tekst \\\"required\\\". De indicatie dat een veld verplicht is moet opgenomen zijn in het <code>label</code>-element van het invoerveld.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['ARIA2']\n        },\n        '1.4.1': {\n          techniques: ['F81']\n        },\n        '3.3.2': {\n          techniques: ['ARIA2', 'H90']\n        },\n        '3.3.3': {\n          techniques: ['ARIA2']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormWithRequiredLabel;\n\n},{\"Case\":33,\"DOM\":34,\"RedundantStringsComponent\":19}],312:[function(require,module,exports){\n'use strict';\n\nvar HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH1 = {\n  run: function run(test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 1\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h1 is not h3 through h6',\n      nl: 'De header die volgt op een h1 is niet h3 tot h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h1</code> header with a <code>h3</code>, <code>h4</code>, <code>h5</code>, or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h1</code>-header niet volgen door een <code>h3</code>, <code>h4</code>, <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: ['G130']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH1;\n\n},{\"HeadingLevelComponent\":9}],313:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH1Format = {\n  run: function run(test) {\n\n    var selector = 'h1';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h1 elements are not used for formatting',\n      nl: 'H1-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h1</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h1</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH1Format;\n\n},{\"Case\":33,\"DOM\":34}],314:[function(require,module,exports){\n'use strict';\n\nvar HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH2 = {\n  run: function run(test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 2\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h2 is not h4, h5, or h6',\n      nl: 'De header volgend op een h2 is geen h4, h5, of h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h2</code> header with a <code>h4</code>, <code>h5</code>, or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h2</code>-header niet volgen door een <code>h4</code>, <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: ['G130']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH2;\n\n},{\"HeadingLevelComponent\":9}],315:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH2Format = {\n  run: function run(test) {\n\n    var selector = 'h2';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h2 elements are not used for formatting',\n      nl: 'H2-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h2</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h2</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH2Format;\n\n},{\"Case\":33,\"DOM\":34}],316:[function(require,module,exports){\n'use strict';\n\nvar HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH3 = {\n  run: function run(test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 3\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h3 is not an h5 or h6',\n      nl: 'De header volgend op een h3 is geen h5, of h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h3</code> header with a <code>h5<code> or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h3</code>-header niet volgen door een <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: ['G130']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH3;\n\n},{\"HeadingLevelComponent\":9}],317:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH3Format = {\n  run: function run(test) {\n\n    var selector = 'h3';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h3 elements are not used for formatting',\n      nl: 'H3-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h3</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h3</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH3Format;\n\n},{\"Case\":33,\"DOM\":34}],318:[function(require,module,exports){\n'use strict';\n\nvar HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH4 = {\n  run: function run(test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 4\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h4 is not an h6',\n      nl: 'De header volgend op een h4 is geen h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h4</code> haeder with a <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h4/code> header niet volgen door een <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: ['G130']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH4;\n\n},{\"HeadingLevelComponent\":9}],319:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH4Format = {\n  run: function run(test) {\n\n    var selector = 'h4';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h4 elements are not used for formatting',\n      nl: 'H4-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h4</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h4</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH4Format;\n\n},{\"Case\":33,\"DOM\":34}],320:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH5Format = {\n  run: function run(test) {\n\n    var selector = 'h5';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h5 elements are not used for formatting',\n      nl: 'H5-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h5</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h5</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH5Format;\n\n},{\"Case\":33,\"DOM\":34}],321:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH6Format = {\n  run: function run(test) {\n\n    var selector = 'h6';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h6 elements are not used for formatting',\n      nl: 'H6-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h6</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h6</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH6Format;\n\n},{\"Case\":33,\"DOM\":34}],322:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar HeadersAttrRefersToATableCell = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      // Table cell headers without referred ids\n      DOM.scry('table', scope).forEach(function (element) {\n        var self = element;\n        var _case = Case();\n        test.add(_case);\n        var elmHeaders = DOM.scry('th[headers], td[headers]', self);\n\n        if (elmHeaders.length === 0) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        } else {\n          elmHeaders.forEach(function (element) {\n            var that = element;\n            var headers = DOM.getAttribute(element, 'headers').split(/\\s+/);\n            headers.forEach(function (item) {\n              if (item === '' || DOM.scry('th#' + item + ',td#' + item, self).length > 0) {\n                _case.set({\n                  element: that,\n                  status: 'passed'\n                });\n                return;\n              } else {\n                _case.set({\n                  element: that,\n                  status: 'failed'\n                });\n                return;\n              }\n            });\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Table cell headers attrtibutes must within the same table have an associated data cell with the same id',\n      nl: 'Tabel cellen met een headers attribuut moeten binnen dezelfde tabel een overeenkomende data cel hebben in het id attribuut dezelfde waarde'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['headers', 'td', 'th']\n  }\n};\nmodule.exports = HeadersAttrRefersToATableCell;\n\n},{\"Case\":33,\"DOM\":34}],323:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar HeadersHaveText = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'h1, h2, h3, h4, h5, h6',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All headers should contain readable text',\n      nl: 'Alle headers moeten leesbare tekst bevatten'\n    },\n    description: {\n      en: 'Users with screen readers use headings like the tabs <em>h1</em> to navigate the structure of a page. All headings should contain either text, or images with appropriate <em>alt</em> attributes.',\n      nl: 'Gebruikers van schermlezers gebruiken headers om via de structuur van een pagina te navigeren. Alle headers moeten daarom tekst bevatten of afbeeldingen met toepasselijk <em>alt</em>-attributen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['G141']\n        },\n        '2.4.10': {\n          techniques: ['G141']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeadersHaveText;\n\n},{\"PlaceholderComponent\":17}],324:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar HeadersUseToMarkSections = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case();\n        test.add(_case);\n        [DOM.scry('strong', element)[0], DOM.scry('em', element)[0], DOM.scry('i', element)[0], DOM.scry('b', element)[0]].forEach(function (inlineText) {\n          if (inlineText) {\n            _case.set({\n              element: element,\n              status: DOM.text(inlineText).trim() === DOM.text(element).trim() ? 'failed' : 'passed'\n            });\n          }\n        });\n      });\n    });\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('ul, ol', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var $list = element;\n        var prevHeaders = DOM.prevAll($list).filter(function (element) {\n          return DOM.is(element, 'h1, h2, h3, h4, h5, h6');\n        });\n        var items = DOM.scry('li', $list);\n        var itemLinks = DOM.scry('li', $list).filter(function (element) {\n          return DOM.scry('a', element).length > 0;\n        });\n        if (prevHeaders.length || items.length !== itemLinks.length) {\n          _case.set({\n            status: 'passed'\n          });\n          return;\n        }\n        var isNavigation = true;\n        itemLinks.forEach(function (element) {\n          if (DOM.text(DOM.scry('a', element)[0]).trim() !== DOM.text(element).trim()) {\n            isNavigation = false;\n          }\n        });\n        if (isNavigation) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use headers to mark the beginning of each section',\n      nl: 'Gebruik headers om de start van elke sectie aan te geven.'\n    },\n    description: {\n      en: 'Check that each logical section of the page is broken or introduced with a header (h1-h6) element.',\n      nl: 'Controleer dat elke logische sectie van een pagina wordt onderbroken door of start met een header-element (h1-h6).'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['G141']\n        },\n        '2.4.1': {\n          techniques: ['G141', 'H69']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeadersUseToMarkSections;\n\n},{\"Case\":33,\"DOM\":34}],325:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar IIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'i';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"i\\\" (italic) element is not used',\n      nl: 'Het \\\"i\\\"-element (cursief) wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>i</code> (italic) element provides no emphasis for non-sighted readers. Use the <code>em</code> tag instead.',\n      nl: 'Het <code>i</code>-element biedt geen nadruk voor slechtziende en blinde lezers. Gebruik in plaats daarvan de <code>em</code>-tag.'\n    },\n    guidelines: [],\n    tags: ['deprecated', 'content']\n  }\n};\nmodule.exports = IIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],326:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IdrefsHasCorrespondingId = {\n  run: function run(test) {\n\n    function getAttribute($element) {\n      var attribute = [];\n      var attributeList = ['headers', 'aria-controls', 'aria-describedby', 'aria-flowto', 'aria-labelledby', 'aria-owns'];\n\n      attributeList.forEach(function (item) {\n        var attr = DOM.getAttribute($element, item);\n\n        if ((typeof attr === 'undefined' ? 'undefined' : _typeof(attr)) !== (typeof undefined === 'undefined' ? 'undefined' : _typeof(undefined)) && attr !== false) {\n          attribute = attr;\n          return;\n        }\n      });\n      return attribute.split(/\\s+/);\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var testableElements = DOM.scry(['td[headers]', 'th[headers]', '[aria-controls]', '[aria-describedby]', '[aria-flowto]', '[aria-labelledby]', '[aria-owns]'].join(', '), scope);\n\n      if (testableElements.length === 0) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n        return;\n      } else {\n        testableElements.forEach(function (element) {\n          var _case = test.add(Case({\n            element: element\n          }));\n\n          var attributes = getAttribute(element);\n          var status = 'passed';\n\n          attributes.forEach(function (item) {\n            if (item !== '' && DOM.scry('#' + item, scope).length === 0) {\n              status = 'failed';\n              return;\n            }\n          });\n\n          _case.set({\n            status: status\n          });\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Elements with an idref attribute must correspond to an element with an ID',\n      nl: 'Elementen met een idref-attribuut moeten corresponderen met een element met een ID'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F17']\n        },\n        '4.1.1': {\n          techniques: ['F17']\n        }\n      }\n    }\n  }\n};\nmodule.exports = IdrefsHasCorrespondingId;\n\n},{\"Case\":33,\"DOM\":34}],327:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar IframeMustNotHaveLongdesc = {\n  run: function run(test) {\n\n    var selector = 'iframe';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('longdesc')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Inline frames (\\\"iframes\\\") should not have a \\\"longdesc\\\" attribute',\n      nl: 'Inline frames (\\\"iframes\\\") krijgen geen \\\"longdesc\\\"-attribuut'\n    },\n    description: {\n      en: 'Inline frames (iframe) should not have a \\\"longdesc\\\" attribute.',\n      nl: 'Inline frames (\\\"iframes\\\") krijgen geen \\\"longdesc\\\"-attribuut.'\n    },\n    guidelines: [],\n    tags: ['objects', 'iframe', 'content']\n  }\n};\nmodule.exports = IframeMustNotHaveLongdesc;\n\n},{\"Case\":33,\"DOM\":34}],328:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImageMapServerSide = {\n  run: function run(test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('ismap')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All links in a server-side map should have duplicate links available in the document',\n      nl: 'Alle links in een server-side map moeten elders in het document terugkeren'\n    },\n    description: {\n      en: 'Any image with an \\\"usemap\\\" attribute for a server-side image map should have the available links duplicated elsewhere.',\n      nl: 'Elke afbeelding met een \\\"usemap\\\"-attribuut voor een server-side map moet de beschikbare links ook elders hebben.'\n    },\n    guidelines: [],\n    tags: ['objects', 'iframe', 'content']\n  }\n};\nmodule.exports = ImageMapServerSide;\n\n},{\"Case\":33,\"DOM\":34}],329:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ImgAltIsDifferent = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img', scope).filter(function (element) {\n        var src = DOM.getAttribute(element, 'src');\n        return !src || src.length === 0;\n      }).forEach(function (element) {\n        var _case = Case({\n          element: element,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n      });\n\n      DOM.scry('img[alt][src]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'src') === DOM.getAttribute(element, 'alt') || DOM.getAttribute(element, 'src').split('/').pop() === DOM.getAttribute(element, 'alt')) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Image \\\"alt\\\" attributes should not be the same as the filename',\n      nl: '\\\"Alt\\\"-attributen van afbeeldingen moeten niet hetzelfde zijn als de bestandsnaam'\n    },\n    description: {\n      en: 'All <code>img</code> elements should have an \\\"alt\\\" attribute that is not just the name of the file',\n      nl: 'Alle <code>img</code>-elementen moeten een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam van de afbeelding.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H37']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgAltIsDifferent;\n\n},{\"Case\":33,\"DOM\":34}],330:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ImgAltIsTooLong = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        _case.set({\n          status: DOM.getAttribute(element, 'alt').length > 100 ? 'failed' : 'passed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Image Alt text is too long',\n      nl: 'Altteksten voor een afbeelding zijn kort'\n    },\n    description: {\n      en: 'All \\\"alt\\\" attributes for <code>img</code> elements should be clear and concise. \\\"Alt\\\" attributes over 100 characters long should be reviewed to see if they are too long.',\n      nl: 'Alle \\\"alt\\\"-attributen voor <code>img</code>-elementen moeten duidelijk en bondig zijn. Verifieer \\\"alt\\\"-attributen langer dan 100 tekens en kort ze in waar mogelijk.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H37']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgAltIsTooLong;\n\n},{\"Case\":33,\"DOM\":34}],331:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgAltNotEmptyInAnchor = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a[href]', scope).filter(function (element) {\n        return DOM.scry('img', element).length > 0;\n      }).forEach(function (element) {\n        var $a = element;\n        var text = DOM.text($a);\n\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        // Concat all alt attributes of images to the text of the paragraph\n        DOM.scry('img[alt]', $a).forEach(function (element) {\n          text += ' ' + DOM.getAttribute(element, 'alt');\n        });\n\n        if (IsUnreadable(text)) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'An image within a link cannot have an empty \\\"alt\\\" attribute if there is no other text within the link',\n      nl: 'Een afbeelding binnen een link mag geen leeg \\\"alt\\\"-attribuut hebben als er geen andere tekst is in de link'\n    },\n    description: {\n      en: 'Any image that is within a link (an <code>a</code> element) that has no other text cannot have an empty or missing \\\"alt\\\" attribute.',\n      nl: 'Elke afbeelding binnen een link (een <code>a</code>-element) die geen andere tekst heeft, mag geen leeg of ontbrekend \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '2.4.4': {\n          techniques: ['H30']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgAltNotEmptyInAnchor;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],332:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ImgAltNotPlaceHolder = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'img',\n      attribute: 'alt'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Images should not have a simple placeholder text as an \\\"alt\\\" attribute',\n      nl: 'Afbeeldingen mogen geen placeholdertkest als \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decorativey or which is purely for layout purposes cannot have an \\\"alt\\\" attribute that consists solely of placeholders.',\n      nl: 'Elke afbeelding die niet ter decoratie is of die alleen voor lay-out doeleinden is bedoeld, mag geen \\\"alt\\\"-attribuut hebben met daarin placeholdertekst.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['F30', 'F39']\n        },\n        '1.2.1': {\n          techniques: ['F30']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgAltNotPlaceHolder;\n\n},{\"PlaceholderComponent\":17}],333:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImgHasAlt = {\n  run: function run(test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Image elements must have an \\\"alt\\\" attribute',\n      nl: 'Afbeeldingselementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>img</code> elements must have an alt attribute.',\n      nl: 'Alle <code>img</code>-elementen moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['F65', 'H37']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgHasAlt;\n\n},{\"Case\":33,\"DOM\":34}],334:[function(require,module,exports){\n'use strict';\n\nvar ValidURLComponent = require('ValidURLComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ImgHasLongDesc = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[longdesc]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'longdesc') === DOM.getAttribute(element, 'alt') || !ValidURLComponent(DOM.getAttribute(element, 'longdesc'))) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A \\\"longdesc\\\" attribute is required for any image where additional information not in the \\\"alt\\\" attribute is required',\n      nl: 'Een \\\"longdesc\\\"-attribuut is verplicht voor elke afbeelding waar aanvullende informatie niet benodigd is in het \\\"alt\\\"-attribuut'\n    },\n    description: {\n      en: 'Any image that has an \\\"alt\\\" attribute that does not fully convey the meaning of the image must have a \\\"longdesc\\\" attribute.',\n      nl: 'Elke afbeelding die een \\\"alt\\\"-attribuut heeft dat de volledige betekenis van de afbeelding bevat, moet een \\\"longdesc\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: ['G91']\n        },\n        '2.4.9': {\n          techniques: ['G91']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgHasLongDesc;\n\n},{\"Case\":33,\"DOM\":34,\"ValidURLComponent\":30}],335:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgImportantNoSpacerAlt = {\n  run: function run(test) {\n    var removePX = function removePX(strVal) {\n      if (/px$/.test(strVal)) {\n        strVal = strVal.slice(0, -2);\n      }\n      return strVal;\n    };\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var computedWidth = parseInt(removePX(DOM.getComputedStyle(element, 'width')), 10);\n        var computedHeight = parseInt(removePX(DOM.getComputedStyle(element, 'height')), 10);\n        var width = computedWidth ? computedWidth : parseInt(DOM.getAttribute(element, 'width'), 10);\n        var height = computedHeight ? computedHeight : parseInt(DOM.getAttribute(element, 'height'), 10);\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (IsUnreadable(DOM.getAttribute(element, 'alt').trim()) && DOM.getAttribute(element, 'alt').length > 0 && width > 50 && height > 50) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Images that are important should not have a purely white-space \\\"alt\\\" attribute',\n      nl: 'Afbeeldingen die belangrijk zijn mogen geen leeg \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decorativey or which is purely for layout purposes cannot have an \\\"alt\\\" attribute that consists solely of white space (i.e. a space).',\n      nl: 'Elke afbeelding die niet ter decoratie is of die alleen voor lay-out doeleinden is bedoeld, mag geen leeg \\\"alt\\\"-attribuut hebben (bijvoorbeeld alleen een spatie).'\n    },\n    guidelines: [],\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgImportantNoSpacerAlt;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],336:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgNonDecorativeHasAlt = {\n  run: function run(test) {\n    function removePX(val) {\n      if (/px$/.test(val)) {\n        val = val.slice(0, -2);\n      }\n      return val;\n    }\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var computedWidth = parseInt(removePX(DOM.getComputedStyle(element, 'width')), 10);\n        var computedHeight = parseInt(removePX(DOM.getComputedStyle(element, 'height')), 10);\n        if (IsUnreadable(DOM.getAttribute(element, 'alt')) && (computedWidth > 100 || computedHeight > 100)) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Any non-decorative images should have a non-empty \\\"alt\\\" attribute',\n      nl: 'Elke niet-decoratieve afbeelding moet een gevuld \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decoratively or which is purely for layout purposes cannot have an empty \\\"alt\\\" attribute.',\n      nl: 'Elke afbeelding die niet ter decoratie is of voor lay-out doeleinden wordt gebruikt, moet een gevuld \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['F38']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgNonDecorativeHasAlt;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],337:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImgServerSideMapNotUsed = {\n  run: function run(test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('ismap')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Server-side image maps should not be used',\n      nl: 'Server-side image maps moeten niet worden gebruikt'\n    },\n    description: {\n      en: 'Server-side image maps should not be used.',\n      nl: 'Server-side image maps mogen niet worden gebruikt.'\n    },\n    guidelines: [],\n    tags: ['image', 'imagemap', 'content']\n  }\n};\nmodule.exports = ImgServerSideMapNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],338:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImgShouldNotHaveTitle = {\n  run: function run(test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('title')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Images should not have a \\\"title\\\" attribute',\n      nl: 'Afbeeldingen moeten geen \\\"title\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Images should not contain a \\\"title\\\" attribute.',\n      nl: 'Afbeeldingen zouden geen \\\"title\\\"-attribuut moeten bevatten.'\n    },\n    guidelines: [],\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgShouldNotHaveTitle;\n\n},{\"Case\":33,\"DOM\":34}],339:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImgWithMapHasUseMap = {\n  run: function run(test) {\n\n    var selector = 'img[ismap]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('usemap')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any image with an \\\"ismap\\\" attribute have a valid \\\"usemap\\\" attribute',\n      nl: 'Elke afbeelding met een \\\"ismap\\\"-attribuut heeft een geldig \\\"usemap\\\"-attribuut'\n    },\n    description: {\n      en: 'If an image has an \\\"ismap\\\" attribute it must have a valid \\\"usemap\\\" attribute.',\n      nl: 'Als een afbeelding een \\\"ismap\\\"-attribuut heeft, moet het ook een geldig \\\"usemap\\\"-attribuut hebben'\n    },\n    guidelines: {\n      508: ['ef', 'ef']\n    },\n    tags: ['image', 'imagemap', 'content']\n  }\n};\nmodule.exports = ImgWithMapHasUseMap;\n\n},{\"Case\":33,\"DOM\":34}],340:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar InputCheckboxRequiresFieldset = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=\"checkbox\"]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var fieldset = DOM.parents(element).find(function (parent) {\n          return DOM.is(parent, 'fieldset');\n        });\n        if (!fieldset) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Logical groups of check boxes should be grouped with a fieldset',\n      nl: 'Logische groepen van keuzevakjes moeten gegroepeerd zijn in een fieldset'\n    },\n    description: {\n      en: 'Related \\\"checkbox\\\" input fields should be grouped together using a <code>fieldset</code>.',\n      nl: 'Gerelateerde \\\"keuzevakjes\\\"-invoervelden moeten bij elkaar staan in een <code>fieldset</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '3.3.2': {\n          techniques: ['H71']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputCheckboxRequiresFieldset;\n\n},{\"Case\":33,\"DOM\":34}],341:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar InputElementsDontHaveAlt = {\n  run: function run(test) {\n\n    var selector = 'input[type]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope).filter(function (element) {\n        var type = DOM.getAttribute(element, 'type');\n        return type !== 'image';\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Input elements which are not images should not have an \\\"alt\\\" attribute',\n      nl: 'Invoervelden die geen afbeelding zijn, moeten geen \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Input elements which are not images should not have an \\\"alt\\\" attribute, because of inconsistencies in how user agents use the \\\"alt\\\" attribute.',\n      nl: 'Invoervelden die geen afbeelding zijn, moeten geen \\\"alt\\\"-attribuut hebben, omdat user agents het \\\"alt\\\"-attribuut niet consistent gebruiken.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputElementsDontHaveAlt;\n\n},{\"Case\":33,\"DOM\":34}],342:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar InputImageAltIsNotFileName = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image][alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'src') === DOM.getAttribute(element, 'alt')) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not the same as the filename',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"image\\\" should have an \\\"alt\\\" attribute which is not the same as the filename.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H36']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageAltIsNotFileName;\n\n},{\"Case\":33,\"DOM\":34}],343:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputImageAltIsNotPlaceholder = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"image\"]',\n      attribute: 'alt'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not placeholder text.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben anders dan alleen placeholdertekst.'\n    },\n    description: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not placeholder text.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben anders dan alleen placeholdertekst.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H36']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageAltIsNotPlaceholder;\n\n},{\"PlaceholderComponent\":17}],344:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar InputImageAltIsShort = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'alt').length > 100) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is as short as possible',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat zo kort mogelijk is'\n    },\n    description: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is as short as possible.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat zo kort mogelijk is.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H36']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageAltIsShort;\n\n},{\"Case\":33,\"DOM\":34}],345:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar InputImageAltNotRedundant = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image][alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (RedundantStringsComponent.inputImage.indexOf(CleanStringComponent(DOM.getAttribute(element, 'alt'))) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"alt\\\" text for input \\\"image\\\" submit buttons must not be filler text',\n      nl: 'De \\\"alt\\\"-tekst for \\\"image\\\"-knoppen moet anders zijn dan alleen placeholdertekst'\n    },\n    description: {\n      en: 'Every form image button should not simply use filler text like \\\"button\\\" or \\\"submit\\\" as the \\\"alt\\\" text.',\n      nl: 'Elke formulierknop die een afbeelding is, moet bruikbare tekst als \\\"alt\\\"-tekst hebben, anders dan \\\"knop\\\" of \\\"verstuur\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H36']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageAltNotRedundant;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34,\"RedundantStringsComponent\":19}],346:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar InputImageHasAlt = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('input[type=image]', scope).filter(function (element) {\n        return DOM.isVisible(element);\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"image\\\" should have an \\\"alt\\\" attribute.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['F65', 'G94', 'H36']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageHasAlt;\n\n},{\"Case\":33,\"DOM\":34}],347:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar InputTextHasLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements should have a corresponding \\\"label\\\"',\n      nl: 'Alle invoerelementen moeten een bijbehorend \\\"label\\\" hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputTextHasLabel;\n\n},{\"LabelComponent\":13}],348:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputTextHasValue = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"text\"]',\n      attribute: 'value',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements of type \\\"text\\\" must have a default text',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"text\\\" should have a default text.',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputTextHasValue;\n\n},{\"PlaceholderComponent\":17}],349:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputTextValueNotEmpty = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"text\"]',\n      attribute: 'value',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Text input elements require a non-whitespace default text',\n      nl: 'Tekstinvoerelementen mogen geen lege standaardtekst hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"text\\\" should have a default text which is not empty.',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben die gevuld is.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputTextValueNotEmpty;\n\n},{\"PlaceholderComponent\":17}],350:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar InputWithoutLabelHasTitle = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var testableElements = DOM.scry('input, select, textarea', scope);\n      if (testableElements.length === 0) {\n        var _case = Case({\n          element: scope,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n        return;\n      } else {\n        testableElements.forEach(function (element) {\n          var _case = Case({\n            element: element\n          });\n          test.add(_case);\n\n          if (DOM.getComputedStyle(element, 'display') === 'none') {\n            _case.set({\n              status: 'inapplicable'\n            });\n            return;\n          }\n          if (!DOM.scry('label[for=' + DOM.getAttribute(element, 'id') + ']', scope).length && (!DOM.getAttribute(element, 'title') || IsUnreadable(DOM.getAttribute(element, 'title')))) {\n            _case.set({\n              status: 'failed'\n            });\n          } else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Form controls without label should have a title attribute',\n      nl: 'Formulierelementen zonder label moeten een titelattribuut hebben'\n    },\n    description: {\n      en: 'If it is not possible to have a label for a form control, then a title attribute on the element should be provided that describes the purpose of the control.',\n      nl: 'Als een formulierelement geen label kan krijgen, dan moet een dat element een titelattribuut krijgen dat het doel van het element beschrijft.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H65']\n        },\n        '1.3.1': {\n          techniques: ['H65']\n        },\n        '3.3.2': {\n          techniques: ['H65']\n        },\n        '4.1.2': {\n          techniques: ['H65']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputWithoutLabelHasTitle;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],351:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LabelDoesNotContainInput = {\n  run: function run(test) {\n\n    var selector = 'label';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (DOM.scry('input', element).length > 0) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Label elements should not contain an input element',\n      nl: 'Labelelementen moeten geen invoerelementen bevatten'\n    },\n    description: {\n      en: 'Label elements should not wrap around another input element, as this can cause the label to be read twice by screen readers.',\n      nl: 'Labelelementen moeten niet om een ander invoerelement heenstaan, omdat dan het label twee keer kan worden voorgelezen door schermlezers.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LabelDoesNotContainInput;\n\n},{\"Case\":33,\"DOM\":34}],352:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LabelMustBeUnique = {\n  run: function run(test) {\n    var labels = {};\n    test.get('scope').forEach(function (scope) {\n      var labelElements = DOM.scry('label[for]', scope);\n\n      labelElements.forEach(function (element) {\n        if (typeof labels[DOM.getAttribute(element, 'for')] === 'undefined') {\n          labels[DOM.getAttribute(element, 'for')] = 0;\n        }\n        labels[DOM.getAttribute(element, 'for')]++;\n      });\n\n      labelElements.forEach(function (element) {\n        var _case = Case({\n          element: element,\n          status: labels[DOM.getAttribute(element, 'for')] === 1 ? 'passed' : 'failed'\n        });\n        test.add(_case);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Every form input must have only one label',\n      nl: 'Elk formulierinvoerveld heeft maar een label'\n    },\n    description: {\n      en: 'Each form input should have only one <code>label</code> element.',\n      nl: 'Elk formulierinvoerveld mag maar een <code>label</code> element hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F17']\n        },\n        '4.1.1': {\n          techniques: ['F17']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LabelMustBeUnique;\n\n},{\"Case\":33,\"DOM\":34}],353:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar LabelMustNotBeEmpty = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'label',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Labels must contain text',\n      nl: 'Labels moeten tekst bevatten'\n    },\n    description: {\n      en: 'Labels in forms must contain readable text that describes the target form element.',\n      nl: 'Labels in formulieren moeten leesbare tekst bevatten die het formulierelement beschrijven.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LabelMustNotBeEmpty;\n\n},{\"PlaceholderComponent\":17}],354:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LabelsAreAssignedToAnInput = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('label', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!DOM.getAttribute(element, 'for')) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          var forAttr = DOM.getAttribute(element, 'for');\n          var forElement = DOM.scry('#' + forAttr, scope)[0];\n          if (forElement && DOM.is(forElement, ':input')) {\n            _case.set({\n              status: 'passed'\n            });\n          } else {\n            _case.set({\n              status: 'failed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All labels should be associated with an input',\n      nl: 'Alle labels moeten horen bij een invoerveld'\n    },\n    description: {\n      en: 'All <code>label</code> elements should be assigned to an input item, and should have a <em>for</em> attribute which equals the <em>id</em> attribute of a form element.',\n      nl: 'Alle <code>label</code>-elementen moeten horen bij een invoerveld, en moeten een een <em>for</em>-attribuut hebben dat hetzelfde is als het <em>id</em>-attribuut van een formulierelement.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LabelsAreAssignedToAnInput;\n\n},{\"Case\":33,\"DOM\":34}],355:[function(require,module,exports){\n'use strict';\n\nvar GetTextContentsComponent = require('GetTextContentsComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageDirAttributeIsUsed = {\n  run: function run(test) {\n\n    var textDirection = LanguageComponent.textDirection;\n\n    function countDirAttributes(element) {\n      var currentDirection = DOM.getAttribute(element, 'dir');\n      if (!currentDirection) {\n        var dirScope = DOM.parents(element).find(function (parent) {\n          return DOM.hasAttribute(parent, 'dir');\n        });\n        var parentDir = dirScope && DOM.getAttribute(dirScope, 'dir');\n        currentDirection = parentDir || currentDirection;\n      }\n      if (typeof currentDirection === 'string') {\n        currentDirection = currentDirection.toLowerCase();\n      }\n      if (typeof textDirection[currentDirection] === 'undefined') {\n        currentDirection = 'ltr';\n      }\n      var oppositeDirection = currentDirection === 'ltr' ? 'rtl' : 'ltr';\n      var text = GetTextContentsComponent(element);\n      var textMatches = text.match(textDirection[oppositeDirection]);\n      if (!textMatches) {\n        return;\n      }\n      var matches = textMatches.length;\n      DOM.scry('[dir=' + oppositeDirection + ']', element).forEach(function () {\n        var childMatches = element.textContent.match(textDirection[oppositeDirection]);\n        if (childMatches) {\n          matches -= childMatches.length;\n        }\n      });\n\n      var _case = test.add(Case({\n        element: element\n      }));\n\n      _case.set({\n        status: matches > 0 ? 'failed' : 'passed'\n      });\n    }\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(countDirAttributes);\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use the dir attribute when the language direction changes',\n      nl: 'Gebruik het dir-attribuut als de richting van de taal verandert'\n    },\n    description: {\n      en: 'When there are nested directional changes in text, use an inline element with a <code>dir</code> attribute to indicate direction.',\n      nl: 'Gebruik een inline element met een <code>dir</code>-attribuut om richting aan te geven wanneer er geneste richtingsveranderingen in de tekst zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['H56']\n        }\n      }\n    },\n    tags: ['language', 'content']\n  }\n};\nmodule.exports = LanguageDirAttributeIsUsed;\n\n},{\"Case\":33,\"DOM\":34,\"GetTextContentsComponent\":7,\"LanguageComponent\":15,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],356:[function(require,module,exports){\n'use strict';\n\nvar GetTextContentsComponent = require('GetTextContentsComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageDirectionPunctuation = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var punctuation = {};\n      var punctuationRegex = /[\\u2000-\\u206F]|[!\"#$%&'\\(\\)\\]\\[\\*+,\\-.\\/:;<=>?@^_`{|}~]/gi;\n      var currentDirection = DOM.getAttribute(scope, 'dir') ? DOM.getAttribute(scope, 'dir').toLowerCase() : 'ltr';\n      var oppositeDirection = currentDirection === 'ltr' ? 'rtl' : 'ltr';\n      var textDirection = LanguageComponent.textDirection;\n\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        if (DOM.getAttribute(element, 'dir')) {\n          currentDirection = DOM.getAttribute(element, 'dir').toLowerCase();\n        } else {\n          var dirScope = DOM.parents(element).find(function (parent) {\n            return DOM.hasAttribute(parent, 'dir');\n          });\n          var dir = DOM.getAttribute(dirScope, 'dir');\n          currentDirection = dir || currentDirection;\n        }\n        if (typeof textDirection[currentDirection] === 'undefined') {\n          currentDirection = 'ltr';\n        }\n        oppositeDirection = currentDirection === 'ltr' ? 'rtl' : 'ltr';\n        var text = GetTextContentsComponent(element);\n        var matches = text.match(textDirection[oppositeDirection]);\n        var _case = test.add(Case({\n          element: element\n        }));\n        if (!matches) {\n          _case.set({ status: 'inapplicable' });\n          return;\n        }\n        var first = text.search(textDirection[oppositeDirection]);\n        var last = text.lastIndexOf(matches.pop());\n        while (punctuation = punctuationRegex.exec(text)) {\n          if (punctuation.index === first - 1 || punctuation.index === last + 1) {\n            _case.set({ status: 'failed' });\n            return;\n          }\n        }\n        _case.set({ status: 'passed' });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Place punctuation around language direction changes in the right order',\n      nl: 'Zet interpunctie bij richtingsveranderingen in taal in de juiste volgorde'\n    },\n    description: {\n      en: 'If punctuation is used around a change in language direction, ensure the punctuation appears in the correct place.',\n      nl: 'Als er interpunctie staat bij een richtingsverandering in de taal, zorg dat deze dan op de goede plek staat.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['G57']\n        }\n      }\n    },\n    tags: ['language', 'content']\n  }\n};\nmodule.exports = LanguageDirectionPunctuation;\n\n},{\"Case\":33,\"DOM\":34,\"GetTextContentsComponent\":7,\"LanguageComponent\":15,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],357:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageUnicodeDirection = {\n  run: function run(test) {\n    var textDirection = LanguageComponent.textDirection;\n    var textDirectionChanges = LanguageComponent.textDirectionChanges;\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        var $el = element;\n        var text = DOM.text($el).trim();\n        var otherDirection = text.substr(0, 1).search(textDirection.ltr) !== -1 ? 'rtl' : 'ltr';\n        if (text.search(textDirection[otherDirection]) === -1) {\n          _case.set({ status: 'inapplicable' });\n        } else {\n          if (text.search(textDirectionChanges[otherDirection]) !== -1) {\n            _case.set({ status: 'passed' });\n          } else {\n            _case.set({ status: 'failed' });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Use the unicode language direction',\n      nl: 'Gebruik de unicode taalrichting'\n    },\n    description: {\n      en: 'When there are nested directional changes in language, use unicode RTL/LTR characters.',\n      nl: 'Gebruik de unicode RTL/LTR afkortingen als er geneste richtingsveranderingen in de taal zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['H34']\n        }\n      }\n    },\n    tags: ['language', 'content']\n  }\n};\nmodule.exports = LanguageUnicodeDirection;\n\n},{\"Case\":33,\"DOM\":34,\"LanguageComponent\":15,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],358:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar LegendTextNotEmpty = {\n  run: function run(test) {\n\n    var selector = 'legend';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (DOM.text(element).trim().length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Legend text must not contain just whitespace',\n      nl: 'Legend-tekst moet ingevuld zijn'\n    },\n    description: {\n      en: 'If a <code>legend</code> element is used in a fieldset, the <code>legend</code> should not contain empty text.',\n      nl: 'Als een <code>legend</code>-element wordt gebruikt in een fieldset, moet de <code>legend</code> ingevuld zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H71']\n        },\n        '2.4.6': {\n          techniques: ['G131']\n        },\n        '3.3.2': {\n          techniques: ['H71']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LegendTextNotEmpty;\n\n},{\"Case\":33,\"DOM\":34}],359:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar LegendTextNotPlaceholder = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'legend',\n      content: 'true',\n      emtpy: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: '\\\"Legend\\\" text must not contain placeholder text',\n      nl: '\\\"Legend\\\"-tekst moet geen placeholdertekst bevatten'\n    },\n    description: {\n      en: 'If a <code>legend</code> element is used in a fieldset, the <code>legend</code> should not contain useless placeholder text like \\\"form\\\" or \\\"field\\\".',\n      nl: 'Als een <code>legend</code>-element wordt gebruikt in een fieldset, moet de <code>legend</code> geen placeholdertekst bevatten zoals \\\"form\\\" of \\\"field\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H71']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.4.6': {\n          techniques: ['G131']\n        },\n        '3.3.2': {\n          techniques: ['H71']\n        },\n        '4.1.3': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LegendTextNotPlaceholder;\n\n},{\"PlaceholderComponent\":17}],360:[function(require,module,exports){\n'use strict';\n\n/**\n * @todo Needs refinement.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar LiDontUseImageForBullet = {\n  run: function run(test) {\n\n    var selector = 'li';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n          var hasImgChild = DOM.children(element).some(function (child) {\n            return DOM.is(child, 'img');\n          });\n          if (hasImgChild) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    guidelines: [],\n    tags: ['list', 'content']\n  }\n};\nmodule.exports = LiDontUseImageForBullet;\n\n},{\"Case\":33,\"DOM\":34}],361:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableHeadersComponent = require('TableHeadersComponent');\nvar LinkHasAUniqueContext = {\n  run: function run(test) {\n\n    var blockStyle = ['block', 'flex', 'list-item', 'table', 'table-caption', 'table-cell'];\n\n    function getLinkSentence(link) {\n      // Find the closest block-like element\n      var block = link;\n      var text = simplifyText(DOM.text(link));\n\n      while (!DOM.is(block, 'body, html') && blockStyle.indexOf(DOM.getComputedStyle(block, 'display')) === -1) {\n        block = block.parentNode;\n      }\n\n      var sentences = DOM.text(block).match(/[^\\.!\\?]+[\\.!\\?]+/g);\n      if (sentences === null) {\n        sentences = [DOM.text(block)];\n      }\n\n      for (var i = 0; i < sentences.length; i += 1) {\n        if (simplifyText(sentences[i]).indexOf(text) !== -1) {\n          return sentences[i].trim();\n        }\n      }\n    }\n\n    function simplifyText(text) {\n      var tmp = text.match(/\\w+/g);\n      if (tmp !== null) {\n        text = tmp.join(' ');\n      }\n      return text.toLowerCase();\n    }\n\n    function txtNotAlike(a, b) {\n      return simplifyText('' + a) !== simplifyText('' + b);\n    }\n\n    function shareContext(linkA, linkB) {\n\n      if (linkA.href === linkB.href) {\n        return false;\n      } else if (txtNotAlike(linkA.title, linkB.title)) {\n        return false;\n      }\n\n      // Find the nearest list item, paragraph or table cell of both items\n      var selector = 'p, li, dd, dt, td, th';\n      var linkACtxt = DOM.parents(linkA).find(function (parent) {\n        return DOM.is(parent, selector);\n      });\n      var linkBCtxt = DOM.parents(linkB).find(function (parent) {\n        return DOM.is(parent, selector);\n      });\n\n      // check if they are different\n      if (linkACtxt.length !== 0 && linkBCtxt.length !== 0 && txtNotAlike(getLinkText(linkACtxt), getLinkText(linkBCtxt))) {\n        return false;\n      }\n\n      // If one is a table cell and the other isn't, allow it\n      if (DOM.is(linkACtxt, 'td, th') && !DOM.is(linkBCtxt, 'td, th')) {\n        return false;\n      } else if (DOM.is(linkACtxt, 'td, th') && DOM.is(linkBCtxt, 'td, th')) {\n        var headerDiff = false;\n        var headersA = [];\n\n        // Make a list with the simplified text of link A\n        TableHeadersComponent.tableHeaders(linkACtxt).forEach(function (element) {\n          headersA.push(simplifyText(element.innerText));\n        });\n\n        // Compare it to the header context of link B\n        TableHeadersComponent.tableHeaders(linkBCtxt).forEach(function (element) {\n          var text = simplifyText(element.innerText);\n          var pos = headersA.indexOf(text);\n          // Link B has something not part of link A's context, pass\n          if (pos === -1) {\n            headerDiff = true;\n          }\n          // Remove items part of both header lists\n          else {\n              headersA.splice(pos, 1);\n            }\n        });\n        // Pass if A or B had a header not part of the other.\n        if (headerDiff || headersA.length > 0) {\n          return false;\n        }\n      }\n\n      if (txtNotAlike(getLinkSentence(linkA), getLinkSentence(linkB))) {\n        return false;\n      }\n\n      return true;\n    }\n\n    /**\n     * Get the text value of the link, including alt attributes\n     * @param  {jQuery} link\n     * @return {string}\n     */\n    function getLinkText(link) {\n      var text = link.innerText;\n      DOM.scry('img[alt]', link).forEach(function (element) {\n        text += ' ' + element.alt.trim();\n      });\n      return simplifyText(text);\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var links = DOM.scry('a[href]', scope).filter(function (element) {\n        return DOM.isVisible(element);\n      });\n      var linkMap = {};\n\n      if (links.length === 0) {\n        var _case = Case({\n          element: scope,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n      }\n\n      // Make a map with the link text as key and an array of links with\n      // that link text as it's value\n      links.forEach(function (element) {\n        var text = getLinkText(element);\n        if (typeof linkMap[text] === 'undefined') {\n          linkMap[text] = [];\n        }\n        linkMap[text].push(element);\n      });\n\n      // Iterate over each item in the linkMap\n      for (var linkText in linkMap) {\n        if (linkMap.hasOwnProperty(linkText)) {\n          links = linkMap[linkText];\n        } else {\n          continue;\n        }\n\n        // Link text is not unique, so the context should be checked\n        while (links.length > 1) {\n          var linkA = links.pop();\n          var linkAFailed = false;\n\n          for (var i = links.length - 1; i >= 0; i -= 1) {\n            var linkB = links[i];\n            if (shareContext(linkA, linkB)) {\n              linkAFailed = true;\n              links.splice(i, 1);\n              test.add(Case({\n                element: linkB,\n                status: 'failed'\n              }));\n            }\n          }\n          test.add(Case({\n            element: linkA,\n            status: linkAFailed ? 'failed' : 'passed'\n          }));\n        }\n\n        // The link text is unique, pass\n        if (links.length === 1) {\n          test.add(Case({\n            element: links[0],\n            status: 'passed'\n          }));\n        }\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should have a unique context',\n      nl: 'Links moeten een unieke context hebben'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = LinkHasAUniqueContext;\n\n},{\"Case\":33,\"DOM\":34,\"TableHeadersComponent\":26}],362:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ListNotUsedForFormatting = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('ol, ul', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.scry('li', element).length < 2) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Lists should not be used for formatting',\n      nl: 'Lijsten worden niet gebruikt voor opmaak'\n    },\n    description: {\n      en: 'Lists like <code>ul</code> and <code>ol</code> are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed.',\n      nl: 'Lijsten zoals <code>ul</code> en <code>ol</code> zijn bedoeld om gestructureerde lijsten te maken. Ze moeten niet gebruikt worden om text op te maken. Controleer of deze lijst echt bedoeld is als lijst of om tekst op te maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['F1']\n        }\n      }\n    },\n    tags: ['list', 'content']\n  }\n};\nmodule.exports = ListNotUsedForFormatting;\n\n},{\"Case\":33,\"DOM\":34}],363:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ListOfLinksUseList = {\n  run: function run(test) {\n    var unreadableText = /(♦|›|»|‣|▶|.|◦|>|✓|◽|•|—|◾|\\||\\*|&bull;|&#8226;)/g;\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        // Only test if there's another a tag.\n        var next = DOM.next(element);\n        if (next && DOM.is(next, 'a')) {\n          var nextText = element.nextSibling.wholeText.replace(unreadableText, '');\n          if (!DOM.is(element.parentElement, 'li') && IsUnreadable(nextText)) {\n            _case.set({\n              status: 'failed'\n            });\n          } else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A list of links separated by non-readable characters should be in an ul or ol',\n      nl: 'Een lijst van links die worden gescheiden door onleesbare tekens moeten in een bulleted of genummerde lijst staan'\n    },\n    description: {\n      en: 'A list of links without separation between them should be placed in an ol or ul element.',\n      nl: 'Een lijst van links die niet duidelijk gescheiden zijn moeten in een bulleted of genummerde lijst staan.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H48']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ListOfLinksUseList;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],364:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar MarqueeIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'marquee';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"marquee\\\" tag should not be used',\n      nl: 'De \\\"marquee\\\"-tag wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>marquee</code> element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text.',\n      nl: 'Het <code>marquee</code>-element is moeilijk te lezen voor gebruikers en is geen standaard HTML-element. Gebruik een andere manier om aan te duiden dat het belangrijke content is.'\n    },\n    guidelines: [],\n    tags: ['deprecated', 'content']\n  }\n};\nmodule.exports = MarqueeIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],365:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar NewWindowIsOpened = {\n  run: function run(test) {\n\n    var _case;\n\n    window.addEventListener('click', function (event) {\n      event.preventDefault();\n    });\n\n    window.open = function (event) {\n      test.forEach(function (_case) {\n        var href = _case.get('element').href;\n        if (href.indexOf(event) > -1) {\n          _case.set('status', 'failed');\n        }\n      });\n    };\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        // Save a reference to this clicked tag.\n        _case = Case({\n          element: element\n        });\n        test.add(_case);\n      });\n    });\n    test.forEach(function (_case) {\n      var element = _case.get('element');\n      if (element && element.click) {\n        element.click();\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A link should not open a new window',\n      nl: 'Een link opent geen nieuw scherm'\n    },\n    description: {\n      en: 'Avoid confusion that may be caused by the appearance of new windows that were not requested by the user.',\n      nl: 'Voorkom verwarring die veroorzaakt wordt door het openen van nieuwe schermen die de gebruiker niet verwacht.'\n    },\n    guidelines: {\n      wcag: {\n        '2.0.0': {\n          techniques: ['H83']\n        }\n      }\n    },\n    tags: ['javascript', 'html']\n  }\n};\nmodule.exports = NewWindowIsOpened;\n\n},{\"Case\":33,\"DOM\":34}],366:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ObjectMustContainText = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'object',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects must contain their text equivalents',\n      nl: 'Objecten moeten hun tekstuele equivalent bevatten'\n    },\n    description: {\n      en: 'All <code>object</code> elements should contain a text equivalent if the object cannot be rendered.',\n      nl: 'Alle <code>object</code>-elementen moeten een tekstequivalent bevatten in het geval het object niet getoond kan worden.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['FLASH1', 'H27']\n        }\n      }\n    },\n    tags: ['objects', 'content']\n  }\n};\nmodule.exports = ObjectMustContainText;\n\n},{\"PlaceholderComponent\":17}],367:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ObjectMustHaveEmbed = {\n  run: function run(test) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasEmbed = DOM.scry('embed', element).length > 0;\n\n          // If a test is defined, then use it\n          if (hasEmbed) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Every object should contain an \\\"embed\\\" element',\n      nl: 'Elk object moet een \\\"embed\\\"-element bevatten'\n    },\n    description: {\n      en: 'Every <code>object</code> element must also contain an <code>embed</code> element.',\n      nl: 'Elk <code>object</code>-element moet ook een \\\"embed\\\"-element bevatten.'\n    },\n    guidelines: [],\n    tags: ['objects', 'content']\n  }\n};\nmodule.exports = ObjectMustHaveEmbed;\n\n},{\"Case\":33,\"DOM\":34}],368:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ObjectMustHaveTitle = {\n  run: function run(test) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasTitle = element.hasAttribute('title');\n\n          // If a test is defined, then use it\n          if (hasTitle) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects should have a title attribute',\n      nl: 'Objecten moeten een titelattribuut hebben'\n    },\n    description: {\n      en: 'All <code>object</code> elements should contain a \\\"title\\\" attribute.',\n      nl: 'Alle <code>object</code>-elementen moeten een \\\"titel\\\"-attribuut bevatten.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H27']\n        }\n      }\n    },\n    tags: ['objects', 'content']\n  }\n};\nmodule.exports = ObjectMustHaveTitle;\n\n},{\"Case\":33,\"DOM\":34}],369:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ObjectMustHaveValidTitle = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'object',\n      attribute: 'title',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects must not have an empty title attribute',\n      nl: 'Objecten hebben geen leeg titelattribuut'\n    },\n    description: {\n      en: 'All <code>object</code> elements should have a \\\"title\\\" attribute which is not empty.',\n      nl: 'All <code>object</code>-elementen hebben een \\\"titel\\\"-attribuut dat gevuld is.'\n    },\n    guidelines: [],\n    tags: ['objects', 'content']\n  }\n};\nmodule.exports = ObjectMustHaveValidTitle;\n\n},{\"PlaceholderComponent\":17}],370:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SuspectPHeaderTags = require('SuspectPHeaderTags');\nvar SuspectPCSSStyles = require('SuspectPCSSStyles');\nvar PNotUsedAsHeader = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var $paragraph = element;\n\n        // If the text has a period, it is probably a sentence and not a header.\n        if (DOM.text($paragraph).search(/[\\.!:;]/) >= 1) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n        var failed = false;\n        // Look for any indication that the paragraph contains at least a full sentence\n        if (DOM.text(element).search(/[\\.!:;]/) < 1) {\n          var priorParagraph = DOM.prev($paragraph);\n          if (!priorParagraph || !DOM.is(priorParagraph, 'p')) {\n            priorParagraph = [];\n          }\n          // Checking if any of SuspectPHeaderTags has exact the same text as a paragraph.\n          SuspectPHeaderTags.forEach(function (tag) {\n            if (DOM.scry(tag, $paragraph).length) {\n              DOM.scry(tag, $paragraph).forEach(function (element) {\n                if (DOM.text(element).trim() === DOM.text($paragraph).trim()) {\n                  _case.set({\n                    status: 'failed'\n                  });\n                  failed = true;\n                }\n              });\n            }\n          });\n          // Checking if previous paragraph has a different values for style properties given in SuspectPCSSStyles.\n          if (priorParagraph.length) {\n            SuspectPCSSStyles.forEach(function (cssProperty) {\n              if (DOM.getComputedStyle($paragraph, cssProperty) !== DOM.getComputedStyle(priorParagraph, cssProperty)) {\n                _case.set({\n                  status: 'failed'\n                });\n                failed = true;\n                return false; // Micro optimization - we no longer need to iterate here. jQuery css() method might be expensive.\n              }\n            });\n          }\n          if (DOM.getComputedStyle($paragraph, 'font-weight') === 'bold') {\n            _case.set({\n              status: 'failed'\n            });\n            failed = true;\n          }\n        }\n        if (!failed) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Paragraphs must not be used for headers',\n      nl: 'Alinea\\'s worden niet gebruikt als header'\n    },\n    description: {\n      en: 'Headers like <code>h1</code> - <code>h6</code> are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one.',\n      nl: 'Headers van <code>h1</code> - <code>h6</code> zijn handig voor blinde en slechtziende gebruikers om door een pagina te navigeren. Maak alinea\\'s daarom niet op zodat deze lijkt op een header. Dit werkt verwarrend.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['G141', 'H42']\n        },\n        '2.4.10': {\n          techniques: ['G141']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = PNotUsedAsHeader;\n\n},{\"Case\":33,\"DOM\":34,\"SuspectPCSSStyles\":22,\"SuspectPHeaderTags\":23}],371:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar PasswordHasLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"password\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All password input elements should have a corresponding label',\n      nl: 'Alle paswoordinvoerelementen hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"password\\\"should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen van het type \\\"paswoord\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: ['n'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = PasswordHasLabel;\n\n},{\"LabelComponent\":13}],372:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar PreShouldNotBeUsedForTabularLayout = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('pre', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var rows = DOM.text(element).split(/[\\n\\r]+/);\n        _case.set({\n          status: rows.length > 1 && DOM.text(element).search(/\\t/) > -1 ? 'failed' : 'passed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Pre elements should not be used for tabular data',\n      nl: 'Pre-elementen worden niet gebruikt om data als tabel te rangschikken'\n    },\n    description: {\n      en: 'If a <code>pre</code> element is used for tabular data, change the data to use a well-formed table.',\n      nl: 'Als een <code>pre</code>-element wordt gebruikt om data als tabel te rangschikken, verander de data dan zodat je een echte tabel kunt maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F33', 'F34', 'F48']\n        },\n        '1.3.2': {\n          techniques: ['F33', 'F34']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = PreShouldNotBeUsedForTabularLayout;\n\n},{\"Case\":33,\"DOM\":34}],373:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar RadioHasLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"radio\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"radio\\\" input elements have a corresponding label',\n      nl: 'Alle invoerelementen van het type \\\"radio\\\" hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"radio\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen van het \\\"radio\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: ['n'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = RadioHasLabel;\n\n},{\"LabelComponent\":13}],374:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnclickRequiresOnKeypress = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onclick]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'onclick'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has an \\\"onclick\\\" attribute it should also have an \\\"onkeypress\\\" attribute',\n      nl: 'Als een element een \\\"onclick\\\"-attribuut heeft, moet het ook een \\\"onkeypress\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has an \\\"onclick\\\" attribute it should also have an \\\"onkeypress\\\" attribute',\n      nl: 'Als een element een \\\"onclick\\\"-attribuut heeft, moet het ook een \\\"onkeypress\\\"-attribuut hebben'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnclickRequiresOnKeypress;\n\n},{\"EventComponent\":6}],375:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOndblclickRequiresOnKeypress = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[ondblclick]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'ondblclick'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any element with an \\\"ondblclick\\\" attribute should have a keyboard-related action as well',\n      nl: 'Elk element met een \\\"ondblclick\\\"-attribuut moet een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord'\n    },\n    description: {\n      en: 'If an element has an \\\"ondblclick\\\" attribute, it should also have a keyboard-related action.',\n      nl: 'Als een element een \\\"ondblclick\\\"-attribuut heeft, moet het ook een actie bevatten die kan worden uitgevoerd met een toetsenbord.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOndblclickRequiresOnKeypress;\n\n},{\"EventComponent\":6}],376:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmousedownRequiresOnKeypress = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmousedown]',\n      correspondingEvent: 'onkeydown',\n      searchEvent: 'onmousedown'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"mousedown\\\" attribute it should also have an \\\"onkeydown\\\" attribute',\n      nl: 'Als een element een \\\"mousedown\\\"-attribuut heeft moet het ook een \\\"onkeydown\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"mousedown\\\" attribute it should also have an \\\"onkeydown\\\" attribute.',\n      nl: 'Als een element een \\\"mousedown\\\"-attribuut heeft moet het ook een \\\"onkeydown\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmousedownRequiresOnKeypress;\n\n},{\"EventComponent\":6}],377:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmousemove = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmousemove]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'onmousemove'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any element with an \\\"onmousemove\\\" attribute should have a keyboard-related action as well',\n      nl: 'Elk element met een \\\"onmousemove\\\"-attribuut moet een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord'\n    },\n    description: {\n      en: 'If an element has an \\\"onmousemove\\\" attribute it should have a keyboard-related action as well.',\n      nl: 'Als een element een \\\"onmousemove\\\"-attribuut heeft, moet het een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmousemove;\n\n},{\"EventComponent\":6}],378:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseoutHasOnmouseblur = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmouseout]',\n      correspondingEvent: 'onblur',\n      searchEvent: 'onmouseout'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseout\\\" attribute it should also have an \\\"onblur\\\" attribute',\n      nl: 'Als een element een \\\"onmouseout\\\"-attribuut heeft, moet het ook een \\\"onblur\\\" attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseout\\\" attribute it should also have an \\\"onblur\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseout\\\"-attribuut heeft, moet het ook een \\\"onblur\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmouseoutHasOnmouseblur;\n\n},{\"EventComponent\":6}],379:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseoverHasOnfocus = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmouseover]',\n      correspondingEvent: 'onfocus',\n      searchEvent: 'onmouseover'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseover\\\" attribute it should also have an \\\"onfocus\\\" attribute',\n      nl: 'Als een element een \\\"onmouseover\\\"-attribuut heeft, moet het ook een \\\"onfocus\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseover\\\" attribute it should also have an \\\"onfocus\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseover\\\"-attribuut heeft, moet het ook een \\\"onfocus\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmouseoverHasOnfocus;\n\n},{\"EventComponent\":6}],380:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseupHasOnkeyup = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmouseup]',\n      correspondingEvent: 'onkeyup',\n      searchEvent: 'onmouseup'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseup\\\" attribute it should also have an \\\"onkeyup\\\" attribute',\n      nl: 'Als een element een \\\"onmouseup\\\"-attribuut heeft, moet het ook een \\\"onkeyup\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseup\\\" attribute it should also have an \\\"onkeyup\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseup\\\"-attribuut heeft, moet het ook een \\\"onkeyup\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmouseupHasOnkeyup;\n\n},{\"EventComponent\":6}],381:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar SelectHasAssociatedLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'select'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All select elements have an explicitly associated label',\n      nl: 'Alle select-elementen hebben een expliciet bijbehorend label'\n    },\n    description: {\n      en: 'All <code>select</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>select</code>-elementen moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = SelectHasAssociatedLabel;\n\n},{\"LabelComponent\":13}],382:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar HasEventListenerComponent = require('HasEventListenerComponent');\nvar SelectJumpMenu = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('select', scope).forEach(function (element) {\n        var hasChangeListener = HasEventListenerComponent(element, 'change');\n        if (hasChangeListener) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Select jump menus should jump on button press, not on state change',\n      nl: 'Select jump menu\\'s moeten springen wanneer de knop wordt gebruikt, niet bij statusverandering'\n    },\n    description: {\n      en: 'If you wish to use a \\'Jump\\' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select element.',\n      nl: 'Als je een \\'Jump\\'-menu wilt gebruiken met een select item dat gebruikers naar een andere pagina verwijst, moet de verwijzing plaatsvinden als de gebruiker een knop gebruikt en niet op het moment dat het select element verandert.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.2': {\n          techniques: ['F37']\n        },\n        '3.2.5': {\n          techniques: ['F9']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = SelectJumpMenu;\n\n},{\"Case\":33,\"DOM\":34,\"HasEventListenerComponent\":8}],383:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SiteMapStringsComponent = require('SiteMapStringsComponent');\n\nvar SiteMap = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a[href]', scope).forEach(function (element) {\n        var set = false;\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var text = DOM.text(element).toLowerCase();\n        SiteMapStringsComponent.forEach(function (str) {\n          if (text.search(str) > -1) {\n            set = true;\n            return;\n          }\n        });\n        if (set === false) {\n          _case.set({\n            status: 'failed'\n          });\n          return;\n        }\n\n        if (set) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Websites must have a site map',\n      nl: 'Websites moeten een sitemap hebben'\n    },\n    description: {\n      en: 'Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices.',\n      nl: 'Elke website moet een pagina hebben waarop een sitemap staat of een andere methode om op de site te navigeren vanaf een pagina. Dit spaart gebruikers die hulpmiddelen gebruiken tijd.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.5': {\n          techniques: ['G63']\n        },\n        '2.4.8': {\n          techniques: ['G63']\n        }\n      }\n    },\n    tags: ['document']\n  }\n};\n\nmodule.exports = SiteMap;\n\n},{\"Case\":33,\"DOM\":34,\"SiteMapStringsComponent\":20}],384:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar SkipContentStringsComponent = require('SkipContentStringsComponent');\n\nvar SkipToContentLinkProvided = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var $local = scope;\n      var skipLinkFound = false;\n\n      DOM.scry('a[href*=\"#\"]', $local).forEach(function (element) {\n        if (skipLinkFound) {\n          return;\n        }\n        var $link = element;\n\n        var fragment = DOM.getAttribute($link, 'href').split('#').pop();\n        var $target = DOM.scry('#' + fragment, $local);\n        var strs = SkipContentStringsComponent.slice();\n        while (!skipLinkFound && strs.length) {\n          var str = strs.pop();\n          if (DOM.text($link).search(str) > -1 && $target.length) {\n            $link.focus();\n            if (DOM.isVisible($link)) {\n              skipLinkFound = true;\n              test.add(Case({\n                element: $link,\n                status: 'passed'\n              }));\n              return;\n            }\n            $link.blur();\n          }\n        }\n      });\n      if (!skipLinkFound) {\n        test.add(Case({\n          status: 'failed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'A \\\"skip to content\\\" link should exist as one of the first links on the page',\n      nl: 'Er moet een \\\"skip to content\\\"-link zijn als een van de eerste links op de pagina'\n    },\n    description: {\n      en: 'A link reading \\\"skip to content\\\" should be the first link on a page.',\n      nl: 'Er moet een link zijn om naar de content te navigeren als een van de eerste links op de pagina.'\n    },\n    guidelines: {\n      508: ['o'],\n      wcag: {\n        '2.4.1': {\n          techniques: ['G1']\n        }\n      }\n    },\n    tags: ['document']\n  }\n};\nmodule.exports = SkipToContentLinkProvided;\n\n},{\"Case\":33,\"DOM\":34,\"SkipContentStringsComponent\":21}],385:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SvgContainsTitle = {\n  run: function run(test) {\n\n    var selector = 'svg';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasTitle = DOM.scry('title', element).length === 1;\n\n          // If a test is defined, then use it\n          if (hasTitle) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Inline SVG should use Title elements',\n      nl: 'Inline SVG moet titelelementen gebruiken'\n    },\n    description: {\n      en: 'Any inline SVG image should have an embedded <code>title</code> element.',\n      nl: 'Elke inline SVG-afbeelding moet een ingebed <code>title</code>-element hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['F65']\n        }\n      }\n    },\n    tags: ['image', 'svg', 'content']\n  }\n};\nmodule.exports = SvgContainsTitle;\n\n},{\"Case\":33,\"DOM\":34}],386:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TabIndexFollowsLogicalOrder = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var index = 0;\n      DOM.scry('[tabindex]', scope).forEach(function (element) {\n        var $el = element;\n        var tabindex = DOM.getAttribute($el, 'tabindex');\n        if (parseInt(tabindex, 10) >= 0 && parseInt(tabindex, 10) !== index + 1) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n        index++;\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The tab order of a document is logical',\n      nl: 'De tabvolgorde van een document is logisch'\n    },\n    description: {\n      en: 'Check that the tab order of a page is logical.',\n      nl: 'Controleer of de tabvolgorde van een pagina logisch is.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.3': {\n          techniques: ['H4']\n        }\n      }\n    },\n    tags: ['document']\n  }\n};\nmodule.exports = TabIndexFollowsLogicalOrder;\n\n},{\"Case\":33,\"DOM\":34}],387:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableDataShouldHaveTh = {\n  run: function run(test) {\n\n    var selector = 'table';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasHeading = DOM.scry('th', element).length > 0;\n          // If a test is defined, then use it\n          if (hasHeading) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Data tables should contain \\\"th\\\" elements',\n      nl: 'Datatabellen moeten \\\"th\\\"-elementen bevatten'\n    },\n    description: {\n      en: 'Tables which contain data (as opposed to layout tables) should contain <code>th</code> elements to mark headers for screen readers and enhance the structure of the document.',\n      nl: 'Tabellen die data bevatten (in tegenstelling tot lay-out tabellen) moeten <code>th</code>-elementen bevatten om koppen te markeren voor schermlezers en om de structuur van het document te verbeteren.'\n    },\n    guidelines: {\n      508: ['g'],\n      wcag: {\n        '1.3.1': {\n          techniques: ['F91']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableDataShouldHaveTh;\n\n},{\"Case\":33,\"DOM\":34}],388:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableLayoutDataShouldNotHaveTh = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        if (DOM.scry('th', element).length !== 0) {\n          if (!IsDataTableComponent(element)) {\n            _case.set({\n              status: 'failed'\n            });\n          } else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        } else {\n          _case.set({\n            status: 'inapplicable'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Layout tables should not contain \\\"th\\\" elements',\n      nl: 'Lay-out tabellen bevatten geen \\\"th\\\"-elementen'\n    },\n    description: {\n      en: 'Tables which are used purely for layout (as opposed to data tables), <strong>should not</strong> contain <code>th</code> elements, which would make the table appear to be a data table.',\n      nl: 'Tabellen die alleen voor lay-out worden gebruikt (in tegenstelling tot datatabellen), moeten geen <code>th</code>-elementen bevatten, omdat deze de indruk wekken dat het een datatabel betreft.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F46']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableLayoutDataShouldNotHaveTh;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],389:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableLayoutHasNoCaption = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (DOM.scry('caption', element).length) {\n          if (!IsDataTableComponent(element)) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          } else {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'inapplicable'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All tables used for layout have no \\\"caption\\\" element',\n      nl: 'Alle tabellen die alleen voor lay-out worden gebruikt hebben geen \\\"caption\\\"-element'\n    },\n    description: {\n      en: 'If a table contains no data, and is used simply for layout, then it should not contain a <code>caption</code> element.',\n      nl: 'Als een tabel geen data bevat en alle voor lay-out wordt gebruikt, moet hij geen <code>caption</code>-element krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F46']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableLayoutHasNoCaption;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],390:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar TableLayoutHasNoSummary = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        if (!IsDataTableComponent(element) && !IsUnreadable(DOM.getAttribute(element, 'summary'))) {\n          _case.set({ status: 'failed' });\n        } else {\n          _case.set({ status: 'passed' });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All tables used for layout have no summary or an empty summary',\n      nl: 'Alle tabellen die alleen voor lay-out worden gebruikt hebben geen samenvatting'\n    },\n    description: {\n      en: 'If a table contains no data, and is used simply for layout, then it should not have a \\\"summary\\\" attribute.',\n      nl: 'Als een tabel geen data bevat en alleen voor lay-out wordt gebruikt, moet hij geen \\\"summary\\\"-attribuut krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F46']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableLayoutHasNoSummary;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11,\"IsUnreadable\":12}],391:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableLayoutMakesSenseLinearized = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (!IsDataTableComponent(element)) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All tables used for layout should make sense when removed',\n      nl: 'Als tabellen voor lay-out worden gebruikt moet de pagina nog duidelijk blijven als de tabel wordt verwijderd'\n    },\n    description: {\n      en: 'If a <code>table</code> element is used for layout purposes only, then the content of the table should make sense if the table is linearized.',\n      nl: 'Als een <code>table</code>-element alleen voor lay-out-doeleinden wordt gebruikt, moet de inhoud van de tabel nog steeds duidelijk zijn als de tabel wordt verwijderd.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['G57']\n        },\n        '4.1.1': {\n          techniques: ['F49']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableLayoutMakesSenseLinearized;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],392:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableNotUsedForLayout = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (!IsDataTableComponent(element)) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Tables should not be used for layout',\n      nl: 'Tabellen moet niet worden gebruikt voor lay-out'\n    },\n    description: {\n      en: 'Tables are for data, not for creating a page layout. Consider using standard HTML and CSS techniques instead.',\n      nl: 'Tabellen zijn voor data, niet om een pagina op te maken. Gebruik hiervoor HTML en CSS.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['F49']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableNotUsedForLayout;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],393:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableShouldUseHeaderIDs = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        var $table = element;\n        var tableFailed = false;\n        if (IsDataTableComponent($table)) {\n          DOM.scry('th', $table).forEach(function (element) {\n            if (!tableFailed && !DOM.getAttribute(element, 'id')) {\n              tableFailed = true;\n              test.add(Case({\n                element: $table,\n                status: 'failed'\n              }));\n            }\n          });\n          if (!tableFailed) {\n            DOM.scry('td[header]', $table).forEach(function (element) {\n              if (!tableFailed) {\n                DOM.getAttribute(element, 'header').split(' ').forEach(function (id) {\n                  if (!DOM.scry('#' + id, $table).length) {\n                    tableFailed = true;\n                    test.add(Case({\n                      element: $table,\n                      status: 'failed'\n                    }));\n                  }\n                });\n              }\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Table cells use IDs to identify headers',\n      nl: 'Tabelcellen gebruiken IDs om koppen te identificeren'\n    },\n    description: {\n      en: 'If a table is not being used for layout, it should use IDs and header attributes to identify table headers.',\n      nl: 'Een tabel moet IDs en header-attributen gebruiken om tabelkoppen te identificeren.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H43']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableShouldUseHeaderIDs;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],394:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableSummaryDoesNotDuplicateCaption = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope).filter(function (element) {\n        return DOM.scry('caption', element).length > 0;\n      }).forEach(function (element) {\n        var caption = DOM.scry('caption', element)[0];\n        var summary = caption && DOM.getAttribute(caption, 'summary');\n        if (summary && CleanStringComponent(summary) === CleanStringComponent(DOM.text(element))) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Table \\\"summary\\\" elements should not duplicate the \\\"caption\\\" element',\n      nl: 'Tabel \\\"summary\\\"-elementen mogen niet hetzelfde zijn als het \\\"caption\\\"-element'\n    },\n    description: {\n      en: 'The summary and the caption must be different, as both provide different information. A <code>caption</code>. /code element identifies the table, while the \\\"summary\\\" attribute describes the table contents.',\n      nl: 'De samenvatting en beschrijving van een tabel moeten verschillen, want ze bieden verschillende informatie. Een <code>caption</code>-element identificeert welke tabel het betreft en het \\\"summary\\\"-attribuut beschrijft de inhoud van de tabel.'\n    },\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableSummaryDoesNotDuplicateCaption;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34}],395:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar TableSummaryIsEmpty = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'table',\n      attribute: 'summary',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All data tables should have a summary',\n      nl: 'Alle datatabellen moeten een samenvatting hebben'\n    },\n    description: {\n      en: 'If a table contains data, it should have a \\\"summary\\\" attribute.',\n      nl: 'Als een tabel data bevat, moet hij een \\\"summary\\\"-attribuut hebben.'\n    },\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableSummaryIsEmpty;\n\n},{\"PlaceholderComponent\":17}],396:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableSummaryIsNotTooLong = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope).forEach(function (element) {\n        if (DOM.getAttribute(element, 'summary').trim().length > 100) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableSummaryIsNotTooLong;\n\n},{\"Case\":33,\"DOM\":34}],397:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableUseColGroup = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (table) {\n        if (IsDataTableComponent(table) && !DOM.scry('colgroup', table).length) {\n          test.add(Case({\n            element: table,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Group columns using \\\"colgroup\\\" or \\\"col\\\" elements',\n      nl: 'Groepeer kolommen met \\\"colgroup\\\"- of \\\"col\\\"-elementen'\n    },\n    description: {\n      en: 'To help complex table headers make sense, use <code>colgroup</code> or <code>col</code> to group them together.',\n      nl: 'Maak complexe tabelkoppen duidelijker door \\\"colgroup\\\"- of \\\"col\\\"-elementen te gebruiken om ze te groeperen.'\n    },\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableUseColGroup;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],398:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableUsesAbbreviationForHeader = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('th', scope).filter(function (element) {\n        var abbr = DOM.getAttribute(element, 'abbr');\n        return !abbr || abbr === '';\n      }).forEach(function (element) {\n        if (DOM.text(element).length > 20) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Table headers over 20 characters should provide an \\\"abbr\\\" attribute',\n      nl: 'Tabelkoppen met meer dan 20 tekens moeten een \\\"abbr\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'For long table headers, use an \\\"abbr\\\" attribute that is less than short (less than 20 characters long).',\n      nl: 'Gebruik een \\\"abbr\\\"-attribuut korter dan 20 tekens voor lange tabelkoppen.'\n    },\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableUsesAbbreviationForHeader;\n\n},{\"Case\":33,\"DOM\":34}],399:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableUsesCaption = {\n  run: function run(test) {\n\n    var selector = 'table';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasCaption = DOM.scry('caption', element).length === 1;\n\n          // If a test is defined, then use it\n          if (hasCaption) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Data tables should contain a \\\"caption\\\" element if not described elsewhere',\n      nl: 'Datatabellen moeten een \\\"caption\\\"-element hebben als ze nergens anders beschreven worden'\n    },\n    description: {\n      en: 'Unless otherwise described in the document, tables should contain <code>caption</code> elements to describe the purpose of the table.',\n      nl: 'Tenzij elders in het document beschreven, moeten tabellen een \\\"caption\\\"-element hebben om het doel van de tabel te beschrijven.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H39']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableUsesCaption;\n\n},{\"Case\":33,\"DOM\":34}],400:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableUsesScopeForRow = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        DOM.scry('td:first-child', element).forEach(function (element) {\n          var next = DOM.next(element);\n          if (next) {\n            var isBold = DOM.getComputedStyle(element, 'font-weight') === 'bold';\n            var nextIsNotBold = DOM.getComputedStyle(next, 'font-weight') !== 'bold';\n            var boldDoesNotFollowsBold = isBold && nextIsNotBold;\n            var hasStrong = DOM.scry('strong', element).length;\n            var nextIsNotStrong = DOM.scry('strong', next).length === 0;\n            var strongDoesNotFollowStrong = hasStrong && nextIsNotStrong;\n\n            if (boldDoesNotFollowsBold || strongDoesNotFollowStrong) {\n              test.add(new Case({\n                element: element,\n                status: 'failed'\n              }));\n            }\n          }\n        });\n        DOM.scry('td:last-child', element).forEach(function (element) {\n          var $prev = DOM.prev(element);\n          var isBold = DOM.getComputedStyle(element, 'font-weight') === 'bold';\n          var prevIsNotBold = DOM.getComputedStyle($prev, 'font-weight') !== 'bold';\n          var boldDoesNotFollowsBold = isBold && prevIsNotBold;\n          var hasStrong = DOM.scry('strong', element).length;\n          var prevIsNotStrong = DOM.scry('strong', $prev).length === 0;\n          var strongDoesNotFollowStrong = hasStrong && prevIsNotStrong;\n\n          if (boldDoesNotFollowsBold || strongDoesNotFollowStrong) {\n            test.add(new Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Data tables should use scoped headers for rows with headers',\n      nl: 'Datatabellen moeten het \\\"scope\\\"-attribuut gebruiken voor rijen met koppen'\n    },\n    description: {\n      en: 'Where there are table headers for both rows and columns, use the \\\"scope\\\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight.',\n      nl: 'Als er tabelkoppen zijn voor zowel rijen als kolommen, gebruik dan het \\\"scope\\\"-attribuut om het juiste verband te leggen tussen de koppen en bijbehorende cellen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H63']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableUsesScopeForRow;\n\n},{\"Case\":33,\"DOM\":34}],401:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TabularDataIsInTable = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('pre', scope).forEach(function (element) {\n        if (DOM.text(element).search('\\t') >= 0) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All tabular information should use a table',\n      nl: 'Alle tabelinformatie moet ook daadwerkelijk in een tabel staan'\n    },\n    description: {\n      en: 'Tables should be used when displaying tabular information.',\n      nl: 'Gebruik een echte tabel wanneer je tabelinformatie wilt tonen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F33', 'F34', 'F48']\n        },\n        '1.3.2': {\n          techniques: ['F33', 'F34']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TabularDataIsInTable;\n\n},{\"Case\":33,\"DOM\":34}],402:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ConvertToPxComponent = require('ConvertToPxComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\n\nvar TextIsNotSmall = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var fontSize = DOM.getComputedStyle(element, 'font-size');\n        if (fontSize.search('em') > 0) {\n          fontSize = ConvertToPxComponent(fontSize);\n        }\n        fontSize = parseInt(fontSize.replace('px', ''), 10);\n\n        if (fontSize < 10) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The text size is not less than 9 pixels high',\n      nl: 'De grootte van de tekst is meer dan 8 pixels hoog'\n    },\n    description: {\n      en: 'To help users with difficulty reading small text, ensure text size is no less than 9 pixels high.',\n      nl: 'Help gebruikers die moeite hebben met het lezen van kleine letters, door ervoor te zorgen dat tekst groter is dan 8 pixels hoog.'\n    },\n    guidelines: [],\n    tags: ['textsize', 'content']\n  }\n};\nmodule.exports = TextIsNotSmall;\n\n},{\"Case\":33,\"ConvertToPxComponent\":5,\"DOM\":34,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],403:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar TextareaHasAssociatedLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'textarea'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All textareas should have a corresponding label',\n      nl: 'Alle \\\"textarea\\\"-elementen moeten een bijbehorend label hebben'\n    },\n    description: {\n      en: 'All <code>textarea</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle \\\"textarea\\\"-elementen moeten een bijbehorend label hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = TextareaHasAssociatedLabel;\n\n},{\"LabelComponent\":13}],404:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar VideoMayBePresent = {\n  run: function run(test) {\n\n    var videoExtensions = ['webm', 'flv', 'ogv', 'ogg', 'avi', 'mov', 'qt', 'wmv', 'asf', 'mp4', 'm4p', 'm4v', 'mpg', 'mp2', 'mpeg', 'mpg', 'mpe', 'mpv', 'm2v', '3gp', '3g2'];\n    var videoHosts = ['//www.youtube.com/embed/', '//player.vimeo.com/video/'];\n\n    test.get('scope').forEach(function (scope) {\n      var hasCase = false; // Test if a case has been created\n\n      // video elm is definately a video, and objects could be too.\n      DOM.scry('object, video', scope).forEach(function (element) {\n        hasCase = true;\n        test.add(Case({\n          element: element,\n          status: 'cantTell'\n        }));\n      });\n\n      // Links refering to files with an video extensions are probably video\n      // though the file may not exist.\n      DOM.scry('a[href]', scope).forEach(function (element) {\n        var extension = element.getAttribute('href').split('.').pop();\n        if (videoExtensions.indexOf(extension) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // some iframes with URL's of known video providers are also probably videos\n      DOM.scry('iframe', scope).forEach(function (element) {\n        if (element.src.indexOf(videoHosts[0]) !== -1 || element.src.indexOf(videoHosts[1]) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // if no case was added, return inapplicable\n      if (!hasCase) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Video or object uses a link that points to a file with a video extension',\n      nl: 'Video of object met een link naar een bestand met een video extensie'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'video']\n  }\n};\nmodule.exports = VideoMayBePresent;\n\n},{\"Case\":33,\"DOM\":34}],405:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar VideoComponent = require('VideoComponent');\nvar VideosEmbeddedOrLinkedNeedCaptions = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      VideoComponent.findVideos(scope, function (element, pass) {\n        if (!pass) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All linked or embedded videos need captions',\n      nl: 'Alle gekoppelde of ingebedde video\\'s moeten bijschriften hebben'\n    },\n    description: {\n      en: 'Any video hosted or otherwise which is linked or embedded must have a caption.',\n      nl: 'Elke video die is gekoppeld of ingebed in content moet een bijschrift hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.2.2': {\n          techniques: ['G87']\n        },\n        '1.2.4': {\n          techniques: ['G87']\n        }\n      }\n    },\n    tags: ['media', 'content']\n  }\n};\nmodule.exports = VideosEmbeddedOrLinkedNeedCaptions;\n\n},{\"Case\":33,\"VideoComponent\":31}],406:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar WhiteSpaceInWord = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var whitespaceGroup = undefined,\n            nonWhitespace = undefined;\n        nonWhitespace = DOM.text(element) ? DOM.text(element).match(/[^\\s\\\\]/g) : false;\n        whitespaceGroup = DOM.text(element) ? DOM.text(element).match(/[^\\s\\\\]\\s[^\\s\\\\]/g) : false;\n        if (nonWhitespace && whitespaceGroup && whitespaceGroup.length > 3 && whitespaceGroup.length >= nonWhitespace.length / 2 - 2) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Whitespace should not be used between characters in a word',\n      nl: 'Zet geen witruimte tussen letters in een woord'\n    },\n    description: {\n      en: 'Using extra whitespace between letters in a word causes screen readers to not interpret the word correctly, use the letter-spacing CSS property instead.',\n      nl: 'Het gebruik van witruimte tussen de letters van een woord, zorgen dat schermlezers het woord niet volledig kunnen lezen. Gebruik in plaats hiervan css om de ruimte tussen letters te bepalen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['F32', 'C8']\n        }\n      }\n    },\n    tags: ['content']\n  }\n};\nmodule.exports = WhiteSpaceInWord;\n\n},{\"Case\":33,\"DOM\":34,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],407:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar WhiteSpaceNotUsedForFormatting = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        if (DOM.scry('br', element).length === 0) {\n          _case.set({ status: 'passed' });\n          return;\n        }\n        var lines = DOM.text(element).toLowerCase().split(/(<br\\ ?\\/?>)+/);\n        var lineCount = 0;\n        lines.forEach(function (line) {\n          if (line.search(/(\\s|\\&nbsp;) {2,}/g) !== -1) {\n            lineCount++;\n          }\n        });\n        if (lineCount > 1) {\n          _case.set({ status: 'failed' });\n        } else {\n          _case.set({ status: 'cantTell' });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Whitespace should not be used for conveying information',\n      nl: 'Gebruik geen witruimte om informatie over te brengen'\n    },\n    description: {\n      en: 'Spaces or tabs are not read by assistive technology and should not be used to convey meaning.',\n      nl: 'Spaties of tabs worden niet voorgelezen door hulpprogramma\\'s en moeten niet worden gebruikt om betekenis over te dragen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['G57']\n        }\n      }\n    },\n    tags: ['content']\n  }\n};\nmodule.exports = WhiteSpaceNotUsedForFormatting;\n\n},{\"Case\":33,\"DOM\":34,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}]},{},[36]);\n"
  },
  {
    "path": "dist/runInBrowser.js",
    "content": "(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw f.code=\"MODULE_NOT_FOUND\",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AcronymComponent = function AcronymComponent(test) {\n  test.get('scope').forEach(function (scope) {\n    var alreadyReported = {};\n    var predefined = {};\n\n    // Find defined acronyms within this scope.\n    DOM.scry('acronym[title], abbr[title]', scope).forEach(function (element) {\n      predefined[element.innerText.trim().replace(/\\n/g, '').replace(/( ){2,}/g, ' ').toUpperCase()] = element.getAttribute('title');\n    });\n\n    // Consider all block-level html elements that contain text.\n    DOM.scry('p, span, h1, h2, h3, h4, h5', scope).forEach(function (element) {\n      var self = element;\n      var text = self.innerText;\n      var words = text.split(' ');\n      // Keep a list of words that might be acronyms.\n      var infractions = [];\n      // If there is more than one word and ??.\n      if (words.length > 1 && text.toUpperCase() !== text) {\n        // Check each word.\n        words.forEach(function (word) {\n          // Only consider words great than one character.\n          if (word.length < 2) {\n            return;\n          }\n          // Only consider words that have not been predefined.\n          // Remove any non-alpha characters.\n          word = word.replace(/[^a-zA-Zs]/, '');\n          // If this is an uppercase word that has not been defined, it fails.\n          if (word.toUpperCase() === word && typeof predefined[word.toUpperCase().trim()] === 'undefined') {\n            if (typeof alreadyReported[word.toUpperCase()] === 'undefined') {\n              infractions.push(word);\n            }\n            alreadyReported[word.toUpperCase()] = word;\n          }\n        });\n        // If undefined acronyms are discovered, fail this case.\n        if (infractions.length) {\n          test.add(Case({\n            element: self,\n            info: {\n              acronyms: infractions\n            },\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: self,\n            status: 'passed'\n          }));\n        }\n      } else {\n        test.add(Case({\n          element: self,\n          status: 'passed'\n        }));\n      }\n    });\n  });\n};\nmodule.exports = AcronymComponent;\n\n},{\"Case\":33,\"DOM\":34}],2:[function(require,module,exports){\n'use strict';\n\nvar DOM = require('DOM');\nvar BorderDetailsComponent = function BorderDetailsComponent(element) {\n  var borders = new Map();\n  ['top', 'right', 'bottom', 'left'].forEach(function (side) {\n    var width = DOM.getComputedStyle(element, 'border-' + side + '-width');\n    width = parseInt(width.slice(0, -2), 10);\n    var style = DOM.getComputedStyle(element, 'border-' + side + '-style');\n    var color = DOM.getComputedStyle(element, 'border-' + side + '-color');\n    borders.set(side, {\n      width: width,\n      style: style,\n      color: color\n    });\n  });\n  return borders;\n};\nmodule.exports = BorderDetailsComponent;\n\n},{\"DOM\":34}],3:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = function CleanStringComponent(string) {\n  return string.toLowerCase().replace(/^\\s\\s*/, '');\n};\n\nmodule.exports = CleanStringComponent;\n\n},{}],4:[function(require,module,exports){\n'use strict';\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _typeof(obj) {\n  return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n}\n\n/**\n * Test callback for color tests. This handles both WAI and WCAG\n * color contrast/luminosity.\n */\nvar ConvertToPx = require('ConvertToPxComponent');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\n\nvar ColorComponent = function () {\n\n  function buildCase(test, Case, element, status, id, message) {\n    test.add(Case({\n      element: element,\n      message: message,\n      status: status\n    }));\n  }\n\n  var colors = {\n    cache: {},\n    /**\n     * Returns the lumosity of a given foreground and background object,\n     * in the format of {r: red, g: green, b: blue } in rgb color values.\n     */\n    getLuminosity: function getLuminosity(foreground, background) {\n      var cacheKey = 'getLuminosity_' + foreground + '_' + background;\n      foreground = colors.parseColor(foreground);\n      background = colors.parseColor(background);\n\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      var RsRGB = foreground.r / 255;\n      var GsRGB = foreground.g / 255;\n      var BsRGB = foreground.b / 255;\n      var R = RsRGB <= 0.03928 ? RsRGB / 12.92 : Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n      var G = GsRGB <= 0.03928 ? GsRGB / 12.92 : Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n      var B = BsRGB <= 0.03928 ? BsRGB / 12.92 : Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n\n      var RsRGB2 = background.r / 255;\n      var GsRGB2 = background.g / 255;\n      var BsRGB2 = background.b / 255;\n      var R2 = RsRGB2 <= 0.03928 ? RsRGB2 / 12.92 : Math.pow((RsRGB2 + 0.055) / 1.055, 2.4);\n      var G2 = GsRGB2 <= 0.03928 ? GsRGB2 / 12.92 : Math.pow((GsRGB2 + 0.055) / 1.055, 2.4);\n      var B2 = BsRGB2 <= 0.03928 ? BsRGB2 / 12.92 : Math.pow((BsRGB2 + 0.055) / 1.055, 2.4);\n      var l1, l2;\n      l1 = 0.2126 * R + 0.7152 * G + 0.0722 * B;\n      l2 = 0.2126 * R2 + 0.7152 * G2 + 0.0722 * B2;\n\n      colors.cache[cacheKey] = Math.round((Math.max(l1, l2) + 0.05) / (Math.min(l1, l2) + 0.05) * 10) / 10;\n      return colors.cache[cacheKey];\n    },\n\n    /**\n     * Returns the average color for a given image\n     * using a canvas element.\n     */\n    fetchImageColorAtPixel: function fetchImageColorAtPixel(img, x, y) {\n      x = typeof x !== 'undefined' ? x : 1;\n      y = typeof y !== 'undefined' ? y : 1;\n      var can = document.createElement('canvas');\n      var context = can.getContext('2d');\n      context.drawImage(img, 0, 0);\n      var data = context.getImageData(x, y, 1, 1).data;\n      return 'rgb(' + data[0] + ',' + data[1] + ',' + data[2] + ')';\n    },\n\n    /**\n     * Returns whether an element's color passes\n     * WCAG at a certain contrast ratio.\n     */\n    passesWCAG: function passesWCAG(element, level) {\n      return this.passesWCAGColor(element, this.getColor(element, 'foreground'), this.getColor(element, 'background'), level);\n    },\n\n    testElmContrast: function testElmContrast(algorithm, element, level) {\n      var background = colors.getColor(element, 'background');\n      return colors.testElmBackground(algorithm, element, background, level);\n    },\n\n    testElmBackground: function testElmBackground(algorithm, element, background, level) {\n      var foreground = colors.getColor(element, 'foreground');\n      var res;\n      if (algorithm === 'wcag') {\n        res = colors.passesWCAGColor(element, foreground, background, level);\n      } else if (algorithm === 'wai') {\n        res = colors.passesWAIColor(foreground, background);\n      }\n      return res;\n    },\n\n    /**\n     * Returns whether an element's color passes\n     * WCAG at a certain contrast ratio.\n     */\n    passesWCAGColor: function passesWCAGColor(element, foreground, background, level) {\n      var pxfsize = ConvertToPx(DOM.getComputedStyle(element, 'font-size'));\n      if (typeof level === 'undefined') {\n        if (pxfsize >= 18) {\n          level = 3;\n        } else {\n          var fweight = DOM.getComputedStyle(element, 'font-weight');\n          if (pxfsize >= 14 && (fweight === 'bold' || parseInt(fweight, 10) >= 700)) {\n            level = 3;\n          } else {\n            level = 4.5;\n          }\n        }\n      }\n      return this.getLuminosity(foreground, background) > level;\n    },\n\n    /**\n     * Returns whether an element's color passes\n     * WAI brightness levels.\n     */\n    passesWAI: function passesWAI(element) {\n      var foreground = this.parseColor(this.getColor(element, 'foreground'));\n      var background = this.parseColor(this.getColor(element, 'background'));\n      return this.passesWAIColor(foreground, background);\n    },\n\n    /**\n     * Returns whether an element's color passes\n     * WAI brightness levels.\n     */\n    passesWAIColor: function passesWAIColor(foreground, background) {\n      var contrast = colors.getWAIErtContrast(foreground, background);\n      var brightness = colors.getWAIErtBrightness(foreground, background);\n\n      return contrast > 500 && brightness > 125;\n    },\n\n    /**\n     * Compused contrast of a foreground and background\n     * per the ERT contrast spec.\n     */\n    getWAIErtContrast: function getWAIErtContrast(foreground, background) {\n      var diffs = colors.getWAIDiffs(foreground, background);\n      return diffs.red + diffs.green + diffs.blue;\n    },\n\n    /**\n     * Computed contrast of a foreground and background\n     * per the ERT brightness spec.\n     */\n    getWAIErtBrightness: function getWAIErtBrightness(foreground, background) {\n      var diffs = colors.getWAIDiffs(foreground, background);\n      return (diffs.red * 299 + diffs.green * 587 + diffs.blue * 114) / 1000;\n    },\n\n    /**\n     * Returns differences between two colors.\n     */\n    getWAIDiffs: function getWAIDiffs(foreground, background) {\n      return {\n        red: Math.abs(foreground.r - background.r),\n        green: Math.abs(foreground.g - background.g),\n        blue: Math.abs(foreground.b - background.b)\n      };\n    },\n\n    /**\n     * Retrieves the background or foreground of an element.\n     * There are some normalizations here for the way\n     * different browsers can return colors, and handling transparencies.\n     */\n    getColor: function getColor(element, type) {\n      var self = colors;\n      var cacheId = DOM.getData(element, 'quail-cache-id');\n      if (!cacheId) {\n        cacheId = 'id_' + Math.random();\n        DOM.setData(element, 'quail-cache-id', cacheId);\n      }\n      var cacheKey = 'getColor_' + type + '_' + cacheId;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      if (type === 'foreground') {\n        colors.cache[cacheKey] = DOM.getComputedStyle(element, 'color') ? DOM.getComputedStyle(element, 'color') : 'rgb(0,0,0)';\n        return colors.cache[cacheKey];\n      }\n\n      var bcolor = DOM.getComputedStyle(element, 'background-color');\n      if (colors.hasBackgroundColor(bcolor)) {\n        colors.cache[cacheKey] = bcolor;\n        return colors.cache[cacheKey];\n      }\n\n      DOM.parents(element).forEach(function (element) {\n        var pcolor = DOM.getComputedStyle(element, 'background-color');\n        if (colors.hasBackgroundColor(pcolor)) {\n          return self.cache[cacheKey] = pcolor;\n        }\n      });\n      // Assume the background is white.\n      colors.cache[cacheKey] = 'rgb(255,255,255)';\n      return colors.cache[cacheKey];\n    },\n\n    getForeground: function getForeground(element) {\n      return colors.getColor(element, 'foreground');\n    },\n\n    /**\n     * Returns an object with rgba taken from a string.\n     */\n    parseColor: function parseColor(color) {\n      if ((typeof color === 'undefined' ? 'undefined' : _typeof(color)) === 'object') {\n        return color;\n      }\n\n      if (color.substr(0, 1) === '#') {\n        return {\n          r: parseInt(color.substr(1, 2), 16),\n          g: parseInt(color.substr(3, 2), 16),\n          b: parseInt(color.substr(5, 2), 16),\n          a: false\n        };\n      }\n\n      if (color.substr(0, 3) === 'rgb') {\n        color = color.replace('rgb(', '').replace('rgba(', '').replace(')', '').split(',');\n        return {\n          r: color[0],\n          g: color[1],\n          b: color[2],\n          a: typeof color[3] === 'undefined' ? false : color[3]\n        };\n      }\n    },\n\n    /**\n     * Returns background image of an element or its parents.\n     */\n    getBackgroundImage: function getBackgroundImage(element) {\n      var cacheId = DOM.getData(element, 'quail-cache-id');\n      if (!cacheId) {\n        cacheId = 'id_' + Math.random();\n        DOM.setData(element, 'quail-cache-id', cacheId);\n      }\n\n      var cacheKey = 'getBackgroundImage_' + cacheId;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n      while (element && element.nodeType === 1 && element.nodeName !== 'BODY' && element.nodeName !== 'HTML') {\n        var bimage = DOM.getComputedStyle(element, 'background-image');\n        if (bimage && bimage !== 'none' && bimage.search(/^(.*?)url(.*?)$/i) !== -1) {\n          colors.cache[cacheKey] = bimage.replace('url(', '').replace(/['\"]/g, '').replace(')', '');\n          return colors.cache[cacheKey];\n        }\n        element = element.parentNode;\n      }\n      colors.cache[cacheKey] = false;\n      return false;\n    },\n\n    /**\n     * Returns background image of an element or its parents.\n     */\n    getBackgroundGradient: function getBackgroundGradient(element) {\n      var cacheId = DOM.getData(element, 'quail-cache-id');\n      if (!cacheId) {\n        cacheId = 'id_' + Math.random();\n        DOM.setData(element, 'quail-cache-id', cacheId);\n      }\n\n      var cacheKey = 'getBackgroundGradient_' + cacheId;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      var notEmpty = function notEmpty(s) {\n        return typeof s === 'string' && s.trim() !== '';\n      };\n      while (element && element.nodeType === 1 && element.nodeName !== 'BODY' && element.nodeName !== 'HTML') {\n        // Exit if element has a background color.\n        if (colors.hasBackgroundColor(DOM.getComputedStyle(element, 'background-color'))) {\n          colors.cache[cacheKey] = false;\n          return false;\n        }\n        var bimage = DOM.getComputedStyle(element, 'background-image');\n        if (bimage && bimage !== 'none' && bimage.search(/^(.*?)gradient(.*?)$/i) !== -1) {\n          var gradient = bimage.match(/gradient(\\(.*\\))/g);\n          if (gradient.length > 0) {\n            gradient = gradient[0].replace(/(linear|radial|\\d+deg|from|\\bto\\b|gradient|top|left|bottom|right|color-stop|center|\\d*%)/g, '');\n            colors.cache[cacheKey] = gradient.match(/(rgb\\([^\\)]+\\)|#[a-z\\d]*|[a-z]*)/g).filter(notEmpty);\n            return colors.cache[cacheKey];\n          }\n        }\n        element = element.parentNode;\n      }\n      colors.cache[cacheKey] = false;\n      return false;\n    },\n\n    /**\n     * Calculates average color of an image.\n     */\n    getAverageRGB: function getAverageRGB(img) {\n      var cacheKey = img.src;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      var blockSize = 5,\n\n      // only visit every 5 pixels\n      defaultRGB = {\n        r: 0,\n        g: 0,\n        b: 0\n      },\n\n      // for non-supporting envs\n      canvas = document.createElement('canvas'),\n          context = canvas.getContext && canvas.getContext('2d'),\n          data,\n          width,\n          height,\n          i = -4,\n          length,\n          rgb = {\n        r: 0,\n        g: 0,\n        b: 0,\n        a: 0\n      },\n          count = 0;\n\n      if (!context) {\n        colors.cache[cacheKey] = defaultRGB;\n        return defaultRGB;\n      }\n\n      height = canvas.height = img.height;\n      width = canvas.width = img.width;\n      context.drawImage(img, 0, 0);\n\n      try {\n        data = context.getImageData(0, 0, width, height);\n      } catch (e) {\n        colors.cache[cacheKey] = defaultRGB;\n        return defaultRGB;\n      }\n\n      length = data.data.length;\n\n      while ((i += blockSize * 4) < length) {\n        ++count;\n        rgb.r += data.data[i];\n        rgb.g += data.data[i + 1];\n        rgb.b += data.data[i + 2];\n      }\n\n      // ~~ used to floor values\n      rgb.r = ~ ~(rgb.r / count);\n      rgb.g = ~ ~(rgb.g / count);\n      rgb.b = ~ ~(rgb.b / count);\n\n      colors.cache[cacheKey] = rgb;\n      return rgb;\n    },\n\n    /**\n     * Convert color to hex value.\n     */\n    colorToHex: function colorToHex(c) {\n      var m = /rgba?\\((\\d+), (\\d+), (\\d+)/.exec(c);\n      return m ? '#' + (1 << 24 | m[1] << 16 | m[2] << 8 | m[3]).toString(16).substr(1) : c;\n    },\n\n    /**\n     * Check if element has a background color.\n     */\n    hasBackgroundColor: function hasBackgroundColor(bcolor) {\n      return bcolor !== 'rgba(0, 0, 0, 0)' && bcolor !== 'transparent';\n    },\n\n    /**\n     * Traverse visual tree for background property.\n     */\n    traverseVisualTreeForBackground: function traverseVisualTreeForBackground(element, property) {\n      var cacheId = DOM.getData(element, 'quail-cache-id');\n      if (!cacheId) {\n        cacheId = 'id_' + Math.random();\n        DOM.setData(element, 'quail-cache-id', cacheId);\n      }\n\n      var cacheKey = 'traverseVisualTreeForBackground_' + cacheId + '_' + property;\n      if (colors.cache[cacheKey] !== undefined) {\n        return colors.cache[cacheKey];\n      }\n\n      var notempty = function notempty(s) {\n        return typeof s === 'string' && s.trim() !== '';\n      };\n\n      var foundIt;\n      var scannedElements = [];\n\n      // Scroll to make sure element is visible.\n      element.scrollIntoView();\n\n      // Get relative x and y.\n      var x = DOM.offset(element).left - window.scrollX;\n      var y = DOM.offset(element).top - window.scrollY;\n\n      // Hide current element.\n      scannedElements.push({\n        element: element,\n        visibility: DOM.getComputedStyle(element, 'visibility')\n      });\n      DOM.setAttributes(element, {\n        style: {\n          visibility: 'hidden'\n        }\n      });\n\n      // Get element at position x, y. This only selects visible elements.\n      var el = document.elementFromPoint(x, y);\n      var MAX_LOOPS = 200;\n      var count = 1;\n      while (foundIt === undefined && el && el.tagName !== 'BODY' && el.tagName !== 'HTML' && count <= MAX_LOOPS) {\n        count++;\n        var bcolor = DOM.getComputedStyle(el, 'background-color');\n        var bimage;\n        // Only check visible elements.\n        switch (property) {\n          case 'background-color':\n            if (colors.hasBackgroundColor(bcolor)) {\n              foundIt = bcolor;\n            }\n            break;\n          case 'background-gradient':\n            // Bail out if the element has a background color.\n            if (colors.hasBackgroundColor(bcolor)) {\n              foundIt = false;\n              continue;\n            }\n\n            bimage = DOM.getComputedStyle(el, 'background-image');\n            if (bimage && bimage !== 'none' && bimage.search(/^(.*?)gradient(.*?)$/i) !== -1) {\n              var gradient = bimage.match(/gradient(\\(.*\\))/g);\n              if (gradient.length > 0) {\n                gradient = gradient[0].replace(/(linear|radial|\\d+deg|from|\\bto\\b|gradient|top|left|bottom|right|color-stop|center|\\d*%)/g, '');\n                foundIt = gradient.match(/(rgb\\([^\\)]+\\)|#[a-z\\d]*|[a-z]*)/g).filter(notempty);\n              }\n            }\n            break;\n          case 'background-image':\n            // Bail out if the element has a background color.\n            if (colors.hasBackgroundColor(bcolor)) {\n              foundIt = false;\n              continue;\n            }\n            bimage = DOM.getComputedStyle(el, 'background-image');\n            if (bimage && bimage !== 'none' && bimage.search(/^(.*?)url(.*?)$/i) !== -1) {\n              foundIt = bimage.replace('url(', '').replace(/['\"]/g, '').replace(')', '');\n            }\n            break;\n        }\n        scannedElements.push({\n          element: el,\n          visibility: DOM.getComputedStyle(el, 'visibility')\n        });\n        DOM.setAttributes(el, {\n          style: {\n            visibility: 'hidden'\n          }\n        });\n        el = document.elementFromPoint(x, y);\n      }\n\n      // Reset visibility.\n      for (var i = 0; i < scannedElements.length; i++) {\n        DOM.setAttributes(scannedElements[i].element, {\n          style: {\n            visibility: scannedElements[i].visibility\n          }\n        });\n      }\n\n      colors.cache[cacheKey] = foundIt;\n      return foundIt;\n    },\n\n    /**\n     * Get first element behind current with a background color.\n     */\n    getBehindElementBackgroundColor: function getBehindElementBackgroundColor(element) {\n      return colors.traverseVisualTreeForBackground(element, 'background-color');\n    },\n\n    /**\n     * Get first element behind current with a background gradient.\n     */\n    getBehindElementBackgroundGradient: function getBehindElementBackgroundGradient(element) {\n      return colors.traverseVisualTreeForBackground(element, 'background-gradient');\n    },\n\n    /**\n     * Get first element behind current with a background image.\n     */\n    getBehindElementBackgroundImage: function getBehindElementBackgroundImage(element) {\n      return colors.traverseVisualTreeForBackground(element, 'background-image');\n    }\n  };\n\n  function textShouldBeTested(textNode) {\n    // We want a tag, not just the text node.\n    var element = textNode.parentNode;\n    var $this = element;\n\n    // The nodeType of the element must be 1. Nodes of type 1 implement the Element\n    // interface which is required of the first argument passed to window.getComputedStyle.\n    // Failure to pass an Element <node> to window.getComputedStyle will raised an exception\n    // if Firefox.\n    if (element.nodeType !== 1) {\n      return false;\n    } else if (['script', 'style', 'title', 'object', 'applet', 'embed', 'template', 'noscript'].indexOf(element.nodeName.toLowerCase()) !== -1) {\n      // Ignore elements whose content isn't displayed to the page.\n      return false;\n    } else if (IsUnreadable(DOM.text($this))) {\n      // Bail out if the text is not readable.\n      return false;\n    } else {\n      return true;\n    }\n  }\n\n  /**\n   * For the color test, if any case passes for a given element, then all the\n   * cases for that element pass.\n   */\n  function postInvoke(test) {\n    var passed = {};\n    var groupsBySelector = test.groupCasesBySelector();\n\n    /**\n     * Determine the length of an object.\n     *\n     * @param object obj\n     *   The object whose size will be determined.\n     *\n     * @return number\n     *   The size of the object determined by the number of keys.\n     */\n    function size(obj) {\n      return Object.keys(obj).length;\n    }\n\n    // Go through each selector group.\n    var nub = '';\n    for (var selector in groupsBySelector) {\n      if (groupsBySelector.hasOwnProperty(selector)) {\n        var cases = groupsBySelector[selector];\n        cases.forEach(function (_case) {\n          if (_case.get('status') === passed) {\n            // This can just be an empty string. We only need the passed hash\n            // to contain keys, not values.\n            passed[selector] = nub;\n          }\n        });\n      }\n    }\n\n    return size(passed) === size(groupsBySelector);\n  }\n\n  return {\n    colors: colors,\n    textShouldBeTested: textShouldBeTested,\n    postInvoke: postInvoke,\n    buildCase: buildCase\n  };\n}();\nmodule.exports = ColorComponent;\n\n},{\"ConvertToPxComponent\":5,\"DOM\":34,\"IsUnreadable\":12}],5:[function(require,module,exports){\n'use strict';\n\n/**\n * Converts units to pixels.\n */\n\nvar DOM = require('DOM');\nvar ConvertToPxComponent = function ConvertToPxComponent(unit) {\n  if (unit.search('px') > -1) {\n    return parseInt(unit, 10);\n  }\n  var div = document.createElement('div');\n  div.style.display = 'none';\n  div.style.height = unit;\n  document.body.appendChild(div);\n  var height = DOM.getComputedStyle(div, 'height');\n  document.body.removeChild(div);\n  return parseInt(height, 10);\n};\nmodule.exports = ConvertToPxComponent;\n\n},{\"DOM\":34}],6:[function(require,module,exports){\n'use strict';\n\n/**\n * Test callback for tests that look for script events\n *  (like a mouse event has a keyboard event as well).\n */\n\nvar Case = require('Case');\nvar HasEventListenerComponent = require('HasEventListenerComponent');\nvar DOM = require('DOM');\n\nvar EventComponent = function EventComponent(test, options) {\n  test.get('scope').forEach(function (scope) {\n    var $items = options.selector && DOM.scry(options.selector, scope);\n    // Bail if nothing was found.\n    if ($items.length === 0) {\n      test.add(Case({\n        element: scope,\n        status: 'inapplicable'\n      }));\n      return;\n    }\n    var searchEvent = options.searchEvent || '';\n    var correspondingEvent = options.correspondingEvent || '';\n    $items.forEach(function (item) {\n      var eventName = searchEvent.replace('on', '');\n      var hasOnListener = HasEventListenerComponent(item, eventName);\n      // Determine if the element has jQuery listeners for the event.\n      var jqevents;\n      var $ = window.jQuery || window.$ || {};\n      if ($._data) {\n        jqevents = $._data(this, 'events');\n      }\n      var hasjQueryOnListener = jqevents && jqevents[eventName] && !!jqevents[eventName].length;\n      var hasCorrespondingEvent = !!correspondingEvent.length;\n      var hasSpecificCorrespondingEvent = HasEventListenerComponent(item, correspondingEvent.replace('on', ''));\n      var _case = test.add(Case({\n        element: item\n      }));\n      if ((hasOnListener || hasjQueryOnListener) && (!hasCorrespondingEvent || !hasSpecificCorrespondingEvent)) {\n        _case.set({\n          status: 'failed'\n        });\n      } else {\n        _case.set({\n          status: 'passed'\n        });\n      }\n    });\n  });\n};\nmodule.exports = EventComponent;\n\n},{\"Case\":33,\"DOM\":34,\"HasEventListenerComponent\":8}],7:[function(require,module,exports){\n'use strict';\n\n/**\n *  Returns text contents for nodes depending on their semantics\n */\n\nvar DOM = require('DOM');\nvar getTextContentsComponent = function getTextContentsComponent($element) {\n  if (DOM.is($element, 'p, pre, blockquote, ol, ul, li, dl, dt, dd, figure, figcaption')) {\n    return DOM.text($element);\n  }\n  // Loop through all text nodes to get everything around children.\n  var text = '';\n  var children = $element.childNodes;\n  for (var i = 0, il = children.length; i < il; i += 1) {\n    // Only text nodes.\n    if (children[i].nodeType === 3) {\n      text += children[i].nodeValue;\n    }\n  }\n  return text;\n};\n\nmodule.exports = getTextContentsComponent;\n\n},{\"DOM\":34}],8:[function(require,module,exports){\n'use strict';\n\n/**\n * Returns whether an element has an event handler or not.\n */\n\nvar DOM = require('DOM');\nvar HasEventListenerComponent = function HasEventListenerComponent(element, event) {\n  var onEventAttr = DOM.getAttribute(element, 'on' + event);\n  if (onEventAttr) {\n    return true;\n  }\n  // jQuery events are stored in private objects\n  var $ = window.jQuery || window.$ || {};\n  if ($._data) {\n    if ($._data(element, 'events') && typeof $._data(element, 'events')[event] !== 'undefined') {\n      return true;\n    }\n  }\n  // Certain elements always have default events, so we create a new element to compare default events.\n  if (DOM.is(element, 'a[href], input, button, video, textarea') && typeof element[event] !== 'undefined' && (event === 'click' || event === 'focus')) {\n    if (element[event].toString().search(/^\\s*function\\s*(\\b[a-z$_][a-z0-9$_]*\\b)*\\s*\\((|([a-z$_][a-z0-9$_]*)(\\s*,[a-z$_][a-z0-9$_]*)*)\\)\\s*{\\s*\\[native code\\]\\s*}\\s*$/i) > -1) {\n      return false;\n    }\n  }\n  return typeof element[event] !== 'undefined';\n};\nmodule.exports = HasEventListenerComponent;\n\n},{\"DOM\":34}],9:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar HeadingSelectorComponent = require('HeadingSelectorComponent');\nvar HeadingLevelComponent = function HeadingLevelComponent(test, options) {\n  var priorLevel = false;\n  test.get('scope').forEach(function (scope) {\n    HeadingSelectorComponent(scope).forEach(function (element) {\n      var level = parseInt(element.tagName.substr(-1, 1), 10);\n      if (priorLevel === options.headingLevel && level > priorLevel + 1) {\n        test.add(Case({\n          element: element,\n          status: 'failed'\n        }));\n      } else {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      }\n      priorLevel = level;\n    });\n  });\n};\nmodule.exports = HeadingLevelComponent;\n\n},{\"Case\":33,\"HeadingSelectorComponent\":10}],10:[function(require,module,exports){\n'use strict';\n\nvar DOM = require('DOM');\n\nvar selector = ['h1', 'h2', 'h3', 'h4', 'h5', 'h6'].join(', ');\n\nvar HeadingSelectorComponent = function HeadingSelectorComponent(context) {\n  return DOM.scry(selector, context);\n};\n\nmodule.exports = HeadingSelectorComponent;\n\n},{\"DOM\":34}],11:[function(require,module,exports){\n'use strict';\n\n/**\n * Read more about this function here: https://github.com/quailjs/quail/wiki/Layout-versus-data-tables\n */\n\nvar DOM = require('DOM');\nvar IsDataTableComponent = function IsDataTableComponent(table) {\n  // If there are less than three rows, why do a table?\n  if (DOM.scry('tr', table).length < 3) {\n    return false;\n  }\n  // If you are scoping a table, it's probably not being used for layout\n  if (DOM.scry('th[scope]', table).length) {\n    return true;\n  }\n  var index;\n  var numberRows = DOM.scry('tr', table).filter(function (element) {\n    return DOM.scry('td', element).length > 0;\n  }).length;\n  // Check for odd cell spanning\n  var spanCells = DOM.scry('td[rowspan], td[colspan]', table);\n  var isDataTable = true;\n  if (spanCells.length) {\n    var spanIndex = {};\n    spanCells.forEach(function (cell) {\n      index = DOM.index(cell);\n      if (typeof spanIndex[index] === 'undefined') {\n        spanIndex[index] = 0;\n      }\n      spanIndex[index]++;\n    });\n    for (var ii in spanIndex) {\n      if (spanIndex.hasOwnProperty(ii)) {\n        var count = spanIndex[ii];\n        if (count < numberRows) {\n          isDataTable = false;\n        }\n      }\n    }\n  }\n  // If there are sub tables, but not in the same column row after row, this is a layout table\n  var subTables = DOM.scry('table', table);\n  if (subTables.length) {\n    var subTablesIndexes = {};\n    subTables.forEach(function (table) {\n      var td = DOM.parent(table, 'td');\n      var parentIndex = DOM.index(td);\n      if (parentIndex !== false && typeof subTablesIndexes[parentIndex] === 'undefined') {\n        subTablesIndexes[parentIndex] = 0;\n      }\n      subTablesIndexes[parentIndex]++;\n    });\n    for (var sii in subTablesIndexes) {\n      if (subTablesIndexes.hasOwnProperty(sii)) {\n        var count = subTablesIndexes[sii];\n        if (count < numberRows) {\n          isDataTable = false;\n        }\n      }\n    }\n  }\n  return isDataTable;\n};\n\nmodule.exports = IsDataTableComponent;\n\n},{\"DOM\":34}],12:[function(require,module,exports){\n'use strict';\n\n/**\n * Helper function to determine if a string of text is even readable.\n * @todo - This will be added to in the future... we should also include\n * phonetic tests.\n */\n\nvar IsUnreadable = function IsUnreadable(text) {\n  if (typeof text !== 'string') {\n    return true;\n  }\n  return text.trim().length ? false : true;\n};\n\nmodule.exports = IsUnreadable;\n\n},{}],13:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LabelComponent = function LabelComponent(test, options) {\n\n  options = options || {};\n\n  test.get('scope').forEach(function (scope) {\n    DOM.scry(options.selector, scope).forEach(function (element) {\n      var label = DOM.scry('label[for=\\\"' + element.getAttribute('id') + '\\\"]', scope)[0];\n      var labelParent = DOM.parents(element).find(function (parent) {\n        return DOM.is(parent, 'label');\n      });\n      var hasLabelText = false;\n      var hasLabelParentText = false;\n      if (label) {\n        hasLabelText = /\\S/.test(label.innerText);\n      }\n      if (labelParent) {\n        hasLabelParentText = /\\S/.test(labelParent.innerText);\n      }\n      if (!hasLabelText && !hasLabelParentText) {\n        test.add(Case({\n          element: element,\n          status: 'failed'\n        }));\n      } else {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      }\n    });\n  });\n};\nmodule.exports = LabelComponent;\n\n},{\"Case\":33,\"DOM\":34}],14:[function(require,module,exports){\n'use strict';\n\nvar LanguageCodesStringsComponent = ['bh', 'bi', 'nb', 'bs', 'br', 'bg', 'my', 'es', 'ca', 'km', 'ch', 'ce', 'ny', 'ny', 'zh', 'za', 'cu', 'cu', 'cv', 'kw', 'co', 'cr', 'hr', 'cs', 'da', 'dv', 'dv', 'nl', 'dz', 'en', 'eo', 'et', 'ee', 'fo', 'fj', 'fi', 'nl', 'fr', 'ff', 'gd', 'gl', 'lg', 'ka', 'de', 'ki', 'el', 'kl', 'gn', 'gu', 'ht', 'ht', 'ha', 'he', 'hz', 'hi', 'ho', 'hu', 'is', 'io', 'ig', 'id', 'ia', 'ie', 'iu', 'ik', 'ga', 'it', 'ja', 'jv', 'kl', 'kn', 'kr', 'ks', 'kk', 'ki', 'rw', 'ky', 'kv', 'kg', 'ko', 'kj', 'ku', 'kj', 'ky', 'lo', 'la', 'lv', 'lb', 'li', 'li', 'li', 'ln', 'lt', 'lu', 'lb', 'mk', 'mg', 'ms', 'ml', 'dv', 'mt', 'gv', 'mi', 'mr', 'mh', 'ro', 'ro', 'mn', 'na', 'nv', 'nv', 'nd', 'nr', 'ng', 'ne', 'nd', 'se', 'no', 'nb', 'nn', 'ii', 'ny', 'nn', 'ie', 'oc', 'oj', 'cu', 'cu', 'cu', 'or', 'om', 'os', 'os', 'pi', 'pa', 'ps', 'fa', 'pl', 'pt', 'pa', 'ps', 'qu', 'ro', 'rm', 'rn', 'ru', 'sm', 'sg', 'sa', 'sc', 'gd', 'sr', 'sn', 'ii', 'sd', 'si', 'si', 'sk', 'sl', 'so', 'st', 'nr', 'es', 'su', 'sw', 'ss', 'sv', 'tl', 'ty', 'tg', 'ta', 'tt', 'te', 'th', 'bo', 'ti', 'to', 'ts', 'tn', 'tr', 'tk', 'tw', 'ug', 'uk', 'ur', 'ug', 'uz', 'ca', 've', 'vi', 'vo', 'wa', 'cy', 'fy', 'wo', 'xh', 'yi', 'yo', 'za', 'zu'];\nmodule.exports = LanguageCodesStringsComponent;\n\n},{}],15:[function(require,module,exports){\n'use strict';\n\nvar DOM = require('DOM');\nvar LanguageComponent = {\n\n  /**\n   * The maximum distance possible between two trigram models.\n   */\n  maximumDistance: 300,\n\n  /**\n   * Regular expressions to capture unicode blocks that are either\n   * explicitly right-to-left or left-to-right.\n   */\n  textDirection: {\n    rtl: /[\\u0600-\\u06FF]|[\\u0750-\\u077F]|[\\u0590-\\u05FF]|[\\uFE70-\\uFEFF]/mg,\n    ltr: /[\\u0041-\\u007A]|[\\u00C0-\\u02AF]|[\\u0388-\\u058F]/mg\n  },\n\n  /**\n   * Special characters that indicate text direction changes.\n   */\n  textDirectionChanges: {\n    rtl: /[\\u200E]|&rlm;/mg,\n    ltr: /[\\u200F]|&lrm;/mg\n  },\n\n  /**\n   * List of single-script blocks that encapsulate a list of languages.\n   */\n  scripts: {\n    basicLatin: {\n      regularExpression: /[\\u0041-\\u007F]/g,\n      languages: ['ceb', 'en', 'eu', 'ha', 'haw', 'id', 'la', 'nr', 'nso', 'so', 'ss', 'st', 'sw', 'tlh', 'tn', 'ts', 'xh', 'zu', 'af', 'az', 'ca', 'cs', 'cy', 'da', 'de', 'es', 'et', 'fi', 'fr', 'hr', 'hu', 'is', 'it', 'lt', 'lv', 'nl', 'no', 'pl', 'pt', 'ro', 'sk', 'sl', 'sq', 'sv', 'tl', 'tr', 've', 'vi']\n    },\n    arabic: {\n      regularExpression: /[\\u0600-\\u06FF]/g,\n      languages: ['ar', 'fa', 'ps', 'ur']\n    },\n    cryllic: {\n      regularExpression: /[\\u0400-\\u04FF]|[\\u0500-\\u052F]/g,\n      languages: ['bg', 'kk', 'ky', 'mk', 'mn', 'ru', 'sr', 'uk', 'uz']\n    }\n  },\n\n  /**\n   * List of regular expressions that capture only unicode text blocks that are\n   * associated with a single language.\n   */\n  scriptSingletons: {\n    bn: /[\\u0980-\\u09FF]/g,\n    bo: /[\\u0F00-\\u0FFF]/g,\n    el: /[\\u0370-\\u03FF]/g,\n    gu: /[\\u0A80-\\u0AFF]/g,\n    he: /[\\u0590-\\u05FF]/g,\n    hy: /[\\u0530-\\u058F]/g,\n    ja: /[\\u3040-\\u309F]|[\\u30A0-\\u30FF]/g,\n    ka: /[\\u10A0-\\u10FF]/g,\n    km: /[\\u1780-\\u17FF]|[\\u19E0-\\u19FF]/g,\n    kn: /[\\u0C80-\\u0CFF]/g,\n    ko: /[\\u1100-\\u11FF]|[\\u3130-\\u318F]|[\\uAC00-\\uD7AF]/g,\n    lo: /[\\u0E80-\\u0EFF]/g,\n    ml: /[\\u0D00-\\u0D7F]/g,\n    mn: /[\\u1800-\\u18AF]/g,\n    or: /[\\u0B00-\\u0B7F]/g,\n    pa: /[\\u0A00-\\u0A7F]/g,\n    si: /[\\u0D80-\\u0DFF]/g,\n    ta: /[\\u0B80-\\u0BFF]/g,\n    te: /[\\u0C00-\\u0C7F]/g,\n    th: /[\\u0E00-\\u0E7F]/g,\n    zh: /[\\u3100-\\u312F]|[\\u2F00-\\u2FDF]/g\n  },\n\n  /**\n   * Determines the document's language by looking at\n   * first the browser's default, then the HTML element's 'lang' attribute,\n   * then the 'lang' attribute of the element passed to quail.\n   */\n  getDocumentLanguage: function getDocumentLanguage(scope, returnIso) {\n    var language = navigator.language || navigator.userLanguage;\n    var langScope = DOM.parents(scope).find(function (parent) {\n      return DOM.hasAttribute(parent, 'lang');\n    })[0];\n    if (langScope) {\n      language = DOM.getAttribute(langScope, 'lang');\n    }\n    var langAttr = DOM.getAttribute(scope, 'lang');\n    language = langAttr || language || '';\n    language = language.toLowerCase().trim();\n    if (returnIso) {\n      return language.split('-')[0];\n    }\n    return language;\n  }\n};\nmodule.exports = LanguageComponent;\n\n},{\"DOM\":34}],16:[function(require,module,exports){\n\"use strict\";\n\nvar NewWindowStringsComponent = [/new (browser )?(window|frame)/, /popup (window|frame)/];\nmodule.exports = NewWindowStringsComponent;\n\n},{}],17:[function(require,module,exports){\n'use strict';\n\n/**\n * Placeholder test - checks that an attribute or the content of an\n * element itself is not a placeholder (i.e. 'click here' for links).\n */\n\nvar Case = require('Case');\nvar CleanStringComponent = require('CleanStringComponent');\nvar IsUnreadable = require('IsUnreadable');\nvar PlaceholdersStringsComponent = require('PlaceholdersStringsComponent');\nvar DOM = require('DOM');\n\nvar PlaceholderComponent = function PlaceholderComponent(test, options) {\n\n  var resolve = function resolve(element, resolution) {\n    test.add(Case({\n      element: element,\n      status: resolution\n    }));\n  };\n\n  test.get('scope').forEach(function (scope) {\n    DOM.scry(options.selector, scope).forEach(function (element) {\n      var text = '';\n      if (element.style.display === 'none' && !DOM.is(element, 'title')) {\n        resolve(element, 'inapplicable');\n        return;\n      }\n      if (typeof options.attribute !== 'undefined') {\n        if ((typeof DOM.getAttribute(element, options.attribute) === 'undefined' || options.attribute === 'tabindex' && DOM.getAttribute(element, options.attribute) <= 0) && !options.content) {\n          resolve(element, 'failed');\n          return;\n        } else {\n          if (DOM.getAttribute(element, options.attribute) && DOM.getAttribute(element, options.attribute) !== 'undefined') {\n            text += DOM.getAttribute(element, options.attribute);\n          }\n        }\n      }\n      if (typeof options.attribute === 'undefined' || !options.attribute || options.content) {\n        text += DOM.text(element);\n        DOM.scry('img[alt]', element).forEach(function (element) {\n          text += element.getAttribute('alt');\n        });\n      }\n      if (typeof text === 'string' && text.length > 0) {\n        text = CleanStringComponent(text);\n        var regex = /^([0-9]*)(k|kb|mb|k bytes|k byte)$/g;\n        var regexResults = regex.exec(text.toLowerCase());\n        if (regexResults && regexResults[0].length) {\n          resolve(element, 'failed');\n        } else if (options.empty && IsUnreadable(text)) {\n          resolve(element, 'failed');\n        } else if (PlaceholdersStringsComponent.indexOf(text) > -1) {\n          resolve(element, 'failed');\n        }\n        // It passes.\n        else {\n            resolve(element, 'passed');\n          }\n      } else {\n        if (options.empty && typeof text !== 'number') {\n          resolve(element, 'failed');\n        }\n      }\n    });\n  });\n};\nmodule.exports = PlaceholderComponent;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34,\"IsUnreadable\":12,\"PlaceholdersStringsComponent\":18}],18:[function(require,module,exports){\n'use strict';\n\nvar PlaceholdersStringsComponent = ['title', 'untitled', 'untitled document', 'this is the title', 'the title', 'content', ' ', 'new page', 'new', 'nbsp', '&nbsp;', 'spacer', 'image', 'img', 'photo', 'frame', 'frame title', 'iframe', 'iframe title', 'legend'];\nmodule.exports = PlaceholdersStringsComponent;\n\n},{}],19:[function(require,module,exports){\n'use strict';\n\nvar RedundantStringsComponent = {\n  inputImage: ['submit', 'button'],\n  link: ['link to', 'link', 'go to', 'click here', 'link', 'click', 'more'],\n  required: ['*']\n};\nmodule.exports = RedundantStringsComponent;\n\n},{}],20:[function(require,module,exports){\n'use strict';\n\nvar SiteMapStringsComponent = ['site map', 'map', 'sitemap'];\nmodule.exports = SiteMapStringsComponent;\n\n},{}],21:[function(require,module,exports){\n\"use strict\";\n\nvar SkipContentStringsComponent = [/(jump|skip) (.*) (content|main|post)/i];\nmodule.exports = SkipContentStringsComponent;\n\n},{}],22:[function(require,module,exports){\n'use strict';\n\n/**\n * Suspect CSS styles that might indicate a paragraph tag is being used as a header.\n */\n\nvar SuspectPCSSStyles = ['color', 'font-weight', 'font-size', 'font-family'];\n\nmodule.exports = SuspectPCSSStyles;\n\n},{}],23:[function(require,module,exports){\n'use strict';\n\n/**\n * Suspect tags that would indicate a paragraph is being used as a header.\n */\n\nvar SuspectPHeaderTags = ['strong', 'b', 'em', 'i', 'u', 'font'];\n\nmodule.exports = SuspectPHeaderTags;\n\n},{}],24:[function(require,module,exports){\n'use strict';\n\nvar SuspiciousLinksStringsComponent = ['click here', 'click', 'more', 'here', 'read more', 'download', 'add', 'delete', 'clone', 'order', 'view', 'read', 'clic aqu&iacute;', 'clic', 'haga clic', 'm&aacute;s', 'aqu&iacute;', 'image'];\nmodule.exports = SuspiciousLinksStringsComponent;\n\n},{}],25:[function(require,module,exports){\n'use strict';\n\nvar SymbolsStringsComponent = ['|', '*', /\\*/g, '<br>*', '&bull;', '&#8226', '♦', '›', '»', '‣', '▶', '.', '◦', '✓', '◽', '•', '—', '◾'];\nmodule.exports = SymbolsStringsComponent;\n\n},{}],26:[function(require,module,exports){\n'use strict';\n\nvar DOM = require('DOM');\n\nvar scopeValues = ['row', 'col', 'rowgroup', 'colgroup'];\n\nfunction isColumnHeader(tableMap, cell, x, y) {\n  var height = cell.getAttribute('rowspan') || 1;\n  var scope = cell.getAttribute('scope');\n  if (scope === 'col') {\n    return true;\n  } else if (scopeValues.indexOf(scope) !== -1) {\n    return false;\n  }\n\n  for (var i = 0; i < height * tableMap[y].length - 1; i += 1) {\n    var currCell = tableMap[y + i % height][~ ~(i / height)];\n    if (DOM.is(currCell, 'td')) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction isRowHeader(tableMap, cell, x, y) {\n  var width = cell.getAttribute('colspan') || 1;\n  var scope = cell.getAttribute('scope');\n\n  if (scope === 'row') {\n    return true;\n  } else if (scopeValues.indexOf(scope) !== -1 || isColumnHeader(tableMap, cell, x, y)) {\n    return false;\n  }\n\n  for (var i = 0; i < width * tableMap.length - 1; i += 1) {\n    var currCell = tableMap[~ ~(i / width)][x + i % width];\n    if (DOM.is(currCell, 'td')) {\n      return false;\n    }\n  }\n  return true;\n}\n\nfunction scanHeaders(tableMap, x, y, deltaX, deltaY) {\n  var headerList = [];\n  var cell = tableMap[y][x];\n  var opaqueHeaders = [];\n  var inHeaderBlock;\n  var headersFromCurrBlock;\n\n  if (DOM.is(cell, 'th')) {\n    headersFromCurrBlock = [{\n      cell: cell,\n      x: x,\n      y: y\n    }];\n\n    inHeaderBlock = true;\n  } else {\n    inHeaderBlock = false;\n    headersFromCurrBlock = [];\n  }\n\n  for (; x >= 0 && y >= 0; x += deltaX, y += deltaY) {\n    var currCell = tableMap[y][x];\n    var dir = deltaX === 0 ? 'col' : 'row';\n\n    if (DOM.is(currCell, 'th')) {\n      inHeaderBlock = true;\n      headersFromCurrBlock.push({\n        cell: currCell,\n        x: x,\n        y: y\n      });\n      var blocked = false;\n      if (deltaY === -1 && isRowHeader(tableMap, currCell, x, y) || deltaX === -1 && isColumnHeader(tableMap, currCell, x, y)) {\n        blocked = true;\n      } else {\n        opaqueHeaders.forEach(function (opaqueHeader) {\n          var currSize = +currCell.getAttribute(dir + 'span') || 1;\n          var opaqueSize = +DOM.getAttribute(opaqueHeader.cell, dir + 'span') || 1;\n          if (currSize === opaqueSize) {\n            if (deltaY === -1 && opaqueHeader.x === x || deltaX === -1 && opaqueHeader.y === y) {\n              blocked = true;\n            }\n          }\n        });\n      }\n      if (blocked === false) {\n        headerList.push(currCell);\n      }\n    } else if (DOM.is(currCell, 'td') && inHeaderBlock === true) {\n      inHeaderBlock = false;\n      opaqueHeaders.push(headersFromCurrBlock);\n      headersFromCurrBlock = [];\n    }\n  }\n  return headerList;\n}\n\n/**\n * Get header cells based on the headers getAttributeibute of a cell\n */\nfunction getHeadersFromAttr(cell) {\n  var table = DOM.parents(cell).find(function (parent) {\n    return DOM.is(parent, 'table');\n  })[0];\n  var ids = cell.getAttribute('headers').split(/\\s/);\n  var headerCells = [];\n  // For each IDREF select an element with that ID from the table\n  // Only th/td cells in the same table can be headers\n  ids.forEach(function (id) {\n    headerCells.push(DOM.scry('th#' + id + ', td#' + id, table));\n  });\n  return headerCells;\n}\n\nfunction findCellInTableMap(tableMap, cell) {\n  var i = 0;\n  var y = 0;\n  var x;\n  // Locate the x and y coordinates of the current cell\n  while (x === undefined) {\n    if (tableMap[y] === undefined) {\n      return;\n    } else if (tableMap[y][i] === cell[0]) {\n      x = i;\n    } else if (i + 1 === tableMap[y].length) {\n      y += 1;\n      i = 0;\n    } else {\n      i += 1;\n    }\n  }\n  return { x: x, y: y };\n}\n\nfunction getHeadersFromScope(cell, tableMap) {\n  var i;\n  var headerCells = [];\n  var coords = findCellInTableMap(tableMap, cell);\n\n  // Grab the width and height, undefined, invalid or 0 become 1\n  var height = +cell.getAttribute('rowspan') || 1;\n  var width = +cell.getAttribute('colspan') || 1;\n\n  for (i = 0; i < width; i++) {\n    headerCells.push(scanHeaders(tableMap, coords.x + i, coords.y, 0, -1));\n  }\n\n  for (i = 0; i < height; i++) {\n    headerCells.push(scanHeaders(tableMap, coords.x, coords.y + i, -1, 0));\n  }\n  return headerCells;\n}\n\nfunction getHeadersFromGroups(cell, tableMap) {\n  var cellCoords = findCellInTableMap(tableMap, cell);\n  var headers = [];\n  var parents = DOM.parents(cell);\n  var thead = parents.find(function (parent) {\n    return DOM.is(parent, 'thead');\n  });\n  var tbody = parents.find(function (parent) {\n    return DOM.is(parent, 'tbody');\n  });\n  var tfoot = parents.find(function (parent) {\n    return DOM.is(parent, 'tfoot');\n  });\n  DOM.scry('th[scope=rowgroup]', [thead, tbody, tfoot]).forEach(function (element) {\n    var headerCoords = findCellInTableMap(tableMap, element);\n    if (headerCoords.x <= cellCoords.x && headerCoords.y <= cellCoords.y) {\n      headers.push(element);\n    }\n  });\n\n  // TODO colgroups\n}\nvar TableHeadersComponent = {\n  getTableMap: function getTableMap(table) {\n    var map = [];\n    DOM.scry('tr', table).forEach(function (element, y) {\n      if (typeof map[y] === 'undefined') {\n        map[y] = [];\n      }\n      var row = map[y];\n      DOM.children(element).forEach(function (cell) {\n        var x;\n        var i, il;\n\n        // Grab the width and height, undefined, invalid or 0 become 1\n        var height = +cell.getAttribute('rowspan') || 1;\n        var width = +cell.getAttribute('colspan') || 1;\n        // Make x the first undefined cell in the row\n        for (i = 0, il = row.length; i <= il; i += 1) {\n          if (x === undefined && row[i] === undefined) {\n            x = i;\n          }\n        }\n        // add 'this' to each coordinate in the map based on width and height\n        for (i = 0, il = width * height; i < il; i += 1) {\n          // Create a new row if it doesn't exist yet\n          if (map[y + ~ ~(i / width)] === undefined) {\n            map[y + ~ ~(i / width)] = [];\n          }\n          // Add the cell to the correct x / y coordinates\n          map[y + ~ ~(i / width)][x + i % width] = cell;\n        }\n      });\n    });\n    return map;\n  },\n\n  tableHeaders: function tableHeaders(elements) {\n    var headers = [];\n    elements.forEach(function (element) {\n      if (!DOM.is(element, 'td, th')) {\n        return;\n      }\n\n      if (element.hasAttribute('headers')) {\n        headers.push(getHeadersFromAttr(element));\n      } else {\n        var table = DOM.closest(element, 'table');\n        var map = TableHeadersComponent.getTableMap(table);\n        headers.push(getHeadersFromScope(element, map));\n        headers.push(getHeadersFromGroups(element, map));\n      }\n    });\n    return headers.filter(function (header) {\n      return (/\\S/.test(header.innerHTML)\n      );\n    });\n  }\n};\n\nmodule.exports = TableHeadersComponent;\n\n},{\"DOM\":34}],27:[function(require,module,exports){\n\"use strict\";\n\n/**\n * Returns DOM nodes that contain at least one text node.\n */\n\nvar TextNodeFilterComponent = function TextNodeFilterComponent(element) {\n  var nodes = Array.prototype.slice.call(element.childNodes);\n  var hasTextNode = false;\n  var node;\n  for (var i = 0, il = nodes.length; i < il; ++i) {\n    node = nodes[i];\n    // Determine if,\n    // 1) this is a text node, and\n    // 2) it has content other than whitespace.\n    if (node.nodeType === 3 && /\\S/.test(node.textContent)) {\n      hasTextNode = true;\n      break;\n    }\n  }\n  return hasTextNode;\n};\nmodule.exports = TextNodeFilterComponent;\n\n},{}],28:[function(require,module,exports){\n'use strict';\n\n/**\n * A list of HTML elements that can contain actual text.\n */\n\nvar TextSelectorComponent = ['tt', 'i', 'b', 'big', 'small', 'em', 'strong', 'dfn', 'code', 'samp', 'kbd', 'var', 'cite', 'abbr', 'acronym', 'sub', 'sup', 'span', 'bdo', 'address', 'div', 'a', 'object', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'pre', 'q', 'ins', 'del', 'dt', 'dd', 'li', 'label', 'option', 'textarea', 'fieldset', 'legend', 'button', 'caption', 'td', 'th'].join(', ');\nmodule.exports = TextSelectorComponent;\n\n},{}],29:[function(require,module,exports){\n'use strict';\n\n/**\n * Utility object that runs text statistics, like sentence count,\n * reading level, etc.\n */\n\nvar TextStatisticsComponent = {\n\n  cleanText: function cleanText(text) {\n    return text.replace(/[,:;()\\-]/, ' ').replace(/[\\.!?]/, '.').replace(/[ ]*(\\n|\\r\\n|\\r)[ ]*/, ' ').replace(/([\\.])[\\. ]+/, '$1').replace(/[ ]*([\\.])/, '$1').replace(/[ ]+/, ' ').toLowerCase();\n  },\n\n  sentenceCount: function sentenceCount(text) {\n    return text.split('.').length + 1;\n  },\n\n  wordCount: function wordCount(text) {\n    return text.split(' ').length + 1;\n  },\n\n  averageWordsPerSentence: function averageWordsPerSentence(text) {\n    return this.wordCount(text) / this.sentenceCount(text);\n  },\n\n  averageSyllablesPerWord: function averageSyllablesPerWord(text) {\n    var that = this;\n    var count = 0;\n    var wordCount = that.wordCount(text);\n    if (!wordCount) {\n      return 0;\n    }\n    text.split(' ').forEach(function (word) {\n      count += that.syllableCount(word);\n    });\n    return count / wordCount;\n  },\n\n  syllableCount: function syllableCount(word) {\n    var matchedWord = word.replace(/(?:[^laeiouy]es|ed|[^laeiouy]e)$/, '').match(/[aeiouy]{1,2}/g);\n    if (!matchedWord || matchedWord.length === 0) {\n      return 1;\n    }\n    return matchedWord.length;\n  }\n};\nmodule.exports = TextStatisticsComponent;\n\n},{}],30:[function(require,module,exports){\n'use strict';\n\n/**\n * Helper function to determine if a given URL is even valid.\n */\n\nvar ValidURLComponent = function ValidURLComponent(url) {\n  return url.search(' ') === -1;\n};\n\nmodule.exports = ValidURLComponent;\n\n},{}],31:[function(require,module,exports){\n'use strict';\n\n/**\n* Helper object that tests videos.\n* @todo - allow this to be exteded more easily.\n*/\n\nvar AJAX = require('AJAX');\nvar DOM = require('DOM');\nvar Language = require('LanguageComponent');\n\nvar VideoComponent = {\n\n  /**\n   * Iterates over listed video providers and runs their `isVideo` method.\n   * @param Element element\n   *\n   * @return Boolean\n   *   Whether the element is a video.\n   */\n  isVideo: function isVideo(element) {\n    var isVideo = false;\n    for (var name in this.providers) {\n      if (this.providers.hasOwnProperty(name)) {\n        var provider = this.providers[name];\n        if (DOM.is(element, provider.selector) && provider.isVideo(element)) {\n          isVideo = true;\n        }\n      }\n    }\n    return isVideo;\n  },\n\n  findVideos: function findVideos(element, callback) {\n    for (var name in this.providers) {\n      if (this.providers.hasOwnProperty(name)) {\n        var provider = this.providers[name];\n        DOM.scry(provider.selector, element).forEach(function (video) {\n          if (provider.isVideo(video)) {\n            provider.hasCaptions(video, callback);\n          }\n        });\n      }\n    }\n  },\n\n  providers: {\n\n    youTube: {\n\n      selector: 'a, iframe',\n\n      apiUrl: 'http://gdata.youtube.com/feeds/api/videos/?q=%video&caption&v=2&alt=json',\n\n      isVideo: function isVideo(element) {\n        return this.getVideoId(element) !== false ? true : false;\n      },\n\n      getVideoId: function getVideoId(element) {\n        var attribute = DOM.is(element, 'iframe') ? 'src' : 'href';\n        var regExp = /^.*((youtu.be\\/)|(v\\/)|(\\/u\\/\\w\\/)|(embed\\/)|(watch\\?))\\??v?=?([^#&\\?]*).*/;\n        var match = DOM.getAttribute(element, attribute).match(regExp);\n        if (match && match[7].length === 11) {\n          return match[7];\n        }\n        return false;\n      },\n\n      hasCaptions: function hasCaptions(element, callback) {\n        var videoId = this.getVideoId(element);\n        var request = new AJAX(this.apiUrl.replace('%video', videoId));\n        request.then(function (raw) {\n          var data = JSON.parse(raw);\n          callback(element, data.feed.openSearch$totalResults.$t > 0);\n        });\n      }\n    },\n\n    flash: {\n\n      selector: 'object',\n\n      isVideo: function isVideo(element) {\n        var isVideo = false;\n        if (DOM.scry('param', element).length === 0) {\n          return false;\n        }\n        DOM.scry('param[name=flashvars]', element).forEach(function (element) {\n          if (element.getAttribute('value').search(/\\.(flv|mp4)/i) > -1) {\n            isVideo = true;\n          }\n        });\n        return isVideo;\n      },\n\n      hasCaptions: function hasCaptions(element, callback) {\n        var hasCaptions = false;\n        DOM.scry('param[name=flashvars]', element).forEach(function (element) {\n          var val = element.getAttribute('value') || '';\n          if (val.search('captions') > -1 && val.search('.srt') > -1 || val.search('captions.pluginmode') > -1) {\n            hasCaptions = true;\n          }\n        });\n        callback(element, hasCaptions);\n      }\n    },\n\n    videoElement: {\n\n      selector: 'video',\n\n      isVideo: function isVideo(element) {\n        return DOM.is(element, 'video');\n      },\n\n      hasCaptions: function hasCaptions(element, callback) {\n        var $captions = DOM.scry('track[kind=subtitles], track[kind=captions]', element);\n        if (!$captions.length) {\n          callback(element, false);\n          return;\n        }\n        var language = Language.getDocumentLanguage(element, true);\n        var langScope = DOM.parents(element).find(function (parent) {\n          return DOM.hasAttribute(parent, 'lang');\n        })[0];\n        if (langScope) {\n          language = DOM.getAttribute(langScope, 'lang').split('-')[0];\n        }\n        $captions.forEach(function (caption) {\n          var srclang = caption.getAttribute('srclang');\n          if (!srclang || srclang.toLowerCase() === language) {\n            var request = new AJAX(DOM.getAttribute(caption, 'src'));\n            request.then(function () {\n              callback(element, true);\n            }, function () {\n              callback(element, false);\n            });\n          }\n        });\n      }\n    }\n  }\n\n};\n\nmodule.exports = VideoComponent;\n\n},{\"AJAX\":32,\"DOM\":34,\"LanguageComponent\":15}],32:[function(require,module,exports){\n'use strict';\n\nvar _createClass = function () {\n  function defineProperties(target, props) {\n    for (var i = 0; i < props.length; i++) {\n      var descriptor = props[i];descriptor.enumerable = descriptor.enumerable || false;descriptor.configurable = true;if (\"value\" in descriptor) descriptor.writable = true;Object.defineProperty(target, descriptor.key, descriptor);\n    }\n  }return function (Constructor, protoProps, staticProps) {\n    if (protoProps) defineProperties(Constructor.prototype, protoProps);if (staticProps) defineProperties(Constructor, staticProps);return Constructor;\n  };\n}();\n\nfunction _classCallCheck(instance, Constructor) {\n  if (!(instance instanceof Constructor)) {\n    throw new TypeError(\"Cannot call a class as a function\");\n  }\n}\n\nvar Q = require('q');\n\nvar AJAX = function () {\n  function AJAX(url, type) {\n    _classCallCheck(this, AJAX);\n\n    var contentType = this._resolveContentType(type);\n\n    return Q.Promise(function (resolve, reject, notify) {\n      var request = new XMLHttpRequest();\n\n      function onReadyStateChange() {\n        if (type === 'HEAD' && request.readyState === 2) {\n          resolve(request.getAllResponseHeaders());\n        } else if (request.readyState === 4) {\n          if ([200, 301, 302].indexOf(request.status) > -1) {\n            resolve(request.responseText);\n          } else {\n            reject('Request failed: ' + request.status);\n          }\n        }\n      }\n\n      function onError() {\n        reject('AJAX request to \\'' + url + '\\' failed: ' + JSON.stringify(url));\n      }\n\n      function onProgress(event) {\n        notify(event.loaded / event.total);\n      }\n\n      request.open('GET', url, true);\n      request.setRequestHeader('Content-Type', contentType);\n      request.onreadystatechange = onReadyStateChange;\n      request.onerror = onError;\n      request.onprogress = onProgress;\n      request.send();\n    });\n  }\n\n  _createClass(AJAX, [{\n    key: '_resolveContentType',\n    value: function _resolveContentType(name) {\n      var type = undefined;\n      switch (name) {\n        case 'json':\n          type = 'application/json';\n          break;\n        default:\n          type = 'text/html';\n      }\n      return type;\n    }\n  }]);\n\n  return AJAX;\n}();\n\nmodule.exports = AJAX;\n\n},{\"q\":239}],33:[function(require,module,exports){\n'use strict';\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _typeof(obj) {\n  return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n}\n\n/**\n * @providesModule Case\n */\nvar DOM = require('DOM');\nvar Case = function () {\n\n  /**\n   * A Case is a test against an element.\n   */\n  function Case(attributes) {\n    return new Case.fn.init(attributes);\n  }\n\n  // Prototype object of the Case.\n  Case.fn = Case.prototype = {\n    constructor: Case,\n    init: function init(attributes) {\n      this.listeners = {};\n      this.timeout = null;\n      this.attributes = attributes || {};\n\n      var that = this;\n      // Dispatch a resolve event if the case is initiated with a status.\n      if (this.attributes.status) {\n        // Delay the status dispatch to the next execution cycle so that the\n        // Case will register listeners in this execution cycle first.\n        setTimeout(function () {\n          that.resolve();\n        }, 0);\n      }\n      // Set up a time out for this case to resolve within.\n      else {\n          this.attributes.status = 'untested';\n          this.timeout = setTimeout(function () {\n            that.giveup();\n          }, 350);\n        }\n\n      return this;\n    },\n    // Details of the Case.\n    attributes: null,\n    get: function get(attr) {\n      return this.attributes[attr];\n    },\n    set: function set(attr, value) {\n      var isStatusChanged = false;\n      // Allow an object of attributes to be passed in.\n      if ((typeof attr === 'undefined' ? 'undefined' : _typeof(attr)) === 'object') {\n        for (var prop in attr) {\n          if (attr.hasOwnProperty(prop)) {\n            if (prop === 'status') {\n              isStatusChanged = true;\n            }\n            this.attributes[prop] = attr[prop];\n          }\n        }\n      }\n      // Assign a single attribute value.\n      else {\n          if (attr === 'status') {\n            isStatusChanged = true;\n          }\n          this.attributes[attr] = value;\n        }\n\n      if (isStatusChanged) {\n        this.resolve();\n      }\n      return this;\n    },\n    /**\n     * A test that determines if a case has one of a set of statuses.\n     *\n     * @return boolean\n     *   A bit that indicates if the case has one of the supplied statuses.\n     */\n    hasStatus: function hasStatus(statuses) {\n      // This is a rought test of arrayness.\n      if ((typeof statuses === 'undefined' ? 'undefined' : _typeof(statuses)) !== 'object') {\n        statuses = [statuses];\n      }\n      var status = this.get('status');\n      for (var i = 0, il = statuses.length; i < il; ++i) {\n        if (statuses[i] === status) {\n          return true;\n        }\n      }\n      return false;\n    },\n    /**\n     * Dispatches the resolve event; clears the timeout fallback event.\n     */\n    resolve: function resolve() {\n      clearTimeout(this.timeout);\n\n      var el = this.attributes.element;\n      var outerEl;\n\n      // Get a selector and HTML if an element is provided.\n      if (el && el.nodeType && el.nodeType === 1) {\n        // Allow a test to provide a selector. Programmatically find one if none\n        // is provided.\n        this.attributes.selector = this.defineUniqueSelector(el);\n\n        // Get a serialized HTML representation of the element the raised the error\n        // if the Test did not provide it.\n        if (!this.attributes.html) {\n          this.attributes.html = '';\n\n          // If the element is either the <html> or <body> elements,\n          // just report that. Otherwise we might be returning the entire page\n          // as a string.\n          if (el.nodeName === 'HTML' || el.nodeName === 'BODY') {\n            this.attributes.html = '<' + el.nodeName + '>';\n          }\n          // Get the parent node in order to get the innerHTML for the selected\n          // element. Trim wrapping whitespace, remove linebreaks and spaces.\n          else if (typeof el.outerHTML === 'string') {\n              outerEl = el.outerHTML.trim().replace(/(\\r\\n|\\n|\\r)/gm, '').replace(/>\\s+</g, '><');\n              // Guard against insanely long elements.\n              // @todo, make this length configurable eventually.\n              if (outerEl.length > 200) {\n                outerEl = outerEl.substr(0, 200) + '... [truncated]';\n              }\n              this.attributes.html = outerEl;\n            }\n        }\n      }\n\n      this.dispatch('resolve', this);\n    },\n    /**\n     * Abandons the Case if it not resolved within the timeout period.\n     */\n    giveup: function giveup() {\n      clearTimeout(this.timeout);\n      // @todo, the set method should really have a 'silent' option.\n      this.attributes.status = 'untested';\n      this.dispatch('timeout', this);\n    },\n    // @todo, make this a set of methods that all classes extend.\n    listenTo: function listenTo(dispatcher, eventName, handler) {\n      handler = handler.bind(this);\n      dispatcher.registerListener.call(dispatcher, eventName, handler);\n    },\n    registerListener: function registerListener(eventName, handler) {\n      if (!this.listeners[eventName]) {\n        this.listeners[eventName] = [];\n      }\n      this.listeners[eventName].push(handler);\n    },\n    dispatch: function dispatch(eventName) {\n      if (this.listeners[eventName] && this.listeners[eventName].length) {\n        var eventArgs = [].slice.call(arguments);\n        this.listeners[eventName].forEach(function (handler) {\n          // Pass any additional arguments from the event dispatcher to the\n          // handler function.\n          handler.apply(null, eventArgs);\n        });\n      }\n    },\n\n    /**\n     * Creates a page-unique selector for the selected DOM element.\n     *\n     * @param {jQuery} element\n     *   An element in a jQuery wrapper.\n     *\n     * @return {string}\n     *   A unique selector for this element.\n     */\n    defineUniqueSelector: function defineUniqueSelector(element) {\n      /**\n       * Indicates whether the selector string represents a unique DOM element.\n       *\n       * @param {string} selector\n       *   A string selector that can be used to query a DOM element.\n       *\n       * @return Boolean\n       *   Whether or not the selector string represents a unique DOM element.\n       */\n      function isUniquePath(selector) {\n        return DOM.scry(selector).length === 1;\n      }\n\n      /**\n       * Creates a selector from the element's id attribute.\n       *\n       * Temporary IDs created by the module that contain \"visitorActions\" are excluded.\n       *\n       * @param {HTMLElement} element\n       *\n       * @return {string}\n       *   An id selector or an empty string.\n       */\n      function applyID(element) {\n        var selector = '';\n        var id = element.id || '';\n        if (id.length > 0) {\n          selector = '#' + id;\n        }\n        return selector;\n      }\n\n      /**\n       * Creates a selector from classes on the element.\n       *\n       * Classes with known functional components like the word 'active' are\n       * excluded because these often denote state, not identity.\n       *\n       * @param {HTMLElement} element\n       *\n       * @return {string}\n       *   A selector of classes or an empty string.\n       */\n      function applyClasses(element) {\n        var selector = '';\n        // Try to make a selector from the element's classes.\n        var classes = element.className || '';\n        if (classes.length > 0) {\n          classes = classes.split(/\\s+/);\n          // Filter out classes that might represent state.\n          classes = reject(classes, function (cl) {\n            return (/active|enabled|disabled|first|last|only|collapsed|open|clearfix|processed/.test(cl)\n            );\n          });\n          if (classes.length > 0) {\n            return '.' + classes.join('.');\n          }\n        }\n        return selector;\n      }\n\n      /**\n       * Finds attributes on the element and creates a selector from them.\n       *\n       * @param {HTMLElement} element\n       *\n       * @return {string}\n       *   A selector of attributes or an empty string.\n       */\n      function applyAttributes(element) {\n        var selector = '';\n        // Whitelisted attributes to include in a selector to disambiguate it.\n        var attributes = ['href', 'type', 'title', 'alt'];\n        var value;\n        if (typeof element === 'undefined' || typeof element.attributes === 'undefined' || element.attributes === null) {\n          return selector;\n        }\n        // Try to make a selector from the element's classes.\n        for (var i = 0, len = attributes.length; i < len; i++) {\n          value = element.attributes[attributes[i]] && element.attributes[attributes[i]].value;\n          if (value) {\n            selector += '[' + attributes[i] + '=\"' + value + '\"]';\n          }\n        }\n        return selector;\n      }\n\n      /**\n       * Creates a unique selector using id, classes and attributes.\n       *\n       * It is possible that the selector will not be unique if there is no\n       * unique description using only ids, classes and attributes of an\n       * element that exist on the page already. If uniqueness cannot be\n       * determined and is required, you will need to add a unique identifier\n       * to the element through theming development.\n       *\n       * @param {HTMLElement} element\n       *\n       * @return {string}\n       *   A unique selector for the element.\n       */\n      function generateSelector(element) {\n        var selector = '';\n        var scopeSelector = '';\n        var pseudoUnique = false;\n        var firstPass = true;\n\n        do {\n          scopeSelector = '';\n          // Try to apply an ID.\n          if ((scopeSelector = applyID(element)).length > 0) {\n            selector = scopeSelector + ' ' + selector;\n            // Assume that a selector with an ID in the string is unique.\n            break;\n          }\n\n          // Try to apply classes.\n          if (!pseudoUnique && (scopeSelector = applyClasses(element)).length > 0) {\n            // If the classes don't create a unique path, tack them on and\n            // continue.\n            selector = scopeSelector + ' ' + selector;\n            // If the classes do create a unique path, mark this selector as\n            // pseudo unique. We will keep attempting to find an ID to really\n            // guarantee uniqueness.\n            if (isUniquePath(selector)) {\n              pseudoUnique = true;\n            }\n          }\n\n          // Process the original element.\n          if (firstPass) {\n            // Try to add attributes.\n            if ((scopeSelector = applyAttributes(element)).length > 0) {\n              // Do not include a space because the attributes qualify the\n              // element. Append classes if they exist.\n              selector = scopeSelector + selector;\n            }\n\n            // Add the element nodeName.\n            selector = element.nodeName.toLowerCase() + selector;\n\n            // The original element has been processed.\n            firstPass = false;\n          }\n\n          // Try the parent element to apply some scope.\n          element = element.parentNode;\n        } while (element && element.nodeType === 1 && element.nodeName !== 'BODY' && element.nodeName !== 'HTML');\n\n        return selector.trim();\n      }\n\n      /**\n       * Helper function to filter items from a list that pass the comparator\n       * test.\n       *\n       * @param {Array} list\n       * @param {function} comparator\n       *   A function that return a boolean. True means the list item will be\n       *   discarded from the list.\n       * @return array\n       *   A list of items the excludes items that passed the comparator test.\n       */\n      function reject(list, comparator) {\n        var keepers = [];\n        for (var i = 0, il = list.length; i < il; i++) {\n          if (!comparator.call(null, list[i])) {\n            keepers.push(list[i]);\n          }\n        }\n        return keepers;\n      }\n\n      return element && generateSelector(element);\n    },\n    push: [].push,\n    sort: [].sort,\n    concat: [].concat,\n    splice: [].splice\n  };\n\n  // Give the init function the Case prototype.\n  Case.fn.init.prototype = Case.fn;\n\n  return Case;\n}();\nmodule.exports = Case;\n\n},{\"DOM\":34}],34:[function(require,module,exports){\n'use strict';\n\n/**\n * Wrapper library for DOM operations.\n */\n\nvar DataSet = require('data-set');\nvar documentOffset = require('document-offset');\nvar isDom = require('is-dom');\nvar select = require('dom-select');\n\nvar _isDomError = function _isDomError(methodName) {\n  throw new Error('Non-DOM object passed to the method DOM.' + methodName);\n};\n\nvar _assertIsDom = function _assertIsDom(element, methodName) {\n  var isObjectNode = typeof element === 'function' && element.nodeName === 'OBJECT';\n  if (!element || !isDom(element) && !isObjectNode) {\n    _isDomError(methodName);\n  }\n};\n\nvar DOM = {\n  scry: function scry(selector, context) {\n    var elements = [];\n    if (Array.isArray(context)) {\n      context.forEach(function (ct) {\n        ct && _assertIsDom(ct, 'scry');\n        elements = elements.concat(select.all(selector, ct));\n      });\n    } else if (context && context.constructor === NodeList) {\n      for (var i = 0, il = context.length; i < il; i++) {\n        var ct = context[i];\n        ct && _assertIsDom(ct, 'scry');\n        elements = elements.concat(select.all(selector, ct));\n      }\n    } else {\n      context && _assertIsDom(context, 'scry');\n      elements = elements.concat(select.all(selector, context));\n    }\n    return elements;\n  },\n  parent: function parent(element) {\n    _assertIsDom(element, 'parent');\n    return element.parentElement;\n  },\n  parents: function parents(element) {\n    _assertIsDom(element, 'parents');\n    var parentElements = [];\n    var node = element;\n    while (node.parentElement) {\n      parentElements.push(node.parentElement);\n      node = node.parentElement;\n    }\n    return parentElements;\n  },\n  children: function children(element) {\n    _assertIsDom(element, 'children');\n    return Array.prototype.slice.call(element.children);\n  },\n  hasAttribute: function hasAttribute(element, attrName) {\n    _assertIsDom(element, 'hasAttribute');\n    return typeof element[attrName] !== 'undefined';\n  },\n  /**\n   * Sets attributes on a node.\n   */\n  setAttributes: function setAttributes(element, attributes) {\n    _assertIsDom(element, 'setAttributes');\n    // The type attribute needs to be set first in IE, so we special case it.\n    if (attributes.type) {\n      element.type = attributes.type;\n    }\n\n    for (var attribute in attributes) {\n      var value = attributes[attribute];\n\n      if (attribute == 'type') {\n        continue; // The type attribute needs to be set first in IE.\n      } else if (attribute == 'style') {\n          if (typeof value == 'string') {\n            element.style.cssText = value;\n          } else {\n            Object.assign(element.style, value);\n          }\n        } else if (attribute in element) {\n          element[attribute] = value;\n        } else if (element.setAttribute) {\n          element.setAttribute(attribute, value);\n        }\n    }\n  },\n  getAttribute: function getAttribute(element, name) {\n    _assertIsDom(element, 'getAttribute');\n    return element.getAttribute(name);\n  },\n  getStyle: function getStyle(element, name) {\n    _assertIsDom(element, 'getStyle');\n    var value;\n    try {\n      value = element.style[name];\n    } catch (error) {\n      throw new Error(error);\n    }\n    return value;\n  },\n  getComputedStyle: function getComputedStyle(element, name) {\n    _assertIsDom(element, 'getComputedStyle');\n    var value;\n    try {\n      value = window.getComputedStyle(element).getPropertyValue(name);\n    } catch (error) {\n      throw new Error(error);\n    }\n    return value;\n  },\n  next: function next(element) {\n    _assertIsDom(element, 'next');\n    var parentElement = element.parentElement;\n    var children;\n    var index;\n    if (parentElement) {\n      children = DOM.children(parentElement);\n      index = children.indexOf(element);\n    }\n    if (index > -1 && index <= children.length - 2) {\n      return children[index + 1];\n    }\n  },\n  prev: function prev(element) {\n    _assertIsDom(element, 'prev');\n    var parentElement = element.parentElement;\n    var children;\n    var index;\n    if (parentElement) {\n      children = DOM.children(parentElement);\n      index = children.indexOf(element);\n    }\n    if (index > 0) {\n      return children[index - 1];\n    }\n  },\n  nextAll: function nextAll(element) {\n    _assertIsDom(element, 'nextAll');\n    var parentElement = element.parentElement;\n    var children;\n    var index;\n    if (parentElement) {\n      children = DOM.children(parentElement);\n      index = children.indexOf(element);\n    }\n    return children.slice(index + 1);\n  },\n  prevAll: function prevAll(element) {\n    _assertIsDom(element, 'prevAll');\n    var parentElement = element.parentElement;\n    var children;\n    var index;\n    if (parentElement) {\n      children = DOM.children(parentElement);\n      index = children.indexOf(element);\n    }\n    return children.slice(0, index);\n  },\n  index: function index(element) {\n    var siblings = DOM.children(element.parentElement);\n    return siblings.indexOf(element);\n  },\n  is: function is(element, nodeName) {\n    _assertIsDom(element, 'is');\n    var elementNodeName = element.nodeName.toLowerCase();\n    var names;\n    if (typeof nodeName === 'string') {\n      names = nodeName.split(/, ?/);\n    } else {\n      // Assume it is an Array. Promptly shoot self in foot.\n      names = nodeName;\n    }\n    names = names.map(function (name) {\n      return name.toLowerCase();\n    });\n    var expandedNames = [];\n    // Expand colon-prefixed selectors to sets of selectors.\n    names.forEach(function (name) {\n      switch (name) {\n        case ':input':\n          expandedNames = expandedNames.concat(['input', 'button', 'select', 'textarea']);\n          break;\n        default:\n          expandedNames.push(name);\n      }\n    });\n    return expandedNames.indexOf(elementNodeName) > -1;\n  },\n  setData: function setData(element, key, value) {\n    _assertIsDom(element, 'setData');\n    var dataKey = 'data-' + key;\n    var attrs = [];\n    attrs[dataKey] = value;\n    DOM.setAttributes(element, attrs);\n    DataSet(element);\n  },\n  getData: function getData(element, key) {\n    _assertIsDom(element, 'getData');\n    return DataSet(element)[key];\n  },\n  removeData: function removeData(element, key) {\n    _assertIsDom(element, 'removeData');\n    var dataKey = 'data-' + key;\n    element.removeAttribute(dataKey);\n    DataSet(element);\n  },\n  text: function text(element) {\n    _assertIsDom(element, 'text');\n    return element.textContent || element.innerText;\n  },\n  offset: function offset(element) {\n    _assertIsDom(element, 'offset');\n    return documentOffset(element);\n  },\n  isVisible: function isVisible(element) {\n    _assertIsDom(element, 'isVisible');\n    var display = DOM.getComputedStyle(element, 'display');\n    var visibility = DOM.getComputedStyle(element, 'visibility');\n    return !(display === 'none') && !(visibility === 'hidden');\n  }\n};\n\nmodule.exports = DOM;\n\n},{\"data-set\":231,\"document-offset\":232,\"dom-select\":233,\"is-dom\":237}],35:[function(require,module,exports){\n'use strict';\n\nvar Guideline = {\n  guidelines: {\n    wcag: {\n      /**\n       * Perform WCAG specific setup.\n       */\n      setup: function setup(tests, listener, callbacks) {\n        callbacks = callbacks || {};\n        // Associate Success Criteria with the TestCollection.\n        for (var sc in this.successCriteria) {\n          if (this.successCriteria.hasOwnProperty(sc)) {\n            var criteria = this.successCriteria[sc];\n            criteria.registerTests(tests);\n            if (listener && listener.listenTo && typeof listener.listenTo === 'function') {\n              // Allow the invoker to listen to successCriteriaEvaluated events\n              // on each SuccessCriteria.\n              if (callbacks.successCriteriaEvaluated) {\n                listener.listenTo(criteria, 'successCriteriaEvaluated', callbacks.successCriteriaEvaluated);\n              }\n            }\n          }\n        }\n      },\n      successCriteria: {}\n    }\n  }\n};\n\nmodule.exports = Guideline;\n\n},{}],36:[function(require,module,exports){\n/**\n * @providesModule Quail\n */\n\n'use strict';\n\nvar _extends = Object.assign || function (target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i];for (var key in source) {\n      if (Object.prototype.hasOwnProperty.call(source, key)) {\n        target[key] = source[key];\n      }\n    }\n  }return target;\n};\n\nrequire('babel-polyfill');\n\nvar globalQuail = window.globalQuail || {};\n\nvar DOM = require('DOM');\nvar Guideline = require('Guideline');\nvar TestCollection = require('TestCollection');\nvar _Assessments = require('_Assessments');\n\nvar Quail = {\n  /**\n   * Main run function for Quail.\n   */\n  run: function run(options) {\n    function buildTests(assessmentList, options) {\n      var htmlElement = options.html || DOM.scry('html');\n      var keys = undefined;\n      // Create an empty TestCollection.\n      var testCollection = TestCollection([], {\n        scope: htmlElement\n      });\n      var assessmentsToRun = [];\n      if (assessmentList && assessmentList.length) {\n        assessmentsToRun = assessmentList;\n      } else {\n        keys = _Assessments.keys();\n        var key = undefined,\n            next = undefined;\n        do {\n          next = keys.next();\n          key = next.value;\n          assessmentsToRun.push(key);\n        } while (!next.done);\n      }\n      assessmentsToRun.forEach(function (name) {\n        var mod = _Assessments.get(name);\n        if (mod) {\n          testCollection.set(name, _extends({\n            scope: htmlElement,\n            callback: mod.run\n          }, mod.meta));\n        }\n      });\n      return testCollection;\n    }\n\n    /**\n     * A private, internal run function.\n     *\n     * This function is called when the tests are collected, which might occur\n     * after an AJAX request for a test JSON file.\n     */\n    function _run(testCollection) {\n      // Set up Guideline-specific behaviors.\n      var noop = function noop() {};\n      for (var guideline in Guideline) {\n        if (Guideline[guideline] && typeof Guideline[guideline].setup === 'function') {\n          Guideline[guideline].setup(testCollection, Quail, {\n            successCriteriaEvaluated: options.successCriteriaEvaluated || noop\n          });\n        }\n      }\n\n      // Invoke all the registered tests.\n      testCollection.run({\n        preFilter: options.preFilter || function () {},\n        caseResolve: options.caseResolve || function () {},\n        testComplete: options.testComplete || function () {},\n        testCollectionComplete: options.testCollectionComplete || function () {},\n        complete: options.complete || function () {}\n      });\n    }\n\n    // Let wcag2 run itself, will call Quail again when it knows what\n    // to\n    // if (options.guideline === 'wcag2') {\n    //   wcag2.run(options);\n    // }\n\n    // If a list of specific tests is provided, use them.\n    _run(buildTests(options.assessments, options));\n  },\n\n  // @todo, make this a set of methods that all classes extend.\n  listenTo: function listenTo(dispatcher, eventName, handler) {\n    handler = handler.bind(this);\n    dispatcher.registerListener.call(dispatcher, eventName, handler);\n  },\n\n  getConfiguration: function getConfiguration(testName) {\n    var test = this.tests.find(testName);\n    var guidelines = test && test.get('guidelines');\n    var guideline = guidelines && this.options.guidelineName && guidelines[this.options.guidelineName];\n    var configuration = guideline && guideline.configuration;\n    if (configuration) {\n      return configuration;\n    }\n    return false;\n  }\n};\n\nglobalQuail.run = globalQuail.run || function () {\n  Quail.run.apply(Quail, arguments);\n};\n\nwindow.globalQuail = globalQuail;\n\nmodule.exports = Quail;\n\n},{\"DOM\":34,\"Guideline\":35,\"TestCollection\":38,\"_Assessments\":40,\"babel-polyfill\":41}],37:[function(require,module,exports){\n'use strict';\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _typeof(obj) {\n  return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n}\n\nvar Case = require('Case');\n\nvar Test = function () {\n\n  /**\n   * A collection of Cases.\n   */\n  function Test(name, attributes) {\n    return new Test.fn.init(name, attributes);\n  }\n\n  // Prototype object of the Test.\n  Test.fn = Test.prototype = {\n    constructor: Test,\n    init: function init(name, attributes) {\n      this.listeners = {};\n      this.length = 0;\n      if (!name) {\n        return this;\n      }\n      this.attributes = attributes || {};\n      this.attributes.name = name;\n      this.attributes.status = 'untested';\n      this.attributes.complete = false;\n\n      return this;\n    },\n    // Setting a length property makes it behave like an array.\n    length: 0,\n    // Details of the test.\n    attributes: null,\n    get: function get(attr) {\n      return this.attributes[attr];\n    },\n    set: function set(attr, value) {\n      var isStatusChanged = false;\n      // Allow an object of attributes to be passed in.\n      if ((typeof attr === 'undefined' ? 'undefined' : _typeof(attr)) === 'object') {\n        for (var prop in attr) {\n          if (attr.hasOwnProperty(prop)) {\n            if (prop === 'status') {\n              isStatusChanged = true;\n            }\n            this.attributes[prop] = attr[prop];\n          }\n        }\n      }\n      // Assign a single attribute value.\n      else {\n          if (attr === 'status') {\n            isStatusChanged = true;\n          }\n          this.attributes[attr] = value;\n        }\n\n      if (isStatusChanged) {\n        this.resolve();\n      }\n      return this;\n    },\n    add: function add(_case) {\n      this.listenTo(_case, 'resolve', this.caseResponded);\n      this.listenTo(_case, 'timeout', this.caseResponded);\n      // If the case is already resolved because it has a status, then trigger\n      // its resolve event.\n      if (_case.status) {\n        _case.dispatch('resolve', _case);\n      }\n      this.push(_case);\n      return _case;\n    },\n    invoke: function invoke() {\n      var name = this.get('name');\n      // This test is already running.\n      if (this.testComplete) {\n        throw new Error('The test ' + name + ' is already running.');\n      }\n      // This test has already been run.\n      if (this.attributes.complete) {\n        throw new Error('The test ' + name + ' has already been run.');\n      }\n\n      var options = this.get('options');\n      var callback = this.get('callback');\n      var self = this;\n\n      // Set the test complete method to the closure function that dispatches\n      // the complete event. This method needs to be debounced so it is only\n      // called after a pause of invocations.\n      this.testComplete = debounce(testComplete.bind(this), 400);\n\n      // Invoke the complete dispatcher to prevent the test from never\n      // completing in the off chance that no Cases are created.\n      this.testComplete(false);\n\n      // Record the time the test started for performance monitoring.\n      var start = new Date();\n      this.set('startTime', start);\n\n      if (callback && typeof callback.call === 'function') {\n        try {\n          callback.call(self, self, options);\n        } catch (error) {\n          if (window.console && window.console.error) {\n            window.console.error(error.stack);\n          }\n        }\n      } else {\n        window.console.log('Skipping ' + name + ' because it does not have an associated method on Quail');\n      }\n\n      // Invoke the complete dispatcher to prevent the test from never\n      // completing in the off chance that no Cases are created.\n      this.testComplete();\n\n      return this;\n    },\n    /**\n     * Finds cases by their status.\n     */\n    findByStatus: function findByStatus(statuses) {\n      if (!statuses) {\n        return;\n      }\n      var test = new Test();\n      // A single status or an array of statuses is allowed. Always act on an\n      // array.\n      if (typeof statuses === 'string') {\n        statuses = [statuses];\n      }\n      // Loop the through the statuses and find tests with them.\n      for (var i = 0, il = statuses.length; i < il; ++i) {\n        var status = statuses[i];\n        // Loop through the cases.\n        this.forEach(function (_case) {\n          var caseStatus = _case.get('status');\n          if (caseStatus === status) {\n            test.add(_case);\n          }\n        });\n      }\n      return test;\n    },\n    /**\n     * Returns a set of cases with corresponding to th supplied selector.\n     */\n    findCasesBySelector: function findCasesBySelector(selector) {\n      var cases = this.groupCasesBySelector();\n      if (cases.hasOwnProperty(selector)) {\n        return cases[selector];\n      }\n      return new Test();\n    },\n    /**\n     * Returns a single Case object the matches the supplied HTML.\n     *\n     * We make the assumption, rightly or wrongly, that if the HTML is the\n     * same for a number of cases in a Test, then the outcome will also\n     * be the same, so only use this method if you are probing the result\n     * of the case, not other specifics of it.\n     *\n     * @param string html\n     *   A string representing an HTML structure.\n     *\n     * @needstests\n     */\n    findCaseByHtml: function findCaseByHtml(html) {\n      var _case;\n      for (var i = 0, il = this.length; i < il; ++i) {\n        _case = this[i];\n        if (html === _case.get('html')) {\n          return _case;\n        }\n      }\n      // Always return a Case object.\n      return Case();\n    },\n    /**\n     * Groups the cases by element selector.\n     *\n     * @return object\n     *  A hash of cases, keyed by the element selector.\n     */\n    groupCasesBySelector: function groupCasesBySelector() {\n      var casesBySelector = {};\n      // Loop through the cases.\n      this.forEach(function (_case) {\n        var selector = _case.get('selector');\n        if (!casesBySelector[selector]) {\n          casesBySelector[selector] = new Test();\n        }\n        casesBySelector[selector].add(_case);\n      });\n      return casesBySelector;\n    },\n    /**\n     * Groups the cases by serialized HTML string.\n     *\n     * @todo, the html string index needs to be hashed to a uniform length.\n     *\n     * @return object\n     *  A hash of cases, keyed by the element selector.\n     */\n    groupCasesByHtml: function groupCasesByHtml() {\n      var casesByHtml = {};\n      // Loop through the cases.\n      this.forEach(function (_case) {\n        var html = _case.get('html');\n        if (!casesByHtml[html]) {\n          casesByHtml[html] = new Test();\n        }\n        casesByHtml[html].add(_case);\n      });\n      return casesByHtml;\n    },\n    /**\n     * @needsdoc\n     */\n    getGuidelineCoverage: function getGuidelineCoverage(name) {\n      var config = this.get('guidelines');\n      return config && config[name] || {};\n    },\n    /**\n     * Adds the test that owns the Case to the set of arguments passed up to\n     * listeners of this test's cases.\n     */\n    caseResponded: function caseResponded(eventName, _case) {\n      this.dispatch(eventName, this, _case);\n      // Attempt to declare the Test complete.\n      if (typeof this.testComplete === 'function') {\n        this.testComplete();\n      }\n    },\n    /**\n     * Evaluates the test's cases and sets the test's status.\n     */\n    determineStatus: function determineStatus() {\n      // CantTell.\n      if (this.findByStatus(['cantTell']).length === this.length) {\n        this.set({\n          status: 'cantTell'\n        });\n      }\n      // inapplicable.\n      else if (this.findByStatus(['inapplicable']).length === this.length) {\n          this.set({\n            status: 'inapplicable'\n          });\n        }\n        // Failed.\n        else if (this.findByStatus(['failed', 'untested']).length) {\n            this.set({\n              status: 'failed'\n            });\n          } else {\n            this.set({\n              status: 'passed'\n            });\n          }\n    },\n    resolve: function resolve() {\n      this.dispatch('complete', this);\n    },\n    /**\n     * A stub method implementation.\n     *\n     * It is assigned a function value when the Test is invoked. See the\n     * testComplete function in outer scope.\n     */\n    testComplete: null,\n    // @todo, make this a set of methods that all classes extend.\n    listenTo: function listenTo(dispatcher, eventName, handler) {\n      handler = handler.bind(this);\n      dispatcher.registerListener.call(dispatcher, eventName, handler);\n    },\n    registerListener: function registerListener(eventName, handler) {\n      // nb: 'this' is the dispatcher object, not the one that invoked listenTo.\n      if (!this.listeners[eventName]) {\n        this.listeners[eventName] = [];\n      }\n\n      this.listeners[eventName].push(handler);\n    },\n    dispatch: function dispatch(eventName) {\n      if (this.listeners[eventName] && this.listeners[eventName].length) {\n        var eventArgs = [].slice.call(arguments);\n        this.listeners[eventName].forEach(function (handler) {\n          // Pass any additional arguments from the event dispatcher to the\n          // handler function.\n          handler.apply(null, eventArgs);\n        });\n      }\n    },\n    concat: [].concat,\n    forEach: [].forEach,\n    push: [].push,\n    sort: [].sort,\n    splice: [].splice\n  };\n\n  /**\n   * Dispatches the complete event.\n   *\n   * This function is meant to be bound to a Test as a method through\n   * a debounced proxy function.\n   */\n  function testComplete(complete) {\n    complete = typeof complete === 'undefined' ? true : complete;\n    // @todo, this iteration would be faster with _.findWhere, that breaks on\n    // the first match.\n    this.forEach(function (_case) {\n      if (!_case.get('status')) {\n        complete = false;\n      }\n    });\n    // If all the Cases have been evaluated, dispatch the event.\n    if (complete) {\n      // Set the end time for performance monitoring.\n      var end = new Date();\n      this.set('endTime', end);\n      // Null out the testComplete callback on this test.\n      this.testComplete = null;\n      // @todo, this should be set with the set method and a silent flag.\n      this.attributes.complete = true;\n      this.determineStatus();\n    }\n    // Otherwise attempt to the complete the Test again after the debounce\n    // period has expired.\n    else {\n        this.testComplete();\n      }\n  }\n\n  /**\n   * Limits the invocations of a function in a given time frame.\n   *\n   * Adapted from underscore.js. Replace with debounce from underscore once class\n   * loading with modules is in place.\n   *\n   * @param {Function} callback\n   *   The function to be invoked.\n   *\n   * @param {Number} wait\n   *   The time period within which the callback function should only be\n   *   invoked once. For example if the wait period is 250ms, then the callback\n   *   will only be called at most 4 times per second.\n   */\n  function debounce(func, wait, immediate) {\n    'use strict';\n\n    var timeout, result;\n    return function () {\n      var self = this;\n      var args = arguments;\n      var later = function later() {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(self, args);\n        }\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(self, args);\n      }\n      return result;\n    };\n  }\n\n  // Give the init function the Test prototype.\n  Test.fn.init.prototype = Test.fn;\n\n  return Test;\n}();\nmodule.exports = Test;\n\n},{\"Case\":33}],38:[function(require,module,exports){\n'use strict';\n\nvar _typeof2 = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nfunction _typeof(obj) {\n  return obj && typeof Symbol !== \"undefined\" && obj.constructor === Symbol ? \"symbol\" : typeof obj === \"undefined\" ? \"undefined\" : _typeof2(obj);\n}\n\nvar Test = require('Test');\nvar TestCollection = function () {\n\n  /**\n   * A Collection of Tests.\n   */\n  function TestCollection(tests) {\n    return new TestCollection.fn.init(tests);\n  }\n\n  // Prototype object of the TestCollection.\n  TestCollection.fn = TestCollection.prototype = {\n    constructor: TestCollection,\n    init: function init(tests, options) {\n      this.listeners = {};\n      options = options || {};\n      if (!tests) {\n        return this;\n      }\n      if ((typeof tests === 'undefined' ? 'undefined' : _typeof(tests)) === 'object') {\n        var test;\n        for (var name in tests) {\n          if (tests.hasOwnProperty(name)) {\n            tests[name].scope = tests[name].scope || options.scope;\n            test = new Test(name, tests[name]);\n            this.listenTo(test, 'results', this.report);\n            this.push(test);\n          }\n        }\n        return this;\n      }\n      return this;\n    },\n    // Setting a length property makes it behave like an array.\n    length: 0,\n    // Invoke all the tests in a set.\n    run: function run(callbacks) {\n      var self = this;\n      callbacks = callbacks || {};\n      this.forEach(function (test) {\n        // Allow a prefilter to remove a case.\n        if (callbacks.preFilter) {\n          self.listenTo(test, 'resolve', function (eventName, test, _case) {\n            var result = callbacks.preFilter(eventName, test, _case);\n            if (result === false) {\n              // Manipulate the attributes directly so that change events\n              // are not triggered.\n              _case.attributes.status = 'untested';\n            }\n          });\n        }\n        // Allow the invoker to listen to resolve events on each Case.\n        if (callbacks.caseResolve) {\n          self.listenTo(test, 'resolve', callbacks.caseResolve);\n        }\n        // Allow the invoker to listen to complete events on each Test.\n        if (callbacks.testComplete) {\n          self.listenTo(test, 'complete', callbacks.testComplete);\n        }\n      });\n\n      // Allow the invoker to listen to complete events for the\n      // TestCollection.\n      if (callbacks.testCollectionComplete) {\n        self.listenTo(self, 'complete', callbacks.testCollectionComplete);\n      }\n\n      // Set the test complete method to the closure function that dispatches\n      // the complete event. This method needs to be debounced so it is\n      // only called after a pause of invocations.\n      this.testsComplete = debounce(testsComplete.bind(this), 500);\n\n      // Invoke each test.\n      this.forEach(function (test) {\n        test.invoke();\n      });\n\n      // Invoke the complete dispatcher to prevent the collection from never\n      // completing in the off chance that no Tests are run.\n      this.testsComplete();\n\n      return this;\n    },\n    /**\n     * Add a Test object to the set.\n     */\n    add: function add(test) {\n      // Don't add a test that already exists in this set.\n      if (!this.find(test.get('name'))) {\n        this.push(test);\n      }\n    },\n    /**\n     * Finds a test by its name.\n     */\n    find: function find(testname) {\n      for (var i = 0, il = this.length; i < il; ++i) {\n        if (this[i].get('name') === testname) {\n          return this[i];\n        }\n      }\n      return null;\n    },\n    /**\n     * @info, this should be a static method.\n     */\n    findByGuideline: function findByGuideline(guidelineName) {\n\n      var methods = {\n        wcag: function wcag(section, technique) {\n\n          function findAllTestsForTechnique(guidelineName, sectionId, techniqueName) {\n            // Return a TestCollection instance.\n            var tests = new TestCollection();\n            this.forEach(function (test) {\n              // Get the configured guidelines for the test.\n              var guidelines = test.get('guidelines');\n              // If this test is configured for this section and it has\n              // associated techniques, then loop thorugh them.\n              var testTechniques = guidelines[guidelineName] && guidelines[guidelineName][sectionId] && guidelines[guidelineName][sectionId].techniques;\n              if (testTechniques) {\n                for (var i = 0, il = testTechniques.length; i < il; ++i) {\n                  // If this test is configured for the techniqueName, add it\n                  // to the list of tests.\n                  if (testTechniques[i] === techniqueName) {\n                    tests.listenTo(test, 'results', tests.report);\n                    tests.add(test);\n                  }\n                }\n              }\n            });\n            return tests;\n          }\n          var sectionId = section.id;\n          var techniqueName = technique.get('name');\n          if (sectionId && techniqueName) {\n            return findAllTestsForTechnique.call(this, guidelineName, sectionId, techniqueName);\n          }\n        }\n      };\n      // Process the request using a specific guideline finding method.\n      // @todo, make these pluggable eventually.\n      if (methods[guidelineName]) {\n        var args = [].slice.call(arguments, 1);\n        return methods[guidelineName].apply(this, args);\n      }\n    },\n    /**\n     * Finds tests by their status.\n     */\n    findByStatus: function findByStatus(statuses) {\n      if (!statuses) {\n        return;\n      }\n      var tests = new TestCollection();\n      // A single status or an array of statuses is allowed. Always act on an\n      // array.\n      if (typeof statuses === 'string') {\n        statuses = [statuses];\n      }\n      // Loop the through the statuses and find tests with them.\n      for (var i = 0, il = statuses.length; i < il; ++i) {\n        var status = statuses[i];\n        // Loop through the tests.\n        this.forEach(function (test) {\n          var testStatus = test.get('status');\n          if (testStatus === status) {\n            tests.add(test);\n          }\n        });\n      }\n      return tests;\n    },\n    /**\n     * Create a new test from a name and details.\n     */\n    set: function set(testname, details) {\n      for (var i = 0, il = this.length; i < il; ++i) {\n        if (this[i].get('name') === testname) {\n          this[i].set(details);\n          return this[i];\n        }\n      }\n      var test = Test(testname, details);\n      this.push(test);\n      return test;\n    },\n    /**\n     * A stub method implementation.\n     *\n     * It is assigned a function value when the collection is run. See the\n     * testsComplete function in outer scope.\n     */\n    testsComplete: null,\n    report: function report() {\n      this.dispatch.apply(this, arguments);\n    },\n    // @todo, make this a set of methods that all classes extend.\n    listenTo: function listenTo(dispatcher, eventName, handler) {\n      handler = handler.bind(this);\n      dispatcher.registerListener.call(dispatcher, eventName, handler);\n    },\n    registerListener: function registerListener(eventName, handler) {\n      // nb: 'this' is the dispatcher object, not the one that invoked listenTo.\n      if (!this.listeners[eventName]) {\n        this.listeners[eventName] = [];\n      }\n\n      this.listeners[eventName].push(handler);\n    },\n    dispatch: function dispatch(eventName) {\n      if (this.listeners[eventName] && this.listeners[eventName].length) {\n        var eventArgs = [].slice.call(arguments);\n        this.listeners[eventName].forEach(function (handler) {\n          // Pass any additional arguments from the event dispatcher to the\n          // handler function.\n          handler.apply(null, eventArgs);\n        });\n      }\n    },\n    forEach: [].forEach,\n    push: [].push,\n    sort: [].sort,\n    splice: [].splice\n  };\n\n  /**\n   * Dispatches the complete event.\n   *\n   * This function is meant to be bound to a Test as a method through\n   * a debounced proxy function.\n   */\n  function testsComplete() {\n    var complete = true;\n    // @todo, this iteration would be faster with _.findWhere, that breaks on\n    // the first match.\n    this.forEach(function (test) {\n      if (!test.get('complete')) {\n        complete = false;\n      }\n    });\n    // If all the Tests have completed, dispatch the event.\n    if (complete) {\n      this.testsComplete = null;\n      this.dispatch('complete', this);\n    }\n    // Otherwise attempt to the complete the Tests again after the debounce\n    // period has expired.\n    else {\n        this.testsComplete();\n      }\n  }\n\n  /**\n   * Limits the invocations of a function in a given time frame.\n   *\n   * Adapted from underscore.js. Replace with debounce from underscore once class\n   * loading with modules is in place.\n   *\n   * @param {Function} callback\n   *   The function to be invoked.\n   *\n   * @param {Number} wait\n   *   The time period within which the callback function should only be\n   *   invoked once. For example if the wait period is 250ms, then the callback\n   *   will only be called at most 4 times per second.\n   */\n  function debounce(func, wait, immediate) {\n    'use strict';\n\n    var timeout, result;\n    return function () {\n      var self = this;\n      var args = arguments;\n      var later = function later() {\n        timeout = null;\n        if (!immediate) {\n          result = func.apply(self, args);\n        }\n      };\n      var callNow = immediate && !timeout;\n      clearTimeout(timeout);\n      timeout = setTimeout(later, wait);\n      if (callNow) {\n        result = func.apply(self, args);\n      }\n      return result;\n    };\n  }\n\n  // Give the init function the TestCollection prototype.\n  TestCollection.fn.init.prototype = TestCollection.fn;\n\n  return TestCollection;\n}();\nmodule.exports = TestCollection;\n\n},{\"Test\":37}],39:[function(require,module,exports){\n'use strict';\n\n// Basic output structure attributes.\n\nvar quail = require('Quail');\n\nvar runQuailOutputToConsole = function () {\n  window.addEventListener('load', function () {\n    var output = {\n      tests: {},\n      successCriteria: {},\n      stats: {\n        tests: 0,\n        cases: 0\n      }\n    };\n\n    quail.run({\n      assessments: [window.assessmentName],\n      // Called when an individual Case in a test is resolved.\n      caseResolve: function caseResolve(eventName, test, _case) {\n        var name = test.get('name');\n        if (!output.tests[name]) {\n          output.tests[name] = {\n            id: name,\n            title: test.get('title'),\n            description: test.get('description'),\n            type: test.get('type'),\n            testability: test.get('testability'),\n            guidelines: test.get('guidelines') || {},\n            tags: test.get('tags'),\n            cases: []\n          };\n        }\n        // Push the case into the results for this test.\n        output.tests[name].cases.push({\n          status: _case.get('status'),\n          selector: _case.get('selector'),\n          html: _case.get('html')\n        });\n        // Increment the cases count.\n        output.stats.cases++;\n      },\n      // Called when all the Cases in a Test are resolved.\n      testComplete: function testComplete() {\n        // console.log('Finished testing ' + test.get('name') + '.');\n        // Increment the tests count.\n        output.stats.tests++;\n      },\n      // Called when all the Tests in a TestCollection are completed.\n      testCollectionComplete: function testCollectionComplete(eventName, testCollection) {\n        console.log(testCollection);\n      }\n    });\n  });\n}();\n\nmodule.exports = runQuailOutputToConsole;\n\n},{\"Quail\":36}],40:[function(require,module,exports){\n'use strict';\n\nvar WhiteSpaceNotUsedForFormatting = require('WhiteSpaceNotUsedForFormatting');\nvar WhiteSpaceInWord = require('WhiteSpaceInWord');\nvar VideosEmbeddedOrLinkedNeedCaptions = require('VideosEmbeddedOrLinkedNeedCaptions');\nvar VideoMayBePresent = require('VideoMayBePresent');\nvar TextareaHasAssociatedLabel = require('TextareaHasAssociatedLabel');\nvar TextIsNotSmall = require('TextIsNotSmall');\nvar TabularDataIsInTable = require('TabularDataIsInTable');\nvar TableUsesScopeForRow = require('TableUsesScopeForRow');\nvar TableUsesCaption = require('TableUsesCaption');\nvar TableUsesAbbreviationForHeader = require('TableUsesAbbreviationForHeader');\nvar TableUseColGroup = require('TableUseColGroup');\nvar TableSummaryIsNotTooLong = require('TableSummaryIsNotTooLong');\nvar TableSummaryIsEmpty = require('TableSummaryIsEmpty');\nvar TableSummaryDoesNotDuplicateCaption = require('TableSummaryDoesNotDuplicateCaption');\nvar TableShouldUseHeaderIDs = require('TableShouldUseHeaderIDs');\nvar TableNotUsedForLayout = require('TableNotUsedForLayout');\nvar TableLayoutMakesSenseLinearized = require('TableLayoutMakesSenseLinearized');\nvar TableLayoutHasNoSummary = require('TableLayoutHasNoSummary');\nvar TableLayoutHasNoCaption = require('TableLayoutHasNoCaption');\nvar TableLayoutDataShouldNotHaveTh = require('TableLayoutDataShouldNotHaveTh');\nvar TableDataShouldHaveTh = require('TableDataShouldHaveTh');\nvar TabIndexFollowsLogicalOrder = require('TabIndexFollowsLogicalOrder');\nvar SvgContainsTitle = require('SvgContainsTitle');\nvar SkipToContentLinkProvided = require('SkipToContentLinkProvided');\nvar SiteMap = require('SiteMap');\nvar SelectJumpMenu = require('SelectJumpMenu');\nvar SelectHasAssociatedLabel = require('SelectHasAssociatedLabel');\nvar ScriptOnmouseupHasOnkeyup = require('ScriptOnmouseupHasOnkeyup');\nvar ScriptOnmouseoverHasOnfocus = require('ScriptOnmouseoverHasOnfocus');\nvar ScriptOnmouseoutHasOnmouseblur = require('ScriptOnmouseoutHasOnmouseblur');\nvar ScriptOnmousemove = require('ScriptOnmousemove');\nvar ScriptOnmousedownRequiresOnKeypress = require('ScriptOnmousedownRequiresOnKeypress');\nvar ScriptOndblclickRequiresOnKeypress = require('ScriptOndblclickRequiresOnKeypress');\nvar ScriptOnclickRequiresOnKeypress = require('ScriptOnclickRequiresOnKeypress');\nvar RadioHasLabel = require('RadioHasLabel');\nvar PreShouldNotBeUsedForTabularLayout = require('PreShouldNotBeUsedForTabularLayout');\nvar PasswordHasLabel = require('PasswordHasLabel');\nvar PNotUsedAsHeader = require('PNotUsedAsHeader');\nvar ObjectMustHaveValidTitle = require('ObjectMustHaveValidTitle');\nvar ObjectMustHaveTitle = require('ObjectMustHaveTitle');\nvar ObjectMustHaveEmbed = require('ObjectMustHaveEmbed');\nvar ObjectMustContainText = require('ObjectMustContainText');\nvar NewWindowIsOpened = require('NewWindowIsOpened');\nvar MarqueeIsNotUsed = require('MarqueeIsNotUsed');\nvar ListOfLinksUseList = require('ListOfLinksUseList');\nvar ListNotUsedForFormatting = require('ListNotUsedForFormatting');\nvar LinkHasAUniqueContext = require('LinkHasAUniqueContext');\nvar LiDontUseImageForBullet = require('LiDontUseImageForBullet');\nvar LegendTextNotPlaceholder = require('LegendTextNotPlaceholder');\nvar LegendTextNotEmpty = require('LegendTextNotEmpty');\nvar LanguageUnicodeDirection = require('LanguageUnicodeDirection');\nvar LanguageDirectionPunctuation = require('LanguageDirectionPunctuation');\nvar LanguageDirAttributeIsUsed = require('LanguageDirAttributeIsUsed');\nvar LabelsAreAssignedToAnInput = require('LabelsAreAssignedToAnInput');\nvar LabelMustNotBeEmpty = require('LabelMustNotBeEmpty');\nvar LabelMustBeUnique = require('LabelMustBeUnique');\nvar LabelDoesNotContainInput = require('LabelDoesNotContainInput');\nvar InputWithoutLabelHasTitle = require('InputWithoutLabelHasTitle');\nvar InputTextValueNotEmpty = require('InputTextValueNotEmpty');\nvar InputTextHasValue = require('InputTextHasValue');\nvar InputTextHasLabel = require('InputTextHasLabel');\nvar InputImageHasAlt = require('InputImageHasAlt');\nvar InputImageAltNotRedundant = require('InputImageAltNotRedundant');\nvar InputImageAltIsShort = require('InputImageAltIsShort');\nvar InputImageAltIsNotPlaceholder = require('InputImageAltIsNotPlaceholder');\nvar InputImageAltIsNotFileName = require('InputImageAltIsNotFileName');\nvar InputElementsDontHaveAlt = require('InputElementsDontHaveAlt');\nvar InputCheckboxRequiresFieldset = require('InputCheckboxRequiresFieldset');\nvar ImgWithMapHasUseMap = require('ImgWithMapHasUseMap');\nvar ImgShouldNotHaveTitle = require('ImgShouldNotHaveTitle');\nvar ImgServerSideMapNotUsed = require('ImgServerSideMapNotUsed');\nvar ImgNonDecorativeHasAlt = require('ImgNonDecorativeHasAlt');\nvar ImgImportantNoSpacerAlt = require('ImgImportantNoSpacerAlt');\nvar ImgHasLongDesc = require('ImgHasLongDesc');\nvar ImgHasAlt = require('ImgHasAlt');\nvar ImgAltNotPlaceHolder = require('ImgAltNotPlaceHolder');\nvar ImgAltNotEmptyInAnchor = require('ImgAltNotEmptyInAnchor');\nvar ImgAltIsTooLong = require('ImgAltIsTooLong');\nvar ImgAltIsDifferent = require('ImgAltIsDifferent');\nvar ImageMapServerSide = require('ImageMapServerSide');\nvar IframeMustNotHaveLongdesc = require('IframeMustNotHaveLongdesc');\nvar IdrefsHasCorrespondingId = require('IdrefsHasCorrespondingId');\nvar IIsNotUsed = require('IIsNotUsed');\nvar HeadersUseToMarkSections = require('HeadersUseToMarkSections');\nvar HeadersHaveText = require('HeadersHaveText');\nvar HeadersAttrRefersToATableCell = require('HeadersAttrRefersToATableCell');\nvar HeaderH6Format = require('HeaderH6Format');\nvar HeaderH5Format = require('HeaderH5Format');\nvar HeaderH4Format = require('HeaderH4Format');\nvar HeaderH4 = require('HeaderH4');\nvar HeaderH3Format = require('HeaderH3Format');\nvar HeaderH3 = require('HeaderH3');\nvar HeaderH2Format = require('HeaderH2Format');\nvar HeaderH2 = require('HeaderH2');\nvar HeaderH1Format = require('HeaderH1Format');\nvar HeaderH1 = require('HeaderH1');\nvar FormWithRequiredLabel = require('FormWithRequiredLabel');\nvar FormHasSubmitButton = require('FormHasSubmitButton');\nvar FormHasGoodErrorMessage = require('FormHasGoodErrorMessage');\nvar FormErrorMessageHelpsUser = require('FormErrorMessageHelpsUser');\nvar FormButtonsHaveValue = require('FormButtonsHaveValue');\nvar FontIsNotUsed = require('FontIsNotUsed');\nvar FileHasLabel = require('FileHasLabel');\nvar FieldsetHasLabel = require('FieldsetHasLabel');\nvar EmbedMustHaveAltAttribute = require('EmbedMustHaveAltAttribute');\nvar EmbedHasAssociatedNoEmbed = require('EmbedHasAssociatedNoEmbed');\nvar DocumentVisualListsAreMarkedUp = require('DocumentVisualListsAreMarkedUp');\nvar DocumentTitleNotEmpty = require('DocumentTitleNotEmpty');\nvar DocumentTitleIsShort = require('DocumentTitleIsShort');\nvar DocumentTitleIsNotPlaceholder = require('DocumentTitleIsNotPlaceholder');\nvar DocumentTitleDescribesDocument = require('DocumentTitleDescribesDocument');\nvar DocumentStrictDocType = require('DocumentStrictDocType');\nvar DocumentReadingDirection = require('DocumentReadingDirection');\nvar DocumentMetaNotUsedWithTimeout = require('DocumentMetaNotUsedWithTimeout');\nvar DocumentLangNotIdentified = require('DocumentLangNotIdentified');\nvar DocumentLangIsISO639Standard = require('DocumentLangIsISO639Standard');\nvar DocumentIsWrittenClearly = require('DocumentIsWrittenClearly');\nvar DocumentHasTitleElement = require('DocumentHasTitleElement');\nvar DocumentContentReadableWithoutStylesheets = require('DocumentContentReadableWithoutStylesheets');\nvar DocumentAutoRedirectNotUsed = require('DocumentAutoRedirectNotUsed');\nvar DocumentAcronymsHaveElement = require('DocumentAcronymsHaveElement');\nvar DoctypeProvided = require('DoctypeProvided');\nvar DefinitionListsAreUsed = require('DefinitionListsAreUsed');\nvar CssDocumentMakesSenseStyleTurnedOff = require('CssDocumentMakesSenseStyleTurnedOff');\nvar ColorFontContrast = require('ColorFontContrast');\nvar ColorElementBehindContrast = require('ColorElementBehindContrast');\nvar ColorElementBehindBackgroundImageContrast = require('ColorElementBehindBackgroundImageContrast');\nvar ColorElementBehindBackgroundGradientContrast = require('ColorElementBehindBackgroundGradientContrast');\nvar ColorBackgroundImageContrast = require('ColorBackgroundImageContrast');\nvar ColorBackgroundGradientContrast = require('ColorBackgroundGradientContrast');\nvar CheckboxHasLabel = require('CheckboxHasLabel');\nvar ButtonHasName = require('ButtonHasName');\nvar BoldIsNotUsed = require('BoldIsNotUsed');\nvar BlockquoteUseForQuotations = require('BlockquoteUseForQuotations');\nvar BlockquoteNotUsedForIndentation = require('BlockquoteNotUsedForIndentation');\nvar BlinkIsNotUsed = require('BlinkIsNotUsed');\nvar BasefontIsNotUsed = require('BasefontIsNotUsed');\nvar AudioMayBePresent = require('AudioMayBePresent');\nvar AreaLinksToSoundFile = require('AreaLinksToSoundFile');\nvar AreaHasAltValue = require('AreaHasAltValue');\nvar AreaDontOpenNewWindow = require('AreaDontOpenNewWindow');\nvar AreaAltRefersToText = require('AreaAltRefersToText');\nvar AreaAltIdentifiesDestination = require('AreaAltIdentifiesDestination');\nvar AnimatedGifMayBePresent = require('AnimatedGifMayBePresent');\nvar ATitleDescribesDestination = require('ATitleDescribesDestination');\nvar ASuspiciousLinkText = require('ASuspiciousLinkText');\nvar AppletsDonotUseColorAlone = require('AppletsDonotUseColorAlone');\nvar AppletsDoNotFlicker = require('AppletsDoNotFlicker');\nvar AppletUIMustBeAccessible = require('AppletUIMustBeAccessible');\nvar AppletTextEquivalentsGetUpdated = require('AppletTextEquivalentsGetUpdated');\nvar AppletProvidesMechanismToReturnToParent = require('AppletProvidesMechanismToReturnToParent');\nvar AppletContainsTextEquivalentInAlt = require('AppletContainsTextEquivalentInAlt');\nvar AppletContainsTextEquivalent = require('AppletContainsTextEquivalent');\nvar AMustNotHaveJavascriptHref = require('AMustNotHaveJavascriptHref');\nvar AMustHaveTitle = require('AMustHaveTitle');\nvar AMustContainText = require('AMustContainText');\nvar AMultimediaTextAlternative = require('AMultimediaTextAlternative');\nvar ALinksToSoundFilesNeedTranscripts = require('ALinksToSoundFilesNeedTranscripts');\nvar ALinksToMultiMediaRequireTranscript = require('ALinksToMultiMediaRequireTranscript');\nvar ALinksNotSeparatedBySymbols = require('ALinksNotSeparatedBySymbols');\nvar ALinksDontOpenNewWindow = require('ALinksDontOpenNewWindow');\nvar ALinksAreSeparatedByPrintableCharacters = require('ALinksAreSeparatedByPrintableCharacters');\nvar ALinkWithNonText = require('ALinkWithNonText');\nvar ALinkTextDoesNotBeginWithRedundantWord = require('ALinkTextDoesNotBeginWithRedundantWord');\nvar AInPHasADistinctStyle = require('AInPHasADistinctStyle');\nvar AImgAltNotRepetitive = require('AImgAltNotRepetitive');\nvar AAdjacentWithSameResourceShouldBeCombined = require('AAdjacentWithSameResourceShouldBeCombined');\nvar map = new Map();\nmap.set('aAdjacentWithSameResourceShouldBeCombined', AAdjacentWithSameResourceShouldBeCombined);\nmap.set('aImgAltNotRepetitive', AImgAltNotRepetitive);\nmap.set('aInPHasADistinctStyle', AInPHasADistinctStyle);\nmap.set('aLinkTextDoesNotBeginWithRedundantWord', ALinkTextDoesNotBeginWithRedundantWord);\nmap.set('aLinkWithNonText', ALinkWithNonText);\nmap.set('aLinksAreSeparatedByPrintableCharacters', ALinksAreSeparatedByPrintableCharacters);\nmap.set('aLinksDontOpenNewWindow', ALinksDontOpenNewWindow);\nmap.set('aLinksNotSeparatedBySymbols', ALinksNotSeparatedBySymbols);\nmap.set('aLinksToMultiMediaRequireTranscript', ALinksToMultiMediaRequireTranscript);\nmap.set('aLinksToSoundFilesNeedTranscripts', ALinksToSoundFilesNeedTranscripts);\nmap.set('aMultimediaTextAlternative', AMultimediaTextAlternative);\nmap.set('aMustContainText', AMustContainText);\nmap.set('aMustHaveTitle', AMustHaveTitle);\nmap.set('aMustNotHaveJavascriptHref', AMustNotHaveJavascriptHref);\nmap.set('appletContainsTextEquivalent', AppletContainsTextEquivalent);\nmap.set('appletContainsTextEquivalentInAlt', AppletContainsTextEquivalentInAlt);\nmap.set('appletProvidesMechanismToReturnToParent', AppletProvidesMechanismToReturnToParent);\nmap.set('appletTextEquivalentsGetUpdated', AppletTextEquivalentsGetUpdated);\nmap.set('appletUIMustBeAccessible', AppletUIMustBeAccessible);\nmap.set('appletsDoNotFlicker', AppletsDoNotFlicker);\nmap.set('appletsDonotUseColorAlone', AppletsDonotUseColorAlone);\nmap.set('aSuspiciousLinkText', ASuspiciousLinkText);\nmap.set('aTitleDescribesDestination', ATitleDescribesDestination);\nmap.set('animatedGifMayBePresent', AnimatedGifMayBePresent);\nmap.set('areaAltIdentifiesDestination', AreaAltIdentifiesDestination);\nmap.set('areaAltRefersToText', AreaAltRefersToText);\nmap.set('areaDontOpenNewWindow', AreaDontOpenNewWindow);\nmap.set('areaHasAltValue', AreaHasAltValue);\nmap.set('areaLinksToSoundFile', AreaLinksToSoundFile);\nmap.set('audioMayBePresent', AudioMayBePresent);\nmap.set('basefontIsNotUsed', BasefontIsNotUsed);\nmap.set('blinkIsNotUsed', BlinkIsNotUsed);\nmap.set('blockquoteNotUsedForIndentation', BlockquoteNotUsedForIndentation);\nmap.set('blockquoteUseForQuotations', BlockquoteUseForQuotations);\nmap.set('boldIsNotUsed', BoldIsNotUsed);\nmap.set('buttonHasName', ButtonHasName);\nmap.set('checkboxHasLabel', CheckboxHasLabel);\nmap.set('colorBackgroundGradientContrast', ColorBackgroundGradientContrast);\nmap.set('colorBackgroundImageContrast', ColorBackgroundImageContrast);\nmap.set('colorElementBehindBackgroundGradientContrast', ColorElementBehindBackgroundGradientContrast);\nmap.set('colorElementBehindBackgroundImageContrast', ColorElementBehindBackgroundImageContrast);\nmap.set('colorElementBehindContrast', ColorElementBehindContrast);\nmap.set('colorFontContrast', ColorFontContrast);\nmap.set('cssDocumentMakesSenseStyleTurnedOff', CssDocumentMakesSenseStyleTurnedOff);\nmap.set('definitionListsAreUsed', DefinitionListsAreUsed);\nmap.set('doctypeProvided', DoctypeProvided);\nmap.set('documentAcronymsHaveElement', DocumentAcronymsHaveElement);\nmap.set('documentAutoRedirectNotUsed', DocumentAutoRedirectNotUsed);\nmap.set('documentContentReadableWithoutStylesheets', DocumentContentReadableWithoutStylesheets);\nmap.set('documentHasTitleElement', DocumentHasTitleElement);\nmap.set('documentIsWrittenClearly', DocumentIsWrittenClearly);\nmap.set('documentLangIsISO639Standard', DocumentLangIsISO639Standard);\nmap.set('documentLangNotIdentified', DocumentLangNotIdentified);\nmap.set('documentMetaNotUsedWithTimeout', DocumentMetaNotUsedWithTimeout);\nmap.set('documentReadingDirection', DocumentReadingDirection);\nmap.set('documentStrictDocType', DocumentStrictDocType);\nmap.set('documentTitleDescribesDocument', DocumentTitleDescribesDocument);\nmap.set('documentTitleIsNotPlaceholder', DocumentTitleIsNotPlaceholder);\nmap.set('documentTitleIsShort', DocumentTitleIsShort);\nmap.set('documentTitleNotEmpty', DocumentTitleNotEmpty);\nmap.set('documentVisualListsAreMarkedUp', DocumentVisualListsAreMarkedUp);\nmap.set('embedHasAssociatedNoEmbed', EmbedHasAssociatedNoEmbed);\nmap.set('embedMustHaveAltAttribute', EmbedMustHaveAltAttribute);\nmap.set('fieldsetHasLabel', FieldsetHasLabel);\nmap.set('fileHasLabel', FileHasLabel);\nmap.set('fontIsNotUsed', FontIsNotUsed);\nmap.set('formButtonsHaveValue', FormButtonsHaveValue);\nmap.set('formErrorMessageHelpsUser', FormErrorMessageHelpsUser);\nmap.set('formHasGoodErrorMessage', FormHasGoodErrorMessage);\nmap.set('formHasSubmitButton', FormHasSubmitButton);\nmap.set('formWithRequiredLabel', FormWithRequiredLabel);\nmap.set('headerH1', HeaderH1);\nmap.set('headerH1Format', HeaderH1Format);\nmap.set('headerH2', HeaderH2);\nmap.set('headerH2Format', HeaderH2Format);\nmap.set('headerH3', HeaderH3);\nmap.set('headerH3Format', HeaderH3Format);\nmap.set('headerH4', HeaderH4);\nmap.set('headerH4Format', HeaderH4Format);\nmap.set('headerH5Format', HeaderH5Format);\nmap.set('headerH6Format', HeaderH6Format);\nmap.set('headersAttrRefersToATableCell', HeadersAttrRefersToATableCell);\nmap.set('headersHaveText', HeadersHaveText);\nmap.set('headersUseToMarkSections', HeadersUseToMarkSections);\nmap.set('iIsNotUsed', IIsNotUsed);\nmap.set('idrefsHasCorrespondingId', IdrefsHasCorrespondingId);\nmap.set('iframeMustNotHaveLongdesc', IframeMustNotHaveLongdesc);\nmap.set('imageMapServerSide', ImageMapServerSide);\nmap.set('imgAltIsDifferent', ImgAltIsDifferent);\nmap.set('imgAltIsTooLong', ImgAltIsTooLong);\nmap.set('imgAltNotEmptyInAnchor', ImgAltNotEmptyInAnchor);\nmap.set('imgAltNotPlaceHolder', ImgAltNotPlaceHolder);\nmap.set('imgHasAlt', ImgHasAlt);\nmap.set('imgHasLongDesc', ImgHasLongDesc);\nmap.set('imgImportantNoSpacerAlt', ImgImportantNoSpacerAlt);\nmap.set('imgNonDecorativeHasAlt', ImgNonDecorativeHasAlt);\nmap.set('imgServerSideMapNotUsed', ImgServerSideMapNotUsed);\nmap.set('imgShouldNotHaveTitle', ImgShouldNotHaveTitle);\nmap.set('imgWithMapHasUseMap', ImgWithMapHasUseMap);\nmap.set('inputCheckboxRequiresFieldset', InputCheckboxRequiresFieldset);\nmap.set('inputElementsDontHaveAlt', InputElementsDontHaveAlt);\nmap.set('inputImageAltIsNotFileName', InputImageAltIsNotFileName);\nmap.set('inputImageAltIsNotPlaceholder', InputImageAltIsNotPlaceholder);\nmap.set('inputImageAltIsShort', InputImageAltIsShort);\nmap.set('inputImageAltNotRedundant', InputImageAltNotRedundant);\nmap.set('inputImageHasAlt', InputImageHasAlt);\nmap.set('inputTextHasLabel', InputTextHasLabel);\nmap.set('inputTextHasValue', InputTextHasValue);\nmap.set('inputTextValueNotEmpty', InputTextValueNotEmpty);\nmap.set('inputWithoutLabelHasTitle', InputWithoutLabelHasTitle);\nmap.set('labelDoesNotContainInput', LabelDoesNotContainInput);\nmap.set('labelMustBeUnique', LabelMustBeUnique);\nmap.set('labelMustNotBeEmpty', LabelMustNotBeEmpty);\nmap.set('labelsAreAssignedToAnInput', LabelsAreAssignedToAnInput);\nmap.set('languageDirAttributeIsUsed', LanguageDirAttributeIsUsed);\nmap.set('languageDirectionPunctuation', LanguageDirectionPunctuation);\nmap.set('languageUnicodeDirection', LanguageUnicodeDirection);\nmap.set('legendTextNotEmpty', LegendTextNotEmpty);\nmap.set('legendTextNotPlaceholder', LegendTextNotPlaceholder);\nmap.set('liDontUseImageForBullet', LiDontUseImageForBullet);\nmap.set('linkHasAUniqueContext', LinkHasAUniqueContext);\nmap.set('listNotUsedForFormatting', ListNotUsedForFormatting);\nmap.set('listOfLinksUseList', ListOfLinksUseList);\nmap.set('marqueeIsNotUsed', MarqueeIsNotUsed);\nmap.set('newWindowIsOpened', NewWindowIsOpened);\nmap.set('objectMustContainText', ObjectMustContainText);\nmap.set('objectMustHaveEmbed', ObjectMustHaveEmbed);\nmap.set('objectMustHaveTitle', ObjectMustHaveTitle);\nmap.set('objectMustHaveValidTitle', ObjectMustHaveValidTitle);\nmap.set('pNotUsedAsHeader', PNotUsedAsHeader);\nmap.set('passwordHasLabel', PasswordHasLabel);\nmap.set('preShouldNotBeUsedForTabularLayout', PreShouldNotBeUsedForTabularLayout);\nmap.set('radioHasLabel', RadioHasLabel);\nmap.set('scriptOnclickRequiresOnKeypress', ScriptOnclickRequiresOnKeypress);\nmap.set('scriptOndblclickRequiresOnKeypress', ScriptOndblclickRequiresOnKeypress);\nmap.set('scriptOnmousedownRequiresOnKeypress', ScriptOnmousedownRequiresOnKeypress);\nmap.set('scriptOnmousemove', ScriptOnmousemove);\nmap.set('scriptOnmouseoutHasOnmouseblur', ScriptOnmouseoutHasOnmouseblur);\nmap.set('scriptOnmouseoverHasOnfocus', ScriptOnmouseoverHasOnfocus);\nmap.set('scriptOnmouseupHasOnkeyup', ScriptOnmouseupHasOnkeyup);\nmap.set('selectHasAssociatedLabel', SelectHasAssociatedLabel);\nmap.set('selectJumpMenu', SelectJumpMenu);\nmap.set('siteMap', SiteMap);\nmap.set('skipToContentLinkProvided', SkipToContentLinkProvided);\nmap.set('svgContainsTitle', SvgContainsTitle);\nmap.set('tabIndexFollowsLogicalOrder', TabIndexFollowsLogicalOrder);\nmap.set('tableDataShouldHaveTh', TableDataShouldHaveTh);\nmap.set('tableLayoutDataShouldNotHaveTh', TableLayoutDataShouldNotHaveTh);\nmap.set('tableLayoutHasNoCaption', TableLayoutHasNoCaption);\nmap.set('tableLayoutHasNoSummary', TableLayoutHasNoSummary);\nmap.set('tableLayoutMakesSenseLinearized', TableLayoutMakesSenseLinearized);\nmap.set('tableNotUsedForLayout', TableNotUsedForLayout);\nmap.set('tableShouldUseHeaderIDs', TableShouldUseHeaderIDs);\nmap.set('tableSummaryDoesNotDuplicateCaption', TableSummaryDoesNotDuplicateCaption);\nmap.set('tableSummaryIsEmpty', TableSummaryIsEmpty);\nmap.set('tableSummaryIsNotTooLong', TableSummaryIsNotTooLong);\nmap.set('tableUseColGroup', TableUseColGroup);\nmap.set('tableUsesAbbreviationForHeader', TableUsesAbbreviationForHeader);\nmap.set('tableUsesCaption', TableUsesCaption);\nmap.set('tableUsesScopeForRow', TableUsesScopeForRow);\nmap.set('tabularDataIsInTable', TabularDataIsInTable);\nmap.set('textIsNotSmall', TextIsNotSmall);\nmap.set('textareaHasAssociatedLabel', TextareaHasAssociatedLabel);\nmap.set('videoMayBePresent', VideoMayBePresent);\nmap.set('videosEmbeddedOrLinkedNeedCaptions', VideosEmbeddedOrLinkedNeedCaptions);\nmap.set('whiteSpaceInWord', WhiteSpaceInWord);\nmap.set('whiteSpaceNotUsedForFormatting', WhiteSpaceNotUsedForFormatting);\nmodule.exports = map;\n\n},{\"AAdjacentWithSameResourceShouldBeCombined\":242,\"AImgAltNotRepetitive\":243,\"AInPHasADistinctStyle\":244,\"ALinkTextDoesNotBeginWithRedundantWord\":245,\"ALinkWithNonText\":246,\"ALinksAreSeparatedByPrintableCharacters\":247,\"ALinksDontOpenNewWindow\":248,\"ALinksNotSeparatedBySymbols\":249,\"ALinksToMultiMediaRequireTranscript\":250,\"ALinksToSoundFilesNeedTranscripts\":251,\"AMultimediaTextAlternative\":252,\"AMustContainText\":253,\"AMustHaveTitle\":254,\"AMustNotHaveJavascriptHref\":255,\"ASuspiciousLinkText\":256,\"ATitleDescribesDestination\":257,\"AnimatedGifMayBePresent\":258,\"AppletContainsTextEquivalent\":259,\"AppletContainsTextEquivalentInAlt\":260,\"AppletProvidesMechanismToReturnToParent\":261,\"AppletTextEquivalentsGetUpdated\":262,\"AppletUIMustBeAccessible\":263,\"AppletsDoNotFlicker\":264,\"AppletsDonotUseColorAlone\":265,\"AreaAltIdentifiesDestination\":266,\"AreaAltRefersToText\":267,\"AreaDontOpenNewWindow\":268,\"AreaHasAltValue\":269,\"AreaLinksToSoundFile\":270,\"AudioMayBePresent\":271,\"BasefontIsNotUsed\":272,\"BlinkIsNotUsed\":273,\"BlockquoteNotUsedForIndentation\":274,\"BlockquoteUseForQuotations\":275,\"BoldIsNotUsed\":276,\"ButtonHasName\":277,\"CheckboxHasLabel\":278,\"ColorBackgroundGradientContrast\":279,\"ColorBackgroundImageContrast\":280,\"ColorElementBehindBackgroundGradientContrast\":281,\"ColorElementBehindBackgroundImageContrast\":282,\"ColorElementBehindContrast\":283,\"ColorFontContrast\":284,\"CssDocumentMakesSenseStyleTurnedOff\":285,\"DefinitionListsAreUsed\":286,\"DoctypeProvided\":287,\"DocumentAcronymsHaveElement\":288,\"DocumentAutoRedirectNotUsed\":289,\"DocumentContentReadableWithoutStylesheets\":290,\"DocumentHasTitleElement\":291,\"DocumentIsWrittenClearly\":292,\"DocumentLangIsISO639Standard\":293,\"DocumentLangNotIdentified\":294,\"DocumentMetaNotUsedWithTimeout\":295,\"DocumentReadingDirection\":296,\"DocumentStrictDocType\":297,\"DocumentTitleDescribesDocument\":298,\"DocumentTitleIsNotPlaceholder\":299,\"DocumentTitleIsShort\":300,\"DocumentTitleNotEmpty\":301,\"DocumentVisualListsAreMarkedUp\":302,\"EmbedHasAssociatedNoEmbed\":303,\"EmbedMustHaveAltAttribute\":304,\"FieldsetHasLabel\":305,\"FileHasLabel\":306,\"FontIsNotUsed\":307,\"FormButtonsHaveValue\":308,\"FormErrorMessageHelpsUser\":309,\"FormHasGoodErrorMessage\":310,\"FormHasSubmitButton\":311,\"FormWithRequiredLabel\":312,\"HeaderH1\":313,\"HeaderH1Format\":314,\"HeaderH2\":315,\"HeaderH2Format\":316,\"HeaderH3\":317,\"HeaderH3Format\":318,\"HeaderH4\":319,\"HeaderH4Format\":320,\"HeaderH5Format\":321,\"HeaderH6Format\":322,\"HeadersAttrRefersToATableCell\":323,\"HeadersHaveText\":324,\"HeadersUseToMarkSections\":325,\"IIsNotUsed\":326,\"IdrefsHasCorrespondingId\":327,\"IframeMustNotHaveLongdesc\":328,\"ImageMapServerSide\":329,\"ImgAltIsDifferent\":330,\"ImgAltIsTooLong\":331,\"ImgAltNotEmptyInAnchor\":332,\"ImgAltNotPlaceHolder\":333,\"ImgHasAlt\":334,\"ImgHasLongDesc\":335,\"ImgImportantNoSpacerAlt\":336,\"ImgNonDecorativeHasAlt\":337,\"ImgServerSideMapNotUsed\":338,\"ImgShouldNotHaveTitle\":339,\"ImgWithMapHasUseMap\":340,\"InputCheckboxRequiresFieldset\":341,\"InputElementsDontHaveAlt\":342,\"InputImageAltIsNotFileName\":343,\"InputImageAltIsNotPlaceholder\":344,\"InputImageAltIsShort\":345,\"InputImageAltNotRedundant\":346,\"InputImageHasAlt\":347,\"InputTextHasLabel\":348,\"InputTextHasValue\":349,\"InputTextValueNotEmpty\":350,\"InputWithoutLabelHasTitle\":351,\"LabelDoesNotContainInput\":352,\"LabelMustBeUnique\":353,\"LabelMustNotBeEmpty\":354,\"LabelsAreAssignedToAnInput\":355,\"LanguageDirAttributeIsUsed\":356,\"LanguageDirectionPunctuation\":357,\"LanguageUnicodeDirection\":358,\"LegendTextNotEmpty\":359,\"LegendTextNotPlaceholder\":360,\"LiDontUseImageForBullet\":361,\"LinkHasAUniqueContext\":362,\"ListNotUsedForFormatting\":363,\"ListOfLinksUseList\":364,\"MarqueeIsNotUsed\":365,\"NewWindowIsOpened\":366,\"ObjectMustContainText\":367,\"ObjectMustHaveEmbed\":368,\"ObjectMustHaveTitle\":369,\"ObjectMustHaveValidTitle\":370,\"PNotUsedAsHeader\":371,\"PasswordHasLabel\":372,\"PreShouldNotBeUsedForTabularLayout\":373,\"RadioHasLabel\":374,\"ScriptOnclickRequiresOnKeypress\":375,\"ScriptOndblclickRequiresOnKeypress\":376,\"ScriptOnmousedownRequiresOnKeypress\":377,\"ScriptOnmousemove\":378,\"ScriptOnmouseoutHasOnmouseblur\":379,\"ScriptOnmouseoverHasOnfocus\":380,\"ScriptOnmouseupHasOnkeyup\":381,\"SelectHasAssociatedLabel\":382,\"SelectJumpMenu\":383,\"SiteMap\":384,\"SkipToContentLinkProvided\":385,\"SvgContainsTitle\":386,\"TabIndexFollowsLogicalOrder\":387,\"TableDataShouldHaveTh\":388,\"TableLayoutDataShouldNotHaveTh\":389,\"TableLayoutHasNoCaption\":390,\"TableLayoutHasNoSummary\":391,\"TableLayoutMakesSenseLinearized\":392,\"TableNotUsedForLayout\":393,\"TableShouldUseHeaderIDs\":394,\"TableSummaryDoesNotDuplicateCaption\":395,\"TableSummaryIsEmpty\":396,\"TableSummaryIsNotTooLong\":397,\"TableUseColGroup\":398,\"TableUsesAbbreviationForHeader\":399,\"TableUsesCaption\":400,\"TableUsesScopeForRow\":401,\"TabularDataIsInTable\":402,\"TextIsNotSmall\":403,\"TextareaHasAssociatedLabel\":404,\"VideoMayBePresent\":405,\"VideosEmbeddedOrLinkedNeedCaptions\":406,\"WhiteSpaceInWord\":407,\"WhiteSpaceNotUsedForFormatting\":408}],41:[function(require,module,exports){\n(function (global){\n\"use strict\";\n\nrequire(\"core-js/shim\");\n\nrequire(\"babel-regenerator-runtime\");\n\nif (global._babelPolyfill) {\n  throw new Error(\"only one instance of babel-polyfill is allowed\");\n}\nglobal._babelPolyfill = true;\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"babel-regenerator-runtime\":42,\"core-js/shim\":229}],42:[function(require,module,exports){\n(function (process,global){\n\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!function (global) {\n  \"use strict\";\n\n  var hasOwn = Object.prototype.hasOwnProperty;\n  var undefined; // More compressible than void 0.\n  var iteratorSymbol = typeof Symbol === \"function\" && Symbol.iterator || \"@@iterator\";\n\n  var inModule = (typeof module === \"undefined\" ? \"undefined\" : _typeof(module)) === \"object\";\n  var runtime = global.regeneratorRuntime;\n  if (runtime) {\n    if (inModule) {\n      // If regeneratorRuntime is defined globally and we're in a module,\n      // make the exports object identical to regeneratorRuntime.\n      module.exports = runtime;\n    }\n    // Don't bother evaluating the rest of this file if the runtime was\n    // already defined globally.\n    return;\n  }\n\n  // Define the runtime globally (as expected by generated code) as either\n  // module.exports (if we're in a module) or a new, empty object.\n  runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n  function wrap(innerFn, outerFn, self, tryLocsList) {\n    // If outerFn provided, then outerFn.prototype instanceof Generator.\n    var generator = Object.create((outerFn || Generator).prototype);\n    var context = new Context(tryLocsList || []);\n\n    // The ._invoke method unifies the implementations of the .next,\n    // .throw, and .return methods.\n    generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n    return generator;\n  }\n  runtime.wrap = wrap;\n\n  // Try/catch helper to minimize deoptimizations. Returns a completion\n  // record like context.tryEntries[i].completion. This interface could\n  // have been (and was previously) designed to take a closure to be\n  // invoked without arguments, but in all the cases we care about we\n  // already have an existing method we want to call, so there's no need\n  // to create a new function object. We can even get away with assuming\n  // the method takes exactly one argument, since that happens to be true\n  // in every case, so we don't have to touch the arguments object. The\n  // only additional allocation required is the completion record, which\n  // has a stable shape and so hopefully should be cheap to allocate.\n  function tryCatch(fn, obj, arg) {\n    try {\n      return { type: \"normal\", arg: fn.call(obj, arg) };\n    } catch (err) {\n      return { type: \"throw\", arg: err };\n    }\n  }\n\n  var GenStateSuspendedStart = \"suspendedStart\";\n  var GenStateSuspendedYield = \"suspendedYield\";\n  var GenStateExecuting = \"executing\";\n  var GenStateCompleted = \"completed\";\n\n  // Returning this object from the innerFn has the same effect as\n  // breaking out of the dispatch switch statement.\n  var ContinueSentinel = {};\n\n  // Dummy constructor functions that we use as the .constructor and\n  // .constructor.prototype properties for functions that return Generator\n  // objects. For full spec compliance, you may wish to configure your\n  // minifier not to mangle the names of these two functions.\n  function Generator() {}\n  function GeneratorFunction() {}\n  function GeneratorFunctionPrototype() {}\n\n  var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype;\n  GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n  GeneratorFunctionPrototype.constructor = GeneratorFunction;\n  GeneratorFunction.displayName = \"GeneratorFunction\";\n\n  // Helper for defining the .next, .throw, and .return methods of the\n  // Iterator interface in terms of a single ._invoke method.\n  function defineIteratorMethods(prototype) {\n    [\"next\", \"throw\", \"return\"].forEach(function (method) {\n      prototype[method] = function (arg) {\n        return this._invoke(method, arg);\n      };\n    });\n  }\n\n  runtime.isGeneratorFunction = function (genFun) {\n    var ctor = typeof genFun === \"function\" && genFun.constructor;\n    return ctor ? ctor === GeneratorFunction ||\n    // For the native GeneratorFunction constructor, the best we can\n    // do is to check its .name property.\n    (ctor.displayName || ctor.name) === \"GeneratorFunction\" : false;\n  };\n\n  runtime.mark = function (genFun) {\n    if (Object.setPrototypeOf) {\n      Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n    } else {\n      genFun.__proto__ = GeneratorFunctionPrototype;\n    }\n    genFun.prototype = Object.create(Gp);\n    return genFun;\n  };\n\n  // Within the body of any async function, `await x` is transformed to\n  // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n  // `value instanceof AwaitArgument` to determine if the yielded value is\n  // meant to be awaited. Some may consider the name of this method too\n  // cutesy, but they are curmudgeons.\n  runtime.awrap = function (arg) {\n    return new AwaitArgument(arg);\n  };\n\n  function AwaitArgument(arg) {\n    this.arg = arg;\n  }\n\n  function AsyncIterator(generator) {\n    // This invoke function is written in a style that assumes some\n    // calling function (or Promise) will handle exceptions.\n    function invoke(method, arg) {\n      var result = generator[method](arg);\n      var value = result.value;\n      return value instanceof AwaitArgument ? Promise.resolve(value.arg).then(invokeNext, invokeThrow) : Promise.resolve(value).then(function (unwrapped) {\n        // When a yielded Promise is resolved, its final value becomes\n        // the .value of the Promise<{value,done}> result for the\n        // current iteration. If the Promise is rejected, however, the\n        // result for this iteration will be rejected with the same\n        // reason. Note that rejections of yielded Promises are not\n        // thrown back into the generator function, as is the case\n        // when an awaited Promise is rejected. This difference in\n        // behavior between yield and await is important, because it\n        // allows the consumer to decide what to do with the yielded\n        // rejection (swallow it and continue, manually .throw it back\n        // into the generator, abandon iteration, whatever). With\n        // await, by contrast, there is no opportunity to examine the\n        // rejection reason outside the generator function, so the\n        // only option is to throw it from the await expression, and\n        // let the generator function handle the exception.\n        result.value = unwrapped;\n        return result;\n      });\n    }\n\n    if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && process.domain) {\n      invoke = process.domain.bind(invoke);\n    }\n\n    var invokeNext = invoke.bind(generator, \"next\");\n    var invokeThrow = invoke.bind(generator, \"throw\");\n    var invokeReturn = invoke.bind(generator, \"return\");\n    var previousPromise;\n\n    function enqueue(method, arg) {\n      function callInvokeWithMethodAndArg() {\n        return invoke(method, arg);\n      }\n\n      return previousPromise =\n      // If enqueue has been called before, then we want to wait until\n      // all previous Promises have been resolved before calling invoke,\n      // so that results are always delivered in the correct order. If\n      // enqueue has not been called before, then it is important to\n      // call invoke immediately, without waiting on a callback to fire,\n      // so that the async generator function has the opportunity to do\n      // any necessary setup in a predictable way. This predictability\n      // is why the Promise constructor synchronously invokes its\n      // executor callback, and why async functions synchronously\n      // execute code before the first await. Since we implement simple\n      // async functions in terms of async generators, it is especially\n      // important to get this right, even though it requires care.\n      previousPromise ? previousPromise.then(callInvokeWithMethodAndArg,\n      // Avoid propagating failures to Promises returned by later\n      // invocations of the iterator.\n      callInvokeWithMethodAndArg) : new Promise(function (resolve) {\n        resolve(callInvokeWithMethodAndArg());\n      });\n    }\n\n    // Define the unified helper method that is used to implement .next,\n    // .throw, and .return (see defineIteratorMethods).\n    this._invoke = enqueue;\n  }\n\n  defineIteratorMethods(AsyncIterator.prototype);\n\n  // Note that simple async functions are implemented on top of\n  // AsyncIterator objects; they just return a Promise for the value of\n  // the final result produced by the iterator.\n  runtime.async = function (innerFn, outerFn, self, tryLocsList) {\n    var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList));\n\n    return runtime.isGeneratorFunction(outerFn) ? iter // If outerFn is a generator, return the full iterator.\n    : iter.next().then(function (result) {\n      return result.done ? result.value : iter.next();\n    });\n  };\n\n  function makeInvokeMethod(innerFn, self, context) {\n    var state = GenStateSuspendedStart;\n\n    return function invoke(method, arg) {\n      if (state === GenStateExecuting) {\n        throw new Error(\"Generator is already running\");\n      }\n\n      if (state === GenStateCompleted) {\n        if (method === \"throw\") {\n          throw arg;\n        }\n\n        // Be forgiving, per 25.3.3.3.3 of the spec:\n        // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n        return doneResult();\n      }\n\n      while (true) {\n        var delegate = context.delegate;\n        if (delegate) {\n          if (method === \"return\" || method === \"throw\" && delegate.iterator[method] === undefined) {\n            // A return or throw (when the delegate iterator has no throw\n            // method) always terminates the yield* loop.\n            context.delegate = null;\n\n            // If the delegate iterator has a return method, give it a\n            // chance to clean up.\n            var returnMethod = delegate.iterator[\"return\"];\n            if (returnMethod) {\n              var record = tryCatch(returnMethod, delegate.iterator, arg);\n              if (record.type === \"throw\") {\n                // If the return method threw an exception, let that\n                // exception prevail over the original return or throw.\n                method = \"throw\";\n                arg = record.arg;\n                continue;\n              }\n            }\n\n            if (method === \"return\") {\n              // Continue with the outer return, now that the delegate\n              // iterator has been terminated.\n              continue;\n            }\n          }\n\n          var record = tryCatch(delegate.iterator[method], delegate.iterator, arg);\n\n          if (record.type === \"throw\") {\n            context.delegate = null;\n\n            // Like returning generator.throw(uncaught), but without the\n            // overhead of an extra function call.\n            method = \"throw\";\n            arg = record.arg;\n            continue;\n          }\n\n          // Delegate generator ran and handled its own exceptions so\n          // regardless of what the method was, we continue as if it is\n          // \"next\" with an undefined arg.\n          method = \"next\";\n          arg = undefined;\n\n          var info = record.arg;\n          if (info.done) {\n            context[delegate.resultName] = info.value;\n            context.next = delegate.nextLoc;\n          } else {\n            state = GenStateSuspendedYield;\n            return info;\n          }\n\n          context.delegate = null;\n        }\n\n        if (method === \"next\") {\n          context._sent = arg;\n\n          if (state === GenStateSuspendedYield) {\n            context.sent = arg;\n          } else {\n            context.sent = undefined;\n          }\n        } else if (method === \"throw\") {\n          if (state === GenStateSuspendedStart) {\n            state = GenStateCompleted;\n            throw arg;\n          }\n\n          if (context.dispatchException(arg)) {\n            // If the dispatched exception was caught by a catch block,\n            // then let that catch block handle the exception normally.\n            method = \"next\";\n            arg = undefined;\n          }\n        } else if (method === \"return\") {\n          context.abrupt(\"return\", arg);\n        }\n\n        state = GenStateExecuting;\n\n        var record = tryCatch(innerFn, self, context);\n        if (record.type === \"normal\") {\n          // If an exception is thrown from innerFn, we leave state ===\n          // GenStateExecuting and loop back for another invocation.\n          state = context.done ? GenStateCompleted : GenStateSuspendedYield;\n\n          var info = {\n            value: record.arg,\n            done: context.done\n          };\n\n          if (record.arg === ContinueSentinel) {\n            if (context.delegate && method === \"next\") {\n              // Deliberately forget the last sent value so that we don't\n              // accidentally pass it on to the delegate.\n              arg = undefined;\n            }\n          } else {\n            return info;\n          }\n        } else if (record.type === \"throw\") {\n          state = GenStateCompleted;\n          // Dispatch the exception by looping back around to the\n          // context.dispatchException(arg) call above.\n          method = \"throw\";\n          arg = record.arg;\n        }\n      }\n    };\n  }\n\n  // Define Generator.prototype.{next,throw,return} in terms of the\n  // unified ._invoke helper method.\n  defineIteratorMethods(Gp);\n\n  Gp[iteratorSymbol] = function () {\n    return this;\n  };\n\n  Gp.toString = function () {\n    return \"[object Generator]\";\n  };\n\n  function pushTryEntry(locs) {\n    var entry = { tryLoc: locs[0] };\n\n    if (1 in locs) {\n      entry.catchLoc = locs[1];\n    }\n\n    if (2 in locs) {\n      entry.finallyLoc = locs[2];\n      entry.afterLoc = locs[3];\n    }\n\n    this.tryEntries.push(entry);\n  }\n\n  function resetTryEntry(entry) {\n    var record = entry.completion || {};\n    record.type = \"normal\";\n    delete record.arg;\n    entry.completion = record;\n  }\n\n  function Context(tryLocsList) {\n    // The root entry object (effectively a try statement without a catch\n    // or a finally block) gives us a place to store values thrown from\n    // locations where there is no enclosing try statement.\n    this.tryEntries = [{ tryLoc: \"root\" }];\n    tryLocsList.forEach(pushTryEntry, this);\n    this.reset(true);\n  }\n\n  runtime.keys = function (object) {\n    var keys = [];\n    for (var key in object) {\n      keys.push(key);\n    }\n    keys.reverse();\n\n    // Rather than returning an object with a next method, we keep\n    // things simple and return the next function itself.\n    return function next() {\n      while (keys.length) {\n        var key = keys.pop();\n        if (key in object) {\n          next.value = key;\n          next.done = false;\n          return next;\n        }\n      }\n\n      // To avoid creating an additional object, we just hang the .value\n      // and .done properties off the next function object itself. This\n      // also ensures that the minifier will not anonymize the function.\n      next.done = true;\n      return next;\n    };\n  };\n\n  function values(iterable) {\n    if (iterable) {\n      var iteratorMethod = iterable[iteratorSymbol];\n      if (iteratorMethod) {\n        return iteratorMethod.call(iterable);\n      }\n\n      if (typeof iterable.next === \"function\") {\n        return iterable;\n      }\n\n      if (!isNaN(iterable.length)) {\n        var i = -1,\n            next = function next() {\n          while (++i < iterable.length) {\n            if (hasOwn.call(iterable, i)) {\n              next.value = iterable[i];\n              next.done = false;\n              return next;\n            }\n          }\n\n          next.value = undefined;\n          next.done = true;\n\n          return next;\n        };\n\n        return next.next = next;\n      }\n    }\n\n    // Return an iterator with no values.\n    return { next: doneResult };\n  }\n  runtime.values = values;\n\n  function doneResult() {\n    return { value: undefined, done: true };\n  }\n\n  Context.prototype = {\n    constructor: Context,\n\n    reset: function reset(skipTempReset) {\n      this.prev = 0;\n      this.next = 0;\n      this.sent = undefined;\n      this.done = false;\n      this.delegate = null;\n\n      this.tryEntries.forEach(resetTryEntry);\n\n      if (!skipTempReset) {\n        for (var name in this) {\n          // Not sure about the optimal order of these conditions:\n          if (name.charAt(0) === \"t\" && hasOwn.call(this, name) && !isNaN(+name.slice(1))) {\n            this[name] = undefined;\n          }\n        }\n      }\n    },\n\n    stop: function stop() {\n      this.done = true;\n\n      var rootEntry = this.tryEntries[0];\n      var rootRecord = rootEntry.completion;\n      if (rootRecord.type === \"throw\") {\n        throw rootRecord.arg;\n      }\n\n      return this.rval;\n    },\n\n    dispatchException: function dispatchException(exception) {\n      if (this.done) {\n        throw exception;\n      }\n\n      var context = this;\n      function handle(loc, caught) {\n        record.type = \"throw\";\n        record.arg = exception;\n        context.next = loc;\n        return !!caught;\n      }\n\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        var record = entry.completion;\n\n        if (entry.tryLoc === \"root\") {\n          // Exception thrown outside of any try block that could handle\n          // it, so set the completion value of the entire function to\n          // throw the exception.\n          return handle(\"end\");\n        }\n\n        if (entry.tryLoc <= this.prev) {\n          var hasCatch = hasOwn.call(entry, \"catchLoc\");\n          var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n          if (hasCatch && hasFinally) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            } else if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n          } else if (hasCatch) {\n            if (this.prev < entry.catchLoc) {\n              return handle(entry.catchLoc, true);\n            }\n          } else if (hasFinally) {\n            if (this.prev < entry.finallyLoc) {\n              return handle(entry.finallyLoc);\n            }\n          } else {\n            throw new Error(\"try statement without catch or finally\");\n          }\n        }\n      }\n    },\n\n    abrupt: function abrupt(type, arg) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n          var finallyEntry = entry;\n          break;\n        }\n      }\n\n      if (finallyEntry && (type === \"break\" || type === \"continue\") && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc) {\n        // Ignore the finally entry if control is not jumping to a\n        // location outside the try/catch block.\n        finallyEntry = null;\n      }\n\n      var record = finallyEntry ? finallyEntry.completion : {};\n      record.type = type;\n      record.arg = arg;\n\n      if (finallyEntry) {\n        this.next = finallyEntry.finallyLoc;\n      } else {\n        this.complete(record);\n      }\n\n      return ContinueSentinel;\n    },\n\n    complete: function complete(record, afterLoc) {\n      if (record.type === \"throw\") {\n        throw record.arg;\n      }\n\n      if (record.type === \"break\" || record.type === \"continue\") {\n        this.next = record.arg;\n      } else if (record.type === \"return\") {\n        this.rval = record.arg;\n        this.next = \"end\";\n      } else if (record.type === \"normal\" && afterLoc) {\n        this.next = afterLoc;\n      }\n    },\n\n    finish: function finish(finallyLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.finallyLoc === finallyLoc) {\n          this.complete(entry.completion, entry.afterLoc);\n          resetTryEntry(entry);\n          return ContinueSentinel;\n        }\n      }\n    },\n\n    \"catch\": function _catch(tryLoc) {\n      for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n        var entry = this.tryEntries[i];\n        if (entry.tryLoc === tryLoc) {\n          var record = entry.completion;\n          if (record.type === \"throw\") {\n            var thrown = record.arg;\n            resetTryEntry(entry);\n          }\n          return thrown;\n        }\n      }\n\n      // The context.catch method must only be called with a location\n      // argument that corresponds to a known catch block.\n      throw new Error(\"illegal catch attempt\");\n    },\n\n    delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n      this.delegate = {\n        iterator: values(iterable),\n        resultName: resultName,\n        nextLoc: nextLoc\n      };\n\n      return ContinueSentinel;\n    }\n  };\n}(\n// Among the various tricks for obtaining a reference to the global\n// object, this seems to be the most reliable technique that does not\n// use indirect eval (which violates Content Security Policy).\n(typeof global === \"undefined\" ? \"undefined\" : _typeof(global)) === \"object\" ? global : (typeof window === \"undefined\" ? \"undefined\" : _typeof(window)) === \"object\" ? window : (typeof self === \"undefined\" ? \"undefined\" : _typeof(self)) === \"object\" ? self : undefined);\n\n}).call(this,require('_process'),typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"_process\":238}],43:[function(require,module,exports){\n'use strict';\n\nmodule.exports = function (it) {\n  if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n  return it;\n};\n\n},{}],44:[function(require,module,exports){\n'use strict';\n\n// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./$.wks')('unscopables'),\n    ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./$.hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n  ArrayProto[UNSCOPABLES][key] = true;\n};\n\n},{\"./$.hide\":72,\"./$.wks\":124}],45:[function(require,module,exports){\n'use strict';\n\nvar isObject = require('./$.is-object');\nmodule.exports = function (it) {\n  if (!isObject(it)) throw TypeError(it + ' is not an object!');\n  return it;\n};\n\n},{\"./$.is-object\":79}],46:[function(require,module,exports){\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\n\nvar toObject = require('./$.to-object'),\n    toIndex = require('./$.to-index'),\n    toLength = require('./$.to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /*= 0*/, start /*= 0, end = @length*/) {\n  var O = toObject(this),\n      len = toLength(O.length),\n      to = toIndex(target, len),\n      from = toIndex(start, len),\n      $$ = arguments,\n      end = $$.length > 2 ? $$[2] : undefined,\n      count = Math.min((end === undefined ? len : toIndex(end, len)) - from, len - to),\n      inc = 1;\n  if (from < to && to < from + count) {\n    inc = -1;\n    from += count - 1;\n    to += count - 1;\n  }\n  while (count-- > 0) {\n    if (from in O) O[to] = O[from];else delete O[to];\n    to += inc;\n    from += inc;\n  }return O;\n};\n\n},{\"./$.to-index\":117,\"./$.to-length\":120,\"./$.to-object\":121}],47:[function(require,module,exports){\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\n\nvar toObject = require('./$.to-object'),\n    toIndex = require('./$.to-index'),\n    toLength = require('./$.to-length');\nmodule.exports = [].fill || function fill(value /*, start = 0, end = @length */) {\n  var O = toObject(this),\n      length = toLength(O.length),\n      $$ = arguments,\n      $$len = $$.length,\n      index = toIndex($$len > 1 ? $$[1] : undefined, length),\n      end = $$len > 2 ? $$[2] : undefined,\n      endPos = end === undefined ? length : toIndex(end, length);\n  while (endPos > index) {\n    O[index++] = value;\n  }return O;\n};\n\n},{\"./$.to-index\":117,\"./$.to-length\":120,\"./$.to-object\":121}],48:[function(require,module,exports){\n'use strict';\n\n// false -> Array#indexOf\n// true  -> Array#includes\nvar toIObject = require('./$.to-iobject'),\n    toLength = require('./$.to-length'),\n    toIndex = require('./$.to-index');\nmodule.exports = function (IS_INCLUDES) {\n  return function ($this, el, fromIndex) {\n    var O = toIObject($this),\n        length = toLength(O.length),\n        index = toIndex(fromIndex, length),\n        value;\n    // Array#includes uses SameValueZero equality algorithm\n    if (IS_INCLUDES && el != el) while (length > index) {\n      value = O[index++];\n      if (value != value) return true;\n      // Array#toIndex ignores holes, Array#includes - not\n    } else for (; length > index; index++) {\n        if (IS_INCLUDES || index in O) {\n          if (O[index] === el) return IS_INCLUDES || index;\n        }\n      }return !IS_INCLUDES && -1;\n  };\n};\n\n},{\"./$.to-index\":117,\"./$.to-iobject\":119,\"./$.to-length\":120}],49:[function(require,module,exports){\n'use strict';\n\n// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./$.ctx'),\n    IObject = require('./$.iobject'),\n    toObject = require('./$.to-object'),\n    toLength = require('./$.to-length'),\n    asc = require('./$.array-species-create');\nmodule.exports = function (TYPE) {\n  var IS_MAP = TYPE == 1,\n      IS_FILTER = TYPE == 2,\n      IS_SOME = TYPE == 3,\n      IS_EVERY = TYPE == 4,\n      IS_FIND_INDEX = TYPE == 6,\n      NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n  return function ($this, callbackfn, that) {\n    var O = toObject($this),\n        self = IObject(O),\n        f = ctx(callbackfn, that, 3),\n        length = toLength(self.length),\n        index = 0,\n        result = IS_MAP ? asc($this, length) : IS_FILTER ? asc($this, 0) : undefined,\n        val,\n        res;\n    for (; length > index; index++) {\n      if (NO_HOLES || index in self) {\n        val = self[index];\n        res = f(val, index, O);\n        if (TYPE) {\n          if (IS_MAP) result[index] = res; // map\n          else if (res) switch (TYPE) {\n              case 3:\n                return true; // some\n              case 5:\n                return val; // find\n              case 6:\n                return index; // findIndex\n              case 2:\n                result.push(val); // filter\n            } else if (IS_EVERY) return false; // every\n        }\n      }\n    }return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n  };\n};\n\n},{\"./$.array-species-create\":50,\"./$.ctx\":58,\"./$.iobject\":75,\"./$.to-length\":120,\"./$.to-object\":121}],50:[function(require,module,exports){\n'use strict';\n\n// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar isObject = require('./$.is-object'),\n    isArray = require('./$.is-array'),\n    SPECIES = require('./$.wks')('species');\nmodule.exports = function (original, length) {\n  var C;\n  if (isArray(original)) {\n    C = original.constructor;\n    // cross-realm fallback\n    if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n    if (isObject(C)) {\n      C = C[SPECIES];\n      if (C === null) C = undefined;\n    }\n  }return new (C === undefined ? Array : C)(length);\n};\n\n},{\"./$.is-array\":77,\"./$.is-object\":79,\"./$.wks\":124}],51:[function(require,module,exports){\n'use strict';\n\n// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./$.cof'),\n    TAG = require('./$.wks')('toStringTag')\n// ES3 wrong here\n,\n    ARG = cof(function () {\n  return arguments;\n}()) == 'Arguments';\n\nmodule.exports = function (it) {\n  var O, T, B;\n  return it === undefined ? 'Undefined' : it === null ? 'Null'\n  // @@toStringTag case\n  : typeof (T = (O = Object(it))[TAG]) == 'string' ? T\n  // builtinTag case\n  : ARG ? cof(O)\n  // ES3 arguments fallback\n  : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n\n},{\"./$.cof\":52,\"./$.wks\":124}],52:[function(require,module,exports){\n\"use strict\";\n\nvar toString = {}.toString;\n\nmodule.exports = function (it) {\n  return toString.call(it).slice(8, -1);\n};\n\n},{}],53:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar $ = require('./$'),\n    hide = require('./$.hide'),\n    redefineAll = require('./$.redefine-all'),\n    ctx = require('./$.ctx'),\n    strictNew = require('./$.strict-new'),\n    defined = require('./$.defined'),\n    forOf = require('./$.for-of'),\n    $iterDefine = require('./$.iter-define'),\n    step = require('./$.iter-step'),\n    ID = require('./$.uid')('id'),\n    $has = require('./$.has'),\n    isObject = require('./$.is-object'),\n    setSpecies = require('./$.set-species'),\n    DESCRIPTORS = require('./$.descriptors'),\n    isExtensible = Object.isExtensible || isObject,\n    SIZE = DESCRIPTORS ? '_s' : 'size',\n    id = 0;\n\nvar fastKey = function fastKey(it, create) {\n  // return primitive with prefix\n  if (!isObject(it)) return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n  if (!$has(it, ID)) {\n    // can't set id to frozen object\n    if (!isExtensible(it)) return 'F';\n    // not necessary to add id\n    if (!create) return 'E';\n    // add missing object id\n    hide(it, ID, ++id);\n    // return object id with prefix\n  }return 'O' + it[ID];\n};\n\nvar getEntry = function getEntry(that, key) {\n  // fast case\n  var index = fastKey(key),\n      entry;\n  if (index !== 'F') return that._i[index];\n  // frozen object case\n  for (entry = that._f; entry; entry = entry.n) {\n    if (entry.k == key) return entry;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      strictNew(that, C, NAME);\n      that._i = $.create(null); // index\n      that._f = undefined; // first entry\n      that._l = undefined; // last entry\n      that[SIZE] = 0; // size\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.1.3.1 Map.prototype.clear()\n      // 23.2.3.2 Set.prototype.clear()\n      clear: function clear() {\n        for (var that = this, data = that._i, entry = that._f; entry; entry = entry.n) {\n          entry.r = true;\n          if (entry.p) entry.p = entry.p.n = undefined;\n          delete data[entry.i];\n        }\n        that._f = that._l = undefined;\n        that[SIZE] = 0;\n      },\n      // 23.1.3.3 Map.prototype.delete(key)\n      // 23.2.3.4 Set.prototype.delete(value)\n      'delete': function _delete(key) {\n        var that = this,\n            entry = getEntry(that, key);\n        if (entry) {\n          var next = entry.n,\n              prev = entry.p;\n          delete that._i[entry.i];\n          entry.r = true;\n          if (prev) prev.n = next;\n          if (next) next.p = prev;\n          if (that._f == entry) that._f = next;\n          if (that._l == entry) that._l = prev;\n          that[SIZE]--;\n        }return !!entry;\n      },\n      // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n      // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n      forEach: function forEach(callbackfn /*, that = undefined */) {\n        var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3),\n            entry;\n        while (entry = entry ? entry.n : this._f) {\n          f(entry.v, entry.k, this);\n          // revert to the last existing entry\n          while (entry && entry.r) {\n            entry = entry.p;\n          }\n        }\n      },\n      // 23.1.3.7 Map.prototype.has(key)\n      // 23.2.3.7 Set.prototype.has(value)\n      has: function has(key) {\n        return !!getEntry(this, key);\n      }\n    });\n    if (DESCRIPTORS) $.setDesc(C.prototype, 'size', {\n      get: function get() {\n        return defined(this[SIZE]);\n      }\n    });\n    return C;\n  },\n  def: function def(that, key, value) {\n    var entry = getEntry(that, key),\n        prev,\n        index;\n    // change existing entry\n    if (entry) {\n      entry.v = value;\n      // create new entry\n    } else {\n        that._l = entry = {\n          i: index = fastKey(key, true), // <- index\n          k: key, // <- key\n          v: value, // <- value\n          p: prev = that._l, // <- previous entry\n          n: undefined, // <- next entry\n          r: false // <- removed\n        };\n        if (!that._f) that._f = entry;\n        if (prev) prev.n = entry;\n        that[SIZE]++;\n        // add to index\n        if (index !== 'F') that._i[index] = entry;\n      }return that;\n  },\n  getEntry: getEntry,\n  setStrong: function setStrong(C, NAME, IS_MAP) {\n    // add .keys, .values, .entries, [@@iterator]\n    // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n    $iterDefine(C, NAME, function (iterated, kind) {\n      this._t = iterated; // target\n      this._k = kind; // kind\n      this._l = undefined; // previous\n    }, function () {\n      var that = this,\n          kind = that._k,\n          entry = that._l;\n      // revert to the last existing entry\n      while (entry && entry.r) {\n        entry = entry.p;\n      } // get next entry\n      if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n        // or finish the iteration\n        that._t = undefined;\n        return step(1);\n      }\n      // return step by kind\n      if (kind == 'keys') return step(0, entry.k);\n      if (kind == 'values') return step(0, entry.v);\n      return step(0, [entry.k, entry.v]);\n    }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n    // add [@@species], 23.1.2.2, 23.2.2.2\n    setSpecies(NAME);\n  }\n};\n\n},{\"./$\":87,\"./$.ctx\":58,\"./$.defined\":59,\"./$.descriptors\":60,\"./$.for-of\":68,\"./$.has\":71,\"./$.hide\":72,\"./$.is-object\":79,\"./$.iter-define\":83,\"./$.iter-step\":85,\"./$.redefine-all\":101,\"./$.set-species\":106,\"./$.strict-new\":110,\"./$.uid\":123}],54:[function(require,module,exports){\n'use strict';\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar forOf = require('./$.for-of'),\n    classof = require('./$.classof');\nmodule.exports = function (NAME) {\n  return function toJSON() {\n    if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n    var arr = [];\n    forOf(this, false, arr.push, arr);\n    return arr;\n  };\n};\n\n},{\"./$.classof\":51,\"./$.for-of\":68}],55:[function(require,module,exports){\n'use strict';\n\nvar hide = require('./$.hide'),\n    redefineAll = require('./$.redefine-all'),\n    anObject = require('./$.an-object'),\n    isObject = require('./$.is-object'),\n    strictNew = require('./$.strict-new'),\n    forOf = require('./$.for-of'),\n    createArrayMethod = require('./$.array-methods'),\n    $has = require('./$.has'),\n    WEAK = require('./$.uid')('weak'),\n    isExtensible = Object.isExtensible || isObject,\n    arrayFind = createArrayMethod(5),\n    arrayFindIndex = createArrayMethod(6),\n    id = 0;\n\n// fallback for frozen keys\nvar frozenStore = function frozenStore(that) {\n  return that._l || (that._l = new FrozenStore());\n};\nvar FrozenStore = function FrozenStore() {\n  this.a = [];\n};\nvar findFrozen = function findFrozen(store, key) {\n  return arrayFind(store.a, function (it) {\n    return it[0] === key;\n  });\n};\nFrozenStore.prototype = {\n  get: function get(key) {\n    var entry = findFrozen(this, key);\n    if (entry) return entry[1];\n  },\n  has: function has(key) {\n    return !!findFrozen(this, key);\n  },\n  set: function set(key, value) {\n    var entry = findFrozen(this, key);\n    if (entry) entry[1] = value;else this.a.push([key, value]);\n  },\n  'delete': function _delete(key) {\n    var index = arrayFindIndex(this.a, function (it) {\n      return it[0] === key;\n    });\n    if (~index) this.a.splice(index, 1);\n    return !! ~index;\n  }\n};\n\nmodule.exports = {\n  getConstructor: function getConstructor(wrapper, NAME, IS_MAP, ADDER) {\n    var C = wrapper(function (that, iterable) {\n      strictNew(that, C, NAME);\n      that._i = id++; // collection id\n      that._l = undefined; // leak store for frozen objects\n      if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n    });\n    redefineAll(C.prototype, {\n      // 23.3.3.2 WeakMap.prototype.delete(key)\n      // 23.4.3.3 WeakSet.prototype.delete(value)\n      'delete': function _delete(key) {\n        if (!isObject(key)) return false;\n        if (!isExtensible(key)) return frozenStore(this)['delete'](key);\n        return $has(key, WEAK) && $has(key[WEAK], this._i) && delete key[WEAK][this._i];\n      },\n      // 23.3.3.4 WeakMap.prototype.has(key)\n      // 23.4.3.4 WeakSet.prototype.has(value)\n      has: function has(key) {\n        if (!isObject(key)) return false;\n        if (!isExtensible(key)) return frozenStore(this).has(key);\n        return $has(key, WEAK) && $has(key[WEAK], this._i);\n      }\n    });\n    return C;\n  },\n  def: function def(that, key, value) {\n    if (!isExtensible(anObject(key))) {\n      frozenStore(that).set(key, value);\n    } else {\n      $has(key, WEAK) || hide(key, WEAK, {});\n      key[WEAK][that._i] = value;\n    }return that;\n  },\n  frozenStore: frozenStore,\n  WEAK: WEAK\n};\n\n},{\"./$.an-object\":45,\"./$.array-methods\":49,\"./$.for-of\":68,\"./$.has\":71,\"./$.hide\":72,\"./$.is-object\":79,\"./$.redefine-all\":101,\"./$.strict-new\":110,\"./$.uid\":123}],56:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    $export = require('./$.export'),\n    redefine = require('./$.redefine'),\n    redefineAll = require('./$.redefine-all'),\n    forOf = require('./$.for-of'),\n    strictNew = require('./$.strict-new'),\n    isObject = require('./$.is-object'),\n    fails = require('./$.fails'),\n    $iterDetect = require('./$.iter-detect'),\n    setToStringTag = require('./$.set-to-string-tag');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n  var Base = global[NAME],\n      C = Base,\n      ADDER = IS_MAP ? 'set' : 'add',\n      proto = C && C.prototype,\n      O = {};\n  var fixMethod = function fixMethod(KEY) {\n    var fn = proto[KEY];\n    redefine(proto, KEY, KEY == 'delete' ? function (a) {\n      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'has' ? function has(a) {\n      return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'get' ? function get(a) {\n      return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n    } : KEY == 'add' ? function add(a) {\n      fn.call(this, a === 0 ? 0 : a);return this;\n    } : function set(a, b) {\n      fn.call(this, a === 0 ? 0 : a, b);return this;\n    });\n  };\n  if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n    new C().entries().next();\n  }))) {\n    // create collection constructor\n    C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n    redefineAll(C.prototype, methods);\n  } else {\n    var instance = new C()\n    // early implementations not supports chaining\n    ,\n        HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance\n    // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false\n    ,\n        THROWS_ON_PRIMITIVES = fails(function () {\n      instance.has(1);\n    })\n    // most early implementations doesn't supports iterables, most modern - not close it correctly\n    ,\n        ACCEPT_ITERABLES = $iterDetect(function (iter) {\n      new C(iter);\n    }) // eslint-disable-line no-new\n    // for early implementations -0 and +0 not the same\n    ,\n        BUGGY_ZERO;\n    if (!ACCEPT_ITERABLES) {\n      C = wrapper(function (target, iterable) {\n        strictNew(target, C, NAME);\n        var that = new Base();\n        if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n        return that;\n      });\n      C.prototype = proto;\n      proto.constructor = C;\n    }\n    IS_WEAK || instance.forEach(function (val, key) {\n      BUGGY_ZERO = 1 / key === -Infinity;\n    });\n    if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n      fixMethod('delete');\n      fixMethod('has');\n      IS_MAP && fixMethod('get');\n    }\n    if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n    // weak collections should not contains .clear method\n    if (IS_WEAK && proto.clear) delete proto.clear;\n  }\n\n  setToStringTag(C, NAME);\n\n  O[NAME] = C;\n  $export($export.G + $export.W + $export.F * (C != Base), O);\n\n  if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n  return C;\n};\n\n},{\"./$.export\":63,\"./$.fails\":65,\"./$.for-of\":68,\"./$.global\":70,\"./$.is-object\":79,\"./$.iter-detect\":84,\"./$.redefine\":102,\"./$.redefine-all\":101,\"./$.set-to-string-tag\":107,\"./$.strict-new\":110}],57:[function(require,module,exports){\n'use strict';\n\nvar core = module.exports = { version: '1.2.6' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n\n},{}],58:[function(require,module,exports){\n'use strict';\n\n// optional / simple context binding\nvar aFunction = require('./$.a-function');\nmodule.exports = function (fn, that, length) {\n  aFunction(fn);\n  if (that === undefined) return fn;\n  switch (length) {\n    case 1:\n      return function (a) {\n        return fn.call(that, a);\n      };\n    case 2:\n      return function (a, b) {\n        return fn.call(that, a, b);\n      };\n    case 3:\n      return function (a, b, c) {\n        return fn.call(that, a, b, c);\n      };\n  }\n  return function () /* ...args */{\n    return fn.apply(that, arguments);\n  };\n};\n\n},{\"./$.a-function\":43}],59:[function(require,module,exports){\n\"use strict\";\n\n// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n  if (it == undefined) throw TypeError(\"Can't call method on  \" + it);\n  return it;\n};\n\n},{}],60:[function(require,module,exports){\n'use strict';\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./$.fails')(function () {\n  return Object.defineProperty({}, 'a', { get: function get() {\n      return 7;\n    } }).a != 7;\n});\n\n},{\"./$.fails\":65}],61:[function(require,module,exports){\n'use strict';\n\nvar isObject = require('./$.is-object'),\n    document = require('./$.global').document\n// in old IE typeof document.createElement is 'object'\n,\n    is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n  return is ? document.createElement(it) : {};\n};\n\n},{\"./$.global\":70,\"./$.is-object\":79}],62:[function(require,module,exports){\n'use strict';\n\n// all enumerable object keys, includes symbols\nvar $ = require('./$');\nmodule.exports = function (it) {\n  var keys = $.getKeys(it),\n      getSymbols = $.getSymbols;\n  if (getSymbols) {\n    var symbols = getSymbols(it),\n        isEnum = $.isEnum,\n        i = 0,\n        key;\n    while (symbols.length > i) {\n      if (isEnum.call(it, key = symbols[i++])) keys.push(key);\n    }\n  }\n  return keys;\n};\n\n},{\"./$\":87}],63:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    core = require('./$.core'),\n    hide = require('./$.hide'),\n    redefine = require('./$.redefine'),\n    ctx = require('./$.ctx'),\n    PROTOTYPE = 'prototype';\n\nvar $export = function $export(type, name, source) {\n  var IS_FORCED = type & $export.F,\n      IS_GLOBAL = type & $export.G,\n      IS_STATIC = type & $export.S,\n      IS_PROTO = type & $export.P,\n      IS_BIND = type & $export.B,\n      target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE],\n      exports = IS_GLOBAL ? core : core[name] || (core[name] = {}),\n      expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}),\n      key,\n      own,\n      out,\n      exp;\n  if (IS_GLOBAL) source = name;\n  for (key in source) {\n    // contains in native\n    own = !IS_FORCED && target && key in target;\n    // export native or passed\n    out = (own ? target : source)[key];\n    // bind timers to global for call from export context\n    exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n    // extend global\n    if (target && !own) redefine(target, key, out);\n    // export\n    if (exports[key] != out) hide(exports, key, exp);\n    if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n  }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\nmodule.exports = $export;\n\n},{\"./$.core\":57,\"./$.ctx\":58,\"./$.global\":70,\"./$.hide\":72,\"./$.redefine\":102}],64:[function(require,module,exports){\n'use strict';\n\nvar MATCH = require('./$.wks')('match');\nmodule.exports = function (KEY) {\n  var re = /./;\n  try {\n    '/./'[KEY](re);\n  } catch (e) {\n    try {\n      re[MATCH] = false;\n      return !'/./'[KEY](re);\n    } catch (f) {/* empty */}\n  }return true;\n};\n\n},{\"./$.wks\":124}],65:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (exec) {\n  try {\n    return !!exec();\n  } catch (e) {\n    return true;\n  }\n};\n\n},{}],66:[function(require,module,exports){\n'use strict';\n\nvar hide = require('./$.hide'),\n    redefine = require('./$.redefine'),\n    fails = require('./$.fails'),\n    defined = require('./$.defined'),\n    wks = require('./$.wks');\n\nmodule.exports = function (KEY, length, exec) {\n  var SYMBOL = wks(KEY),\n      original = ''[KEY];\n  if (fails(function () {\n    var O = {};\n    O[SYMBOL] = function () {\n      return 7;\n    };\n    return ''[KEY](O) != 7;\n  })) {\n    redefine(String.prototype, KEY, exec(defined, SYMBOL, original));\n    hide(RegExp.prototype, SYMBOL, length == 2\n    // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n    // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n    ? function (string, arg) {\n      return original.call(string, this, arg);\n    }\n    // 21.2.5.6 RegExp.prototype[@@match](string)\n    // 21.2.5.9 RegExp.prototype[@@search](string)\n    : function (string) {\n      return original.call(string, this);\n    });\n  }\n};\n\n},{\"./$.defined\":59,\"./$.fails\":65,\"./$.hide\":72,\"./$.redefine\":102,\"./$.wks\":124}],67:[function(require,module,exports){\n'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\n\nvar anObject = require('./$.an-object');\nmodule.exports = function () {\n  var that = anObject(this),\n      result = '';\n  if (that.global) result += 'g';\n  if (that.ignoreCase) result += 'i';\n  if (that.multiline) result += 'm';\n  if (that.unicode) result += 'u';\n  if (that.sticky) result += 'y';\n  return result;\n};\n\n},{\"./$.an-object\":45}],68:[function(require,module,exports){\n'use strict';\n\nvar ctx = require('./$.ctx'),\n    call = require('./$.iter-call'),\n    isArrayIter = require('./$.is-array-iter'),\n    anObject = require('./$.an-object'),\n    toLength = require('./$.to-length'),\n    getIterFn = require('./core.get-iterator-method');\nmodule.exports = function (iterable, entries, fn, that) {\n  var iterFn = getIterFn(iterable),\n      f = ctx(fn, that, entries ? 2 : 1),\n      index = 0,\n      length,\n      step,\n      iterator;\n  if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n  // fast case for arrays with default iterator\n  if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n    entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n  } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n    call(iterator, f, step.value, entries);\n  }\n};\n\n},{\"./$.an-object\":45,\"./$.ctx\":58,\"./$.is-array-iter\":76,\"./$.iter-call\":81,\"./$.to-length\":120,\"./core.get-iterator-method\":125}],69:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./$.to-iobject'),\n    getNames = require('./$').getNames,\n    toString = {}.toString;\n\nvar windowNames = (typeof window === 'undefined' ? 'undefined' : _typeof(window)) == 'object' && Object.getOwnPropertyNames ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function getWindowNames(it) {\n  try {\n    return getNames(it);\n  } catch (e) {\n    return windowNames.slice();\n  }\n};\n\nmodule.exports.get = function getOwnPropertyNames(it) {\n  if (windowNames && toString.call(it) == '[object Window]') return getWindowNames(it);\n  return getNames(toIObject(it));\n};\n\n},{\"./$\":87,\"./$.to-iobject\":119}],70:[function(require,module,exports){\n'use strict';\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n\n},{}],71:[function(require,module,exports){\n\"use strict\";\n\nvar hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n  return hasOwnProperty.call(it, key);\n};\n\n},{}],72:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    createDesc = require('./$.property-desc');\nmodule.exports = require('./$.descriptors') ? function (object, key, value) {\n  return $.setDesc(object, key, createDesc(1, value));\n} : function (object, key, value) {\n  object[key] = value;\n  return object;\n};\n\n},{\"./$\":87,\"./$.descriptors\":60,\"./$.property-desc\":100}],73:[function(require,module,exports){\n'use strict';\n\nmodule.exports = require('./$.global').document && document.documentElement;\n\n},{\"./$.global\":70}],74:[function(require,module,exports){\n\"use strict\";\n\n// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n                  var un = that === undefined;\n                  switch (args.length) {\n                                    case 0:\n                                                      return un ? fn() : fn.call(that);\n                                    case 1:\n                                                      return un ? fn(args[0]) : fn.call(that, args[0]);\n                                    case 2:\n                                                      return un ? fn(args[0], args[1]) : fn.call(that, args[0], args[1]);\n                                    case 3:\n                                                      return un ? fn(args[0], args[1], args[2]) : fn.call(that, args[0], args[1], args[2]);\n                                    case 4:\n                                                      return un ? fn(args[0], args[1], args[2], args[3]) : fn.call(that, args[0], args[1], args[2], args[3]);\n                  }return fn.apply(that, args);\n};\n\n},{}],75:[function(require,module,exports){\n'use strict';\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./$.cof');\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n  return cof(it) == 'String' ? it.split('') : Object(it);\n};\n\n},{\"./$.cof\":52}],76:[function(require,module,exports){\n'use strict';\n\n// check on default Array iterator\nvar Iterators = require('./$.iterators'),\n    ITERATOR = require('./$.wks')('iterator'),\n    ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n  return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n\n},{\"./$.iterators\":86,\"./$.wks\":124}],77:[function(require,module,exports){\n'use strict';\n\n// 7.2.2 IsArray(argument)\nvar cof = require('./$.cof');\nmodule.exports = Array.isArray || function (arg) {\n  return cof(arg) == 'Array';\n};\n\n},{\"./$.cof\":52}],78:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./$.is-object'),\n    floor = Math.floor;\nmodule.exports = function isInteger(it) {\n  return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n\n},{\"./$.is-object\":79}],79:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nmodule.exports = function (it) {\n  return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) === 'object' ? it !== null : typeof it === 'function';\n};\n\n},{}],80:[function(require,module,exports){\n'use strict';\n\n// 7.2.8 IsRegExp(argument)\nvar isObject = require('./$.is-object'),\n    cof = require('./$.cof'),\n    MATCH = require('./$.wks')('match');\nmodule.exports = function (it) {\n  var isRegExp;\n  return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n\n},{\"./$.cof\":52,\"./$.is-object\":79,\"./$.wks\":124}],81:[function(require,module,exports){\n'use strict';\n\n// call something on iterator step with safe closing on error\nvar anObject = require('./$.an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n  try {\n    return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n    // 7.4.6 IteratorClose(iterator, completion)\n  } catch (e) {\n    var ret = iterator['return'];\n    if (ret !== undefined) anObject(ret.call(iterator));\n    throw e;\n  }\n};\n\n},{\"./$.an-object\":45}],82:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    descriptor = require('./$.property-desc'),\n    setToStringTag = require('./$.set-to-string-tag'),\n    IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./$.hide')(IteratorPrototype, require('./$.wks')('iterator'), function () {\n  return this;\n});\n\nmodule.exports = function (Constructor, NAME, next) {\n  Constructor.prototype = $.create(IteratorPrototype, { next: descriptor(1, next) });\n  setToStringTag(Constructor, NAME + ' Iterator');\n};\n\n},{\"./$\":87,\"./$.hide\":72,\"./$.property-desc\":100,\"./$.set-to-string-tag\":107,\"./$.wks\":124}],83:[function(require,module,exports){\n'use strict';\n\nvar LIBRARY = require('./$.library'),\n    $export = require('./$.export'),\n    redefine = require('./$.redefine'),\n    hide = require('./$.hide'),\n    has = require('./$.has'),\n    Iterators = require('./$.iterators'),\n    $iterCreate = require('./$.iter-create'),\n    setToStringTag = require('./$.set-to-string-tag'),\n    getProto = require('./$').getProto,\n    ITERATOR = require('./$.wks')('iterator'),\n    BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next`\n,\n    FF_ITERATOR = '@@iterator',\n    KEYS = 'keys',\n    VALUES = 'values';\n\nvar returnThis = function returnThis() {\n  return this;\n};\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n  $iterCreate(Constructor, NAME, next);\n  var getMethod = function getMethod(kind) {\n    if (!BUGGY && kind in proto) return proto[kind];\n    switch (kind) {\n      case KEYS:\n        return function keys() {\n          return new Constructor(this, kind);\n        };\n      case VALUES:\n        return function values() {\n          return new Constructor(this, kind);\n        };\n    }return function entries() {\n      return new Constructor(this, kind);\n    };\n  };\n  var TAG = NAME + ' Iterator',\n      DEF_VALUES = DEFAULT == VALUES,\n      VALUES_BUG = false,\n      proto = Base.prototype,\n      $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT],\n      $default = $native || getMethod(DEFAULT),\n      methods,\n      key;\n  // Fix native\n  if ($native) {\n    var IteratorPrototype = getProto($default.call(new Base()));\n    // Set @@toStringTag to native iterators\n    setToStringTag(IteratorPrototype, TAG, true);\n    // FF fix\n    if (!LIBRARY && has(proto, FF_ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n    // fix Array#{values, @@iterator}.name in V8 / FF\n    if (DEF_VALUES && $native.name !== VALUES) {\n      VALUES_BUG = true;\n      $default = function values() {\n        return $native.call(this);\n      };\n    }\n  }\n  // Define iterator\n  if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n    hide(proto, ITERATOR, $default);\n  }\n  // Plug for library\n  Iterators[NAME] = $default;\n  Iterators[TAG] = returnThis;\n  if (DEFAULT) {\n    methods = {\n      values: DEF_VALUES ? $default : getMethod(VALUES),\n      keys: IS_SET ? $default : getMethod(KEYS),\n      entries: !DEF_VALUES ? $default : getMethod('entries')\n    };\n    if (FORCED) for (key in methods) {\n      if (!(key in proto)) redefine(proto, key, methods[key]);\n    } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n  }\n  return methods;\n};\n\n},{\"./$\":87,\"./$.export\":63,\"./$.has\":71,\"./$.hide\":72,\"./$.iter-create\":82,\"./$.iterators\":86,\"./$.library\":89,\"./$.redefine\":102,\"./$.set-to-string-tag\":107,\"./$.wks\":124}],84:[function(require,module,exports){\n'use strict';\n\nvar ITERATOR = require('./$.wks')('iterator'),\n    SAFE_CLOSING = false;\n\ntry {\n  var riter = [7][ITERATOR]();\n  riter['return'] = function () {\n    SAFE_CLOSING = true;\n  };\n  Array.from(riter, function () {\n    throw 2;\n  });\n} catch (e) {/* empty */}\n\nmodule.exports = function (exec, skipClosing) {\n  if (!skipClosing && !SAFE_CLOSING) return false;\n  var safe = false;\n  try {\n    var arr = [7],\n        iter = arr[ITERATOR]();\n    iter.next = function () {\n      safe = true;\n    };\n    arr[ITERATOR] = function () {\n      return iter;\n    };\n    exec(arr);\n  } catch (e) {/* empty */}\n  return safe;\n};\n\n},{\"./$.wks\":124}],85:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (done, value) {\n  return { value: value, done: !!done };\n};\n\n},{}],86:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = {};\n\n},{}],87:[function(require,module,exports){\n\"use strict\";\n\nvar $Object = Object;\nmodule.exports = {\n  create: $Object.create,\n  getProto: $Object.getPrototypeOf,\n  isEnum: {}.propertyIsEnumerable,\n  getDesc: $Object.getOwnPropertyDescriptor,\n  setDesc: $Object.defineProperty,\n  setDescs: $Object.defineProperties,\n  getKeys: $Object.keys,\n  getNames: $Object.getOwnPropertyNames,\n  getSymbols: $Object.getOwnPropertySymbols,\n  each: [].forEach\n};\n\n},{}],88:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    toIObject = require('./$.to-iobject');\nmodule.exports = function (object, el) {\n  var O = toIObject(object),\n      keys = $.getKeys(O),\n      length = keys.length,\n      index = 0,\n      key;\n  while (length > index) {\n    if (O[key = keys[index++]] === el) return key;\n  }\n};\n\n},{\"./$\":87,\"./$.to-iobject\":119}],89:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = false;\n\n},{}],90:[function(require,module,exports){\n\"use strict\";\n\n// 20.2.2.14 Math.expm1(x)\nmodule.exports = Math.expm1 || function expm1(x) {\n  return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n};\n\n},{}],91:[function(require,module,exports){\n\"use strict\";\n\n// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n  return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n\n},{}],92:[function(require,module,exports){\n\"use strict\";\n\n// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n  return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n\n},{}],93:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    macrotask = require('./$.task').set,\n    Observer = global.MutationObserver || global.WebKitMutationObserver,\n    process = global.process,\n    Promise = global.Promise,\n    isNode = require('./$.cof')(process) == 'process',\n    head,\n    last,\n    notify;\n\nvar flush = function flush() {\n  var parent, domain, fn;\n  if (isNode && (parent = process.domain)) {\n    process.domain = null;\n    parent.exit();\n  }\n  while (head) {\n    domain = head.domain;\n    fn = head.fn;\n    if (domain) domain.enter();\n    fn(); // <- currently we use it only for Promise - try / catch not required\n    if (domain) domain.exit();\n    head = head.next;\n  }last = undefined;\n  if (parent) parent.enter();\n};\n\n// Node.js\nif (isNode) {\n  notify = function notify() {\n    process.nextTick(flush);\n  };\n  // browsers with MutationObserver\n} else if (Observer) {\n    var toggle = 1,\n        node = document.createTextNode('');\n    new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n    notify = function notify() {\n      node.data = toggle = -toggle;\n    };\n    // environments with maybe non-completely correct, but existent Promise\n  } else if (Promise && Promise.resolve) {\n      notify = function notify() {\n        Promise.resolve().then(flush);\n      };\n      // for other environments - macrotask based on:\n      // - setImmediate\n      // - MessageChannel\n      // - window.postMessag\n      // - onreadystatechange\n      // - setTimeout\n    } else {\n        notify = function notify() {\n          // strange IE + webpack dev server bug - use .call(global)\n          macrotask.call(global, flush);\n        };\n      }\n\nmodule.exports = function asap(fn) {\n  var task = { fn: fn, next: undefined, domain: isNode && process.domain };\n  if (last) last.next = task;\n  if (!head) {\n    head = task;\n    notify();\n  }last = task;\n};\n\n},{\"./$.cof\":52,\"./$.global\":70,\"./$.task\":116}],94:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.1 Object.assign(target, source, ...)\nvar $ = require('./$'),\n    toObject = require('./$.to-object'),\n    IObject = require('./$.iobject');\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = require('./$.fails')(function () {\n  var a = Object.assign,\n      A = {},\n      B = {},\n      S = Symbol(),\n      K = 'abcdefghijklmnopqrst';\n  A[S] = 7;\n  K.split('').forEach(function (k) {\n    B[k] = k;\n  });\n  return a({}, A)[S] != 7 || Object.keys(a({}, B)).join('') != K;\n}) ? function assign(target, source) {\n  // eslint-disable-line no-unused-vars\n  var T = toObject(target),\n      $$ = arguments,\n      $$len = $$.length,\n      index = 1,\n      getKeys = $.getKeys,\n      getSymbols = $.getSymbols,\n      isEnum = $.isEnum;\n  while ($$len > index) {\n    var S = IObject($$[index++]),\n        keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S),\n        length = keys.length,\n        j = 0,\n        key;\n    while (length > j) {\n      if (isEnum.call(S, key = keys[j++])) T[key] = S[key];\n    }\n  }\n  return T;\n} : Object.assign;\n\n},{\"./$\":87,\"./$.fails\":65,\"./$.iobject\":75,\"./$.to-object\":121}],95:[function(require,module,exports){\n'use strict';\n\n// most Object methods by ES6 should accept primitives\nvar $export = require('./$.export'),\n    core = require('./$.core'),\n    fails = require('./$.fails');\nmodule.exports = function (KEY, exec) {\n  var fn = (core.Object || {})[KEY] || Object[KEY],\n      exp = {};\n  exp[KEY] = exec(fn);\n  $export($export.S + $export.F * fails(function () {\n    fn(1);\n  }), 'Object', exp);\n};\n\n},{\"./$.core\":57,\"./$.export\":63,\"./$.fails\":65}],96:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    toIObject = require('./$.to-iobject'),\n    isEnum = $.isEnum;\nmodule.exports = function (isEntries) {\n  return function (it) {\n    var O = toIObject(it),\n        keys = $.getKeys(O),\n        length = keys.length,\n        i = 0,\n        result = [],\n        key;\n    while (length > i) {\n      if (isEnum.call(O, key = keys[i++])) {\n        result.push(isEntries ? [key, O[key]] : O[key]);\n      }\n    }return result;\n  };\n};\n\n},{\"./$\":87,\"./$.to-iobject\":119}],97:[function(require,module,exports){\n'use strict';\n\n// all object keys, includes non-enumerable and symbols\nvar $ = require('./$'),\n    anObject = require('./$.an-object'),\n    Reflect = require('./$.global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n  var keys = $.getNames(anObject(it)),\n      getSymbols = $.getSymbols;\n  return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.global\":70}],98:[function(require,module,exports){\n'use strict';\n\nvar path = require('./$.path'),\n    invoke = require('./$.invoke'),\n    aFunction = require('./$.a-function');\nmodule.exports = function () /* ...pargs */{\n  var fn = aFunction(this),\n      length = arguments.length,\n      pargs = Array(length),\n      i = 0,\n      _ = path._,\n      holder = false;\n  while (length > i) {\n    if ((pargs[i] = arguments[i++]) === _) holder = true;\n  }return function () /* ...args */{\n    var that = this,\n        $$ = arguments,\n        $$len = $$.length,\n        j = 0,\n        k = 0,\n        args;\n    if (!holder && !$$len) return invoke(fn, pargs, that);\n    args = pargs.slice();\n    if (holder) for (; length > j; j++) {\n      if (args[j] === _) args[j] = $$[k++];\n    }while ($$len > k) {\n      args.push($$[k++]);\n    }return invoke(fn, args, that);\n  };\n};\n\n},{\"./$.a-function\":43,\"./$.invoke\":74,\"./$.path\":99}],99:[function(require,module,exports){\n'use strict';\n\nmodule.exports = require('./$.global');\n\n},{\"./$.global\":70}],100:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (bitmap, value) {\n  return {\n    enumerable: !(bitmap & 1),\n    configurable: !(bitmap & 2),\n    writable: !(bitmap & 4),\n    value: value\n  };\n};\n\n},{}],101:[function(require,module,exports){\n'use strict';\n\nvar redefine = require('./$.redefine');\nmodule.exports = function (target, src) {\n  for (var key in src) {\n    redefine(target, key, src[key]);\n  }return target;\n};\n\n},{\"./$.redefine\":102}],102:[function(require,module,exports){\n'use strict';\n\n// add fake Function#toString\n// for correct work wrapped methods / constructors with methods like LoDash isNative\nvar global = require('./$.global'),\n    hide = require('./$.hide'),\n    SRC = require('./$.uid')('src'),\n    TO_STRING = 'toString',\n    $toString = Function[TO_STRING],\n    TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./$.core').inspectSource = function (it) {\n  return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n  if (typeof val == 'function') {\n    val.hasOwnProperty(SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n    val.hasOwnProperty('name') || hide(val, 'name', key);\n  }\n  if (O === global) {\n    O[key] = val;\n  } else {\n    if (!safe) delete O[key];\n    hide(O, key, val);\n  }\n})(Function.prototype, TO_STRING, function toString() {\n  return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n\n},{\"./$.core\":57,\"./$.global\":70,\"./$.hide\":72,\"./$.uid\":123}],103:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (regExp, replace) {\n  var replacer = replace === Object(replace) ? function (part) {\n    return replace[part];\n  } : replace;\n  return function (it) {\n    return String(it).replace(regExp, replacer);\n  };\n};\n\n},{}],104:[function(require,module,exports){\n\"use strict\";\n\n// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n  return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n\n},{}],105:[function(require,module,exports){\n'use strict';\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar getDesc = require('./$').getDesc,\n    isObject = require('./$.is-object'),\n    anObject = require('./$.an-object');\nvar check = function check(O, proto) {\n  anObject(O);\n  if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n  set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n  function (test, buggy, set) {\n    try {\n      set = require('./$.ctx')(Function.call, getDesc(Object.prototype, '__proto__').set, 2);\n      set(test, []);\n      buggy = !(test instanceof Array);\n    } catch (e) {\n      buggy = true;\n    }\n    return function setPrototypeOf(O, proto) {\n      check(O, proto);\n      if (buggy) O.__proto__ = proto;else set(O, proto);\n      return O;\n    };\n  }({}, false) : undefined),\n  check: check\n};\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.ctx\":58,\"./$.is-object\":79}],106:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    $ = require('./$'),\n    DESCRIPTORS = require('./$.descriptors'),\n    SPECIES = require('./$.wks')('species');\n\nmodule.exports = function (KEY) {\n  var C = global[KEY];\n  if (DESCRIPTORS && C && !C[SPECIES]) $.setDesc(C, SPECIES, {\n    configurable: true,\n    get: function get() {\n      return this;\n    }\n  });\n};\n\n},{\"./$\":87,\"./$.descriptors\":60,\"./$.global\":70,\"./$.wks\":124}],107:[function(require,module,exports){\n'use strict';\n\nvar def = require('./$').setDesc,\n    has = require('./$.has'),\n    TAG = require('./$.wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n  if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n\n},{\"./$\":87,\"./$.has\":71,\"./$.wks\":124}],108:[function(require,module,exports){\n'use strict';\n\nvar global = require('./$.global'),\n    SHARED = '__core-js_shared__',\n    store = global[SHARED] || (global[SHARED] = {});\nmodule.exports = function (key) {\n  return store[key] || (store[key] = {});\n};\n\n},{\"./$.global\":70}],109:[function(require,module,exports){\n'use strict';\n\n// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./$.an-object'),\n    aFunction = require('./$.a-function'),\n    SPECIES = require('./$.wks')('species');\nmodule.exports = function (O, D) {\n  var C = anObject(O).constructor,\n      S;\n  return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n\n},{\"./$.a-function\":43,\"./$.an-object\":45,\"./$.wks\":124}],110:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = function (it, Constructor, name) {\n  if (!(it instanceof Constructor)) throw TypeError(name + \": use the 'new' operator!\");\n  return it;\n};\n\n},{}],111:[function(require,module,exports){\n'use strict';\n\nvar toInteger = require('./$.to-integer'),\n    defined = require('./$.defined');\n// true  -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n  return function (that, pos) {\n    var s = String(defined(that)),\n        i = toInteger(pos),\n        l = s.length,\n        a,\n        b;\n    if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n    a = s.charCodeAt(i);\n    return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff ? TO_STRING ? s.charAt(i) : a : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n  };\n};\n\n},{\"./$.defined\":59,\"./$.to-integer\":118}],112:[function(require,module,exports){\n'use strict';\n\n// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./$.is-regexp'),\n    defined = require('./$.defined');\n\nmodule.exports = function (that, searchString, NAME) {\n  if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n  return String(defined(that));\n};\n\n},{\"./$.defined\":59,\"./$.is-regexp\":80}],113:[function(require,module,exports){\n'use strict';\n\n// https://github.com/ljharb/proposal-string-pad-left-right\nvar toLength = require('./$.to-length'),\n    repeat = require('./$.string-repeat'),\n    defined = require('./$.defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n  var S = String(defined(that)),\n      stringLength = S.length,\n      fillStr = fillString === undefined ? ' ' : String(fillString),\n      intMaxLength = toLength(maxLength);\n  if (intMaxLength <= stringLength) return S;\n  if (fillStr == '') fillStr = ' ';\n  var fillLen = intMaxLength - stringLength,\n      stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n  if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n  return left ? stringFiller + S : S + stringFiller;\n};\n\n},{\"./$.defined\":59,\"./$.string-repeat\":114,\"./$.to-length\":120}],114:[function(require,module,exports){\n'use strict';\n\nvar toInteger = require('./$.to-integer'),\n    defined = require('./$.defined');\n\nmodule.exports = function repeat(count) {\n  var str = String(defined(this)),\n      res = '',\n      n = toInteger(count);\n  if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n  for (; n > 0; (n >>>= 1) && (str += str)) {\n    if (n & 1) res += str;\n  }return res;\n};\n\n},{\"./$.defined\":59,\"./$.to-integer\":118}],115:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    defined = require('./$.defined'),\n    fails = require('./$.fails'),\n    spaces = '\\t\\n\\u000b\\f\\r   ᠎    ' + '         　\\u2028\\u2029﻿',\n    space = '[' + spaces + ']',\n    non = '​',\n    ltrim = RegExp('^' + space + space + '*'),\n    rtrim = RegExp(space + space + '*$');\n\nvar exporter = function exporter(KEY, exec) {\n  var exp = {};\n  exp[KEY] = exec(trim);\n  $export($export.P + $export.F * fails(function () {\n    return !!spaces[KEY]() || non[KEY]() != non;\n  }), 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n  string = String(defined(string));\n  if (TYPE & 1) string = string.replace(ltrim, '');\n  if (TYPE & 2) string = string.replace(rtrim, '');\n  return string;\n};\n\nmodule.exports = exporter;\n\n},{\"./$.defined\":59,\"./$.export\":63,\"./$.fails\":65}],116:[function(require,module,exports){\n'use strict';\n\nvar ctx = require('./$.ctx'),\n    invoke = require('./$.invoke'),\n    html = require('./$.html'),\n    cel = require('./$.dom-create'),\n    global = require('./$.global'),\n    process = global.process,\n    setTask = global.setImmediate,\n    clearTask = global.clearImmediate,\n    MessageChannel = global.MessageChannel,\n    counter = 0,\n    queue = {},\n    ONREADYSTATECHANGE = 'onreadystatechange',\n    defer,\n    channel,\n    port;\nvar run = function run() {\n  var id = +this;\n  if (queue.hasOwnProperty(id)) {\n    var fn = queue[id];\n    delete queue[id];\n    fn();\n  }\n};\nvar listner = function listner(event) {\n  run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n  setTask = function setImmediate(fn) {\n    var args = [],\n        i = 1;\n    while (arguments.length > i) {\n      args.push(arguments[i++]);\n    }queue[++counter] = function () {\n      invoke(typeof fn == 'function' ? fn : Function(fn), args);\n    };\n    defer(counter);\n    return counter;\n  };\n  clearTask = function clearImmediate(id) {\n    delete queue[id];\n  };\n  // Node.js 0.8-\n  if (require('./$.cof')(process) == 'process') {\n    defer = function defer(id) {\n      process.nextTick(ctx(run, id, 1));\n    };\n    // Browsers with MessageChannel, includes WebWorkers\n  } else if (MessageChannel) {\n      channel = new MessageChannel();\n      port = channel.port2;\n      channel.port1.onmessage = listner;\n      defer = ctx(port.postMessage, port, 1);\n      // Browsers with postMessage, skip WebWorkers\n      // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n    } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n        defer = function defer(id) {\n          global.postMessage(id + '', '*');\n        };\n        global.addEventListener('message', listner, false);\n        // IE8-\n      } else if (ONREADYSTATECHANGE in cel('script')) {\n          defer = function defer(id) {\n            html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n              html.removeChild(this);\n              run.call(id);\n            };\n          };\n          // Rest old browsers\n        } else {\n            defer = function defer(id) {\n              setTimeout(ctx(run, id, 1), 0);\n            };\n          }\n}\nmodule.exports = {\n  set: setTask,\n  clear: clearTask\n};\n\n},{\"./$.cof\":52,\"./$.ctx\":58,\"./$.dom-create\":61,\"./$.global\":70,\"./$.html\":73,\"./$.invoke\":74}],117:[function(require,module,exports){\n'use strict';\n\nvar toInteger = require('./$.to-integer'),\n    max = Math.max,\n    min = Math.min;\nmodule.exports = function (index, length) {\n  index = toInteger(index);\n  return index < 0 ? max(index + length, 0) : min(index, length);\n};\n\n},{\"./$.to-integer\":118}],118:[function(require,module,exports){\n\"use strict\";\n\n// 7.1.4 ToInteger\nvar ceil = Math.ceil,\n    floor = Math.floor;\nmodule.exports = function (it) {\n  return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n\n},{}],119:[function(require,module,exports){\n'use strict';\n\n// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./$.iobject'),\n    defined = require('./$.defined');\nmodule.exports = function (it) {\n  return IObject(defined(it));\n};\n\n},{\"./$.defined\":59,\"./$.iobject\":75}],120:[function(require,module,exports){\n'use strict';\n\n// 7.1.15 ToLength\nvar toInteger = require('./$.to-integer'),\n    min = Math.min;\nmodule.exports = function (it) {\n  return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n\n},{\"./$.to-integer\":118}],121:[function(require,module,exports){\n'use strict';\n\n// 7.1.13 ToObject(argument)\nvar defined = require('./$.defined');\nmodule.exports = function (it) {\n  return Object(defined(it));\n};\n\n},{\"./$.defined\":59}],122:[function(require,module,exports){\n'use strict';\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./$.is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n  if (!isObject(it)) return it;\n  var fn, val;\n  if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n  if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n  throw TypeError(\"Can't convert object to primitive value\");\n};\n\n},{\"./$.is-object\":79}],123:[function(require,module,exports){\n'use strict';\n\nvar id = 0,\n    px = Math.random();\nmodule.exports = function (key) {\n  return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n\n},{}],124:[function(require,module,exports){\n'use strict';\n\nvar store = require('./$.shared')('wks'),\n    uid = require('./$.uid'),\n    _Symbol = require('./$.global').Symbol;\nmodule.exports = function (name) {\n  return store[name] || (store[name] = _Symbol && _Symbol[name] || (_Symbol || uid)('Symbol.' + name));\n};\n\n},{\"./$.global\":70,\"./$.shared\":108,\"./$.uid\":123}],125:[function(require,module,exports){\n'use strict';\n\nvar classof = require('./$.classof'),\n    ITERATOR = require('./$.wks')('iterator'),\n    Iterators = require('./$.iterators');\nmodule.exports = require('./$.core').getIteratorMethod = function (it) {\n  if (it != undefined) return it[ITERATOR] || it['@@iterator'] || Iterators[classof(it)];\n};\n\n},{\"./$.classof\":51,\"./$.core\":57,\"./$.iterators\":86,\"./$.wks\":124}],126:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    DESCRIPTORS = require('./$.descriptors'),\n    createDesc = require('./$.property-desc'),\n    html = require('./$.html'),\n    cel = require('./$.dom-create'),\n    has = require('./$.has'),\n    cof = require('./$.cof'),\n    invoke = require('./$.invoke'),\n    fails = require('./$.fails'),\n    anObject = require('./$.an-object'),\n    aFunction = require('./$.a-function'),\n    isObject = require('./$.is-object'),\n    toObject = require('./$.to-object'),\n    toIObject = require('./$.to-iobject'),\n    toInteger = require('./$.to-integer'),\n    toIndex = require('./$.to-index'),\n    toLength = require('./$.to-length'),\n    IObject = require('./$.iobject'),\n    IE_PROTO = require('./$.uid')('__proto__'),\n    createArrayMethod = require('./$.array-methods'),\n    arrayIndexOf = require('./$.array-includes')(false),\n    ObjectProto = Object.prototype,\n    ArrayProto = Array.prototype,\n    arraySlice = ArrayProto.slice,\n    arrayJoin = ArrayProto.join,\n    defineProperty = $.setDesc,\n    getOwnDescriptor = $.getDesc,\n    defineProperties = $.setDescs,\n    factories = {},\n    IE8_DOM_DEFINE;\n\nif (!DESCRIPTORS) {\n  IE8_DOM_DEFINE = !fails(function () {\n    return defineProperty(cel('div'), 'a', { get: function get() {\n        return 7;\n      } }).a != 7;\n  });\n  $.setDesc = function (O, P, Attributes) {\n    if (IE8_DOM_DEFINE) try {\n      return defineProperty(O, P, Attributes);\n    } catch (e) {/* empty */}\n    if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n    if ('value' in Attributes) anObject(O)[P] = Attributes.value;\n    return O;\n  };\n  $.getDesc = function (O, P) {\n    if (IE8_DOM_DEFINE) try {\n      return getOwnDescriptor(O, P);\n    } catch (e) {/* empty */}\n    if (has(O, P)) return createDesc(!ObjectProto.propertyIsEnumerable.call(O, P), O[P]);\n  };\n  $.setDescs = defineProperties = function defineProperties(O, Properties) {\n    anObject(O);\n    var keys = $.getKeys(Properties),\n        length = keys.length,\n        i = 0,\n        P;\n    while (length > i) {\n      $.setDesc(O, P = keys[i++], Properties[P]);\n    }return O;\n  };\n}\n$export($export.S + $export.F * !DESCRIPTORS, 'Object', {\n  // 19.1.2.6 / 15.2.3.3 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $.getDesc,\n  // 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n  defineProperty: $.setDesc,\n  // 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n  defineProperties: defineProperties\n});\n\n// IE 8- don't enum bug keys\nvar keys1 = ('constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,' + 'toLocaleString,toString,valueOf').split(',')\n// Additional keys for getOwnPropertyNames\n,\n    keys2 = keys1.concat('length', 'prototype'),\n    keysLen1 = keys1.length;\n\n// Create object with `null` prototype: use iframe Object with cleared prototype\nvar _createDict = function createDict() {\n  // Thrash, waste and sodomy: IE GC bug\n  var iframe = cel('iframe'),\n      i = keysLen1,\n      gt = '>',\n      iframeDocument;\n  iframe.style.display = 'none';\n  html.appendChild(iframe);\n  iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n  // createDict = iframe.contentWindow.Object;\n  // html.removeChild(iframe);\n  iframeDocument = iframe.contentWindow.document;\n  iframeDocument.open();\n  iframeDocument.write('<script>document.F=Object</script' + gt);\n  iframeDocument.close();\n  _createDict = iframeDocument.F;\n  while (i--) {\n    delete _createDict.prototype[keys1[i]];\n  }return _createDict();\n};\nvar createGetKeys = function createGetKeys(names, length) {\n  return function (object) {\n    var O = toIObject(object),\n        i = 0,\n        result = [],\n        key;\n    for (key in O) {\n      if (key != IE_PROTO) has(O, key) && result.push(key);\n    } // Don't enum bug & hidden keys\n    while (length > i) {\n      if (has(O, key = names[i++])) {\n        ~arrayIndexOf(result, key) || result.push(key);\n      }\n    }return result;\n  };\n};\nvar Empty = function Empty() {};\n$export($export.S, 'Object', {\n  // 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\n  getPrototypeOf: $.getProto = $.getProto || function (O) {\n    O = toObject(O);\n    if (has(O, IE_PROTO)) return O[IE_PROTO];\n    if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n      return O.constructor.prototype;\n    }return O instanceof Object ? ObjectProto : null;\n  },\n  // 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $.getNames = $.getNames || createGetKeys(keys2, keys2.length, true),\n  // 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n  create: $.create = $.create || function (O, /*?*/Properties) {\n    var result;\n    if (O !== null) {\n      Empty.prototype = anObject(O);\n      result = new Empty();\n      Empty.prototype = null;\n      // add \"__proto__\" for Object.getPrototypeOf shim\n      result[IE_PROTO] = O;\n    } else result = _createDict();\n    return Properties === undefined ? result : defineProperties(result, Properties);\n  },\n  // 19.1.2.14 / 15.2.3.14 Object.keys(O)\n  keys: $.getKeys = $.getKeys || createGetKeys(keys1, keysLen1, false)\n});\n\nvar construct = function construct(F, len, args) {\n  if (!(len in factories)) {\n    for (var n = [], i = 0; i < len; i++) {\n      n[i] = 'a[' + i + ']';\n    }factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n  }\n  return factories[len](F, args);\n};\n\n// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\n$export($export.P, 'Function', {\n  bind: function bind(that /*, args... */) {\n    var fn = aFunction(this),\n        partArgs = arraySlice.call(arguments, 1);\n    var bound = function bound() /* args... */{\n      var args = partArgs.concat(arraySlice.call(arguments));\n      return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n    };\n    if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n    return bound;\n  }\n});\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * fails(function () {\n  if (html) arraySlice.call(html);\n}), 'Array', {\n  slice: function slice(begin, end) {\n    var len = toLength(this.length),\n        klass = cof(this);\n    end = end === undefined ? len : end;\n    if (klass == 'Array') return arraySlice.call(this, begin, end);\n    var start = toIndex(begin, len),\n        upTo = toIndex(end, len),\n        size = toLength(upTo - start),\n        cloned = Array(size),\n        i = 0;\n    for (; i < size; i++) {\n      cloned[i] = klass == 'String' ? this.charAt(start + i) : this[start + i];\n    }return cloned;\n  }\n});\n$export($export.P + $export.F * (IObject != Object), 'Array', {\n  join: function join(separator) {\n    return arrayJoin.call(IObject(this), separator === undefined ? ',' : separator);\n  }\n});\n\n// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\n$export($export.S, 'Array', { isArray: require('./$.is-array') });\n\nvar createArrayReduce = function createArrayReduce(isRight) {\n  return function (callbackfn, memo) {\n    aFunction(callbackfn);\n    var O = IObject(this),\n        length = toLength(O.length),\n        index = isRight ? length - 1 : 0,\n        i = isRight ? -1 : 1;\n    if (arguments.length < 2) for (;;) {\n      if (index in O) {\n        memo = O[index];\n        index += i;\n        break;\n      }\n      index += i;\n      if (isRight ? index < 0 : length <= index) {\n        throw TypeError('Reduce of empty array with no initial value');\n      }\n    }\n    for (; isRight ? index >= 0 : length > index; index += i) {\n      if (index in O) {\n        memo = callbackfn(memo, O[index], index, this);\n      }\n    }return memo;\n  };\n};\n\nvar methodize = function methodize($fn) {\n  return function (arg1 /*, arg2 = undefined */) {\n    return $fn(this, arg1, arguments[1]);\n  };\n};\n\n$export($export.P, 'Array', {\n  // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n  forEach: $.each = $.each || methodize(createArrayMethod(0)),\n  // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n  map: methodize(createArrayMethod(1)),\n  // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n  filter: methodize(createArrayMethod(2)),\n  // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n  some: methodize(createArrayMethod(3)),\n  // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n  every: methodize(createArrayMethod(4)),\n  // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n  reduce: createArrayReduce(false),\n  // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n  reduceRight: createArrayReduce(true),\n  // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n  indexOf: methodize(arrayIndexOf),\n  // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n  lastIndexOf: function lastIndexOf(el, fromIndex /* = @[*-1] */) {\n    var O = toIObject(this),\n        length = toLength(O.length),\n        index = length - 1;\n    if (arguments.length > 1) index = Math.min(index, toInteger(fromIndex));\n    if (index < 0) index = toLength(length + index);\n    for (; index >= 0; index--) {\n      if (index in O) if (O[index] === el) return index;\n    }return -1;\n  }\n});\n\n// 20.3.3.1 / 15.9.4.4 Date.now()\n$export($export.S, 'Date', { now: function now() {\n    return +new Date();\n  } });\n\nvar lz = function lz(num) {\n  return num > 9 ? num : '0' + num;\n};\n\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (fails(function () {\n  return new Date(-5e13 - 1).toISOString() != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n  new Date(NaN).toISOString();\n})), 'Date', {\n  toISOString: function toISOString() {\n    if (!isFinite(this)) throw RangeError('Invalid time value');\n    var d = this,\n        y = d.getUTCFullYear(),\n        m = d.getUTCMilliseconds(),\n        s = y < 0 ? '-' : y > 9999 ? '+' : '';\n    return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) + '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) + 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) + ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n  }\n});\n\n},{\"./$\":87,\"./$.a-function\":43,\"./$.an-object\":45,\"./$.array-includes\":48,\"./$.array-methods\":49,\"./$.cof\":52,\"./$.descriptors\":60,\"./$.dom-create\":61,\"./$.export\":63,\"./$.fails\":65,\"./$.has\":71,\"./$.html\":73,\"./$.invoke\":74,\"./$.iobject\":75,\"./$.is-array\":77,\"./$.is-object\":79,\"./$.property-desc\":100,\"./$.to-index\":117,\"./$.to-integer\":118,\"./$.to-iobject\":119,\"./$.to-length\":120,\"./$.to-object\":121,\"./$.uid\":123}],127:[function(require,module,exports){\n'use strict';\n\n// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./$.export');\n\n$export($export.P, 'Array', { copyWithin: require('./$.array-copy-within') });\n\nrequire('./$.add-to-unscopables')('copyWithin');\n\n},{\"./$.add-to-unscopables\":44,\"./$.array-copy-within\":46,\"./$.export\":63}],128:[function(require,module,exports){\n'use strict';\n\n// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./$.export');\n\n$export($export.P, 'Array', { fill: require('./$.array-fill') });\n\nrequire('./$.add-to-unscopables')('fill');\n\n},{\"./$.add-to-unscopables\":44,\"./$.array-fill\":47,\"./$.export\":63}],129:[function(require,module,exports){\n'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\n\nvar $export = require('./$.export'),\n    $find = require('./$.array-methods')(6),\n    KEY = 'findIndex',\n    forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () {\n  forced = false;\n});\n$export($export.P + $export.F * forced, 'Array', {\n  findIndex: function findIndex(callbackfn /*, that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\nrequire('./$.add-to-unscopables')(KEY);\n\n},{\"./$.add-to-unscopables\":44,\"./$.array-methods\":49,\"./$.export\":63}],130:[function(require,module,exports){\n'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\n\nvar $export = require('./$.export'),\n    $find = require('./$.array-methods')(5),\n    KEY = 'find',\n    forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () {\n  forced = false;\n});\n$export($export.P + $export.F * forced, 'Array', {\n  find: function find(callbackfn /*, that = undefined */) {\n    return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\nrequire('./$.add-to-unscopables')(KEY);\n\n},{\"./$.add-to-unscopables\":44,\"./$.array-methods\":49,\"./$.export\":63}],131:[function(require,module,exports){\n'use strict';\n\nvar ctx = require('./$.ctx'),\n    $export = require('./$.export'),\n    toObject = require('./$.to-object'),\n    call = require('./$.iter-call'),\n    isArrayIter = require('./$.is-array-iter'),\n    toLength = require('./$.to-length'),\n    getIterFn = require('./core.get-iterator-method');\n$export($export.S + $export.F * !require('./$.iter-detect')(function (iter) {\n  Array.from(iter);\n}), 'Array', {\n  // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n  from: function from(arrayLike /*, mapfn = undefined, thisArg = undefined*/) {\n    var O = toObject(arrayLike),\n        C = typeof this == 'function' ? this : Array,\n        $$ = arguments,\n        $$len = $$.length,\n        mapfn = $$len > 1 ? $$[1] : undefined,\n        mapping = mapfn !== undefined,\n        index = 0,\n        iterFn = getIterFn(O),\n        length,\n        result,\n        step,\n        iterator;\n    if (mapping) mapfn = ctx(mapfn, $$len > 2 ? $$[2] : undefined, 2);\n    // if object isn't iterable or it's array with default iterator - use simple case\n    if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n      for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n        result[index] = mapping ? call(iterator, mapfn, [step.value, index], true) : step.value;\n      }\n    } else {\n      length = toLength(O.length);\n      for (result = new C(length); length > index; index++) {\n        result[index] = mapping ? mapfn(O[index], index) : O[index];\n      }\n    }\n    result.length = index;\n    return result;\n  }\n});\n\n},{\"./$.ctx\":58,\"./$.export\":63,\"./$.is-array-iter\":76,\"./$.iter-call\":81,\"./$.iter-detect\":84,\"./$.to-length\":120,\"./$.to-object\":121,\"./core.get-iterator-method\":125}],132:[function(require,module,exports){\n'use strict';\n\nvar addToUnscopables = require('./$.add-to-unscopables'),\n    step = require('./$.iter-step'),\n    Iterators = require('./$.iterators'),\n    toIObject = require('./$.to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./$.iter-define')(Array, 'Array', function (iterated, kind) {\n  this._t = toIObject(iterated); // target\n  this._i = 0; // next index\n  this._k = kind; // kind\n  // 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n  var O = this._t,\n      kind = this._k,\n      index = this._i++;\n  if (!O || index >= O.length) {\n    this._t = undefined;\n    return step(1);\n  }\n  if (kind == 'keys') return step(0, index);\n  if (kind == 'values') return step(0, O[index]);\n  return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\n},{\"./$.add-to-unscopables\":44,\"./$.iter-define\":83,\"./$.iter-step\":85,\"./$.iterators\":86,\"./$.to-iobject\":119}],133:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./$.fails')(function () {\n  function F() {}\n  return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n  // 22.1.2.3 Array.of( ...items)\n  of: function of() /* ...args */{\n    var index = 0,\n        $$ = arguments,\n        $$len = $$.length,\n        result = new (typeof this == 'function' ? this : Array)($$len);\n    while ($$len > index) {\n      result[index] = $$[index++];\n    }result.length = $$len;\n    return result;\n  }\n});\n\n},{\"./$.export\":63,\"./$.fails\":65}],134:[function(require,module,exports){\n'use strict';\n\nrequire('./$.set-species')('Array');\n\n},{\"./$.set-species\":106}],135:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    isObject = require('./$.is-object'),\n    HAS_INSTANCE = require('./$.wks')('hasInstance'),\n    FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif (!(HAS_INSTANCE in FunctionProto)) $.setDesc(FunctionProto, HAS_INSTANCE, { value: function value(O) {\n    if (typeof this != 'function' || !isObject(O)) return false;\n    if (!isObject(this.prototype)) return O instanceof this;\n    // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n    while (O = $.getProto(O)) {\n      if (this.prototype === O) return true;\n    }return false;\n  } });\n\n},{\"./$\":87,\"./$.is-object\":79,\"./$.wks\":124}],136:[function(require,module,exports){\n'use strict';\n\nvar setDesc = require('./$').setDesc,\n    createDesc = require('./$.property-desc'),\n    has = require('./$.has'),\n    FProto = Function.prototype,\n    nameRE = /^\\s*function ([^ (]*)/,\n    NAME = 'name';\n// 19.2.4.2 name\nNAME in FProto || require('./$.descriptors') && setDesc(FProto, NAME, {\n  configurable: true,\n  get: function get() {\n    var match = ('' + this).match(nameRE),\n        name = match ? match[1] : '';\n    has(this, NAME) || setDesc(this, NAME, createDesc(5, name));\n    return name;\n  }\n});\n\n},{\"./$\":87,\"./$.descriptors\":60,\"./$.has\":71,\"./$.property-desc\":100}],137:[function(require,module,exports){\n'use strict';\n\nvar strong = require('./$.collection-strong');\n\n// 23.1 Map Objects\nrequire('./$.collection')('Map', function (get) {\n  return function Map() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.1.3.6 Map.prototype.get(key)\n  get: function get(key) {\n    var entry = strong.getEntry(this, key);\n    return entry && entry.v;\n  },\n  // 23.1.3.9 Map.prototype.set(key, value)\n  set: function set(key, value) {\n    return strong.def(this, key === 0 ? 0 : key, value);\n  }\n}, strong, true);\n\n},{\"./$.collection\":56,\"./$.collection-strong\":53}],138:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.3 Math.acosh(x)\nvar $export = require('./$.export'),\n    log1p = require('./$.math-log1p'),\n    sqrt = Math.sqrt,\n    $acosh = Math.acosh;\n\n// V8 bug https://code.google.com/p/v8/issues/detail?id=3509\n$export($export.S + $export.F * !($acosh && Math.floor($acosh(Number.MAX_VALUE)) == 710), 'Math', {\n  acosh: function acosh(x) {\n    return (x = +x) < 1 ? NaN : x > 94906265.62425156 ? Math.log(x) + Math.LN2 : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n  }\n});\n\n},{\"./$.export\":63,\"./$.math-log1p\":91}],139:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.5 Math.asinh(x)\nvar $export = require('./$.export');\n\nfunction asinh(x) {\n  return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n$export($export.S, 'Math', { asinh: asinh });\n\n},{\"./$.export\":63}],140:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.7 Math.atanh(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  atanh: function atanh(x) {\n    return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n  }\n});\n\n},{\"./$.export\":63}],141:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./$.export'),\n    sign = require('./$.math-sign');\n\n$export($export.S, 'Math', {\n  cbrt: function cbrt(x) {\n    return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n  }\n});\n\n},{\"./$.export\":63,\"./$.math-sign\":92}],142:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.11 Math.clz32(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  clz32: function clz32(x) {\n    return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n  }\n});\n\n},{\"./$.export\":63}],143:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.12 Math.cosh(x)\nvar $export = require('./$.export'),\n    exp = Math.exp;\n\n$export($export.S, 'Math', {\n  cosh: function cosh(x) {\n    return (exp(x = +x) + exp(-x)) / 2;\n  }\n});\n\n},{\"./$.export\":63}],144:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.14 Math.expm1(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', { expm1: require('./$.math-expm1') });\n\n},{\"./$.export\":63,\"./$.math-expm1\":90}],145:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.16 Math.fround(x)\nvar $export = require('./$.export'),\n    sign = require('./$.math-sign'),\n    pow = Math.pow,\n    EPSILON = pow(2, -52),\n    EPSILON32 = pow(2, -23),\n    MAX32 = pow(2, 127) * (2 - EPSILON32),\n    MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function roundTiesToEven(n) {\n  return n + 1 / EPSILON - 1 / EPSILON;\n};\n\n$export($export.S, 'Math', {\n  fround: function fround(x) {\n    var $abs = Math.abs(x),\n        $sign = sign(x),\n        a,\n        result;\n    if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n    a = (1 + EPSILON32 / EPSILON) * $abs;\n    result = a - (a - $abs);\n    if (result > MAX32 || result != result) return $sign * Infinity;\n    return $sign * result;\n  }\n});\n\n},{\"./$.export\":63,\"./$.math-sign\":92}],146:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./$.export'),\n    abs = Math.abs;\n\n$export($export.S, 'Math', {\n  hypot: function hypot(value1, value2) {\n    // eslint-disable-line no-unused-vars\n    var sum = 0,\n        i = 0,\n        $$ = arguments,\n        $$len = $$.length,\n        larg = 0,\n        arg,\n        div;\n    while (i < $$len) {\n      arg = abs($$[i++]);\n      if (larg < arg) {\n        div = larg / arg;\n        sum = sum * div * div + 1;\n        larg = arg;\n      } else if (arg > 0) {\n        div = arg / larg;\n        sum += div * div;\n      } else sum += arg;\n    }\n    return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n  }\n});\n\n},{\"./$.export\":63}],147:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./$.export'),\n    $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./$.fails')(function () {\n  return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n  imul: function imul(x, y) {\n    var UINT16 = 0xffff,\n        xn = +x,\n        yn = +y,\n        xl = UINT16 & xn,\n        yl = UINT16 & yn;\n    return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n  }\n});\n\n},{\"./$.export\":63,\"./$.fails\":65}],148:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.21 Math.log10(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  log10: function log10(x) {\n    return Math.log(x) / Math.LN10;\n  }\n});\n\n},{\"./$.export\":63}],149:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.20 Math.log1p(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', { log1p: require('./$.math-log1p') });\n\n},{\"./$.export\":63,\"./$.math-log1p\":91}],150:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.22 Math.log2(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  log2: function log2(x) {\n    return Math.log(x) / Math.LN2;\n  }\n});\n\n},{\"./$.export\":63}],151:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.28 Math.sign(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', { sign: require('./$.math-sign') });\n\n},{\"./$.export\":63,\"./$.math-sign\":92}],152:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.30 Math.sinh(x)\nvar $export = require('./$.export'),\n    expm1 = require('./$.math-expm1'),\n    exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./$.fails')(function () {\n  return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n  sinh: function sinh(x) {\n    return Math.abs(x = +x) < 1 ? (expm1(x) - expm1(-x)) / 2 : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n  }\n});\n\n},{\"./$.export\":63,\"./$.fails\":65,\"./$.math-expm1\":90}],153:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.33 Math.tanh(x)\nvar $export = require('./$.export'),\n    expm1 = require('./$.math-expm1'),\n    exp = Math.exp;\n\n$export($export.S, 'Math', {\n  tanh: function tanh(x) {\n    var a = expm1(x = +x),\n        b = expm1(-x);\n    return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n  }\n});\n\n},{\"./$.export\":63,\"./$.math-expm1\":90}],154:[function(require,module,exports){\n'use strict';\n\n// 20.2.2.34 Math.trunc(x)\nvar $export = require('./$.export');\n\n$export($export.S, 'Math', {\n  trunc: function trunc(it) {\n    return (it > 0 ? Math.floor : Math.ceil)(it);\n  }\n});\n\n},{\"./$.export\":63}],155:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    global = require('./$.global'),\n    has = require('./$.has'),\n    cof = require('./$.cof'),\n    toPrimitive = require('./$.to-primitive'),\n    fails = require('./$.fails'),\n    $trim = require('./$.string-trim').trim,\n    NUMBER = 'Number',\n    $Number = global[NUMBER],\n    Base = $Number,\n    proto = $Number.prototype\n// Opera ~12 has broken Object#toString\n,\n    BROKEN_COF = cof($.create(proto)) == NUMBER,\n    TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function toNumber(argument) {\n  var it = toPrimitive(argument, false);\n  if (typeof it == 'string' && it.length > 2) {\n    it = TRIM ? it.trim() : $trim(it, 3);\n    var first = it.charCodeAt(0),\n        third,\n        radix,\n        maxCode;\n    if (first === 43 || first === 45) {\n      third = it.charCodeAt(2);\n      if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n    } else if (first === 48) {\n        switch (it.charCodeAt(1)) {\n          case 66:case 98:\n            radix = 2;maxCode = 49;break; // fast equal /^0b[01]+$/i\n          case 79:case 111:\n            radix = 8;maxCode = 55;break; // fast equal /^0o[0-7]+$/i\n          default:\n            return +it;\n        }\n        for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n          code = digits.charCodeAt(i);\n          // parseInt parses a string to a first unavailable symbol\n          // but ToNumber should return NaN if a string contains unavailable symbols\n          if (code < 48 || code > maxCode) return NaN;\n        }return parseInt(digits, radix);\n      }\n  }return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n  $Number = function Number(value) {\n    var it = arguments.length < 1 ? 0 : value,\n        that = this;\n    return that instanceof $Number\n    // check on 1..constructor(foo) case\n     && (BROKEN_COF ? fails(function () {\n      proto.valueOf.call(that);\n    }) : cof(that) != NUMBER) ? new Base(toNumber(it)) : toNumber(it);\n  };\n  $.each.call(require('./$.descriptors') ? $.getNames(Base) : (\n  // ES3:\n  'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n  // ES6 (in case, if modules with ES6 Number statics required before):\n  'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger').split(','), function (key) {\n    if (has(Base, key) && !has($Number, key)) {\n      $.setDesc($Number, key, $.getDesc(Base, key));\n    }\n  });\n  $Number.prototype = proto;\n  proto.constructor = $Number;\n  require('./$.redefine')(global, NUMBER, $Number);\n}\n\n},{\"./$\":87,\"./$.cof\":52,\"./$.descriptors\":60,\"./$.fails\":65,\"./$.global\":70,\"./$.has\":71,\"./$.redefine\":102,\"./$.string-trim\":115,\"./$.to-primitive\":122}],156:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.1 Number.EPSILON\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n\n},{\"./$.export\":63}],157:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./$.export'),\n    _isFinite = require('./$.global').isFinite;\n\n$export($export.S, 'Number', {\n  isFinite: function isFinite(it) {\n    return typeof it == 'number' && _isFinite(it);\n  }\n});\n\n},{\"./$.export\":63,\"./$.global\":70}],158:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { isInteger: require('./$.is-integer') });\n\n},{\"./$.export\":63,\"./$.is-integer\":78}],159:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', {\n  isNaN: function isNaN(number) {\n    return number != number;\n  }\n});\n\n},{\"./$.export\":63}],160:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./$.export'),\n    isInteger = require('./$.is-integer'),\n    abs = Math.abs;\n\n$export($export.S, 'Number', {\n  isSafeInteger: function isSafeInteger(number) {\n    return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n  }\n});\n\n},{\"./$.export\":63,\"./$.is-integer\":78}],161:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n\n},{\"./$.export\":63}],162:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n\n},{\"./$.export\":63}],163:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.12 Number.parseFloat(string)\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { parseFloat: parseFloat });\n\n},{\"./$.export\":63}],164:[function(require,module,exports){\n'use strict';\n\n// 20.1.2.13 Number.parseInt(string, radix)\nvar $export = require('./$.export');\n\n$export($export.S, 'Number', { parseInt: parseInt });\n\n},{\"./$.export\":63}],165:[function(require,module,exports){\n'use strict';\n\n// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./$.export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./$.object-assign') });\n\n},{\"./$.export\":63,\"./$.object-assign\":94}],166:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('freeze', function ($freeze) {\n  return function freeze(it) {\n    return $freeze && isObject(it) ? $freeze(it) : it;\n  };\n});\n\n},{\"./$.is-object\":79,\"./$.object-sap\":95}],167:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./$.to-iobject');\n\nrequire('./$.object-sap')('getOwnPropertyDescriptor', function ($getOwnPropertyDescriptor) {\n  return function getOwnPropertyDescriptor(it, key) {\n    return $getOwnPropertyDescriptor(toIObject(it), key);\n  };\n});\n\n},{\"./$.object-sap\":95,\"./$.to-iobject\":119}],168:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./$.object-sap')('getOwnPropertyNames', function () {\n  return require('./$.get-names').get;\n});\n\n},{\"./$.get-names\":69,\"./$.object-sap\":95}],169:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./$.to-object');\n\nrequire('./$.object-sap')('getPrototypeOf', function ($getPrototypeOf) {\n  return function getPrototypeOf(it) {\n    return $getPrototypeOf(toObject(it));\n  };\n});\n\n},{\"./$.object-sap\":95,\"./$.to-object\":121}],170:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('isExtensible', function ($isExtensible) {\n  return function isExtensible(it) {\n    return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n  };\n});\n\n},{\"./$.is-object\":79,\"./$.object-sap\":95}],171:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('isFrozen', function ($isFrozen) {\n  return function isFrozen(it) {\n    return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n  };\n});\n\n},{\"./$.is-object\":79,\"./$.object-sap\":95}],172:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('isSealed', function ($isSealed) {\n  return function isSealed(it) {\n    return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n  };\n});\n\n},{\"./$.is-object\":79,\"./$.object-sap\":95}],173:[function(require,module,exports){\n'use strict';\n\n// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./$.export');\n$export($export.S, 'Object', { is: require('./$.same-value') });\n\n},{\"./$.export\":63,\"./$.same-value\":104}],174:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.14 Object.keys(O)\nvar toObject = require('./$.to-object');\n\nrequire('./$.object-sap')('keys', function ($keys) {\n  return function keys(it) {\n    return $keys(toObject(it));\n  };\n});\n\n},{\"./$.object-sap\":95,\"./$.to-object\":121}],175:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('preventExtensions', function ($preventExtensions) {\n  return function preventExtensions(it) {\n    return $preventExtensions && isObject(it) ? $preventExtensions(it) : it;\n  };\n});\n\n},{\"./$.is-object\":79,\"./$.object-sap\":95}],176:[function(require,module,exports){\n'use strict';\n\n// 19.1.2.17 Object.seal(O)\nvar isObject = require('./$.is-object');\n\nrequire('./$.object-sap')('seal', function ($seal) {\n  return function seal(it) {\n    return $seal && isObject(it) ? $seal(it) : it;\n  };\n});\n\n},{\"./$.is-object\":79,\"./$.object-sap\":95}],177:[function(require,module,exports){\n'use strict';\n\n// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./$.export');\n$export($export.S, 'Object', { setPrototypeOf: require('./$.set-proto').set });\n\n},{\"./$.export\":63,\"./$.set-proto\":105}],178:[function(require,module,exports){\n'use strict';\n// 19.1.3.6 Object.prototype.toString()\n\nvar classof = require('./$.classof'),\n    test = {};\ntest[require('./$.wks')('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n  require('./$.redefine')(Object.prototype, 'toString', function toString() {\n    return '[object ' + classof(this) + ']';\n  }, true);\n}\n\n},{\"./$.classof\":51,\"./$.redefine\":102,\"./$.wks\":124}],179:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    LIBRARY = require('./$.library'),\n    global = require('./$.global'),\n    ctx = require('./$.ctx'),\n    classof = require('./$.classof'),\n    $export = require('./$.export'),\n    isObject = require('./$.is-object'),\n    anObject = require('./$.an-object'),\n    aFunction = require('./$.a-function'),\n    strictNew = require('./$.strict-new'),\n    forOf = require('./$.for-of'),\n    setProto = require('./$.set-proto').set,\n    same = require('./$.same-value'),\n    SPECIES = require('./$.wks')('species'),\n    speciesConstructor = require('./$.species-constructor'),\n    asap = require('./$.microtask'),\n    PROMISE = 'Promise',\n    process = global.process,\n    isNode = classof(process) == 'process',\n    P = global[PROMISE],\n    Wrapper;\n\nvar testResolve = function testResolve(sub) {\n  var test = new P(function () {});\n  if (sub) test.constructor = Object;\n  return P.resolve(test) === test;\n};\n\nvar USE_NATIVE = function () {\n  var works = false;\n  function P2(x) {\n    var self = new P(x);\n    setProto(self, P2.prototype);\n    return self;\n  }\n  try {\n    works = P && P.resolve && testResolve();\n    setProto(P2, P);\n    P2.prototype = $.create(P.prototype, { constructor: { value: P2 } });\n    // actual Firefox has broken subclass support, test that\n    if (!(P2.resolve(5).then(function () {}) instanceof P2)) {\n      works = false;\n    }\n    // actual V8 bug, https://code.google.com/p/v8/issues/detail?id=4162\n    if (works && require('./$.descriptors')) {\n      var thenableThenGotten = false;\n      P.resolve($.setDesc({}, 'then', {\n        get: function get() {\n          thenableThenGotten = true;\n        }\n      }));\n      works = thenableThenGotten;\n    }\n  } catch (e) {\n    works = false;\n  }\n  return works;\n}();\n\n// helpers\nvar sameConstructor = function sameConstructor(a, b) {\n  // library wrapper special case\n  if (LIBRARY && a === P && b === Wrapper) return true;\n  return same(a, b);\n};\nvar getConstructor = function getConstructor(C) {\n  var S = anObject(C)[SPECIES];\n  return S != undefined ? S : C;\n};\nvar isThenable = function isThenable(it) {\n  var then;\n  return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar PromiseCapability = function PromiseCapability(C) {\n  var resolve, reject;\n  this.promise = new C(function ($$resolve, $$reject) {\n    if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n    resolve = $$resolve;\n    reject = $$reject;\n  });\n  this.resolve = aFunction(resolve), this.reject = aFunction(reject);\n};\nvar perform = function perform(exec) {\n  try {\n    exec();\n  } catch (e) {\n    return { error: e };\n  }\n};\nvar notify = function notify(record, isReject) {\n  if (record.n) return;\n  record.n = true;\n  var chain = record.c;\n  asap(function () {\n    var value = record.v,\n        ok = record.s == 1,\n        i = 0;\n    var run = function run(reaction) {\n      var handler = ok ? reaction.ok : reaction.fail,\n          resolve = reaction.resolve,\n          reject = reaction.reject,\n          result,\n          then;\n      try {\n        if (handler) {\n          if (!ok) record.h = true;\n          result = handler === true ? value : handler(value);\n          if (result === reaction.promise) {\n            reject(TypeError('Promise-chain cycle'));\n          } else if (then = isThenable(result)) {\n            then.call(result, resolve, reject);\n          } else resolve(result);\n        } else reject(value);\n      } catch (e) {\n        reject(e);\n      }\n    };\n    while (chain.length > i) {\n      run(chain[i++]);\n    } // variable length - can't use forEach\n    chain.length = 0;\n    record.n = false;\n    if (isReject) setTimeout(function () {\n      var promise = record.p,\n          handler,\n          console;\n      if (isUnhandled(promise)) {\n        if (isNode) {\n          process.emit('unhandledRejection', value, promise);\n        } else if (handler = global.onunhandledrejection) {\n          handler({ promise: promise, reason: value });\n        } else if ((console = global.console) && console.error) {\n          console.error('Unhandled promise rejection', value);\n        }\n      }record.a = undefined;\n    }, 1);\n  });\n};\nvar isUnhandled = function isUnhandled(promise) {\n  var record = promise._d,\n      chain = record.a || record.c,\n      i = 0,\n      reaction;\n  if (record.h) return false;\n  while (chain.length > i) {\n    reaction = chain[i++];\n    if (reaction.fail || !isUnhandled(reaction.promise)) return false;\n  }return true;\n};\nvar $reject = function $reject(value) {\n  var record = this;\n  if (record.d) return;\n  record.d = true;\n  record = record.r || record; // unwrap\n  record.v = value;\n  record.s = 2;\n  record.a = record.c.slice();\n  notify(record, true);\n};\nvar $resolve = function $resolve(value) {\n  var record = this,\n      then;\n  if (record.d) return;\n  record.d = true;\n  record = record.r || record; // unwrap\n  try {\n    if (record.p === value) throw TypeError(\"Promise can't be resolved itself\");\n    if (then = isThenable(value)) {\n      asap(function () {\n        var wrapper = { r: record, d: false }; // wrap\n        try {\n          then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n        } catch (e) {\n          $reject.call(wrapper, e);\n        }\n      });\n    } else {\n      record.v = value;\n      record.s = 1;\n      notify(record, false);\n    }\n  } catch (e) {\n    $reject.call({ r: record, d: false }, e); // wrap\n  }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n  // 25.4.3.1 Promise(executor)\n  P = function Promise(executor) {\n    aFunction(executor);\n    var record = this._d = {\n      p: strictNew(this, P, PROMISE), // <- promise\n      c: [], // <- awaiting reactions\n      a: undefined, // <- checked in isUnhandled reactions\n      s: 0, // <- state\n      d: false, // <- done\n      v: undefined, // <- value\n      h: false, // <- handled rejection\n      n: false // <- notify\n    };\n    try {\n      executor(ctx($resolve, record, 1), ctx($reject, record, 1));\n    } catch (err) {\n      $reject.call(record, err);\n    }\n  };\n  require('./$.redefine-all')(P.prototype, {\n    // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n    then: function then(onFulfilled, onRejected) {\n      var reaction = new PromiseCapability(speciesConstructor(this, P)),\n          promise = reaction.promise,\n          record = this._d;\n      reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n      reaction.fail = typeof onRejected == 'function' && onRejected;\n      record.c.push(reaction);\n      if (record.a) record.a.push(reaction);\n      if (record.s) notify(record, false);\n      return promise;\n    },\n    // 25.4.5.1 Promise.prototype.catch(onRejected)\n    'catch': function _catch(onRejected) {\n      return this.then(undefined, onRejected);\n    }\n  });\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: P });\nrequire('./$.set-to-string-tag')(P, PROMISE);\nrequire('./$.set-species')(PROMISE);\nWrapper = require('./$.core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n  // 25.4.4.5 Promise.reject(r)\n  reject: function reject(r) {\n    var capability = new PromiseCapability(this),\n        $$reject = capability.reject;\n    $$reject(r);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * (!USE_NATIVE || testResolve(true)), PROMISE, {\n  // 25.4.4.6 Promise.resolve(x)\n  resolve: function resolve(x) {\n    // instanceof instead of internal slot check because we should fix it without replacement native Promise core\n    if (x instanceof P && sameConstructor(x.constructor, this)) return x;\n    var capability = new PromiseCapability(this),\n        $$resolve = capability.resolve;\n    $$resolve(x);\n    return capability.promise;\n  }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./$.iter-detect')(function (iter) {\n  P.all(iter)['catch'](function () {});\n})), PROMISE, {\n  // 25.4.4.1 Promise.all(iterable)\n  all: function all(iterable) {\n    var C = getConstructor(this),\n        capability = new PromiseCapability(C),\n        resolve = capability.resolve,\n        reject = capability.reject,\n        values = [];\n    var abrupt = perform(function () {\n      forOf(iterable, false, values.push, values);\n      var remaining = values.length,\n          results = Array(remaining);\n      if (remaining) $.each.call(values, function (promise, index) {\n        var alreadyCalled = false;\n        C.resolve(promise).then(function (value) {\n          if (alreadyCalled) return;\n          alreadyCalled = true;\n          results[index] = value;\n          --remaining || resolve(results);\n        }, reject);\n      });else resolve(results);\n    });\n    if (abrupt) reject(abrupt.error);\n    return capability.promise;\n  },\n  // 25.4.4.4 Promise.race(iterable)\n  race: function race(iterable) {\n    var C = getConstructor(this),\n        capability = new PromiseCapability(C),\n        reject = capability.reject;\n    var abrupt = perform(function () {\n      forOf(iterable, false, function (promise) {\n        C.resolve(promise).then(capability.resolve, reject);\n      });\n    });\n    if (abrupt) reject(abrupt.error);\n    return capability.promise;\n  }\n});\n\n},{\"./$\":87,\"./$.a-function\":43,\"./$.an-object\":45,\"./$.classof\":51,\"./$.core\":57,\"./$.ctx\":58,\"./$.descriptors\":60,\"./$.export\":63,\"./$.for-of\":68,\"./$.global\":70,\"./$.is-object\":79,\"./$.iter-detect\":84,\"./$.library\":89,\"./$.microtask\":93,\"./$.redefine-all\":101,\"./$.same-value\":104,\"./$.set-proto\":105,\"./$.set-species\":106,\"./$.set-to-string-tag\":107,\"./$.species-constructor\":109,\"./$.strict-new\":110,\"./$.wks\":124}],180:[function(require,module,exports){\n'use strict';\n\n// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./$.export'),\n    _apply = Function.apply;\n\n$export($export.S, 'Reflect', {\n  apply: function apply(target, thisArgument, argumentsList) {\n    return _apply.call(target, thisArgument, argumentsList);\n  }\n});\n\n},{\"./$.export\":63}],181:[function(require,module,exports){\n'use strict';\n\n// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    aFunction = require('./$.a-function'),\n    anObject = require('./$.an-object'),\n    isObject = require('./$.is-object'),\n    bind = Function.bind || require('./$.core').Function.prototype.bind;\n\n// MS Edge supports only 2 arguments\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\n$export($export.S + $export.F * require('./$.fails')(function () {\n  function F() {}\n  return !(Reflect.construct(function () {}, [], F) instanceof F);\n}), 'Reflect', {\n  construct: function construct(Target, args /*, newTarget*/) {\n    aFunction(Target);\n    var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n    if (Target == newTarget) {\n      // w/o altered newTarget, optimization for 0-4 arguments\n      if (args != undefined) switch (anObject(args).length) {\n        case 0:\n          return new Target();\n        case 1:\n          return new Target(args[0]);\n        case 2:\n          return new Target(args[0], args[1]);\n        case 3:\n          return new Target(args[0], args[1], args[2]);\n        case 4:\n          return new Target(args[0], args[1], args[2], args[3]);\n      }\n      // w/o altered newTarget, lot of arguments case\n      var $args = [null];\n      $args.push.apply($args, args);\n      return new (bind.apply(Target, $args))();\n    }\n    // with altered newTarget, not support built-in constructors\n    var proto = newTarget.prototype,\n        instance = $.create(isObject(proto) ? proto : Object.prototype),\n        result = Function.apply.call(Target, instance, args);\n    return isObject(result) ? result : instance;\n  }\n});\n\n},{\"./$\":87,\"./$.a-function\":43,\"./$.an-object\":45,\"./$.core\":57,\"./$.export\":63,\"./$.fails\":65,\"./$.is-object\":79}],182:[function(require,module,exports){\n'use strict';\n\n// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    anObject = require('./$.an-object');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./$.fails')(function () {\n  Reflect.defineProperty($.setDesc({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n  defineProperty: function defineProperty(target, propertyKey, attributes) {\n    anObject(target);\n    try {\n      $.setDesc(target, propertyKey, attributes);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.export\":63,\"./$.fails\":65}],183:[function(require,module,exports){\n'use strict';\n\n// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./$.export'),\n    getDesc = require('./$').getDesc,\n    anObject = require('./$.an-object');\n\n$export($export.S, 'Reflect', {\n  deleteProperty: function deleteProperty(target, propertyKey) {\n    var desc = getDesc(anObject(target), propertyKey);\n    return desc && !desc.configurable ? false : delete target[propertyKey];\n  }\n});\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.export\":63}],184:[function(require,module,exports){\n'use strict';\n// 26.1.5 Reflect.enumerate(target)\n\nvar $export = require('./$.export'),\n    anObject = require('./$.an-object');\nvar Enumerate = function Enumerate(iterated) {\n  this._t = anObject(iterated); // target\n  this._i = 0; // next index\n  var keys = this._k = [] // keys\n  ,\n      key;\n  for (key in iterated) {\n    keys.push(key);\n  }\n};\nrequire('./$.iter-create')(Enumerate, 'Object', function () {\n  var that = this,\n      keys = that._k,\n      key;\n  do {\n    if (that._i >= keys.length) return { value: undefined, done: true };\n  } while (!((key = keys[that._i++]) in that._t));\n  return { value: key, done: false };\n});\n\n$export($export.S, 'Reflect', {\n  enumerate: function enumerate(target) {\n    return new Enumerate(target);\n  }\n});\n\n},{\"./$.an-object\":45,\"./$.export\":63,\"./$.iter-create\":82}],185:[function(require,module,exports){\n'use strict';\n\n// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    anObject = require('./$.an-object');\n\n$export($export.S, 'Reflect', {\n  getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n    return $.getDesc(anObject(target), propertyKey);\n  }\n});\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.export\":63}],186:[function(require,module,exports){\n'use strict';\n\n// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./$.export'),\n    getProto = require('./$').getProto,\n    anObject = require('./$.an-object');\n\n$export($export.S, 'Reflect', {\n  getPrototypeOf: function getPrototypeOf(target) {\n    return getProto(anObject(target));\n  }\n});\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.export\":63}],187:[function(require,module,exports){\n'use strict';\n\n// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar $ = require('./$'),\n    has = require('./$.has'),\n    $export = require('./$.export'),\n    isObject = require('./$.is-object'),\n    anObject = require('./$.an-object');\n\nfunction get(target, propertyKey /*, receiver*/) {\n  var receiver = arguments.length < 3 ? target : arguments[2],\n      desc,\n      proto;\n  if (anObject(target) === receiver) return target[propertyKey];\n  if (desc = $.getDesc(target, propertyKey)) return has(desc, 'value') ? desc.value : desc.get !== undefined ? desc.get.call(receiver) : undefined;\n  if (isObject(proto = $.getProto(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.export\":63,\"./$.has\":71,\"./$.is-object\":79}],188:[function(require,module,exports){\n'use strict';\n\n// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./$.export');\n\n$export($export.S, 'Reflect', {\n  has: function has(target, propertyKey) {\n    return propertyKey in target;\n  }\n});\n\n},{\"./$.export\":63}],189:[function(require,module,exports){\n'use strict';\n\n// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./$.export'),\n    anObject = require('./$.an-object'),\n    $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n  isExtensible: function isExtensible(target) {\n    anObject(target);\n    return $isExtensible ? $isExtensible(target) : true;\n  }\n});\n\n},{\"./$.an-object\":45,\"./$.export\":63}],190:[function(require,module,exports){\n'use strict';\n\n// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./$.export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./$.own-keys') });\n\n},{\"./$.export\":63,\"./$.own-keys\":97}],191:[function(require,module,exports){\n'use strict';\n\n// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./$.export'),\n    anObject = require('./$.an-object'),\n    $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n  preventExtensions: function preventExtensions(target) {\n    anObject(target);\n    try {\n      if ($preventExtensions) $preventExtensions(target);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n},{\"./$.an-object\":45,\"./$.export\":63}],192:[function(require,module,exports){\n'use strict';\n\n// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./$.export'),\n    setProto = require('./$.set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n  setPrototypeOf: function setPrototypeOf(target, proto) {\n    setProto.check(target, proto);\n    try {\n      setProto.set(target, proto);\n      return true;\n    } catch (e) {\n      return false;\n    }\n  }\n});\n\n},{\"./$.export\":63,\"./$.set-proto\":105}],193:[function(require,module,exports){\n'use strict';\n\n// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar $ = require('./$'),\n    has = require('./$.has'),\n    $export = require('./$.export'),\n    createDesc = require('./$.property-desc'),\n    anObject = require('./$.an-object'),\n    isObject = require('./$.is-object');\n\nfunction set(target, propertyKey, V /*, receiver*/) {\n  var receiver = arguments.length < 4 ? target : arguments[3],\n      ownDesc = $.getDesc(anObject(target), propertyKey),\n      existingDescriptor,\n      proto;\n  if (!ownDesc) {\n    if (isObject(proto = $.getProto(target))) {\n      return set(proto, propertyKey, V, receiver);\n    }\n    ownDesc = createDesc(0);\n  }\n  if (has(ownDesc, 'value')) {\n    if (ownDesc.writable === false || !isObject(receiver)) return false;\n    existingDescriptor = $.getDesc(receiver, propertyKey) || createDesc(0);\n    existingDescriptor.value = V;\n    $.setDesc(receiver, propertyKey, existingDescriptor);\n    return true;\n  }\n  return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.export\":63,\"./$.has\":71,\"./$.is-object\":79,\"./$.property-desc\":100}],194:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    global = require('./$.global'),\n    isRegExp = require('./$.is-regexp'),\n    $flags = require('./$.flags'),\n    $RegExp = global.RegExp,\n    Base = $RegExp,\n    proto = $RegExp.prototype,\n    re1 = /a/g,\n    re2 = /a/g\n// \"new\" creates a new object, old webkit buggy here\n,\n    CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./$.descriptors') && (!CORRECT_NEW || require('./$.fails')(function () {\n  re2[require('./$.wks')('match')] = false;\n  // RegExp constructor can alter flags and IsRegExp works correct with @@match\n  return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n  $RegExp = function RegExp(p, f) {\n    var piRE = isRegExp(p),\n        fiU = f === undefined;\n    return !(this instanceof $RegExp) && piRE && p.constructor === $RegExp && fiU ? p : CORRECT_NEW ? new Base(piRE && !fiU ? p.source : p, f) : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f);\n  };\n  $.each.call($.getNames(Base), function (key) {\n    key in $RegExp || $.setDesc($RegExp, key, {\n      configurable: true,\n      get: function get() {\n        return Base[key];\n      },\n      set: function set(it) {\n        Base[key] = it;\n      }\n    });\n  });\n  proto.constructor = $RegExp;\n  $RegExp.prototype = proto;\n  require('./$.redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./$.set-species')('RegExp');\n\n},{\"./$\":87,\"./$.descriptors\":60,\"./$.fails\":65,\"./$.flags\":67,\"./$.global\":70,\"./$.is-regexp\":80,\"./$.redefine\":102,\"./$.set-species\":106,\"./$.wks\":124}],195:[function(require,module,exports){\n'use strict';\n\n// 21.2.5.3 get RegExp.prototype.flags()\nvar $ = require('./$');\nif (require('./$.descriptors') && /./g.flags != 'g') $.setDesc(RegExp.prototype, 'flags', {\n  configurable: true,\n  get: require('./$.flags')\n});\n\n},{\"./$\":87,\"./$.descriptors\":60,\"./$.flags\":67}],196:[function(require,module,exports){\n'use strict';\n\n// @@match logic\nrequire('./$.fix-re-wks')('match', 1, function (defined, MATCH) {\n  // 21.1.3.11 String.prototype.match(regexp)\n  return function match(regexp) {\n    'use strict';\n\n    var O = defined(this),\n        fn = regexp == undefined ? undefined : regexp[MATCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n  };\n});\n\n},{\"./$.fix-re-wks\":66}],197:[function(require,module,exports){\n'use strict';\n\n// @@replace logic\nrequire('./$.fix-re-wks')('replace', 2, function (defined, REPLACE, $replace) {\n  // 21.1.3.14 String.prototype.replace(searchValue, replaceValue)\n  return function replace(searchValue, replaceValue) {\n    'use strict';\n\n    var O = defined(this),\n        fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n    return fn !== undefined ? fn.call(searchValue, O, replaceValue) : $replace.call(String(O), searchValue, replaceValue);\n  };\n});\n\n},{\"./$.fix-re-wks\":66}],198:[function(require,module,exports){\n'use strict';\n\n// @@search logic\nrequire('./$.fix-re-wks')('search', 1, function (defined, SEARCH) {\n  // 21.1.3.15 String.prototype.search(regexp)\n  return function search(regexp) {\n    'use strict';\n\n    var O = defined(this),\n        fn = regexp == undefined ? undefined : regexp[SEARCH];\n    return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n  };\n});\n\n},{\"./$.fix-re-wks\":66}],199:[function(require,module,exports){\n'use strict';\n\n// @@split logic\nrequire('./$.fix-re-wks')('split', 2, function (defined, SPLIT, $split) {\n  // 21.1.3.17 String.prototype.split(separator, limit)\n  return function split(separator, limit) {\n    'use strict';\n\n    var O = defined(this),\n        fn = separator == undefined ? undefined : separator[SPLIT];\n    return fn !== undefined ? fn.call(separator, O, limit) : $split.call(String(O), separator, limit);\n  };\n});\n\n},{\"./$.fix-re-wks\":66}],200:[function(require,module,exports){\n'use strict';\n\nvar strong = require('./$.collection-strong');\n\n// 23.2 Set Objects\nrequire('./$.collection')('Set', function (get) {\n  return function Set() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.2.3.1 Set.prototype.add(value)\n  add: function add(value) {\n    return strong.def(this, value = value === 0 ? 0 : value, value);\n  }\n}, strong);\n\n},{\"./$.collection\":56,\"./$.collection-strong\":53}],201:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $at = require('./$.string-at')(false);\n$export($export.P, 'String', {\n  // 21.1.3.3 String.prototype.codePointAt(pos)\n  codePointAt: function codePointAt(pos) {\n    return $at(this, pos);\n  }\n});\n\n},{\"./$.export\":63,\"./$.string-at\":111}],202:[function(require,module,exports){\n// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\n\nvar $export = require('./$.export'),\n    toLength = require('./$.to-length'),\n    context = require('./$.string-context'),\n    ENDS_WITH = 'endsWith',\n    $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./$.fails-is-regexp')(ENDS_WITH), 'String', {\n  endsWith: function endsWith(searchString /*, endPosition = @length */) {\n    var that = context(this, searchString, ENDS_WITH),\n        $$ = arguments,\n        endPosition = $$.length > 1 ? $$[1] : undefined,\n        len = toLength(that.length),\n        end = endPosition === undefined ? len : Math.min(toLength(endPosition), len),\n        search = String(searchString);\n    return $endsWith ? $endsWith.call(that, search, end) : that.slice(end - search.length, end) === search;\n  }\n});\n\n},{\"./$.export\":63,\"./$.fails-is-regexp\":64,\"./$.string-context\":112,\"./$.to-length\":120}],203:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    toIndex = require('./$.to-index'),\n    fromCharCode = String.fromCharCode,\n    $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n  // 21.1.2.2 String.fromCodePoint(...codePoints)\n  fromCodePoint: function fromCodePoint(x) {\n    // eslint-disable-line no-unused-vars\n    var res = [],\n        $$ = arguments,\n        $$len = $$.length,\n        i = 0,\n        code;\n    while ($$len > i) {\n      code = +$$[i++];\n      if (toIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n      res.push(code < 0x10000 ? fromCharCode(code) : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00));\n    }return res.join('');\n  }\n});\n\n},{\"./$.export\":63,\"./$.to-index\":117}],204:[function(require,module,exports){\n// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\n\nvar $export = require('./$.export'),\n    context = require('./$.string-context'),\n    INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./$.fails-is-regexp')(INCLUDES), 'String', {\n  includes: function includes(searchString /*, position = 0 */) {\n    return !! ~context(this, searchString, INCLUDES).indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\n},{\"./$.export\":63,\"./$.fails-is-regexp\":64,\"./$.string-context\":112}],205:[function(require,module,exports){\n'use strict';\n\nvar $at = require('./$.string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./$.iter-define')(String, 'String', function (iterated) {\n  this._t = String(iterated); // target\n  this._i = 0; // next index\n  // 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n  var O = this._t,\n      index = this._i,\n      point;\n  if (index >= O.length) return { value: undefined, done: true };\n  point = $at(O, index);\n  this._i += point.length;\n  return { value: point, done: false };\n});\n\n},{\"./$.iter-define\":83,\"./$.string-at\":111}],206:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    toIObject = require('./$.to-iobject'),\n    toLength = require('./$.to-length');\n\n$export($export.S, 'String', {\n  // 21.1.2.4 String.raw(callSite, ...substitutions)\n  raw: function raw(callSite) {\n    var tpl = toIObject(callSite.raw),\n        len = toLength(tpl.length),\n        $$ = arguments,\n        $$len = $$.length,\n        res = [],\n        i = 0;\n    while (len > i) {\n      res.push(String(tpl[i++]));\n      if (i < $$len) res.push(String($$[i]));\n    }return res.join('');\n  }\n});\n\n},{\"./$.export\":63,\"./$.to-iobject\":119,\"./$.to-length\":120}],207:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export');\n\n$export($export.P, 'String', {\n  // 21.1.3.13 String.prototype.repeat(count)\n  repeat: require('./$.string-repeat')\n});\n\n},{\"./$.export\":63,\"./$.string-repeat\":114}],208:[function(require,module,exports){\n// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\n\nvar $export = require('./$.export'),\n    toLength = require('./$.to-length'),\n    context = require('./$.string-context'),\n    STARTS_WITH = 'startsWith',\n    $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./$.fails-is-regexp')(STARTS_WITH), 'String', {\n  startsWith: function startsWith(searchString /*, position = 0 */) {\n    var that = context(this, searchString, STARTS_WITH),\n        $$ = arguments,\n        index = toLength(Math.min($$.length > 1 ? $$[1] : undefined, that.length)),\n        search = String(searchString);\n    return $startsWith ? $startsWith.call(that, search, index) : that.slice(index, index + search.length) === search;\n  }\n});\n\n},{\"./$.export\":63,\"./$.fails-is-regexp\":64,\"./$.string-context\":112,\"./$.to-length\":120}],209:[function(require,module,exports){\n'use strict';\n// 21.1.3.25 String.prototype.trim()\n\nrequire('./$.string-trim')('trim', function ($trim) {\n  return function trim() {\n    return $trim(this, 3);\n  };\n});\n\n},{\"./$.string-trim\":115}],210:[function(require,module,exports){\n'use strict';\n// ECMAScript 6 symbols shim\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar $ = require('./$'),\n    global = require('./$.global'),\n    has = require('./$.has'),\n    DESCRIPTORS = require('./$.descriptors'),\n    $export = require('./$.export'),\n    redefine = require('./$.redefine'),\n    $fails = require('./$.fails'),\n    shared = require('./$.shared'),\n    setToStringTag = require('./$.set-to-string-tag'),\n    uid = require('./$.uid'),\n    wks = require('./$.wks'),\n    keyOf = require('./$.keyof'),\n    $names = require('./$.get-names'),\n    enumKeys = require('./$.enum-keys'),\n    isArray = require('./$.is-array'),\n    anObject = require('./$.an-object'),\n    toIObject = require('./$.to-iobject'),\n    createDesc = require('./$.property-desc'),\n    getDesc = $.getDesc,\n    setDesc = $.setDesc,\n    _create = $.create,\n    getNames = $names.get,\n    $Symbol = global.Symbol,\n    $JSON = global.JSON,\n    _stringify = $JSON && $JSON.stringify,\n    setter = false,\n    HIDDEN = wks('_hidden'),\n    isEnum = $.isEnum,\n    SymbolRegistry = shared('symbol-registry'),\n    AllSymbols = shared('symbols'),\n    useNative = typeof $Symbol == 'function',\n    ObjectProto = Object.prototype;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n  return _create(setDesc({}, 'a', {\n    get: function get() {\n      return setDesc(this, 'a', { value: 7 }).a;\n    }\n  })).a != 7;\n}) ? function (it, key, D) {\n  var protoDesc = getDesc(ObjectProto, key);\n  if (protoDesc) delete ObjectProto[key];\n  setDesc(it, key, D);\n  if (protoDesc && it !== ObjectProto) setDesc(ObjectProto, key, protoDesc);\n} : setDesc;\n\nvar wrap = function wrap(tag) {\n  var sym = AllSymbols[tag] = _create($Symbol.prototype);\n  sym._k = tag;\n  DESCRIPTORS && setter && setSymbolDesc(ObjectProto, tag, {\n    configurable: true,\n    set: function set(value) {\n      if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n      setSymbolDesc(this, tag, createDesc(1, value));\n    }\n  });\n  return sym;\n};\n\nvar isSymbol = function isSymbol(it) {\n  return (typeof it === 'undefined' ? 'undefined' : _typeof(it)) == 'symbol';\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n  if (D && has(AllSymbols, key)) {\n    if (!D.enumerable) {\n      if (!has(it, HIDDEN)) setDesc(it, HIDDEN, createDesc(1, {}));\n      it[HIDDEN][key] = true;\n    } else {\n      if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n      D = _create(D, { enumerable: createDesc(0, false) });\n    }return setSymbolDesc(it, key, D);\n  }return setDesc(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n  anObject(it);\n  var keys = enumKeys(P = toIObject(P)),\n      i = 0,\n      l = keys.length,\n      key;\n  while (l > i) {\n    $defineProperty(it, key = keys[i++], P[key]);\n  }return it;\n};\nvar $create = function create(it, P) {\n  return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n  var E = isEnum.call(this, key);\n  return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n  var D = getDesc(it = toIObject(it), key);\n  if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n  return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n  var names = getNames(toIObject(it)),\n      result = [],\n      i = 0,\n      key;\n  while (names.length > i) {\n    if (!has(AllSymbols, key = names[i++]) && key != HIDDEN) result.push(key);\n  }return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n  var names = getNames(toIObject(it)),\n      result = [],\n      i = 0,\n      key;\n  while (names.length > i) {\n    if (has(AllSymbols, key = names[i++])) result.push(AllSymbols[key]);\n  }return result;\n};\nvar $stringify = function stringify(it) {\n  if (it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n  var args = [it],\n      i = 1,\n      $$ = arguments,\n      replacer,\n      $replacer;\n  while ($$.length > i) {\n    args.push($$[i++]);\n  }replacer = args[1];\n  if (typeof replacer == 'function') $replacer = replacer;\n  if ($replacer || !isArray(replacer)) replacer = function replacer(key, value) {\n    if ($replacer) value = $replacer.call(this, key, value);\n    if (!isSymbol(value)) return value;\n  };\n  args[1] = replacer;\n  return _stringify.apply($JSON, args);\n};\nvar buggyJSON = $fails(function () {\n  var S = $Symbol();\n  // MS Edge converts symbol values to JSON as {}\n  // WebKit converts symbol values to JSON as null\n  // V8 throws on boxed symbols\n  return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n});\n\n// 19.4.1.1 Symbol([description])\nif (!useNative) {\n  $Symbol = function _Symbol() {\n    if (isSymbol(this)) throw TypeError('Symbol is not a constructor');\n    return wrap(uid(arguments.length > 0 ? arguments[0] : undefined));\n  };\n  redefine($Symbol.prototype, 'toString', function toString() {\n    return this._k;\n  });\n\n  isSymbol = function isSymbol(it) {\n    return it instanceof $Symbol;\n  };\n\n  $.create = $create;\n  $.isEnum = $propertyIsEnumerable;\n  $.getDesc = $getOwnPropertyDescriptor;\n  $.setDesc = $defineProperty;\n  $.setDescs = $defineProperties;\n  $.getNames = $names.get = $getOwnPropertyNames;\n  $.getSymbols = $getOwnPropertySymbols;\n\n  if (DESCRIPTORS && !require('./$.library')) {\n    redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n  }\n}\n\nvar symbolStatics = {\n  // 19.4.2.1 Symbol.for(key)\n  'for': function _for(key) {\n    return has(SymbolRegistry, key += '') ? SymbolRegistry[key] : SymbolRegistry[key] = $Symbol(key);\n  },\n  // 19.4.2.5 Symbol.keyFor(sym)\n  keyFor: function keyFor(key) {\n    return keyOf(SymbolRegistry, key);\n  },\n  useSetter: function useSetter() {\n    setter = true;\n  },\n  useSimple: function useSimple() {\n    setter = false;\n  }\n};\n// 19.4.2.2 Symbol.hasInstance\n// 19.4.2.3 Symbol.isConcatSpreadable\n// 19.4.2.4 Symbol.iterator\n// 19.4.2.6 Symbol.match\n// 19.4.2.8 Symbol.replace\n// 19.4.2.9 Symbol.search\n// 19.4.2.10 Symbol.species\n// 19.4.2.11 Symbol.split\n// 19.4.2.12 Symbol.toPrimitive\n// 19.4.2.13 Symbol.toStringTag\n// 19.4.2.14 Symbol.unscopables\n$.each.call(('hasInstance,isConcatSpreadable,iterator,match,replace,search,' + 'species,split,toPrimitive,toStringTag,unscopables').split(','), function (it) {\n  var sym = wks(it);\n  symbolStatics[it] = useNative ? sym : wrap(sym);\n});\n\nsetter = true;\n\n$export($export.G + $export.W, { Symbol: $Symbol });\n\n$export($export.S, 'Symbol', symbolStatics);\n\n$export($export.S + $export.F * !useNative, 'Object', {\n  // 19.1.2.2 Object.create(O [, Properties])\n  create: $create,\n  // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n  defineProperty: $defineProperty,\n  // 19.1.2.3 Object.defineProperties(O, Properties)\n  defineProperties: $defineProperties,\n  // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n  getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n  // 19.1.2.7 Object.getOwnPropertyNames(O)\n  getOwnPropertyNames: $getOwnPropertyNames,\n  // 19.1.2.8 Object.getOwnPropertySymbols(O)\n  getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!useNative || buggyJSON), 'JSON', { stringify: $stringify });\n\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n\n},{\"./$\":87,\"./$.an-object\":45,\"./$.descriptors\":60,\"./$.enum-keys\":62,\"./$.export\":63,\"./$.fails\":65,\"./$.get-names\":69,\"./$.global\":70,\"./$.has\":71,\"./$.is-array\":77,\"./$.keyof\":88,\"./$.library\":89,\"./$.property-desc\":100,\"./$.redefine\":102,\"./$.set-to-string-tag\":107,\"./$.shared\":108,\"./$.to-iobject\":119,\"./$.uid\":123,\"./$.wks\":124}],211:[function(require,module,exports){\n'use strict';\n\nvar $ = require('./$'),\n    redefine = require('./$.redefine'),\n    weak = require('./$.collection-weak'),\n    isObject = require('./$.is-object'),\n    has = require('./$.has'),\n    frozenStore = weak.frozenStore,\n    WEAK = weak.WEAK,\n    isExtensible = Object.isExtensible || isObject,\n    tmp = {};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = require('./$.collection')('WeakMap', function (get) {\n  return function WeakMap() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.3.3.3 WeakMap.prototype.get(key)\n  get: function get(key) {\n    if (isObject(key)) {\n      if (!isExtensible(key)) return frozenStore(this).get(key);\n      if (has(key, WEAK)) return key[WEAK][this._i];\n    }\n  },\n  // 23.3.3.5 WeakMap.prototype.set(key, value)\n  set: function set(key, value) {\n    return weak.def(this, key, value);\n  }\n}, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (new $WeakMap().set((Object.freeze || Object)(tmp), 7).get(tmp) != 7) {\n  $.each.call(['delete', 'has', 'get', 'set'], function (key) {\n    var proto = $WeakMap.prototype,\n        method = proto[key];\n    redefine(proto, key, function (a, b) {\n      // store frozen objects on leaky map\n      if (isObject(a) && !isExtensible(a)) {\n        var result = frozenStore(this)[key](a, b);\n        return key == 'set' ? this : result;\n        // store all the rest on native weakmap\n      }return method.call(this, a, b);\n    });\n  });\n}\n\n},{\"./$\":87,\"./$.collection\":56,\"./$.collection-weak\":55,\"./$.has\":71,\"./$.is-object\":79,\"./$.redefine\":102}],212:[function(require,module,exports){\n'use strict';\n\nvar weak = require('./$.collection-weak');\n\n// 23.4 WeakSet Objects\nrequire('./$.collection')('WeakSet', function (get) {\n  return function WeakSet() {\n    return get(this, arguments.length > 0 ? arguments[0] : undefined);\n  };\n}, {\n  // 23.4.3.1 WeakSet.prototype.add(value)\n  add: function add(value) {\n    return weak.def(this, value, true);\n  }\n}, weak, false, true);\n\n},{\"./$.collection\":56,\"./$.collection-weak\":55}],213:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $includes = require('./$.array-includes')(true);\n\n$export($export.P, 'Array', {\n  // https://github.com/domenic/Array.prototype.includes\n  includes: function includes(el /*, fromIndex = 0 */) {\n    return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n  }\n});\n\nrequire('./$.add-to-unscopables')('includes');\n\n},{\"./$.add-to-unscopables\":44,\"./$.array-includes\":48,\"./$.export\":63}],214:[function(require,module,exports){\n'use strict';\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./$.export');\n\n$export($export.P, 'Map', { toJSON: require('./$.collection-to-json')('Map') });\n\n},{\"./$.collection-to-json\":54,\"./$.export\":63}],215:[function(require,module,exports){\n'use strict';\n\n// http://goo.gl/XkBrjD\nvar $export = require('./$.export'),\n    $entries = require('./$.object-to-array')(true);\n\n$export($export.S, 'Object', {\n  entries: function entries(it) {\n    return $entries(it);\n  }\n});\n\n},{\"./$.export\":63,\"./$.object-to-array\":96}],216:[function(require,module,exports){\n'use strict';\n\n// https://gist.github.com/WebReflection/9353781\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    ownKeys = require('./$.own-keys'),\n    toIObject = require('./$.to-iobject'),\n    createDesc = require('./$.property-desc');\n\n$export($export.S, 'Object', {\n  getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n    var O = toIObject(object),\n        setDesc = $.setDesc,\n        getDesc = $.getDesc,\n        keys = ownKeys(O),\n        result = {},\n        i = 0,\n        key,\n        D;\n    while (keys.length > i) {\n      D = getDesc(O, key = keys[i++]);\n      if (key in result) setDesc(result, key, createDesc(0, D));else result[key] = D;\n    }return result;\n  }\n});\n\n},{\"./$\":87,\"./$.export\":63,\"./$.own-keys\":97,\"./$.property-desc\":100,\"./$.to-iobject\":119}],217:[function(require,module,exports){\n'use strict';\n\n// http://goo.gl/XkBrjD\nvar $export = require('./$.export'),\n    $values = require('./$.object-to-array')(false);\n\n$export($export.S, 'Object', {\n  values: function values(it) {\n    return $values(it);\n  }\n});\n\n},{\"./$.export\":63,\"./$.object-to-array\":96}],218:[function(require,module,exports){\n'use strict';\n\n// https://github.com/benjamingr/RexExp.escape\nvar $export = require('./$.export'),\n    $re = require('./$.replacer')(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n$export($export.S, 'RegExp', { escape: function escape(it) {\n    return $re(it);\n  } });\n\n},{\"./$.export\":63,\"./$.replacer\":103}],219:[function(require,module,exports){\n'use strict';\n\n// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./$.export');\n\n$export($export.P, 'Set', { toJSON: require('./$.collection-to-json')('Set') });\n\n},{\"./$.collection-to-json\":54,\"./$.export\":63}],220:[function(require,module,exports){\n'use strict';\n// https://github.com/mathiasbynens/String.prototype.at\n\nvar $export = require('./$.export'),\n    $at = require('./$.string-at')(true);\n\n$export($export.P, 'String', {\n  at: function at(pos) {\n    return $at(this, pos);\n  }\n});\n\n},{\"./$.export\":63,\"./$.string-at\":111}],221:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $pad = require('./$.string-pad');\n\n$export($export.P, 'String', {\n  padLeft: function padLeft(maxLength /*, fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n  }\n});\n\n},{\"./$.export\":63,\"./$.string-pad\":113}],222:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $pad = require('./$.string-pad');\n\n$export($export.P, 'String', {\n  padRight: function padRight(maxLength /*, fillString = ' ' */) {\n    return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n  }\n});\n\n},{\"./$.export\":63,\"./$.string-pad\":113}],223:[function(require,module,exports){\n'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n\nrequire('./$.string-trim')('trimLeft', function ($trim) {\n  return function trimLeft() {\n    return $trim(this, 1);\n  };\n});\n\n},{\"./$.string-trim\":115}],224:[function(require,module,exports){\n'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\n\nrequire('./$.string-trim')('trimRight', function ($trim) {\n  return function trimRight() {\n    return $trim(this, 2);\n  };\n});\n\n},{\"./$.string-trim\":115}],225:[function(require,module,exports){\n'use strict';\n\n// JavaScript 1.6 / Strawman array statics shim\nvar $ = require('./$'),\n    $export = require('./$.export'),\n    $ctx = require('./$.ctx'),\n    $Array = require('./$.core').Array || Array,\n    statics = {};\nvar setStatics = function setStatics(keys, length) {\n  $.each.call(keys.split(','), function (key) {\n    if (length == undefined && key in $Array) statics[key] = $Array[key];else if (key in []) statics[key] = $ctx(Function.call, [][key], length);\n  });\n};\nsetStatics('pop,reverse,shift,keys,values,entries', 1);\nsetStatics('indexOf,every,some,forEach,map,filter,find,findIndex,includes', 3);\nsetStatics('join,slice,concat,push,splice,unshift,sort,lastIndexOf,' + 'reduce,reduceRight,copyWithin,fill');\n$export($export.S, 'Array', statics);\n\n},{\"./$\":87,\"./$.core\":57,\"./$.ctx\":58,\"./$.export\":63}],226:[function(require,module,exports){\n'use strict';\n\nrequire('./es6.array.iterator');\nvar global = require('./$.global'),\n    hide = require('./$.hide'),\n    Iterators = require('./$.iterators'),\n    ITERATOR = require('./$.wks')('iterator'),\n    NL = global.NodeList,\n    HTC = global.HTMLCollection,\n    NLProto = NL && NL.prototype,\n    HTCProto = HTC && HTC.prototype,\n    ArrayValues = Iterators.NodeList = Iterators.HTMLCollection = Iterators.Array;\nif (NLProto && !NLProto[ITERATOR]) hide(NLProto, ITERATOR, ArrayValues);\nif (HTCProto && !HTCProto[ITERATOR]) hide(HTCProto, ITERATOR, ArrayValues);\n\n},{\"./$.global\":70,\"./$.hide\":72,\"./$.iterators\":86,\"./$.wks\":124,\"./es6.array.iterator\":132}],227:[function(require,module,exports){\n'use strict';\n\nvar $export = require('./$.export'),\n    $task = require('./$.task');\n$export($export.G + $export.B, {\n  setImmediate: $task.set,\n  clearImmediate: $task.clear\n});\n\n},{\"./$.export\":63,\"./$.task\":116}],228:[function(require,module,exports){\n'use strict';\n\n// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./$.global'),\n    $export = require('./$.export'),\n    invoke = require('./$.invoke'),\n    partial = require('./$.partial'),\n    navigator = global.navigator,\n    MSIE = !!navigator && /MSIE .\\./.test(navigator.userAgent); // <- dirty ie9- check\nvar wrap = function wrap(set) {\n  return MSIE ? function (fn, time /*, ...args */) {\n    return set(invoke(partial, [].slice.call(arguments, 2), typeof fn == 'function' ? fn : Function(fn)), time);\n  } : set;\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n  setTimeout: wrap(global.setTimeout),\n  setInterval: wrap(global.setInterval)\n});\n\n},{\"./$.export\":63,\"./$.global\":70,\"./$.invoke\":74,\"./$.partial\":98}],229:[function(require,module,exports){\n'use strict';\n\nrequire('./modules/es5');\nrequire('./modules/es6.symbol');\nrequire('./modules/es6.object.assign');\nrequire('./modules/es6.object.is');\nrequire('./modules/es6.object.set-prototype-of');\nrequire('./modules/es6.object.to-string');\nrequire('./modules/es6.object.freeze');\nrequire('./modules/es6.object.seal');\nrequire('./modules/es6.object.prevent-extensions');\nrequire('./modules/es6.object.is-frozen');\nrequire('./modules/es6.object.is-sealed');\nrequire('./modules/es6.object.is-extensible');\nrequire('./modules/es6.object.get-own-property-descriptor');\nrequire('./modules/es6.object.get-prototype-of');\nrequire('./modules/es6.object.keys');\nrequire('./modules/es6.object.get-own-property-names');\nrequire('./modules/es6.function.name');\nrequire('./modules/es6.function.has-instance');\nrequire('./modules/es6.number.constructor');\nrequire('./modules/es6.number.epsilon');\nrequire('./modules/es6.number.is-finite');\nrequire('./modules/es6.number.is-integer');\nrequire('./modules/es6.number.is-nan');\nrequire('./modules/es6.number.is-safe-integer');\nrequire('./modules/es6.number.max-safe-integer');\nrequire('./modules/es6.number.min-safe-integer');\nrequire('./modules/es6.number.parse-float');\nrequire('./modules/es6.number.parse-int');\nrequire('./modules/es6.math.acosh');\nrequire('./modules/es6.math.asinh');\nrequire('./modules/es6.math.atanh');\nrequire('./modules/es6.math.cbrt');\nrequire('./modules/es6.math.clz32');\nrequire('./modules/es6.math.cosh');\nrequire('./modules/es6.math.expm1');\nrequire('./modules/es6.math.fround');\nrequire('./modules/es6.math.hypot');\nrequire('./modules/es6.math.imul');\nrequire('./modules/es6.math.log10');\nrequire('./modules/es6.math.log1p');\nrequire('./modules/es6.math.log2');\nrequire('./modules/es6.math.sign');\nrequire('./modules/es6.math.sinh');\nrequire('./modules/es6.math.tanh');\nrequire('./modules/es6.math.trunc');\nrequire('./modules/es6.string.from-code-point');\nrequire('./modules/es6.string.raw');\nrequire('./modules/es6.string.trim');\nrequire('./modules/es6.string.iterator');\nrequire('./modules/es6.string.code-point-at');\nrequire('./modules/es6.string.ends-with');\nrequire('./modules/es6.string.includes');\nrequire('./modules/es6.string.repeat');\nrequire('./modules/es6.string.starts-with');\nrequire('./modules/es6.array.from');\nrequire('./modules/es6.array.of');\nrequire('./modules/es6.array.iterator');\nrequire('./modules/es6.array.species');\nrequire('./modules/es6.array.copy-within');\nrequire('./modules/es6.array.fill');\nrequire('./modules/es6.array.find');\nrequire('./modules/es6.array.find-index');\nrequire('./modules/es6.regexp.constructor');\nrequire('./modules/es6.regexp.flags');\nrequire('./modules/es6.regexp.match');\nrequire('./modules/es6.regexp.replace');\nrequire('./modules/es6.regexp.search');\nrequire('./modules/es6.regexp.split');\nrequire('./modules/es6.promise');\nrequire('./modules/es6.map');\nrequire('./modules/es6.set');\nrequire('./modules/es6.weak-map');\nrequire('./modules/es6.weak-set');\nrequire('./modules/es6.reflect.apply');\nrequire('./modules/es6.reflect.construct');\nrequire('./modules/es6.reflect.define-property');\nrequire('./modules/es6.reflect.delete-property');\nrequire('./modules/es6.reflect.enumerate');\nrequire('./modules/es6.reflect.get');\nrequire('./modules/es6.reflect.get-own-property-descriptor');\nrequire('./modules/es6.reflect.get-prototype-of');\nrequire('./modules/es6.reflect.has');\nrequire('./modules/es6.reflect.is-extensible');\nrequire('./modules/es6.reflect.own-keys');\nrequire('./modules/es6.reflect.prevent-extensions');\nrequire('./modules/es6.reflect.set');\nrequire('./modules/es6.reflect.set-prototype-of');\nrequire('./modules/es7.array.includes');\nrequire('./modules/es7.string.at');\nrequire('./modules/es7.string.pad-left');\nrequire('./modules/es7.string.pad-right');\nrequire('./modules/es7.string.trim-left');\nrequire('./modules/es7.string.trim-right');\nrequire('./modules/es7.regexp.escape');\nrequire('./modules/es7.object.get-own-property-descriptors');\nrequire('./modules/es7.object.values');\nrequire('./modules/es7.object.entries');\nrequire('./modules/es7.map.to-json');\nrequire('./modules/es7.set.to-json');\nrequire('./modules/js.array.statics');\nrequire('./modules/web.timers');\nrequire('./modules/web.immediate');\nrequire('./modules/web.dom.iterable');\nmodule.exports = require('./modules/$.core');\n\n},{\"./modules/$.core\":57,\"./modules/es5\":126,\"./modules/es6.array.copy-within\":127,\"./modules/es6.array.fill\":128,\"./modules/es6.array.find\":130,\"./modules/es6.array.find-index\":129,\"./modules/es6.array.from\":131,\"./modules/es6.array.iterator\":132,\"./modules/es6.array.of\":133,\"./modules/es6.array.species\":134,\"./modules/es6.function.has-instance\":135,\"./modules/es6.function.name\":136,\"./modules/es6.map\":137,\"./modules/es6.math.acosh\":138,\"./modules/es6.math.asinh\":139,\"./modules/es6.math.atanh\":140,\"./modules/es6.math.cbrt\":141,\"./modules/es6.math.clz32\":142,\"./modules/es6.math.cosh\":143,\"./modules/es6.math.expm1\":144,\"./modules/es6.math.fround\":145,\"./modules/es6.math.hypot\":146,\"./modules/es6.math.imul\":147,\"./modules/es6.math.log10\":148,\"./modules/es6.math.log1p\":149,\"./modules/es6.math.log2\":150,\"./modules/es6.math.sign\":151,\"./modules/es6.math.sinh\":152,\"./modules/es6.math.tanh\":153,\"./modules/es6.math.trunc\":154,\"./modules/es6.number.constructor\":155,\"./modules/es6.number.epsilon\":156,\"./modules/es6.number.is-finite\":157,\"./modules/es6.number.is-integer\":158,\"./modules/es6.number.is-nan\":159,\"./modules/es6.number.is-safe-integer\":160,\"./modules/es6.number.max-safe-integer\":161,\"./modules/es6.number.min-safe-integer\":162,\"./modules/es6.number.parse-float\":163,\"./modules/es6.number.parse-int\":164,\"./modules/es6.object.assign\":165,\"./modules/es6.object.freeze\":166,\"./modules/es6.object.get-own-property-descriptor\":167,\"./modules/es6.object.get-own-property-names\":168,\"./modules/es6.object.get-prototype-of\":169,\"./modules/es6.object.is\":173,\"./modules/es6.object.is-extensible\":170,\"./modules/es6.object.is-frozen\":171,\"./modules/es6.object.is-sealed\":172,\"./modules/es6.object.keys\":174,\"./modules/es6.object.prevent-extensions\":175,\"./modules/es6.object.seal\":176,\"./modules/es6.object.set-prototype-of\":177,\"./modules/es6.object.to-string\":178,\"./modules/es6.promise\":179,\"./modules/es6.reflect.apply\":180,\"./modules/es6.reflect.construct\":181,\"./modules/es6.reflect.define-property\":182,\"./modules/es6.reflect.delete-property\":183,\"./modules/es6.reflect.enumerate\":184,\"./modules/es6.reflect.get\":187,\"./modules/es6.reflect.get-own-property-descriptor\":185,\"./modules/es6.reflect.get-prototype-of\":186,\"./modules/es6.reflect.has\":188,\"./modules/es6.reflect.is-extensible\":189,\"./modules/es6.reflect.own-keys\":190,\"./modules/es6.reflect.prevent-extensions\":191,\"./modules/es6.reflect.set\":193,\"./modules/es6.reflect.set-prototype-of\":192,\"./modules/es6.regexp.constructor\":194,\"./modules/es6.regexp.flags\":195,\"./modules/es6.regexp.match\":196,\"./modules/es6.regexp.replace\":197,\"./modules/es6.regexp.search\":198,\"./modules/es6.regexp.split\":199,\"./modules/es6.set\":200,\"./modules/es6.string.code-point-at\":201,\"./modules/es6.string.ends-with\":202,\"./modules/es6.string.from-code-point\":203,\"./modules/es6.string.includes\":204,\"./modules/es6.string.iterator\":205,\"./modules/es6.string.raw\":206,\"./modules/es6.string.repeat\":207,\"./modules/es6.string.starts-with\":208,\"./modules/es6.string.trim\":209,\"./modules/es6.symbol\":210,\"./modules/es6.weak-map\":211,\"./modules/es6.weak-set\":212,\"./modules/es7.array.includes\":213,\"./modules/es7.map.to-json\":214,\"./modules/es7.object.entries\":215,\"./modules/es7.object.get-own-property-descriptors\":216,\"./modules/es7.object.values\":217,\"./modules/es7.regexp.escape\":218,\"./modules/es7.set.to-json\":219,\"./modules/es7.string.at\":220,\"./modules/es7.string.pad-left\":221,\"./modules/es7.string.pad-right\":222,\"./modules/es7.string.trim-left\":223,\"./modules/es7.string.trim-right\":224,\"./modules/js.array.statics\":225,\"./modules/web.dom.iterable\":226,\"./modules/web.immediate\":227,\"./modules/web.timers\":228}],230:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = createHash;\n\nfunction createHash(elem) {\n    var attributes = elem.attributes;\n    var hash = {};\n\n    if (attributes === null || attributes === undefined) {\n        return hash;\n    }\n\n    for (var i = 0; i < attributes.length; i++) {\n        var attr = attributes[i];\n\n        if (attr.name.substr(0, 5) !== \"data-\") {\n            continue;\n        }\n\n        hash[attr.name.substr(5)] = attr.value;\n    }\n\n    return hash;\n}\n\n},{}],231:[function(require,module,exports){\n'use strict';\n\nvar createHash = require('./create-hash.js');\n\nvar hashKey = '__DATA_SET_WEAK_KEY@4';\n\nmodule.exports = DataSet;\n\nfunction DataSet(elem) {\n    var hash = elem[hashKey];\n\n    if (!hash) {\n        hash = elem[hashKey] = createHash(elem);\n    }\n\n    return hash;\n}\n\n},{\"./create-hash.js\":230}],232:[function(require,module,exports){\n'use strict';\n\nvar support = require('dom-support');\nvar getDocument = require('get-document');\nvar withinElement = require('within-element');\n\n/**\n * Get offset of a DOM Element or Range within the document.\n *\n * @param {DOMElement|Range} el - the DOM element or Range instance to measure\n * @return {Object} An object with `top` and `left` Number values\n * @public\n */\n\nmodule.exports = function offset(el) {\n  var doc = getDocument(el);\n  if (!doc) return;\n\n  // Make sure it's not a disconnected DOM node\n  if (!withinElement(el, doc)) return;\n\n  var body = doc.body;\n  if (body === el) {\n    return bodyOffset(el);\n  }\n\n  var box = { top: 0, left: 0 };\n  if (typeof el.getBoundingClientRect !== \"undefined\") {\n    // If we don't have gBCR, just use 0,0 rather than error\n    // BlackBerry 5, iOS 3 (original iPhone)\n    box = el.getBoundingClientRect();\n\n    if (el.collapsed && box.left === 0 && box.top === 0) {\n      // collapsed Range instances sometimes report 0, 0\n      // see: http://stackoverflow.com/a/6847328/376773\n      var span = doc.createElement(\"span\");\n\n      // Ensure span has dimensions and position by\n      // adding a zero-width space character\n      span.appendChild(doc.createTextNode('​'));\n      el.insertNode(span);\n      box = span.getBoundingClientRect();\n\n      // Remove temp SPAN and glue any broken text nodes back together\n      var spanParent = span.parentNode;\n      spanParent.removeChild(span);\n      spanParent.normalize();\n    }\n  }\n\n  var docEl = doc.documentElement;\n  var clientTop = docEl.clientTop || body.clientTop || 0;\n  var clientLeft = docEl.clientLeft || body.clientLeft || 0;\n  var scrollTop = window.pageYOffset || docEl.scrollTop;\n  var scrollLeft = window.pageXOffset || docEl.scrollLeft;\n\n  return {\n    top: box.top + scrollTop - clientTop,\n    left: box.left + scrollLeft - clientLeft\n  };\n};\n\nfunction bodyOffset(body) {\n  var top = body.offsetTop;\n  var left = body.offsetLeft;\n\n  if (support.doesNotIncludeMarginInBodyOffset) {\n    top += parseFloat(body.style.marginTop || 0);\n    left += parseFloat(body.style.marginLeft || 0);\n  }\n\n  return {\n    top: top,\n    left: left\n  };\n}\n\n},{\"dom-support\":234,\"get-document\":236,\"within-element\":241}],233:[function(require,module,exports){\n\"use strict\";\n\nmodule.exports = one;\nmodule.exports.all = all;\n\nfunction one(selector, parent) {\n  parent || (parent = document);\n  return parent.querySelector(selector);\n}\n\nfunction all(selector, parent) {\n  parent || (parent = document);\n  var selection = parent.querySelectorAll(selector);\n  return Array.prototype.slice.call(selection);\n}\n\n},{}],234:[function(require,module,exports){\n\"use strict\";\n\nvar domready = require('domready');\n\nmodule.exports = function () {\n\n\tvar support,\n\t    all,\n\t    a,\n\t    select,\n\t    opt,\n\t    input,\n\t    fragment,\n\t    eventName,\n\t    i,\n\t    isSupported,\n\t    clickFn,\n\t    div = document.createElement(\"div\");\n\n\t// Setup\n\tdiv.setAttribute(\"className\", \"t\");\n\tdiv.innerHTML = \"  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>\";\n\n\t// Support tests won't run in some limited or non-browser environments\n\tall = div.getElementsByTagName(\"*\");\n\ta = div.getElementsByTagName(\"a\")[0];\n\tif (!all || !a || !all.length) {\n\t\treturn {};\n\t}\n\n\t// First batch of tests\n\tselect = document.createElement(\"select\");\n\topt = select.appendChild(document.createElement(\"option\"));\n\tinput = div.getElementsByTagName(\"input\")[0];\n\n\ta.style.cssText = \"top:1px;float:left;opacity:.5\";\n\tsupport = {\n\t\t// IE strips leading whitespace when .innerHTML is used\n\t\tleadingWhitespace: div.firstChild.nodeType === 3,\n\n\t\t// Make sure that tbody elements aren't automatically inserted\n\t\t// IE will insert them into empty tables\n\t\ttbody: !div.getElementsByTagName(\"tbody\").length,\n\n\t\t// Make sure that link elements get serialized correctly by innerHTML\n\t\t// This requires a wrapper element in IE\n\t\thtmlSerialize: !!div.getElementsByTagName(\"link\").length,\n\n\t\t// Get the style information from getAttribute\n\t\t// (IE uses .cssText instead)\n\t\tstyle: /top/.test(a.getAttribute(\"style\")),\n\n\t\t// Make sure that URLs aren't manipulated\n\t\t// (IE normalizes it by default)\n\t\threfNormalized: a.getAttribute(\"href\") === \"/a\",\n\n\t\t// Make sure that element opacity exists\n\t\t// (IE uses filter instead)\n\t\t// Use a regex to work around a WebKit issue. See #5145\n\t\topacity: /^0.5/.test(a.style.opacity),\n\n\t\t// Verify style float existence\n\t\t// (IE uses styleFloat instead of cssFloat)\n\t\tcssFloat: !!a.style.cssFloat,\n\n\t\t// Make sure that if no value is specified for a checkbox\n\t\t// that it defaults to \"on\".\n\t\t// (WebKit defaults to \"\" instead)\n\t\tcheckOn: input.value === \"on\",\n\n\t\t// Make sure that a selected-by-default option has a working selected property.\n\t\t// (WebKit defaults to false instead of true, IE too, if it's in an optgroup)\n\t\toptSelected: opt.selected,\n\n\t\t// Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)\n\t\tgetSetAttribute: div.className !== \"t\",\n\n\t\t// Tests for enctype support on a form (#6743)\n\t\tenctype: !!document.createElement(\"form\").enctype,\n\n\t\t// Makes sure cloning an html5 element does not cause problems\n\t\t// Where outerHTML is undefined, this still works\n\t\thtml5Clone: document.createElement(\"nav\").cloneNode(true).outerHTML !== \"<:nav></:nav>\",\n\n\t\t// jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode\n\t\tboxModel: document.compatMode === \"CSS1Compat\",\n\n\t\t// Will be defined later\n\t\tsubmitBubbles: true,\n\t\tchangeBubbles: true,\n\t\tfocusinBubbles: false,\n\t\tdeleteExpando: true,\n\t\tnoCloneEvent: true,\n\t\tinlineBlockNeedsLayout: false,\n\t\tshrinkWrapBlocks: false,\n\t\treliableMarginRight: true,\n\t\tboxSizingReliable: true,\n\t\tpixelPosition: false\n\t};\n\n\t// Make sure checked status is properly cloned\n\tinput.checked = true;\n\tsupport.noCloneChecked = input.cloneNode(true).checked;\n\n\t// Make sure that the options inside disabled selects aren't marked as disabled\n\t// (WebKit marks them as disabled)\n\tselect.disabled = true;\n\tsupport.optDisabled = !opt.disabled;\n\n\t// Test to see if it's possible to delete an expando from an element\n\t// Fails in Internet Explorer\n\ttry {\n\t\tdelete div.test;\n\t} catch (e) {\n\t\tsupport.deleteExpando = false;\n\t}\n\n\tif (!div.addEventListener && div.attachEvent && div.fireEvent) {\n\t\tdiv.attachEvent(\"onclick\", clickFn = function clickFn() {\n\t\t\t// Cloning a node shouldn't copy over any\n\t\t\t// bound event handlers (IE does this)\n\t\t\tsupport.noCloneEvent = false;\n\t\t});\n\t\tdiv.cloneNode(true).fireEvent(\"onclick\");\n\t\tdiv.detachEvent(\"onclick\", clickFn);\n\t}\n\n\t// Check if a radio maintains its value\n\t// after being appended to the DOM\n\tinput = document.createElement(\"input\");\n\tinput.value = \"t\";\n\tinput.setAttribute(\"type\", \"radio\");\n\tsupport.radioValue = input.value === \"t\";\n\n\tinput.setAttribute(\"checked\", \"checked\");\n\n\t// #11217 - WebKit loses check when the name is after the checked attribute\n\tinput.setAttribute(\"name\", \"t\");\n\n\tdiv.appendChild(input);\n\tfragment = document.createDocumentFragment();\n\tfragment.appendChild(div.lastChild);\n\n\t// WebKit doesn't clone checked state correctly in fragments\n\tsupport.checkClone = fragment.cloneNode(true).cloneNode(true).lastChild.checked;\n\n\t// Check if a disconnected checkbox will retain its checked\n\t// value of true after appended to the DOM (IE6/7)\n\tsupport.appendChecked = input.checked;\n\n\tfragment.removeChild(input);\n\tfragment.appendChild(div);\n\n\t// Technique from Juriy Zaytsev\n\t// http://perfectionkills.com/detecting-event-support-without-browser-sniffing/\n\t// We only care about the case where non-standard event systems\n\t// are used, namely in IE. Short-circuiting here helps us to\n\t// avoid an eval call (in setAttribute) which can cause CSP\n\t// to go haywire. See: https://developer.mozilla.org/en/Security/CSP\n\tif (!div.addEventListener) {\n\t\tfor (i in {\n\t\t\tsubmit: true,\n\t\t\tchange: true,\n\t\t\tfocusin: true\n\t\t}) {\n\t\t\teventName = \"on\" + i;\n\t\t\tisSupported = eventName in div;\n\t\t\tif (!isSupported) {\n\t\t\t\tdiv.setAttribute(eventName, \"return;\");\n\t\t\t\tisSupported = typeof div[eventName] === \"function\";\n\t\t\t}\n\t\t\tsupport[i + \"Bubbles\"] = isSupported;\n\t\t}\n\t}\n\n\t// Run tests that need a body at doc ready\n\tdomready(function () {\n\t\tvar container,\n\t\t    div,\n\t\t    tds,\n\t\t    marginDiv,\n\t\t    divReset = \"padding:0;margin:0;border:0;display:block;overflow:hidden;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;\",\n\t\t    body = document.getElementsByTagName(\"body\")[0];\n\n\t\tif (!body) {\n\t\t\t// Return for frameset docs that don't have a body\n\t\t\treturn;\n\t\t}\n\n\t\tcontainer = document.createElement(\"div\");\n\t\tcontainer.style.cssText = \"visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px\";\n\t\tbody.insertBefore(container, body.firstChild);\n\n\t\t// Construct the test element\n\t\tdiv = document.createElement(\"div\");\n\t\tcontainer.appendChild(div);\n\n\t\t//Check if table cells still have offsetWidth/Height when they are set\n\t\t//to display:none and there are still other visible table cells in a\n\t\t//table row; if so, offsetWidth/Height are not reliable for use when\n\t\t//determining if an element has been hidden directly using\n\t\t//display:none (it is still safe to use offsets if a parent element is\n\t\t//hidden; don safety goggles and see bug #4512 for more information).\n\t\t//(only IE 8 fails this test)\n\t\tdiv.innerHTML = \"<table><tr><td></td><td>t</td></tr></table>\";\n\t\ttds = div.getElementsByTagName(\"td\");\n\t\ttds[0].style.cssText = \"padding:0;margin:0;border:0;display:none\";\n\t\tisSupported = tds[0].offsetHeight === 0;\n\n\t\ttds[0].style.display = \"\";\n\t\ttds[1].style.display = \"none\";\n\n\t\t// Check if empty table cells still have offsetWidth/Height\n\t\t// (IE <= 8 fail this test)\n\t\tsupport.reliableHiddenOffsets = isSupported && tds[0].offsetHeight === 0;\n\n\t\t// Check box-sizing and margin behavior\n\t\tdiv.innerHTML = \"\";\n\t\tdiv.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%;\";\n\t\tsupport.boxSizing = div.offsetWidth === 4;\n\t\tsupport.doesNotIncludeMarginInBodyOffset = body.offsetTop !== 1;\n\n\t\t// NOTE: To any future maintainer, we've window.getComputedStyle\n\t\t// because jsdom on node.js will break without it.\n\t\tif (window.getComputedStyle) {\n\t\t\tsupport.pixelPosition = (window.getComputedStyle(div, null) || {}).top !== \"1%\";\n\t\t\tsupport.boxSizingReliable = (window.getComputedStyle(div, null) || { width: \"4px\" }).width === \"4px\";\n\n\t\t\t// Check if div with explicit width and no margin-right incorrectly\n\t\t\t// gets computed margin-right based on width of container. For more\n\t\t\t// info see bug #3333\n\t\t\t// Fails in WebKit before Feb 2011 nightlies\n\t\t\t// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right\n\t\t\tmarginDiv = document.createElement(\"div\");\n\t\t\tmarginDiv.style.cssText = div.style.cssText = divReset;\n\t\t\tmarginDiv.style.marginRight = marginDiv.style.width = \"0\";\n\t\t\tdiv.style.width = \"1px\";\n\t\t\tdiv.appendChild(marginDiv);\n\t\t\tsupport.reliableMarginRight = !parseFloat((window.getComputedStyle(marginDiv, null) || {}).marginRight);\n\t\t}\n\n\t\tif (typeof div.style.zoom !== \"undefined\") {\n\t\t\t// Check if natively block-level elements act like inline-block\n\t\t\t// elements when setting their display to 'inline' and giving\n\t\t\t// them layout\n\t\t\t// (IE < 8 does this)\n\t\t\tdiv.innerHTML = \"\";\n\t\t\tdiv.style.cssText = divReset + \"width:1px;padding:1px;display:inline;zoom:1\";\n\t\t\tsupport.inlineBlockNeedsLayout = div.offsetWidth === 3;\n\n\t\t\t// Check if elements with layout shrink-wrap their children\n\t\t\t// (IE 6 does this)\n\t\t\tdiv.style.display = \"block\";\n\t\t\tdiv.style.overflow = \"visible\";\n\t\t\tdiv.innerHTML = \"<div></div>\";\n\t\t\tdiv.firstChild.style.width = \"5px\";\n\t\t\tsupport.shrinkWrapBlocks = div.offsetWidth !== 3;\n\n\t\t\tcontainer.style.zoom = 1;\n\t\t}\n\n\t\t// Null elements to avoid leaks in IE\n\t\tbody.removeChild(container);\n\t\tcontainer = div = tds = marginDiv = null;\n\t});\n\n\t// Null elements to avoid leaks in IE\n\tfragment.removeChild(div);\n\tall = a = select = opt = input = fragment = div = null;\n\n\treturn support;\n}();\n\n},{\"domready\":235}],235:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/*!\n  * domready (c) Dustin Diaz 2014 - License MIT\n  */\n!function (name, definition) {\n\n  if (typeof module != 'undefined') module.exports = definition();else if (typeof define == 'function' && _typeof(define.amd) == 'object') define(definition);else this[name] = definition();\n}('domready', function () {\n\n  var fns = [],\n      _listener,\n      doc = document,\n      hack = doc.documentElement.doScroll,\n      domContentLoaded = 'DOMContentLoaded',\n      loaded = (hack ? /^loaded|^c/ : /^loaded|^i|^c/).test(doc.readyState);\n\n  if (!loaded) doc.addEventListener(domContentLoaded, _listener = function listener() {\n    doc.removeEventListener(domContentLoaded, _listener);\n    loaded = 1;\n    while (_listener = fns.shift()) {\n      _listener();\n    }\n  });\n\n  return function (fn) {\n    loaded ? setTimeout(fn, 0) : fns.push(fn);\n  };\n});\n\n},{}],236:[function(require,module,exports){\n\"use strict\";\n\n/**\n * Module exports.\n */\n\nmodule.exports = getDocument;\n\n// defined by w3c\nvar DOCUMENT_NODE = 9;\n\n/**\n * Returns `true` if `w` is a Document object, or `false` otherwise.\n *\n * @param {?} d - Document object, maybe\n * @return {Boolean}\n * @private\n */\n\nfunction isDocument(d) {\n  return d && d.nodeType === DOCUMENT_NODE;\n}\n\n/**\n * Returns the `document` object associated with the given `node`, which may be\n * a DOM element, the Window object, a Selection, a Range. Basically any DOM\n * object that references the Document in some way, this function will find it.\n *\n * @param {Mixed} node - DOM node, selection, or range in which to find the `document` object\n * @return {Document} the `document` object associated with `node`\n * @public\n */\n\nfunction getDocument(node) {\n  if (isDocument(node)) {\n    return node;\n  } else if (isDocument(node.ownerDocument)) {\n    return node.ownerDocument;\n  } else if (isDocument(node.document)) {\n    return node.document;\n  } else if (node.parentNode) {\n    return getDocument(node.parentNode);\n\n    // Range support\n  } else if (node.commonAncestorContainer) {\n      return getDocument(node.commonAncestorContainer);\n    } else if (node.startContainer) {\n      return getDocument(node.startContainer);\n\n      // Selection support\n    } else if (node.anchorNode) {\n        return getDocument(node.anchorNode);\n      }\n}\n\n},{}],237:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n/*global window*/\n\n/**\n * Check if object is dom node.\n *\n * @param {Object} val\n * @return {Boolean}\n * @api public\n */\n\nmodule.exports = function isNode(val) {\n  if (!val || (typeof val === 'undefined' ? 'undefined' : _typeof(val)) !== 'object') return false;\n  if (window && 'object' == _typeof(window.Node)) return val instanceof window.Node;\n  return 'number' == typeof val.nodeType && 'string' == typeof val.nodeName;\n};\n\n},{}],238:[function(require,module,exports){\n// shim for using process in browser\n\nvar process = module.exports = {};\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n    draining = false;\n    if (currentQueue.length) {\n        queue = currentQueue.concat(queue);\n    } else {\n        queueIndex = -1;\n    }\n    if (queue.length) {\n        drainQueue();\n    }\n}\n\nfunction drainQueue() {\n    if (draining) {\n        return;\n    }\n    var timeout = setTimeout(cleanUpNextTick);\n    draining = true;\n\n    var len = queue.length;\n    while(len) {\n        currentQueue = queue;\n        queue = [];\n        while (++queueIndex < len) {\n            if (currentQueue) {\n                currentQueue[queueIndex].run();\n            }\n        }\n        queueIndex = -1;\n        len = queue.length;\n    }\n    currentQueue = null;\n    draining = false;\n    clearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n    var args = new Array(arguments.length - 1);\n    if (arguments.length > 1) {\n        for (var i = 1; i < arguments.length; i++) {\n            args[i - 1] = arguments[i];\n        }\n    }\n    queue.push(new Item(fun, args));\n    if (queue.length === 1 && !draining) {\n        setTimeout(drainQueue, 0);\n    }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n    this.fun = fun;\n    this.array = array;\n}\nItem.prototype.run = function () {\n    this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\n\nprocess.binding = function (name) {\n    throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n    throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n\n},{}],239:[function(require,module,exports){\n(function (process){\n\"use strict\";\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\n// vim:ts=4:sts=4:sw=4:\n/*!\n *\n * Copyright 2009-2012 Kris Kowal under the terms of the MIT\n * license found at http://github.com/kriskowal/q/raw/master/LICENSE\n *\n * With parts by Tyler Close\n * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found\n * at http://www.opensource.org/licenses/mit-license.html\n * Forked at ref_send.js version: 2009-05-11\n *\n * With parts by Mark Miller\n * Copyright (C) 2011 Google Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n */\n\n(function (definition) {\n    \"use strict\";\n\n    // This file will function properly as a <script> tag, or a module\n    // using CommonJS and NodeJS or RequireJS module formats.  In\n    // Common/Node/RequireJS, the module exports the Q API and when\n    // executed as a simple <script>, it creates a Q global instead.\n\n    // Montage Require\n\n    if (typeof bootstrap === \"function\") {\n        bootstrap(\"promise\", definition);\n\n        // CommonJS\n    } else if ((typeof exports === \"undefined\" ? \"undefined\" : _typeof(exports)) === \"object\" && (typeof module === \"undefined\" ? \"undefined\" : _typeof(module)) === \"object\") {\n            module.exports = definition();\n\n            // RequireJS\n        } else if (typeof define === \"function\" && define.amd) {\n                define(definition);\n\n                // SES (Secure EcmaScript)\n            } else if (typeof ses !== \"undefined\") {\n                    if (!ses.ok()) {\n                        return;\n                    } else {\n                        ses.makeQ = definition;\n                    }\n\n                    // <script>\n                } else if (typeof window !== \"undefined\" || typeof self !== \"undefined\") {\n                        // Prefer window over self for add-on scripts. Use self for\n                        // non-windowed contexts.\n                        var global = typeof window !== \"undefined\" ? window : self;\n\n                        // Get the `window` object, save the previous Q global\n                        // and initialize Q as a global.\n                        var previousQ = global.Q;\n                        global.Q = definition();\n\n                        // Add a noConflict function so Q can be removed from the\n                        // global namespace.\n                        global.Q.noConflict = function () {\n                            global.Q = previousQ;\n                            return this;\n                        };\n                    } else {\n                        throw new Error(\"This environment was not anticipated by Q. Please file a bug.\");\n                    }\n})(function () {\n    \"use strict\";\n\n    var hasStacks = false;\n    try {\n        throw new Error();\n    } catch (e) {\n        hasStacks = !!e.stack;\n    }\n\n    // All code after this point will be filtered from stack traces reported\n    // by Q.\n    var qStartingLine = captureLine();\n    var qFileName;\n\n    // shims\n\n    // used for fallback in \"allResolved\"\n    var noop = function noop() {};\n\n    // Use the fastest possible means to execute a task in a future turn\n    // of the event loop.\n    var nextTick = function () {\n        // linked list of tasks (single, with head node)\n        var head = { task: void 0, next: null };\n        var tail = head;\n        var flushing = false;\n        var requestTick = void 0;\n        var isNodeJS = false;\n        // queue for late tasks, used by unhandled rejection tracking\n        var laterQueue = [];\n\n        function flush() {\n            /* jshint loopfunc: true */\n            var task, domain;\n\n            while (head.next) {\n                head = head.next;\n                task = head.task;\n                head.task = void 0;\n                domain = head.domain;\n\n                if (domain) {\n                    head.domain = void 0;\n                    domain.enter();\n                }\n                runSingle(task, domain);\n            }\n            while (laterQueue.length) {\n                task = laterQueue.pop();\n                runSingle(task);\n            }\n            flushing = false;\n        }\n        // runs a single function in the async queue\n        function runSingle(task, domain) {\n            try {\n                task();\n            } catch (e) {\n                if (isNodeJS) {\n                    // In node, uncaught exceptions are considered fatal errors.\n                    // Re-throw them synchronously to interrupt flushing!\n\n                    // Ensure continuation if the uncaught exception is suppressed\n                    // listening \"uncaughtException\" events (as domains does).\n                    // Continue in next event to avoid tick recursion.\n                    if (domain) {\n                        domain.exit();\n                    }\n                    setTimeout(flush, 0);\n                    if (domain) {\n                        domain.enter();\n                    }\n\n                    throw e;\n                } else {\n                    // In browsers, uncaught exceptions are not fatal.\n                    // Re-throw them asynchronously to avoid slow-downs.\n                    setTimeout(function () {\n                        throw e;\n                    }, 0);\n                }\n            }\n\n            if (domain) {\n                domain.exit();\n            }\n        }\n\n        nextTick = function nextTick(task) {\n            tail = tail.next = {\n                task: task,\n                domain: isNodeJS && process.domain,\n                next: null\n            };\n\n            if (!flushing) {\n                flushing = true;\n                requestTick();\n            }\n        };\n\n        if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && process.toString() === \"[object process]\" && process.nextTick) {\n            // Ensure Q is in a real Node environment, with a `process.nextTick`.\n            // To see through fake Node environments:\n            // * Mocha test runner - exposes a `process` global without a `nextTick`\n            // * Browserify - exposes a `process.nexTick` function that uses\n            //   `setTimeout`. In this case `setImmediate` is preferred because\n            //    it is faster. Browserify's `process.toString()` yields\n            //   \"[object Object]\", while in a real Node environment\n            //   `process.nextTick()` yields \"[object process]\".\n            isNodeJS = true;\n\n            requestTick = function requestTick() {\n                process.nextTick(flush);\n            };\n        } else if (typeof setImmediate === \"function\") {\n            // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate\n            if (typeof window !== \"undefined\") {\n                requestTick = setImmediate.bind(window, flush);\n            } else {\n                requestTick = function requestTick() {\n                    setImmediate(flush);\n                };\n            }\n        } else if (typeof MessageChannel !== \"undefined\") {\n            // modern browsers\n            // http://www.nonblocking.io/2011/06/windownexttick.html\n            var channel = new MessageChannel();\n            // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create\n            // working message ports the first time a page loads.\n            channel.port1.onmessage = function () {\n                requestTick = requestPortTick;\n                channel.port1.onmessage = flush;\n                flush();\n            };\n            var requestPortTick = function requestPortTick() {\n                // Opera requires us to provide a message payload, regardless of\n                // whether we use it.\n                channel.port2.postMessage(0);\n            };\n            requestTick = function requestTick() {\n                setTimeout(flush, 0);\n                requestPortTick();\n            };\n        } else {\n            // old browsers\n            requestTick = function requestTick() {\n                setTimeout(flush, 0);\n            };\n        }\n        // runs a task after all other tasks have been run\n        // this is useful for unhandled rejection tracking that needs to happen\n        // after all `then`d tasks have been run.\n        nextTick.runAfter = function (task) {\n            laterQueue.push(task);\n            if (!flushing) {\n                flushing = true;\n                requestTick();\n            }\n        };\n        return nextTick;\n    }();\n\n    // Attempt to make generics safe in the face of downstream\n    // modifications.\n    // There is no situation where this is necessary.\n    // If you need a security guarantee, these primordials need to be\n    // deeply frozen anyway, and if you don’t need a security guarantee,\n    // this is just plain paranoid.\n    // However, this **might** have the nice side-effect of reducing the size of\n    // the minified code by reducing x.call() to merely x()\n    // See Mark Miller’s explanation of what this does.\n    // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming\n    var call = Function.call;\n    function uncurryThis(f) {\n        return function () {\n            return call.apply(f, arguments);\n        };\n    }\n    // This is equivalent, but slower:\n    // uncurryThis = Function_bind.bind(Function_bind.call);\n    // http://jsperf.com/uncurrythis\n\n    var array_slice = uncurryThis(Array.prototype.slice);\n\n    var array_reduce = uncurryThis(Array.prototype.reduce || function (callback, basis) {\n        var index = 0,\n            length = this.length;\n        // concerning the initial value, if one is not provided\n        if (arguments.length === 1) {\n            // seek to the first value in the array, accounting\n            // for the possibility that is is a sparse array\n            do {\n                if (index in this) {\n                    basis = this[index++];\n                    break;\n                }\n                if (++index >= length) {\n                    throw new TypeError();\n                }\n            } while (1);\n        }\n        // reduce\n        for (; index < length; index++) {\n            // account for the possibility that the array is sparse\n            if (index in this) {\n                basis = callback(basis, this[index], index);\n            }\n        }\n        return basis;\n    });\n\n    var array_indexOf = uncurryThis(Array.prototype.indexOf || function (value) {\n        // not a very good shim, but good enough for our one use of it\n        for (var i = 0; i < this.length; i++) {\n            if (this[i] === value) {\n                return i;\n            }\n        }\n        return -1;\n    });\n\n    var array_map = uncurryThis(Array.prototype.map || function (callback, thisp) {\n        var self = this;\n        var collect = [];\n        array_reduce(self, function (undefined, value, index) {\n            collect.push(callback.call(thisp, value, index, self));\n        }, void 0);\n        return collect;\n    });\n\n    var object_create = Object.create || function (prototype) {\n        function Type() {}\n        Type.prototype = prototype;\n        return new Type();\n    };\n\n    var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);\n\n    var object_keys = Object.keys || function (object) {\n        var keys = [];\n        for (var key in object) {\n            if (object_hasOwnProperty(object, key)) {\n                keys.push(key);\n            }\n        }\n        return keys;\n    };\n\n    var object_toString = uncurryThis(Object.prototype.toString);\n\n    function isObject(value) {\n        return value === Object(value);\n    }\n\n    // generator related shims\n\n    // FIXME: Remove this function once ES6 generators are in SpiderMonkey.\n    function isStopIteration(exception) {\n        return object_toString(exception) === \"[object StopIteration]\" || exception instanceof QReturnValue;\n    }\n\n    // FIXME: Remove this helper and Q.return once ES6 generators are in\n    // SpiderMonkey.\n    var QReturnValue;\n    if (typeof ReturnValue !== \"undefined\") {\n        QReturnValue = ReturnValue;\n    } else {\n        QReturnValue = function QReturnValue(value) {\n            this.value = value;\n        };\n    }\n\n    // long stack traces\n\n    var STACK_JUMP_SEPARATOR = \"From previous event:\";\n\n    function makeStackTraceLong(error, promise) {\n        // If possible, transform the error stack trace by removing Node and Q\n        // cruft, then concatenating with the stack trace of `promise`. See #57.\n        if (hasStacks && promise.stack && (typeof error === \"undefined\" ? \"undefined\" : _typeof(error)) === \"object\" && error !== null && error.stack && error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1) {\n            var stacks = [];\n            for (var p = promise; !!p; p = p.source) {\n                if (p.stack) {\n                    stacks.unshift(p.stack);\n                }\n            }\n            stacks.unshift(error.stack);\n\n            var concatedStacks = stacks.join(\"\\n\" + STACK_JUMP_SEPARATOR + \"\\n\");\n            error.stack = filterStackString(concatedStacks);\n        }\n    }\n\n    function filterStackString(stackString) {\n        var lines = stackString.split(\"\\n\");\n        var desiredLines = [];\n        for (var i = 0; i < lines.length; ++i) {\n            var line = lines[i];\n\n            if (!isInternalFrame(line) && !isNodeFrame(line) && line) {\n                desiredLines.push(line);\n            }\n        }\n        return desiredLines.join(\"\\n\");\n    }\n\n    function isNodeFrame(stackLine) {\n        return stackLine.indexOf(\"(module.js:\") !== -1 || stackLine.indexOf(\"(node.js:\") !== -1;\n    }\n\n    function getFileNameAndLineNumber(stackLine) {\n        // Named functions: \"at functionName (filename:lineNumber:columnNumber)\"\n        // In IE10 function name can have spaces (\"Anonymous function\") O_o\n        var attempt1 = /at .+ \\((.+):(\\d+):(?:\\d+)\\)$/.exec(stackLine);\n        if (attempt1) {\n            return [attempt1[1], Number(attempt1[2])];\n        }\n\n        // Anonymous functions: \"at filename:lineNumber:columnNumber\"\n        var attempt2 = /at ([^ ]+):(\\d+):(?:\\d+)$/.exec(stackLine);\n        if (attempt2) {\n            return [attempt2[1], Number(attempt2[2])];\n        }\n\n        // Firefox style: \"function@filename:lineNumber or @filename:lineNumber\"\n        var attempt3 = /.*@(.+):(\\d+)$/.exec(stackLine);\n        if (attempt3) {\n            return [attempt3[1], Number(attempt3[2])];\n        }\n    }\n\n    function isInternalFrame(stackLine) {\n        var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);\n\n        if (!fileNameAndLineNumber) {\n            return false;\n        }\n\n        var fileName = fileNameAndLineNumber[0];\n        var lineNumber = fileNameAndLineNumber[1];\n\n        return fileName === qFileName && lineNumber >= qStartingLine && lineNumber <= qEndingLine;\n    }\n\n    // discover own file name and line number range for filtering stack\n    // traces\n    function captureLine() {\n        if (!hasStacks) {\n            return;\n        }\n\n        try {\n            throw new Error();\n        } catch (e) {\n            var lines = e.stack.split(\"\\n\");\n            var firstLine = lines[0].indexOf(\"@\") > 0 ? lines[1] : lines[2];\n            var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);\n            if (!fileNameAndLineNumber) {\n                return;\n            }\n\n            qFileName = fileNameAndLineNumber[0];\n            return fileNameAndLineNumber[1];\n        }\n    }\n\n    function deprecate(callback, name, alternative) {\n        return function () {\n            if (typeof console !== \"undefined\" && typeof console.warn === \"function\") {\n                console.warn(name + \" is deprecated, use \" + alternative + \" instead.\", new Error(\"\").stack);\n            }\n            return callback.apply(callback, arguments);\n        };\n    }\n\n    // end of shims\n    // beginning of real work\n\n    /**\n     * Constructs a promise for an immediate reference, passes promises through, or\n     * coerces promises from different systems.\n     * @param value immediate reference or promise\n     */\n    function Q(value) {\n        // If the object is already a Promise, return it directly.  This enables\n        // the resolve function to both be used to created references from objects,\n        // but to tolerably coerce non-promises to promises.\n        if (value instanceof Promise) {\n            return value;\n        }\n\n        // assimilate thenables\n        if (isPromiseAlike(value)) {\n            return coerce(value);\n        } else {\n            return fulfill(value);\n        }\n    }\n    Q.resolve = Q;\n\n    /**\n     * Performs a task in a future turn of the event loop.\n     * @param {Function} task\n     */\n    Q.nextTick = nextTick;\n\n    /**\n     * Controls whether or not long stack traces will be on\n     */\n    Q.longStackSupport = false;\n\n    // enable long stacks if Q_DEBUG is set\n    if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && process && process.env && process.env.Q_DEBUG) {\n        Q.longStackSupport = true;\n    }\n\n    /**\n     * Constructs a {promise, resolve, reject} object.\n     *\n     * `resolve` is a callback to invoke with a more resolved value for the\n     * promise. To fulfill the promise, invoke `resolve` with any value that is\n     * not a thenable. To reject the promise, invoke `resolve` with a rejected\n     * thenable, or invoke `reject` with the reason directly. To resolve the\n     * promise to another thenable, thus putting it in the same state, invoke\n     * `resolve` with that other thenable.\n     */\n    Q.defer = defer;\n    function defer() {\n        // if \"messages\" is an \"Array\", that indicates that the promise has not yet\n        // been resolved.  If it is \"undefined\", it has been resolved.  Each\n        // element of the messages array is itself an array of complete arguments to\n        // forward to the resolved promise.  We coerce the resolution value to a\n        // promise using the `resolve` function because it handles both fully\n        // non-thenable values and other thenables gracefully.\n        var messages = [],\n            progressListeners = [],\n            resolvedPromise;\n\n        var deferred = object_create(defer.prototype);\n        var promise = object_create(Promise.prototype);\n\n        promise.promiseDispatch = function (resolve, op, operands) {\n            var args = array_slice(arguments);\n            if (messages) {\n                messages.push(args);\n                if (op === \"when\" && operands[1]) {\n                    // progress operand\n                    progressListeners.push(operands[1]);\n                }\n            } else {\n                Q.nextTick(function () {\n                    resolvedPromise.promiseDispatch.apply(resolvedPromise, args);\n                });\n            }\n        };\n\n        // XXX deprecated\n        promise.valueOf = function () {\n            if (messages) {\n                return promise;\n            }\n            var nearerValue = nearer(resolvedPromise);\n            if (isPromise(nearerValue)) {\n                resolvedPromise = nearerValue; // shorten chain\n            }\n            return nearerValue;\n        };\n\n        promise.inspect = function () {\n            if (!resolvedPromise) {\n                return { state: \"pending\" };\n            }\n            return resolvedPromise.inspect();\n        };\n\n        if (Q.longStackSupport && hasStacks) {\n            try {\n                throw new Error();\n            } catch (e) {\n                // NOTE: don't try to use `Error.captureStackTrace` or transfer the\n                // accessor around; that causes memory leaks as per GH-111. Just\n                // reify the stack trace as a string ASAP.\n                //\n                // At the same time, cut off the first line; it's always just\n                // \"[object Promise]\\n\", as per the `toString`.\n                promise.stack = e.stack.substring(e.stack.indexOf(\"\\n\") + 1);\n            }\n        }\n\n        // NOTE: we do the checks for `resolvedPromise` in each method, instead of\n        // consolidating them into `become`, since otherwise we'd create new\n        // promises with the lines `become(whatever(value))`. See e.g. GH-252.\n\n        function become(newPromise) {\n            resolvedPromise = newPromise;\n            promise.source = newPromise;\n\n            array_reduce(messages, function (undefined, message) {\n                Q.nextTick(function () {\n                    newPromise.promiseDispatch.apply(newPromise, message);\n                });\n            }, void 0);\n\n            messages = void 0;\n            progressListeners = void 0;\n        }\n\n        deferred.promise = promise;\n        deferred.resolve = function (value) {\n            if (resolvedPromise) {\n                return;\n            }\n\n            become(Q(value));\n        };\n\n        deferred.fulfill = function (value) {\n            if (resolvedPromise) {\n                return;\n            }\n\n            become(fulfill(value));\n        };\n        deferred.reject = function (reason) {\n            if (resolvedPromise) {\n                return;\n            }\n\n            become(reject(reason));\n        };\n        deferred.notify = function (progress) {\n            if (resolvedPromise) {\n                return;\n            }\n\n            array_reduce(progressListeners, function (undefined, progressListener) {\n                Q.nextTick(function () {\n                    progressListener(progress);\n                });\n            }, void 0);\n        };\n\n        return deferred;\n    }\n\n    /**\n     * Creates a Node-style callback that will resolve or reject the deferred\n     * promise.\n     * @returns a nodeback\n     */\n    defer.prototype.makeNodeResolver = function () {\n        var self = this;\n        return function (error, value) {\n            if (error) {\n                self.reject(error);\n            } else if (arguments.length > 2) {\n                self.resolve(array_slice(arguments, 1));\n            } else {\n                self.resolve(value);\n            }\n        };\n    };\n\n    /**\n     * @param resolver {Function} a function that returns nothing and accepts\n     * the resolve, reject, and notify functions for a deferred.\n     * @returns a promise that may be resolved with the given resolve and reject\n     * functions, or rejected by a thrown exception in resolver\n     */\n    Q.Promise = promise; // ES6\n    Q.promise = promise;\n    function promise(resolver) {\n        if (typeof resolver !== \"function\") {\n            throw new TypeError(\"resolver must be a function.\");\n        }\n        var deferred = defer();\n        try {\n            resolver(deferred.resolve, deferred.reject, deferred.notify);\n        } catch (reason) {\n            deferred.reject(reason);\n        }\n        return deferred.promise;\n    }\n\n    promise.race = race; // ES6\n    promise.all = all; // ES6\n    promise.reject = reject; // ES6\n    promise.resolve = Q; // ES6\n\n    // XXX experimental.  This method is a way to denote that a local value is\n    // serializable and should be immediately dispatched to a remote upon request,\n    // instead of passing a reference.\n    Q.passByCopy = function (object) {\n        //freeze(object);\n        //passByCopies.set(object, true);\n        return object;\n    };\n\n    Promise.prototype.passByCopy = function () {\n        //freeze(object);\n        //passByCopies.set(object, true);\n        return this;\n    };\n\n    /**\n     * If two promises eventually fulfill to the same value, promises that value,\n     * but otherwise rejects.\n     * @param x {Any*}\n     * @param y {Any*}\n     * @returns {Any*} a promise for x and y if they are the same, but a rejection\n     * otherwise.\n     *\n     */\n    Q.join = function (x, y) {\n        return Q(x).join(y);\n    };\n\n    Promise.prototype.join = function (that) {\n        return Q([this, that]).spread(function (x, y) {\n            if (x === y) {\n                // TODO: \"===\" should be Object.is or equiv\n                return x;\n            } else {\n                throw new Error(\"Can't join: not the same: \" + x + \" \" + y);\n            }\n        });\n    };\n\n    /**\n     * Returns a promise for the first of an array of promises to become settled.\n     * @param answers {Array[Any*]} promises to race\n     * @returns {Any*} the first promise to be settled\n     */\n    Q.race = race;\n    function race(answerPs) {\n        return promise(function (resolve, reject) {\n            // Switch to this once we can assume at least ES5\n            // answerPs.forEach(function (answerP) {\n            //     Q(answerP).then(resolve, reject);\n            // });\n            // Use this in the meantime\n            for (var i = 0, len = answerPs.length; i < len; i++) {\n                Q(answerPs[i]).then(resolve, reject);\n            }\n        });\n    }\n\n    Promise.prototype.race = function () {\n        return this.then(Q.race);\n    };\n\n    /**\n     * Constructs a Promise with a promise descriptor object and optional fallback\n     * function.  The descriptor contains methods like when(rejected), get(name),\n     * set(name, value), post(name, args), and delete(name), which all\n     * return either a value, a promise for a value, or a rejection.  The fallback\n     * accepts the operation name, a resolver, and any further arguments that would\n     * have been forwarded to the appropriate method above had a method been\n     * provided with the proper name.  The API makes no guarantees about the nature\n     * of the returned object, apart from that it is usable whereever promises are\n     * bought and sold.\n     */\n    Q.makePromise = Promise;\n    function Promise(descriptor, fallback, inspect) {\n        if (fallback === void 0) {\n            fallback = function fallback(op) {\n                return reject(new Error(\"Promise does not support operation: \" + op));\n            };\n        }\n        if (inspect === void 0) {\n            inspect = function inspect() {\n                return { state: \"unknown\" };\n            };\n        }\n\n        var promise = object_create(Promise.prototype);\n\n        promise.promiseDispatch = function (resolve, op, args) {\n            var result;\n            try {\n                if (descriptor[op]) {\n                    result = descriptor[op].apply(promise, args);\n                } else {\n                    result = fallback.call(promise, op, args);\n                }\n            } catch (exception) {\n                result = reject(exception);\n            }\n            if (resolve) {\n                resolve(result);\n            }\n        };\n\n        promise.inspect = inspect;\n\n        // XXX deprecated `valueOf` and `exception` support\n        if (inspect) {\n            var inspected = inspect();\n            if (inspected.state === \"rejected\") {\n                promise.exception = inspected.reason;\n            }\n\n            promise.valueOf = function () {\n                var inspected = inspect();\n                if (inspected.state === \"pending\" || inspected.state === \"rejected\") {\n                    return promise;\n                }\n                return inspected.value;\n            };\n        }\n\n        return promise;\n    }\n\n    Promise.prototype.toString = function () {\n        return \"[object Promise]\";\n    };\n\n    Promise.prototype.then = function (fulfilled, rejected, progressed) {\n        var self = this;\n        var deferred = defer();\n        var done = false; // ensure the untrusted promise makes at most a\n        // single call to one of the callbacks\n\n        function _fulfilled(value) {\n            try {\n                return typeof fulfilled === \"function\" ? fulfilled(value) : value;\n            } catch (exception) {\n                return reject(exception);\n            }\n        }\n\n        function _rejected(exception) {\n            if (typeof rejected === \"function\") {\n                makeStackTraceLong(exception, self);\n                try {\n                    return rejected(exception);\n                } catch (newException) {\n                    return reject(newException);\n                }\n            }\n            return reject(exception);\n        }\n\n        function _progressed(value) {\n            return typeof progressed === \"function\" ? progressed(value) : value;\n        }\n\n        Q.nextTick(function () {\n            self.promiseDispatch(function (value) {\n                if (done) {\n                    return;\n                }\n                done = true;\n\n                deferred.resolve(_fulfilled(value));\n            }, \"when\", [function (exception) {\n                if (done) {\n                    return;\n                }\n                done = true;\n\n                deferred.resolve(_rejected(exception));\n            }]);\n        });\n\n        // Progress propagator need to be attached in the current tick.\n        self.promiseDispatch(void 0, \"when\", [void 0, function (value) {\n            var newValue;\n            var threw = false;\n            try {\n                newValue = _progressed(value);\n            } catch (e) {\n                threw = true;\n                if (Q.onerror) {\n                    Q.onerror(e);\n                } else {\n                    throw e;\n                }\n            }\n\n            if (!threw) {\n                deferred.notify(newValue);\n            }\n        }]);\n\n        return deferred.promise;\n    };\n\n    Q.tap = function (promise, callback) {\n        return Q(promise).tap(callback);\n    };\n\n    /**\n     * Works almost like \"finally\", but not called for rejections.\n     * Original resolution value is passed through callback unaffected.\n     * Callback may return a promise that will be awaited for.\n     * @param {Function} callback\n     * @returns {Q.Promise}\n     * @example\n     * doSomething()\n     *   .then(...)\n     *   .tap(console.log)\n     *   .then(...);\n     */\n    Promise.prototype.tap = function (callback) {\n        callback = Q(callback);\n\n        return this.then(function (value) {\n            return callback.fcall(value).thenResolve(value);\n        });\n    };\n\n    /**\n     * Registers an observer on a promise.\n     *\n     * Guarantees:\n     *\n     * 1. that fulfilled and rejected will be called only once.\n     * 2. that either the fulfilled callback or the rejected callback will be\n     *    called, but not both.\n     * 3. that fulfilled and rejected will not be called in this turn.\n     *\n     * @param value      promise or immediate reference to observe\n     * @param fulfilled  function to be called with the fulfilled value\n     * @param rejected   function to be called with the rejection exception\n     * @param progressed function to be called on any progress notifications\n     * @return promise for the return value from the invoked callback\n     */\n    Q.when = when;\n    function when(value, fulfilled, rejected, progressed) {\n        return Q(value).then(fulfilled, rejected, progressed);\n    }\n\n    Promise.prototype.thenResolve = function (value) {\n        return this.then(function () {\n            return value;\n        });\n    };\n\n    Q.thenResolve = function (promise, value) {\n        return Q(promise).thenResolve(value);\n    };\n\n    Promise.prototype.thenReject = function (reason) {\n        return this.then(function () {\n            throw reason;\n        });\n    };\n\n    Q.thenReject = function (promise, reason) {\n        return Q(promise).thenReject(reason);\n    };\n\n    /**\n     * If an object is not a promise, it is as \"near\" as possible.\n     * If a promise is rejected, it is as \"near\" as possible too.\n     * If it’s a fulfilled promise, the fulfillment value is nearer.\n     * If it’s a deferred promise and the deferred has been resolved, the\n     * resolution is \"nearer\".\n     * @param object\n     * @returns most resolved (nearest) form of the object\n     */\n\n    // XXX should we re-do this?\n    Q.nearer = nearer;\n    function nearer(value) {\n        if (isPromise(value)) {\n            var inspected = value.inspect();\n            if (inspected.state === \"fulfilled\") {\n                return inspected.value;\n            }\n        }\n        return value;\n    }\n\n    /**\n     * @returns whether the given object is a promise.\n     * Otherwise it is a fulfilled value.\n     */\n    Q.isPromise = isPromise;\n    function isPromise(object) {\n        return object instanceof Promise;\n    }\n\n    Q.isPromiseAlike = isPromiseAlike;\n    function isPromiseAlike(object) {\n        return isObject(object) && typeof object.then === \"function\";\n    }\n\n    /**\n     * @returns whether the given object is a pending promise, meaning not\n     * fulfilled or rejected.\n     */\n    Q.isPending = isPending;\n    function isPending(object) {\n        return isPromise(object) && object.inspect().state === \"pending\";\n    }\n\n    Promise.prototype.isPending = function () {\n        return this.inspect().state === \"pending\";\n    };\n\n    /**\n     * @returns whether the given object is a value or fulfilled\n     * promise.\n     */\n    Q.isFulfilled = isFulfilled;\n    function isFulfilled(object) {\n        return !isPromise(object) || object.inspect().state === \"fulfilled\";\n    }\n\n    Promise.prototype.isFulfilled = function () {\n        return this.inspect().state === \"fulfilled\";\n    };\n\n    /**\n     * @returns whether the given object is a rejected promise.\n     */\n    Q.isRejected = isRejected;\n    function isRejected(object) {\n        return isPromise(object) && object.inspect().state === \"rejected\";\n    }\n\n    Promise.prototype.isRejected = function () {\n        return this.inspect().state === \"rejected\";\n    };\n\n    //// BEGIN UNHANDLED REJECTION TRACKING\n\n    // This promise library consumes exceptions thrown in handlers so they can be\n    // handled by a subsequent promise.  The exceptions get added to this array when\n    // they are created, and removed when they are handled.  Note that in ES6 or\n    // shimmed environments, this would naturally be a `Set`.\n    var unhandledReasons = [];\n    var unhandledRejections = [];\n    var reportedUnhandledRejections = [];\n    var trackUnhandledRejections = true;\n\n    function resetUnhandledRejections() {\n        unhandledReasons.length = 0;\n        unhandledRejections.length = 0;\n\n        if (!trackUnhandledRejections) {\n            trackUnhandledRejections = true;\n        }\n    }\n\n    function trackRejection(promise, reason) {\n        if (!trackUnhandledRejections) {\n            return;\n        }\n        if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && typeof process.emit === \"function\") {\n            Q.nextTick.runAfter(function () {\n                if (array_indexOf(unhandledRejections, promise) !== -1) {\n                    process.emit(\"unhandledRejection\", reason, promise);\n                    reportedUnhandledRejections.push(promise);\n                }\n            });\n        }\n\n        unhandledRejections.push(promise);\n        if (reason && typeof reason.stack !== \"undefined\") {\n            unhandledReasons.push(reason.stack);\n        } else {\n            unhandledReasons.push(\"(no stack) \" + reason);\n        }\n    }\n\n    function untrackRejection(promise) {\n        if (!trackUnhandledRejections) {\n            return;\n        }\n\n        var at = array_indexOf(unhandledRejections, promise);\n        if (at !== -1) {\n            if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && typeof process.emit === \"function\") {\n                Q.nextTick.runAfter(function () {\n                    var atReport = array_indexOf(reportedUnhandledRejections, promise);\n                    if (atReport !== -1) {\n                        process.emit(\"rejectionHandled\", unhandledReasons[at], promise);\n                        reportedUnhandledRejections.splice(atReport, 1);\n                    }\n                });\n            }\n            unhandledRejections.splice(at, 1);\n            unhandledReasons.splice(at, 1);\n        }\n    }\n\n    Q.resetUnhandledRejections = resetUnhandledRejections;\n\n    Q.getUnhandledReasons = function () {\n        // Make a copy so that consumers can't interfere with our internal state.\n        return unhandledReasons.slice();\n    };\n\n    Q.stopUnhandledRejectionTracking = function () {\n        resetUnhandledRejections();\n        trackUnhandledRejections = false;\n    };\n\n    resetUnhandledRejections();\n\n    //// END UNHANDLED REJECTION TRACKING\n\n    /**\n     * Constructs a rejected promise.\n     * @param reason value describing the failure\n     */\n    Q.reject = reject;\n    function reject(reason) {\n        var rejection = Promise({\n            \"when\": function when(rejected) {\n                // note that the error has been handled\n                if (rejected) {\n                    untrackRejection(this);\n                }\n                return rejected ? rejected(reason) : this;\n            }\n        }, function fallback() {\n            return this;\n        }, function inspect() {\n            return { state: \"rejected\", reason: reason };\n        });\n\n        // Note that the reason has not been handled.\n        trackRejection(rejection, reason);\n\n        return rejection;\n    }\n\n    /**\n     * Constructs a fulfilled promise for an immediate reference.\n     * @param value immediate reference\n     */\n    Q.fulfill = fulfill;\n    function fulfill(value) {\n        return Promise({\n            \"when\": function when() {\n                return value;\n            },\n            \"get\": function get(name) {\n                return value[name];\n            },\n            \"set\": function set(name, rhs) {\n                value[name] = rhs;\n            },\n            \"delete\": function _delete(name) {\n                delete value[name];\n            },\n            \"post\": function post(name, args) {\n                // Mark Miller proposes that post with no name should apply a\n                // promised function.\n                if (name === null || name === void 0) {\n                    return value.apply(void 0, args);\n                } else {\n                    return value[name].apply(value, args);\n                }\n            },\n            \"apply\": function apply(thisp, args) {\n                return value.apply(thisp, args);\n            },\n            \"keys\": function keys() {\n                return object_keys(value);\n            }\n        }, void 0, function inspect() {\n            return { state: \"fulfilled\", value: value };\n        });\n    }\n\n    /**\n     * Converts thenables to Q promises.\n     * @param promise thenable promise\n     * @returns a Q promise\n     */\n    function coerce(promise) {\n        var deferred = defer();\n        Q.nextTick(function () {\n            try {\n                promise.then(deferred.resolve, deferred.reject, deferred.notify);\n            } catch (exception) {\n                deferred.reject(exception);\n            }\n        });\n        return deferred.promise;\n    }\n\n    /**\n     * Annotates an object such that it will never be\n     * transferred away from this process over any promise\n     * communication channel.\n     * @param object\n     * @returns promise a wrapping of that object that\n     * additionally responds to the \"isDef\" message\n     * without a rejection.\n     */\n    Q.master = master;\n    function master(object) {\n        return Promise({\n            \"isDef\": function isDef() {}\n        }, function fallback(op, args) {\n            return dispatch(object, op, args);\n        }, function () {\n            return Q(object).inspect();\n        });\n    }\n\n    /**\n     * Spreads the values of a promised array of arguments into the\n     * fulfillment callback.\n     * @param fulfilled callback that receives variadic arguments from the\n     * promised array\n     * @param rejected callback that receives the exception if the promise\n     * is rejected.\n     * @returns a promise for the return value or thrown exception of\n     * either callback.\n     */\n    Q.spread = spread;\n    function spread(value, fulfilled, rejected) {\n        return Q(value).spread(fulfilled, rejected);\n    }\n\n    Promise.prototype.spread = function (fulfilled, rejected) {\n        return this.all().then(function (array) {\n            return fulfilled.apply(void 0, array);\n        }, rejected);\n    };\n\n    /**\n     * The async function is a decorator for generator functions, turning\n     * them into asynchronous generators.  Although generators are only part\n     * of the newest ECMAScript 6 drafts, this code does not cause syntax\n     * errors in older engines.  This code should continue to work and will\n     * in fact improve over time as the language improves.\n     *\n     * ES6 generators are currently part of V8 version 3.19 with the\n     * --harmony-generators runtime flag enabled.  SpiderMonkey has had them\n     * for longer, but under an older Python-inspired form.  This function\n     * works on both kinds of generators.\n     *\n     * Decorates a generator function such that:\n     *  - it may yield promises\n     *  - execution will continue when that promise is fulfilled\n     *  - the value of the yield expression will be the fulfilled value\n     *  - it returns a promise for the return value (when the generator\n     *    stops iterating)\n     *  - the decorated function returns a promise for the return value\n     *    of the generator or the first rejected promise among those\n     *    yielded.\n     *  - if an error is thrown in the generator, it propagates through\n     *    every following yield until it is caught, or until it escapes\n     *    the generator function altogether, and is translated into a\n     *    rejection for the promise returned by the decorated generator.\n     */\n    Q.async = async;\n    function async(makeGenerator) {\n        return function () {\n            // when verb is \"send\", arg is a value\n            // when verb is \"throw\", arg is an exception\n            function continuer(verb, arg) {\n                var result;\n\n                // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only\n                // engine that has a deployed base of browsers that support generators.\n                // However, SM's generators use the Python-inspired semantics of\n                // outdated ES6 drafts.  We would like to support ES6, but we'd also\n                // like to make it possible to use generators in deployed browsers, so\n                // we also support Python-style generators.  At some point we can remove\n                // this block.\n\n                if (typeof StopIteration === \"undefined\") {\n                    // ES6 Generators\n                    try {\n                        result = generator[verb](arg);\n                    } catch (exception) {\n                        return reject(exception);\n                    }\n                    if (result.done) {\n                        return Q(result.value);\n                    } else {\n                        return when(result.value, callback, errback);\n                    }\n                } else {\n                    // SpiderMonkey Generators\n                    // FIXME: Remove this case when SM does ES6 generators.\n                    try {\n                        result = generator[verb](arg);\n                    } catch (exception) {\n                        if (isStopIteration(exception)) {\n                            return Q(exception.value);\n                        } else {\n                            return reject(exception);\n                        }\n                    }\n                    return when(result, callback, errback);\n                }\n            }\n            var generator = makeGenerator.apply(this, arguments);\n            var callback = continuer.bind(continuer, \"next\");\n            var errback = continuer.bind(continuer, \"throw\");\n            return callback();\n        };\n    }\n\n    /**\n     * The spawn function is a small wrapper around async that immediately\n     * calls the generator and also ends the promise chain, so that any\n     * unhandled errors are thrown instead of forwarded to the error\n     * handler. This is useful because it's extremely common to run\n     * generators at the top-level to work with libraries.\n     */\n    Q.spawn = spawn;\n    function spawn(makeGenerator) {\n        Q.done(Q.async(makeGenerator)());\n    }\n\n    // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.\n    /**\n     * Throws a ReturnValue exception to stop an asynchronous generator.\n     *\n     * This interface is a stop-gap measure to support generator return\n     * values in older Firefox/SpiderMonkey.  In browsers that support ES6\n     * generators like Chromium 29, just use \"return\" in your generator\n     * functions.\n     *\n     * @param value the return value for the surrounding generator\n     * @throws ReturnValue exception with the value.\n     * @example\n     * // ES6 style\n     * Q.async(function* () {\n     *      var foo = yield getFooPromise();\n     *      var bar = yield getBarPromise();\n     *      return foo + bar;\n     * })\n     * // Older SpiderMonkey style\n     * Q.async(function () {\n     *      var foo = yield getFooPromise();\n     *      var bar = yield getBarPromise();\n     *      Q.return(foo + bar);\n     * })\n     */\n    Q[\"return\"] = _return;\n    function _return(value) {\n        throw new QReturnValue(value);\n    }\n\n    /**\n     * The promised function decorator ensures that any promise arguments\n     * are settled and passed as values (`this` is also settled and passed\n     * as a value).  It will also ensure that the result of a function is\n     * always a promise.\n     *\n     * @example\n     * var add = Q.promised(function (a, b) {\n     *     return a + b;\n     * });\n     * add(Q(a), Q(B));\n     *\n     * @param {function} callback The function to decorate\n     * @returns {function} a function that has been decorated.\n     */\n    Q.promised = promised;\n    function promised(callback) {\n        return function () {\n            return spread([this, all(arguments)], function (self, args) {\n                return callback.apply(self, args);\n            });\n        };\n    }\n\n    /**\n     * sends a message to a value in a future turn\n     * @param object* the recipient\n     * @param op the name of the message operation, e.g., \"when\",\n     * @param args further arguments to be forwarded to the operation\n     * @returns result {Promise} a promise for the result of the operation\n     */\n    Q.dispatch = dispatch;\n    function dispatch(object, op, args) {\n        return Q(object).dispatch(op, args);\n    }\n\n    Promise.prototype.dispatch = function (op, args) {\n        var self = this;\n        var deferred = defer();\n        Q.nextTick(function () {\n            self.promiseDispatch(deferred.resolve, op, args);\n        });\n        return deferred.promise;\n    };\n\n    /**\n     * Gets the value of a property in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @param name      name of property to get\n     * @return promise for the property value\n     */\n    Q.get = function (object, key) {\n        return Q(object).dispatch(\"get\", [key]);\n    };\n\n    Promise.prototype.get = function (key) {\n        return this.dispatch(\"get\", [key]);\n    };\n\n    /**\n     * Sets the value of a property in a future turn.\n     * @param object    promise or immediate reference for object object\n     * @param name      name of property to set\n     * @param value     new value of property\n     * @return promise for the return value\n     */\n    Q.set = function (object, key, value) {\n        return Q(object).dispatch(\"set\", [key, value]);\n    };\n\n    Promise.prototype.set = function (key, value) {\n        return this.dispatch(\"set\", [key, value]);\n    };\n\n    /**\n     * Deletes a property in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @param name      name of property to delete\n     * @return promise for the return value\n     */\n    Q.del = // XXX legacy\n    Q[\"delete\"] = function (object, key) {\n        return Q(object).dispatch(\"delete\", [key]);\n    };\n\n    Promise.prototype.del = // XXX legacy\n    Promise.prototype[\"delete\"] = function (key) {\n        return this.dispatch(\"delete\", [key]);\n    };\n\n    /**\n     * Invokes a method in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @param name      name of method to invoke\n     * @param value     a value to post, typically an array of\n     *                  invocation arguments for promises that\n     *                  are ultimately backed with `resolve` values,\n     *                  as opposed to those backed with URLs\n     *                  wherein the posted value can be any\n     *                  JSON serializable object.\n     * @return promise for the return value\n     */\n    // bound locally because it is used by other methods\n    Q.mapply = // XXX As proposed by \"Redsandro\"\n    Q.post = function (object, name, args) {\n        return Q(object).dispatch(\"post\", [name, args]);\n    };\n\n    Promise.prototype.mapply = // XXX As proposed by \"Redsandro\"\n    Promise.prototype.post = function (name, args) {\n        return this.dispatch(\"post\", [name, args]);\n    };\n\n    /**\n     * Invokes a method in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @param name      name of method to invoke\n     * @param ...args   array of invocation arguments\n     * @return promise for the return value\n     */\n    Q.send = // XXX Mark Miller's proposed parlance\n    Q.mcall = // XXX As proposed by \"Redsandro\"\n    Q.invoke = function (object, name /*...args*/) {\n        return Q(object).dispatch(\"post\", [name, array_slice(arguments, 2)]);\n    };\n\n    Promise.prototype.send = // XXX Mark Miller's proposed parlance\n    Promise.prototype.mcall = // XXX As proposed by \"Redsandro\"\n    Promise.prototype.invoke = function (name /*...args*/) {\n        return this.dispatch(\"post\", [name, array_slice(arguments, 1)]);\n    };\n\n    /**\n     * Applies the promised function in a future turn.\n     * @param object    promise or immediate reference for target function\n     * @param args      array of application arguments\n     */\n    Q.fapply = function (object, args) {\n        return Q(object).dispatch(\"apply\", [void 0, args]);\n    };\n\n    Promise.prototype.fapply = function (args) {\n        return this.dispatch(\"apply\", [void 0, args]);\n    };\n\n    /**\n     * Calls the promised function in a future turn.\n     * @param object    promise or immediate reference for target function\n     * @param ...args   array of application arguments\n     */\n    Q[\"try\"] = Q.fcall = function (object /* ...args*/) {\n        return Q(object).dispatch(\"apply\", [void 0, array_slice(arguments, 1)]);\n    };\n\n    Promise.prototype.fcall = function () /*...args*/{\n        return this.dispatch(\"apply\", [void 0, array_slice(arguments)]);\n    };\n\n    /**\n     * Binds the promised function, transforming return values into a fulfilled\n     * promise and thrown errors into a rejected one.\n     * @param object    promise or immediate reference for target function\n     * @param ...args   array of application arguments\n     */\n    Q.fbind = function (object /*...args*/) {\n        var promise = Q(object);\n        var args = array_slice(arguments, 1);\n        return function fbound() {\n            return promise.dispatch(\"apply\", [this, args.concat(array_slice(arguments))]);\n        };\n    };\n    Promise.prototype.fbind = function () /*...args*/{\n        var promise = this;\n        var args = array_slice(arguments);\n        return function fbound() {\n            return promise.dispatch(\"apply\", [this, args.concat(array_slice(arguments))]);\n        };\n    };\n\n    /**\n     * Requests the names of the owned properties of a promised\n     * object in a future turn.\n     * @param object    promise or immediate reference for target object\n     * @return promise for the keys of the eventually settled object\n     */\n    Q.keys = function (object) {\n        return Q(object).dispatch(\"keys\", []);\n    };\n\n    Promise.prototype.keys = function () {\n        return this.dispatch(\"keys\", []);\n    };\n\n    /**\n     * Turns an array of promises into a promise for an array.  If any of\n     * the promises gets rejected, the whole array is rejected immediately.\n     * @param {Array*} an array (or promise for an array) of values (or\n     * promises for values)\n     * @returns a promise for an array of the corresponding values\n     */\n    // By Mark Miller\n    // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled\n    Q.all = all;\n    function all(promises) {\n        return when(promises, function (promises) {\n            var pendingCount = 0;\n            var deferred = defer();\n            array_reduce(promises, function (undefined, promise, index) {\n                var snapshot;\n                if (isPromise(promise) && (snapshot = promise.inspect()).state === \"fulfilled\") {\n                    promises[index] = snapshot.value;\n                } else {\n                    ++pendingCount;\n                    when(promise, function (value) {\n                        promises[index] = value;\n                        if (--pendingCount === 0) {\n                            deferred.resolve(promises);\n                        }\n                    }, deferred.reject, function (progress) {\n                        deferred.notify({ index: index, value: progress });\n                    });\n                }\n            }, void 0);\n            if (pendingCount === 0) {\n                deferred.resolve(promises);\n            }\n            return deferred.promise;\n        });\n    }\n\n    Promise.prototype.all = function () {\n        return all(this);\n    };\n\n    /**\n     * Returns the first resolved promise of an array. Prior rejected promises are\n     * ignored.  Rejects only if all promises are rejected.\n     * @param {Array*} an array containing values or promises for values\n     * @returns a promise fulfilled with the value of the first resolved promise,\n     * or a rejected promise if all promises are rejected.\n     */\n    Q.any = any;\n\n    function any(promises) {\n        if (promises.length === 0) {\n            return Q.resolve();\n        }\n\n        var deferred = Q.defer();\n        var pendingCount = 0;\n        array_reduce(promises, function (prev, current, index) {\n            var promise = promises[index];\n\n            pendingCount++;\n\n            when(promise, onFulfilled, onRejected, onProgress);\n            function onFulfilled(result) {\n                deferred.resolve(result);\n            }\n            function onRejected() {\n                pendingCount--;\n                if (pendingCount === 0) {\n                    deferred.reject(new Error(\"Can't get fulfillment value from any promise, all \" + \"promises were rejected.\"));\n                }\n            }\n            function onProgress(progress) {\n                deferred.notify({\n                    index: index,\n                    value: progress\n                });\n            }\n        }, undefined);\n\n        return deferred.promise;\n    }\n\n    Promise.prototype.any = function () {\n        return any(this);\n    };\n\n    /**\n     * Waits for all promises to be settled, either fulfilled or\n     * rejected.  This is distinct from `all` since that would stop\n     * waiting at the first rejection.  The promise returned by\n     * `allResolved` will never be rejected.\n     * @param promises a promise for an array (or an array) of promises\n     * (or values)\n     * @return a promise for an array of promises\n     */\n    Q.allResolved = deprecate(allResolved, \"allResolved\", \"allSettled\");\n    function allResolved(promises) {\n        return when(promises, function (promises) {\n            promises = array_map(promises, Q);\n            return when(all(array_map(promises, function (promise) {\n                return when(promise, noop, noop);\n            })), function () {\n                return promises;\n            });\n        });\n    }\n\n    Promise.prototype.allResolved = function () {\n        return allResolved(this);\n    };\n\n    /**\n     * @see Promise#allSettled\n     */\n    Q.allSettled = allSettled;\n    function allSettled(promises) {\n        return Q(promises).allSettled();\n    }\n\n    /**\n     * Turns an array of promises into a promise for an array of their states (as\n     * returned by `inspect`) when they have all settled.\n     * @param {Array[Any*]} values an array (or promise for an array) of values (or\n     * promises for values)\n     * @returns {Array[State]} an array of states for the respective values.\n     */\n    Promise.prototype.allSettled = function () {\n        return this.then(function (promises) {\n            return all(array_map(promises, function (promise) {\n                promise = Q(promise);\n                function regardless() {\n                    return promise.inspect();\n                }\n                return promise.then(regardless, regardless);\n            }));\n        });\n    };\n\n    /**\n     * Captures the failure of a promise, giving an oportunity to recover\n     * with a callback.  If the given promise is fulfilled, the returned\n     * promise is fulfilled.\n     * @param {Any*} promise for something\n     * @param {Function} callback to fulfill the returned promise if the\n     * given promise is rejected\n     * @returns a promise for the return value of the callback\n     */\n    Q.fail = // XXX legacy\n    Q[\"catch\"] = function (object, rejected) {\n        return Q(object).then(void 0, rejected);\n    };\n\n    Promise.prototype.fail = // XXX legacy\n    Promise.prototype[\"catch\"] = function (rejected) {\n        return this.then(void 0, rejected);\n    };\n\n    /**\n     * Attaches a listener that can respond to progress notifications from a\n     * promise's originating deferred. This listener receives the exact arguments\n     * passed to ``deferred.notify``.\n     * @param {Any*} promise for something\n     * @param {Function} callback to receive any progress notifications\n     * @returns the given promise, unchanged\n     */\n    Q.progress = progress;\n    function progress(object, progressed) {\n        return Q(object).then(void 0, void 0, progressed);\n    }\n\n    Promise.prototype.progress = function (progressed) {\n        return this.then(void 0, void 0, progressed);\n    };\n\n    /**\n     * Provides an opportunity to observe the settling of a promise,\n     * regardless of whether the promise is fulfilled or rejected.  Forwards\n     * the resolution to the returned promise when the callback is done.\n     * The callback can return a promise to defer completion.\n     * @param {Any*} promise\n     * @param {Function} callback to observe the resolution of the given\n     * promise, takes no arguments.\n     * @returns a promise for the resolution of the given promise when\n     * ``fin`` is done.\n     */\n    Q.fin = // XXX legacy\n    Q[\"finally\"] = function (object, callback) {\n        return Q(object)[\"finally\"](callback);\n    };\n\n    Promise.prototype.fin = // XXX legacy\n    Promise.prototype[\"finally\"] = function (callback) {\n        callback = Q(callback);\n        return this.then(function (value) {\n            return callback.fcall().then(function () {\n                return value;\n            });\n        }, function (reason) {\n            // TODO attempt to recycle the rejection with \"this\".\n            return callback.fcall().then(function () {\n                throw reason;\n            });\n        });\n    };\n\n    /**\n     * Terminates a chain of promises, forcing rejections to be\n     * thrown as exceptions.\n     * @param {Any*} promise at the end of a chain of promises\n     * @returns nothing\n     */\n    Q.done = function (object, fulfilled, rejected, progress) {\n        return Q(object).done(fulfilled, rejected, progress);\n    };\n\n    Promise.prototype.done = function (fulfilled, rejected, progress) {\n        var onUnhandledError = function onUnhandledError(error) {\n            // forward to a future turn so that ``when``\n            // does not catch it and turn it into a rejection.\n            Q.nextTick(function () {\n                makeStackTraceLong(error, promise);\n                if (Q.onerror) {\n                    Q.onerror(error);\n                } else {\n                    throw error;\n                }\n            });\n        };\n\n        // Avoid unnecessary `nextTick`ing via an unnecessary `when`.\n        var promise = fulfilled || rejected || progress ? this.then(fulfilled, rejected, progress) : this;\n\n        if ((typeof process === \"undefined\" ? \"undefined\" : _typeof(process)) === \"object\" && process && process.domain) {\n            onUnhandledError = process.domain.bind(onUnhandledError);\n        }\n\n        promise.then(void 0, onUnhandledError);\n    };\n\n    /**\n     * Causes a promise to be rejected if it does not get fulfilled before\n     * some milliseconds time out.\n     * @param {Any*} promise\n     * @param {Number} milliseconds timeout\n     * @param {Any*} custom error message or Error object (optional)\n     * @returns a promise for the resolution of the given promise if it is\n     * fulfilled before the timeout, otherwise rejected.\n     */\n    Q.timeout = function (object, ms, error) {\n        return Q(object).timeout(ms, error);\n    };\n\n    Promise.prototype.timeout = function (ms, error) {\n        var deferred = defer();\n        var timeoutId = setTimeout(function () {\n            if (!error || \"string\" === typeof error) {\n                error = new Error(error || \"Timed out after \" + ms + \" ms\");\n                error.code = \"ETIMEDOUT\";\n            }\n            deferred.reject(error);\n        }, ms);\n\n        this.then(function (value) {\n            clearTimeout(timeoutId);\n            deferred.resolve(value);\n        }, function (exception) {\n            clearTimeout(timeoutId);\n            deferred.reject(exception);\n        }, deferred.notify);\n\n        return deferred.promise;\n    };\n\n    /**\n     * Returns a promise for the given value (or promised value), some\n     * milliseconds after it resolved. Passes rejections immediately.\n     * @param {Any*} promise\n     * @param {Number} milliseconds\n     * @returns a promise for the resolution of the given promise after milliseconds\n     * time has elapsed since the resolution of the given promise.\n     * If the given promise rejects, that is passed immediately.\n     */\n    Q.delay = function (object, timeout) {\n        if (timeout === void 0) {\n            timeout = object;\n            object = void 0;\n        }\n        return Q(object).delay(timeout);\n    };\n\n    Promise.prototype.delay = function (timeout) {\n        return this.then(function (value) {\n            var deferred = defer();\n            setTimeout(function () {\n                deferred.resolve(value);\n            }, timeout);\n            return deferred.promise;\n        });\n    };\n\n    /**\n     * Passes a continuation to a Node function, which is called with the given\n     * arguments provided as an array, and returns a promise.\n     *\n     *      Q.nfapply(FS.readFile, [__filename])\n     *      .then(function (content) {\n     *      })\n     *\n     */\n    Q.nfapply = function (callback, args) {\n        return Q(callback).nfapply(args);\n    };\n\n    Promise.prototype.nfapply = function (args) {\n        var deferred = defer();\n        var nodeArgs = array_slice(args);\n        nodeArgs.push(deferred.makeNodeResolver());\n        this.fapply(nodeArgs).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    /**\n     * Passes a continuation to a Node function, which is called with the given\n     * arguments provided individually, and returns a promise.\n     * @example\n     * Q.nfcall(FS.readFile, __filename)\n     * .then(function (content) {\n     * })\n     *\n     */\n    Q.nfcall = function (callback /*...args*/) {\n        var args = array_slice(arguments, 1);\n        return Q(callback).nfapply(args);\n    };\n\n    Promise.prototype.nfcall = function () /*...args*/{\n        var nodeArgs = array_slice(arguments);\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        this.fapply(nodeArgs).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    /**\n     * Wraps a NodeJS continuation passing function and returns an equivalent\n     * version that returns a promise.\n     * @example\n     * Q.nfbind(FS.readFile, __filename)(\"utf-8\")\n     * .then(console.log)\n     * .done()\n     */\n    Q.nfbind = Q.denodeify = function (callback /*...args*/) {\n        var baseArgs = array_slice(arguments, 1);\n        return function () {\n            var nodeArgs = baseArgs.concat(array_slice(arguments));\n            var deferred = defer();\n            nodeArgs.push(deferred.makeNodeResolver());\n            Q(callback).fapply(nodeArgs).fail(deferred.reject);\n            return deferred.promise;\n        };\n    };\n\n    Promise.prototype.nfbind = Promise.prototype.denodeify = function () /*...args*/{\n        var args = array_slice(arguments);\n        args.unshift(this);\n        return Q.denodeify.apply(void 0, args);\n    };\n\n    Q.nbind = function (callback, thisp /*...args*/) {\n        var baseArgs = array_slice(arguments, 2);\n        return function () {\n            var nodeArgs = baseArgs.concat(array_slice(arguments));\n            var deferred = defer();\n            nodeArgs.push(deferred.makeNodeResolver());\n            function bound() {\n                return callback.apply(thisp, arguments);\n            }\n            Q(bound).fapply(nodeArgs).fail(deferred.reject);\n            return deferred.promise;\n        };\n    };\n\n    Promise.prototype.nbind = function () /*thisp, ...args*/{\n        var args = array_slice(arguments, 0);\n        args.unshift(this);\n        return Q.nbind.apply(void 0, args);\n    };\n\n    /**\n     * Calls a method of a Node-style object that accepts a Node-style\n     * callback with a given array of arguments, plus a provided callback.\n     * @param object an object that has the named method\n     * @param {String} name name of the method of object\n     * @param {Array} args arguments to pass to the method; the callback\n     * will be provided by Q and appended to these arguments.\n     * @returns a promise for the value or error\n     */\n    Q.nmapply = // XXX As proposed by \"Redsandro\"\n    Q.npost = function (object, name, args) {\n        return Q(object).npost(name, args);\n    };\n\n    Promise.prototype.nmapply = // XXX As proposed by \"Redsandro\"\n    Promise.prototype.npost = function (name, args) {\n        var nodeArgs = array_slice(args || []);\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        this.dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    /**\n     * Calls a method of a Node-style object that accepts a Node-style\n     * callback, forwarding the given variadic arguments, plus a provided\n     * callback argument.\n     * @param object an object that has the named method\n     * @param {String} name name of the method of object\n     * @param ...args arguments to pass to the method; the callback will\n     * be provided by Q and appended to these arguments.\n     * @returns a promise for the value or error\n     */\n    Q.nsend = // XXX Based on Mark Miller's proposed \"send\"\n    Q.nmcall = // XXX Based on \"Redsandro's\" proposal\n    Q.ninvoke = function (object, name /*...args*/) {\n        var nodeArgs = array_slice(arguments, 2);\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        Q(object).dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    Promise.prototype.nsend = // XXX Based on Mark Miller's proposed \"send\"\n    Promise.prototype.nmcall = // XXX Based on \"Redsandro's\" proposal\n    Promise.prototype.ninvoke = function (name /*...args*/) {\n        var nodeArgs = array_slice(arguments, 1);\n        var deferred = defer();\n        nodeArgs.push(deferred.makeNodeResolver());\n        this.dispatch(\"post\", [name, nodeArgs]).fail(deferred.reject);\n        return deferred.promise;\n    };\n\n    /**\n     * If a function would like to support both Node continuation-passing-style and\n     * promise-returning-style, it can end its internal promise chain with\n     * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user\n     * elects to use a nodeback, the result will be sent there.  If they do not\n     * pass a nodeback, they will receive the result promise.\n     * @param object a result (or a promise for a result)\n     * @param {Function} nodeback a Node.js-style callback\n     * @returns either the promise or nothing\n     */\n    Q.nodeify = nodeify;\n    function nodeify(object, nodeback) {\n        return Q(object).nodeify(nodeback);\n    }\n\n    Promise.prototype.nodeify = function (nodeback) {\n        if (nodeback) {\n            this.then(function (value) {\n                Q.nextTick(function () {\n                    nodeback(null, value);\n                });\n            }, function (error) {\n                Q.nextTick(function () {\n                    nodeback(error);\n                });\n            });\n        } else {\n            return this;\n        }\n    };\n\n    Q.noConflict = function () {\n        throw new Error(\"Q.noConflict only works when Q is used as a global\");\n    };\n\n    // All code before this point will be filtered from stack traces.\n    var qEndingLine = captureLine();\n\n    return Q;\n});\n\n}).call(this,require('_process'))\n},{\"_process\":238}],240:[function(require,module,exports){\n'use strict';\n\n/*\nRainbowVis-JS \nReleased under Eclipse Public License - v 1.0\n*/\n\nfunction Rainbow() {\n\t\"use strict\";\n\n\tvar gradients = null;\n\tvar minNum = 0;\n\tvar maxNum = 100;\n\tvar colours = ['ff0000', 'ffff00', '00ff00', '0000ff'];\n\tsetColours(colours);\n\n\tfunction setColours(spectrum) {\n\t\tif (spectrum.length < 2) {\n\t\t\tthrow new Error('Rainbow must have two or more colours.');\n\t\t} else {\n\t\t\tvar increment = (maxNum - minNum) / (spectrum.length - 1);\n\t\t\tvar firstGradient = new ColourGradient();\n\t\t\tfirstGradient.setGradient(spectrum[0], spectrum[1]);\n\t\t\tfirstGradient.setNumberRange(minNum, minNum + increment);\n\t\t\tgradients = [firstGradient];\n\n\t\t\tfor (var i = 1; i < spectrum.length - 1; i++) {\n\t\t\t\tvar colourGradient = new ColourGradient();\n\t\t\t\tcolourGradient.setGradient(spectrum[i], spectrum[i + 1]);\n\t\t\t\tcolourGradient.setNumberRange(minNum + increment * i, minNum + increment * (i + 1));\n\t\t\t\tgradients[i] = colourGradient;\n\t\t\t}\n\n\t\t\tcolours = spectrum;\n\t\t}\n\t}\n\n\tthis.setSpectrum = function () {\n\t\tsetColours(arguments);\n\t\treturn this;\n\t};\n\n\tthis.setSpectrumByArray = function (array) {\n\t\tsetColours(array);\n\t\treturn this;\n\t};\n\n\tthis.colourAt = function (number) {\n\t\tif (isNaN(number)) {\n\t\t\tthrow new TypeError(number + ' is not a number');\n\t\t} else if (gradients.length === 1) {\n\t\t\treturn gradients[0].colourAt(number);\n\t\t} else {\n\t\t\tvar segment = (maxNum - minNum) / gradients.length;\n\t\t\tvar index = Math.min(Math.floor((Math.max(number, minNum) - minNum) / segment), gradients.length - 1);\n\t\t\treturn gradients[index].colourAt(number);\n\t\t}\n\t};\n\n\tthis.colorAt = this.colourAt;\n\n\tthis.setNumberRange = function (minNumber, maxNumber) {\n\t\tif (maxNumber > minNumber) {\n\t\t\tminNum = minNumber;\n\t\t\tmaxNum = maxNumber;\n\t\t\tsetColours(colours);\n\t\t} else {\n\t\t\tthrow new RangeError('maxNumber (' + maxNumber + ') is not greater than minNumber (' + minNumber + ')');\n\t\t}\n\t\treturn this;\n\t};\n}\n\nfunction ColourGradient() {\n\t\"use strict\";\n\n\tvar startColour = 'ff0000';\n\tvar endColour = '0000ff';\n\tvar minNum = 0;\n\tvar maxNum = 100;\n\n\tthis.setGradient = function (colourStart, colourEnd) {\n\t\tstartColour = getHexColour(colourStart);\n\t\tendColour = getHexColour(colourEnd);\n\t};\n\n\tthis.setNumberRange = function (minNumber, maxNumber) {\n\t\tif (maxNumber > minNumber) {\n\t\t\tminNum = minNumber;\n\t\t\tmaxNum = maxNumber;\n\t\t} else {\n\t\t\tthrow new RangeError('maxNumber (' + maxNumber + ') is not greater than minNumber (' + minNumber + ')');\n\t\t}\n\t};\n\n\tthis.colourAt = function (number) {\n\t\treturn calcHex(number, startColour.substring(0, 2), endColour.substring(0, 2)) + calcHex(number, startColour.substring(2, 4), endColour.substring(2, 4)) + calcHex(number, startColour.substring(4, 6), endColour.substring(4, 6));\n\t};\n\n\tfunction calcHex(number, channelStart_Base16, channelEnd_Base16) {\n\t\tvar num = number;\n\t\tif (num < minNum) {\n\t\t\tnum = minNum;\n\t\t}\n\t\tif (num > maxNum) {\n\t\t\tnum = maxNum;\n\t\t}\n\t\tvar numRange = maxNum - minNum;\n\t\tvar cStart_Base10 = parseInt(channelStart_Base16, 16);\n\t\tvar cEnd_Base10 = parseInt(channelEnd_Base16, 16);\n\t\tvar cPerUnit = (cEnd_Base10 - cStart_Base10) / numRange;\n\t\tvar c_Base10 = Math.round(cPerUnit * (num - minNum) + cStart_Base10);\n\t\treturn formatHex(c_Base10.toString(16));\n\t}\n\n\tfunction formatHex(hex) {\n\t\tif (hex.length === 1) {\n\t\t\treturn '0' + hex;\n\t\t} else {\n\t\t\treturn hex;\n\t\t}\n\t}\n\n\tfunction isHexColour(string) {\n\t\tvar regex = /^#?[0-9a-fA-F]{6}$/i;\n\t\treturn regex.test(string);\n\t}\n\n\tfunction getHexColour(string) {\n\t\tif (isHexColour(string)) {\n\t\t\treturn string.substring(string.length - 6, string.length);\n\t\t} else {\n\t\t\tvar name = string.toLowerCase();\n\t\t\tif (colourNames.hasOwnProperty(name)) {\n\t\t\t\treturn colourNames[name];\n\t\t\t}\n\t\t\tthrow new Error(string + ' is not a valid colour.');\n\t\t}\n\t}\n\n\t// Extended list of CSS colornames s taken from\n\t// http://www.w3.org/TR/css3-color/#svg-color\n\tvar colourNames = {\n\t\taliceblue: \"F0F8FF\",\n\t\tantiquewhite: \"FAEBD7\",\n\t\taqua: \"00FFFF\",\n\t\taquamarine: \"7FFFD4\",\n\t\tazure: \"F0FFFF\",\n\t\tbeige: \"F5F5DC\",\n\t\tbisque: \"FFE4C4\",\n\t\tblack: \"000000\",\n\t\tblanchedalmond: \"FFEBCD\",\n\t\tblue: \"0000FF\",\n\t\tblueviolet: \"8A2BE2\",\n\t\tbrown: \"A52A2A\",\n\t\tburlywood: \"DEB887\",\n\t\tcadetblue: \"5F9EA0\",\n\t\tchartreuse: \"7FFF00\",\n\t\tchocolate: \"D2691E\",\n\t\tcoral: \"FF7F50\",\n\t\tcornflowerblue: \"6495ED\",\n\t\tcornsilk: \"FFF8DC\",\n\t\tcrimson: \"DC143C\",\n\t\tcyan: \"00FFFF\",\n\t\tdarkblue: \"00008B\",\n\t\tdarkcyan: \"008B8B\",\n\t\tdarkgoldenrod: \"B8860B\",\n\t\tdarkgray: \"A9A9A9\",\n\t\tdarkgreen: \"006400\",\n\t\tdarkgrey: \"A9A9A9\",\n\t\tdarkkhaki: \"BDB76B\",\n\t\tdarkmagenta: \"8B008B\",\n\t\tdarkolivegreen: \"556B2F\",\n\t\tdarkorange: \"FF8C00\",\n\t\tdarkorchid: \"9932CC\",\n\t\tdarkred: \"8B0000\",\n\t\tdarksalmon: \"E9967A\",\n\t\tdarkseagreen: \"8FBC8F\",\n\t\tdarkslateblue: \"483D8B\",\n\t\tdarkslategray: \"2F4F4F\",\n\t\tdarkslategrey: \"2F4F4F\",\n\t\tdarkturquoise: \"00CED1\",\n\t\tdarkviolet: \"9400D3\",\n\t\tdeeppink: \"FF1493\",\n\t\tdeepskyblue: \"00BFFF\",\n\t\tdimgray: \"696969\",\n\t\tdimgrey: \"696969\",\n\t\tdodgerblue: \"1E90FF\",\n\t\tfirebrick: \"B22222\",\n\t\tfloralwhite: \"FFFAF0\",\n\t\tforestgreen: \"228B22\",\n\t\tfuchsia: \"FF00FF\",\n\t\tgainsboro: \"DCDCDC\",\n\t\tghostwhite: \"F8F8FF\",\n\t\tgold: \"FFD700\",\n\t\tgoldenrod: \"DAA520\",\n\t\tgray: \"808080\",\n\t\tgreen: \"008000\",\n\t\tgreenyellow: \"ADFF2F\",\n\t\tgrey: \"808080\",\n\t\thoneydew: \"F0FFF0\",\n\t\thotpink: \"FF69B4\",\n\t\tindianred: \"CD5C5C\",\n\t\tindigo: \"4B0082\",\n\t\tivory: \"FFFFF0\",\n\t\tkhaki: \"F0E68C\",\n\t\tlavender: \"E6E6FA\",\n\t\tlavenderblush: \"FFF0F5\",\n\t\tlawngreen: \"7CFC00\",\n\t\tlemonchiffon: \"FFFACD\",\n\t\tlightblue: \"ADD8E6\",\n\t\tlightcoral: \"F08080\",\n\t\tlightcyan: \"E0FFFF\",\n\t\tlightgoldenrodyellow: \"FAFAD2\",\n\t\tlightgray: \"D3D3D3\",\n\t\tlightgreen: \"90EE90\",\n\t\tlightgrey: \"D3D3D3\",\n\t\tlightpink: \"FFB6C1\",\n\t\tlightsalmon: \"FFA07A\",\n\t\tlightseagreen: \"20B2AA\",\n\t\tlightskyblue: \"87CEFA\",\n\t\tlightslategray: \"778899\",\n\t\tlightslategrey: \"778899\",\n\t\tlightsteelblue: \"B0C4DE\",\n\t\tlightyellow: \"FFFFE0\",\n\t\tlime: \"00FF00\",\n\t\tlimegreen: \"32CD32\",\n\t\tlinen: \"FAF0E6\",\n\t\tmagenta: \"FF00FF\",\n\t\tmaroon: \"800000\",\n\t\tmediumaquamarine: \"66CDAA\",\n\t\tmediumblue: \"0000CD\",\n\t\tmediumorchid: \"BA55D3\",\n\t\tmediumpurple: \"9370DB\",\n\t\tmediumseagreen: \"3CB371\",\n\t\tmediumslateblue: \"7B68EE\",\n\t\tmediumspringgreen: \"00FA9A\",\n\t\tmediumturquoise: \"48D1CC\",\n\t\tmediumvioletred: \"C71585\",\n\t\tmidnightblue: \"191970\",\n\t\tmintcream: \"F5FFFA\",\n\t\tmistyrose: \"FFE4E1\",\n\t\tmoccasin: \"FFE4B5\",\n\t\tnavajowhite: \"FFDEAD\",\n\t\tnavy: \"000080\",\n\t\toldlace: \"FDF5E6\",\n\t\tolive: \"808000\",\n\t\tolivedrab: \"6B8E23\",\n\t\torange: \"FFA500\",\n\t\torangered: \"FF4500\",\n\t\torchid: \"DA70D6\",\n\t\tpalegoldenrod: \"EEE8AA\",\n\t\tpalegreen: \"98FB98\",\n\t\tpaleturquoise: \"AFEEEE\",\n\t\tpalevioletred: \"DB7093\",\n\t\tpapayawhip: \"FFEFD5\",\n\t\tpeachpuff: \"FFDAB9\",\n\t\tperu: \"CD853F\",\n\t\tpink: \"FFC0CB\",\n\t\tplum: \"DDA0DD\",\n\t\tpowderblue: \"B0E0E6\",\n\t\tpurple: \"800080\",\n\t\tred: \"FF0000\",\n\t\trosybrown: \"BC8F8F\",\n\t\troyalblue: \"4169E1\",\n\t\tsaddlebrown: \"8B4513\",\n\t\tsalmon: \"FA8072\",\n\t\tsandybrown: \"F4A460\",\n\t\tseagreen: \"2E8B57\",\n\t\tseashell: \"FFF5EE\",\n\t\tsienna: \"A0522D\",\n\t\tsilver: \"C0C0C0\",\n\t\tskyblue: \"87CEEB\",\n\t\tslateblue: \"6A5ACD\",\n\t\tslategray: \"708090\",\n\t\tslategrey: \"708090\",\n\t\tsnow: \"FFFAFA\",\n\t\tspringgreen: \"00FF7F\",\n\t\tsteelblue: \"4682B4\",\n\t\ttan: \"D2B48C\",\n\t\tteal: \"008080\",\n\t\tthistle: \"D8BFD8\",\n\t\ttomato: \"FF6347\",\n\t\tturquoise: \"40E0D0\",\n\t\tviolet: \"EE82EE\",\n\t\twheat: \"F5DEB3\",\n\t\twhite: \"FFFFFF\",\n\t\twhitesmoke: \"F5F5F5\",\n\t\tyellow: \"FFFF00\",\n\t\tyellowgreen: \"9ACD32\"\n\t};\n}\n\nif (typeof module !== 'undefined') {\n\tmodule.exports = Rainbow;\n}\n\n},{}],241:[function(require,module,exports){\n\"use strict\";\n\n/**\n * Check if the DOM element `child` is within the given `parent` DOM element.\n *\n * @param {DOMElement|Range} child - the DOM element or Range to check if it's within `parent`\n * @param {DOMElement} parent  - the parent node that `child` could be inside of\n * @return {Boolean} True if `child` is within `parent`. False otherwise.\n * @public\n */\n\nmodule.exports = function within(child, parent) {\n  // don't throw if `child` is null\n  if (!child) return false;\n\n  // Range support\n  if (child.commonAncestorContainer) child = child.commonAncestorContainer;else if (child.endContainer) child = child.endContainer;\n\n  // traverse up the `parentNode` properties until `parent` is found\n  var node = child;\n  while (node = node.parentNode) {\n    if (node == parent) return true;\n  }\n\n  return false;\n};\n\n},{}],242:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AAdjacentWithSameResourceShouldBeCombined = {\n  run: function run(test) {\n\n    function findAdjacent(element) {\n      // Find all the links\n      var links = DOM.scry('a', element);\n      // Sort them into singletons and coupletons.\n      var $singletons = [];\n      var $coupletons = [];\n\n      links.forEach(function (link) {\n        var next = DOM.next(link);\n        if (next && DOM.is(next, 'a')) {\n          $coupletons.push(link);\n        } else {\n          $singletons.push(link);\n        }\n      });\n\n      $singletons.forEach(excludeSingleLinks);\n      $coupletons.forEach(checkNextLink);\n    }\n\n    function checkNextLink(element) {\n      var thisHref = element.getAttribute('href');\n      var next = DOM.next(element);\n      var status = 'passed';\n      var _case = Case({\n        element: element\n      });\n      if (next) {\n        var nextHref = next.getAttribute('href');\n        if (thisHref === nextHref) {\n          status = 'failed';\n        }\n      }\n\n      test.add(_case);\n      _case.set({\n        status: status\n      });\n    }\n\n    function excludeSingleLinks(element) {\n      var _case = Case({\n        element: element\n      });\n      test.add(_case);\n      _case.set({\n        status: 'inapplicable'\n      });\n    }\n\n    test.get('scope').forEach(findAdjacent);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Adjacent links that point to the same location should be merged',\n      nl: 'Voeg naast elkaar gelegen links die naar dezelfde locatie verwijzen samen'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing two links right next to each other that point to the same location can be confusing. Try combining the links.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Voor hen zijn naast elkaar gelegen links die naar dezelfde locatie verwijzen verwarrend. Probeer de links samen te voegen.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: ['H2', 'F89']\n        },\n        '2.4.9': {\n          techniques: ['F89']\n        },\n        '4.1.2': {\n          techniques: ['F89']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AAdjacentWithSameResourceShouldBeCombined;\n\n},{\"Case\":33,\"DOM\":34}],243:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AImgAltNotRepetitive = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a img[alt]', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n\n        var alt = CleanStringComponent(DOM.getAttribute(element, 'alt'));\n        var link = DOM.parents(element);\n        link.unshift(element);\n        link = link.find(function (el) {\n          return DOM.is(el, 'a');\n        });\n        var linkText = CleanStringComponent(DOM.text(link));\n\n        if (alt.length > 0 && linkText.indexOf(alt) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'When an image is in a link, its \\\"alt\\\" attribute should not repeat other text in the link',\n      nl: 'Als een link een afbeelding bevat, moet het \\\"alt\\\"-attribuut niet dezelfde tekst bevatten als de linktekst'\n    },\n    description: {\n      en: 'Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice.',\n      nl: 'Als een link een afbeelding bevat, moet deze afbeelding een andere tekst in het alt-attribuut hebben dan de tekst in de link. Hiermee voorkom je dat een schermlezer dezelfde tekst twee keer voorleest.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H30']\n        },\n        '2.4.4': {\n          techniques: ['H30']\n        },\n        '2.4.9': {\n          techniques: ['H30']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AImgAltNotRepetitive;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34}],244:[function(require,module,exports){\n'use strict';\n\nvar _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i[\"return\"]) _i[\"return\"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError(\"Invalid attempt to destructure non-iterable instance\"); } }; }();\n\nvar BorderDetailsComponent = require('BorderDetailsComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AInPHasADistinctStyle = {\n  run: function run(test) {\n\n    /**\n     * Checks if an element has a border set\n     * @param element\n     * @returns {boolean}\n     */\n    function hasBorder(element) {\n      var borders = BorderDetailsComponent(element);\n      var width = 0;\n      var _iteratorNormalCompletion = true;\n      var _didIteratorError = false;\n      var _iteratorError = undefined;\n\n      try {\n        for (var _iterator = borders[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {\n          var border = _step.value;\n\n          var _border = _slicedToArray(border, 2);\n\n          var details = _border[1];\n\n          width += details.width;\n        }\n      } catch (err) {\n        _didIteratorError = true;\n        _iteratorError = err;\n      } finally {\n        try {\n          if (!_iteratorNormalCompletion && _iterator.return) {\n            _iterator.return();\n          }\n        } finally {\n          if (_didIteratorError) {\n            throw _iteratorError;\n          }\n        }\n      }\n\n      return width > 0;\n    }\n\n    /**\n     * Test if two elements have a distinct style from it's ancestor\n     * @param  {jQuery node} $elm\n     * @param  {jQuery node} $parent\n     * @return {boolean}\n     */\n    function elmHasDistinctStyle($elm, $parent) {\n      var result = false;\n      var styleProperties = ['font-weight', 'font-style'];\n      var textDecoration = DOM.getComputedStyle($elm, 'text-decoration');\n\n      if (textDecoration !== 'none' && textDecoration !== DOM.getComputedStyle($parent, 'text-decoration')) {\n        result = true;\n      }\n\n      if (DOM.getComputedStyle($elm, 'background-color') !== 'rgba(0, 0, 0, 0)') {\n        styleProperties.push('background');\n      }\n\n      styleProperties.forEach(function (styleProp) {\n        if (!result && DOM.getComputedStyle($elm, styleProp) !== DOM.getComputedStyle($parent, styleProp)) {\n          result = true;\n        }\n      });\n\n      return result || hasBorder($elm);\n    }\n\n    function elmHasDistinctPosition($elm) {\n      var isBlock = DOM.getComputedStyle($elm, 'display') === 'block';\n      var position = DOM.getComputedStyle($elm, 'position');\n      var isPositioned = position !== 'relative' && position !== 'static';\n      return isBlock || isPositioned;\n    }\n\n    // Ignore links where the p only contains white space, <, >, |, \\, / and - chars\n    var allowedPText = /^([\\s|-]|>|<|\\\\|\\/|&(gt|lt);)*$/i;\n\n    test.get('scope').forEach(function (scope) {\n      var anchors = DOM.scry('p a[href]', scope);\n\n      anchors.forEach(function (element) {\n        var $p = DOM.parents(element).find(function (parent) {\n          return DOM.is(parent, 'p');\n        });\n        var $parent = element.parentNode;\n\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var aText = DOM.text(element).trim();\n\n        // Get all text of the p element with all anchors removed\n        var pClone = $p.cloneNode(true);\n        DOM.scry('a[href]', pClone).forEach(function (link) {\n          link.parentNode.removeChild(link);\n        });\n        var pText = DOM.text(pClone).trim();\n\n        if (aText === '' || pText.match(allowedPText)) {\n          _case.set('status', 'inapplicable');\n        } else if (DOM.getComputedStyle(element, 'color') === DOM.getComputedStyle($p, 'color')) {\n          _case.set('status', 'passed');\n        } else if (elmHasDistinctStyle(element, $p)) {\n          _case.set('status', 'passed');\n        } else if (elmHasDistinctPosition(element)) {\n          _case.set('status', 'passed');\n        } else if (DOM.scry('img', element).length > 0) {\n          _case.set('status', 'passed');\n        } else if (DOM.text($parent).trim() === aText && elmHasDistinctStyle($parent, $p)) {\n          _case.set('status', 'passed');\n        } else {\n          _case.set('status', 'failed');\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should be have a distinct style inside a p tag',\n      nl: 'Links moeten een afwijkende stijl hebben binnen een paragraaf'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AInPHasADistinctStyle;\n\n},{\"BorderDetailsComponent\":2,\"Case\":33,\"DOM\":34}],245:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar ALinkTextDoesNotBeginWithRedundantWord = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var self = element;\n        var $link = element;\n        var text = '';\n        var $img = DOM.scry('img[alt]', $link)[0];\n        if ($img) {\n          text = text + DOM.getAttribute($img, 'alt');\n        }\n        text = text + DOM.text($link);\n        text = text.toLowerCase();\n        var _case;\n        // Search the text for redundant words. Break as soon as one is detected.\n        for (var i = 0, il = RedundantStringsComponent.link.length; i < il; ++i) {\n          var phrase = RedundantStringsComponent.link[i];\n          if (text.search(phrase) > -1) {\n            _case = test.add(Case({\n              element: self,\n              status: 'failed'\n            }));\n            break;\n          }\n        }\n        // If the case didn't fail, then it passed.\n        if (!_case) {\n          test.add(Case({\n            element: self,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Link text should not begin with redundant text',\n      nl: 'Laat linkteksten niet beginnen met overbodige tekst'\n    },\n    description: {\n      en: 'Link text should not begin with redundant words or phrases like \\\"link\\\".',\n      nl: 'Laat linkteksten niet beginnen met overbodige woorden of woordcombinaties als \\\"link\\\" of \\\"klik hier\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.9': {\n          techniques: ['F84']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinkTextDoesNotBeginWithRedundantWord;\n\n},{\"Case\":33,\"DOM\":34,\"RedundantStringsComponent\":19}],246:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ALinkWithNonText = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var links = DOM.scry('a', scope);\n      var inapplicableLinks = [];\n      var applicableLinks = [];\n      links.forEach(function (link) {\n        var contents;\n        if (DOM.hasAttribute(link, 'href')) {\n          contents = DOM.scry('img, object, embed', link);\n          if (contents.length) {\n            applicableLinks.push(link);\n          } else {\n            inapplicableLinks.push(link);\n          }\n        } else {\n          inapplicableLinks.push(link);\n        }\n      });\n\n      inapplicableLinks.forEach(function (element) {\n        var _case = Case({\n          element: element,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n      });\n\n      applicableLinks.forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!IsUnreadable(DOM.text(element))) {\n          _case.set({\n            status: 'passed'\n          });\n          return;\n        }\n        var unreadable = 0;\n        DOM.scry('img, object, embed', element).forEach(function (element) {\n          if (DOM.is(element, 'img') && IsUnreadable(DOM.getAttribute(element, 'alt')) || !DOM.is(element, 'img') && IsUnreadable(DOM.getAttribute(element, 'title'))) {\n            unreadable++;\n          }\n        });\n        if (DOM.scry('img, object, embed', element).length === unreadable) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    title: {\n      en: 'Links with only non-text content should be readable',\n      nl: 'Links zonder tekstuele content moeten leesbaar zijn'\n    },\n    description: {\n      en: 'If a link contains only non-text content like an image, that content must be readable by assistive technology.',\n      nl: 'Als een link alleen maar niet-tekstuele content bevat zoals een afbeelding, moet deze content leesbaar worden gemaakt door middel van daarvoor geschikte technologie.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: ['H2', 'F89']\n        },\n        '2.4.9': {\n          techniques: ['F89']\n        },\n        '4.1.2': {\n          techniques: ['F89']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinkWithNonText;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],247:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ALinksAreSeparatedByPrintableCharacters = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        // Only test if there's another a tag.\n        var next = DOM.next(element);\n        if (next && DOM.is(next, 'a')) {\n          if (IsUnreadable(element.nextSibling.wholeText)) {\n            _case.set({\n              status: 'failed'\n            });\n          } else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Lists of links should be seperated by printable characters',\n      nl: 'Lijsten met links moeten gescheiden worden door afdrukbare tekens'\n    },\n    description: {\n      en: 'If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this.',\n      nl: 'Als een rij met links binnen eenzelfde element staat, moeten de links gescheiden zijn door een niet-gelinkt, afdrukbaar teken. Dit geldt niet voor een gestructureerde lijst.'\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinksAreSeparatedByPrintableCharacters;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],248:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar NewWindowStringsComponent = require('NewWindowStringsComponent');\nvar ALinksDontOpenNewWindow = {\n  run: function run(test) {\n    // Links without a target attribute pass.\n    test.get('scope').forEach(function (scope) {\n      var links = DOM.scry('a', scope);\n      var passLinks = [];\n      var checkLinks = [];\n      links.forEach(function (link) {\n        var target = DOM.getAttribute(link, 'target');\n        if (['_new', '_blank'].indexOf(target) > -1) {\n          checkLinks.push(link);\n        } else {\n          passLinks.push(link);\n        }\n      });\n      passLinks.forEach(function (element) {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      });\n      // Links with a target attribute pass if the link text indicates that the\n      // link will open a new window.\n      checkLinks.forEach(function (element) {\n        var $link = element;\n        var passes = false;\n        var i = 0;\n        var text = DOM.text($link) + ' ' + DOM.getAttribute($link, 'title');\n        var phrase = '';\n        // Test the link text against strings the indicate the link will open\n        // in a new window.\n        do {\n          phrase = NewWindowStringsComponent[i];\n          if (text.search(phrase) > -1) {\n            passes = true;\n          }\n          ++i;\n        } while (!passes && i < NewWindowStringsComponent.length);\n        // Build a Case.\n        if (passes) {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not open a new window without warning',\n      nl: 'Met links open je geen nieuw scherm zonder melding'\n    },\n    description: {\n      en: 'Links which open a new window using the \\\"target\\\" attribute should warn users.',\n      nl: 'Voordat links door middel van het \\\"target\\\"-attribuut een nieuw scherm openen moet de gebruiker een melding hiervan krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.5': {\n          techniques: ['H83', 'SCR24']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinksDontOpenNewWindow;\n\n},{\"Case\":33,\"DOM\":34,\"NewWindowStringsComponent\":16}],249:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SymbolsStringsComponent = require('SymbolsStringsComponent');\nvar ALinksNotSeparatedBySymbols = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var $link = element;\n        var next = DOM.next($link);\n        if (next && DOM.is(next, 'a')) {\n          var text = $link.nextSibling.wholeText;\n          // The string between the links is composed of symbols.\n          if (typeof text === 'string' && SymbolsStringsComponent.indexOf(text.toLowerCase().trim()) !== -1) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n          // The string between the links is composed of words.\n          else {\n              test.add(Case({\n                element: element,\n                status: 'passed'\n              }));\n            }\n        }\n        // If nothing follows the link, then there is nothing to test.\n        else {\n            test.add(Case({\n              element: element,\n              status: 'inapplicable'\n            }));\n          }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not be separated by symbols alone',\n      nl: 'Links mogen niet alleen door symbolen gescheidn worden'\n    },\n    description: {\n      en: 'Since symbols are either not read, or can be confusing when using a screen reader, do not separate links with un-readable symbols.',\n      nl: 'Symbolen worden niet voorgelezen of zijn verwarrend bij het gebruik van een schermlezer. Gebruik geen onleesbare symbolen om links van elkaar te scheiden.'\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ALinksNotSeparatedBySymbols;\n\n},{\"Case\":33,\"DOM\":34,\"SymbolsStringsComponent\":25}],250:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ALinksToMultiMediaRequireTranscript = {\n  run: function run(test) {\n    var selector = ['a[href$=\".wmv\"]', 'a[href$=\".mpg\"]', 'a[href$=\".mov\"]', 'a[href$=\".ram\"]', 'a[href$=\".aif\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any links to a multimedia file should also include a link to a transcript',\n      nl: 'Elke link naar een multimediabestand moet ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'Links to a multimedia file should be followed by a link to a transcript of the file.',\n      nl: 'Links naar een multimediabestand moeten worden gevolgd door een link naar de transcriptie van dit bestand.'\n    },\n    guidelines: {\n      508: ['c'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74']\n        }\n      }\n    },\n    tags: ['link', 'media', 'content']\n  }\n};\nmodule.exports = ALinksToMultiMediaRequireTranscript;\n\n},{\"Case\":33,\"DOM\":34}],251:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ALinksToSoundFilesNeedTranscripts = {\n  run: function run(test) {\n\n    var selector = ['a[href$=\".wav\"]', 'a[href$=\".snd\"]', 'a[href$=\".mp3\"]', 'a[href$=\".iff\"]', 'a[href$=\".svx\"]', 'a[href$=\".sam\"]', 'a[href$=\".smp\"]', 'a[href$=\".vce\"]', 'a[href$=\".vox\"]', 'a[href$=\".pcm\"]', 'a[href$=\".aif\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any links to a sound file should also include a link to a transcript',\n      nl: 'Elke link naar een geluidsbestand moet ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'Links to a sound file should be followed by a link to a transcript of the file.',\n      nl: 'Links naar een geluidsbestand moeten worden gevolgd door een link naar de transcriptie van dit bestand.'\n    },\n    guidelines: {\n      508: ['c'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74']\n        }\n      }\n    },\n    tags: ['link', 'media', 'content']\n  }\n};\nmodule.exports = ALinksToSoundFilesNeedTranscripts;\n\n},{\"Case\":33,\"DOM\":34}],252:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AMultimediaTextAlternative = {\n  run: function run(test) {\n\n    var selector = ['a[href$=\".aif\"]', 'a[href$=\".iff\"]', 'a[href$=\".mov\"]', 'a[href$=\".mp3\"]', 'a[href$=\".mpg\"]', 'a[href$=\".ram\"]', 'a[href$=\".sam\"]', 'a[href$=\".smp\"]', 'a[href$=\".snd\"]', 'a[href$=\".svx\"]', 'a[href$=\".pcm\"]', 'a[href$=\".vce\"]', 'a[href$=\".vox\"]', 'a[href$=\".wav\"]', 'a[href$=\".wmv\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: [],\n    tags: ['link', 'media', 'content']\n  }\n};\nmodule.exports = AMultimediaTextAlternative;\n\n},{\"Case\":33,\"DOM\":34}],253:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AMustContainText = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        if (!DOM.getAttribute(element, 'href') || DOM.getComputedStyle(element, 'display') === 'none') {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n\n        if (/\\S/.test(element.innerHTML)) {\n          _case.set({\n            status: 'passed'\n          });\n        } else {\n          _case.set({\n            status: 'failed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should contain text',\n      nl: 'Links moeten tekst bevatten'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty \\\"alt\\\" attributes and no other readable text) hinders these users.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Links zonder tekst (of met afbeeldingen die een leeg \\\"alt\\\"-attribuut hebben en geen andere leesbare tekst) hinderen deze gebruikers.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H30']\n        },\n        '2.4.4': {\n          techniques: ['H30']\n        },\n        '2.4.9': {\n          techniques: ['H30']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AMustContainText;\n\n},{\"Case\":33,\"DOM\":34}],254:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AMustHaveTitle = {\n  run: function run(test) {\n    test.get('scope').forEach(function (element) {\n      var links = DOM.scry('a', element);\n\n      links.forEach(function (link) {\n        // Has a title attribute and that attribute has a value, then pass.\n        var title = link.getAttribute('title');\n        if (typeof title === 'string' && title.length > 0) {\n          test.add(Case({\n            element: link,\n            status: 'passed'\n          }));\n        }\n        // Does not have a title attribute or the attribute does not have a value.\n        else if (!title || !title.length) {\n            test.add(Case({\n              element: link,\n              status: 'failed'\n            }));\n          }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All links must have a \\\"title\\\" attribute',\n      nl: 'Alle links moeten een \\\"title\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Every link must have a \\\"title\\\" attribute.',\n      nl: 'Zorg ervoor dat elke link is voorzien van een \\\"title\\\"-attribuut.'\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AMustHaveTitle;\n\n},{\"Case\":33,\"DOM\":34}],255:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AMustNotHaveJavascriptHref = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'a[href^=\"javascript:\"]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not use \\\"javascript\\\" in their location',\n      nl: 'Links moeten geen \\\"javascript\\\" in hun locatie hebben'\n    },\n    description: {\n      en: 'Anchor (<code>a</code>.  elements may not use the \\\"javascript\\\" protocol in their \\\"href\\\" attributes.',\n      nl: 'Anchor(<code>a</code>.-elementen mogen geen \\\"javascript\\\"protocol in hun \\\"href\\\"-attributen hebben staan.'\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = AMustNotHaveJavascriptHref;\n\n},{\"Case\":33,\"DOM\":34}],256:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SuspiciousLinksStringsComponent = require('SuspiciousLinksStringsComponent');\nvar ASuspiciousLinkText = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!DOM.getAttribute(element, 'href')) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        var text = DOM.text(element);\n        DOM.scry('img[alt]', element).forEach(function (element) {\n          text = text + DOM.getAttribute(element, 'alt');\n        });\n        if (SuspiciousLinksStringsComponent.indexOf(CleanStringComponent(text)) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Link text should be useful',\n      nl: 'Linkteksten moeten bruikbaar en betekenisvol zijn'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing links with text that simply read \\\"click here\\\" gives no hint of the function of the link.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Links met de tekst \\\"klik hier\\\" zijn voor deze gebruikers niet betekenisvol en niet bruikbaar.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H30']\n        },\n        '2.4.4': {\n          techniques: ['H30']\n        },\n        '2.4.9': {\n          techniques: ['H30']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ASuspiciousLinkText;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34,\"SuspiciousLinksStringsComponent\":24}],257:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ATitleDescribesDestination = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'a[title]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The title attribute of all source a (anchor) elements describes the link destination.',\n      nl: 'Het titel-attribuut van alle source a (anchor)-elementen beschrijven de bestemming van de link'\n    },\n    description: {\n      en: 'Every link must have a \\\"title\\\" attribute which describes the purpose or destination of the link.',\n      nl: 'Elke link moet een \\\"title\\\"-attribuut hebben waarin het doel of de bestemming van de link wordt beschreven.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.9': {\n          techniques: ['H33', 'H25']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ATitleDescribesDestination;\n\n},{\"Case\":33,\"DOM\":34}],258:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AnimatedGifMayBePresent = {\n  run: function run(test) {\n\n    /**\n     * Test if gif is animated\n     * Implemented from: https://gist.github.com/3012623.git\n     * @param src\n     * @param ext\n     * @param cb\n     */\n    function isAnimatedGif(src, ext, cb) {\n\n      if (ext !== 'gif') {\n        cb(false);\n        return;\n      }\n\n      var request = new XMLHttpRequest();\n      request.open('GET', src, true);\n      request.responseType = 'arraybuffer';\n      request.addEventListener('load', function () {\n        var arr = new Uint8Array(request.response);\n        var frames = 0;\n\n        // make sure it's a gif (GIF8)\n        if (arr[0] !== 0x47 || arr[1] !== 0x49 || arr[2] !== 0x46 || arr[3] !== 0x38) {\n          cb(false);\n          return;\n        }\n\n        // ported from php http://www.php.net/manual/en/function.imagecreatefromgif.php#104473\n        // an animated gif contains multiple \"frames\", with each frame having a\n        // header made up of:\n        // * a static 4-byte sequence (\\x00\\x21\\xF9\\x04)\n        // * 4 variable bytes\n        // * a static 2-byte sequence (\\x00\\x2C) (some variants may use \\x00\\x21 ?)\n        // We read through the file til we reach the end of the file, or we've found\n        // at least 2 frame headers\n        for (var i = 0; i < arr.length - 9; i++) {\n          if (arr[i] === 0x00 && arr[i + 1] === 0x21 && arr[i + 2] === 0xF9 && arr[i + 3] === 0x04 && arr[i + 8] === 0x00 && (arr[i + 9] === 0x2C || arr[i + 9] === 0x21)) {\n            frames++;\n          }\n          if (frames > 1) {\n            cb(true);\n            return;\n          }\n        }\n\n        cb(false);\n      });\n      request.send();\n    }\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img', scope).forEach(function (element) {\n\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var imgSrc = DOM.getAttribute(element, 'src');\n        var ext = DOM.getAttribute(element, 'src').split('.').pop().toLowerCase();\n\n        if (ext !== 'gif') {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n\n        isAnimatedGif(imgSrc, ext, function (animated) {\n          if (animated) {\n            _case.set({\n              status: 'cantTell'\n            });\n            return;\n          } else {\n            _case.set({\n              status: 'inapplicable'\n            });\n            return;\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Test if a .gif is used on the page. Test if the .gif contains more then one frame',\n      nl: 'Test of een .gif afbeelding gebruikt is op de pagina. Test of het .gif bestand uit meer dan één frame bestaat'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'gif']\n  }\n};\nmodule.exports = AnimatedGifMayBePresent;\n\n},{\"Case\":33,\"DOM\":34}],259:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar AppletContainsTextEquivalent = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('applet', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (IsUnreadable(DOM.text(element))) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All applets should contain the same content within the body of the applet',\n      nl: 'Alle applets moeten dezelfde content bevatten in de body van de applet'\n    },\n    description: {\n      en: 'Applets should contain their text equivalents or description within the <code>applet</code> tag itself.',\n      nl: 'Applets moeten hun tekstuele equivalent of beschrijving bevatten in de <code>applet</code> tag.'\n    },\n    guidelines: {\n      508: ['m'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74', 'H35']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletContainsTextEquivalent;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],260:[function(require,module,exports){\n'use strict';\n\nvar PlaceholderComponent = require('PlaceholderComponent');\nvar AppletContainsTextEquivalentInAlt = {\n  run: function run(test) {\n    PlaceholderComponent(test, {\n      selector: 'applet',\n      attribute: 'alt',\n      empty: true\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All applets should contain a text equivalent in the \\\"alt\\\" attribute',\n      nl: 'Alle applets moeten een tekstuele equivalent bevatten in het \\\"alt\\\"-attribuut'\n    },\n    description: {\n      en: 'Applets should contain their text equivalents or description in an \\\"alt\\\" attribute.',\n      nl: 'Applets moeten hun tekstuele equivalent of beschrijving bevatten in een \\\"alt\\\"-attribuut.'\n    },\n    guidelines: {\n      508: ['m'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74', 'H35']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletContainsTextEquivalentInAlt;\n\n},{\"PlaceholderComponent\":17}],261:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletProvidesMechanismToReturnToParent = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All applets should provide a way for keyboard users to escape',\n      nl: 'Alle applets moeten door toetsenbordgebruikers kunnen worden verlaten'\n    },\n    description: {\n      en: 'Ensure that a user who has only a keyboard as an input device can escape an <code>applet</code> element. This requires manual confirmation.',\n      nl: 'Zorg ervoor dat gebruikers die alleen het toetsenbord gebruiken als bediening een <code>applet</code>-element kunnen verlaten. Hiervoor is handmatige bevestiging nodig.'\n    },\n    guidelines: [],\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletProvidesMechanismToReturnToParent;\n\n},{\"Case\":33,\"DOM\":34}],262:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletTextEquivalentsGetUpdated = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: {\n      508: ['m'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74', 'H35']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletTextEquivalentsGetUpdated;\n\n},{\"Case\":33,\"DOM\":34}],263:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletUIMustBeAccessible = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any user interface in an applet must be accessible',\n      nl: 'Elke user interface in een applet moet toegankelijk zijn'\n    },\n    description: {\n      en: 'Applet content should be assessed for accessibility.',\n      nl: 'Content in een applet moet getoetst worden op toegankelijkheid.'\n    },\n    guidelines: {\n      508: ['m'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74', 'H35']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletUIMustBeAccessible;\n\n},{\"Case\":33,\"DOM\":34}],264:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletsDoNotFlicker = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All applets do not flicker',\n      nl: 'Applets knipperen of flitsen niet'\n    },\n    description: {\n      en: 'Applets should not flicker.',\n      nl: 'Geen enkele applet mag knipperen of flitsen.'\n    },\n    guidelines: {\n      508: ['j'],\n      wcag: {\n        '2.2.2': {\n          techniques: ['F7']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletsDoNotFlicker;\n\n},{\"Case\":33,\"DOM\":34}],265:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AppletsDonotUseColorAlone = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Applets should not use color alone to communicate content',\n      nl: 'Applets mogen niet alleen kleur gebruiken om een boodschap over te brengen'\n    },\n    description: {\n      en: 'Applets should contain content that makes sense without color and is accessible to users who are color blind.',\n      nl: 'Applets moeten content bevatten die ook bruikbaar is zonder kleur en die toegankelijk is voor gebruikers met kleurenblindheid.'\n    },\n    guidelines: {\n      508: ['c']\n    },\n    tags: ['objects', 'applet', 'content']\n  }\n};\nmodule.exports = AppletsDonotUseColorAlone;\n\n},{\"Case\":33,\"DOM\":34}],266:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AreaAltIdentifiesDestination = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope).filter(function (element) {\n        var alt = DOM.getAttribute(element, 'alt');\n        return !(alt && alt.length > 0);\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All \\\"area\\\" elements must have an \\\"alt\\\" attribute which describes the link destination',\n      nl: 'Alle \\\"area\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben die de bestemming van de link beschrijft'\n    },\n    description: {\n      en: 'All <code>area</code> elements within a <code>map</code> must have an \\\"alt\\\" attribute',\n      nl: 'Alle <code>area</code>-elementen binnen een <code>map</code> moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74']\n        }\n      }\n    },\n    tags: ['objects', 'applet', 'content'],\n    options: {\n      test: 'area[alt]'\n    }\n  }\n};\nmodule.exports = AreaAltIdentifiesDestination;\n\n},{\"Case\":33,\"DOM\":34}],267:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AreaAltRefersToText = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Alt text for \\\"area\\\" elements should replicate the text found in the image',\n      nl: 'Alt-tekst voor \\\"area\\\"-elementen moeten de tekst bevatten zoals die ook in de afbeelding staat'\n    },\n    description: {\n      en: 'If an image is being used as a map, and an <code>area</code> encompasses text within the image, then the \\\"alt\\\" attribute of that <code>area</code> element should be the same as the text found in the image.',\n      nl: 'Als een afbeelding als kaart wordt gebruikt, en een <code>area</code> bevat tekst binnen de afbeelding, dan moet het \\\"alt\\\"-attribuut van dat <code>area</code>-element hetzelfde zijn als de tekst die in de afbeelding staat.'\n    },\n    guidelines: [],\n    tags: ['imagemap', 'content']\n  }\n};\nmodule.exports = AreaAltRefersToText;\n\n},{\"Case\":33,\"DOM\":34}],268:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar NewWindowStringsComponent = require('NewWindowStringsComponent');\n\nvar AreaDontOpenNewWindow = {\n  run: function run(test) {\n    // Links without a target attribute pass.\n    test.get('scope').forEach(function (scope) {\n      var areas = DOM.scry('area', scope);\n      var passAreas = [];\n      var checkAreas = [];\n      areas.forEach(function (link) {\n        var target = DOM.getAttribute(link, 'target');\n        if (['_new', '_blank'].indexOf(target) > -1) {\n          checkAreas.push(link);\n        } else {\n          passAreas.push(link);\n        }\n      });\n      passAreas.forEach(function (element) {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      });\n      // Links with a target attribute pass if the link text indicates that the\n      // link will open a new window.\n      checkAreas.forEach(function (element) {\n        var $link = element;\n        var passes = false;\n        var i = 0;\n        var text = DOM.text($link) + ' ' + DOM.getAttribute($link, 'title');\n        var phrase = '';\n        // Test the link text against strings the indicate the link will open\n        // in a new window.\n        do {\n          phrase = NewWindowStringsComponent[i];\n          if (text.search(phrase) > -1) {\n            passes = true;\n          }\n          ++i;\n        } while (!passes && i < NewWindowStringsComponent.length);\n        // Build a Case.\n        if (passes) {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'No \\\"area\\\" elements should open a new window without warning',\n      nl: '\\\"area\\\"-elementen mogen geen nieuw scherm openen zonder melding'\n    },\n    description: {\n      en: 'No <code>area</code> elements should open a new window without warning.',\n      nl: '<code>area</code>-elementen mogen geen nieuw scherm openen zonder dat de gebruiker hiervan een melding krijgt.'\n    },\n    guidelines: [],\n    tags: ['imagemap', 'content']\n  }\n};\nmodule.exports = AreaDontOpenNewWindow;\n\n},{\"Case\":33,\"DOM\":34,\"NewWindowStringsComponent\":16}],269:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AreaHasAltValue = {\n  run: function run(test) {\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (element.hasAttribute('alt') && (element.getAttribute('alt') || '').length > 0) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"area\\\" elements must have an \\\"alt\\\" attribute',\n      nl: 'Alle \\\"area\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>area</code> elements within a <code>map</code> must have an \\\"alt\\\" attribute.',\n      nl: 'Alle <code>area</code>-elementen binnen een <code>map</code> moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['F65', 'G74', 'H24']\n        },\n        '1.4.3': {\n          techniques: ['G145']\n        }\n      }\n    },\n    tags: ['imagemap', 'content']\n  }\n};\nmodule.exports = AreaHasAltValue;\n\n},{\"Case\":33,\"DOM\":34}],270:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar AreaLinksToSoundFile = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = ['area[href$=\"wav\"]', 'area[href$=\"snd\"]', 'area[href$=\"mp3\"]', 'area[href$=\"iff\"]', 'area[href$=\"svx\"]', 'area[href$=\"sam\"]', 'area[href$=\"smp\"]', 'area[href$=\"vce\"]', 'area[href$=\"vox\"]', 'area[href$=\"pcm\"]', 'area[href$=\"aif\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"area\\\" elements which link to a sound file should also provide a link to a transcript',\n      nl: 'Alle \\\"area\\\"-elementen met een link naar een geluidsbestand moeten ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'All <code>area</code> elements which link to a sound file should have a text transcript.',\n      nl: 'Alle \\\"area\\\"-elementen met een link naar een geluidsbestand moeten een transcriptie hebben in tekst.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['G74']\n        }\n      }\n    },\n    tags: ['imagemap', 'media', 'content']\n  }\n};\nmodule.exports = AreaLinksToSoundFile;\n\n},{\"Case\":33,\"DOM\":34}],271:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar AudioMayBePresent = {\n  run: function run(test) {\n    var audioExtensions = ['mp3', 'm4p', 'ogg', 'oga', 'opus', 'wav', 'wma', 'wv'];\n\n    test.get('scope').forEach(function (scope) {\n      var $this = scope;\n      var hasCase = false; // Test if a case has been created\n\n      // Audio is definately an audio, and objects could be too.\n      DOM.scry('object, audio', $this).forEach(function (element) {\n        hasCase = true;\n        test.add(Case({\n          element: element,\n          status: 'cantTell'\n        }));\n      });\n\n      // Links refering to files with an audio extensions are good indicators too\n      DOM.scry('a[href]', $this).forEach(function (element) {\n        var $this = element;\n        var extension = DOM.getAttribute($this, 'href').split('.').pop();\n        if (audioExtensions.indexOf(extension) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // if no case was added, return inapplicable\n      if (!hasCase) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Audio or object uses a link that points to a file with a video extension',\n      nl: 'Audio of object met een link naar een bestand met een video extensie'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'audio']\n  }\n};\nmodule.exports = AudioMayBePresent;\n\n},{\"Case\":33,\"DOM\":34}],272:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar BasefontIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'basefont';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Basefont should not be used',\n      nl: 'Basefont moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>basefont</code> tag is deprecated and should not be used. Investigate using stylesheets instead.',\n      nl: 'The <code>basefont</code>-tag is afgekeurd en moet niet worden gebruikt. Gebruik in plaats hiervan stylesheets.'\n    },\n    guidelines: [],\n    tags: ['document', 'deprecated']\n  }\n};\nmodule.exports = BasefontIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],273:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar BlinkIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'blink';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"blink\\\" tag should not be used',\n      nl: 'De \\\"blink\\\"-tag moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>blink</code> tag should not be used. Ever.',\n      nl: 'Het is nooit toegestaan om de \\\"blink\\\"-tag te gebruiken.'\n    },\n    guidelines: {\n      wcag: {\n        '2.2.2': {\n          techniques: ['F47']\n        }\n      }\n    },\n    tags: ['deprecated', 'content']\n  }\n};\nmodule.exports = BlinkIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],274:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar BlockquoteNotUsedForIndentation = {\n  run: function run(test) {\n\n    var selector = 'blockquote';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n\n          if (element.hasAttribute('cite') && (element.getAttribute('cite') || '').length > 0) {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          } else {\n            test.add(Case({\n              element: element,\n              status: 'cantTell'\n            }));\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The \\\"blockquote\\\" tag should not be used just for indentation',\n      nl: 'De \\\"blockquote\\\"-tag mag niet gebruikt worden om in te springen'\n    },\n    description: {\n      en: 'Blockquote tags are for long-form quotes, and should not be used to indent paragraphs. Use CSS to indent the paragraph instead.',\n      nl: 'Blockquotes zijn bedoeld voor lange stukken geciteerde tekst, en niet om tekst te laten inspringen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H49']\n        }\n      }\n    },\n    tags: ['blockquote', 'content']\n  }\n};\nmodule.exports = BlockquoteNotUsedForIndentation;\n\n},{\"Case\":33,\"DOM\":34}],275:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar BlockquoteUseForQuotations = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var blockquote = DOM.parents(element).find(function (parent) {\n          return DOM.is(parent, 'blockquote');\n        });\n        if (blockquote) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        if (DOM.text(element).substr(0, 1).search(/'|\"|«|“|「/) > -1 && DOM.text(element).substr(-1, 1).search(/'|\"|»|„|」/) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'If long quotes are in the document, use the \\\"blockquote\\\" element to mark them',\n      nl: 'Gebruik voor lange citaten in het document het \\\"blockquote\\\"-element'\n    },\n    description: {\n      en: 'If there is a paragraph or more of a quote, use the blockquote element to mark it as such.',\n      nl: 'Als er een hele alinea of meer alinea\\'s zijn van geciteerde tekst, gebruik dan blockquote om deze als zodanig te markeren.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H49']\n        }\n      }\n    },\n    tags: ['blockquote', 'content']\n  }\n};\nmodule.exports = BlockquoteUseForQuotations;\n\n},{\"Case\":33,\"DOM\":34}],276:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar BoldIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'bold';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"b\\\" (bold) element is not used',\n      nl: 'Het \\\"b\\\"-element (bold) wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>b</code> (bold) element provides no emphasis for non-sighted readers. Use the <code>strong</code> tag instead.',\n      nl: 'Het <code>b</code>-element voorziet niet in nadruk voor blinde en slechtziende gebruikers. Gebruik de <code>strong</code>-tag instead.'\n    },\n    guidelines: [],\n    tags: ['semantics', 'content']\n  }\n};\nmodule.exports = BoldIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],277:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ButtonHasName = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'button',\n      content: 'true',\n      empty: 'true',\n      attribute: 'title'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Button should contain text',\n      nl: 'Een knop moet tekst bevatten'\n    },\n    description: {\n      en: 'Buttons should contain a text value within the element, or have a value attribute.',\n      nl: 'Knoppen moeten een tekstwaarde binnen het element hebben, of een waarde-attribuut.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['content']\n  }\n};\nmodule.exports = ButtonHasName;\n\n},{\"PlaceholderComponent\":17}],278:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar CheckboxHasLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"checkbox\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All checkboxes must have a corresponding label',\n      nl: 'Alle keuzevakjes moeten een bijbehorend label hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"checkbox\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle  <code>input</code>-elementen met een \\\"keuzevakje\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: ['c'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = CheckboxHasLabel;\n\n},{\"LabelComponent\":13}],279:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar Rainbow = require('rainbowvis.js/rainbowvis.js');\n\nvar ColorBackgroundGradientContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorBackgroundGradientContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorBackgroundGradientContrast(test, Case, options, element) {\n      // Check if there's a background gradient using DOM.\n      var failureFound, numberOfSamples;\n      var rainbow = new Rainbow();\n      var backgroundGradientColors = colors.getBackgroundGradient(element);\n\n      if (!backgroundGradientColors) {\n        return;\n      }\n\n      // Convert colors to hex notation.\n      for (var i = 0; i < backgroundGradientColors.length; i++) {\n        if (backgroundGradientColors[i].substr(0, 3) === 'rgb') {\n          backgroundGradientColors[i] = colors.colorToHex(backgroundGradientColors[i]);\n        }\n      }\n\n      // Create a rainbow.\n      rainbow.setSpectrumByArray(backgroundGradientColors);\n      // @todo, make the number of samples configurable.\n      numberOfSamples = backgroundGradientColors.length * options.gradientSampleMultiplier;\n\n      // Check each color.\n      failureFound = false;\n      for (i = 0; !failureFound && i < numberOfSamples; i++) {\n        var testResult = colors.testElmBackground(options.algorithm, element, '#' + rainbow.colourAt(i));\n\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The background gradient makes the text unreadable');\n          failureFound = true;\n        }\n      }\n\n      // If no failure was found, the element passes for this case type.\n      if (!failureFound) {\n        buildCase(test, Case, element, 'passed', id, 'The background gradient does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and run testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorBackgroundGradientContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorBackgroundGradientContrast;\n\n},{\"Case\":33,\"ColorComponent\":4,\"rainbowvis.js/rainbowvis.js\":240}],280:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar ColorBackgroundImageContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorBackgroundImageContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorBackgroundImageContrast(test, Case, options, element) {\n      // Check if there's a backgroundImage using DOM.\n      var backgroundImage = colors.getBackgroundImage(element);\n      if (!backgroundImage) {\n        return;\n      }\n\n      var img = document.createElement('img');\n      img.crossOrigin = 'Anonymous';\n\n      // Get average color of the background image. The image must first load\n      // before information about it is available to the DOM.\n      img.onload = function () {\n        var averageColorBackgroundImage = colors.getAverageRGB(img);\n        var testResult = colors.testElmBackground(options.algorithm, element, averageColorBackgroundImage);\n\n        // Build a case.\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The element\\'s background image makes the text unreadable');\n        } else {\n          buildCase(test, Case, element, 'passed', id, 'The element\\'s background image does not affect readability');\n        }\n      };\n\n      img.onerror = img.onabort = function () {\n        buildCase(test, Case, element, 'cantTell', id, 'The element\\'s background image could not be loaded (' + backgroundImage + ')');\n      };\n\n      // Load the image.\n      img.src = backgroundImage;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorBackgroundImageContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorBackgroundImageContrast;\n\n},{\"Case\":33,\"ColorComponent\":4}],281:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar DOM = require('DOM');\nvar Rainbow = require('rainbowvis.js/rainbowvis.js');\n\nvar ColorElementBehindBackgroundGradientContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindBackgroundGradientContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorElementBehindBackgroundGradientContrast(test, Case, options, element) {\n      // Check if there's a background gradient using element behind current element.\n      var behindGradientColors;\n      var failureFound;\n      var rainbow = new Rainbow();\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        behindGradientColors = colors.getBehindElementBackgroundGradient(element);\n      }\n\n      if (!behindGradientColors) {\n        return;\n      }\n\n      // Convert colors to hex notation.\n      for (var i = 0; i < behindGradientColors.length; i++) {\n        if (behindGradientColors[i].substr(0, 3) === 'rgb') {\n          behindGradientColors[i] = colors.colorToHex(behindGradientColors[i]);\n        }\n      }\n\n      // Create a rainbow.\n      rainbow.setSpectrumByArray(behindGradientColors);\n      var numberOfSamples = behindGradientColors.length * options.gradientSampleMultiplier;\n\n      // Check each color.\n      failureFound = false;\n      for (i = 0; !failureFound && i < numberOfSamples; i++) {\n        failureFound = !colors.testElmBackground(options.algorithm, element, '#' + rainbow.colourAt(i));\n      }\n\n      // If no failure was found, the element passes for this case type.\n      if (failureFound) {\n        buildCase(test, Case, element, 'failed', id, 'The background gradient of the element behind this element makes the text unreadable');\n      } else {\n        buildCase(test, Case, element, 'passed', id, 'The background gradient of the element behind this element does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindBackgroundGradientContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorElementBehindBackgroundGradientContrast;\n\n},{\"Case\":33,\"ColorComponent\":4,\"DOM\":34,\"rainbowvis.js/rainbowvis.js\":240}],282:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar DOM = require('DOM');\nvar ColorElementBehindBackgroundImageContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindBackgroundImageContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorElementBehindBackgroundImageContrast(test, Case, options, element) {\n      // Check if there's a backgroundImage using element behind current element.\n      var behindBackgroundImage;\n\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        behindBackgroundImage = colors.getBehindElementBackgroundImage(element);\n      }\n\n      if (!behindBackgroundImage) {\n        return;\n      }\n\n      var img = document.createElement('img');\n      img.crossOrigin = 'Anonymous';\n      // The image must first load before information about it is available to\n      // the DOM.\n      img.onload = function () {\n\n        // Get average color of the background image.\n        var averageColorBehindBackgroundImage = colors.getAverageRGB(img);\n        var testResult = colors.testElmBackground(options.algorithm, element, averageColorBehindBackgroundImage);\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The background image of the element behind this element makes the text unreadable');\n        } else {\n          buildCase(test, Case, element, 'passed', id, 'The background image of the element behind this element does not affect readability');\n        }\n      };\n      img.onerror = img.onabort = function () {\n        buildCase(test, Case, element, 'cantTell', id, 'The background image of the element behind this element could not be loaded (' + behindBackgroundImage + ')');\n      };\n      // Load the image.\n      img.src = behindBackgroundImage;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindBackgroundImageContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorElementBehindBackgroundImageContrast;\n\n},{\"Case\":33,\"ColorComponent\":4,\"DOM\":34}],283:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar DOM = require('DOM');\nvar ColorElementBehindContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    function colorElementBehindContrast(test, Case, options, element) {\n      // Check text and background using element behind current element.\n      var backgroundColorBehind;\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        backgroundColorBehind = colors.getBehindElementBackgroundColor(element);\n      }\n      if (!backgroundColorBehind) {\n        return;\n      }\n\n      var testResult = colors.testElmBackground(options.algorithm, element, backgroundColorBehind);\n\n      // Build a case.\n      if (!testResult) {\n        buildCase(test, Case, element, 'failed', id, 'The element behind this element makes the text unreadable');\n      } else {\n        buildCase(test, Case, element, 'passed', id, 'The element behind this element does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorElementBehindContrast;\n\n},{\"Case\":33,\"ColorComponent\":4,\"DOM\":34}],284:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar ColorFontContrast = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorFontContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorFontContrast(test, Case, options, element) {\n      // Check text and background color using DOM.\n      // Build a case.\n      if (!colors.testElmContrast(options.algorithm, element)) {\n        buildCase(test, Case, element, 'failed', id, 'The font contrast of the text impairs readability');\n      } else {\n        buildCase(test, Case, element, 'passed', id, 'The font contrast of the text is sufficient for readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate('descendant::text()[normalize-space()]', scope, null, window.XPathResult.ORDERED_NODE_ITERATOR_TYPE, null);\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorFontContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: ['G18']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = ColorFontContrast;\n\n},{\"Case\":33,\"ColorComponent\":4}],285:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n *\n * This test did not test anything, so now it just returns untested.\n */\nvar Case = require('Case');\n\nvar CssDocumentMakesSenseStyleTurnedOff = {\n  run: function run(test) {\n    test.get('scope').forEach(function () {\n      test.add(Case({\n        element: undefined,\n        status: 'untested'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The document must be readable with styles turned off',\n      nl: 'Het document moet leesbaar zijn met stijlen uit'\n    },\n    description: {\n      en: 'With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.',\n      nl: 'Als alle stijlen voor een pagina zijn uitgezet, moet de content van de pagina nog steeds betekenisvol zijn. Zet stijlen uit in de browser en controleer of de content op de pagina nog steeds leesbaar en duidelijk is.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['G140']\n        },\n        '1.4.5': {\n          techniques: ['G140']\n        },\n        '1.4.9': {\n          techniques: ['G140']\n        }\n      }\n    },\n    tags: ['color']\n  }\n};\nmodule.exports = CssDocumentMakesSenseStyleTurnedOff;\n\n},{\"Case\":33}],286:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar DefinitionListsAreUsed = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('dl', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        _case.set({\n          status: 'inapplicable'\n        });\n      });\n    });\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p, li', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var $item = element;\n        DOM.scry('span, strong, em, b, i', element).forEach(function (element) {\n          if (DOM.text(element).length < 50 && DOM.text($item).search(DOM.text(element)) === 0) {\n            if (DOM.is(element, 'span')) {\n              if (DOM.getComputedStyle(element, 'font-weight') === DOM.getComputedStyle($item, 'font-weight') && DOM.getComputedStyle(element, 'font-style') === DOM.getComputedStyle($item, 'font-style')) {\n                _case.set({\n                  status: 'passed'\n                });\n                return;\n              }\n            }\n            _case.set({\n              status: 'failed'\n            });\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use a definition list for defining terms',\n      nl: 'Gebruik een definition list voor definities'\n    },\n    description: {\n      en: 'When providing a list of terms or definitions, use a definition list.',\n      nl: 'Wanneer er gebruik wordt gemaakt van een lijst termen of definities, gebruik hiervoor dan een definition list.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H48']\n        }\n      }\n    },\n    tags: ['structure']\n  }\n};\nmodule.exports = DefinitionListsAreUsed;\n\n},{\"Case\":33,\"DOM\":34}],287:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DoctypeProvided = {\n  run: function run(test) {\n    test.get('scope').forEach(function (doc) {\n      if (!document.doctype) {\n        test.add(Case({\n          element: doc,\n          status: 'failed'\n        }));\n      } else {\n        test.add(Case({\n          element: doc,\n          status: 'passed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should contain a valid \\\"doctype\\\" declaration',\n      nl: 'Het document moet een geldige \\\"doctype\\\"-verklaring hebben'\n    },\n    description: {\n      en: 'Each document must contain a valid doctype declaration.',\n      nl: 'Ieder document moet een geldige doctype-verklaring hebben.'\n    },\n    guidelines: [],\n    tags: ['doctype']\n  }\n};\nmodule.exports = DoctypeProvided;\n\n},{\"Case\":33}],288:[function(require,module,exports){\n'use strict';\n\nvar AcronymComponent = require('AcronymComponent');\nvar DocumentAcronymsHaveElement = {\n  run: function run(test) {\n    AcronymComponent(test, 'acronym');\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Acronyms must be marked with an \\\"acronym\\\" element',\n      nl: 'Acroniemen moeten worden gemarkeerd met een \\\"acronym\\\"-element'\n    },\n    description: {\n      en: 'Acronyms should be marked with an <code>acronym</code> element, at least once on the page for each acronym.',\n      nl: 'Acroniemen moeten worden gemarkeerd door middel van het <code>acronym</code>-element. Doe dit ten minste een keer per pagina voor elke acroniem.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.4': {\n          techniques: ['H28']\n        }\n      }\n    },\n    tags: ['acronym', 'content']\n  }\n};\nmodule.exports = DocumentAcronymsHaveElement;\n\n},{\"AcronymComponent\":1}],289:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentAutoRedirectNotUsed = {\n  run: function run(test) {\n\n    var selector = 'meta[http-equiv=refresh]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Auto-redirect with \\\"meta\\\" elements must not be used',\n      nl: 'Auto-redirect met \\\"meta\\\"-elementen moeten niet worden gebruikt'\n    },\n    description: {\n      en: 'Because different users have different speeds and abilities when it comes to parsing the content of a page, a \\\"meta-refresh\\\" method to redirect users can prevent users from fully understanding the document before being redirected.',\n      nl: 'Omdat verschillende gebruikers verschillende snelheden en vaardigheden hebben met het scannen van content op een pagina, kan een \\\"meta-refresh\\\"-methode om gebruikers door te sturen hen verhinderen het document volledig te begrijpen voor ze worden doorgestuurd.'\n    },\n    guidelines: [],\n    tags: ['document']\n  }\n};\nmodule.exports = DocumentAutoRedirectNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],290:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n *\n * This test did not test anything, so now it just returns untested.\n */\nvar Case = require('Case');\n\nvar DocumentContentReadableWithoutStylesheets = {\n  run: function run(test) {\n    test.get('scope').forEach(function () {\n      test.add(Case({\n        element: undefined,\n        status: 'untested'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Content should be readable without style sheets',\n      nl: 'Content moet zonder stylesheets leesbaar zijn'\n    },\n    description: {\n      en: 'With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.',\n      nl: 'Ook als alle stijlen voor een pagina zijn uitgezet, moet de content van de pagina nog steeds betekenisvol zijn. Zet de stylesheets uit in de browser en controleer of de content nog steeds leesbaar en duidelijk is.'\n    },\n    guidelines: {\n      508: ['d'],\n      wcag: {\n        '1.3.1': {\n          techniques: ['G140']\n        },\n        '1.4.5': {\n          techniques: ['G140']\n        },\n        '1.4.9': {\n          techniques: ['G140']\n        }\n      }\n    },\n    tags: ['document', 'color']\n  }\n};\nmodule.exports = DocumentContentReadableWithoutStylesheets;\n\n},{\"Case\":33}],291:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentHasTitleElement = {\n  run: function run(test) {\n\n    var selector = 'head title';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (candidates.length === 1) {\n        test.add(Case({\n          element: candidates[0],\n          status: 'passed'\n        }));\n      } else if (candidates.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: 'failed'\n        }));\n      } else if (candidates.length > 1) {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should have a title element',\n      nl: 'Het document moet een titelelement hebben'\n    },\n    description: {\n      en: 'The document should have a title element.',\n      nl: 'Het document moet een titelelement hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: ['H25']\n        }\n      }\n    },\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentHasTitleElement;\n\n},{\"Case\":33,\"DOM\":34}],292:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar TextStatisticsComponent = require('TextStatisticsComponent');\nvar IsUnreadable = require('IsUnreadable');\nvar DocumentIsWrittenClearly = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var text = TextStatisticsComponent.cleanText(DOM.text(element));\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (IsUnreadable(text)) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        if (Math.round(206.835 - 1.015 * TextStatisticsComponent.averageWordsPerSentence(text) - 84.6 * TextStatisticsComponent.averageSyllablesPerWord(text)) < 60) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The document should be written to the target audience and read clearly',\n      nl: 'Het document moet geschreven zijn op het niveau van de doelgroep'\n    },\n    description: {\n      en: 'If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content.',\n      nl: 'Als de inhoud van een document moeilijker is dan het vastgestelde taalniveau, moet een samenvatting of andere begeleiding worden toegevoegd om de gebruiker te helpen met de content.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.5': {\n          techniques: ['G86']\n        }\n      }\n    },\n    tags: ['language', 'content']\n  }\n};\nmodule.exports = DocumentIsWrittenClearly;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28,\"TextStatisticsComponent\":29}],293:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LanguageCodesStringsComponent = require('LanguageCodesStringsComponent');\nvar DocumentLangIsISO639Standard = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var element = DOM.is(scope, 'html') ? scope : DOM.scry('html')[0];\n\n      var _case = Case({\n        element: element\n      });\n\n      var langAttr = DOM.getAttribute(element, 'lang');\n      var matchedLang = false; // Check to see if a languagecode was matched\n\n      test.add(_case);\n      if (!DOM.is(element, 'html') || !langAttr) {\n        _case.set({\n          status: 'inapplicable'\n        });\n      } else {\n        // Loop over all language codes, checking if the current lang attribute starts\n        // with a value that's in the languageCodes array\n        LanguageCodesStringsComponent.forEach(function (currentLangCode) {\n          if (!matchedLang && langAttr.indexOf(currentLangCode) === 0) {\n            matchedLang = true;\n          }\n        });\n\n        if (!matchedLang) {\n          _case.set({ status: 'failed' });\n        } else if (langAttr.match(/^[a-z]{2}(-[A-Z]{2})?$/) === null) {\n          _case.set({ status: 'failed' });\n        } else {\n          _case.set({ status: 'passed' });\n        }\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document\\'s language attribute should be a standard code',\n      nl: 'Het language-attribuut van het document moet een standaard code zijn'\n    },\n    description: {\n      en: 'The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639.',\n      nl: 'Het document moet een standaardtaal hebben en die taal moet de geldige 2- of 3-letterige taalcode hebben volgens de ISO-specificatie 639.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.1': {\n          techniques: ['H57']\n        }\n      }\n    },\n    tags: ['document', 'language']\n  }\n};\nmodule.exports = DocumentLangIsISO639Standard;\n\n},{\"Case\":33,\"DOM\":34,\"LanguageCodesStringsComponent\":14}],294:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DocumentLangNotIdentified = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var lang = document.documentElement.lang;\n      if (lang && lang.length > 1) {\n        test.add(Case({\n          element: scope,\n          status: 'passed'\n        }));\n      } else {\n        test.add(Case({\n          element: scope,\n          status: 'failed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document must have a \\\"lang\\\" attribute',\n      nl: 'Het document moet een \\\"lang\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'The document should have a default langauge, by setting the \\\"lang\\\" attribute in the <code>html</code> element.',\n      nl: 'Het document moet een standaardtaal hebben, vastgelegd in het \\\"lang\\\"-attribuut in het <code>html</code>-element.'\n    },\n    guidelines: [],\n    tags: ['document', 'language']\n  }\n};\nmodule.exports = DocumentLangNotIdentified;\n\n},{\"Case\":33}],295:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentMetaNotUsedWithTimeout = {\n  run: function run(test) {\n\n    var selector = 'meta';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('http-equiv') && element.getAttribute('http-equiv') === 'refresh') {\n            if (element.hasAttribute('content') && (element.getAttribute('content') || '').length > 0) {\n              status = 'failed';\n            }\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Meta elements must not be used to refresh the content of a page',\n      nl: 'Meta-elementen mogen niet worden gebruikt om content op een pagina te verversen'\n    },\n    description: {\n      en: 'Because different users have different speeds and abilities when it comes to parsing the content of a page, a \\\"meta-refresh\\\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \\\"refresh this\\\" link instead.',\n      nl: 'Omdat verschillende gebruikers verschillende snelheden en vaardigheden hebben met het scannen van content op een pagina, kan een \\\"meta-refresh\\\"-methode om de pagina te herladen gebruikers hinderen in toegang tot de content. Gebruik een \\\"refresh this\\\" link hiervoor.'\n    },\n    guidelines: {\n      wcag: {\n        '2.2.1': {\n          techniques: ['F40', 'F41']\n        },\n        '2.2.4': {\n          techniques: ['F40', 'F41']\n        },\n        '3.2.5': {\n          techniques: ['F41']\n        }\n      }\n    },\n    tags: ['document']\n  }\n};\nmodule.exports = DocumentMetaNotUsedWithTimeout;\n\n},{\"Case\":33,\"DOM\":34}],296:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentReadingDirection = {\n  run: function run(test) {\n\n    var selector = ['[lang=\"he\"]', '[lang=\"ar\"]'].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          if (element.hasAttribute('dir') && (element.getAttribute('dir') || '') === 'rtl') {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          } else {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Reading direction of text is correctly marked',\n      nl: 'De leesrichting van de tekst staat juist aangegeven'\n    },\n    description: {\n      en: 'Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared.',\n      nl: 'Voor talen die een andere leesrichting hebben, moet de leesrichting van (een deel van) de tekst in een document worden opgenomen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['H34']\n        }\n      }\n    },\n    tags: ['document', 'language']\n  }\n};\nmodule.exports = DocumentReadingDirection;\n\n},{\"Case\":33,\"DOM\":34}],297:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DocumentStrictDocType = {\n  run: function run(test) {\n    if (typeof document.doctype === 'undefined' || !document.doctype || document.doctype.systemId.search('strict') === -1) {\n      test.add(Case({\n        element: document,\n        status: 'failed'\n      }));\n    } else {\n      test.add(Case({\n        element: document,\n        status: 'passed'\n      }));\n    }\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The page uses a strict doctype',\n      nl: 'De pagina gebruikt een strikt doctype'\n    },\n    description: {\n      en: 'The doctype of the page or document should be either an HTML or XHTML strict doctype.',\n      nl: 'Het doctype van een pagina of document moet een HTML of XHTML strikt doctype zijn.'\n    },\n    guidelines: [],\n    tags: ['document', 'doctype']\n  }\n};\nmodule.exports = DocumentStrictDocType;\n\n},{\"Case\":33}],298:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar DocumentTitleDescribesDocument = {\n  run: function run(test) {\n\n    var selector = 'head title';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      var status = candidates.length === 1 ? 'passed' : 'failed';\n\n      if (candidates.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: status\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The title describes the document',\n      nl: 'De titel beschrijft het document'\n    },\n    description: {\n      en: 'The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another.',\n      nl: 'De documenttitel moet een beschrijving zijn van de pagina. Schermlezen gebruiken de titels van pagina\\'s om van het ene naar het andere scherm te navigeren.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: ['F25', 'G88']\n        }\n      }\n    },\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentTitleDescribesDocument;\n\n},{\"Case\":33,\"DOM\":34}],299:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar DocumentTitleIsNotPlaceholder = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'head > title',\n      content: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document title should not be placeholder text',\n      nl: 'De documenttitle moet geen placeholder tekst zijn'\n    },\n    description: {\n      en: 'The document title should not be wasted placeholder text which does not describe the page.',\n      nl: 'De documenttitel moet geen placeholder tekst zijn die geen goede beschrijving van de pagina is.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: ['F25', 'G88']\n        }\n      }\n    },\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentTitleIsNotPlaceholder;\n\n},{\"PlaceholderComponent\":17}],300:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar DocumentTitleIsShort = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var title = DOM.scry('head title', scope)[0];\n      test.add(Case({\n        element: title,\n        status: DOM.text(title).length > 150 ? 'failed' : 'passed'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The document title should be short',\n      nl: 'De documenttitel moet kort zijn'\n    },\n    description: {\n      en: 'The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion.',\n      nl: 'De documenttitel moet kort en beknopt zijn. Probeer bij een titel langer dan 150 tekense de titel in te korten waar mogelijk.'\n    },\n    guidelines: [],\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentTitleIsShort;\n\n},{\"Case\":33,\"DOM\":34}],301:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar DocumentTitleNotEmpty = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'head > title',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should not have an empty title',\n      nl: 'Het document mag geen lege titel hebben'\n    },\n    description: {\n      en: 'The document should have a title element that is not white space.',\n      nl: 'Het document moet een titelelement hebben dat is ingevuld.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: ['F25', 'H25']\n        }\n      }\n    },\n    tags: ['document', 'head']\n  }\n};\nmodule.exports = DocumentTitleNotEmpty;\n\n},{\"PlaceholderComponent\":17}],302:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar DocumentVisualListsAreMarkedUp = {\n  run: function run(test) {\n\n    var itemStarters = ['♦', '›', '»', '‣', '▶', '◦', '✓', '◽', '•', '—', '◾', // single characters\n    '-\\\\D', // dash, except for negative numbers\n    '\\\\\\\\', // Just an escaped slash\n    '\\\\*(?!\\\\*)', // *, but not ** (which could be a foot note)\n    '\\\\.\\\\s', 'x\\\\s', // characters that should be followed by a space\n    '&bull;', '&#8226;', // HTML entities\n    '[0-9]+\\\\.', '\\\\(?[0-9]+\\\\)', // Numbers: 1., 13., 13), (14)\n    '[\\\\u25A0-\\\\u25FF]', // Unicode characters that look like bullets\n    '[IVX]{1,5}\\\\.\\\\s' // Roman numerals up to (at least) 27, followed by \". \" E.g. II. IV.\n    ];\n\n    var symbols = new RegExp('(^|<br[^>]*>)' + // Match the String start or a <br> element\n    '[\\\\s]*' + // Optionally followed by white space characters\n    '(' + itemStarters.join('|') + ')', // Followed by a character that could indicate a list\n    'gi'); // global (for counting), case insensitive (capitalisation in elements / entities)\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var text = element.innerHTML\n        // Get rid of runs of space.\n        .replace(/[ \\t\\n\\r][ \\t\\n\\r]*/g, ' ').trim();\n        var matches = text.match(symbols);\n        _case.set({\n          status: matches && matches.length > 2 ? 'failed' : 'passed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Visual lists of items are marked using ordered or unordered lists',\n      nl: 'Lijsten moeten gemarkeerd worden als ordered of unordered lists'\n    },\n    description: {\n      en: 'Use the ordered (<code>ol</code>) or unordered (<code>ul</code>) elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list.',\n      nl: 'Gebruik ordered (<code>ol</code>) of unordered (<code>ul</code>) elementen voor lijsten, in plaats van een nieuwe regel per item aan te maken die je laat beginnen met een nummer of teken om een visuele lijst te maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H28', 'H48', 'T2']\n        }\n      }\n    },\n    tags: ['list', 'semantics', 'content']\n  }\n};\nmodule.exports = DocumentVisualListsAreMarkedUp;\n\n},{\"Case\":33,\"DOM\":34,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],303:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar EmbedHasAssociatedNoEmbed = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('embed', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var noembeds = DOM.scry('noembed', element);\n        var next = DOM.next(element);\n        var hasSiblingNoembed = next && DOM.is(next, 'noembed');\n        _case.set({\n          status: noembeds.length || hasSiblingNoembed ? 'passed' : 'failed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"embed\\\" elements have an associated \\\"noembed\\\" element',\n      nl: 'Alle \\\"embed\\\" elementen moeten een bijbehorend \\\"noembed\\\"-element hebben'\n    },\n    description: {\n      en: 'Because some users cannot use the <code>embed</code> element, provide alternative content in a <code>noembed</code> element.',\n      nl: 'Sommige gebruikers kunnen het <code>embed</code>-element niet gebruiken. Biedt hiervoor alternatieve content aan in een <code>noembed</code>-element.'\n    },\n    guidelines: [],\n    tags: ['object', 'embed', 'content']\n  }\n};\nmodule.exports = EmbedHasAssociatedNoEmbed;\n\n},{\"Case\":33,\"DOM\":34}],304:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar EmbedMustHaveAltAttribute = {\n  run: function run(test) {\n\n    var selector = 'embed';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var alt = element.getAttribute('alt');\n          if (alt && typeof alt === 'string' && alt.length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: '\\\"Embed\\\" elements must have an \\\"alt\\\" attribute',\n      nl: '\\\"Embed\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>embed</code> elements must have an \\\"alt\\\" attribute.',\n      nl: 'Alle <code>embed</code>-elementen moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: [],\n    tags: ['object', 'embed', 'content']\n  }\n};\nmodule.exports = EmbedMustHaveAltAttribute;\n\n},{\"Case\":33,\"DOM\":34}],305:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FieldsetHasLabel = {\n  run: function run(test, options) {\n\n    options = options || {};\n\n    var selector = 'fieldset';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope).filter(function (element) {\n        return DOM.scry('legend', element).length === 0;\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: options.test ? 'inapplicable' : 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          } else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Fieldsets require a label element',\n      nl: 'Fieldsets behoeven een label-element'\n    },\n    description: {\n      en: 'Fieldsets used to group similar form elements like checkboxes should have a label that describes the group of elements.',\n      nl: 'Fieldsets die een groep gelijkwaardige elementen bevatten moeten een label hebben die deze groep elementen beschrijft.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FieldsetHasLabel;\n\n},{\"Case\":33,\"DOM\":34}],306:[function(require,module,exports){\n'use strict';\n\n/**\n * Test for a label associated with a file input element.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FileHasLabel = {\n  run: function run(test) {\n\n    var sFiles = '[type=\"file\"]';\n    var sLabels = 'label';\n\n    function countOfLabelsById(id, labels) {\n      // Map labels by for attribute value.\n      var labelsByFor = 0;\n      for (var i = 0, il = labels.length; i < il; ++i) {\n        var $label = labels[i];\n        if (DOM.getAttribute($label, 'for') === id) {\n          labelsByFor++;\n        }\n      }\n      return labelsByFor;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var files = DOM.scry(sFiles, scope);\n      var labels = DOM.scry(sLabels, scope);\n\n      if (files.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        files.forEach(function (element) {\n          var $file = element;\n          var status = 'failed';\n\n          // Check for an associated label.\n          var id = DOM.getAttribute($file, 'id');\n          if (id) {\n            var labelCount = countOfLabelsById(id, labels);\n            if (labelCount === 1) {\n              status = 'passed';\n            }\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"file\\\" input elements have a corresponding label',\n      nl: 'Alle \\\"file\\\"-invoerelementen hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"file\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user.',\n      nl: 'Alle <code>input</code>-elementen van het type \\\"file\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: ['n'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FileHasLabel;\n\n},{\"Case\":33,\"DOM\":34}],307:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FontIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'font';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Font elements should not be used',\n      nl: 'Het font element moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>basefont</code> tag is deprecated and should not be used. Investigate using stylesheets instead.',\n      nl: 'De <code>basefont</code>-tag is afgekeurd en moet niet worden gebruikt. Gebruik in plaats hiervan stylesheets.'\n    },\n    guidelines: [],\n    tags: ['deprecated', 'content']\n  }\n};\nmodule.exports = FontIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],308:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FormButtonsHaveValue = {\n  run: function run(test) {\n\n    var selector = 'input[type=button], input[type=submit], input[type=reset]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          // If the button has a value, it passes.\n          var val = element.getAttribute('value');\n          if (val && typeof val === 'string' && val.length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Input elements for button, submit, or reset must have a value attribute',\n      nl: 'Invoerelementen voor knoppen, indienen of resetten moeten een waarde-attribuut hebben'\n    },\n    description: {\n      en: 'Any form element that is rendered as a button has to have a readable value attribute.',\n      nl: 'Elk invoerelement dat eruit ziet als een knop moet een leesbaar waarde-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormButtonsHaveValue;\n\n},{\"Case\":33,\"DOM\":34}],309:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FormErrorMessageHelpsUser = {\n  run: function run(test) {\n\n    var selector = 'form';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Forms offer the user a way to check the results of their form before performing an irrevocable action',\n      nl: 'Formulieren bieden gebruikers de gelegenheid om hun formulier te controleren voor ze een onomkeerbare actie uitvoeren'\n    },\n    description: {\n      en: 'If the form allows users to perform some irrevocable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation.',\n      nl: 'Als een formulier een gebruiker toestaat om een onomkeerbare actie uit te voeren, zoals het bestellen van een product, zorg er dan voor dat ze eerst het formulier kunnen controleren. Dit kan niet met een automatische test en moet handmatig gecontroleerd en bevestigd worden.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormErrorMessageHelpsUser;\n\n},{\"Case\":33,\"DOM\":34}],310:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar FormHasGoodErrorMessage = {\n  run: function run(test) {\n\n    var selector = 'form';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Form error messages should assist in solving errors',\n      nl: 'Foutmeldingen in formulieren moeten fouten helpen oplossen'\n    },\n    description: {\n      en: 'If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \\\"required\\\" or \\\"error\\\" within the <code>label</code> element of input items where the errors happened.',\n      nl: 'Als het formulier verplichte velden heeft of op andere manier verkeerd ingevuld kan worden, controleer dan of de bijbehorende foutmelding begrijpelijk is. Gebruik de woorden \\\"required\\\" of \\\"error\\\" in het <code>label</code>-element of in de invoeritems waar de fout is opgetredenitems where the errors happened.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormHasGoodErrorMessage;\n\n},{\"Case\":33,\"DOM\":34}],311:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar FormHasSubmitButton = {\n  run: function run(test) {\n\n    var selector = 'input[type=submit], button[type=submit]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('form', scope);\n\n      if (candidates.length === 0) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var submitButton = DOM.scry(selector, element);\n\n          var status = submitButton.length === 1 ? 'passed' : 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Form should have a submit button',\n      nl: 'Formulieren moeten een indienknop hebben'\n    },\n    description: {\n      en: 'Forms should have a button that allows the user to select when they want to submit the form.',\n      nl: 'Formulieren moeten een knop hebben waarmee de gebruiker kan bepalen wanneer zij een formulieren willen versturen.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.2': {\n          techniques: ['H32', 'G80']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormHasSubmitButton;\n\n},{\"Case\":33,\"DOM\":34}],312:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar FormWithRequiredLabel = {\n  run: function run(test) {\n    var redundant = RedundantStringsComponent;\n    var lastStyle,\n        currentStyle = false;\n    redundant.required[redundant.required.indexOf('*')] = /\\*/g;\n    test.get('scope').forEach(function (scope) {\n      var $local = scope;\n      DOM.scry('label', $local).forEach(function (element) {\n        var text = DOM.text(element).toLowerCase();\n        var $label = element;\n        var _case = test.add(Case({\n          element: element\n        }));\n        var input = DOM.scry('#' + DOM.getAttribute($label, 'for'), scope)[0];\n        var isAriaRequired = DOM.getAttribute(input, 'aria-required') === 'true';\n        for (var word in redundant.required) {\n          if (text.search(word) >= 0 && !isAriaRequired) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n        }\n        currentStyle = DOM.getComputedStyle($label, 'color') + DOM.getComputedStyle($label, 'font-weight') + DOM.getComputedStyle($label, 'background-color');\n        if (lastStyle && currentStyle !== lastStyle) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        lastStyle = currentStyle;\n        if (typeof _case.get('status') === 'undefined') {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Input items which are required are marked as so in the label element',\n      nl: 'Invoervelden die verplicht zijn, zijn zo gemarkeerd in het label-element'\n    },\n    description: {\n      en: 'If a form element is required, it should be marked as so. This should not be a mere red asterisk, but instead either a \\'required\\' image with alt text of \\\"required\\\" or the actual text \\\"required\\\". The indicator that an item is required should be included in the input element\\'s <code>label</code> element.',\n      nl: 'Als een formulierveld verplicht is, moet het ook zichtbaar zijn. Doe dit niet alleen met een asterisk achter het veld, maar met bijvoorbeeld een afbeelding met als alttekst \\\"required\\\" of de tekst \\\"required\\\". De indicatie dat een veld verplicht is moet opgenomen zijn in het <code>label</code>-element van het invoerveld.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['ARIA2']\n        },\n        '1.4.1': {\n          techniques: ['F81']\n        },\n        '3.3.2': {\n          techniques: ['ARIA2', 'H90']\n        },\n        '3.3.3': {\n          techniques: ['ARIA2']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = FormWithRequiredLabel;\n\n},{\"Case\":33,\"DOM\":34,\"RedundantStringsComponent\":19}],313:[function(require,module,exports){\n'use strict';\n\nvar HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH1 = {\n  run: function run(test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 1\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h1 is not h3 through h6',\n      nl: 'De header die volgt op een h1 is niet h3 tot h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h1</code> header with a <code>h3</code>, <code>h4</code>, <code>h5</code>, or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h1</code>-header niet volgen door een <code>h3</code>, <code>h4</code>, <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: ['G130']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH1;\n\n},{\"HeadingLevelComponent\":9}],314:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH1Format = {\n  run: function run(test) {\n\n    var selector = 'h1';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h1 elements are not used for formatting',\n      nl: 'H1-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h1</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h1</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH1Format;\n\n},{\"Case\":33,\"DOM\":34}],315:[function(require,module,exports){\n'use strict';\n\nvar HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH2 = {\n  run: function run(test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 2\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h2 is not h4, h5, or h6',\n      nl: 'De header volgend op een h2 is geen h4, h5, of h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h2</code> header with a <code>h4</code>, <code>h5</code>, or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h2</code>-header niet volgen door een <code>h4</code>, <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: ['G130']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH2;\n\n},{\"HeadingLevelComponent\":9}],316:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH2Format = {\n  run: function run(test) {\n\n    var selector = 'h2';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h2 elements are not used for formatting',\n      nl: 'H2-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h2</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h2</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH2Format;\n\n},{\"Case\":33,\"DOM\":34}],317:[function(require,module,exports){\n'use strict';\n\nvar HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH3 = {\n  run: function run(test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 3\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h3 is not an h5 or h6',\n      nl: 'De header volgend op een h3 is geen h5, of h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h3</code> header with a <code>h5<code> or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h3</code>-header niet volgen door een <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: ['G130']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH3;\n\n},{\"HeadingLevelComponent\":9}],318:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH3Format = {\n  run: function run(test) {\n\n    var selector = 'h3';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h3 elements are not used for formatting',\n      nl: 'H3-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h3</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h3</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH3Format;\n\n},{\"Case\":33,\"DOM\":34}],319:[function(require,module,exports){\n'use strict';\n\nvar HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH4 = {\n  run: function run(test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 4\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h4 is not an h6',\n      nl: 'De header volgend op een h4 is geen h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h4</code> haeder with a <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h4/code> header niet volgen door een <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: ['G130']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH4;\n\n},{\"HeadingLevelComponent\":9}],320:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH4Format = {\n  run: function run(test) {\n\n    var selector = 'h4';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h4 elements are not used for formatting',\n      nl: 'H4-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h4</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h4</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH4Format;\n\n},{\"Case\":33,\"DOM\":34}],321:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH5Format = {\n  run: function run(test) {\n\n    var selector = 'h5';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h5 elements are not used for formatting',\n      nl: 'H5-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h5</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h5</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH5Format;\n\n},{\"Case\":33,\"DOM\":34}],322:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar HeaderH6Format = {\n  run: function run(test) {\n\n    var selector = 'h6';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h6 elements are not used for formatting',\n      nl: 'H6-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h6</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h6</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['T3']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeaderH6Format;\n\n},{\"Case\":33,\"DOM\":34}],323:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar HeadersAttrRefersToATableCell = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      // Table cell headers without referred ids\n      DOM.scry('table', scope).forEach(function (element) {\n        var self = element;\n        var _case = Case();\n        test.add(_case);\n        var elmHeaders = DOM.scry('th[headers], td[headers]', self);\n\n        if (elmHeaders.length === 0) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        } else {\n          elmHeaders.forEach(function (element) {\n            var that = element;\n            var headers = DOM.getAttribute(element, 'headers').split(/\\s+/);\n            headers.forEach(function (item) {\n              if (item === '' || DOM.scry('th#' + item + ',td#' + item, self).length > 0) {\n                _case.set({\n                  element: that,\n                  status: 'passed'\n                });\n                return;\n              } else {\n                _case.set({\n                  element: that,\n                  status: 'failed'\n                });\n                return;\n              }\n            });\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Table cell headers attrtibutes must within the same table have an associated data cell with the same id',\n      nl: 'Tabel cellen met een headers attribuut moeten binnen dezelfde tabel een overeenkomende data cel hebben in het id attribuut dezelfde waarde'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['headers', 'td', 'th']\n  }\n};\nmodule.exports = HeadersAttrRefersToATableCell;\n\n},{\"Case\":33,\"DOM\":34}],324:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar HeadersHaveText = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'h1, h2, h3, h4, h5, h6',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All headers should contain readable text',\n      nl: 'Alle headers moeten leesbare tekst bevatten'\n    },\n    description: {\n      en: 'Users with screen readers use headings like the tabs <em>h1</em> to navigate the structure of a page. All headings should contain either text, or images with appropriate <em>alt</em> attributes.',\n      nl: 'Gebruikers van schermlezers gebruiken headers om via de structuur van een pagina te navigeren. Alle headers moeten daarom tekst bevatten of afbeeldingen met toepasselijk <em>alt</em>-attributen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['G141']\n        },\n        '2.4.10': {\n          techniques: ['G141']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeadersHaveText;\n\n},{\"PlaceholderComponent\":17}],325:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar HeadersUseToMarkSections = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case();\n        test.add(_case);\n        [DOM.scry('strong', element)[0], DOM.scry('em', element)[0], DOM.scry('i', element)[0], DOM.scry('b', element)[0]].forEach(function (inlineText) {\n          if (inlineText) {\n            _case.set({\n              element: element,\n              status: DOM.text(inlineText).trim() === DOM.text(element).trim() ? 'failed' : 'passed'\n            });\n          }\n        });\n      });\n    });\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('ul, ol', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var $list = element;\n        var prevHeaders = DOM.prevAll($list).filter(function (element) {\n          return DOM.is(element, 'h1, h2, h3, h4, h5, h6');\n        });\n        var items = DOM.scry('li', $list);\n        var itemLinks = DOM.scry('li', $list).filter(function (element) {\n          return DOM.scry('a', element).length > 0;\n        });\n        if (prevHeaders.length || items.length !== itemLinks.length) {\n          _case.set({\n            status: 'passed'\n          });\n          return;\n        }\n        var isNavigation = true;\n        itemLinks.forEach(function (element) {\n          if (DOM.text(DOM.scry('a', element)[0]).trim() !== DOM.text(element).trim()) {\n            isNavigation = false;\n          }\n        });\n        if (isNavigation) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use headers to mark the beginning of each section',\n      nl: 'Gebruik headers om de start van elke sectie aan te geven.'\n    },\n    description: {\n      en: 'Check that each logical section of the page is broken or introduced with a header (h1-h6) element.',\n      nl: 'Controleer dat elke logische sectie van een pagina wordt onderbroken door of start met een header-element (h1-h6).'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['G141']\n        },\n        '2.4.1': {\n          techniques: ['G141', 'H69']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = HeadersUseToMarkSections;\n\n},{\"Case\":33,\"DOM\":34}],326:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar IIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'i';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"i\\\" (italic) element is not used',\n      nl: 'Het \\\"i\\\"-element (cursief) wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>i</code> (italic) element provides no emphasis for non-sighted readers. Use the <code>em</code> tag instead.',\n      nl: 'Het <code>i</code>-element biedt geen nadruk voor slechtziende en blinde lezers. Gebruik in plaats daarvan de <code>em</code>-tag.'\n    },\n    guidelines: [],\n    tags: ['deprecated', 'content']\n  }\n};\nmodule.exports = IIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],327:[function(require,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol ? \"symbol\" : typeof obj; };\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IdrefsHasCorrespondingId = {\n  run: function run(test) {\n\n    function getAttribute($element) {\n      var attribute = [];\n      var attributeList = ['headers', 'aria-controls', 'aria-describedby', 'aria-flowto', 'aria-labelledby', 'aria-owns'];\n\n      attributeList.forEach(function (item) {\n        var attr = DOM.getAttribute($element, item);\n\n        if ((typeof attr === 'undefined' ? 'undefined' : _typeof(attr)) !== (typeof undefined === 'undefined' ? 'undefined' : _typeof(undefined)) && attr !== false) {\n          attribute = attr;\n          return;\n        }\n      });\n      return attribute.split(/\\s+/);\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var testableElements = DOM.scry(['td[headers]', 'th[headers]', '[aria-controls]', '[aria-describedby]', '[aria-flowto]', '[aria-labelledby]', '[aria-owns]'].join(', '), scope);\n\n      if (testableElements.length === 0) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n        return;\n      } else {\n        testableElements.forEach(function (element) {\n          var _case = test.add(Case({\n            element: element\n          }));\n\n          var attributes = getAttribute(element);\n          var status = 'passed';\n\n          attributes.forEach(function (item) {\n            if (item !== '' && DOM.scry('#' + item, scope).length === 0) {\n              status = 'failed';\n              return;\n            }\n          });\n\n          _case.set({\n            status: status\n          });\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Elements with an idref attribute must correspond to an element with an ID',\n      nl: 'Elementen met een idref-attribuut moeten corresponderen met een element met een ID'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F17']\n        },\n        '4.1.1': {\n          techniques: ['F17']\n        }\n      }\n    }\n  }\n};\nmodule.exports = IdrefsHasCorrespondingId;\n\n},{\"Case\":33,\"DOM\":34}],328:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar IframeMustNotHaveLongdesc = {\n  run: function run(test) {\n\n    var selector = 'iframe';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('longdesc')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Inline frames (\\\"iframes\\\") should not have a \\\"longdesc\\\" attribute',\n      nl: 'Inline frames (\\\"iframes\\\") krijgen geen \\\"longdesc\\\"-attribuut'\n    },\n    description: {\n      en: 'Inline frames (iframe) should not have a \\\"longdesc\\\" attribute.',\n      nl: 'Inline frames (\\\"iframes\\\") krijgen geen \\\"longdesc\\\"-attribuut.'\n    },\n    guidelines: [],\n    tags: ['objects', 'iframe', 'content']\n  }\n};\nmodule.exports = IframeMustNotHaveLongdesc;\n\n},{\"Case\":33,\"DOM\":34}],329:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImageMapServerSide = {\n  run: function run(test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('ismap')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All links in a server-side map should have duplicate links available in the document',\n      nl: 'Alle links in een server-side map moeten elders in het document terugkeren'\n    },\n    description: {\n      en: 'Any image with an \\\"usemap\\\" attribute for a server-side image map should have the available links duplicated elsewhere.',\n      nl: 'Elke afbeelding met een \\\"usemap\\\"-attribuut voor een server-side map moet de beschikbare links ook elders hebben.'\n    },\n    guidelines: [],\n    tags: ['objects', 'iframe', 'content']\n  }\n};\nmodule.exports = ImageMapServerSide;\n\n},{\"Case\":33,\"DOM\":34}],330:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ImgAltIsDifferent = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img', scope).filter(function (element) {\n        var src = DOM.getAttribute(element, 'src');\n        return !src || src.length === 0;\n      }).forEach(function (element) {\n        var _case = Case({\n          element: element,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n      });\n\n      DOM.scry('img[alt][src]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'src') === DOM.getAttribute(element, 'alt') || DOM.getAttribute(element, 'src').split('/').pop() === DOM.getAttribute(element, 'alt')) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Image \\\"alt\\\" attributes should not be the same as the filename',\n      nl: '\\\"Alt\\\"-attributen van afbeeldingen moeten niet hetzelfde zijn als de bestandsnaam'\n    },\n    description: {\n      en: 'All <code>img</code> elements should have an \\\"alt\\\" attribute that is not just the name of the file',\n      nl: 'Alle <code>img</code>-elementen moeten een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam van de afbeelding.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H37']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgAltIsDifferent;\n\n},{\"Case\":33,\"DOM\":34}],331:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ImgAltIsTooLong = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        _case.set({\n          status: DOM.getAttribute(element, 'alt').length > 100 ? 'failed' : 'passed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Image Alt text is too long',\n      nl: 'Altteksten voor een afbeelding zijn kort'\n    },\n    description: {\n      en: 'All \\\"alt\\\" attributes for <code>img</code> elements should be clear and concise. \\\"Alt\\\" attributes over 100 characters long should be reviewed to see if they are too long.',\n      nl: 'Alle \\\"alt\\\"-attributen voor <code>img</code>-elementen moeten duidelijk en bondig zijn. Verifieer \\\"alt\\\"-attributen langer dan 100 tekens en kort ze in waar mogelijk.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H37']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgAltIsTooLong;\n\n},{\"Case\":33,\"DOM\":34}],332:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgAltNotEmptyInAnchor = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a[href]', scope).filter(function (element) {\n        return DOM.scry('img', element).length > 0;\n      }).forEach(function (element) {\n        var $a = element;\n        var text = DOM.text($a);\n\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        // Concat all alt attributes of images to the text of the paragraph\n        DOM.scry('img[alt]', $a).forEach(function (element) {\n          text += ' ' + DOM.getAttribute(element, 'alt');\n        });\n\n        if (IsUnreadable(text)) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'An image within a link cannot have an empty \\\"alt\\\" attribute if there is no other text within the link',\n      nl: 'Een afbeelding binnen een link mag geen leeg \\\"alt\\\"-attribuut hebben als er geen andere tekst is in de link'\n    },\n    description: {\n      en: 'Any image that is within a link (an <code>a</code> element) that has no other text cannot have an empty or missing \\\"alt\\\" attribute.',\n      nl: 'Elke afbeelding binnen een link (een <code>a</code>-element) die geen andere tekst heeft, mag geen leeg of ontbrekend \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '2.4.4': {\n          techniques: ['H30']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgAltNotEmptyInAnchor;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],333:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ImgAltNotPlaceHolder = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'img',\n      attribute: 'alt'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Images should not have a simple placeholder text as an \\\"alt\\\" attribute',\n      nl: 'Afbeeldingen mogen geen placeholdertkest als \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decorativey or which is purely for layout purposes cannot have an \\\"alt\\\" attribute that consists solely of placeholders.',\n      nl: 'Elke afbeelding die niet ter decoratie is of die alleen voor lay-out doeleinden is bedoeld, mag geen \\\"alt\\\"-attribuut hebben met daarin placeholdertekst.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['F30', 'F39']\n        },\n        '1.2.1': {\n          techniques: ['F30']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgAltNotPlaceHolder;\n\n},{\"PlaceholderComponent\":17}],334:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImgHasAlt = {\n  run: function run(test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Image elements must have an \\\"alt\\\" attribute',\n      nl: 'Afbeeldingselementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>img</code> elements must have an alt attribute.',\n      nl: 'Alle <code>img</code>-elementen moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['F65', 'H37']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgHasAlt;\n\n},{\"Case\":33,\"DOM\":34}],335:[function(require,module,exports){\n'use strict';\n\nvar ValidURLComponent = require('ValidURLComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ImgHasLongDesc = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[longdesc]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'longdesc') === DOM.getAttribute(element, 'alt') || !ValidURLComponent(DOM.getAttribute(element, 'longdesc'))) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A \\\"longdesc\\\" attribute is required for any image where additional information not in the \\\"alt\\\" attribute is required',\n      nl: 'Een \\\"longdesc\\\"-attribuut is verplicht voor elke afbeelding waar aanvullende informatie niet benodigd is in het \\\"alt\\\"-attribuut'\n    },\n    description: {\n      en: 'Any image that has an \\\"alt\\\" attribute that does not fully convey the meaning of the image must have a \\\"longdesc\\\" attribute.',\n      nl: 'Elke afbeelding die een \\\"alt\\\"-attribuut heeft dat de volledige betekenis van de afbeelding bevat, moet een \\\"longdesc\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: ['G91']\n        },\n        '2.4.9': {\n          techniques: ['G91']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgHasLongDesc;\n\n},{\"Case\":33,\"DOM\":34,\"ValidURLComponent\":30}],336:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgImportantNoSpacerAlt = {\n  run: function run(test) {\n    var removePX = function removePX(strVal) {\n      if (/px$/.test(strVal)) {\n        strVal = strVal.slice(0, -2);\n      }\n      return strVal;\n    };\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var computedWidth = parseInt(removePX(DOM.getComputedStyle(element, 'width')), 10);\n        var computedHeight = parseInt(removePX(DOM.getComputedStyle(element, 'height')), 10);\n        var width = computedWidth ? computedWidth : parseInt(DOM.getAttribute(element, 'width'), 10);\n        var height = computedHeight ? computedHeight : parseInt(DOM.getAttribute(element, 'height'), 10);\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (IsUnreadable(DOM.getAttribute(element, 'alt').trim()) && DOM.getAttribute(element, 'alt').length > 0 && width > 50 && height > 50) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Images that are important should not have a purely white-space \\\"alt\\\" attribute',\n      nl: 'Afbeeldingen die belangrijk zijn mogen geen leeg \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decorativey or which is purely for layout purposes cannot have an \\\"alt\\\" attribute that consists solely of white space (i.e. a space).',\n      nl: 'Elke afbeelding die niet ter decoratie is of die alleen voor lay-out doeleinden is bedoeld, mag geen leeg \\\"alt\\\"-attribuut hebben (bijvoorbeeld alleen een spatie).'\n    },\n    guidelines: [],\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgImportantNoSpacerAlt;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],337:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgNonDecorativeHasAlt = {\n  run: function run(test) {\n    function removePX(val) {\n      if (/px$/.test(val)) {\n        val = val.slice(0, -2);\n      }\n      return val;\n    }\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var computedWidth = parseInt(removePX(DOM.getComputedStyle(element, 'width')), 10);\n        var computedHeight = parseInt(removePX(DOM.getComputedStyle(element, 'height')), 10);\n        if (IsUnreadable(DOM.getAttribute(element, 'alt')) && (computedWidth > 100 || computedHeight > 100)) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Any non-decorative images should have a non-empty \\\"alt\\\" attribute',\n      nl: 'Elke niet-decoratieve afbeelding moet een gevuld \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decoratively or which is purely for layout purposes cannot have an empty \\\"alt\\\" attribute.',\n      nl: 'Elke afbeelding die niet ter decoratie is of voor lay-out doeleinden wordt gebruikt, moet een gevuld \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['F38']\n        }\n      }\n    },\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgNonDecorativeHasAlt;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],338:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImgServerSideMapNotUsed = {\n  run: function run(test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('ismap')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Server-side image maps should not be used',\n      nl: 'Server-side image maps moeten niet worden gebruikt'\n    },\n    description: {\n      en: 'Server-side image maps should not be used.',\n      nl: 'Server-side image maps mogen niet worden gebruikt.'\n    },\n    guidelines: [],\n    tags: ['image', 'imagemap', 'content']\n  }\n};\nmodule.exports = ImgServerSideMapNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],339:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImgShouldNotHaveTitle = {\n  run: function run(test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('title')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Images should not have a \\\"title\\\" attribute',\n      nl: 'Afbeeldingen moeten geen \\\"title\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Images should not contain a \\\"title\\\" attribute.',\n      nl: 'Afbeeldingen zouden geen \\\"title\\\"-attribuut moeten bevatten.'\n    },\n    guidelines: [],\n    tags: ['image', 'content']\n  }\n};\nmodule.exports = ImgShouldNotHaveTitle;\n\n},{\"Case\":33,\"DOM\":34}],340:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ImgWithMapHasUseMap = {\n  run: function run(test) {\n\n    var selector = 'img[ismap]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('usemap')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any image with an \\\"ismap\\\" attribute have a valid \\\"usemap\\\" attribute',\n      nl: 'Elke afbeelding met een \\\"ismap\\\"-attribuut heeft een geldig \\\"usemap\\\"-attribuut'\n    },\n    description: {\n      en: 'If an image has an \\\"ismap\\\" attribute it must have a valid \\\"usemap\\\" attribute.',\n      nl: 'Als een afbeelding een \\\"ismap\\\"-attribuut heeft, moet het ook een geldig \\\"usemap\\\"-attribuut hebben'\n    },\n    guidelines: {\n      508: ['ef', 'ef']\n    },\n    tags: ['image', 'imagemap', 'content']\n  }\n};\nmodule.exports = ImgWithMapHasUseMap;\n\n},{\"Case\":33,\"DOM\":34}],341:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar InputCheckboxRequiresFieldset = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=\"checkbox\"]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var fieldset = DOM.parents(element).find(function (parent) {\n          return DOM.is(parent, 'fieldset');\n        });\n        if (!fieldset) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Logical groups of check boxes should be grouped with a fieldset',\n      nl: 'Logische groepen van keuzevakjes moeten gegroepeerd zijn in een fieldset'\n    },\n    description: {\n      en: 'Related \\\"checkbox\\\" input fields should be grouped together using a <code>fieldset</code>.',\n      nl: 'Gerelateerde \\\"keuzevakjes\\\"-invoervelden moeten bij elkaar staan in een <code>fieldset</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '3.3.2': {\n          techniques: ['H71']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputCheckboxRequiresFieldset;\n\n},{\"Case\":33,\"DOM\":34}],342:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar InputElementsDontHaveAlt = {\n  run: function run(test) {\n\n    var selector = 'input[type]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope).filter(function (element) {\n        var type = DOM.getAttribute(element, 'type');\n        return type !== 'image';\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Input elements which are not images should not have an \\\"alt\\\" attribute',\n      nl: 'Invoervelden die geen afbeelding zijn, moeten geen \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Input elements which are not images should not have an \\\"alt\\\" attribute, because of inconsistencies in how user agents use the \\\"alt\\\" attribute.',\n      nl: 'Invoervelden die geen afbeelding zijn, moeten geen \\\"alt\\\"-attribuut hebben, omdat user agents het \\\"alt\\\"-attribuut niet consistent gebruiken.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputElementsDontHaveAlt;\n\n},{\"Case\":33,\"DOM\":34}],343:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar InputImageAltIsNotFileName = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image][alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'src') === DOM.getAttribute(element, 'alt')) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not the same as the filename',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"image\\\" should have an \\\"alt\\\" attribute which is not the same as the filename.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H36']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageAltIsNotFileName;\n\n},{\"Case\":33,\"DOM\":34}],344:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputImageAltIsNotPlaceholder = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"image\"]',\n      attribute: 'alt'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not placeholder text.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben anders dan alleen placeholdertekst.'\n    },\n    description: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not placeholder text.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben anders dan alleen placeholdertekst.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H36']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageAltIsNotPlaceholder;\n\n},{\"PlaceholderComponent\":17}],345:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar InputImageAltIsShort = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'alt').length > 100) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is as short as possible',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat zo kort mogelijk is'\n    },\n    description: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is as short as possible.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat zo kort mogelijk is.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H36']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageAltIsShort;\n\n},{\"Case\":33,\"DOM\":34}],346:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar InputImageAltNotRedundant = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image][alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (RedundantStringsComponent.inputImage.indexOf(CleanStringComponent(DOM.getAttribute(element, 'alt'))) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"alt\\\" text for input \\\"image\\\" submit buttons must not be filler text',\n      nl: 'De \\\"alt\\\"-tekst for \\\"image\\\"-knoppen moet anders zijn dan alleen placeholdertekst'\n    },\n    description: {\n      en: 'Every form image button should not simply use filler text like \\\"button\\\" or \\\"submit\\\" as the \\\"alt\\\" text.',\n      nl: 'Elke formulierknop die een afbeelding is, moet bruikbare tekst als \\\"alt\\\"-tekst hebben, anders dan \\\"knop\\\" of \\\"verstuur\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H36']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageAltNotRedundant;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34,\"RedundantStringsComponent\":19}],347:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar InputImageHasAlt = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('input[type=image]', scope).filter(function (element) {\n        return DOM.isVisible(element);\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"image\\\" should have an \\\"alt\\\" attribute.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['a'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['F65', 'G94', 'H36']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '4.1.2': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'image', 'content']\n  }\n};\nmodule.exports = InputImageHasAlt;\n\n},{\"Case\":33,\"DOM\":34}],348:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar InputTextHasLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements should have a corresponding \\\"label\\\"',\n      nl: 'Alle invoerelementen moeten een bijbehorend \\\"label\\\" hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputTextHasLabel;\n\n},{\"LabelComponent\":13}],349:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputTextHasValue = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"text\"]',\n      attribute: 'value',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements of type \\\"text\\\" must have a default text',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"text\\\" should have a default text.',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputTextHasValue;\n\n},{\"PlaceholderComponent\":17}],350:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputTextValueNotEmpty = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"text\"]',\n      attribute: 'value',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Text input elements require a non-whitespace default text',\n      nl: 'Tekstinvoerelementen mogen geen lege standaardtekst hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"text\\\" should have a default text which is not empty.',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben die gevuld is.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputTextValueNotEmpty;\n\n},{\"PlaceholderComponent\":17}],351:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar InputWithoutLabelHasTitle = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var testableElements = DOM.scry('input, select, textarea', scope);\n      if (testableElements.length === 0) {\n        var _case = Case({\n          element: scope,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n        return;\n      } else {\n        testableElements.forEach(function (element) {\n          var _case = Case({\n            element: element\n          });\n          test.add(_case);\n\n          if (DOM.getComputedStyle(element, 'display') === 'none') {\n            _case.set({\n              status: 'inapplicable'\n            });\n            return;\n          }\n          if (!DOM.scry('label[for=' + DOM.getAttribute(element, 'id') + ']', scope).length && (!DOM.getAttribute(element, 'title') || IsUnreadable(DOM.getAttribute(element, 'title')))) {\n            _case.set({\n              status: 'failed'\n            });\n          } else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Form controls without label should have a title attribute',\n      nl: 'Formulierelementen zonder label moeten een titelattribuut hebben'\n    },\n    description: {\n      en: 'If it is not possible to have a label for a form control, then a title attribute on the element should be provided that describes the purpose of the control.',\n      nl: 'Als een formulierelement geen label kan krijgen, dan moet een dat element een titelattribuut krijgen dat het doel van het element beschrijft.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H65']\n        },\n        '1.3.1': {\n          techniques: ['H65']\n        },\n        '3.3.2': {\n          techniques: ['H65']\n        },\n        '4.1.2': {\n          techniques: ['H65']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = InputWithoutLabelHasTitle;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],352:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LabelDoesNotContainInput = {\n  run: function run(test) {\n\n    var selector = 'label';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (DOM.scry('input', element).length > 0) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Label elements should not contain an input element',\n      nl: 'Labelelementen moeten geen invoerelementen bevatten'\n    },\n    description: {\n      en: 'Label elements should not wrap around another input element, as this can cause the label to be read twice by screen readers.',\n      nl: 'Labelelementen moeten niet om een ander invoerelement heenstaan, omdat dan het label twee keer kan worden voorgelezen door schermlezers.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LabelDoesNotContainInput;\n\n},{\"Case\":33,\"DOM\":34}],353:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LabelMustBeUnique = {\n  run: function run(test) {\n    var labels = {};\n    test.get('scope').forEach(function (scope) {\n      var labelElements = DOM.scry('label[for]', scope);\n\n      labelElements.forEach(function (element) {\n        if (typeof labels[DOM.getAttribute(element, 'for')] === 'undefined') {\n          labels[DOM.getAttribute(element, 'for')] = 0;\n        }\n        labels[DOM.getAttribute(element, 'for')]++;\n      });\n\n      labelElements.forEach(function (element) {\n        var _case = Case({\n          element: element,\n          status: labels[DOM.getAttribute(element, 'for')] === 1 ? 'passed' : 'failed'\n        });\n        test.add(_case);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Every form input must have only one label',\n      nl: 'Elk formulierinvoerveld heeft maar een label'\n    },\n    description: {\n      en: 'Each form input should have only one <code>label</code> element.',\n      nl: 'Elk formulierinvoerveld mag maar een <code>label</code> element hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F17']\n        },\n        '4.1.1': {\n          techniques: ['F17']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LabelMustBeUnique;\n\n},{\"Case\":33,\"DOM\":34}],354:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar LabelMustNotBeEmpty = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'label',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Labels must contain text',\n      nl: 'Labels moeten tekst bevatten'\n    },\n    description: {\n      en: 'Labels in forms must contain readable text that describes the target form element.',\n      nl: 'Labels in formulieren moeten leesbare tekst bevatten die het formulierelement beschrijven.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LabelMustNotBeEmpty;\n\n},{\"PlaceholderComponent\":17}],355:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LabelsAreAssignedToAnInput = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('label', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!DOM.getAttribute(element, 'for')) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          var forAttr = DOM.getAttribute(element, 'for');\n          var forElement = DOM.scry('#' + forAttr, scope)[0];\n          if (forElement && DOM.is(forElement, ':input')) {\n            _case.set({\n              status: 'passed'\n            });\n          } else {\n            _case.set({\n              status: 'failed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All labels should be associated with an input',\n      nl: 'Alle labels moeten horen bij een invoerveld'\n    },\n    description: {\n      en: 'All <code>label</code> elements should be assigned to an input item, and should have a <em>for</em> attribute which equals the <em>id</em> attribute of a form element.',\n      nl: 'Alle <code>label</code>-elementen moeten horen bij een invoerveld, en moeten een een <em>for</em>-attribuut hebben dat hetzelfde is als het <em>id</em>-attribuut van een formulierelement.'\n    },\n    guidelines: [],\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LabelsAreAssignedToAnInput;\n\n},{\"Case\":33,\"DOM\":34}],356:[function(require,module,exports){\n'use strict';\n\nvar GetTextContentsComponent = require('GetTextContentsComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageDirAttributeIsUsed = {\n  run: function run(test) {\n\n    var textDirection = LanguageComponent.textDirection;\n\n    function countDirAttributes(element) {\n      var currentDirection = DOM.getAttribute(element, 'dir');\n      if (!currentDirection) {\n        var dirScope = DOM.parents(element).find(function (parent) {\n          return DOM.hasAttribute(parent, 'dir');\n        });\n        var parentDir = dirScope && DOM.getAttribute(dirScope, 'dir');\n        currentDirection = parentDir || currentDirection;\n      }\n      if (typeof currentDirection === 'string') {\n        currentDirection = currentDirection.toLowerCase();\n      }\n      if (typeof textDirection[currentDirection] === 'undefined') {\n        currentDirection = 'ltr';\n      }\n      var oppositeDirection = currentDirection === 'ltr' ? 'rtl' : 'ltr';\n      var text = GetTextContentsComponent(element);\n      var textMatches = text.match(textDirection[oppositeDirection]);\n      if (!textMatches) {\n        return;\n      }\n      var matches = textMatches.length;\n      DOM.scry('[dir=' + oppositeDirection + ']', element).forEach(function () {\n        var childMatches = element.textContent.match(textDirection[oppositeDirection]);\n        if (childMatches) {\n          matches -= childMatches.length;\n        }\n      });\n\n      var _case = test.add(Case({\n        element: element\n      }));\n\n      _case.set({\n        status: matches > 0 ? 'failed' : 'passed'\n      });\n    }\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(countDirAttributes);\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use the dir attribute when the language direction changes',\n      nl: 'Gebruik het dir-attribuut als de richting van de taal verandert'\n    },\n    description: {\n      en: 'When there are nested directional changes in text, use an inline element with a <code>dir</code> attribute to indicate direction.',\n      nl: 'Gebruik een inline element met een <code>dir</code>-attribuut om richting aan te geven wanneer er geneste richtingsveranderingen in de tekst zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['H56']\n        }\n      }\n    },\n    tags: ['language', 'content']\n  }\n};\nmodule.exports = LanguageDirAttributeIsUsed;\n\n},{\"Case\":33,\"DOM\":34,\"GetTextContentsComponent\":7,\"LanguageComponent\":15,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],357:[function(require,module,exports){\n'use strict';\n\nvar GetTextContentsComponent = require('GetTextContentsComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageDirectionPunctuation = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var punctuation = {};\n      var punctuationRegex = /[\\u2000-\\u206F]|[!\"#$%&'\\(\\)\\]\\[\\*+,\\-.\\/:;<=>?@^_`{|}~]/gi;\n      var currentDirection = DOM.getAttribute(scope, 'dir') ? DOM.getAttribute(scope, 'dir').toLowerCase() : 'ltr';\n      var oppositeDirection = currentDirection === 'ltr' ? 'rtl' : 'ltr';\n      var textDirection = LanguageComponent.textDirection;\n\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        if (DOM.getAttribute(element, 'dir')) {\n          currentDirection = DOM.getAttribute(element, 'dir').toLowerCase();\n        } else {\n          var dirScope = DOM.parents(element).find(function (parent) {\n            return DOM.hasAttribute(parent, 'dir');\n          });\n          var dir = DOM.getAttribute(dirScope, 'dir');\n          currentDirection = dir || currentDirection;\n        }\n        if (typeof textDirection[currentDirection] === 'undefined') {\n          currentDirection = 'ltr';\n        }\n        oppositeDirection = currentDirection === 'ltr' ? 'rtl' : 'ltr';\n        var text = GetTextContentsComponent(element);\n        var matches = text.match(textDirection[oppositeDirection]);\n        var _case = test.add(Case({\n          element: element\n        }));\n        if (!matches) {\n          _case.set({ status: 'inapplicable' });\n          return;\n        }\n        var first = text.search(textDirection[oppositeDirection]);\n        var last = text.lastIndexOf(matches.pop());\n        while (punctuation = punctuationRegex.exec(text)) {\n          if (punctuation.index === first - 1 || punctuation.index === last + 1) {\n            _case.set({ status: 'failed' });\n            return;\n          }\n        }\n        _case.set({ status: 'passed' });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Place punctuation around language direction changes in the right order',\n      nl: 'Zet interpunctie bij richtingsveranderingen in taal in de juiste volgorde'\n    },\n    description: {\n      en: 'If punctuation is used around a change in language direction, ensure the punctuation appears in the correct place.',\n      nl: 'Als er interpunctie staat bij een richtingsverandering in de taal, zorg dat deze dan op de goede plek staat.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['G57']\n        }\n      }\n    },\n    tags: ['language', 'content']\n  }\n};\nmodule.exports = LanguageDirectionPunctuation;\n\n},{\"Case\":33,\"DOM\":34,\"GetTextContentsComponent\":7,\"LanguageComponent\":15,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],358:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageUnicodeDirection = {\n  run: function run(test) {\n    var textDirection = LanguageComponent.textDirection;\n    var textDirectionChanges = LanguageComponent.textDirectionChanges;\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        var $el = element;\n        var text = DOM.text($el).trim();\n        var otherDirection = text.substr(0, 1).search(textDirection.ltr) !== -1 ? 'rtl' : 'ltr';\n        if (text.search(textDirection[otherDirection]) === -1) {\n          _case.set({ status: 'inapplicable' });\n        } else {\n          if (text.search(textDirectionChanges[otherDirection]) !== -1) {\n            _case.set({ status: 'passed' });\n          } else {\n            _case.set({ status: 'failed' });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Use the unicode language direction',\n      nl: 'Gebruik de unicode taalrichting'\n    },\n    description: {\n      en: 'When there are nested directional changes in language, use unicode RTL/LTR characters.',\n      nl: 'Gebruik de unicode RTL/LTR afkortingen als er geneste richtingsveranderingen in de taal zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['H34']\n        }\n      }\n    },\n    tags: ['language', 'content']\n  }\n};\nmodule.exports = LanguageUnicodeDirection;\n\n},{\"Case\":33,\"DOM\":34,\"LanguageComponent\":15,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],359:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar LegendTextNotEmpty = {\n  run: function run(test) {\n\n    var selector = 'legend';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (DOM.text(element).trim().length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Legend text must not contain just whitespace',\n      nl: 'Legend-tekst moet ingevuld zijn'\n    },\n    description: {\n      en: 'If a <code>legend</code> element is used in a fieldset, the <code>legend</code> should not contain empty text.',\n      nl: 'Als een <code>legend</code>-element wordt gebruikt in een fieldset, moet de <code>legend</code> ingevuld zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H71']\n        },\n        '2.4.6': {\n          techniques: ['G131']\n        },\n        '3.3.2': {\n          techniques: ['H71']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LegendTextNotEmpty;\n\n},{\"Case\":33,\"DOM\":34}],360:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar LegendTextNotPlaceholder = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'legend',\n      content: 'true',\n      emtpy: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: '\\\"Legend\\\" text must not contain placeholder text',\n      nl: '\\\"Legend\\\"-tekst moet geen placeholdertekst bevatten'\n    },\n    description: {\n      en: 'If a <code>legend</code> element is used in a fieldset, the <code>legend</code> should not contain useless placeholder text like \\\"form\\\" or \\\"field\\\".',\n      nl: 'Als een <code>legend</code>-element wordt gebruikt in een fieldset, moet de <code>legend</code> geen placeholdertekst bevatten zoals \\\"form\\\" of \\\"field\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H71']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.4.6': {\n          techniques: ['G131']\n        },\n        '3.3.2': {\n          techniques: ['H71']\n        },\n        '4.1.3': {\n          techniques: ['H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = LegendTextNotPlaceholder;\n\n},{\"PlaceholderComponent\":17}],361:[function(require,module,exports){\n'use strict';\n\n/**\n * @todo Needs refinement.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar LiDontUseImageForBullet = {\n  run: function run(test) {\n\n    var selector = 'li';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n          var hasImgChild = DOM.children(element).some(function (child) {\n            return DOM.is(child, 'img');\n          });\n          if (hasImgChild) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    guidelines: [],\n    tags: ['list', 'content']\n  }\n};\nmodule.exports = LiDontUseImageForBullet;\n\n},{\"Case\":33,\"DOM\":34}],362:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableHeadersComponent = require('TableHeadersComponent');\nvar LinkHasAUniqueContext = {\n  run: function run(test) {\n\n    var blockStyle = ['block', 'flex', 'list-item', 'table', 'table-caption', 'table-cell'];\n\n    function getLinkSentence(link) {\n      // Find the closest block-like element\n      var block = link;\n      var text = simplifyText(DOM.text(link));\n\n      while (!DOM.is(block, 'body, html') && blockStyle.indexOf(DOM.getComputedStyle(block, 'display')) === -1) {\n        block = block.parentNode;\n      }\n\n      var sentences = DOM.text(block).match(/[^\\.!\\?]+[\\.!\\?]+/g);\n      if (sentences === null) {\n        sentences = [DOM.text(block)];\n      }\n\n      for (var i = 0; i < sentences.length; i += 1) {\n        if (simplifyText(sentences[i]).indexOf(text) !== -1) {\n          return sentences[i].trim();\n        }\n      }\n    }\n\n    function simplifyText(text) {\n      var tmp = text.match(/\\w+/g);\n      if (tmp !== null) {\n        text = tmp.join(' ');\n      }\n      return text.toLowerCase();\n    }\n\n    function txtNotAlike(a, b) {\n      return simplifyText('' + a) !== simplifyText('' + b);\n    }\n\n    function shareContext(linkA, linkB) {\n\n      if (linkA.href === linkB.href) {\n        return false;\n      } else if (txtNotAlike(linkA.title, linkB.title)) {\n        return false;\n      }\n\n      // Find the nearest list item, paragraph or table cell of both items\n      var selector = 'p, li, dd, dt, td, th';\n      var linkACtxt = DOM.parents(linkA).find(function (parent) {\n        return DOM.is(parent, selector);\n      });\n      var linkBCtxt = DOM.parents(linkB).find(function (parent) {\n        return DOM.is(parent, selector);\n      });\n\n      // check if they are different\n      if (linkACtxt.length !== 0 && linkBCtxt.length !== 0 && txtNotAlike(getLinkText(linkACtxt), getLinkText(linkBCtxt))) {\n        return false;\n      }\n\n      // If one is a table cell and the other isn't, allow it\n      if (DOM.is(linkACtxt, 'td, th') && !DOM.is(linkBCtxt, 'td, th')) {\n        return false;\n      } else if (DOM.is(linkACtxt, 'td, th') && DOM.is(linkBCtxt, 'td, th')) {\n        var headerDiff = false;\n        var headersA = [];\n\n        // Make a list with the simplified text of link A\n        TableHeadersComponent.tableHeaders(linkACtxt).forEach(function (element) {\n          headersA.push(simplifyText(element.innerText));\n        });\n\n        // Compare it to the header context of link B\n        TableHeadersComponent.tableHeaders(linkBCtxt).forEach(function (element) {\n          var text = simplifyText(element.innerText);\n          var pos = headersA.indexOf(text);\n          // Link B has something not part of link A's context, pass\n          if (pos === -1) {\n            headerDiff = true;\n          }\n          // Remove items part of both header lists\n          else {\n              headersA.splice(pos, 1);\n            }\n        });\n        // Pass if A or B had a header not part of the other.\n        if (headerDiff || headersA.length > 0) {\n          return false;\n        }\n      }\n\n      if (txtNotAlike(getLinkSentence(linkA), getLinkSentence(linkB))) {\n        return false;\n      }\n\n      return true;\n    }\n\n    /**\n     * Get the text value of the link, including alt attributes\n     * @param  {jQuery} link\n     * @return {string}\n     */\n    function getLinkText(link) {\n      var text = link.innerText;\n      DOM.scry('img[alt]', link).forEach(function (element) {\n        text += ' ' + element.alt.trim();\n      });\n      return simplifyText(text);\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var links = DOM.scry('a[href]', scope).filter(function (element) {\n        return DOM.isVisible(element);\n      });\n      var linkMap = {};\n\n      if (links.length === 0) {\n        var _case = Case({\n          element: scope,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n      }\n\n      // Make a map with the link text as key and an array of links with\n      // that link text as it's value\n      links.forEach(function (element) {\n        var text = getLinkText(element);\n        if (typeof linkMap[text] === 'undefined') {\n          linkMap[text] = [];\n        }\n        linkMap[text].push(element);\n      });\n\n      // Iterate over each item in the linkMap\n      for (var linkText in linkMap) {\n        if (linkMap.hasOwnProperty(linkText)) {\n          links = linkMap[linkText];\n        } else {\n          continue;\n        }\n\n        // Link text is not unique, so the context should be checked\n        while (links.length > 1) {\n          var linkA = links.pop();\n          var linkAFailed = false;\n\n          for (var i = links.length - 1; i >= 0; i -= 1) {\n            var linkB = links[i];\n            if (shareContext(linkA, linkB)) {\n              linkAFailed = true;\n              links.splice(i, 1);\n              test.add(Case({\n                element: linkB,\n                status: 'failed'\n              }));\n            }\n          }\n          test.add(Case({\n            element: linkA,\n            status: linkAFailed ? 'failed' : 'passed'\n          }));\n        }\n\n        // The link text is unique, pass\n        if (links.length === 1) {\n          test.add(Case({\n            element: links[0],\n            status: 'passed'\n          }));\n        }\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should have a unique context',\n      nl: 'Links moeten een unieke context hebben'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = LinkHasAUniqueContext;\n\n},{\"Case\":33,\"DOM\":34,\"TableHeadersComponent\":26}],363:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ListNotUsedForFormatting = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('ol, ul', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.scry('li', element).length < 2) {\n          _case.set({\n            status: 'failed'\n          });\n        } else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Lists should not be used for formatting',\n      nl: 'Lijsten worden niet gebruikt voor opmaak'\n    },\n    description: {\n      en: 'Lists like <code>ul</code> and <code>ol</code> are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed.',\n      nl: 'Lijsten zoals <code>ul</code> en <code>ol</code> zijn bedoeld om gestructureerde lijsten te maken. Ze moeten niet gebruikt worden om text op te maken. Controleer of deze lijst echt bedoeld is als lijst of om tekst op te maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['F1']\n        }\n      }\n    },\n    tags: ['list', 'content']\n  }\n};\nmodule.exports = ListNotUsedForFormatting;\n\n},{\"Case\":33,\"DOM\":34}],364:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ListOfLinksUseList = {\n  run: function run(test) {\n    var unreadableText = /(♦|›|»|‣|▶|.|◦|>|✓|◽|•|—|◾|\\||\\*|&bull;|&#8226;)/g;\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        // Only test if there's another a tag.\n        var next = DOM.next(element);\n        if (next && DOM.is(next, 'a')) {\n          var nextText = element.nextSibling.wholeText.replace(unreadableText, '');\n          if (!DOM.is(element.parentElement, 'li') && IsUnreadable(nextText)) {\n            _case.set({\n              status: 'failed'\n            });\n          } else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A list of links separated by non-readable characters should be in an ul or ol',\n      nl: 'Een lijst van links die worden gescheiden door onleesbare tekens moeten in een bulleted of genummerde lijst staan'\n    },\n    description: {\n      en: 'A list of links without separation between them should be placed in an ol or ul element.',\n      nl: 'Een lijst van links die niet duidelijk gescheiden zijn moeten in een bulleted of genummerde lijst staan.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H48']\n        }\n      }\n    },\n    tags: ['link', 'content']\n  }\n};\nmodule.exports = ListOfLinksUseList;\n\n},{\"Case\":33,\"DOM\":34,\"IsUnreadable\":12}],365:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar MarqueeIsNotUsed = {\n  run: function run(test) {\n\n    var selector = 'marquee';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"marquee\\\" tag should not be used',\n      nl: 'De \\\"marquee\\\"-tag wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>marquee</code> element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text.',\n      nl: 'Het <code>marquee</code>-element is moeilijk te lezen voor gebruikers en is geen standaard HTML-element. Gebruik een andere manier om aan te duiden dat het belangrijke content is.'\n    },\n    guidelines: [],\n    tags: ['deprecated', 'content']\n  }\n};\nmodule.exports = MarqueeIsNotUsed;\n\n},{\"Case\":33,\"DOM\":34}],366:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar NewWindowIsOpened = {\n  run: function run(test) {\n\n    var _case;\n\n    window.addEventListener('click', function (event) {\n      event.preventDefault();\n    });\n\n    window.open = function (event) {\n      test.forEach(function (_case) {\n        var href = _case.get('element').href;\n        if (href.indexOf(event) > -1) {\n          _case.set('status', 'failed');\n        }\n      });\n    };\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        // Save a reference to this clicked tag.\n        _case = Case({\n          element: element\n        });\n        test.add(_case);\n      });\n    });\n    test.forEach(function (_case) {\n      var element = _case.get('element');\n      if (element && element.click) {\n        element.click();\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A link should not open a new window',\n      nl: 'Een link opent geen nieuw scherm'\n    },\n    description: {\n      en: 'Avoid confusion that may be caused by the appearance of new windows that were not requested by the user.',\n      nl: 'Voorkom verwarring die veroorzaakt wordt door het openen van nieuwe schermen die de gebruiker niet verwacht.'\n    },\n    guidelines: {\n      wcag: {\n        '2.0.0': {\n          techniques: ['H83']\n        }\n      }\n    },\n    tags: ['javascript', 'html']\n  }\n};\nmodule.exports = NewWindowIsOpened;\n\n},{\"Case\":33,\"DOM\":34}],367:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ObjectMustContainText = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'object',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects must contain their text equivalents',\n      nl: 'Objecten moeten hun tekstuele equivalent bevatten'\n    },\n    description: {\n      en: 'All <code>object</code> elements should contain a text equivalent if the object cannot be rendered.',\n      nl: 'Alle <code>object</code>-elementen moeten een tekstequivalent bevatten in het geval het object niet getoond kan worden.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['FLASH1', 'H27']\n        }\n      }\n    },\n    tags: ['objects', 'content']\n  }\n};\nmodule.exports = ObjectMustContainText;\n\n},{\"PlaceholderComponent\":17}],368:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ObjectMustHaveEmbed = {\n  run: function run(test) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasEmbed = DOM.scry('embed', element).length > 0;\n\n          // If a test is defined, then use it\n          if (hasEmbed) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Every object should contain an \\\"embed\\\" element',\n      nl: 'Elk object moet een \\\"embed\\\"-element bevatten'\n    },\n    description: {\n      en: 'Every <code>object</code> element must also contain an <code>embed</code> element.',\n      nl: 'Elk <code>object</code>-element moet ook een \\\"embed\\\"-element bevatten.'\n    },\n    guidelines: [],\n    tags: ['objects', 'content']\n  }\n};\nmodule.exports = ObjectMustHaveEmbed;\n\n},{\"Case\":33,\"DOM\":34}],369:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar ObjectMustHaveTitle = {\n  run: function run(test) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasTitle = element.hasAttribute('title');\n\n          // If a test is defined, then use it\n          if (hasTitle) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects should have a title attribute',\n      nl: 'Objecten moeten een titelattribuut hebben'\n    },\n    description: {\n      en: 'All <code>object</code> elements should contain a \\\"title\\\" attribute.',\n      nl: 'Alle <code>object</code>-elementen moeten een \\\"titel\\\"-attribuut bevatten.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H27']\n        }\n      }\n    },\n    tags: ['objects', 'content']\n  }\n};\nmodule.exports = ObjectMustHaveTitle;\n\n},{\"Case\":33,\"DOM\":34}],370:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ObjectMustHaveValidTitle = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'object',\n      attribute: 'title',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects must not have an empty title attribute',\n      nl: 'Objecten hebben geen leeg titelattribuut'\n    },\n    description: {\n      en: 'All <code>object</code> elements should have a \\\"title\\\" attribute which is not empty.',\n      nl: 'All <code>object</code>-elementen hebben een \\\"titel\\\"-attribuut dat gevuld is.'\n    },\n    guidelines: [],\n    tags: ['objects', 'content']\n  }\n};\nmodule.exports = ObjectMustHaveValidTitle;\n\n},{\"PlaceholderComponent\":17}],371:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SuspectPHeaderTags = require('SuspectPHeaderTags');\nvar SuspectPCSSStyles = require('SuspectPCSSStyles');\nvar PNotUsedAsHeader = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var $paragraph = element;\n\n        // If the text has a period, it is probably a sentence and not a header.\n        if (DOM.text($paragraph).search(/[\\.!:;]/) >= 1) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n        var failed = false;\n        // Look for any indication that the paragraph contains at least a full sentence\n        if (DOM.text(element).search(/[\\.!:;]/) < 1) {\n          var priorParagraph = DOM.prev($paragraph);\n          if (!priorParagraph || !DOM.is(priorParagraph, 'p')) {\n            priorParagraph = [];\n          }\n          // Checking if any of SuspectPHeaderTags has exact the same text as a paragraph.\n          SuspectPHeaderTags.forEach(function (tag) {\n            if (DOM.scry(tag, $paragraph).length) {\n              DOM.scry(tag, $paragraph).forEach(function (element) {\n                if (DOM.text(element).trim() === DOM.text($paragraph).trim()) {\n                  _case.set({\n                    status: 'failed'\n                  });\n                  failed = true;\n                }\n              });\n            }\n          });\n          // Checking if previous paragraph has a different values for style properties given in SuspectPCSSStyles.\n          if (priorParagraph.length) {\n            SuspectPCSSStyles.forEach(function (cssProperty) {\n              if (DOM.getComputedStyle($paragraph, cssProperty) !== DOM.getComputedStyle(priorParagraph, cssProperty)) {\n                _case.set({\n                  status: 'failed'\n                });\n                failed = true;\n                return false; // Micro optimization - we no longer need to iterate here. jQuery css() method might be expensive.\n              }\n            });\n          }\n          if (DOM.getComputedStyle($paragraph, 'font-weight') === 'bold') {\n            _case.set({\n              status: 'failed'\n            });\n            failed = true;\n          }\n        }\n        if (!failed) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Paragraphs must not be used for headers',\n      nl: 'Alinea\\'s worden niet gebruikt als header'\n    },\n    description: {\n      en: 'Headers like <code>h1</code> - <code>h6</code> are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one.',\n      nl: 'Headers van <code>h1</code> - <code>h6</code> zijn handig voor blinde en slechtziende gebruikers om door een pagina te navigeren. Maak alinea\\'s daarom niet op zodat deze lijkt op een header. Dit werkt verwarrend.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['G141', 'H42']\n        },\n        '2.4.10': {\n          techniques: ['G141']\n        }\n      }\n    },\n    tags: ['header', 'content']\n  }\n};\nmodule.exports = PNotUsedAsHeader;\n\n},{\"Case\":33,\"DOM\":34,\"SuspectPCSSStyles\":22,\"SuspectPHeaderTags\":23}],372:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar PasswordHasLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"password\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All password input elements should have a corresponding label',\n      nl: 'Alle paswoordinvoerelementen hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"password\\\"should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen van het type \\\"paswoord\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: ['n'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = PasswordHasLabel;\n\n},{\"LabelComponent\":13}],373:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar PreShouldNotBeUsedForTabularLayout = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('pre', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var rows = DOM.text(element).split(/[\\n\\r]+/);\n        _case.set({\n          status: rows.length > 1 && DOM.text(element).search(/\\t/) > -1 ? 'failed' : 'passed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Pre elements should not be used for tabular data',\n      nl: 'Pre-elementen worden niet gebruikt om data als tabel te rangschikken'\n    },\n    description: {\n      en: 'If a <code>pre</code> element is used for tabular data, change the data to use a well-formed table.',\n      nl: 'Als een <code>pre</code>-element wordt gebruikt om data als tabel te rangschikken, verander de data dan zodat je een echte tabel kunt maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F33', 'F34', 'F48']\n        },\n        '1.3.2': {\n          techniques: ['F33', 'F34']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = PreShouldNotBeUsedForTabularLayout;\n\n},{\"Case\":33,\"DOM\":34}],374:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar RadioHasLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'input[type=\"radio\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"radio\\\" input elements have a corresponding label',\n      nl: 'Alle invoerelementen van het type \\\"radio\\\" hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"radio\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen van het \\\"radio\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: ['n'],\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = RadioHasLabel;\n\n},{\"LabelComponent\":13}],375:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnclickRequiresOnKeypress = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onclick]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'onclick'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has an \\\"onclick\\\" attribute it should also have an \\\"onkeypress\\\" attribute',\n      nl: 'Als een element een \\\"onclick\\\"-attribuut heeft, moet het ook een \\\"onkeypress\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has an \\\"onclick\\\" attribute it should also have an \\\"onkeypress\\\" attribute',\n      nl: 'Als een element een \\\"onclick\\\"-attribuut heeft, moet het ook een \\\"onkeypress\\\"-attribuut hebben'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnclickRequiresOnKeypress;\n\n},{\"EventComponent\":6}],376:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOndblclickRequiresOnKeypress = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[ondblclick]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'ondblclick'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any element with an \\\"ondblclick\\\" attribute should have a keyboard-related action as well',\n      nl: 'Elk element met een \\\"ondblclick\\\"-attribuut moet een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord'\n    },\n    description: {\n      en: 'If an element has an \\\"ondblclick\\\" attribute, it should also have a keyboard-related action.',\n      nl: 'Als een element een \\\"ondblclick\\\"-attribuut heeft, moet het ook een actie bevatten die kan worden uitgevoerd met een toetsenbord.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOndblclickRequiresOnKeypress;\n\n},{\"EventComponent\":6}],377:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmousedownRequiresOnKeypress = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmousedown]',\n      correspondingEvent: 'onkeydown',\n      searchEvent: 'onmousedown'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"mousedown\\\" attribute it should also have an \\\"onkeydown\\\" attribute',\n      nl: 'Als een element een \\\"mousedown\\\"-attribuut heeft moet het ook een \\\"onkeydown\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"mousedown\\\" attribute it should also have an \\\"onkeydown\\\" attribute.',\n      nl: 'Als een element een \\\"mousedown\\\"-attribuut heeft moet het ook een \\\"onkeydown\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmousedownRequiresOnKeypress;\n\n},{\"EventComponent\":6}],378:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmousemove = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmousemove]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'onmousemove'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any element with an \\\"onmousemove\\\" attribute should have a keyboard-related action as well',\n      nl: 'Elk element met een \\\"onmousemove\\\"-attribuut moet een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord'\n    },\n    description: {\n      en: 'If an element has an \\\"onmousemove\\\" attribute it should have a keyboard-related action as well.',\n      nl: 'Als een element een \\\"onmousemove\\\"-attribuut heeft, moet het een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmousemove;\n\n},{\"EventComponent\":6}],379:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseoutHasOnmouseblur = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmouseout]',\n      correspondingEvent: 'onblur',\n      searchEvent: 'onmouseout'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseout\\\" attribute it should also have an \\\"onblur\\\" attribute',\n      nl: 'Als een element een \\\"onmouseout\\\"-attribuut heeft, moet het ook een \\\"onblur\\\" attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseout\\\" attribute it should also have an \\\"onblur\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseout\\\"-attribuut heeft, moet het ook een \\\"onblur\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmouseoutHasOnmouseblur;\n\n},{\"EventComponent\":6}],380:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseoverHasOnfocus = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmouseover]',\n      correspondingEvent: 'onfocus',\n      searchEvent: 'onmouseover'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseover\\\" attribute it should also have an \\\"onfocus\\\" attribute',\n      nl: 'Als een element een \\\"onmouseover\\\"-attribuut heeft, moet het ook een \\\"onfocus\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseover\\\" attribute it should also have an \\\"onfocus\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseover\\\"-attribuut heeft, moet het ook een \\\"onfocus\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmouseoverHasOnfocus;\n\n},{\"EventComponent\":6}],381:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseupHasOnkeyup = {\n  run: function run(test, options) {\n    options = options || {\n      selector: '[onmouseup]',\n      correspondingEvent: 'onkeyup',\n      searchEvent: 'onmouseup'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseup\\\" attribute it should also have an \\\"onkeyup\\\" attribute',\n      nl: 'Als een element een \\\"onmouseup\\\"-attribuut heeft, moet het ook een \\\"onkeyup\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseup\\\" attribute it should also have an \\\"onkeyup\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseup\\\"-attribuut heeft, moet het ook een \\\"onkeyup\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: ['l'],\n      wcag: {\n        '2.1.1': {\n          techniques: ['G90', 'SCR2', 'SCR20']\n        },\n        '2.1.3': {\n          techniques: ['G90', 'SCR20']\n        }\n      }\n    },\n    tags: ['javascript']\n  }\n};\nmodule.exports = ScriptOnmouseupHasOnkeyup;\n\n},{\"EventComponent\":6}],382:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar SelectHasAssociatedLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'select'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All select elements have an explicitly associated label',\n      nl: 'Alle select-elementen hebben een expliciet bijbehorend label'\n    },\n    description: {\n      en: 'All <code>select</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>select</code>-elementen moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = SelectHasAssociatedLabel;\n\n},{\"LabelComponent\":13}],383:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar HasEventListenerComponent = require('HasEventListenerComponent');\nvar SelectJumpMenu = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('select', scope).forEach(function (element) {\n        var hasChangeListener = HasEventListenerComponent(element, 'change');\n        if (hasChangeListener) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Select jump menus should jump on button press, not on state change',\n      nl: 'Select jump menu\\'s moeten springen wanneer de knop wordt gebruikt, niet bij statusverandering'\n    },\n    description: {\n      en: 'If you wish to use a \\'Jump\\' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select element.',\n      nl: 'Als je een \\'Jump\\'-menu wilt gebruiken met een select item dat gebruikers naar een andere pagina verwijst, moet de verwijzing plaatsvinden als de gebruiker een knop gebruikt en niet op het moment dat het select element verandert.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.2': {\n          techniques: ['F37']\n        },\n        '3.2.5': {\n          techniques: ['F9']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = SelectJumpMenu;\n\n},{\"Case\":33,\"DOM\":34,\"HasEventListenerComponent\":8}],384:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SiteMapStringsComponent = require('SiteMapStringsComponent');\n\nvar SiteMap = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a[href]', scope).forEach(function (element) {\n        var set = false;\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var text = DOM.text(element).toLowerCase();\n        SiteMapStringsComponent.forEach(function (str) {\n          if (text.search(str) > -1) {\n            set = true;\n            return;\n          }\n        });\n        if (set === false) {\n          _case.set({\n            status: 'failed'\n          });\n          return;\n        }\n\n        if (set) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Websites must have a site map',\n      nl: 'Websites moeten een sitemap hebben'\n    },\n    description: {\n      en: 'Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices.',\n      nl: 'Elke website moet een pagina hebben waarop een sitemap staat of een andere methode om op de site te navigeren vanaf een pagina. Dit spaart gebruikers die hulpmiddelen gebruiken tijd.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.5': {\n          techniques: ['G63']\n        },\n        '2.4.8': {\n          techniques: ['G63']\n        }\n      }\n    },\n    tags: ['document']\n  }\n};\n\nmodule.exports = SiteMap;\n\n},{\"Case\":33,\"DOM\":34,\"SiteMapStringsComponent\":20}],385:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\n\nvar SkipContentStringsComponent = require('SkipContentStringsComponent');\n\nvar SkipToContentLinkProvided = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var $local = scope;\n      var skipLinkFound = false;\n\n      DOM.scry('a[href*=\"#\"]', $local).forEach(function (element) {\n        if (skipLinkFound) {\n          return;\n        }\n        var $link = element;\n\n        var fragment = DOM.getAttribute($link, 'href').split('#').pop();\n        var $target = DOM.scry('#' + fragment, $local);\n        var strs = SkipContentStringsComponent.slice();\n        while (!skipLinkFound && strs.length) {\n          var str = strs.pop();\n          if (DOM.text($link).search(str) > -1 && $target.length) {\n            $link.focus();\n            if (DOM.isVisible($link)) {\n              skipLinkFound = true;\n              test.add(Case({\n                element: $link,\n                status: 'passed'\n              }));\n              return;\n            }\n            $link.blur();\n          }\n        }\n      });\n      if (!skipLinkFound) {\n        test.add(Case({\n          status: 'failed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'A \\\"skip to content\\\" link should exist as one of the first links on the page',\n      nl: 'Er moet een \\\"skip to content\\\"-link zijn als een van de eerste links op de pagina'\n    },\n    description: {\n      en: 'A link reading \\\"skip to content\\\" should be the first link on a page.',\n      nl: 'Er moet een link zijn om naar de content te navigeren als een van de eerste links op de pagina.'\n    },\n    guidelines: {\n      508: ['o'],\n      wcag: {\n        '2.4.1': {\n          techniques: ['G1']\n        }\n      }\n    },\n    tags: ['document']\n  }\n};\nmodule.exports = SkipToContentLinkProvided;\n\n},{\"Case\":33,\"DOM\":34,\"SkipContentStringsComponent\":21}],386:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar SvgContainsTitle = {\n  run: function run(test) {\n\n    var selector = 'svg';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasTitle = DOM.scry('title', element).length === 1;\n\n          // If a test is defined, then use it\n          if (hasTitle) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Inline SVG should use Title elements',\n      nl: 'Inline SVG moet titelelementen gebruiken'\n    },\n    description: {\n      en: 'Any inline SVG image should have an embedded <code>title</code> element.',\n      nl: 'Elke inline SVG-afbeelding moet een ingebed <code>title</code>-element hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['F65']\n        }\n      }\n    },\n    tags: ['image', 'svg', 'content']\n  }\n};\nmodule.exports = SvgContainsTitle;\n\n},{\"Case\":33,\"DOM\":34}],387:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TabIndexFollowsLogicalOrder = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      var index = 0;\n      DOM.scry('[tabindex]', scope).forEach(function (element) {\n        var $el = element;\n        var tabindex = DOM.getAttribute($el, 'tabindex');\n        if (parseInt(tabindex, 10) >= 0 && parseInt(tabindex, 10) !== index + 1) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n        index++;\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The tab order of a document is logical',\n      nl: 'De tabvolgorde van een document is logisch'\n    },\n    description: {\n      en: 'Check that the tab order of a page is logical.',\n      nl: 'Controleer of de tabvolgorde van een pagina logisch is.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.3': {\n          techniques: ['H4']\n        }\n      }\n    },\n    tags: ['document']\n  }\n};\nmodule.exports = TabIndexFollowsLogicalOrder;\n\n},{\"Case\":33,\"DOM\":34}],388:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableDataShouldHaveTh = {\n  run: function run(test) {\n\n    var selector = 'table';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasHeading = DOM.scry('th', element).length > 0;\n          // If a test is defined, then use it\n          if (hasHeading) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Data tables should contain \\\"th\\\" elements',\n      nl: 'Datatabellen moeten \\\"th\\\"-elementen bevatten'\n    },\n    description: {\n      en: 'Tables which contain data (as opposed to layout tables) should contain <code>th</code> elements to mark headers for screen readers and enhance the structure of the document.',\n      nl: 'Tabellen die data bevatten (in tegenstelling tot lay-out tabellen) moeten <code>th</code>-elementen bevatten om koppen te markeren voor schermlezers en om de structuur van het document te verbeteren.'\n    },\n    guidelines: {\n      508: ['g'],\n      wcag: {\n        '1.3.1': {\n          techniques: ['F91']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableDataShouldHaveTh;\n\n},{\"Case\":33,\"DOM\":34}],389:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableLayoutDataShouldNotHaveTh = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        if (DOM.scry('th', element).length !== 0) {\n          if (!IsDataTableComponent(element)) {\n            _case.set({\n              status: 'failed'\n            });\n          } else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        } else {\n          _case.set({\n            status: 'inapplicable'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Layout tables should not contain \\\"th\\\" elements',\n      nl: 'Lay-out tabellen bevatten geen \\\"th\\\"-elementen'\n    },\n    description: {\n      en: 'Tables which are used purely for layout (as opposed to data tables), <strong>should not</strong> contain <code>th</code> elements, which would make the table appear to be a data table.',\n      nl: 'Tabellen die alleen voor lay-out worden gebruikt (in tegenstelling tot datatabellen), moeten geen <code>th</code>-elementen bevatten, omdat deze de indruk wekken dat het een datatabel betreft.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F46']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableLayoutDataShouldNotHaveTh;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],390:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableLayoutHasNoCaption = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (DOM.scry('caption', element).length) {\n          if (!IsDataTableComponent(element)) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          } else {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'inapplicable'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All tables used for layout have no \\\"caption\\\" element',\n      nl: 'Alle tabellen die alleen voor lay-out worden gebruikt hebben geen \\\"caption\\\"-element'\n    },\n    description: {\n      en: 'If a table contains no data, and is used simply for layout, then it should not contain a <code>caption</code> element.',\n      nl: 'Als een tabel geen data bevat en alle voor lay-out wordt gebruikt, moet hij geen <code>caption</code>-element krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F46']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableLayoutHasNoCaption;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],391:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar TableLayoutHasNoSummary = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        if (!IsDataTableComponent(element) && !IsUnreadable(DOM.getAttribute(element, 'summary'))) {\n          _case.set({ status: 'failed' });\n        } else {\n          _case.set({ status: 'passed' });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All tables used for layout have no summary or an empty summary',\n      nl: 'Alle tabellen die alleen voor lay-out worden gebruikt hebben geen samenvatting'\n    },\n    description: {\n      en: 'If a table contains no data, and is used simply for layout, then it should not have a \\\"summary\\\" attribute.',\n      nl: 'Als een tabel geen data bevat en alleen voor lay-out wordt gebruikt, moet hij geen \\\"summary\\\"-attribuut krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F46']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableLayoutHasNoSummary;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11,\"IsUnreadable\":12}],392:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableLayoutMakesSenseLinearized = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (!IsDataTableComponent(element)) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All tables used for layout should make sense when removed',\n      nl: 'Als tabellen voor lay-out worden gebruikt moet de pagina nog duidelijk blijven als de tabel wordt verwijderd'\n    },\n    description: {\n      en: 'If a <code>table</code> element is used for layout purposes only, then the content of the table should make sense if the table is linearized.',\n      nl: 'Als een <code>table</code>-element alleen voor lay-out-doeleinden wordt gebruikt, moet de inhoud van de tabel nog steeds duidelijk zijn als de tabel wordt verwijderd.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['G57']\n        },\n        '4.1.1': {\n          techniques: ['F49']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableLayoutMakesSenseLinearized;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],393:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableNotUsedForLayout = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (!IsDataTableComponent(element)) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Tables should not be used for layout',\n      nl: 'Tabellen moet niet worden gebruikt voor lay-out'\n    },\n    description: {\n      en: 'Tables are for data, not for creating a page layout. Consider using standard HTML and CSS techniques instead.',\n      nl: 'Tabellen zijn voor data, niet om een pagina op te maken. Gebruik hiervoor HTML en CSS.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['F49']\n        }\n      }\n    },\n    tags: ['table', 'layout', 'content']\n  }\n};\nmodule.exports = TableNotUsedForLayout;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],394:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableShouldUseHeaderIDs = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        var $table = element;\n        var tableFailed = false;\n        if (IsDataTableComponent($table)) {\n          DOM.scry('th', $table).forEach(function (element) {\n            if (!tableFailed && !DOM.getAttribute(element, 'id')) {\n              tableFailed = true;\n              test.add(Case({\n                element: $table,\n                status: 'failed'\n              }));\n            }\n          });\n          if (!tableFailed) {\n            DOM.scry('td[header]', $table).forEach(function (element) {\n              if (!tableFailed) {\n                DOM.getAttribute(element, 'header').split(' ').forEach(function (id) {\n                  if (!DOM.scry('#' + id, $table).length) {\n                    tableFailed = true;\n                    test.add(Case({\n                      element: $table,\n                      status: 'failed'\n                    }));\n                  }\n                });\n              }\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Table cells use IDs to identify headers',\n      nl: 'Tabelcellen gebruiken IDs om koppen te identificeren'\n    },\n    description: {\n      en: 'If a table is not being used for layout, it should use IDs and header attributes to identify table headers.',\n      nl: 'Een tabel moet IDs en header-attributen gebruiken om tabelkoppen te identificeren.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H43']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableShouldUseHeaderIDs;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],395:[function(require,module,exports){\n'use strict';\n\nvar CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableSummaryDoesNotDuplicateCaption = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope).filter(function (element) {\n        return DOM.scry('caption', element).length > 0;\n      }).forEach(function (element) {\n        var caption = DOM.scry('caption', element)[0];\n        var summary = caption && DOM.getAttribute(caption, 'summary');\n        if (summary && CleanStringComponent(summary) === CleanStringComponent(DOM.text(element))) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Table \\\"summary\\\" elements should not duplicate the \\\"caption\\\" element',\n      nl: 'Tabel \\\"summary\\\"-elementen mogen niet hetzelfde zijn als het \\\"caption\\\"-element'\n    },\n    description: {\n      en: 'The summary and the caption must be different, as both provide different information. A <code>caption</code>. /code element identifies the table, while the \\\"summary\\\" attribute describes the table contents.',\n      nl: 'De samenvatting en beschrijving van een tabel moeten verschillen, want ze bieden verschillende informatie. Een <code>caption</code>-element identificeert welke tabel het betreft en het \\\"summary\\\"-attribuut beschrijft de inhoud van de tabel.'\n    },\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableSummaryDoesNotDuplicateCaption;\n\n},{\"Case\":33,\"CleanStringComponent\":3,\"DOM\":34}],396:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar TableSummaryIsEmpty = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'table',\n      attribute: 'summary',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All data tables should have a summary',\n      nl: 'Alle datatabellen moeten een samenvatting hebben'\n    },\n    description: {\n      en: 'If a table contains data, it should have a \\\"summary\\\" attribute.',\n      nl: 'Als een tabel data bevat, moet hij een \\\"summary\\\"-attribuut hebben.'\n    },\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableSummaryIsEmpty;\n\n},{\"PlaceholderComponent\":17}],397:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableSummaryIsNotTooLong = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope).forEach(function (element) {\n        if (DOM.getAttribute(element, 'summary').trim().length > 100) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableSummaryIsNotTooLong;\n\n},{\"Case\":33,\"DOM\":34}],398:[function(require,module,exports){\n'use strict';\n\nvar IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableUseColGroup = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (table) {\n        if (IsDataTableComponent(table) && !DOM.scry('colgroup', table).length) {\n          test.add(Case({\n            element: table,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Group columns using \\\"colgroup\\\" or \\\"col\\\" elements',\n      nl: 'Groepeer kolommen met \\\"colgroup\\\"- of \\\"col\\\"-elementen'\n    },\n    description: {\n      en: 'To help complex table headers make sense, use <code>colgroup</code> or <code>col</code> to group them together.',\n      nl: 'Maak complexe tabelkoppen duidelijker door \\\"colgroup\\\"- of \\\"col\\\"-elementen te gebruiken om ze te groeperen.'\n    },\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableUseColGroup;\n\n},{\"Case\":33,\"DOM\":34,\"IsDataTableComponent\":11}],399:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableUsesAbbreviationForHeader = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('th', scope).filter(function (element) {\n        var abbr = DOM.getAttribute(element, 'abbr');\n        return !abbr || abbr === '';\n      }).forEach(function (element) {\n        if (DOM.text(element).length > 20) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Table headers over 20 characters should provide an \\\"abbr\\\" attribute',\n      nl: 'Tabelkoppen met meer dan 20 tekens moeten een \\\"abbr\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'For long table headers, use an \\\"abbr\\\" attribute that is less than short (less than 20 characters long).',\n      nl: 'Gebruik een \\\"abbr\\\"-attribuut korter dan 20 tekens voor lange tabelkoppen.'\n    },\n    guidelines: [],\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableUsesAbbreviationForHeader;\n\n},{\"Case\":33,\"DOM\":34}],400:[function(require,module,exports){\n'use strict';\n\n/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableUsesCaption = {\n  run: function run(test) {\n\n    var selector = 'table';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      } else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasCaption = DOM.scry('caption', element).length === 1;\n\n          // If a test is defined, then use it\n          if (hasCaption) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Data tables should contain a \\\"caption\\\" element if not described elsewhere',\n      nl: 'Datatabellen moeten een \\\"caption\\\"-element hebben als ze nergens anders beschreven worden'\n    },\n    description: {\n      en: 'Unless otherwise described in the document, tables should contain <code>caption</code> elements to describe the purpose of the table.',\n      nl: 'Tenzij elders in het document beschreven, moeten tabellen een \\\"caption\\\"-element hebben om het doel van de tabel te beschrijven.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H39']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableUsesCaption;\n\n},{\"Case\":33,\"DOM\":34}],401:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TableUsesScopeForRow = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        DOM.scry('td:first-child', element).forEach(function (element) {\n          var next = DOM.next(element);\n          if (next) {\n            var isBold = DOM.getComputedStyle(element, 'font-weight') === 'bold';\n            var nextIsNotBold = DOM.getComputedStyle(next, 'font-weight') !== 'bold';\n            var boldDoesNotFollowsBold = isBold && nextIsNotBold;\n            var hasStrong = DOM.scry('strong', element).length;\n            var nextIsNotStrong = DOM.scry('strong', next).length === 0;\n            var strongDoesNotFollowStrong = hasStrong && nextIsNotStrong;\n\n            if (boldDoesNotFollowsBold || strongDoesNotFollowStrong) {\n              test.add(new Case({\n                element: element,\n                status: 'failed'\n              }));\n            }\n          }\n        });\n        DOM.scry('td:last-child', element).forEach(function (element) {\n          var $prev = DOM.prev(element);\n          var isBold = DOM.getComputedStyle(element, 'font-weight') === 'bold';\n          var prevIsNotBold = DOM.getComputedStyle($prev, 'font-weight') !== 'bold';\n          var boldDoesNotFollowsBold = isBold && prevIsNotBold;\n          var hasStrong = DOM.scry('strong', element).length;\n          var prevIsNotStrong = DOM.scry('strong', $prev).length === 0;\n          var strongDoesNotFollowStrong = hasStrong && prevIsNotStrong;\n\n          if (boldDoesNotFollowsBold || strongDoesNotFollowStrong) {\n            test.add(new Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Data tables should use scoped headers for rows with headers',\n      nl: 'Datatabellen moeten het \\\"scope\\\"-attribuut gebruiken voor rijen met koppen'\n    },\n    description: {\n      en: 'Where there are table headers for both rows and columns, use the \\\"scope\\\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight.',\n      nl: 'Als er tabelkoppen zijn voor zowel rijen als kolommen, gebruik dan het \\\"scope\\\"-attribuut om het juiste verband te leggen tussen de koppen en bijbehorende cellen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['H63']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TableUsesScopeForRow;\n\n},{\"Case\":33,\"DOM\":34}],402:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TabularDataIsInTable = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('pre', scope).forEach(function (element) {\n        if (DOM.text(element).search('\\t') >= 0) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All tabular information should use a table',\n      nl: 'Alle tabelinformatie moet ook daadwerkelijk in een tabel staan'\n    },\n    description: {\n      en: 'Tables should be used when displaying tabular information.',\n      nl: 'Gebruik een echte tabel wanneer je tabelinformatie wilt tonen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: ['F33', 'F34', 'F48']\n        },\n        '1.3.2': {\n          techniques: ['F33', 'F34']\n        }\n      }\n    },\n    tags: ['table', 'content']\n  }\n};\nmodule.exports = TabularDataIsInTable;\n\n},{\"Case\":33,\"DOM\":34}],403:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar ConvertToPxComponent = require('ConvertToPxComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\n\nvar TextIsNotSmall = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var fontSize = DOM.getComputedStyle(element, 'font-size');\n        if (fontSize.search('em') > 0) {\n          fontSize = ConvertToPxComponent(fontSize);\n        }\n        fontSize = parseInt(fontSize.replace('px', ''), 10);\n\n        if (fontSize < 10) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The text size is not less than 9 pixels high',\n      nl: 'De grootte van de tekst is meer dan 8 pixels hoog'\n    },\n    description: {\n      en: 'To help users with difficulty reading small text, ensure text size is no less than 9 pixels high.',\n      nl: 'Help gebruikers die moeite hebben met het lezen van kleine letters, door ervoor te zorgen dat tekst groter is dan 8 pixels hoog.'\n    },\n    guidelines: [],\n    tags: ['textsize', 'content']\n  }\n};\nmodule.exports = TextIsNotSmall;\n\n},{\"Case\":33,\"ConvertToPxComponent\":5,\"DOM\":34,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],404:[function(require,module,exports){\n'use strict';\n\n/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar TextareaHasAssociatedLabel = {\n  run: function run(test, options) {\n    options = options || {\n      selector: 'textarea'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All textareas should have a corresponding label',\n      nl: 'Alle \\\"textarea\\\"-elementen moeten een bijbehorend label hebben'\n    },\n    description: {\n      en: 'All <code>textarea</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle \\\"textarea\\\"-elementen moeten een bijbehorend label hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: ['H44']\n        },\n        '1.3.1': {\n          techniques: ['H44', 'F68']\n        },\n        '2.1.1': {\n          techniques: ['H91']\n        },\n        '2.1.3': {\n          techniques: ['H91']\n        },\n        '3.3.2': {\n          techniques: ['H44']\n        },\n        '4.1.2': {\n          techniques: ['H44', 'H91']\n        }\n      }\n    },\n    tags: ['form', 'content']\n  }\n};\nmodule.exports = TextareaHasAssociatedLabel;\n\n},{\"LabelComponent\":13}],405:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar VideoMayBePresent = {\n  run: function run(test) {\n\n    var videoExtensions = ['webm', 'flv', 'ogv', 'ogg', 'avi', 'mov', 'qt', 'wmv', 'asf', 'mp4', 'm4p', 'm4v', 'mpg', 'mp2', 'mpeg', 'mpg', 'mpe', 'mpv', 'm2v', '3gp', '3g2'];\n    var videoHosts = ['//www.youtube.com/embed/', '//player.vimeo.com/video/'];\n\n    test.get('scope').forEach(function (scope) {\n      var hasCase = false; // Test if a case has been created\n\n      // video elm is definately a video, and objects could be too.\n      DOM.scry('object, video', scope).forEach(function (element) {\n        hasCase = true;\n        test.add(Case({\n          element: element,\n          status: 'cantTell'\n        }));\n      });\n\n      // Links refering to files with an video extensions are probably video\n      // though the file may not exist.\n      DOM.scry('a[href]', scope).forEach(function (element) {\n        var extension = element.getAttribute('href').split('.').pop();\n        if (videoExtensions.indexOf(extension) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // some iframes with URL's of known video providers are also probably videos\n      DOM.scry('iframe', scope).forEach(function (element) {\n        if (element.src.indexOf(videoHosts[0]) !== -1 || element.src.indexOf(videoHosts[1]) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // if no case was added, return inapplicable\n      if (!hasCase) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Video or object uses a link that points to a file with a video extension',\n      nl: 'Video of object met een link naar een bestand met een video extensie'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [],\n    tags: ['link', 'video']\n  }\n};\nmodule.exports = VideoMayBePresent;\n\n},{\"Case\":33,\"DOM\":34}],406:[function(require,module,exports){\n'use strict';\n\nvar Case = require('Case');\nvar VideoComponent = require('VideoComponent');\nvar VideosEmbeddedOrLinkedNeedCaptions = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      VideoComponent.findVideos(scope, function (element, pass) {\n        if (!pass) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All linked or embedded videos need captions',\n      nl: 'Alle gekoppelde of ingebedde video\\'s moeten bijschriften hebben'\n    },\n    description: {\n      en: 'Any video hosted or otherwise which is linked or embedded must have a caption.',\n      nl: 'Elke video die is gekoppeld of ingebed in content moet een bijschrift hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.2.2': {\n          techniques: ['G87']\n        },\n        '1.2.4': {\n          techniques: ['G87']\n        }\n      }\n    },\n    tags: ['media', 'content']\n  }\n};\nmodule.exports = VideosEmbeddedOrLinkedNeedCaptions;\n\n},{\"Case\":33,\"VideoComponent\":31}],407:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar WhiteSpaceInWord = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var whitespaceGroup = undefined,\n            nonWhitespace = undefined;\n        nonWhitespace = DOM.text(element) ? DOM.text(element).match(/[^\\s\\\\]/g) : false;\n        whitespaceGroup = DOM.text(element) ? DOM.text(element).match(/[^\\s\\\\]\\s[^\\s\\\\]/g) : false;\n        if (nonWhitespace && whitespaceGroup && whitespaceGroup.length > 3 && whitespaceGroup.length >= nonWhitespace.length / 2 - 2) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        } else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Whitespace should not be used between characters in a word',\n      nl: 'Zet geen witruimte tussen letters in een woord'\n    },\n    description: {\n      en: 'Using extra whitespace between letters in a word causes screen readers to not interpret the word correctly, use the letter-spacing CSS property instead.',\n      nl: 'Het gebruik van witruimte tussen de letters van een woord, zorgen dat schermlezers het woord niet volledig kunnen lezen. Gebruik in plaats hiervan css om de ruimte tussen letters te bepalen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['F32', 'C8']\n        }\n      }\n    },\n    tags: ['content']\n  }\n};\nmodule.exports = WhiteSpaceInWord;\n\n},{\"Case\":33,\"DOM\":34,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}],408:[function(require,module,exports){\n'use strict';\n\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nvar DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar WhiteSpaceNotUsedForFormatting = {\n  run: function run(test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope).filter(function (element) {\n        return TextNodeFilterComponent(element);\n      }).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        if (DOM.scry('br', element).length === 0) {\n          _case.set({ status: 'passed' });\n          return;\n        }\n        var lines = DOM.text(element).toLowerCase().split(/(<br\\ ?\\/?>)+/);\n        var lineCount = 0;\n        lines.forEach(function (line) {\n          if (line.search(/(\\s|\\&nbsp;) {2,}/g) !== -1) {\n            lineCount++;\n          }\n        });\n        if (lineCount > 1) {\n          _case.set({ status: 'failed' });\n        } else {\n          _case.set({ status: 'cantTell' });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Whitespace should not be used for conveying information',\n      nl: 'Gebruik geen witruimte om informatie over te brengen'\n    },\n    description: {\n      en: 'Spaces or tabs are not read by assistive technology and should not be used to convey meaning.',\n      nl: 'Spaties of tabs worden niet voorgelezen door hulpprogramma\\'s en moeten niet worden gebruikt om betekenis over te dragen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: ['G57']\n        }\n      }\n    },\n    tags: ['content']\n  }\n};\nmodule.exports = WhiteSpaceNotUsedForFormatting;\n\n},{\"Case\":33,\"DOM\":34,\"TextNodeFilterComponent\":27,\"TextSelectorComponent\":28}]},{},[36,39]);\n"
  },
  {
    "path": "docs/Makefile",
    "content": "# Makefile for Sphinx documentation\n#\n\n# You can set these variables from the command line.\nSPHINXOPTS    =\nSPHINXBUILD   = sphinx-build\nPAPER         =\nBUILDDIR      = _build\nBUILDCHECK   := $(shell command -v $(SPHINXBUILD))\n\n# Check build script is installed\nifeq ($(BUILDCHECK),)\n$(error Build command '$(SPHINXBUILD)' not found)\nendif\n\n# Internal variables.\nPAPEROPT_a4     = -D latex_paper_size=a4\nPAPEROPT_letter = -D latex_paper_size=letter\nALLSPHINXOPTS   = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n# the i18n builder cannot share the environment and doctrees with the others\nI18NSPHINXOPTS  = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .\n\n.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext\n\nhelp:\n\t@echo \"Please use \\`make <target>' where <target> is one of\"\n\t@echo \"  html       to make standalone HTML files\"\n\t@echo \"  dirhtml    to make HTML files named index.html in directories\"\n\t@echo \"  singlehtml to make a single large HTML file\"\n\t@echo \"  pickle     to make pickle files\"\n\t@echo \"  json       to make JSON files\"\n\t@echo \"  htmlhelp   to make HTML files and a HTML help project\"\n\t@echo \"  qthelp     to make HTML files and a qthelp project\"\n\t@echo \"  devhelp    to make HTML files and a Devhelp project\"\n\t@echo \"  epub       to make an epub\"\n\t@echo \"  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\"\n\t@echo \"  latexpdf   to make LaTeX files and run them through pdflatex\"\n\t@echo \"  text       to make text files\"\n\t@echo \"  man        to make manual pages\"\n\t@echo \"  texinfo    to make Texinfo files\"\n\t@echo \"  info       to make Texinfo files and run them through makeinfo\"\n\t@echo \"  gettext    to make PO message catalogs\"\n\t@echo \"  changes    to make an overview of all changed/added/deprecated items\"\n\t@echo \"  linkcheck  to check all external links for integrity\"\n\t@echo \"  doctest    to run all doctests embedded in the documentation (if enabled)\"\n\nclean:\n\t-rm -rf $(BUILDDIR)/*\n\nhtml:\n\t$(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/html.\"\n\ndirhtml:\n\t$(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml\n\t@echo\n\t@echo \"Build finished. The HTML pages are in $(BUILDDIR)/dirhtml.\"\n\nsinglehtml:\n\t$(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml\n\t@echo\n\t@echo \"Build finished. The HTML page is in $(BUILDDIR)/singlehtml.\"\n\npickle:\n\t$(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle\n\t@echo\n\t@echo \"Build finished; now you can process the pickle files.\"\n\njson:\n\t$(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json\n\t@echo\n\t@echo \"Build finished; now you can process the JSON files.\"\n\nhtmlhelp:\n\t$(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp\n\t@echo\n\t@echo \"Build finished; now you can run HTML Help Workshop with the\" \\\n\t      \".hhp project file in $(BUILDDIR)/htmlhelp.\"\n\nqthelp:\n\t$(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp\n\t@echo\n\t@echo \"Build finished; now you can run \"qcollectiongenerator\" with the\" \\\n\t      \".qhcp project file in $(BUILDDIR)/qthelp, like this:\"\n\t@echo \"# qcollectiongenerator $(BUILDDIR)/qthelp/QUAILAccessibilityInformationLibrary.qhcp\"\n\t@echo \"To view the help file:\"\n\t@echo \"# assistant -collectionFile $(BUILDDIR)/qthelp/QUAILAccessibilityInformationLibrary.qhc\"\n\ndevhelp:\n\t$(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp\n\t@echo\n\t@echo \"Build finished.\"\n\t@echo \"To view the help file:\"\n\t@echo \"# mkdir -p $$HOME/.local/share/devhelp/QUAILAccessibilityInformationLibrary\"\n\t@echo \"# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/QUAILAccessibilityInformationLibrary\"\n\t@echo \"# devhelp\"\n\nepub:\n\t$(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub\n\t@echo\n\t@echo \"Build finished. The epub file is in $(BUILDDIR)/epub.\"\n\nlatex:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo\n\t@echo \"Build finished; the LaTeX files are in $(BUILDDIR)/latex.\"\n\t@echo \"Run \\`make' in that directory to run these through (pdf)latex\" \\\n\t      \"(use \\`make latexpdf' here to do that automatically).\"\n\nlatexpdf:\n\t$(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex\n\t@echo \"Running LaTeX files through pdflatex...\"\n\t$(MAKE) -C $(BUILDDIR)/latex all-pdf\n\t@echo \"pdflatex finished; the PDF files are in $(BUILDDIR)/latex.\"\n\ntext:\n\t$(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text\n\t@echo\n\t@echo \"Build finished. The text files are in $(BUILDDIR)/text.\"\n\nman:\n\t$(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man\n\t@echo\n\t@echo \"Build finished. The manual pages are in $(BUILDDIR)/man.\"\n\ntexinfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo\n\t@echo \"Build finished. The Texinfo files are in $(BUILDDIR)/texinfo.\"\n\t@echo \"Run \\`make' in that directory to run these through makeinfo\" \\\n\t      \"(use \\`make info' here to do that automatically).\"\n\ninfo:\n\t$(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo\n\t@echo \"Running Texinfo files through makeinfo...\"\n\tmake -C $(BUILDDIR)/texinfo info\n\t@echo \"makeinfo finished; the Info files are in $(BUILDDIR)/texinfo.\"\n\ngettext:\n\t$(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale\n\t@echo\n\t@echo \"Build finished. The message catalogs are in $(BUILDDIR)/locale.\"\n\nchanges:\n\t$(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes\n\t@echo\n\t@echo \"The overview file is in $(BUILDDIR)/changes.\"\n\nlinkcheck:\n\t$(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck\n\t@echo\n\t@echo \"Link check complete; look for any errors in the above output \" \\\n\t      \"or in $(BUILDDIR)/linkcheck/output.txt.\"\n\ndoctest:\n\t$(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest\n\t@echo \"Testing of doctests in the sources finished, look at the \" \\\n\t      \"results in $(BUILDDIR)/doctest/output.txt.\"\n"
  },
  {
    "path": "docs/building.rst",
    "content": "Building QUAIL\n==============\n\nFor most purposes, you can simply `download the latest release of Quail <https://github.com/quailjs/quail/releases>`_, which is pre-built. However, if you want to customize your build or use the `dev` branch of the project, you will need to use the following tools to build the project.\n\nQuail is built using `Grunt <http://gruntjs.com/>`_ and `Bower <http://bower.io>`_, and hence requires having `Node.js <http://nodejs.org>`_ installed on your machine. Once you check out the code, follow the below commands:\n\n```\ncd quail\nnpm install\ngrunt build\n```\n\nThis will install all the developer dependencies and create a new `dist` directory with a pre-built version of quail and all the guideline or test files exported to JSON format.\n"
  },
  {
    "path": "docs/conf.py",
    "content": "# -*- coding: utf-8 -*-\n#\n# QUAIL: Accessibility Information Library documentation build configuration file, created by\n# sphinx-quickstart on Wed Apr 11 20:34:30 2012.\n#\n# This file is execfile()d with the current directory set to its containing dir.\n#\n# Note that not all possible configuration values are present in this\n# autogenerated file.\n#\n# All configuration values have a default; values that are commented out\n# serve to show the default.\n\nimport sys, os\n\n# If extensions (or modules to document with autodoc) are in another directory,\n# add these directories to sys.path here. If the directory is relative to the\n# documentation root, use os.path.abspath to make it absolute, like shown here.\n#sys.path.insert(0, os.path.abspath('.'))\n\n# -- General configuration -----------------------------------------------------\n\n# If your documentation needs a minimal Sphinx version, state it here.\n#needs_sphinx = '1.0'\n\n# Add any Sphinx extension module names here, as strings. They can be extensions\n# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.\nextensions = ['sphinx.ext.todo']\n\n# Add any paths that contain templates here, relative to this directory.\ntemplates_path = ['_templates']\n\n# The suffix of source filenames.\nsource_suffix = '.rst'\n\n# The encoding of source files.\n#source_encoding = 'utf-8-sig'\n\n# The master toctree document.\nmaster_doc = 'index'\n\n# General information about the project.\nproject = u'QUAIL: Accessibility Information Library'\ncopyright = u'2012, Kevin Miller'\n\n# The version info for the project you're documenting, acts as replacement for\n# |version| and |release|, also used in various other places throughout the\n# built documents.\n#\n# The short X.Y version.\nversion = '2.0a1'\n# The full version, including alpha/beta/rc tags.\nrelease = '2.0a1'\n\n# The language for content autogenerated by Sphinx. Refer to documentation\n# for a list of supported languages.\n#language = None\n\n# There are two options for replacing |today|: either, you set today to some\n# non-false value, then it is used:\n#today = ''\n# Else, today_fmt is used as the format for a strftime call.\n#today_fmt = '%B %d, %Y'\n\n# List of patterns, relative to source directory, that match files and\n# directories to ignore when looking for source files.\nexclude_patterns = ['_build']\n\n# The reST default role (used for this markup: `text`) to use for all documents.\n#default_role = None\n\n# If true, '()' will be appended to :func: etc. cross-reference text.\n#add_function_parentheses = True\n\n# If true, the current module name will be prepended to all description\n# unit titles (such as .. function::).\n#add_module_names = True\n\n# If true, sectionauthor and moduleauthor directives will be shown in the\n# output. They are ignored by default.\n#show_authors = False\n\n# The name of the Pygments (syntax highlighting) style to use.\npygments_style = 'sphinx'\n\n# A list of ignored prefixes for module index sorting.\n#modindex_common_prefix = []\n\n\n# -- Options for HTML output ---------------------------------------------------\n\n# The theme to use for HTML and HTML Help pages.  See the documentation for\n# a list of builtin themes.\nhtml_theme = 'default'\n\n# Theme options are theme-specific and customize the look and feel of a theme\n# further.  For a list of options available for each theme, see the\n# documentation.\n#html_theme_options = {}\n\n# Add any paths that contain custom themes here, relative to this directory.\n#html_theme_path = []\n\n# The name for this set of Sphinx documents.  If None, it defaults to\n# \"<project> v<release> documentation\".\n#html_title = None\n\n# A shorter title for the navigation bar.  Default is the same as html_title.\n#html_short_title = None\n\n# The name of an image file (relative to this directory) to place at the top\n# of the sidebar.\n#html_logo = None\n\n# The name of an image file (within the static path) to use as favicon of the\n# docs.  This file should be a Windows icon file (.ico) being 16x16 or 32x32\n# pixels large.\n#html_favicon = None\n\n# Add any paths that contain custom static files (such as style sheets) here,\n# relative to this directory. They are copied after the builtin static files,\n# so a file named \"default.css\" will overwrite the builtin \"default.css\".\nhtml_static_path = ['_static']\n\n# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,\n# using the given strftime format.\n#html_last_updated_fmt = '%b %d, %Y'\n\n# If true, SmartyPants will be used to convert quotes and dashes to\n# typographically correct entities.\n#html_use_smartypants = True\n\n# Custom sidebar templates, maps document names to template names.\n#html_sidebars = {}\n\n# Additional templates that should be rendered to pages, maps page names to\n# template names.\n#html_additional_pages = {}\n\n# If false, no module index is generated.\n#html_domain_indices = True\n\n# If false, no index is generated.\n#html_use_index = True\n\n# If true, the index is split into individual pages for each letter.\n#html_split_index = False\n\n# If true, links to the reST sources are added to the pages.\n#html_show_sourcelink = True\n\n# If true, \"Created using Sphinx\" is shown in the HTML footer. Default is True.\n#html_show_sphinx = True\n\n# If true, \"(C) Copyright ...\" is shown in the HTML footer. Default is True.\n#html_show_copyright = True\n\n# If true, an OpenSearch description file will be output, and all pages will\n# contain a <link> tag referring to it.  The value of this option must be the\n# base URL from which the finished HTML is served.\n#html_use_opensearch = ''\n\n# This is the file name suffix for HTML files (e.g. \".xhtml\").\n#html_file_suffix = None\n\n# Output file base name for HTML help builder.\nhtmlhelp_basename = 'QUAILAccessibilityInformationLibrarydoc'\n\n\n# -- Options for LaTeX output --------------------------------------------------\n\nlatex_elements = {\n# The paper size ('letterpaper' or 'a4paper').\n#'papersize': 'letterpaper',\n\n# The font size ('10pt', '11pt' or '12pt').\n#'pointsize': '10pt',\n\n# Additional stuff for the LaTeX preamble.\n#'preamble': '',\n}\n\n# Grouping the document tree into LaTeX files. List of tuples\n# (source start file, target name, title, author, documentclass [howto/manual]).\nlatex_documents = [\n  ('index', 'QUAILAccessibilityInformationLibrary.tex', u'QUAIL: Accessibility Information Library Documentation',\n   u'Kevin Miller', 'manual'),\n]\n\n# The name of an image file (relative to this directory) to place at the top of\n# the title page.\n#latex_logo = None\n\n# For \"manual\" documents, if this is true, then toplevel headings are parts,\n# not chapters.\n#latex_use_parts = False\n\n# If true, show page references after internal links.\n#latex_show_pagerefs = False\n\n# If true, show URL addresses after external links.\n#latex_show_urls = False\n\n# Documents to append as an appendix to all manuals.\n#latex_appendices = []\n\n# If false, no module index is generated.\n#latex_domain_indices = True\n\n\n# -- Options for manual page output --------------------------------------------\n\n# One entry per manual page. List of tuples\n# (source start file, name, description, authors, manual section).\nman_pages = [\n    ('index', 'quailaccessibilityinformationlibrary', u'QUAIL: Accessibility Information Library Documentation',\n     [u'Kevin Miller'], 1)\n]\n\n# If true, show URL addresses after external links.\n#man_show_urls = False\n\n\n# -- Options for Texinfo output ------------------------------------------------\n\n# Grouping the document tree into Texinfo files. List of tuples\n# (source start file, target name, title, author,\n#  dir menu entry, description, category)\ntexinfo_documents = [\n  ('index', 'QUAILAccessibilityInformationLibrary', u'QUAIL: Accessibility Information Library Documentation',\n   u'Kevin Miller', 'QUAILAccessibilityInformationLibrary', 'One line description of project.',\n   'Miscellaneous'),\n]\n\n# Documents to append as an appendix to all manuals.\n#texinfo_appendices = []\n\n# If false, no module index is generated.\n#texinfo_domain_indices = True\n\n# How to display URL addresses: 'footnote', 'no', or 'inline'.\n#texinfo_show_urls = 'footnote'\n"
  },
  {
    "path": "docs/index.rst",
    "content": ".. QUAIL: Accessibility Information Library documentation master file\n\nQUAIL: Accessibility Information Library\n========================================\n\nQUAIL is a jQuery and Sizzle-comptable library for checking content against accessibility guidelines. It provides a flexible way to test for certain problems (say, images missing an alt text) and a collection of over **250** tests to get you started.\n\nTests\n-----\n\nAt the core of QUAIL are **tests**. Tests search for a single type of accessibility problem, and they are all defined in the file `src/resources/tests.yaml` (a JSON version is available in `dist/tests.json` - `read more about building these files <build.html>`_). For example, one of the most common accessibility problems out there is an image missing an `alt` attribute (which allows users with screen readers to hear a description of the image). The test definition in the `tests.yaml` file looks like this:\n\n.. code-block:: js\n   \n    imgHasAlt: \n      selector: \"img:not(img[alt])\"\n      tags: \n        - \"image\"\n        - \"content\"\n      testability: 1\n      type: \"selector\"\n      guidelines: \n        508: \n          - \"a\"\n        wcag: \n          1.1.1: \n            techniques: \n              - \"F65\"\n              - \"H37\"\n      title: \n        en: \"Image elements must have an \\\"alt\\\" attribute\"\n      description: \n        en: \"All <code>img</code> elements must have an alt attribute\"\n    ....\n\nThe **test name** in this example is \"imgHasAlt,\" which is the unique label for the test. These are used in creating guidelines. There are at least two definitions for each test:\n  - **type** - QUAIL has some default test types to simplify the process of writing test definitions. The simplest is a *selector*, which just takes a jQuery/Sizzle-compatable selector and finds all items that match that selector. For *selector* tests, we also must define the selector to use (in this case, `img:not(img[alt])`).\n  - **severity** - The default severity level. Severity is a measure of how certain we are a test will not create false positives:\n    - **severe** - We are 100% certain that this test is always correct. If an image is missing its `alt` attribute, it's missing its `alt` attribute.\n    - **moderate** - We are mostly certain this test is correct. This is usually found for content-related tests, like testing to see if a block of text is written at or below a certain grade level.\n    - **suggestion** - We cannot test for this, but can suggest things to manually review. For exmaple, we cannot test that content in a Flash object is accessible, but we can point out that a flash object is there and link to appropriate guidelines on making accessible flash.\n  - **guidelines** - A list of pre-defined guidelines (right now, either 508 or WCAG 2.0) including:\n    - **techinques** - The WCAG techniques aligned with this test\n    - **configuration** - Optional configuration options for this test only specific to this test.\n  - **title** - The human-readable title of the test, prefixed by language code.\n  - **description** - The human-readable description of the test, prefixed by language code.\n\nGuidelines\n----------\n\nGuidelines are simply a collection of tests. QUAIL comes with US Section 508 and WCAG guideline files in `src/resources/guidelines`. Every guideline is simply an array of test names, which means you can easily create your own guidelines. In the `examples/php` directory you can see a custom guideline being defined in a PHP script.\n\nUsage\n>>>>>>>>>>>>>>>>>\n\nTo use QUAIL, you will need to make a simple jQuery/Sizzle object (in this example, we are checking an element with the ID of `content`), then run the `quail` function against it:\n\n.. code-block:: js\n\n    $('#content').quail({ jsonPath : 'src/resources', \n                      guideline : 'wcag2a',\n                      accessibilityTests : accessibilityTests,\n                      testFailed : function(event) { ... },\n                      customTests : {\n                        myCustomTest : {\n                          type : 'custom',\n                          callback : function(quail) {\n                            quail.html.find('.error').each(function() {\n                              quail.testFails('myCustomTest', $(this));\n                            })\n                          }\n                        }\n                      },\n                      complete : function(event) { ... },\n                    });\n\nThe `quail` function accepts a single object with the following items:\n  \n  - **jsonPath** - *Required* - The path to the `resources` folder where QUAIL is located. Certain tests load additional strings like emoticons or filler words from JSON files to save space. If a test ends up needing to load additional resources, this will be required.\n  - **guideline** - *Required* - Either the name of a guideline file that can be found in the *jsonPath* directive, or an array of test names.\n  - **accessibilityTests** - *Optional* - If you wish to load your own custom test definitions, this will prevent QUAIL from using it's own `tests.json` file to load the tests. This is also useful if you are loading `tests.json` through your own method and don't want QUAIL to do it for you.\n  - **testFailed** - *Optional* - A callback that will be called everytime an item fails a test. This callback recieves an object with the following items:\n  \n    - **element** - The native jQuery/Sizzle object that represents the DOM element.\n    - **testName** - The name of the test that failed\n    - **severity** - The severity of the test.\n    - **options** - Additional options as passed by the test definition.\n    \n  - **customTests** - *Optional* - An object of tests that can be added to QUAIL on the fly. Tests should have a name, and either use some of the pre-defined callbacks in QUAIL (like \"selector\"), or a \"custom\" type, where you define a callback that accepts a QUAIL object.\n  - **preFilter** - *Optional* - A callback that can be used to pre-filter out failed items. If this callback returns false, then the item is skipped and not considered failed. This callback receives the following argumetns:\n    - **testName** - The name of the test that failed\n    - **element** - A full jQuery/Sizzle object of the element\n    - **options** - Any additional options set by the test\n  - **complete** - *Optional* - Called when all the tests are completed. This is useful for reporting, as it gets a summary of all resutls. This callback gets a single object with the following items:\n  \n    - **totals** - An object with the total number of severe, moderate, and suggestion tests which failed.\n    - **results** - An object with all the elements and tests that failed.\n  \n\nAvailable tests\n===============\n\n.. toctree::\n   :maxdepth: 2\n   :glob:\n   \n   tests/*\n\n\n\nIndices and tables\n==================\n\n* :ref:`genindex`\n* :ref:`modindex`\n* :ref:`search`\n\n"
  },
  {
    "path": "docs/make.bat",
    "content": "@ECHO OFF\n\nREM Command file for Sphinx documentation\n\nif \"%SPHINXBUILD%\" == \"\" (\n\tset SPHINXBUILD=sphinx-build\n)\nset BUILDDIR=_build\nset ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .\nset I18NSPHINXOPTS=%SPHINXOPTS% .\nif NOT \"%PAPER%\" == \"\" (\n\tset ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%\n\tset I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%\n)\n\nif \"%1\" == \"\" goto help\n\nif \"%1\" == \"help\" (\n\t:help\n\techo.Please use `make ^<target^>` where ^<target^> is one of\n\techo.  html       to make standalone HTML files\n\techo.  dirhtml    to make HTML files named index.html in directories\n\techo.  singlehtml to make a single large HTML file\n\techo.  pickle     to make pickle files\n\techo.  json       to make JSON files\n\techo.  htmlhelp   to make HTML files and a HTML help project\n\techo.  qthelp     to make HTML files and a qthelp project\n\techo.  devhelp    to make HTML files and a Devhelp project\n\techo.  epub       to make an epub\n\techo.  latex      to make LaTeX files, you can set PAPER=a4 or PAPER=letter\n\techo.  text       to make text files\n\techo.  man        to make manual pages\n\techo.  texinfo    to make Texinfo files\n\techo.  gettext    to make PO message catalogs\n\techo.  changes    to make an overview over all changed/added/deprecated items\n\techo.  linkcheck  to check all external links for integrity\n\techo.  doctest    to run all doctests embedded in the documentation if enabled\n\tgoto end\n)\n\nif \"%1\" == \"clean\" (\n\tfor /d %%i in (%BUILDDIR%\\*) do rmdir /q /s %%i\n\tdel /q /s %BUILDDIR%\\*\n\tgoto end\n)\n\nif \"%1\" == \"html\" (\n\t%SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/html.\n\tgoto end\n)\n\nif \"%1\" == \"dirhtml\" (\n\t%SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.\n\tgoto end\n)\n\nif \"%1\" == \"singlehtml\" (\n\t%SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.\n\tgoto end\n)\n\nif \"%1\" == \"pickle\" (\n\t%SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can process the pickle files.\n\tgoto end\n)\n\nif \"%1\" == \"json\" (\n\t%SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can process the JSON files.\n\tgoto end\n)\n\nif \"%1\" == \"htmlhelp\" (\n\t%SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can run HTML Help Workshop with the ^\n.hhp project file in %BUILDDIR%/htmlhelp.\n\tgoto end\n)\n\nif \"%1\" == \"qthelp\" (\n\t%SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; now you can run \"qcollectiongenerator\" with the ^\n.qhcp project file in %BUILDDIR%/qthelp, like this:\n\techo.^> qcollectiongenerator %BUILDDIR%\\qthelp\\QUAILAccessibilityInformationLibrary.qhcp\n\techo.To view the help file:\n\techo.^> assistant -collectionFile %BUILDDIR%\\qthelp\\QUAILAccessibilityInformationLibrary.ghc\n\tgoto end\n)\n\nif \"%1\" == \"devhelp\" (\n\t%SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished.\n\tgoto end\n)\n\nif \"%1\" == \"epub\" (\n\t%SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The epub file is in %BUILDDIR%/epub.\n\tgoto end\n)\n\nif \"%1\" == \"latex\" (\n\t%SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished; the LaTeX files are in %BUILDDIR%/latex.\n\tgoto end\n)\n\nif \"%1\" == \"text\" (\n\t%SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The text files are in %BUILDDIR%/text.\n\tgoto end\n)\n\nif \"%1\" == \"man\" (\n\t%SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The manual pages are in %BUILDDIR%/man.\n\tgoto end\n)\n\nif \"%1\" == \"texinfo\" (\n\t%SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.\n\tgoto end\n)\n\nif \"%1\" == \"gettext\" (\n\t%SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Build finished. The message catalogs are in %BUILDDIR%/locale.\n\tgoto end\n)\n\nif \"%1\" == \"changes\" (\n\t%SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.The overview file is in %BUILDDIR%/changes.\n\tgoto end\n)\n\nif \"%1\" == \"linkcheck\" (\n\t%SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Link check complete; look for any errors in the above output ^\nor in %BUILDDIR%/linkcheck/output.txt.\n\tgoto end\n)\n\nif \"%1\" == \"doctest\" (\n\t%SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest\n\tif errorlevel 1 exit /b 1\n\techo.\n\techo.Testing of doctests in the sources finished, look at the ^\nresults in %BUILDDIR%/doctest/output.txt.\n\tgoto end\n)\n\n:end\n"
  },
  {
    "path": "docs/server-scanning.rst",
    "content": "Scanning other websites with QUAIL\n==================================\n\nSince QUAIL is now a jQuery plugin, it's no longer possible to run it natively in PHP. If you would like to scan other sites (without, say, getting your own javascript on their page a-la Google Analytics), then you'll need to run JavaScript on your backend.\n\nQUAIL already does this sort of thing in our continuous integration service on `Travis.org <https://travis-ci.org/quailjs/quail/builds/7219577>`_ using `PhantomJS <http://phantomjs.org/>`_. PhantomJS is a full browser implementation that can do JavaScript tests and basically works like a browser.\n\nOthers have used QUAIL in combination with `Cheerio for NodeJS <https://github.com/MatthewMueller/cheerio>`_. Cheerio is an implementation of jQuery for NodeJS; however, certain tests that work with user interactions or JavaScript events will not work.\n"
  },
  {
    "path": "docs/tests/aAdjacentWithSameResourceShouldBeCombined.rst",
    "content": "===============================\nAdjacent links that point to the same location should be merged\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: aAdjacentWithSameResourceShouldBeCombined\n\nBecause many users of screen-readers use links to navigate the page, providing two links right next to eachother that points to the same location can be confusing. Try combining the links.\n\nExample\n-------\n Wrong\n-----\n\n.. code-block:: html\n\n    You can also <a href=\"article.html\">read more of</a> <a href=\"article.html\">my great article</a>.\n\n Right\n-----\n \n.. code-block:: html\n\n    You can also <a href=\"article.html\">read more of my great article</a>.\n\n \nExample\n-------\n"
  },
  {
    "path": "docs/tests/aImgAltNotRepetative.rst",
    "content": "===============================\nWhen an image is in a link, its \"alt\" attribute should not repeat other text in the link\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: aImgAltNotRepetitive\n\n\nImages within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice.\n\n\n\nExample\n-------\n Wrong\n-----\n\n.. code-block:: html\n\n    <a href=\"home.html\"><img src=\"home.png\" alt=\"Return home\">Return home</a>\n\n\n\n Right\n-----\n\n.. code-block:: html\n\n    <a href=\"home.html\"><img src=\"home.png\" alt=\"\">Return home</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/aLinkTextDoesNotBeginWithRedundantWord.rst",
    "content": "===============================\nLink text should not begin with redundant text\n===============================\n\nSeverity code: 0\n\n.. php:class:: aLinkTextDoesNotBeginWithRedundantWord\n\n\nLink text should not begin with redundant words or phrases like \"link\n"
  },
  {
    "path": "docs/tests/aLinksAreSeperatedByPrintableCharacters.rst",
    "content": "===============================\nLists of links should be seperated by printable characters\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: aLinksAreSeperatedByPrintableCharacters\n\n\nIf a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <a href=\"a.html\">Page A</a> <a href=\"b.html\">Page B</a> <a href=\"c.html\">Page C</a>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <a href=\"a.html\">Page A</a> | <a href=\"b.html\">Page B</a> | <a href=\"c.html\">Page C</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/aLinksDontOpenNewWindow.rst",
    "content": "===============================\nLinks should not open a new window without warning\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: aLinksDontOpenNewWindow\n\n\nLinks which open a new window using the \"target\" attribute should warn users.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <a href=\"page.html\">View my page</a>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <a href=\"page.html\">View my page (opens new window)</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/aLinksMakeSenseOutOfContext.rst",
    "content": "===============================\nThe text in links should make sense out of context\n===============================\n\nSeverity code: 0\n\n.. php:class:: aLinksMakeSenseOutOfContext\n\n\nAll links should make sense out of context. Many non-sighted users skip from link-to-link to navigate a page, and links which do not make sense on their own can make the page difficult to navigate.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    To know more about me, visit my <a href=\"page.html\">page</a>.\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    To know more about me, visit <a href=\"page.html\">my page</a>.\n"
  },
  {
    "path": "docs/tests/aLinksToMultiMediaRequireTranscript.rst",
    "content": "===============================\nAny links to a multimedia file should also include a link to a transcript\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: aLinksToMultiMediaRequireTranscript\n\n\nLinks to a multimedia file should be followed by a link to a transcript of the file.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <a href=\"interview.mov\">Watch the interview</a>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <a href=\"interview.mov\">Watch the interview</a> <a href=\"transcript.html\">(transcript)</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/aLinksToSoundFilesNeedTranscripts.rst",
    "content": "===============================\nAny links to a sound file should also include a link to a transcript\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: aLinksToSoundFilesNeedTranscripts\n\n\nLinks to a sound file should be followed by a link to a transcript of the file.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <a href=\"interview.mp3\">Listen to the interview</a>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <a href=\"interview.mp3\">Listen to the interview</a> <a href=\"transcript.html\">(transcript)</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/aMustContainText.rst",
    "content": "===============================\nLinks should contain text\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: aMustContainText\n\n\nBecause many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty \"alt\" attributes and no other readable text) hinders these users.\n\n\n\nExample\n-------\n Wrong\n-----\n\n.. code-block:: html\n\n    <a href=\"home.png\"></a>\n\n\n\n \n.. code-block:: html\n\n    <a href=\"home.png\"><img src=\"home.png\" alt=\"\">/</a>\n\n\n\n Right\n-----\n \n.. code-block:: html\n\n    <a href=\"home.png\">Return Home</a>\n\n\n\n \n.. code-block:: html\n\n    <a href=\"home.png\"><img src=\"home.png\" alt=\"Return Home\">/</a>"
  },
  {
    "path": "docs/tests/aMustHaveTitle.rst",
    "content": "===============================\nAll links must have a \"title\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: aMustHaveTitle\n\n\nEvery link must have a \"title\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <a href=\"home.html\">Home</a>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <a href=\"home.html\" title=\"Return to home\">Home</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/aMustNotHaveJavascriptHref.rst",
    "content": "===============================\nLinks should not use \"javascript\" in their location\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: aMustNotHaveJavascriptHref\n\n\nAnchor (<code>a) elements may not use the \"javascript\" protocol in their \"href\" attributes.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/aSuspiciousLinkText.rst",
    "content": "===============================\nLink text should be useful\n===============================\n\nSeverity code: 0\n\n.. php:class:: aSuspiciousLinkText\n\n\nBecause many users of screen-readers use links to navigate the page, providing links with text that simply read \"click here\" gives no hint of the function of the link\n"
  },
  {
    "path": "docs/tests/aTitleDescribesDestination.rst",
    "content": "===============================\nThe title attribute of all source a (anchor) elements describes the link destination.\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: aTitleDescribesDestination\n\n\nEvery link must have a \"title\" attribute which describes the purpose or destination of the link.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <a href=\"home.html\" title=\"A web page\">Home</a>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <a href=\"home.html\" title=\"Return to home\">Home</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/addressForAuthor.rst",
    "content": "===============================\nThe document should contain an address for the author\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: addressForAuthor\n\n\nDocuments should provide a valid email address within an <code>address element.\n\n\n\n\n\n"
  },
  {
    "path": "docs/tests/addressForAuthorMustBeValid.rst",
    "content": "===============================\nThe document should contain a valid email address for the author\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: addressForAuthorMustBeValid\n\n\nDocuments should provide a valid email address within an <code>address element.\n\n\n\n\n\n"
  },
  {
    "path": "docs/tests/appletContainsTextEquivalent.rst",
    "content": "===============================\nAll applets should contain the same content within the body of the applet\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: appletContainsTextEquivalent\n\n\nApplets should contain their text equivalents or description within the <code>applet tag itself.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <applet archive=\"whyareyouusingapplet.jar\"></applet>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <applet archive=\"whyareyouusingapplet.jar\">Why are you still using applets?</applet>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/appletContainsTextEquivalentInAlt.rst",
    "content": "===============================\nAll applets should contain a text equivalent in the \"alt\" attribute\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: appletContainsTextEquivalentInAlt\n\n\nApplets should contain their text equivalents or description in an \"alt\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <applet archive=\"whyareyouusingapplet.jar\"></applet>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <applet archive=\"whyareyouusingapplet.jar\" alt=\"Why are you still using applets?\"></applet>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/appletProvidesMechanismToReturnToParent.rst",
    "content": "===============================\nAll applets should provide a way for keyboard users to escape\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: appletProvidesMechanismToReturnToParent\n\n\nEnsure that a user who has only a keyboard as an input device can escape an <code>applet element. This requires manual confirmation.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/appletUIMustBeAccessible.rst",
    "content": "===============================\nAny user interface in an applet must be accessible\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: appletUIMustBeAccessible\n\n\nApplet content should be assessed for accessibility.\n\n\n\n\n<strong>Applets cannot be checked using automated tools, this should be reviewed manually.</strong>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/appletsDoNotFlicker.rst",
    "content": "===============================\nAll applets do not flicker\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: appletsDoNotFlicker\n\n\nApplets should not flicker.\n\n\n\n\n<strong>Applets cannot be checked using automated tools, this should be reviewed manually.</strong>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/appletsDoneUseColorAlone.rst",
    "content": "===============================\nApplets should not use color alone to communicate content\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: appletsDoneUseColorAlone\n\n\nApplets should contain content that makes sense without color and is accessible to users who are color blind.\n\n\n\n\n<strong>Applets cannot be checked using automated tools, this should be reviewed manually.</strong>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/areaAltIdentifiesDestination.rst",
    "content": "===============================\nAll \"area\" elements must have an \"alt\" attribute which describes the link destination\n===============================\n\nSeverity code: 0\n\n.. php:class:: areaAltIdentifiesDestination\n\n\nAll <code>area elements within a <code>map must have an \"alt\" attribute\n"
  },
  {
    "path": "docs/tests/areaAltRefersToText.rst",
    "content": "===============================\nAlt text for \"area\" elements should replicate the text found in the image\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: areaAltRefersToText\n\n\nIf an image is being used as a map, and an <code>area encompasses text within the image, then the \"alt\" attribute of that <code>area element should be the same as the text found in the image.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/areaDontOpenNewWindow.rst",
    "content": "===============================\nNo \"area\" elements should open a new window without warning\n===============================\n\nSeverity code: 0\n\n.. php:class:: areaDontOpenNewWindow\n\n\nNo <code>area elements should open a new window without warning.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <map name=\"worldmap\">  <area shape=\"rect\" coords=\"0\n"
  },
  {
    "path": "docs/tests/areaHasAltValue.rst",
    "content": "===============================\nAll \"area\" elements must have an \"alt\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: areaHasAltValue\n\n\nAll <code>area elements within a <code>map must have an \"alt\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <map name=\"worldmap\">  <area shape=\"rect\" coords=\"0\n"
  },
  {
    "path": "docs/tests/areaLinksToSoundFile.rst",
    "content": "===============================\nAll \"area\" elements which link to a sound file should also provide a link to a transcript\n===============================\n\nSeverity code: 0\n\n.. php:class:: areaLinksToSoundFile\n\n\nAll <code>area elements which link to a sound file should have a text transcript\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <map name=\"people\">  <area shape=\"rect\" coords=\"0\n"
  },
  {
    "path": "docs/tests/ariaOrphanedContent.rst",
    "content": "===============================\nPages using ARIA roles should not have orphaned content\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: ariaOrphanedContent\n\n\nIf a page makes use of ARIA roles, then there should not be any content on the page which is not within an element that exposes a role, as it could cause that content to be rendered inaccessible to users with screen readers.\n"
  },
  {
    "path": "docs/tests/basefontIsNotUsed.rst",
    "content": "===============================\nBasefont\" should not be used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: basefontIsNotUsed\n\n\nThe <code>basefont tag is deprecated and should not be used. Investigate using stylesheets instead.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/blinkIsNotUsed.rst",
    "content": "===============================\nThe \"blink\" tag should not be used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: blinkIsNotUsed\n\n\nThe <code>blink tag should not be used. Ever.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <blink>Please read me!</blink>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <strong>Please read me!</strong>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/blockquoteNotUsedForIndentation.rst",
    "content": "===============================\nThe \"blockquote\" tag should not be used just for indentation\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: blockquoteNotUsedForIndentation\n\n\n.. code-block:: html\n\n    Blockquote tags are for actual long passages of quoted material, not just for formatting. Instead of using blockquote to indent content, use style sheets.\n\n\n\n\nAutomated tests cannot tell if this is an actual quote or not, so the content of any <code>blockquote should be reviwed manually to see if it is an actual quote or not.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <blockquote>Something I just wanted indented.</blockquote>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p style=\"margin-left: 20px;\">Something I just wanted indented.</p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/blockquoteUseForQuotations.rst",
    "content": "===============================\nIf long quotes are in the document, use the \"blockquote\" element to mark them\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: blockquoteUseForQuotations\n\n\n.. code-block:: html\n\n    Blockquote tags are for actual long passages of quoted material, and should be used in these cases.\n\n\n\n\nAutomated tests cannot tell if text is an actual quote or not, so the content of any <code>blockquote should be reviwed manually.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p>A long quote of several sentences. This should probably be placed in a blockquote, as it is too long to read in a single sentence, and the presence of a blockquote tag would help indicate it is actually an excerpt from somewhere else.</p>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p><blockquote>A long quote of several sentences. This should probably be placed in a blockquote, as it is too long to read in a single sentence, and the presence of a blockquote tag would help indicate it is actually an excerpt from somewhere else.</blockquote>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/bodyActiveLinkColorContrast.rst",
    "content": "===============================\nContrast between active link text and background should be 5:1\n===============================\n\nSeverity code: \n\n.. php:class:: bodyActiveLinkColorContrast\n\n\nThe contrast ratio of active link text should be at lest 5:1 between the foreground text and the background. <a href=\"http://www.w3.org/TR/WCAG20/#contrast-ratiodef\">Learn more about color contrast and how to measure it.</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/bodyColorContrast.rst",
    "content": "===============================\nContrast between text and background should be 5:1\n===============================\n\nSeverity code: \n\n.. php:class:: bodyColorContrast\n\n\nThe contrast ratio of text should be at lest 5:1 between the foreground text and the background. <a href=\"http://www.w3.org/TR/WCAG20/#contrast-ratiodef\">Learn more about color contrast and how to measure it.</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/bodyLinkColorContrast.rst",
    "content": "===============================\nContrast between link text and background should be 5:1\n===============================\n\nSeverity code: \n\n.. php:class:: bodyLinkColorContrast\n\n\nThe contrast ratio of link text should be at lest 5:1 between the foreground text and the background. <a href=\"http://www.w3.org/TR/WCAG20/#contrast-ratiodef\">Learn more about color contrast and how to measure it.</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/bodyMustNotHaveBackground.rst",
    "content": "===============================\nBody elements do not use a background image\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: bodyMustNotHaveBackground\n\n\nThe <code>body element for the page may not have a \"background\" attribute.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/bodyVisitedLinkColorContrast.rst",
    "content": "===============================\nContrast between visited link text and background should be 5:1\n===============================\n\nSeverity code: \n\n.. php:class:: bodyVisitedLinkColorContrast\n\n\nThe contrast ratio of visited link text should be at lest 5:1 between the foreground text and the background. <a href=\"http://www.w3.org/TR/WCAG20/#contrast-ratiodef\">Learn more about color contrast and how to measure it.</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/boldIsNotUsed.rst",
    "content": "===============================\nThe \"b\" (bold) element is not used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: boldIsNotUsed\n\n\nThe <code>b (bold) element provides no emphasis for non-sighted readers. Use the <code>strong tag instead.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p>I think that you <b>should really read this</b>.</p>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p>I think that you <strong>should really read this</strong>.</p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/checkboxHasLabel.rst",
    "content": "===============================\nAll checkboxes must have a corresponding label\n===============================\n\nSeverity code: 0\n\n.. php:class:: checkboxHasLabel\n\n\nAll <code>input elements with a type of \"checkbox\" should have a corresponding <code>label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user\n"
  },
  {
    "path": "docs/tests/cssDocumentMakesSenseStyleTurnedOff.rst",
    "content": "===============================\nThe document must be readable with styles turned off\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: cssDocumentMakesSenseStyleTurnedOff\n\n\nWith all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/cssTextHasContrast.rst",
    "content": "===============================\nAll elements should have appropriate color contrast\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: cssTextHasContrast\n\n\nFor users who have color blindness, all text or other elements should have a color contrast of 5:1.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/doctypeProvided.rst",
    "content": "===============================\nThe document should contain a valid \"doctype\" declaration\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: doctypeProvided\n\n\nEach document must contain a valid doctype declaration..\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <html>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\"><html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentAbbrIsUsed.rst",
    "content": "===============================\nAbbreviations must be marked with an \"abbr\" element\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: documentAbbrIsUsed\n\n\nAbbreviations should be marked with an <code>abbr element, at least once on the page for each abbreviation.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p>I work for the CIA.</p>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p>I work for the <abbr title=\"Central Intelligence Agency\">CIA</abbr>.</p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentAcronymsHaveElement.rst",
    "content": "===============================\nAcronyms must be marked with an \"acronym\" element\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: documentAcronymsHaveElement\n\n\nAbbreviations should be marked with an <code>acronym element, at least once on the page for each abbreviation.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p>I work for the CIA.</p>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p>I work for the <acronym title=\"Central Intelligence Agency\">CIA</acronym>.</p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentAllColorsAreSet.rst",
    "content": "===============================\nAll the document colors must be set\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentAllColorsAreSet\n\n\nIf any colors for text or the background are set in the <code>body element, then all colors must be set.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentAutoRedirectNotUsed.rst",
    "content": "===============================\nAuto-redirect with \"meta\" elements must not be used\n===============================\n\nSeverity code: 0\n\n.. php:class:: documentAutoRedirectNotUsed\n\n\nBecause different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to redirect users can prevent users from fully understanding the document before being redirected. If a pure redirect is needed\n"
  },
  {
    "path": "docs/tests/documentColorWaiActiveLinkAlgorithim.rst",
    "content": "===============================\nContrast between active link text and the background must be greater than the WAI ERT color algorithm threshold\n===============================\n\nSeverity code: \n\n.. php:class:: documentColorWaiActiveLinkAlgorithm\n\n\nThe contrast between foreground active link text and the background must be more than the WAI ERT threshold. <a href=\"http://www.w3.org/WAI/ER/IG/ert/#color-contrast\">Learn more about WAI ERT color contrast and how to measure it.</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentColorWaiAlgorithim.rst",
    "content": "===============================\nContrast between text and the background must be greater than the WAI ERT color algorithm threshold\n===============================\n\nSeverity code: \n\n.. php:class:: documentColorWaiAlgorithm\n\n\nThe contrast between foreground text and the background must be more than the WAI ERT threshold. <a href=\"http://www.w3.org/WAI/ER/IG/ert/#color-contrast\">Learn more about WAI ERT color contrast and how to measure it.</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentColorWaiLinkAlgorithim.rst",
    "content": "===============================\nContrast between link text and the background must be greater than the WAI ERT color algorithm threshold\n===============================\n\nSeverity code: \n\n.. php:class:: documentColorWaiLinkAlgorithm\n\n\nThe contrast between foreground link text and the background must be more than the WAI ERT threshold. <a href=\"http://www.w3.org/WAI/ER/IG/ert/#color-contrast\">Learn more about WAI ERT color contrast and how to measure it.</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentColorWaiVisitedLinkAlgorithim.rst",
    "content": "===============================\nContrast between visited link text and the background must be greater than the WAI ERT color algorithm threshold\n===============================\n\nSeverity code: \n\n.. php:class:: documentColorWaiVisitedLinkAlgorithm\n\n\nThe contrast between foreground visited link text and the background must be more than the WAI ERT threshold. <a href=\"http://www.w3.org/WAI/ER/IG/ert/#color-contrast\">Learn more about WAI ERT color contrast and how to measure it.</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentContentReadableWithoutStylesheets.rst",
    "content": "===============================\nContent should be readable without style sheets\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: documentContentReadableWithoutStylesheets\n\n\nWith all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentHasTitleElement.rst",
    "content": "===============================\nThe document should have a title element\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentHasTitleElement\n\n\nThe document should have a title element.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head></head><body>....\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title>My Great Web page</title></head><body>....\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentIDsMustBeUnique.rst",
    "content": "===============================\nAll element \"id\" attributes must be unique\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentIDsMustBeUnique\n\n\nElement \"id\" attributes must be unique.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p id=\"paragraph\">First Paragraph</p><p id=\"paragraph\">Second Paragraph</p>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p id=\"paragraph-1\">First Paragraph</p><p id=\"paragraph-2\">Second Paragraph</p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentIsWrittenClearly.rst",
    "content": "===============================\nThe document should be written to the target audience and read clearly\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: documentIsWrittenClearly\n\n\nIf a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentLangIsISO639Standard.rst",
    "content": "===============================\nThe document's language attribute should be a standard code\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentLangIsISO639Standard\n\n\nThe document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <html lang=\"English\">\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\">\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentLangNotIdentified.rst",
    "content": "===============================\nThe document must have a \"lang\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentLangNotIdentified\n\n\nThe document should have a default langauge, by setting the \"lang\" attribute in the <code>html element.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <html>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\">\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentMetaNotUsedWithTimeout.rst",
    "content": "===============================\nMeta\" elements must not be used to refresh the content of a page\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentMetaNotUsedWithTimeout\n\n\nBecause different users have different speeds and abilities when it comes to parsing the content of a page, a \"meta-refresh\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \"refresh this\" link instead..\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <head><meta http-equiv=\"refresh\" content=\"60\"></head>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <head></head><body><a href=\"here.html\">Refresh</a></body>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentReadingDirection.rst",
    "content": "===============================\nReading direction of text is correctly marked\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: documentReadingDirection\n\n\nWhere required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared.\n\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentStrictDocType.rst",
    "content": "===============================\nThe page uses a strict doctype\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentStrictDocType\n\n\nThe doctype of the page or document should be either an HTML or XHTML strict doctype.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentTitleDescribesDocument.rst",
    "content": "===============================\nThe title describes the document\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: documentTitleDescribesDocument\n\n\nThe document title should actually describe the page. Often, screen readers use the title to navigate from one window to another.\n\n\n\n\nThis test is a suggestion and should be reviewed manually.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title>Some page about something</title></head><body>....\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title>All about salamanders</title></head><body>....\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentTitleIsNotPlaceholder.rst",
    "content": "===============================\nThe document title should not be placeholder text\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentTitleIsNotPlaceholder\n\n\nThe document title should not be wasted placeholder text which does not describe the page.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title>title</title></head><body>....\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title>All about salamanders</title></head><body>....\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentTitleIsShort.rst",
    "content": "===============================\nThe document title should be short\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: documentTitleIsShort\n\n\nThe document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title>A really long title about a page about salamanders that take a long time to read which offers little to the user and is a waste of time.</title></head><body>....\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title>All about salamanders</title></head><body>....\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentTitleNotEmpty.rst",
    "content": "===============================\nThe document should not have an empty title\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentTitleNotEmpty\n\n\nThe document should have a title element that is not white space\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title> </title></head><body>....\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <html lang=\"en\"><head><title>My Great Web page</title></head><body>....\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentVisualListsAreMarkedUp.rst",
    "content": "===============================\nVisual lists of items are marked using ordered or unordered lists\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: documentVisualListsAreMarkedUp\n\n\nUse the ordered (<code>ol) or unordered (<code>ul) elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    1. Item One<br/>2. Item Two<br/>3.Item Three\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <ol><li>Item One</li><li>2. Item Two</li><li>3.Item Three</ol>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/documentWordsNotInLanguageAreMarked.rst",
    "content": "===============================\nAny words or phrases which are not the document's primary language should be marked\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: documentWordsNotInLanguageAreMarked\n\n\nIf a document has words or phrases which are not in the document's primary language, those words or phrases should be properly marked. This helps indicate which language or voice a screen-reader should use to read the text.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p>This is a paragraph in english.</p><p>Esta frase es en espa&amp;ntilde;ol.</p> (Spanish)</p>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p>This is a paragraph in english.</p><p lang=\"es\">Esta frase es en espa&amp;ntilde;ol.</p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/embedHasAssociatedNoEmbed.rst",
    "content": "===============================\nAll \"embed\" elements have an associated \"noembed\" element\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: embedHasAssociatedNoEmbed\n\n\nBecause some users cannot use the <code>embed element, provide alternative content in a <code>noembed element.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <embed src=\"html.mov\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <embed src=\"html.mov\"/><noembed>A move with <a href=\"transcript.html\">an available transcript</a>.</embed>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/embedMustHaveAltAttribute.rst",
    "content": "===============================\nEmbed\" elements must have an \"alt\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: embedMustHaveAltAttribute\n\n\nAll <code>embed elements must have an \"alt\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <embed src=\"dog.mov\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <embed src=\"dog.mov\" alt=\"A movie featuring a dog dancing a ballet.\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/embedMustNotHaveEmptyAlt.rst",
    "content": "===============================\nEmbed\" elements cannot have an empty \"alt\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: embedMustNotHaveEmptyAlt\n\n\nAll <code>embed elements must have an \"alt\" attribute that is not empty.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <embed src=\"dog.mov\" alt=\"\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <embed src=\"dog.mov\" alt=\"A movie featuring a dog dancing a ballet.\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/embedProvidesMechanismToReturnToParent.rst",
    "content": "===============================\nAll embed elements should provide a way for keyboard users to escape\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: embedProvidesMechanismToReturnToParent\n\n\nEnsure that a user who has only a keyboard as an input device can escape an <code>embed element. This requires manual confirmation.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/fileHasLabel.rst",
    "content": "===============================\nAll \"file\" input elements have a corresponding label\n===============================\n\nSeverity code: 0\n\n.. php:class:: fileHasLabel\n\n\nAll <code>input elements of type \"file\" should have a corresponding <code>label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user\n"
  },
  {
    "path": "docs/tests/fontIsNotUsed.rst",
    "content": "===============================\nFont\" elements should not be used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: fontIsNotUsed\n\n\nThe <code>basefont tag is deprecated and should not be used. Investigate using stylesheets instead.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/formDeleteIsReversable.rst",
    "content": "===============================\nDeleting items using a form should be reversable\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: formDeleteIsReversable\n\n\nCheck that, if a form has the option to delete an item, that the user has a chance to either reverse the delete process, or is asked for confirmation before the item is deleted. This is not something that can be checked through automated testing and requires manual confirmation.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/formErrorMessageHelpsUser.rst",
    "content": "===============================\nForms offer the user a way to check the results of their form before performing an irrevokable action\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: formErrorMessageHelpsUser\n\n\nIf the form allows users to perform some irrevokable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/formHasGoodErrorMessage.rst",
    "content": "===============================\nForm error messages should assist in solving errors\n===============================\n\nSeverity code: 0\n\n.. php:class:: formHasGoodErrorMessage\n\n\nIf the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \"required\" or \"error\" within the <code>label element of input items where the errors happened\n"
  },
  {
    "path": "docs/tests/formWithRequiredLabel.rst",
    "content": "===============================\nInput items which are required are marked as so in the label element\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: formWithRequiredLabel\n\n\nIf a form element is required, it should marked as so. This should not be a mere red asterisk, but instead either a 'required' image with alt text of \"required\" or the actual text \"required.\" The indicator that an item is required should be included in the input element's <code>label element.\n\n\n\n<h4>Examples</h4>Wrong\n-----\n\n.. code-block:: html\n\n    <label for=\"first_name\">First Name</label>*<input type=\"text\" id=\"first_name\" name=\"first_name\"/>\n\n\n\n\n.. code-block:: html\n\n    <label for=\"first_name\">First Name (required)</label> <input type=\"text\" id=\"first_name\" name=\"first_name\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/frameIsNotUsed.rst",
    "content": "===============================\nFrames are not used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: frameIsNotUsed\n\n\n.. code-block:: html\n\n    Frame elements should not be used.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/frameRelationshipsMustBeDescribed.rst",
    "content": "===============================\nComplex framesets should contain a \"longdesc\" attribute\n===============================\n\nSeverity code: 50\n\n.. php:class:: frameRelationshipsMustBeDescribed\n\n\nIf a <code>frameset contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <frameset cols=\"25%\n"
  },
  {
    "path": "docs/tests/frameSrcIsAccessible.rst",
    "content": "===============================\nThe source for each frame is accessible content.\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: frameSrcIsAccessible\n\n\nEach frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/frameTitlesDescribeFunction.rst",
    "content": "===============================\nAll \"frame\" elemetns should have a \"title\" attribute that describes the purpose of the frame\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: frameTitlesDescribeFunction\n\n\nEach <code>frame elements should have a \"title\" attribute which describes the purpose or function of the frame.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <frame src=\"navigation.html\"></frame>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <frame src=\"navigation.html\" title=\"The site navigation\"></frame>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/frameTitlesNotEmpty.rst",
    "content": "===============================\nFrames cannot have empty \"title\" attributes\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: frameTitlesNotEmpty\n\n\nAll <code>frame elements must have a valid \"title\" attribute.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/frameTitlesNotPlaceholder.rst",
    "content": "===============================\nFrames cannot have \"title\" attributes that are just placeholder text\n===============================\n\nSeverity code: 0\n\n.. php:class:: frameTitlesNotPlaceholder\n\n\nFrame \"title\" attributes should not be simple placeholder text like \"frame\n"
  },
  {
    "path": "docs/tests/framesHaveATitle.rst",
    "content": "===============================\nAll \"frame\" elements should have a \"title\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: framesHaveATitle\n\n\nEach <code>frame elements should have a \"title\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <frame src=\"navigation.html\"></frame>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <frame src=\"navigation.html\" title=\"The site navigation\"></frame>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/framesetIsNotUsed.rst",
    "content": "===============================\nThe \"frameset\" element should not be used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: framesetIsNotUsed\n\n\n.. code-block:: html\n\n    Frameset elements should not be used.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/framesetMustHaveNoFramesSection.rst",
    "content": "===============================\nAll framesets should contain a noframes section\n===============================\n\nSeverity code: 50\n\n.. php:class:: framesetMustHaveNoFramesSection\n\n\nIf a <code>frameset contains three or more frames, use a \"longdesc\" attribute to help describe the purpose of the frames.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <frameset cols=\"25%\n"
  },
  {
    "path": "docs/tests/headerH1.rst",
    "content": "===============================\nThe header following an h1 is h1 or h2\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH1\n\n\nThe header following an <code>h1 element should either be an <code>h2 or another <code>h1.\n\n\n\n\nUsers of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.\n\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH1Format.rst",
    "content": "===============================\nAll h1 elements are not used for formatting\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH1Format\n\n\nAn <code>h1 element may not be used purely for formatting.\n\n\n\n\nUsers of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <h1>I wanted a line to be bold and large but this is just a regular paragraph.</h1>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p class=\"large-item\"><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH2.rst",
    "content": "===============================\nThe header following an h2 is h1, h2 or h3\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH2\n\n\nThe header following an <code>h2 element should either be an <code>h3, <code>h1 or another <code>h2.\n\n\n\n\nUsers of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH2Format.rst",
    "content": "===============================\nAll h2 elements are not used for formatting\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH2Format\n\n\nAn <code>h2 element may not be used purely for formatting.\n\n\n\n\nUsers of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <h2>I wanted a line to be bold and large but this is just a regular paragraph.</h2>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p class=\"large-item\"><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH3.rst",
    "content": "===============================\nThe header following an h3 is h1, h2, h3 or h4\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH3\n\n\nThe header following an <code>h3 element should either be an <code>h4, <code>h2, <code>h1 or another <code>h3.\n\n\n\n\nUsers of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH3Format.rst",
    "content": "===============================\nAll h3 elements are not used for formatting\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH3Format\n\n\nAn <code>h3 element may not be used purely for formatting.\n\n\n\n\nUsers of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <h3>I wanted a line to be bold and large but this is just a regular paragraph.</h3>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p class=\"large-item\"><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH4.rst",
    "content": "===============================\nThe header following an h4 is h1, h2, h3, h4 or h5\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH4\n\n\nThe header following an <code>h4 element should either be an <code>h5, <code>h3, <code>h2, <code>h1, or another <code>h4.\n\n\n\n\nUsers of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH4Format.rst",
    "content": "===============================\nAll h4 elements are not used for formatting\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH4Format\n\n\nAn <code>h4 element may not be used purely for formatting.\n\n\n\n\nUsers of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <h4>I wanted a line to be bold and large but this is just a regular paragraph.</h4>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p class=\"large-item\"><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH5.rst",
    "content": "===============================\nThe header following an h5 is h6 or any header less than h6\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH5\n\n\nThe header following an <code>h5 element should either be an <code>h6,  <code>h3, <code>h2, <code>h1, or another <code>h5.\n\n\n\n\nUsers of screen readers often use headers to make sense of the structure of the document, and having headers in the right order can be very helpful. It also helps the document itself to be consistently structured.\n\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH5Format.rst",
    "content": "===============================\nAll h5 elements are not used for formatting\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH5Format\n\n\nAn <code>h5 element may not be used purely for formatting.\n\n\n\n\nUsers of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <h5>I wanted a line to be bold and large but this is just a regular paragraph.</h5>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p class=\"large-item\"><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headerH6Format.rst",
    "content": "===============================\nAll h6 elements are not used for formatting\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: headerH6Format\n\n\nAn <code>h6 element may not be used purely for formatting.\n\n\n\n\nUsers of screen readers often use headers to discover the structure of the document, and using headers for formatting can cause this method of navigating the document to be confusing. Try using CSS styles to apply formatting to the item instead.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <h6>I wanted a line to be bold and large but this is just a regular paragraph.</h6>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p class=\"large-item\"><strong>I wanted a line to be bold and large but this is just a regular paragraph.</strong></p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headersHaveText.rst",
    "content": "===============================\nAll headers should contain readable text\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: headersHaveText\n\n\nUsers with screen readers use headings like the tabs <em>h1</em> to navigate the structure of a page. All headings should contain either text, or images with appropriate <em>alt</em> attributes.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/headersUseToMarkSections.rst",
    "content": "===============================\nUse headers to mark the beginning of each section\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: headersUseToMarkSections\n\n\nCheck that each logical section of the page is broken or introduced with a header (<code><h1-h6>) element.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/iIsNotUsed.rst",
    "content": "===============================\nThe \"i\" (italic) element is not used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: iIsNotUsed\n\n\nThe <code>i (italic) element provides no emphasis for non-sighted readers. Use the <code>em tag instead.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p>I think that you <i>should really read this</i>.</p>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p>I think that you <em>should really read this</em>.</p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/iframeMustNotHaveLongdesc.rst",
    "content": "===============================\nInline frames (\"iframes\") should not have a \"longdesc\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: iframeMustNotHaveLongdesc\n\n\n.. code-block:: html\n\n    Iframe elements should not have a \"longdesc\" attribute.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imageMapServerSide.rst",
    "content": "===============================\nAll links in a server-side map should have duplicate links available in the document\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: imageMapServerSide\n\n\nAny image with an \"usemap\" attribute for a server-side image map should have the available links duplicated elsewhere.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgAltEmptyForDecorativeImages.rst",
    "content": "===============================\nIf an image is purely decorative, the \"alt\" text must be empty\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgAltEmptyForDecorativeImages\n\n\nAny image that is only decorative (serves no function or adds to the purpose of the page content) should have an \"alt\" attribute\n"
  },
  {
    "path": "docs/tests/imgAltIdentifiesLinkDestination.rst",
    "content": "===============================\nAny image within a link must have \"alt\" text the describes the link destination\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: imgAltIdentifiesLinkDestination\n\n\nAny image that is within a link should have an \"alt\" attribute which identifies the destination or purpose of the link.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <a href=\"home.html\"><img src=\"home.png\" alt=\"A house\"></a>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <a href=\"home.html\"><img src=\"home.png\" alt=\"Return to the home page\"></a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgAltIsDifferent.rst",
    "content": "===============================\nImage \"alt\" attributes should not be the same as the filename\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgAltIsDifferent\n\n\nAll <code>img elements should have an \"alt\" attribute that is not just the name of the file\n"
  },
  {
    "path": "docs/tests/imgAltIsSameInText.rst",
    "content": "===============================\nCheck that any text within an image is also in the \"alt\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgAltIsSameInText\n\n\nIf an image has text within it, that text should be repeated in the \"alt\" attribute\n"
  },
  {
    "path": "docs/tests/imgAltIsTooLong.rst",
    "content": "===============================\nImage Alt text is short\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgAltIsTooLong\n\n\nAll \"alt\" attributes for <code>img elements should be clear and concise. \"Alt\" attributes over 100 characters long should be reviewed to see if they are too long.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.jpg\" alt=\"A photograph of my very\n"
  },
  {
    "path": "docs/tests/imgAltNotEmptyInAnchor.rst",
    "content": "===============================\nAn image within a link cannot have an empty \"alt\" attribute if there is no other text within the link\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: imgAltNotEmptyInAnchor\n\n\nAny image that is within a link (an <code>a element) that has no other text cannot have an empty or missing \"alt\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <a href=\"index.html\"><img src=\"home.png\" alt=\"\"></a>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <a href=\"index.html\"><img src=\"home.png\" alt=\"Return Home\"></a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgAltNotPlaceHolder.rst",
    "content": "===============================\nImages should not have a simple placeholder text as an \"alt\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: imgAltNotPlaceHolder\n\n\nAny image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of placeholders. Placeholders include:\n\n\n\n<ul><li>nbsp</li><li>&amp;nbsp;</li><li>spacer</li><li>image</li><li>img</li><li>photo</li></ul>Example\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.jpg\" alt=\"image\">\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.jpg\" alt=\"A photograph of a dog\">\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgHasAlt.rst",
    "content": "===============================\nImage elements must have an \"alt\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: imgHasAlt\n\n\nAll <code>img elements must have an alt attribute\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.jpg\">\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.jpg\" alt=\"A photograph of a dog\">\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgHasLongDesc.rst",
    "content": "===============================\nA \"longdesc\" attribute is required for any image where additional information not in the \"alt\" attribute is required\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: imgHasLongDesc\n\n\nAny image that has an \"alt\" attribute that does not fully convey the meaning of the image must have a \"longdesc\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <img src=\"complexImage.png\" alt=\"A complex image that cannot be described succinctly.\">\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <img src=\"complexImage.png\" alt=\"A complex image that cannot be described succinctly.\" longdesc=\"longer_description.html\">\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgImportantNoSpacerAlt.rst",
    "content": "===============================\nImages that are important should not have a purely white-space \"alt\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgImportantNoSpacerAlt\n\n\nAny image that is not used decorativey or which is purely for layout purposes cannot have an \"alt\" attribute that consists solely of white space (i.e. a space\n"
  },
  {
    "path": "docs/tests/imgMapAreasHaveDuplicateLink.rst",
    "content": "===============================\nAll links within a client-side image are duplicated elsewhere in the document\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgMapAreasHaveDuplicateLink\n\n\nAny image that has a \"usemap\" attribute must have links replicated somewhere else in the document.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p><map name=\"imagemap\" id=\"map1\"><area shape=\"poly\" coords=\"185\n"
  },
  {
    "path": "docs/tests/imgNeedsLongDescWDlink.rst",
    "content": "===============================\nAn image with a \"longdesc\" attribute should have a corresponding description link\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgNeedsLongDescWDlink\n\n\nAny image that has a \"longdesc\" attribute must also have a corresponding \"d-link\n"
  },
  {
    "path": "docs/tests/imgNonDecorativeHasAlt.rst",
    "content": "===============================\nAny non-decorative images should have a non-empty \"alt\" attribute\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: imgNonDecorativeHasAlt\n\n\nAny image that is not used decorativey or which is purely for layout purposes cannot have an empty \"alt\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.jpg\" alt=\"\">\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.jpg\" alt=\"A photograph of a dog\">\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgNotReferredToByColorAlone.rst",
    "content": "===============================\nFor any image, the \"alt\" text cannot refer to color alone\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgNotReferredToByColorAlone\n\n\nThe \"alt\" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the \"alt\" text to the meaning of the image\n"
  },
  {
    "path": "docs/tests/imgServerSideMapNotUsed.rst",
    "content": "===============================\nServer-side image maps should not be used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: imgServerSideMapNotUsed\n\n\nServer-side image maps should not be used.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgShouldNotHaveTitle.rst",
    "content": "===============================\nImages should not have a \"title\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: imgShouldNotHaveTitle\n\n\nImages should not contain a \"title\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.png\" alt=\"My brown dog\" title=\"A dog\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <img src=\"dog.png\" alt=\"My brown dog\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/imgWithMapHasUseMap.rst",
    "content": "===============================\nAny image with an \"ismap\" attribute have a valid \"usemap\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: imgWithMapHasUseMap\n\n\nIf an image has an \"ismap\" attribute\n"
  },
  {
    "path": "docs/tests/inputCheckboxRequiresFieldset.rst",
    "content": "===============================\nLogical groups of check boxes should be grouped with a \"fieldset\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: inputCheckboxRequiresFieldset\n\n\nRelated \"checkbox\" input fields should be grouped together using a <code>fieldset\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <input type=\"checkbox\" name=\"option-a\" id=\"a\"/><label for=\"a\">Option A</label><br/><input type=\"checkbox\" name=\"option-b\" id=\"b\"/><label for=\"b\">Option B</label>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <fieldset><legend>Several options</legend><input type=\"checkbox\" name=\"option-a\" id=\"a\"/><label for=\"a\">Option A</label><br/><input type=\"checkbox\" name=\"option-b\" id=\"b\"/><label for=\"b\">Option B</label></fieldset>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/inputElementsDontHaveAlt.rst",
    "content": "===============================\nInput elements which are not images should not have an \"alt\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: inputElementsDontHaveAlt\n\n\nBecause of inconsistencies in how user agents use the \"alt\" attribute\n"
  },
  {
    "path": "docs/tests/inputImageAltIsNotFileName.rst",
    "content": "===============================\nAll \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not the same as the filename\n===============================\n\nSeverity code: 0\n\n.. php:class:: inputImageAltIsNotFileName\n\n\nAll <code>input elements with a type of \"image\" should have an \"alt\" attribute\n"
  },
  {
    "path": "docs/tests/inputImageAltIsNotPlaceholder.rst",
    "content": "===============================\nAll \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is not placeholder text\n===============================\n\nSeverity code: 0\n\n.. php:class:: inputImageAltIsNotPlaceholder\n\n\nAll <code>input elements with a type of \"image\" should have an \"alt\" attribute\n"
  },
  {
    "path": "docs/tests/inputImageAltIsShort.rst",
    "content": "===============================\nAll \"input\" elements with a type of \"image\" must have an \"alt\" attribute which is as short as possible\n===============================\n\nSeverity code: 0\n\n.. php:class:: inputImageAltIsShort\n\n\nAll <code>input elements with a type of \"image\" should have an \"alt\" attribute\n"
  },
  {
    "path": "docs/tests/inputImageAltNotRedundant.rst",
    "content": "===============================\nThe \"alt\" text for input \"image\" submit buttons must not be filler text\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: inputImageAltNotRedundant\n\n\nEvery form image button should not simply use filler text like \"button\" or \"submit\" as the \"alt\" text.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <input type=\"image\" src=\"mangifier.png\" alt=\"submit\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <input type=\"image\" src=\"mangifier.png\" alt=\"Search this site\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/inputImageHasAlt.rst",
    "content": "===============================\nAll \"input\" elements with a type of \"image\" must have an \"alt\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: inputImageHasAlt\n\n\nAll <code>input elements with a type of \"image\" should have an \"alt\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <input type=\"image\" name=\"search\" src=\"search.png\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <input type=\"image\" name=\"search\" src=\"search.png\" alt=\"Search\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/inputTextHasLabel.rst",
    "content": "===============================\nAll \"input\" elements should have a corresponding \"label\n===============================\n\nSeverity code: 0\n\n.. php:class:: inputTextHasLabel\n\n\nAll <code>input elements should have a corresponding <code>label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user\n"
  },
  {
    "path": "docs/tests/inputTextHasValue.rst",
    "content": "===============================\nAll \"input\" elements of type \"text\" must have a default text\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: inputTextHasValue\n\n\nAll <code>input elements with a type of \"text\" should have a default text.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <label for=\"search\">Search: </label><input type=\"text\" name=\"search\" id=\"search\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <label for=\"search\">Search: </label><input type=\"text\" name=\"search\" id=\"search\" value=\"Search\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/inputTextValueNotEmpty.rst",
    "content": "===============================\nText\" input elements require a non-whitespace default text\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: inputTextValueNotEmpty\n\n\nAll <code>input elements with a type of \"text\" should have a default text which is not empty.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <label for=\"search\">Search: </label><input type=\"text\" name=\"search\" id=\"search\" value=\"\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <label for=\"search\">Search: </label><input type=\"text\" name=\"search\" id=\"search\" value=\"Search\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/labelDoesNotContainInput.rst",
    "content": "===============================\nLabel\" elements should not contain an input element\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: labelDoesNotContainInput\n\n\n.. code-block:: html\n\n    Label elements should not contain an <code>input element as well.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <label for=\"first_name\">First name: <input type=\"text\" id=\"first_name\" name=\"first_name\"/></label>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <label for=\"first_name\">First name: </label><input type=\"text\" id=\"first_name\" name=\"first_name\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/labelMustBeUnique.rst",
    "content": "===============================\nEvery form input must have only one label\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: labelMustBeUnique\n\n\nEach form input should have only one <code>label element.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <label for=\"first_name\"> First name:</label> <label for=\"first_name\">(Required)</label> <input type=\"text\" id=\"first_name\" name=\"first_name\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <label for=\"first_name\"> First name: (Required)</label> <input type=\"text\" id=\"first_name\" name=\"first_name\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/labelMustNotBeEmpty.rst",
    "content": "===============================\nLabels must contain text\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: labelMustNotBeEmpty\n\n\n.. code-block:: html\n\n    Label elements should contain text which communicates the purpose of its assigned input element.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <label for=\"first_name\"> </label>First name: <input type=\"text\" id=\"first_name\" name=\"first_name\"/>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <label for=\"first_name\">First name: </label><input type=\"text\" id=\"first_name\" name=\"first_name\"/>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/labelsAreAssignedToAnInput.rst",
    "content": "===============================\nAll labels should be associated with an input\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: labelsAreAssignedToAnInput\n\n\nAll <code>label elements should be assigned to an input item, and should have a <em>for</em> attribute which equals the <em>id</em> attribute of a form element.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/legendTextNotEmpty.rst",
    "content": "===============================\nLegend\" text must not contain just whitespace\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: legendTextNotEmpty\n\n\nIf a <code>legend element is used in a fieldset, the <code>legend should not contain empty text.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <fieldset>    <legend> </legend>    <label for=\"name\">Name:</label> <input type=\"text\" size=\"30\" id=\"name\"/><br />    <label for=\"email\">Email:</label> <input type=\"text\" size=\"30\" id=\"email\"/><br /></fieldset>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <fieldset>    <legend>Personal Information:</legend>    <label for=\"name\">Name:</label> <input type=\"text\" size=\"30\" id=\"name\"/><br />    <label for=\"email\">Email:</label> <input type=\"text\" size=\"30\" id=\"email\"/><br /></fieldset>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/legendTextNotPlaceholder.rst",
    "content": "===============================\nLegend\" text must not contain placeholder text like \"form\" or \"field\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: legendTextNotPlaceholder\n\n\nIf a <code>legend element is used in a fieldset, the <code>legend should not contain useless placeholder text.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <fieldset>    <legend>Form</legend>    <label for=\"name\">Name:</label> <input type=\"text\" size=\"30\" id=\"name\"/><br />    <label for=\"email\">Email:</label> <input type=\"text\" size=\"30\" id=\"email\"/><br /></fieldset>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <fieldset>    <legend>Personal Information:</legend>    <label for=\"name\">Name:</label> <input type=\"text\" size=\"30\" id=\"name\"/><br />    <label for=\"email\">Email:</label> <input type=\"text\" size=\"30\" id=\"email\"/><br /></fieldset>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/linkUsedForAlternateContent.rst",
    "content": "===============================\nUse a \"link\" element for alternate content\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: linkUsedForAlternateContent\n\n\nDocuments which contain things like videos, sound, or other forms of media that are not accessible, should provide a <code>link element with a \"rel\" attribute of \"alternate\" in the document header.\n\n\n\nExample\n-------\n\n.. code-block:: html\n\n    <head><link rel=\"alternate\" href=\"transcription.html\"/></head>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/linkUsedToDescribeNavigation.rst",
    "content": "===============================\nDocument uses link element to describe navigation if it is within a collection.\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: linkUsedToDescribeNavigation\n\nThe link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units.\n"
  },
  {
    "path": "docs/tests/listNotUsedForFormatting.rst",
    "content": "===============================\nLists should not be used for formatting\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: listNotUsedForFormatting\n\n\nLists like <code>ul and <code>ol are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <ul><li>Something I just wanted indented</li></ul>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <p style=\"margin-left: 10px;\">Something I just wanted indented</p>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/marqueeIsNotUsed.rst",
    "content": "===============================\nThe \"marquee\" tag should not be used\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: marqueeIsNotUsed\n\n\nThe <code>marquee element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <marquee>This is really hard to read</marquee>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <strong>This is much easier to read</strong>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/noembedHasEquivalentContent.rst",
    "content": "===============================\nNoembed\" elements must be the same content as their \"embed\" element\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: noembedHasEquivalentContent\n\n\nAll <code>noembed elements must contain or link to an accessible version of their <code>embed counterparts.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <embed src=\"podcast.mp3\"/><noembed>Some podcast</noembed>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <embed src=\"podcast.mp3\"/><noembed>A podcast about dogs. <a href=\"transcript.html\">Read the full transcript</a>.</noembed>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/noframesSectionMustHaveTextEquivalent.rst",
    "content": "===============================\nAll \"noframes\" elements should contain the text content from all frames\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: noframesSectionMustHaveTextEquivalent\n\n\nThe <code>noframes content should either replicate or link to the content visible within the frames.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectContentUsableWhenDisabled.rst",
    "content": "===============================\nWhen objects are disabled, content should still be available\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectContentUsableWhenDisabled\n\n\nThe content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the <code>object tag.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <object src=\"something.html\"></object>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <object src=\"something.html\"><a href=\"something.html\">Read something</a></object>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectDoesNotFlicker.rst",
    "content": "===============================\nObjects do not flicker\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectDoesNotFlicker\n\n\nThe content within an <code>object tag must not flicker.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectDoesNotUseColorAlone.rst",
    "content": "===============================\nObjects must not use color to communicate alone\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectDoesNotUseColorAlone\n\n\nObjects should contain content that makes sense without color and is accessible to users who are color blind.\n\n\n\n\n<strong>Objects cannot be checked using automated tools, this should be reviewed manually.</strong>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectInterfaceIsAccessible.rst",
    "content": "===============================\nInterfaces within objects must be accessible\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectInterfaceIsAccessible\n\n\nObject content should be assessed for accessibility.\n\n\n\n\n<strong>Objects cannot be checked using automated tools, this should be reviewed manually.</strong>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectLinkToMultimediaHasTextTranscript.rst",
    "content": "===============================\nObjects which reference multimedia files should also provide a link to a transcript\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectLinkToMultimediaHasTextTranscript\n\n\nIf an object contains a video, a link to the transcript should be provided near the object.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <object src=\"video.mov\"></object>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <object src=\"video.mov\"></object><a href=\"transcript.html\">Read Transcript of the video</a>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectMustContainText.rst",
    "content": "===============================\nObjects must contain their text equivalents\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: objectMustContainText\n\n\nAll <code>object elements should contain a text equivalent if the object cannot be rendered.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <object src=\"widget.html\" title=\"\"></object>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <object src=\"widget.html\" title=\"A small web widget\">A widget of stock prices. <a href=\"widget.html\">Access this widget.</a></object>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectMustHaveEmbed.rst",
    "content": "===============================\nEvery object should contain an \"embed\" element\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: objectMustHaveEmbed\n\n\nEvery <code>object element must also contain an <code>embed element.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <object data=\"movie.mov\"></object>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <object data=\"movie.mov\"><embed src=\"movie.mov\"></embed></object>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectMustHaveTitle.rst",
    "content": "===============================\nObjects should have a title attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: objectMustHaveTitle\n\n\nAll <code>object elements should contain a \"title\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <object src=\"widget.html\"></object>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <object src=\"widget.html\" title=\"A small web widget\"></object>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectMustHaveValidTitle.rst",
    "content": "===============================\nObjects must not have an empty title attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: objectMustHaveValidTitle\n\n\nAll <code>object elements should have a \"title\" attribute which is not empty.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <object src=\"widget.html\" title=\"\"></object>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <object src=\"widget.html\" title=\"A small web widget\"></object>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectProvidesMechanismToReturnToParent.rst",
    "content": "===============================\nAll objects should provide a way for keyboard users to escape\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectProvidesMechanismToReturnToParent\n\n\nEnsure that a user who has only a keyboard as an input device can escape a <code>object element. This requires manual confirmation.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectShouldHaveLongDescription.rst",
    "content": "===============================\nAn object might require a long description\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectShouldHaveLongDescription\n\n\nObjects might require a long description, especially if their content is complicated.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <object data=\"map_of_the_world.mov\"></object>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <object data=\"map_of_the_world.mov\" longdesc=\"description.html\"></object>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectTextUpdatesWhenObjectChanges.rst",
    "content": "===============================\nThe text equivalents of an object should update if the object changes\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectTextUpdatesWhenObjectChanges\n\n\nIf an object changes, the text equivalent of that object should also change.\n\n\n\n\n<strong>Objects cannot be checked using automated tools, this should be reviewed manually.</strong>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectUIMustBeAccessible.rst",
    "content": "===============================\nContent within an \"object\" element should be usable with objects disabled\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: objectUIMustBeAccessible\n\n\nObjects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/objectWithClassIDHasNoText.rst",
    "content": "===============================\nObjects with \"classid\" attributes should change their text if the content of the object changes\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: objectWithClassIDHasNoText\n\n\nObjects who's content changes using java, ActiveX, or other similar technologies, should have their default text change when the object's content changes.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/pNotUsedAsHeader.rst",
    "content": "===============================\nParagraphs must not be used for headers\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: pNotUsedAsHeader\n\n\nHeaders like <code>h1-h6 are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <p><strong>Something that really should be a header</strong></p>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <h3>Something that really should be a header</h3>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/passwordHasLabel.rst",
    "content": "===============================\nAll password input elements should have a corresponding label\n===============================\n\nSeverity code: 0\n\n.. php:class:: passwordHasLabel\n\n\nAll <code>input elements with a type of \"password\"should have a corresponding <code>label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user\n"
  },
  {
    "path": "docs/tests/preShouldNotBeUsedForTabularLayout.rst",
    "content": "===============================\nPre\" elements should not be used for tabular data\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: preShouldNotBeUsedForTabularLayout\n\n\nIf a <code>pre element is used for tabular data, change the data to use a well-formed table.\n\n\n\n\n\n"
  },
  {
    "path": "docs/tests/radioHasLabel.rst",
    "content": "===============================\nAll \"radio\" input elements have a corresponding label\n===============================\n\nSeverity code: 0\n\n.. php:class:: radioHasLabel\n\n\nAll <code>input elements of type \"radio\" should have a corresponding <code>label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user\n"
  },
  {
    "path": "docs/tests/radioMarkedWithFieldgroupAndLegend.rst",
    "content": "===============================\nAll radio button groups are marked using fieldset and legend elements.\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: radioMarkedWithFieldgroupAndLegend\n\nform element content must contain both fieldset and legend elements if there are related radio buttons.\n"
  },
  {
    "path": "docs/tests/scriptContentAccessibleWithScriptsTurnedOff.rst",
    "content": "===============================\nContent on the page should still be available if scripts are disabled\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: scriptContentAccessibleWithScriptsTurnedOff\n\n\nAll scripts should be assessed to see if, when the user is browing with scrips turned off, the page content is still available.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/scriptInBodyMustHaveNoscript.rst",
    "content": "===============================\nScripts should have a corresponding \"noscript\" element\n===============================\n\nSeverity code: 0\n\n.. php:class:: scriptInBodyMustHaveNoscript\n\n\nScripts should be followed by a <code>noscripts element to guide the user to content in an alternative way.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <script type=\"text/javascript\">document.write(\"Hello World!\")</script>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <script type=\"text/javascript\">document.write(\"Hello World!\")</script><noscript>Hello\n"
  },
  {
    "path": "docs/tests/scriptOnclickRequiresOnKeypress.rst",
    "content": "===============================\nIf an element has an \"onclick\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: scriptOnclickRequiresOnKeypress\n\nit should also have an \"onkeypress\" attribute\n"
  },
  {
    "path": "docs/tests/scriptOndblclickRequiresOnKeypress.rst",
    "content": "===============================\nAny element with an \"ondblclick\" attribute shoul have a keyboard-related action as well\n===============================\n\nSeverity code: 0\n\n.. php:class:: scriptOndblclickRequiresOnKeypress\n\n\nIf an element has an \"ondblclick\" attribute\n"
  },
  {
    "path": "docs/tests/scriptOnmousedownRequiresOnKeypress.rst",
    "content": "===============================\nIf an element has a \"mousedown\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: scriptOnmousedownRequiresOnKeypress\n\nit should also have an \"onkeydown\" attribute\n"
  },
  {
    "path": "docs/tests/scriptOnmousemove.rst",
    "content": "===============================\nAny element with an \"onmousemove\" attribute shoul have a keyboard-related action as well\n===============================\n\nSeverity code: 0\n\n.. php:class:: scriptOnmousemove\n\n\nIf an element has an \"onmousemove\" attribute\n"
  },
  {
    "path": "docs/tests/scriptOnmouseoutHasOnmouseblur.rst",
    "content": "===============================\nIf an element has a \"onmouseout\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: scriptOnmouseoutHasOnmouseblur\n\nit should also have an \"onblur\" attribute\n"
  },
  {
    "path": "docs/tests/scriptOnmouseoverHasOnfocus.rst",
    "content": "===============================\nIf an element has an \"onmouseover\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: scriptOnmouseoverHasOnfocus\n\nit should also have an \"onfocus\" attribute\n"
  },
  {
    "path": "docs/tests/scriptOnmouseupHasOnkeyup.rst",
    "content": "===============================\nIf an element has an \"onmouseup\" attribute\n===============================\n\nSeverity code: 0\n\n.. php:class:: scriptOnmouseupHasOnkeyup\n\nit should also have an \"onkeyup\" attribute\n"
  },
  {
    "path": "docs/tests/scriptsDoNotFlicker.rst",
    "content": "===============================\nScripts should not cause the screen to flicker\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: scriptsDoNotFlicker\n\n\nAll scripts should be assessed to see if their interface does not flicker.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/scriptsDoNotUseColorAlone.rst",
    "content": "===============================\nThe interface in scripts should not use color alone\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: scriptsDoNotUseColorAlone\n\n\nAll scripts should be assessed to see if their interface does not have an interface which requires distinguishing beteween colors alone.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/selectDoesNotChangeContext.rst",
    "content": "===============================\nSelect\" elemetns must not contain an \"onchange\" attribute\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: selectDoesNotChangeContext\n\n\nActions like \"onchange\" can take control away from users who are trying to navigate the page. Using an \"onchange\" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <form><select onchange=\"location = this.options[this.selectedIndex].value;\"><option value=\"home.html\">Home Page</option><option value=\"dog.html\">My Dog</option></select></form>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <form action=\"go.html\"><select><option value=\"home.html\">Home Page</option><option value=\"dog.html\">My Dog</option></select><input type=\"submit\" value=\"Go\"/></form>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/selectHasAssociatedLabel.rst",
    "content": "===============================\nAll select elements have an explicitly associated label.\n===============================\n\nSeverity code: 0\n\n.. php:class:: selectHasAssociatedLabel\n\n\nAll <code>select elements should have a corresponding <code>label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user\n"
  },
  {
    "path": "docs/tests/selectJumpMenu.rst",
    "content": "===============================\nSelect jump menus should jump on button press, not on state change\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: selectJumpMenus\n\n\nIf you wish to use a 'Jump' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select eleemnt.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/siteMap.rst",
    "content": "===============================\nWebsites must have a site map\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: siteMap\n\n\nEvery web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices.\n\n\n\n\n\n"
  },
  {
    "path": "docs/tests/skipToContentLinkProvided.rst",
    "content": "===============================\nA \"skip to content\" link should exist as one of the first links on the page\n===============================\n\nSeverity code: 0\n\n.. php:class:: skipToContentLinkProvided\n\n\nA link reading \"skip to content\n"
  },
  {
    "path": "docs/tests/svgContainsTitle.rst",
    "content": "===============================\nInline SVG should use Title elements\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: svgContainsTitle\n\n\nAny inline SVG image should have an embedded <code>title element\n"
  },
  {
    "path": "docs/tests/tabIndexFollowsLogicalOrder.rst",
    "content": "===============================\nThe tab order of a document is logical\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: tabIndexFollowsLogicalOrder\n\n\nCheck that the tab-order of a page is logical.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableCaptionIdentifiesTable.rst",
    "content": "===============================\nCaptions should identify their table\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: tableCaptionIdentifiesTable\n\n\nCheck to make sure that a table's caption identifies the table with a name, figure number, etc.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableComplexHasSummary.rst",
    "content": "===============================\nComplex tables should have a summary\n===============================\n\nSeverity code: 0\n\n.. php:class:: tableComplexHasSummary\n\n\nIf a table is complex (for example, has some cells with \"colspan\" attributes\n"
  },
  {
    "path": "docs/tests/tableDataShouldHaveTh.rst",
    "content": "===============================\nData tables should contain \"th\" elements\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: tableDataShouldHaveTh\n\n\nTables which contain data (as opposed to layout tables) should contain <code>th elements to mark headers for screen readers and enhance the structure of the document.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <table><tr><td>Header One</td><td>Header Two</td></tr><tr><td>1.30</td><td>4.50</td></tr></table>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <table><tr><th>Header One</th><th>Header Two</th></tr><tr><td>1.30</td><td>4.50</td></tr></table>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableIsGrouped.rst",
    "content": "===============================\nMark up the areas of tables using \"thead\n===============================\n\nSeverity code: 0\n\n.. php:class:: tableIsGrouped\n\ntbody\n"
  },
  {
    "path": "docs/tests/tableLayoutDataShouldNotHaveTh.rst",
    "content": "===============================\nLayout tables should not contain \"th\" elements\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: tableLayoutDataShouldNotHaveTh\n\n\nTables which are used purely for layout (as opposed to data tables), <strong>should not</strong> contain <code>th elements, which would make the table appear to be a data table.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <table><tr><th>Sidebar</th><th>Content</th><tr><td>Navigation</td><td>Stuff</td></tr></table>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <table><tr><td>Sidebar</td><td>Content</td><tr><td>Navigation</td><td>Stuff</td></tr></table>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableLayoutHasNoCaption.rst",
    "content": "===============================\nAll tables used for layout have no \"caption\" element\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: tableLayoutHasNoCaption\n\n\nIf a table contains no data, and is used simply for layout, then it should not contain a <code>caption element.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <table><caption>The layout of this page, broken into two areas.</caption>...\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <table>...\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableLayoutHasNoSummary.rst",
    "content": "===============================\nAll tables used for layout have no summary or an empty summary\n===============================\n\nSeverity code: 0\n\n.. php:class:: tableLayoutHasNoSummary\n\n\nIf a table contains no data, and is used simply for layout, then it should not have a \"summary\" attribute\n"
  },
  {
    "path": "docs/tests/tableLayoutMakesSenseLinearized.rst",
    "content": "===============================\nAll tables used for layout should make sense when removed\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: tableLayoutMakesSenseLinearized\n\n\nIf a <code>table element is used for layout purposes only, then the content of the table should make sense if the table is linearized.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableSummaryDoesNotDuplicateCaption.rst",
    "content": "===============================\nTable \"summary\" elements should not duplicate the \"caption\" element\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: tableSummaryDoesNotDuplicateCaption\n\n\nThe summary and the caption must be different, as both provide different information. A <code>caption</code element identifies the table., while the \"summary\" attribute describes the table contents.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableSummaryIsEmpty.rst",
    "content": "===============================\nAll data tables should have a summary\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: tableSummaryIsEmpty\n\n\nIf a table contains data, it should have a \"summary\" attribute.\n\n\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <table>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <table summary=\"A table of data\">\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableUseColGroup.rst",
    "content": "===============================\nGroup columns using \"colgroup\" or \"col\" elements\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: tableUseColGroup\n\n\nTo help complex table headers make sense, use <code>colgroup or <code>col to group them together.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableUsesAbbreviationForHeader.rst",
    "content": "===============================\nTable headers over 20 characters should provide an \"abbr\" attribute\n===============================\n\n*Severity code:* Information only\n\n.. php:class:: tableUsesAbbreviationForHeader\n\n\nFor long table headers, use an \"abbr\" attribute that is less than short (less than 20 characters long).\n\n\n\n<h4>Examples</h4>Wrong\n-----\n\n.. code-block:: html\n\n    <th>The total number of people who liked chocolate</th>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <th abbr=\"Like Chocolate\">The total number of people who liked chocolate</th>\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tableUsesCaption.rst",
    "content": "===============================\nData tables should contain a \"caption\" element if not described elsewhere\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: tableUsesCaption\n\n\nUnless otherwise described in the document, tables should contain <code>caption elements to describe the purpose of the table.\n\n\n\nExample\n-------\n<table><caption>A short description of this table</caption></table>\n"
  },
  {
    "path": "docs/tests/tableUsesScopeForRow.rst",
    "content": "===============================\nData tables should use scoped headers for rows with headers\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: tableUsesScopeForRow\n\n\nWhere there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight.\n\nExample\n-------\nWrong\n-----\n\n.. code-block:: html\n\n    <table>\n      <thead>\n        <tr>\n          <th>Should be scoped</th>\n          <th>Item two</th>\n          <th>Item three</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td><strong>Row one</strong></td>\n          <td>1</td>\n          <td>2</td>\n        </tr>\n        <tr>\n          <td><strong>Row two</strong></td>\n          <td>1</td>\n          <td>2</td>\n        </tr>\n      </tbody>\n    </table>\n\n\n\nRight\n-----\n\n.. code-block:: html\n\n    <table>\n      <thead>\n        <tr>\n          <th>Should be scoped</th>\n          <th>Item two</th>\n          <th>Item three</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th scope=\"row\"><strong>Row one</strong></th>\n          <td>1</td>\n          <td>2</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Row two</th>\n          <td>1</td>\n          <td>2</td>\n        </tr>\n      </tbody>\n    </table>"
  },
  {
    "path": "docs/tests/tableWithBothHeadersUseScope.rst",
    "content": "===============================\nData tables with multiple headers should use the \"scope\" attribute\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: tableWithBothHeadersUseScope\n\n\nWhere there are table headers for both rows and columns, use the \"scope\" attribute to help relate those headers with their appropriate cells.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/tabularDataIsInTable.rst",
    "content": "===============================\nAll tabular information should use a table\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: tabularDataIsInTable\n\n\nTables should be used when displaying tabular information.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/textIsNotSmall.rst",
    "content": "===============================\nThe text size is not less than 9 pixels high\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: textIsNotSmall\n\n\nTo help users with difficulty reading small text, ensure text size is no less than 9 pixels high.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/textareaHasAssociatedLabel.rst",
    "content": "===============================\nAll textareas should have a corresponding label\n===============================\n\nSeverity code: 0\n\n.. php:class:: textareaHasAssociatedLabel\n\n\nAll <code>textarea elements should have a corresponding <code>label element. Screen readers often enter a \"form mode\" where only label text is read aloud to the user\n"
  },
  {
    "path": "docs/tests/videoProvidesCaptions.rst",
    "content": "===============================\nAll video tags must provide captions\n===============================\n\n*Severity code:* Possible error\n\n.. php:class:: videoProvidesCaptions\n\n\nAll HTML5 video tags must provide captions.\n\n\n\n\n"
  },
  {
    "path": "docs/tests/videosEmbeddedOrLinkedNeedCaptions.rst",
    "content": "===============================\nAll linked or embedded videos need captions\n===============================\n\n*Severity code:* Severe error\n\n.. php:class:: videosEmbeddedOrLinkedNeedCaptions\n\n\nAny video hosted or otherwise which is linked or embedded must have a caption.\n\n\n\n\n"
  },
  {
    "path": "examples/common/style.css",
    "content": ".quail-result { padding: 3px; border-radius: 3px;}\n  .quail-result.severe { border: 3px dashed red; }\n  .quail-result.moderate { border: 3px dashed orange; }\n  .quail-result.reccomendation { border: 3px solid green; }\n\n.quail-message { padding: 4px; border-radius: 2px; background: #d8b3b3; }\n\n#enable-accessibility {\n  position: fixed;\n  bottom: 0px;\n  left: 20px;\n  font-size: 14px;\n  background: #5BA0D0;\n  padding: 10px;\n  border-radius: 5px 5px 0 0;\n}\n\n#enable-accessibility a {\n  color: #fff;\n  text-decoration: none;\n}\n\nbody {\n  padding: 40px;\n}\n\ntextarea {\n  width: 600px;\n  height: 400px;\n  margin: 40px auto;\n}"
  },
  {
    "path": "examples/editors/aloha.html",
    "content": "<!DOCTYPE>\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<title>Aloha Editor Example</title>\n\t<link rel=\"stylesheet\" href=\"http://cdn.aloha-editor.org/latest/css/aloha.css\" type=\"text/css\">\n\t<link rel=\"stylesheet\" href=\"../../lib/aloha-editor/aloha/demo/simple/index.css\" type=\"text/css\">\n\t\t<link rel=\"stylesheet\" href=\"../common/style.css\"/>\n\t</head>\n\t<body>\n\t<div id=\"main\">\n\t <div id=\"content\"><p>Here is a picture of my dog, Kogepan:</p>\n\t\t<p>\n\t\t  <img src=\"../common/kogepan.png\">\n\t\t</p>\n\t\t<p>\n\t\t  I should really use an ABBR tag in this paragraph because QUAIL is an acronym.\n\t\t</p>\n\t\t</div>\n\t</div>\n\t\n\t<script src=\"../../lib/jquery/jquery.js\"></script>\n\t<script type=\"text/javascript\" src=\"http://cdn.aloha-editor.org/latest/lib/require.js\"></script>\n\t<script src=\"http://cdn.aloha-editor.org/latest/lib/aloha.js\" data-aloha-plugins=\"common/ui,common/format,common/highlighteditables,common/link\"></script>\n\t<script src=\"../../dist/quail.jsquery.js\"></script>\n\t<script src=\"plugins/aloha/quail/vendor/tipsy.js\"></script>\n\t<script src=\"plugins/aloha/quail/lib/quail-plugin.js\"></script>\n\t<script type=\"text/javascript\">\n\t Aloha.settings.quail = {\n  \t tests : {\n        \"imgHasAlt\": {\n            \"type\": \"selector\",\n            \"selector\": \"img:not(img[alt])\",\n            \"severity\": \"severe\",\n            \"title\" : \"This image is missing an alt text.\"\n        },      \n        \"documentAbbrIsUsed\": {\n            \"type\": \"custom\",\n            \"callback\": \"documentAbbrIsUsed\",\n            \"severity\": \"moderate\",\n            \"title\" : \"You need to add an abbreviation tag here.\"\n        },\n     },\n     guideline : [ 'imgHasAlt', 'documentAbbrIsUsed' ],\n     path : '../../dist',\n     baseUrl : '../../lib/',\n     title : function(event) {\n       if(event.testName == 'documentAbbrIsUsed') {\n         return 'The acronym ' + event.options.acronym + ' needs to be within an acronym tag.';\n       }\n       if(event.testName == 'imgHasAlt') {\n         return 'This image is missing a description. To add a description, select the image and click the image button.';\n       }\n     }\n\t }\n\t \n\t Aloha.ready( function() { \n     Aloha.jQuery('#content').aloha();\t\n\t });\n\n  </script >\n\t</body>\n</html>\n"
  },
  {
    "path": "examples/editors/ckeditor.html",
    "content": "<!DOCTYPE>\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<title>CKEditor Example</title>\n\t\t<link rel=\"stylesheet\" href=\"../common/style.css\"/>\n\t</head>\n\t<body>\n\t<div id=\"test\">\n\t <form>\n\t <textarea class=\"ckeditor\">\n\t &lt;p&gt;This is an image of my dog, Kogepan:&lt;/p&gt;\n\t &lt;a href=\"link.test\"&gt;\n\t &lt;img src=&quot;../common/kogepan.png&quot;&gt;\n\t &lt;/a&gt;\n\t </textarea>\n\t </form>\n\t</div>\n\t\n\t<script src=\"../../lib/jquery/jquery.js\"></script>\n\t<script src=\"http://cdnjs.cloudflare.com/ajax/libs/ckeditor/4.2/ckeditor.js\"></script>\n\t<script src=\"../../dist/quail.jquery.js\"></script>\n\t<script src=\"plugins/ckeditor/quail/plugin.js\"></script>\n\n\t<script type=\"text/javascript\" >\n\t(function($) {\n\t  $(document).ready(function() {\n  \t  var options = {\n  \t    accessibilityTests : {   \n          \"imgAltNotEmptyInAnchor\": {\n              \"type\": \"custom\",\n              \"callback\": \"imgAltNotEmptyInAnchor\",\n              \"severity\": \"severe\"\n          }\n       },\n       guideline : [ 'imgAltNotEmptyInAnchor' ],\n\t     jsonPath  : '../../dist',\n\t     ckEditorMessage : function(event) {\n  \t     return 'Event fired ' + event.testName;\n\t     }\n\t    };\n  \t  CKEDITOR.replace($('.ckeditor').get(0), {\n    \t  toolbar: [ \n    \t    [ 'Quail' ]\n\t\t\t\t],\n    \t  extraPlugins : 'quail',\n    \t  quailOptions : options\n  \t  });\n\t  });\n\t})(jQuery);\n\t   </script >\n\t</body>\n</html>\n"
  },
  {
    "path": "examples/editors/plugins/aloha/quail/css/quail.css",
    "content": "/* \n*    jQuery Tipsy\n*/\n\n.tipsy { font-size: 10px; position: absolute; padding: 5px; z-index: 100000; }\n.tipsy-inner { background-color: #000; color: #FFF; max-width: 200px; padding: 5px 8px 4px 8px; text-align: center; }\n\n/* Rounded corners */\n.tipsy-inner { border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; }\n\n/* Uncomment for shadow */\n.tipsy-inner { box-shadow: 0 0 5px #000000; -webkit-box-shadow: 0 0 5px #000000; -moz-box-shadow: 0 0 5px #000000; }\n\n.tipsy-arrow { position: absolute; width: 0; height: 0; line-height: 0; border: 5px dashed #000; }\n\n/* Rules to colour arrows */\n.tipsy-arrow-n { border-bottom-color: #000; }\n.tipsy-arrow-s { border-top-color: #000; }\n.tipsy-arrow-e { border-left-color: #000; }\n.tipsy-arrow-w { border-right-color: #000; }\n\n.tipsy-n .tipsy-arrow { top: 0px; left: 50%; margin-left: -5px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent; }\n.tipsy-nw .tipsy-arrow { top: 0; left: 10px; border-bottom-style: solid; border-top: none; border-left-color: transparent; border-right-color: transparent;}\n.tipsy-ne .tipsy-arrow { top: 0; right: 10px; border-bottom-style: solid; border-top: none;  border-left-color: transparent; border-right-color: transparent;}\n.tipsy-s .tipsy-arrow { bottom: 0; left: 50%; margin-left: -5px; border-top-style: solid; border-bottom: none;  border-left-color: transparent; border-right-color: transparent; }\n.tipsy-sw .tipsy-arrow { bottom: 0; left: 10px; border-top-style: solid; border-bottom: none;  border-left-color: transparent; border-right-color: transparent; }\n.tipsy-se .tipsy-arrow { bottom: 0; right: 10px; border-top-style: solid; border-bottom: none; border-left-color: transparent; border-right-color: transparent; }\n.tipsy-e .tipsy-arrow { right: 0; top: 50%; margin-top: -5px; border-left-style: solid; border-right: none; border-top-color: transparent; border-bottom-color: transparent; }\n.tipsy-w .tipsy-arrow { left: 0; top: 50%; margin-top: -5px; border-right-style: solid; border-left: none; border-top-color: transparent; border-bottom-color: transparent; }\n\n.quail-result { padding: 3px; border-radius: 3px;}\n  .quail-result.severe { border: 3px dashed red; }\n  .quail-result.moderate { border: 3px dashed orange; }\n  .quail-result.reccomendation { border: 3px solid green; }\n\n.quail-message { position: fixed; background: #fff; color: #000; border: 1px solid black; padding: 10px;}"
  },
  {
    "path": "examples/editors/plugins/aloha/quail/package.json",
    "content": "{}\n"
  },
  {
    "path": "examples/editors/plugins/aloha/quail/vendor/tipsy.js",
    "content": "// tipsy, facebook style tooltips for jquery\n// version 1.0.0a\n// (c) 2008-2010 jason frame [jason@onehackoranother.com]\n// released under the MIT license\n\ndefine(['jquery'], function(jQuery) {\n    var $ = jQuery;\n    \n    function maybeCall(thing, ctx) {\n        return (typeof thing == 'function') ? (thing.call(ctx)) : thing;\n    };\n    \n    function Tipsy(element, options) {\n        this.$element = $(element);\n        this.options = options;\n        this.enabled = true;\n        this.fixTitle();\n    };\n    \n    Tipsy.prototype = {\n        show: function() {\n            var title = this.getTitle();\n            if (title && this.enabled) {\n                var $tip = this.tip();\n                \n                $tip.find('.tipsy-inner')[this.options.html ? 'html' : 'text'](title);\n                $tip[0].className = 'tipsy'; // reset classname in case of dynamic gravity\n                $tip.remove().css({top: 0, left: 0, visibility: 'hidden', display: 'block'}).prependTo(document.body);\n                \n                var pos = $.extend({}, this.$element.offset(), {\n                    width: this.$element[0].offsetWidth,\n                    height: this.$element[0].offsetHeight\n                });\n                \n                var actualWidth = $tip[0].offsetWidth,\n                    actualHeight = $tip[0].offsetHeight,\n                    gravity = maybeCall(this.options.gravity, this.$element[0]);\n                \n                var tp;\n                switch (gravity.charAt(0)) {\n                    case 'n':\n                        tp = {top: pos.top + pos.height + this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};\n                        break;\n                    case 's':\n                        tp = {top: pos.top - actualHeight - this.options.offset, left: pos.left + pos.width / 2 - actualWidth / 2};\n                        break;\n                    case 'e':\n                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth - this.options.offset};\n                        break;\n                    case 'w':\n                        tp = {top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width + this.options.offset};\n                        break;\n                }\n                \n                if (gravity.length == 2) {\n                    if (gravity.charAt(1) == 'w') {\n                        tp.left = pos.left + pos.width / 2 - 15;\n                    } else {\n                        tp.left = pos.left + pos.width / 2 - actualWidth + 15;\n                    }\n                }\n                \n                $tip.css(tp).addClass('tipsy-' + gravity);\n                $tip.find('.tipsy-arrow')[0].className = 'tipsy-arrow tipsy-arrow-' + gravity.charAt(0);\n                if (this.options.className) {\n                    $tip.addClass(maybeCall(this.options.className, this.$element[0]));\n                }\n                \n                if (this.options.fade) {\n                    $tip.stop().css({opacity: 0, display: 'block', visibility: 'visible'}).animate({opacity: this.options.opacity});\n                } else {\n                    $tip.css({visibility: 'visible', opacity: this.options.opacity});\n                }\n            }\n        },\n        \n        hide: function() {\n            if (this.options.fade) {\n                this.tip().stop().fadeOut(function() { $(this).remove(); });\n            } else {\n                this.tip().remove();\n            }\n        },\n        \n        fixTitle: function() {\n            var $e = this.$element;\n            if ($e.attr('title') || typeof($e.attr('original-title')) != 'string') {\n                $e.attr('original-title', $e.attr('title') || '').removeAttr('title');\n            }\n        },\n        \n        getTitle: function() {\n            var title, $e = this.$element, o = this.options;\n            this.fixTitle();\n            var title, o = this.options;\n            if (typeof o.title == 'string') {\n                title = $e.attr(o.title == 'title' ? 'original-title' : o.title);\n            } else if (typeof o.title == 'function') {\n                title = o.title.call($e[0]);\n            }\n            title = ('' + title).replace(/(^\\s*|\\s*$)/, \"\");\n            return title || o.fallback;\n        },\n        \n        tip: function() {\n            if (!this.$tip) {\n                this.$tip = $('<div class=\"tipsy\"></div>').html('<div class=\"tipsy-arrow\"></div><div class=\"tipsy-inner\"></div>');\n            }\n            return this.$tip;\n        },\n        \n        validate: function() {\n            if (!this.$element[0].parentNode) {\n                this.hide();\n                this.$element = null;\n                this.options = null;\n            }\n        },\n        \n        enable: function() { this.enabled = true; },\n        disable: function() { this.enabled = false; },\n        toggleEnabled: function() { this.enabled = !this.enabled; }\n    };\n    \n    $.fn.tipsy = function(options) {\n        \n        if (options === true) {\n            return this.data('tipsy');\n        } else if (typeof options == 'string') {\n            var tipsy = this.data('tipsy');\n            if (tipsy) tipsy[options]();\n            return this;\n        }\n        \n        options = $.extend({}, $.fn.tipsy.defaults, options);\n        \n        function get(ele) {\n            var tipsy = $.data(ele, 'tipsy');\n            if (!tipsy) {\n                tipsy = new Tipsy(ele, $.fn.tipsy.elementOptions(ele, options));\n                $.data(ele, 'tipsy', tipsy);\n            }\n            return tipsy;\n        }\n        \n        function enter() {\n            var tipsy = get(this);\n            tipsy.hoverState = 'in';\n            if (options.delayIn == 0) {\n                tipsy.show();\n            } else {\n                tipsy.fixTitle();\n                setTimeout(function() { if (tipsy.hoverState == 'in') tipsy.show(); }, options.delayIn);\n            }\n        };\n        \n        function leave() {\n            var tipsy = get(this);\n            tipsy.hoverState = 'out';\n            if (options.delayOut == 0) {\n                tipsy.hide();\n            } else {\n                setTimeout(function() { if (tipsy.hoverState == 'out') tipsy.hide(); }, options.delayOut);\n            }\n        };\n        \n        if (!options.live) this.each(function() { get(this); });\n        \n        if (options.trigger != 'manual') {\n            var binder   = options.live ? 'live' : 'bind',\n                eventIn  = options.trigger == 'hover' ? 'mouseenter' : 'focus',\n                eventOut = options.trigger == 'hover' ? 'mouseleave' : 'blur';\n            this[binder](eventIn, enter)[binder](eventOut, leave);\n        }\n        \n        return this;\n        \n    };\n    \n    $.fn.tipsy.defaults = {\n        className: null,\n        delayIn: 0,\n        delayOut: 0,\n        fade: false,\n        fallback: '',\n        gravity: 'n',\n        html: false,\n        live: false,\n        offset: 0,\n        opacity: 0.8,\n        title: 'title',\n        trigger: 'hover'\n    };\n    \n    // Overwrite this method to provide options on a per-element basis.\n    // For example, you could store the gravity in a 'tipsy-gravity' attribute:\n    // return $.extend({}, options, {gravity: $(ele).attr('tipsy-gravity') || 'n' });\n    // (remember - do not modify 'options' in place!)\n    $.fn.tipsy.elementOptions = function(ele, options) {\n        return $.metadata ? $.extend({}, options, $(ele).metadata()) : options;\n    };\n    \n    $.fn.tipsy.autoNS = function() {\n        return $(this).offset().top > ($(document).scrollTop() + $(window).height() / 2) ? 's' : 'n';\n    };\n    \n    $.fn.tipsy.autoWE = function() {\n        return $(this).offset().left > ($(document).scrollLeft() + $(window).width() / 2) ? 'e' : 'w';\n    };\n    \n    /**\n     * yields a closure of the supplied parameters, producing a function that takes\n     * no arguments and is suitable for use as an autogravity function like so:\n     *\n     * @param margin (int) - distance from the viewable region edge that an\n     *        element should be before setting its tooltip's gravity to be away\n     *        from that edge.\n     * @param prefer (string, e.g. 'n', 'sw', 'w') - the direction to prefer\n     *        if there are no viewable region edges effecting the tooltip's\n     *        gravity. It will try to vary from this minimally, for example,\n     *        if 'sw' is preferred and an element is near the right viewable \n     *        region edge, but not the top edge, it will set the gravity for\n     *        that element's tooltip to be 'se', preserving the southern\n     *        component.\n     */\n     $.fn.tipsy.autoBounds = function(margin, prefer) {\n\t\treturn function() {\n\t\t\tvar dir = {ns: prefer[0], ew: (prefer.length > 1 ? prefer[1] : false)},\n\t\t\t    boundTop = $(document).scrollTop() + margin,\n\t\t\t    boundLeft = $(document).scrollLeft() + margin,\n\t\t\t    $this = $(this);\n\n\t\t\tif ($this.offset().top < boundTop) dir.ns = 'n';\n\t\t\tif ($this.offset().left < boundLeft) dir.ew = 'w';\n\t\t\tif ($(window).width() + $(document).scrollLeft() - $this.offset().left < margin) dir.ew = 'e';\n\t\t\tif ($(window).height() + $(document).scrollTop() - $this.offset().top < margin) dir.ns = 's';\n\n\t\t\treturn dir.ns + (dir.ew ? dir.ew : '');\n\t\t}\n\t};\n    \n});"
  },
  {
    "path": "examples/editors/plugins/ckeditor/quail/plugin.js",
    "content": "(function($) {\n  CKEDITOR.plugins.add( 'quail',\n  {\n    \n    active : false,\n    \n    init: function( editor )\n    {\n      var that = this;\n      \n      CKEDITOR.addCss('.quail-result { padding: 3px; border-radius: 3px;}' +\n  '.quail-result.severe { border: 3px dashed red; }' +\n  '.quail-result.moderate { border: 3px dashed orange; }' +\n  '.quail-result.reccomendation { border: 3px solid green; }' +\n\n  '.quail-message { position: fixed; background: #fff; color: #000 !important; text-decoration: none !important; border: 1px solid black; padding: 10px;}');\n      \n      editor.addCommand( 'checkQuail',\n        {\n          exec : function( editor )\n          {\n            if(that.active) {\n              that.removeMarkup(editor);\n              that.active = false;\n            }\n            else {\n              that.checkContent(editor);\n              that.active = true;\n            }\n          }\n        });\n      \n      editor.ui.addButton( 'Quail',\n      {\n        label: 'Check content for accessibility',\n        command: 'checkQuail',\n        icon: this.path + 'img/quail.png'\n      });\n    },\n    \n    removeMarkup : function(editor) {\n  \t\t$(editor.document.getDocumentElement().$).find('.quail-result').each(function() {\n    \t\t$(this).removeClass('quail-result')\n    \t\t       .removeClass('severe')\n    \t\t       .removeClass('moderate')\n    \t\t       .removeClass('suggestion')\n    \t\t       .unbind('hover');\n  \t\t});\n  \t\t$(editor.document.getDocumentElement().$).find('.quail-message').remove();\n    },\n    \n    checkContent : function(editor) {\n      var options = editor.config.quailOptions;\n      if(typeof options.testFailed !== 'object') {\n        options.testFailed = function(event) {\n          event.element.addClass('quail-result')\n                       .addClass(event.severity);\n          if(typeof(options.ckEditorMessage === 'object')) {\n            var message = options.ckEditorMessage(event);\n            event.element.hover(function() {\n              var $message =  $('<div class=\"quail-message\">' + message + '</div>');\n              var position = event.element.position();\n              $message.css('top', position.top + 5 + 'px')\n                      .css('left', position.left + event.element.width() + 5 + 'px');\n              event.element.after($message);\n            },\n            function() {\n              event.element.next('.quail-message').remove();\n            });\n           \n          }\n        };\n      }\n      $(editor.document.getDocumentElement().$).quail(options);\n    }\n  });\n})(jQuery);"
  },
  {
    "path": "examples/editors/plugins/tinymce/quail/css/content.css",
    "content": ".quail-result { padding: 3px; border-radius: 3px;}\n  .quail-result.severe { border: 3px dashed red; }\n  .quail-result.moderate { border: 3px dashed orange; }\n  .quail-result.reccomendation { border: 3px solid green; }\n\n.quail-message { position: fixed; background: #fff; color: #000; border: 1px solid black; padding: 10px;}"
  },
  {
    "path": "examples/editors/plugins/tinymce/quail/langs/en.js",
    "content": "tinyMCE.addI18n('en.quail',{\n\tdesc : 'Accessibility check'\n});\n"
  },
  {
    "path": "examples/editors/tinymce.html",
    "content": "<!DOCTYPE>\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<title>TinyMCE Example</title>\n\t\t<link rel=\"stylesheet\" href=\"../common/style.css\"/>\n\t</head>\n\t<body>\n\t<div id=\"test\">\n\t <textarea>\n\t &lt;p&gt;This is an image of my dog, Kogepan:&lt;/p&gt;\n\t &lt;a href=\"link.test\"&gt;\n\t &lt;img src=&quot;../common/kogepan.png&quot;&gt;\n\t &lt;/a&gt;\n\t </textarea>\n\t</div>\n\t\n\t<script src=\"../../lib/jquery/jquery.js\"></script>\n\t<script src=\"http://cdnjs.cloudflare.com/ajax/libs/tinymce/3.5.8/tiny_mce.js\"></script>\n\t<script src=\"../../dist/quail.jquery.js\"></script>\n\t<script src=\"plugins/tinymce/quail/editor_plugin.js\"></script>\n\t<script type=\"text/javascript\">\n\t  (function($) {\n\t    var options = {\n  \t    accessibilityTests : {   \n          \"imgAltNotEmptyInAnchor\": {\n              \"type\": \"custom\",\n              \"callback\": \"imgAltNotEmptyInAnchor\",\n              \"severity\": \"severe\"\n          }\n       },\n       guideline : [ 'imgAltNotEmptyInAnchor' ],\n\t     jsonPath  : '../../dist',\n\t     tinyMCEMessage : function(event) {\n  \t     return 'Test failed ' + event.testName;\n\t     }\n\t    };\n  \t  tinyMCE.init({\n        // General options\n        mode : \"textareas\",\n        plugins : \"quail\",\n        quailOptions: options,\n        theme_advanced_buttons1 : \"bold,italic,underline,strikethrough,|,quail\"\n      });\n\t  })(jQuery);\n\t</script>\n\t</body>\n</html>\n"
  },
  {
    "path": "examples/php/README.md",
    "content": "=======================\nNote about this example\n=======================\n\nThis is an example of how to integrate a PHP backend with QUAIL. You must run it from within a web server, it will not work by just viewing the html files in a browser.\n\n**WARNING:** This is a totally insecure way to do things, it's just a simple example. Do not post this to a public place."
  },
  {
    "path": "examples/php/data/guideline.json",
    "content": "[\"imgAltIsDifferent\",\"imgAltIsTooLong\",\"imgHasAlt\"]"
  },
  {
    "path": "examples/php/data/stats.json",
    "content": "{\"severe\":\"0\",\"moderate\":\"0\",\"suggestion\":\"0\"}"
  },
  {
    "path": "examples/php/edit.html",
    "content": "<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<title>Sample page | My CMS</title>\n\t\t<link rel=\"stylesheet\" href=\"../common/style.css\"/>\n\t\t<link rel=\"stylesheet\" href=\"//netdna.bootstrapcdn.com/bootstrap/2.3.2/css/bootstrap.min.css\"/>\n    <style>\n      #edit {\n        width: 100%;\n        height: 350px;\n      }\n    </style>\n\t</head>\n\t<body>\n\t<div class=\"container\">\n\t<div class=\"navbar navbar-fixed\">\n    <div class=\"navbar-inner\">\n      <a class=\"brand\" href=\"#\">My CMS</a>\n      <ul class=\"nav\">\n        <li><a href=\"index.php\">Settings</a></li>\n        <li class=\"active\"><a href=\"sample.html\">Sample page</a></li>\n      </ul>\n    </div>\n  </div>\n\t<h1 class=\"title\">Page one</h1>\n\t<div class=\"row\">\n  \t<div class=\"span9\">\n    \t<ul class=\"nav nav-tabs\">\n        <li><a href=\"sample.html\">View</a></li>\n        <li class=\"active\"><a href=\"edit.html\">Edit</a></li>\n      </ul>\n  \t  <div id=\"content\">\n        <form>\n          <label for=\"edit\">Edit this page:</label>\n          <textarea id=\"edit\"></textarea>\n          <div>\n            <input type=\"submit\" value=\"Save\" class=\"btn btn-primary\"/>\n          </div>\n        </form>\n        \n      </div>\n    </div>\n    <aside class=\"span3\">\n      <h2>Note</h2>\n      <p>\n        When you click the \"Save\" button we check the content of the text area and prevent you from submitting something if there's a big problem.\n      </p>\n    </aside>\n\t</div>\n\t</div>\n\t<script src=\"../../libs/jquery/jquery.js\"></script>\n\t<script src=\"../../dist/quail.jsquery.js\"></script>\n\t<script src=\"script.js\"></script>\n\t</body>\n</html>\n\t"
  },
  {
    "path": "examples/php/index.php",
    "content": "<?php \n\n  $tests = (array)json_decode(file_get_contents('../../dist/tests.json'));\n  $stats = json_decode(file_get_contents('data/stats.json'));\n  \n  if($_POST) {\n    $guideline = array(); \n    foreach($_POST['guideline'] as $testname => $status) {\n      if($status == 'on') {\n        $guideline[] = $testname;\n      }\n    }\n    $file = fopen('data/guideline.json', 'w');\n    fwrite($file, json_encode($guideline));\n    fclose($file);\n  }\n  else {\n    $guideline = json_decode(file_get_contents('data/guideline.json'));\n  } \n?><!DOCTYPE>\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<title>Settings | My CMS</title>\n\t\t<link rel=\"stylesheet\" href=\"../common/style.css\"/>\n\t\t<link rel=\"stylesheet\" href=\"//netdna.bootstrapcdn.com/bootstrap/2.3.2/css/bootstrap.min.css\"/>\n\t</head>\n\t<body>\n\t<div class=\"container\">\n\t<div class=\"navbar navbar-fixed\">\n    <div class=\"navbar-inner\">\n      <a class=\"brand\" href=\"#\">My CMS</a>\n      <ul class=\"nav\">\n        <li class=\"active\"><a href=\"index.php\">Settings</a></li>\n        <li><a href=\"sample.html\">Sample page</a></li>\n      </ul>\n    </div>\n  </div>\n\t<h1 class=\"title\">My awesome CMS</h1>\n\t\n\t<div class=\"row\">\n  \t<div class=\"span9\">\n    \t<form method=\"post\">\n    \t<table class=\"table table-striped table-bordered\">\n    \t  <thead>\n    \t    <tr>\n    \t      <th>Enabled</th>\n    \t      <th>Test name</th>\n    \t    </tr>\n    \t  </thead>\n    \t  <tbody>\n    \t    <?php foreach($tests as $testname => $test): ?>\n    \t      <tr>\n    \t        <td>\n    \t          <input type=\"checkbox\" name=\"guideline[<?php print $testname; ?>]\" id=\"<?php print $testname; ?>\"<?php if(in_array($testname, $guideline)) print ' checked=\"checked\"'; ?>>\n    \t          \n    \t        </td>\n    \t        <td>\n    \t          <label for=\"<?php print $testname; ?>\">\n    \t            <?php if($test->title) \n    \t                    print $test->title->en; \n    \t                  else\n    \t                    print $testname;  ?>\n    \t          </label>\n    \t        </td>\n    \t      </tr>\n    \t    <?php endforeach; ?>\n    \t  </tbody>\n    \t</table>\n    \t<input type=\"submit\" class=\"btn btn-primary\" value=\"Save settings\">\n    \t</form>\n  \t</div>\n  \t<aside class=\"span3\">\n  \t  <h2>Statistics</h2>\n  \t  <?php if($stats && $stats->severe ): ?>\n  \t    <ul>\n  \t      <li>\n  \t        <strong>Severe errors: </strong> <?php print $stats->severe; ?>\n  \t      </li>\n  \t      <li>\n  \t        <strong>Moderate errors: </strong> <?php print $stats->moderate; ?>\n  \t      </li>\n  \t      <li>\n  \t        <strong>Suggestions: </strong> <?php print $stats->suggestion; ?>\n  \t      </li>\n  \t    </ul>\n  \t  <?php else: ?>\n  \t    <div class=\"alert alert-error\">\n  \t      Once you check accessibility on the sample page, you will see stats here.\n  \t    </div>\n  \t   <?php endif; ?>\n  \t  <h2>Note</h2>\n  \t  <p>\n  \t    This is just a listing of all tests from the <code>tests.json</code> file, you will\n  \t    probably want to create your own database of test names and descriptions to make\n  \t    these make sense to your users. You can view all the default text for these tests\n  \t    in the <code>docs</code> directory, which is where the titles from this example comes from.\n  \t  </p>\n  \t</aside>\n\t</div>\n\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "examples/php/sample.html",
    "content": "<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<title>Sample page | My CMS</title>\n\t\t<link rel=\"stylesheet\" href=\"../common/style.css\"/>\n\t\t<link rel=\"stylesheet\" href=\"//netdna.bootstrapcdn.com/bootstrap/2.3.2/css/bootstrap.min.css\"/>\n\t</head>\n\t<body>\n\t<div class=\"container\">\n\t<div class=\"navbar navbar-fixed\">\n    <div class=\"navbar-inner\">\n      <a class=\"brand\" href=\"#\">My CMS</a>\n      <ul class=\"nav\">\n        <li><a href=\"index.php\">Settings</a></li>\n        <li class=\"active\"><a href=\"sample.html\">Sample page</a></li>\n      </ul>\n    </div>\n  </div>\n\t<h1 class=\"title\">Page one</h1>\n\t<div class=\"row\">\n  \t<div class=\"span9\">\n    \t<ul class=\"nav nav-tabs\">\n        <li class=\"active\"><a href=\"sample.html\">View</a></li>\n        <li><a href=\"edit.html\">Edit</a></li>\n      </ul>\n  \t  <div id=\"content\">\n  \t    <p><b>This is a sample page with a ton of issues. First, this should be a header</b></p>\n  \t    <p>There's also some un-marked abbreviations that QUAIL can look out for. Oops, missed another one.</p>\n  \t    <p>In a classic example, here's an image. With no alt text: <img src=\"../common/kogepan.png\" style=\"display: block;\"></p>\n  \t    <p>Ouch, that hurt. Here's one where the alt text is the same as the file name: <img src=\"../common/kogepan.png\" style=\"display: block;\" alt=\"kogepan.png\">\n  \t    </p>\n  \t    \n  \t  </div>\n  \t</div>\n  \t<aside class=\"span3\">\n  \t  <h2>Note</h2>\n  \t  <p>\n  \t    When you click the \"Enable accessibility tests\" button, it will only check the content area on the left. We are only running quail with the command <code>$('#content').quail(...)</code> to ensure we aren't checking any template areas of the page. This is great to only show content editors problems with a section (or sections) of a page without pointing out errors they have no control over.\n  \t  </p>\n  \t</aside>\n\t</div>\n\t</div>\n\t<script src=\"../../lib/jquery/jquery.js\"></script>\n\t<script src=\"../../dist/quail.jquery.js\"></script>\n\t<script src=\"script.js\"></script>\n\t</body>\n</html>\n\t"
  },
  {
    "path": "examples/php/script.js",
    "content": "$(document).ready(function() {\n\n /**\n  * We are loading the stored guideline.json file, which\n  * is a list of test names.\n  */\n $.getJSON('data/guideline.json', function(guideline) {\n   $('body').append('<div id=\"enable-accessibility\"><a href=\"#\">Turn on accessibility tests</a></div>');\n   $('#enable-accessibility a').click(function() {\n     var $link = $(this);\n     $('#content').quail({ guideline : guideline,\n      jsonPath : '../../dist',\n      testFailed : function(event) {\n        event.element.addClass('quail-result')\n                     .addClass(event.severity);\n      },\n      complete : function(results) {\n        $.post('stats.php', results.totals);\n        $link.html('Done checking. Severe errors: <strong>' +\n                   results.totals.severe +\n                   '</strong> Moderate: <strong>' +\n                   results.totals.moderate +\n                   '</strong> Suggestions: <strong>' +\n                   results.totals.suggestion +\n                   '</strong>');\n      }\n      });\n   });\n   $('#edit').keyup(function() {\n       var $text = $('<div>' + $(this).val() + '</div>');\n       $text.quail({ guideline : guideline,\n        jsonPath : '../../dist',\n        reset : true,\n        testFailed : function(event) {\n          if(event.severity == 'severe') {\n            $(':submit').addClass('disabled')\n                        .attr('disabled', 'disabled')\n                        .css('background', 'red');\n            $('#edit').after('Hey, you have a problem!');\n          }\n        },\n        complete : function(results) {\n          console.log(results);\n          if(results.totals.severe == 0) {\n            $(':submit').removeClass('disabled')\n                        .removeAttr('disabled');            \n          }\n        }\n        });\n     });\n });\n});\n"
  },
  {
    "path": "examples/php/stats.php",
    "content": "<?php\n\n$file = fopen('data/stats.json', 'w');\n\n//Do as I say, not as I do. This is a terrible way to do this, \n//but this is just an example:\nfwrite($file, json_encode($_POST));\nfclose($file);"
  },
  {
    "path": "examples/simple/index.html",
    "content": "<!DOCTYPE>\n<html>\n\t<head>\n\t\t<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n\t\t<title></title>\n\t\t<link rel=\"stylesheet\" href=\"../common/style.css\"/>\n\t</head>\n\t<body>\n\t<div id=\"test\">\n\t <p>This is an image of my dog, Kogepan:</p>\n\t <img src=\"../common/kogepan.png\">\n\t</div>\n\t\n\t<script src=\"../../lib/jquery/jquery.js\"></script>\n\t<script src=\"../../dist/quail.jquery.js\"></script>\n\t<script>\n\t $(document).ready(function() {\n  \t \n  \t /** Just to make this sample work without a server,\n  \t *   we are hard-coding the list of tests instead of\n  \t *   loading it using JSON.\n  \t **/\n  \t var accessibilityTests = {\n        \"imgHasAlt\": {\n\t\t    \"type\": \"selector\",\n\t\t    \"testability\": 1,\n\t\t    \"title\": {\n\t\t      \"en\": \"Image elements must have an \\\"alt\\\" attribute\"\n\t\t    },\n\t\t    \"description\": {\n\t\t      \"en\": \"All <code>img</code> elements must have an alt attribute\"\n\t\t    },\n\t\t    \"guidelines\": {\n\t\t      \"508\": [\n\t\t        \"a\"\n\t\t      ],\n\t\t      \"wcag\": {\n\t\t        \"1.1.1\": {\n\t\t          \"techniques\": [\n\t\t            \"F65\",\n\t\t            \"H37\"\n\t\t          ]\n\t\t        }\n\t\t      }\n\t\t    },\n\t\t    \"tags\": [\n\t\t      \"image\",\n\t\t      \"content\"\n\t\t    ],\n\t\t    \"options\": {\n\t\t      \"selector\": \"img\",\n\t\t      \"filter\": \":not(img[alt])\"\n\t\t    }\n\t\t  }\n    };\n  \t \n  \t $('#test').quail({ guideline : [ 'imgHasAlt' ],\n\t                    jsonPath : '../../dist',\n\t                    accessibilityTests : accessibilityTests,\n\t                    testFailed : function(event) {\n  \t                    event.element.addClass('quail-result')\n  \t                         .addClass(event.severity)\n  \t                         .before('<span class=\"quail-message\">ERROR: ' + event.test.title.en + '</span>');\n  \t                    \n\t                    }});\n\t })\n\t \n\t</script>\n\t</body>\n</html>\n"
  },
  {
    "path": "examples/simple/wcag2.html",
    "content": "<!DOCTYPE>\n<html lang=\"english\">\n    <head>\n        <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />\n        <title></title>\n        <link rel=\"stylesheet\" href=\"../common/style.css\"/>\n    </head>\n    <body>\n    <div id=\"test\">\n     <p><strong>I'm no error!</strong> Please forgive me.</p>\n     <p>This is an <code style=\"color:#DDD\">image</code> of \n       <a href=\"\">my dog</a>, Kogepan:</p>\n     <img src=\"../common/kogepan.png\">\n<!-- \n     <input type=\"text\">\n     <input type=\"text\" title=\"Titel!\">\n     <input type=\"text\" id=\"myfield\"><label for=\"myfield\">label</label>\n-->\n    </div>\n    \n    <script src=\"../../lib/jquery/jquery.js\"></script>\n    <script src=\"../../dist/quail.jquery.js\"></script>\n    <script>\n    $(document).ready(function() {\n        window.console.log('Quail start');\n        $('html').quail({\n            guideline : 'wcag2',\n            jsonPath : '../../dist',\n            testCollectionComplete : function(event, data) {\n                window.console.log('Quail finish');\n\n                // Show all results\n                $.each(data, function (i, criterion) {\n                    if (criterion.outcome.result !== 'untested') {\n                        window.console.log(\n                            criterion.testRequirement,\n                            criterion.outcome,\n                            criterion.hasPart);\n                    }\n                });\n            }\n        });\n     });\n     \n    </script>\n    </body>\n</html>\n"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@quailjs/quail\",\n  \"description\": \"Accessibility testing in the browser and on the server.\",\n  \"homepage\": \"http://quailjs.org\",\n  \"version\": \"3.1.0\",\n  \"license\": \"MIT\",\n  \"author\": {\n    \"name\": \"Jesse Beach\",\n    \"email\": \"splendidnoise@gmail.com\",\n    \"url\": \"https://jessebeach.github.io/\"\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git://github.com/quailjs/quail.git\"\n  },\n  \"scripts\": {\n    \"jscs\": \"jscs -c .jscsrc src/**/*.js test/assessmentSpecs/testRunner.js test/assessmentSpecs/*.js\",\n    \"eslint\": \"eslint -c .eslintrc src/**/*.js test/assessmentSpecs/*.js\",\n    \"build\": \"quail build\",\n    \"linters\": \"npm run jscs && npm run eslint\",\n    \"test\": \"npm run jscs && npm run eslint && npm run test-runner\",\n    \"selenium\": \"start-selenium\",\n    \"test-runner\": \"node ./test/assessmentSpecs/testRunner.js\",\n    \"test-selenium\": \"start-selenium && npm run test-runner\",\n    \"install-selenium-standalone\": \"selenium-standalone install\",\n    \"watch\": \"npm-watch\"\n  },\n  \"dependencies\": {\n    \"glob\": \"^6.0.1\",\n    \"guesslanguage\": \"^0.2.0\",\n    \"http-server\": \"0.7.3\",\n    \"progress\": \"^1.1.8\",\n    \"q\": \"^1.1.2\",\n    \"rainbowvis.js\": \"^1.0.1\",\n    \"selenium-standalone\": \"^4.7.2\",\n    \"stdio\": \"^0.2.7\",\n    \"webdriverio\": \"^3.3.0\"\n  },\n  \"devDependencies\": {\n    \"@quailjs/quail-core\": \"0.0.21\",\n    \"babel-eslint\": \"^5.0.0-beta4\",\n    \"chai\": \"^1.9.2\",\n    \"chai-as-promised\": \"^4.1.1\",\n    \"chai-spies\": \"^0.5.1\",\n    \"deepmerge\": \"^0.2.7\",\n    \"eslint\": \"^1.3.1\",\n    \"jscs\": \"jscs-dev/node-jscs#c5adeba\",\n    \"mocha\": \"^2.0.1\",\n    \"npm-watch\": \"0.0.1\",\n    \"phantomjs\": \"^1.9.19\",\n    \"sinon\": \"^1.10.3\"\n  },\n  \"watch\": {\n    \"build\": [\n      \"src/**/*.js\"\n    ]\n  }\n}\n"
  },
  {
    "path": "scripts/addCaseToAssessments.js",
    "content": "module.exports = function(file, api, options) {\n  var j = api.jscodeshift;\n  var root = j(file.source);\n  var body = root.get().value.program.body;\n\n  if (!body) {\n    return null;\n  }\n\n  var dedupe = function (item, pos, self) {\n    return self.indexOf(item) === pos;\n  };\n\n  var capitalizeName = function (name) {\n    var firstletter = name[0];\n    // Components\n    if ([\n      'acronym',\n      'color',\n      'content',\n      'convertToPx',\n      'event',\n      'hasEventListener',\n      'headingLevel',\n      'htmlSource',\n      'htmlTagValidator',\n      'label',\n      'language',\n      'placeholder',\n      'statisticsPl',\n      'textNodeFilter',\n      'textStatistics',\n      'video'\n    ].indexOf(name) > -1) {\n      name = name + 'Component';\n    }\n    // Strings\n    if ([\n      'colors',\n      'languageCodes',\n      'newWindow',\n      'placeholders',\n      'redundant',\n      'siteMap',\n      'skipContent',\n      'suspiciousLinks',\n      'symbols'\n    ].indexOf(name) > -1) {\n      name = name + 'StringsComponent';\n    }\n    // Capitalize\n    name = firstletter.toUpperCase() + name.substring(1);\n\n    return name;\n  };\n\n  var withComments = function (to, from) {\n    to.comments = from.comments;\n    return to;\n  };\n\n  var createRequireExpression = function (requirementNames) {\n    return requirementNames.map(function (name) {\n      return j.variableDeclaration(\n        'var',\n        [j.variableDeclarator(\n          j.identifier(capitalizeName(name)),\n          j.callExpression(\n            j.identifier('require'),\n            [j.literal(capitalizeName(name))]\n          )\n        )]\n      );\n    });\n  };\n\n  const requirementNames = [\n    'Case'\n  ];\n\n  const needsCaseRequirement = root\n    .find(j.CallExpression)\n    .filter(function (exp) {\n      let val = exp &&\n        exp.value &&\n        exp.value.arguments &&\n        exp.value.arguments[0] &&\n        exp.value.arguments[0].value;\n      return val === 'Case';\n    })\n    .nodes()\n    .map(function (exp) {\n      return 'Case';\n    })\n    .filter(dedupe)\n    .length === 0;\n\n  const needsCaseParamRemoved = true;\n\n  // Add require statements.\n  if (needsCaseRequirement) {\n    createRequireExpression(requirementNames)\n      .forEach(function (req) {\n        body.unshift(req);\n      });\n    body[0].comments = body[requirementNames.length].comments;\n    delete body[requirementNames.length].comments;\n  }\n\n  // Remove Case parameters.\n\n  root\n    .find(j.FunctionExpression)\n    .forEach(function (funcExp) {\n      let index = -1;\n      funcExp.value.params.forEach(function (param, ii) {\n        if (param.name === 'Case') {\n          index = ii;\n        }\n      });\n      if (index > -1) {\n        funcExp.value.params.splice(index, 1);\n      }\n    })\n\n  return root.toSource(options.printOptions || {\n    quote: 'single'\n  });\n}\n"
  },
  {
    "path": "scripts/componentToIndividualFile.js",
    "content": "#!/usr/bin/env node\nvar fs = require('fs');\nvar path = require('path');\nvar yamljs = require('yamljs');\n\n// Load yaml file using yamljs.load\nvar assessments = yamljs.load(path.join(__dirname, '..', 'src', 'resources', 'tests.yml'));\n\n// Pull out assessments that are type selector.\nvar selectorAssessments = [];\nfs.readFile(path.join(__dirname, '..', 'test', 'assessmentSpecs', 'templates', 'componentTemplate.js'), {\n  encoding: 'utf-8'\n}, function (err, template) {\n  if (err) {\n    console.error(err);\n  }\n  Object.keys(assessments).forEach(function (key) {\n    var a = assessments[key];\n    if (a.type === 'placeholder') {\n      var filePath = path.join(__dirname, '..', 'lib', 'assessments', key + '.js');\n      // Stat if an assessment script exists.\n      // Raise a warning if it does.\n      fs.open(filePath, 'r+', function (err, fd) {\n        // The file does not exist.\n        if (err) {\n          fs.open(filePath, 'w', function (err, fd) {\n            if (err) {\n              console.error('Coule not create file %s.', [key + '.js']);\n            }\n            // Create the file.\n            else {\n              var component = a.components[0];\n              var options = (function () {\n                var opts = a.options || {};\n                var optsArray = [];\n                for (var key in opts) {\n                  if (opts.hasOwnProperty(key)) {\n                    optsArray.push(key + ': \\'' + opts[key] + '\\'');\n                  }\n                }\n                return optsArray.join(',\\n    ');\n              }());\n              var newFile = template\n                .replace('%name%', key)\n                .replace('%component%', component)\n                .replace('%options%', options);\n\n              var buffer = new Buffer(newFile, \"utf-8\");\n\n              fs.write(fd, buffer, 0, buffer.length, null, function (err, written, buffer) {\n                if (err) {\n                  console.error(err);\n                }\n                // Close the file.\n                fs.close(fd, function() {\n                  console.log('Wrote file %s.', (key + '.js'));\n                });\n              });\n            }\n          });\n        }\n        else {\n          console.warn('The file %s already exists.', (key + '.js'));\n          fs.close(fd);\n        }\n      });\n    }\n  });\n});\n\n/* fs.readFile(path.join(__dirname, '..', 'htmlTemplate.html'), {\n  encoding: 'utf-8'\n}, function (err, template) {\n  if (err) {\n    console.error(err);\n  }\n  Object.keys(assessments).forEach(function (key) {\n    var a = assessments[key];\n    if (a.type === 'selector') {\n      var htmlPath = path.join(__dirname, '..', 'test', 'assessmentSpecs', 'specs', key, key + '-nomatch.html');\n\n      fs.open(htmlPath, 'r+', function (err, fd) {\n        // The file does not exist.\n        if (err) {\n          fs.open(htmlPath, 'w', function (err, fd) {\n            if (err) {\n              console.error('Coule not create file %s.', [key + '-nomatch.html']);\n            }\n            // Create the file.\n            else {\n              var newFile = template.replace('%name%', key);\n\n              var buffer = new Buffer(newFile, \"utf-8\");\n\n              fs.write(fd, buffer, 0, buffer.length, null, function (err, written, buffer) {\n                if (err) {\n                  console.error(err);\n                }\n                // Close the file.\n                fs.close(fd, function() {\n                  console.log('Wrote file %s.', [key + '-nomatch.html']);\n                });\n              });\n            }\n          });\n        }\n        else {\n          console.warn('The file %s already exists.', [key + '-nomatch.html']);\n          fs.close(fd);\n        }\n      });\n    }\n  });\n});\n\nfs.readFile(path.join(__dirname, '..', 'specTemplate.js'), {\n  encoding: 'utf-8'\n}, function (err, template) {\n  if (err) {\n    console.error(err);\n  }\n  Object.keys(assessments).forEach(function (key) {\n    var a = assessments[key];\n    if (a.type === 'selector') {\n      var specPath = path.join(__dirname, '..', 'test', 'assessmentSpecs', 'specs', key, key + 'Spec.js');\n\n      fs.open(specPath, 'w', function (err, fd) {\n        // The file does not exist.\n        if (err) {\n          console.error(err);\n        }\n        fs.open(specPath, 'w', function (err, fd) {\n          if (err) {\n            console.error('Coule not open file %s.', [key + 'Spec.js']);\n          }\n          // Create the file.\n          else {\n            var newFile = template.replace(/%name%/g, key);\n\n            var buffer = new Buffer(newFile, \"utf-8\");\n\n            fs.write(fd, buffer, 0, buffer.length, null, function (err, written, buffer) {\n              if (err) {\n                console.error(err);\n              }\n              // Close the file.\n              fs.close(fd, function() {\n                console.log('Wrote file %s.', [key + 'Spec.js']);\n              });\n            });\n          }\n        });\n      });\n    }\n  });\n}); */\n\n// Copy the template\n// a) replace the placeholders with the assessment name.\n// b) replace the selector placeholder with the selector.\n\n\n// Write it out to file.\n// fs.writeFile(path.join(__dirname, '..', 'tmp', 'assessessments-table.html'), table, function (err) {\n//   if (err) throw err;\n//   console.log('It\\'s saved!');\n// });\n"
  },
  {
    "path": "scripts/covertTestYmlToHtml.js",
    "content": "var fs = require('fs');\nvar path = require('path');\nvar yamljs = require('yamljs');\n\n// Load yaml file using yamljs.load\nvar assessments = yamljs.load(path.join(__dirname, '..', 'src', 'resources', 'tests.yml'));\n\n// Turn the Object into a HTML table representation.\n\nvar table = [\n  '<table>',\n    '<thead>',\n      '<tr>',\n        '<th>Name</th>',\n        '<th>Description</th>',\n        '<th>Coverage</th>',\n      '</tr>',\n    '</thead>',\n    '<tbody>'\n].join('\\n');\n\nvar assessmentName;\nvar assessment;\nfor (assessmentName in assessments) {\n  if (assessments.hasOwnProperty(assessmentName)) {\n    assessment = assessments[assessmentName];\n    var name = assessmentName;\n    var title =  assessment.title && assessment.title.en || '';\n    // Guidelines exposed in an inner-table.\n    var guidelineTable = [\n      '<table>',\n        '<thead>',\n          '<tr>',\n            '<th>Guideline</th>',\n            '<th>Section</th>',\n            '<th>Techniques</th>',\n          '</tr>',\n        '</thead>',\n        '<tbody>'\n    ].join('\\n');\n    var guidelines = assessment.guidelines || {};\n    var gl, glName;\n    var glNames = [];\n    var sectionName, section, techniques;\n\n    // Guideline.\n    for (glName in guidelines) {\n      if (guidelines.hasOwnProperty(glName)) {\n        gl = guidelines[glName];\n        // Section.\n        for (sectionName in gl) {\n          if (gl.hasOwnProperty(sectionName)) {\n            section = gl[sectionName];\n            guidelineTable += [\n              '<tr>',\n                '<th scope=\"row\">' + glName + '</th>',\n                '<td>' + sectionName + '</td>']\n            .join('\\n');\n\n            // Techniques\n            if (section.techniques && section.techniques.length > 0) {\n              techniques = [];\n              section.techniques.forEach(function (technique) {\n                techniques.push(technique);\n              });\n              guidelineTable += '<td>' + techniques.join(', ') + '</td>\\n';\n            }\n            else {\n              guidelineTable += '<td>No technique coverage.</td>\\n';\n            }\n\n            guidelineTable += [\n              '</tr>'\n            ].join('\\n');\n          }\n        }\n      }\n    }\n\n    guidelineTable += [\n      '</tbody>',\n    '</table>'\n    ].join('\\n');\n\n    table += [\n      '<tr>',\n        '<th scope=\"row\">' + name + '</th>',\n        '<td>' + title + '</td>',\n        '<td>' + guidelineTable + '</td>',\n      '</tr>'\n    ].join('\\n');\n\n  }\n}\n\ntable += [\n  '</tbody>',\n'</table>'\n].join('\\n');\n// Create a tmp dir if non exists.\nif(!fs.existsSync(path.join(__dirname, '..', 'tmp'))){\n  fs.mkdirSync(path.join(__dirname, '..', 'tmp'), 0744, function (err){\n    if(err){\n      console.log(err);\n      response.send(\"ERROR! Can't make the directory! \\n\");    // echo the result back\n    }\n  });\n}\n\n// Write it out to file.\nfs.writeFile(path.join(__dirname, '..', 'tmp', 'assessessments-table.html'), table, function (err) {\n  if (err) throw err;\n  console.log('It\\'s saved!');\n});\n\n\n"
  },
  {
    "path": "scripts/eachToForEachWithParams.js",
    "content": "module.exports = function(file, api, options) {\n  const j = api.jscodeshift;\n  const {expression, statement, statements} = j.template;\n\n  var root = j(file.source);\n\n\n  root\n  .find(j.FunctionExpression)\n  .filter(fe => {\n    // scry\n    var scryProp;\n    var eachProp;\n    try {\n      scryProp = fe.parent.value.callee.object.name;\n    }\n    catch (e) {\n    \t// console.log('no scry call');\n    }\n    try {\n      eachProp = fe.parent.value.callee.property.name;\n    }\n    catch (e) {\n      // console.log('no each prop');\n    }\n    return (['candidates'].indexOf(scryProp) > -1) && eachProp === 'each';\n  })\n  .forEach(fn => {\n    if (fn.value.body) {\n      var newFn = j.functionExpression(\n        j.identifier(fn.value.id || ''),\n\t    fn.value.params.concat(\n          j.identifier('element')\n        ),\n        fn.value.body,\n        fn.value.generator,\n        fn.value.expression\n      );\n      j(fn).replaceWith(newFn);\n    }\n  })\n  .find(j.ThisExpression)\n  .forEach(te => {\n  \tswitch (te.parent.value.type) {\n      case 'Property':\n        j(te.parent).replaceWith(\n          j.property(\n          \t'init',\n            j.identifier(te.parent.value.key.name),\n            j.identifier('element')\n          ));\n        break;\n      case 'CallExpression':\n        if (['$', 'jQuery', 'jquery'].indexOf(te.parent.value.callee.name) > -1) {\n        \tj(te.parent).replaceWith(j.callExpression(\n          \tj.identifier(te.parent.value.callee.name),\n          \t[j.identifier('element')]\n          ));\n        }\n        else if (te.parent.value.arguments.length > 0) {\n          var index;\n          te.parent.value.arguments.forEach((a, ii) => {\n            if (a.type === 'ThisExpression') {\n            \tindex = ii;\n            }\n          });\n          if (index) {\n            te.parent.value.arguments[index] = j.identifier('element');\n          }\n        }\n        else {\n          console.log('unhandled case', te.parent.value.type);\n        }\n        break;\n      case 'VariableDeclarator':\n  \t\t  j(te.parent).replaceWith(\n        \tj.variableDeclarator(\n            j.identifier(te.parent.value.id.name),\n            j.identifier('element')\n          )\n        );\n        break;\n      case 'MemberExpression':\n        if (te.parent.value.object.type === 'ThisExpression') {\n          j(te.parent).replaceWith(\n            j.memberExpression(\n              j.identifier('element'),\n              te.parent.value.property\n            )\n          );\n        }\n        else {\n          console.log('unhandled case', te.parent.value.type);\n        }\n        break;\n      default:\n        console.log('Unhandled this case', te.parent.value.type);\n        break;\n    }\n  });\n\n  var b = root\n    .find(j.Identifier, {\n      name: 'each'\n    })\n    .filter(e => {\n      var scryProp;\n      try {\n        scryProp = e.parent.value.object.name;\n      }\n      catch (e) {\n      \t//console.log('no scry');\n      }\n      return (['candidates'].indexOf(scryProp) > -1);\n    })\n    .replaceWith(\n      p => j.identifier('forEach')\n    );\n\n  return b.toSource(options.printOptions || {\n    quote: 'single'\n  });\n};\n"
  },
  {
    "path": "scripts/modulifyAssessments.js",
    "content": "module.exports = function(file, api, options) {\n  var j = api.jscodeshift;\n  var root = j(file.source);\n  var body = root.get().value.program.body;\n\n  var capitalizeName = function (name) {\n    var firstletter = name[0];\n    // Components\n    if ([\n      'acronym',\n      'color',\n      'content',\n      'convertToPx',\n      'event',\n      'hasEventListener',\n      'headingLevel',\n      'htmlSource',\n      'htmlTagValidator',\n      'label',\n      'language',\n      'placeholder',\n      'statisticsPl',\n      'textNodeFilter',\n      'textStatistics',\n      'video'\n    ].indexOf(name) > -1) {\n      name = name + 'Component';\n    }\n    // Strings\n    if ([\n      'colors',\n      'languageCodes',\n      'newWindow',\n      'placeholders',\n      'redundant',\n      'siteMap',\n      'skipContent',\n      'suspiciousLinks',\n      'symbols'\n    ].indexOf(name) > -1) {\n      name = name + 'StringsComponent';\n    }\n    // Capitalize\n    name = firstletter.toUpperCase() + name.substring(1);\n\n    return name;\n  };\n\n  var withComments = function (to, from) {\n    to.comments = from.comments;\n    return to;\n  };\n\n  var createRequireExpression = function (requirementNames) {\n    return requirementNames.map(function (name) {\n      return j.variableDeclaration(\n        'var',\n        [j.variableDeclarator(\n          j.identifier(capitalizeName(name)),\n          j.callExpression(\n            j.identifier('require'),\n            [j.literal(capitalizeName(name))]\n          )\n        )]\n      );\n    });\n  }\n\n  var createExportExpression = function (exportNames) {\n    return exportNames.map(function (name) {\n      return j.expressionStatement(\n        j.assignmentExpression(\n          '=',\n          j.memberExpression(\n            j.identifier('module'),\n            j.identifier('exports')\n          ),\n          j.identifier(capitalizeName(name))\n        )\n      );\n    });\n  };\n\n  var getLibMemberExpressionNode = function (path) {\n    var node, reqName;\n    if (path.parent.value.type === 'MemberExpression') {\n      if (path.value.name === 'quail') {\n        return path.parent;\n      }\n      else {\n        node = path.parent;\n        if (node.value.object.type === 'Identifier' &&\n          node.value.object.name === 'quail') {\n          return node.parent;\n        }\n      }\n    }\n  };\n\n  var dedupe = function (item, pos, self) {\n    return self.indexOf(item) === pos;\n  };\n\n  if (!body) {\n    return null;\n  }\n\n  var libIdents = root\n    .find(j.Identifier)\n    .filter(function (ident) {\n      return ['lib', 'components', 'strings']\n        .indexOf(ident.value.name) > -1;\n    });\n\n  var identFilter = function (path) {\n    var node, reqName;\n    if (path.parent.value.type === 'MemberExpression') {\n      node = path.parent;\n      if (node.value.object.type === 'Identifier' &&\n        node.value.object.name === 'quail') {\n        node = node.parent;\n        // Do not include assignments; these are module exports.\n        if (node.name === 'left') {\n          return false;\n        }\n        else {\n          return true;\n        }\n      }\n    }\n    return false;\n  };\n\n  var quailIdents = root\n    .find(j.Identifier, {\n      name: 'quail'\n    });\n\n  var requirementUsages = libIdents.filter(identFilter);\n\n  var requirementNames = requirementUsages\n    .map(getLibMemberExpressionNode)\n    .nodes()\n    .map(function (node) {\n      return node.property.name;\n    })\n    .filter(dedupe);\n\n  // Module names.\n  var moduleExports = quailIdents\n    .filter(function (path) {\n      var node, reqName;\n      if (path.parent.value.type === 'MemberExpression') {\n        node = path.parent;\n        // Include assignments; these are module exports.\n        if (node.name === 'left') {\n          return true;\n        }\n        else {\n          return false;\n        }\n      }\n      return false;\n    });\n\n  var [requirementNames, moduleNames] = [requirementUsages, moduleExports]\n    .map(function (usage) {\n      return usage\n        .map(getLibMemberExpressionNode)\n        .nodes()\n        .map(function (node) {\n          return node.property.name;\n        })\n        .filter(dedupe);\n    });\n\n  // Get quail.* expressions\n\n\n  // Add require statements.\n  if (requirementNames.length > 0) {\n    createRequireExpression(requirementNames.sort().reverse())\n      .forEach(function (req) {\n        body.unshift(req);\n      });\n    body[0].comments = body[requirementNames.length].comments;\n    delete body[requirementNames.length].comments;\n  }\n\n  // Add export expressions.\n  if (moduleNames.length > 0) {\n    createExportExpression(moduleNames.sort())\n      .forEach(function (req) {\n        body.push(req);\n      });\n  }\n\n  // Remove expressions.\n  if (requirementUsages.size() > 0) {\n    requirementUsages\n      .map(getLibMemberExpressionNode)\n      .forEach(function (node) {\n        j(node).replaceWith(\n          j.identifier(capitalizeName(node.value.property.name))\n        )\n      });\n  }\n\n  if (moduleExports.size() > 0) {\n    moduleExports\n      .map(getLibMemberExpressionNode)\n      .forEach(function (node) {\n        if (node) {\n          j(node.parent).replaceWith(\n            j.variableDeclaration(\n              'var',\n              [j.variableDeclarator(\n                j.identifier(capitalizeName(node.value.property.name)),\n                node.parent.value.right\n              )]\n            )\n          )\n        }\n      });\n  }\n\n  return root.toSource(options.printOptions || {\n    quote: 'single'\n  });\n}\n"
  },
  {
    "path": "scripts/modulifyTransform.js",
    "content": "module.exports = function(file, api, options) {\n  var j = api.jscodeshift;\n  var root = j(file.source);\n  var body = root.get().value.program.body;\n\n  var capitalizeName = function (name) {\n    var firstletter = name[0];\n    // Components\n    if ([\n      'acronym',\n      'color',\n      'content',\n      'convertToPx',\n      'event',\n      'hasEventListener',\n      'headingLevel',\n      'htmlSource',\n      'htmlTagValidator',\n      'label',\n      'language',\n      'placeholder',\n      'statisticsPl',\n      'textNodeFilter',\n      'textStatistics',\n      'video',\n      'isDataTable',\n      'getTextContents',\n      'validURL',\n      'cleanString',\n      'containsReadableText',\n      'textSelector'\n    ].indexOf(name) > -1) {\n      name = name + 'Component';\n    }\n    // Strings\n    if ([\n      'colors',\n      'languageCodes',\n      'newWindow',\n      'placeholders',\n      'redundant',\n      'siteMap',\n      'skipContent',\n      'suspiciousLinks',\n      'symbols'\n    ].indexOf(name) > -1) {\n      name = name + 'StringsComponent';\n    }\n    // Capitalize\n    name = firstletter.toUpperCase() + name.substring(1);\n\n    return name;\n  };\n\n  var withComments = function (to, from) {\n    to.comments = from.comments;\n    return to;\n  };\n\n  var createRequireExpression = function (requirementNames) {\n    return requirementNames.map(function (name) {\n      return j.variableDeclaration(\n        'var',\n        [j.variableDeclarator(\n          j.identifier(capitalizeName(name)),\n          j.callExpression(\n            j.identifier('require'),\n            [j.literal(capitalizeName(name))]\n          )\n        )]\n      );\n    });\n  }\n\n  var createExportExpression = function (exportNames) {\n    return exportNames.map(function (name) {\n      return j.expressionStatement(\n        j.assignmentExpression(\n          '=',\n          j.memberExpression(\n            j.identifier('module'),\n            j.identifier('exports')\n          ),\n          j.identifier(name)\n        )\n      );\n    });\n  };\n\n  var getLibMemberExpressionNode = function (path) {\n    var node, reqName;\n    if (path.parent.value.type === 'MemberExpression') {\n      return path.parent;\n    }\n  };\n\n  var dedupe = function (item, pos, self) {\n    return self.indexOf(item) === pos;\n  };\n\n  if (!body) {\n    return null;\n  }\n\n  var quailIdents = root.find(\n    j.Identifier, {\n      name: 'quail'\n    }\n  )\n  var requirementUsages = quailIdents\n    .filter(function (path) {\n      var node, reqName;\n      if (path.parent.value.type === 'MemberExpression') {\n        node = path.parent;\n        if ([\n          'html',\n          'guidelines',\n          'tests',\n          'testFails',\n          'run',\n          'options',\n          'strings',\n          'statistics',\n\n        ].indexOf(node.value.property.name) > -1) {\n          return false;\n        }\n        // Do not include assignments; these are module exports.\n        if (node.name === 'left') {\n          return false;\n        }\n        else {\n          return true;\n        }\n      }\n      return false;\n    });\n\n  var requirementNames = requirementUsages\n    .map(getLibMemberExpressionNode)\n    .nodes()\n    .map(function (node) {\n      return node.property.name;\n    })\n    .filter(dedupe);\n\n  // Module names.\n  var moduleExports = {\n    size: function () {\n      return 0;\n    }\n  };\n\n  var [requirementNames] = [requirementUsages]\n    .map(function (usage) {\n      return usage\n        .map(getLibMemberExpressionNode)\n        .nodes()\n        .map(function (node) {\n          return node.property.name;\n        })\n        .filter(dedupe);\n    });\n\n  // Add require statements.\n  if (requirementNames.length > 0) {\n    createRequireExpression(requirementNames.sort().reverse())\n      .forEach(function (req) {\n        body.unshift(req);\n      });\n    body[0].comments = body[requirementNames.length].comments;\n    delete body[requirementNames.length].comments;\n  }\n\n  var moduleNames = [];\n  // Add export expressions.\n  if (moduleNames.length > 0) {\n    createExportExpression(moduleNames.sort())\n      .forEach(function (req) {\n        body.push(req);\n      });\n  }\n\n  // Remove expressions.\n  if (requirementUsages.size() > 0) {\n    requirementUsages\n      .map(getLibMemberExpressionNode)\n      .forEach(function (node) {\n        j(node).replaceWith(\n          j.identifier(capitalizeName(node.value.property.name))\n        )\n      });\n  }\n\n  if (moduleExports.size() > 0) {\n    moduleExports\n      .map(getLibMemberExpressionNode)\n      .forEach(function (node) {\n        j(node.parent).replaceWith(\n          j.variableDeclaration(\n            'var',\n            [j.variableDeclarator(\n              j.identifier(node.value.property.name),\n              node.parent.value.right\n            )]\n          )\n        )\n      });\n  }\n\n  return root.toSource(options.printOptions || {\n    quote: 'single'\n  });\n}\n"
  },
  {
    "path": "scripts/moveTestMetadataToAssessmentFiles.js",
    "content": "#!/usr/bin/env node\nvar fs = require('fs');\nvar path = require('path');\nvar yamljs = require('yamljs');\n\n// Load yaml file using yamljs.load\nvar assessments = yamljs.load(path.join(__dirname, '..', 'src', 'resources', 'tests.yml'));\n\nfunction toUpperCase (name) {\n  return name.charAt(0).toUpperCase() + name.slice(1);\n}\n\nfunction cleanName (name) {\n  if (/[\\.-\\s]/.test(name)) {\n    return '\\'' + name + '\\'';\n  }\n  else {\n    return name;\n  }\n}\n\nfunction cleanString (str) {\n  return str\n    .replace(/\\'/g, '\\\\\\'')\n    .replace(/\\\"/g, '\\\\\\\"');\n}\n\nfunction stringifyObject (obj, indent, includeIdentifier) {\n  var arr = [];\n  var opener, closer;\n  var tab = '  ';\n  var indentstr = '';\n  var nextIndex = indent + 1;\n\n  while (indent--) {\n    indentstr += tab;\n  }\n\n  Object.keys(obj).forEach(function (name) {\n    var line = indentstr;\n    if (includeIdentifier) {\n      line = line + cleanName(name) + ': ';\n    }\n    switch (typeof obj[name]) {\n      case 'object':\n        if ('length' in obj[name]) {\n          line = line + ' [\\n';\n          line = line + stringifyObject(obj[name], nextIndex, false) + '\\n';\n          line = line + indentstr + ']';\n        }\n        else {\n          line = line + '{\\n';\n          line = line + stringifyObject(obj[name], nextIndex, true) + '\\n';\n          line = line + indentstr + '}';\n        }\n        break;\n      case 'string':\n        line = line + '\\'' + cleanString(obj[name]) + '\\'';\n        break;\n      case 'number':\n        line = line + obj[name];\n        break;\n      default:\n        console.error('unknown value type');\n    }\n    arr.push(line);\n  });\n\n  return arr.join(',\\n');\n}\n\nObject.keys(assessments).forEach(function (key) {\n  var a = assessments[key];\n  // Build the string the represents the metadata.\n  var meta = [];\n  delete a.type;\n  delete a.libraries;\n  delete a.callback;\n  delete a.strings;\n  delete a.components;\n  Object.keys(a).forEach(function (name) {\n    var line = '    ' + cleanName(name) + ': ';\n    switch (typeof a[name]) {\n      case 'object':\n        if ('length' in a[name]) {\n          line = line + '[\\n';\n          line = line + stringifyObject(a[name], 3, false) + '\\n';\n          line = line + '    ]';\n        }\n        else {\n          line = line + '{\\n';\n          line = line + stringifyObject(a[name], 3, true) + '\\n';\n          line = line + '    }';\n        }\n        break;\n      case 'string':\n        line = line + '\\'' + cleanString(a[name]) + '\\'';\n        break;\n      case 'number':\n        line = line + a[name];\n        break;\n      default:\n        console.error('unknown value type');\n    }\n    meta.push(line);\n  });\n  // Get the assessment file.\n  var assessmentFilePath = path.join(__dirname, '..', 'src', 'assessments', toUpperCase(key) + '.js');\n  fs.readFile(assessmentFilePath, 'utf8', function (err, data) {\n    if (err) {\n      console.error('Coule not read file %s.', [assessmentFilePath]);\n    }\n    else {\n      var newFile = data\n        .replace('replace: \\'this\\'', meta.join(',\\n'));\n      fs.open(assessmentFilePath, 'w', function (err, fd) {\n        if (err) {\n          console.error('Coule not create file %s.', [key + '.js']);\n        }\n        // Create the file.\n        else {\n          var buffer = new Buffer(newFile, \"utf-8\");\n\n          fs.write(fd, buffer, 0, buffer.length, null, function (err, written, buffer) {\n            if (err) {\n              console.error(err);\n            }\n            // Close the file.\n            fs.close(fd, function() {\n              console.log('Wrote file %s.', [key + '.js']);\n            });\n          });\n        }\n      });\n    }\n  });\n});\n"
  },
  {
    "path": "scripts/pushingMetaDataToAssessments.js",
    "content": "module.exports = function(file, api, options) {\n  var j = api.jscodeshift;\n  var root = j(file.source);\n  var body = root.get().value.program.body;\n  const {expression, statement, statements} = j.template;\n\n  if (!body) {\n    return null;\n  }\n\n  var assessmentFunc = root\n    .find(j.FunctionExpression)\n  \t.filter(function (ident) {\n    \tvar keep = false;\n      if (ident.value && ident.value.params && ident.value.params.length) {\n    \t\tident.value.params.forEach(function (param) {\n        \tif (param.name === 'test') {\n            \tkeep = true;\n            }\n        });\n      }\n    \treturn keep;\n  \t});\n  assessmentFunc\n    .replaceWith(j.objectExpression([\n      j.property('init', j.identifier('run'), assessmentFunc.nodes()[0]),\n      j.property('init', j.identifier('meta'), j.objectExpression([\n        j.property('init', j.identifier('replace'), j.literal('this'))\n      ])),\n    ]));\n\n  return root.toSource(options.printOptions || {\n    quote: 'single'\n  });\n};\n"
  },
  {
    "path": "scripts/regexes.txt",
    "content": "(\\$?\\(?[a-zA-Z0-9]+\\)?)\\.find\\(('?[a-zA-Z0-9\\.\\#\\-\\[\\]\\\"\\=\\_\\, \\$\\:\\(\\)]+'?)\\)\n(test\\.get\\('scope'\\))\\.find\\(('?[a-zA-Z0-9\\.\\#\\-\\[\\]\\\"\\=\\_\\, \\$\\:\\(\\)]+'?)(?!\\.each)\\)\n\\$\\.each\\(([a-zA-Z0-9]*), function \\(index, ([a-zA-Z0-9]+)\n$1.forEach(function ($2, index\n\\.each\\(function \\((index), ([a-zA-Z0-9\\.#-\\[\\]'\"=_, \\$:]+)\\)\n"
  },
  {
    "path": "scripts/removeQuailFromAssessments.js",
    "content": "module.exports = function(file, api, options) {\n  var j = api.jscodeshift;\n  var root = j(file.source);\n  var body = root.get().value.program.body;\n\n  if (!body) {\n    return null;\n  }\n\n  // Remove Case parameters.\n  root\n    .find(j.FunctionExpression)\n    .forEach(function (funcExp) {\n      let index = -1;\n      funcExp.value.params.forEach(function (param, ii) {\n        if (param.name === 'quail') {\n          index = ii;\n        }\n      });\n      if (index > -1) {\n        funcExp.value.params.splice(index, 1);\n      }\n    })\n\n  return root.toSource(options.printOptions || {\n    quote: 'single'\n  });\n}\n"
  },
  {
    "path": "scripts/selectorToIndividualFile.js",
    "content": "#!/usr/bin/env node\nvar fs = require('fs');\nvar path = require('path');\nvar yamljs = require('yamljs');\n\n// Load yaml file using yamljs.load\nvar assessments = yamljs.load(path.join(__dirname, '..', 'src', 'resources', 'tests.yml'));\n\n// Pull out assessments that are type selector.\nvar selectorAssessments = [];\nfs.readFile(path.join(__dirname, '..', 'selectorTemplate.js'), {\n  encoding: 'utf-8'\n}, function (err, template) {\n  if (err) {\n    console.error(err);\n  }\n  Object.keys(assessments).forEach(function (key) {\n    var a = assessments[key];\n    if (a.type === 'selector') {\n      var filePath = path.join(__dirname, '..', 'lib', 'assessments', key + '.js');\n      // Stat if an assessment script exists.\n      // Raise a warning if it does.\n      fs.open(filePath, 'r+', function (err, fd) {\n        // The file does not exist.\n        if (err) {\n          fs.open(filePath, 'w', function (err, fd) {\n            if (err) {\n              console.error('Coule not create file %s.', [key + '.js']);\n            }\n            // Create the file.\n            else {\n              var selector = a.options.selector.replace(/'/g, '\\\"');\n              var newFile = template.replace('%name%', key).replace('%selector%', selector);\n\n              var buffer = new Buffer(newFile, \"utf-8\");\n\n              fs.write(fd, buffer, 0, buffer.length, null, function (err, written, buffer) {\n                if (err) {\n                  console.error(err);\n                }\n                // Close the file.\n                fs.close(fd, function() {\n                  console.log('Wrote file %s.', [key + '.js']);\n                });\n              });\n            }\n          });\n        }\n        else {\n          console.warn('The file %s already exists.', [key + '.js']);\n          fs.close(fd);\n        }\n      });\n    }\n  });\n});\n\nfs.readFile(path.join(__dirname, '..', 'htmlTemplate.html'), {\n  encoding: 'utf-8'\n}, function (err, template) {\n  if (err) {\n    console.error(err);\n  }\n  Object.keys(assessments).forEach(function (key) {\n    var a = assessments[key];\n    if (a.type === 'selector') {\n      var htmlPath = path.join(__dirname, '..', 'test', 'assessmentSpecs', 'specs', key, key + '-nomatch.html');\n\n      fs.open(htmlPath, 'r+', function (err, fd) {\n        // The file does not exist.\n        if (err) {\n          fs.open(htmlPath, 'w', function (err, fd) {\n            if (err) {\n              console.error('Coule not create file %s.', [key + '-nomatch.html']);\n            }\n            // Create the file.\n            else {\n              var newFile = template.replace('%name%', key);\n\n              var buffer = new Buffer(newFile, \"utf-8\");\n\n              fs.write(fd, buffer, 0, buffer.length, null, function (err, written, buffer) {\n                if (err) {\n                  console.error(err);\n                }\n                // Close the file.\n                fs.close(fd, function() {\n                  console.log('Wrote file %s.', [key + '-nomatch.html']);\n                });\n              });\n            }\n          });\n        }\n        else {\n          console.warn('The file %s already exists.', [key + '-nomatch.html']);\n          fs.close(fd);\n        }\n      });\n    }\n  });\n});\n\nfs.readFile(path.join(__dirname, '..', 'specTemplate.js'), {\n  encoding: 'utf-8'\n}, function (err, template) {\n  if (err) {\n    console.error(err);\n  }\n  Object.keys(assessments).forEach(function (key) {\n    var a = assessments[key];\n    if (a.type === 'selector') {\n      var specPath = path.join(__dirname, '..', 'test', 'assessmentSpecs', 'specs', key, key + 'Spec.js');\n\n      fs.open(specPath, 'w', function (err, fd) {\n        // The file does not exist.\n        if (err) {\n          console.error(err);\n        }\n        fs.open(specPath, 'w', function (err, fd) {\n          if (err) {\n            console.error('Coule not open file %s.', [key + 'Spec.js']);\n          }\n          // Create the file.\n          else {\n            var newFile = template.replace(/%name%/g, key);\n\n            var buffer = new Buffer(newFile, \"utf-8\");\n\n            fs.write(fd, buffer, 0, buffer.length, null, function (err, written, buffer) {\n              if (err) {\n                console.error(err);\n              }\n              // Close the file.\n              fs.close(fd, function() {\n                console.log('Wrote file %s.', [key + 'Spec.js']);\n              });\n            });\n          }\n        });\n      });\n    }\n  });\n});\n\n// Copy the template\n// a) replace the placeholders with the assessment name.\n// b) replace the selector placeholder with the selector.\n\n\n// Write it out to file.\n// fs.writeFile(path.join(__dirname, '..', 'tmp', 'assessessments-table.html'), table, function (err) {\n//   if (err) throw err;\n//   console.log('It\\'s saved!');\n// });\n"
  },
  {
    "path": "scripts/upperCaseIt.py",
    "content": "import os\nimport re\n\nsearchDir = '/Users/jessebeach/code/quailjs/quail/lib/assessments'\nexclude = ['.git', 'node_modules','bin']\nos.chdir(searchDir)\n\nfor root, dirs, files in os.walk(searchDir):\n    dirs[:] = [d for d in dirs if d not in exclude]\n    for f in files:\n        if re.match(r'[a-z]', f):\n            fullPath = os.path.join(root, f)\n            fullPathLower = os.path.join(root, f[0].upper() + f[1:])\n            command = 'git mv --force ' + fullPath + ' ' + fullPathLower\n            print(command)\n            os.system(command)\n"
  },
  {
    "path": "scripts/wrapScriesInGetScope.js",
    "content": "module.exports = function(file, api, options) {\n  const j = api.jscodeshift;\n  const {expression, statement, statements} = j.template;\n  let path = j(file.source);\n\n  path\n    .find(j.MemberExpression, {\n  \t\tobject: {\n        \ttype: 'CallExpression'\n        },\n        property: {\n          name: 'forEach'\n        }\n  \t})\n    .filter(me => {\n      let testProp;\n      let getProp;\n      let scopeProp;\n      let message = [];\n      try {\n        testProp = me.parent.value.callee.object.arguments[1].callee.object.name;\n      } catch (error) {\n        message.push('test');\n      }\n      try {\n        getProp = me.parent.value.callee.object.arguments[1].callee.property.name;\n      }\n      catch (error) {\n        message.push('get');\n      }\n      try {\n        scopeProp = me.parent.value.callee.object.arguments[1].arguments[0].rawValue;\n      }\n      catch (error) {\n        message.push('scope');\n      }\n      if (message.length > 0) {\n        console.log('Could not find: ', message.join(', '));\n      }\n      return testProp === 'test' && getProp === 'get' && scopeProp === 'scope';\n    })\n    .forEach(me => {\n      me.value.object.arguments.splice(1, 1, j.identifier('scope'));\n    })\n  \t.map((me) => me.parent.parent)\n    .forEach(exp => {\n      let newExp = j.expressionStatement(\n        j.callExpression(\n          j.memberExpression(\n            j.callExpression(\n              j.memberExpression(\n                j.identifier('test'),\n                j.identifier('get')\n              ),\n            [\n              j.literal('scope')\n            ]\n          ),\n          j.identifier('forEach')\n        ),\n        [\n          j.functionExpression(\n            j.identifier(''),\n            [\n              j.identifier('scope')\n            ],\n            j.blockStatement(\n              [\n                exp.value\n              ]\n            ),\n            false,\n            false\n          )\n        ]\n      )\n    );\n    j(exp).replaceWith(newExp);\n  });\n\n  return path.toSource(options.printOptions || {\n    quote: 'single'\n  });\n};\n"
  },
  {
    "path": "src/assessments/AAdjacentWithSameResourceShouldBeCombined.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar AAdjacentWithSameResourceShouldBeCombined = {\n  run: function (test) {\n\n    function findAdjacent (element) {\n      // Find all the links\n      var links = DOM.scry('a', element);\n      // Sort them into singletons and coupletons.\n      var $singletons = [];\n      var $coupletons = [];\n\n      links.forEach(function (link) {\n        var next = DOM.next(link);\n        if (next && DOM.is(next, 'a')) {\n          $coupletons.push(link);\n        }\n        else {\n          $singletons.push(link);\n        }\n      });\n\n      $singletons.forEach(excludeSingleLinks);\n      $coupletons.forEach(checkNextLink);\n    }\n\n    function checkNextLink (element) {\n      var thisHref = element.getAttribute('href');\n      var next = DOM.next(element);\n      var status = 'passed';\n      var _case = Case({\n        element: element\n      });\n      if (next) {\n        var nextHref = next.getAttribute('href');\n        if (thisHref === nextHref) {\n          status = 'failed';\n        }\n      }\n\n      test.add(_case);\n      _case.set({\n        status: status\n      });\n    }\n\n    function excludeSingleLinks (element) {\n      var _case = Case({\n        element: element\n      });\n      test.add(_case);\n      _case.set({\n        status: 'inapplicable'\n      });\n    }\n\n    test.get('scope').forEach(findAdjacent);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Adjacent links that point to the same location should be merged',\n      nl: 'Voeg naast elkaar gelegen links die naar dezelfde locatie verwijzen samen'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing two links right next to each other that point to the same location can be confusing. Try combining the links.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Voor hen zijn naast elkaar gelegen links die naar dezelfde locatie verwijzen verwarrend. Probeer de links samen te voegen.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: [\n            'H2',\n            'F89'\n          ]\n        },\n        '2.4.9': {\n          techniques: [\n            'F89'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'F89'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = AAdjacentWithSameResourceShouldBeCombined;\n"
  },
  {
    "path": "src/assessments/AImgAltNotRepetitive.js",
    "content": "var CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar AImgAltNotRepetitive = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a img[alt]', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n\n        var alt = CleanStringComponent(DOM.getAttribute(element, 'alt'));\n        var link = DOM\n          .parents(element);\n        link\n          .unshift(element);\n        link = link.find((el) => DOM.is(el, 'a'));\n        var linkText = CleanStringComponent(DOM.text(link));\n\n        if (alt.length > 0 && linkText.indexOf(alt) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'When an image is in a link, its \\\"alt\\\" attribute should not repeat other text in the link',\n      nl: 'Als een link een afbeelding bevat, moet het \\\"alt\\\"-attribuut niet dezelfde tekst bevatten als de linktekst'\n    },\n    description: {\n      en: 'Images within a link should not have an alt attribute that simply repeats the text found in the link. This will cause screen readers to simply repeat the text twice.',\n      nl: 'Als een link een afbeelding bevat, moet deze afbeelding een andere tekst in het alt-attribuut hebben dan de tekst in de link. Hiermee voorkom je dat een schermlezer dezelfde tekst twee keer voorleest.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H30'\n          ]\n        },\n        '2.4.4': {\n          techniques: [\n            'H30'\n          ]\n        },\n        '2.4.9': {\n          techniques: [\n            'H30'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = AImgAltNotRepetitive;\n"
  },
  {
    "path": "src/assessments/AInPHasADistinctStyle.js",
    "content": "const BorderDetailsComponent = require('BorderDetailsComponent');\nconst Case = require('Case');\nconst DOM = require('DOM');\nconst AInPHasADistinctStyle = {\n  run: function (test) {\n\n    /**\n     * Checks if an element has a border set\n     * @param element\n     * @returns {boolean}\n     */\n    function hasBorder (element) {\n      let borders = BorderDetailsComponent(element);\n      let width = 0;\n      for (let border of borders) {\n        let [,\n          details\n        ] = border;\n        width += details.width;\n      }\n      return (width > 0);\n    }\n\n    /**\n     * Test if two elements have a distinct style from it's ancestor\n     * @param  {jQuery node} $elm\n     * @param  {jQuery node} $parent\n     * @return {boolean}\n     */\n    function elmHasDistinctStyle ($elm, $parent) {\n      var result = false;\n      var styleProperties = ['font-weight', 'font-style'];\n      var textDecoration = DOM.getComputedStyle($elm, 'text-decoration');\n\n      if (textDecoration !== 'none' &&\n      textDecoration !== DOM.getComputedStyle($parent, 'text-decoration')) {\n        result = true;\n      }\n\n      if (DOM.getComputedStyle($elm, 'background-color') !== 'rgba(0, 0, 0, 0)') {\n        styleProperties.push('background');\n      }\n\n      styleProperties.forEach(function (styleProp) {\n        if (!result && DOM.getComputedStyle($elm, styleProp) !== DOM.getComputedStyle($parent, styleProp)) {\n          result = true;\n        }\n      });\n\n      return result || hasBorder($elm);\n    }\n\n    function elmHasDistinctPosition ($elm) {\n      var isBlock = (DOM.getComputedStyle($elm, 'display') === 'block');\n      var position = DOM.getComputedStyle($elm, 'position');\n      var isPositioned = position !== 'relative' && position !== 'static';\n      return isBlock || isPositioned;\n    }\n\n    // Ignore links where the p only contains white space, <, >, |, \\, / and - chars\n    var allowedPText = /^([\\s|-]|>|<|\\\\|\\/|&(gt|lt);)*$/i;\n\n    test.get('scope').forEach(function (scope) {\n      var anchors = DOM.scry('p a[href]', scope);\n\n      anchors.forEach(function (element) {\n        var $p = DOM.parents(element).find((parent) => DOM.is(parent, 'p'));\n        var $parent = element.parentNode;\n\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var aText = DOM.text(element).trim();\n\n        // Get all text of the p element with all anchors removed\n        var pClone = $p.cloneNode(true);\n        DOM.scry('a[href]', pClone).forEach((link) => {\n          link.parentNode.removeChild(link);\n        });\n        var pText = DOM.text(pClone).trim();\n\n        if (aText === '' || pText.match(allowedPText)) {\n          _case.set('status', 'inapplicable');\n        }\n        else if (\n          DOM.getComputedStyle(element, 'color') === DOM.getComputedStyle($p, 'color')\n        ) {\n          _case.set('status', 'passed');\n        }\n        else if (elmHasDistinctStyle(element, $p)) {\n          _case.set('status', 'passed');\n        }\n        else if (elmHasDistinctPosition(element)) {\n          _case.set('status', 'passed');\n        }\n        else if (DOM.scry('img', element).length > 0) {\n          _case.set('status', 'passed');\n        }\n        else if (DOM.text($parent).trim() === aText &&\n        elmHasDistinctStyle($parent, $p)) {\n          _case.set('status', 'passed');\n        }\n        else {\n          _case.set('status', 'failed');\n        }\n      });\n\n    });\n\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should be have a distinct style inside a p tag',\n      nl: 'Links moeten een afwijkende stijl hebben binnen een paragraaf'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = AInPHasADistinctStyle;\n"
  },
  {
    "path": "src/assessments/ALinkTextDoesNotBeginWithRedundantWord.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar ALinkTextDoesNotBeginWithRedundantWord = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var self = element;\n        var $link = element;\n        var text = '';\n        var $img = DOM.scry('img[alt]', $link)[0];\n        if ($img) {\n          text = text + DOM.getAttribute($img, 'alt');\n        }\n        text = text + DOM.text($link);\n        text = text.toLowerCase();\n        var _case;\n        // Search the text for redundant words. Break as soon as one is detected.\n        for (var i = 0, il = RedundantStringsComponent.link.length; i < il; ++i) {\n          var phrase = RedundantStringsComponent.link[i];\n          if (text.search(phrase) > -1) {\n            _case = test.add(Case({\n              element: self,\n              status: 'failed'\n            }));\n            break;\n          }\n        }\n        // If the case didn't fail, then it passed.\n        if (!_case) {\n          test.add(Case({\n            element: self,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Link text should not begin with redundant text',\n      nl: 'Laat linkteksten niet beginnen met overbodige tekst'\n    },\n    description: {\n      en: 'Link text should not begin with redundant words or phrases like \\\"link\\\".',\n      nl: 'Laat linkteksten niet beginnen met overbodige woorden of woordcombinaties als \\\"link\\\" of \\\"klik hier\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.9': {\n          techniques: [\n            'F84'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = ALinkTextDoesNotBeginWithRedundantWord;\n"
  },
  {
    "path": "src/assessments/ALinkWithNonText.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ALinkWithNonText = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      var links = DOM.scry('a', scope);\n      var inapplicableLinks = [];\n      var applicableLinks = [];\n      links.forEach((link) => {\n        var contents;\n        if (DOM.hasAttribute(link, 'href')) {\n          contents = DOM.scry('img, object, embed', link);\n          if (contents.length) {\n            applicableLinks.push(link);\n          }\n          else {\n            inapplicableLinks.push(link);\n          }\n        }\n        else {\n          inapplicableLinks.push(link);\n        }\n      });\n\n      inapplicableLinks.forEach(function (element) {\n        var _case = Case({\n          element: element,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n      });\n\n      applicableLinks.forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!IsUnreadable(DOM.text(element))) {\n          _case.set({\n            status: 'passed'\n          });\n          return;\n        }\n        var unreadable = 0;\n        DOM.scry('img, object, embed', element).forEach(function (element) {\n          if ((DOM.is(element, 'img') && IsUnreadable(DOM.getAttribute(element, 'alt'))) ||\n            (!DOM.is(element, 'img') && IsUnreadable(DOM.getAttribute(element, 'title')))) {\n            unreadable++;\n          }\n        });\n        if (DOM.scry('img, object, embed', element).length === unreadable) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    title: {\n      en: 'Links with only non-text content should be readable',\n      nl: 'Links zonder tekstuele content moeten leesbaar zijn'\n    },\n    description: {\n      en: 'If a link contains only non-text content like an image, that content must be readable by assistive technology.',\n      nl: 'Als een link alleen maar niet-tekstuele content bevat zoals een afbeelding, moet deze content leesbaar worden gemaakt door middel van daarvoor geschikte technologie.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: [\n            'H2',\n            'F89'\n          ]\n        },\n        '2.4.9': {\n          techniques: [\n            'F89'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'F89'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = ALinkWithNonText;\n"
  },
  {
    "path": "src/assessments/ALinksAreSeparatedByPrintableCharacters.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ALinksAreSeparatedByPrintableCharacters = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        // Only test if there's another a tag.\n        var next = DOM.next(element);\n        if (next && DOM.is(next, 'a')) {\n          if (IsUnreadable(element.nextSibling.wholeText)) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n          else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Lists of links should be seperated by printable characters',\n      nl: 'Lijsten met links moeten gescheiden worden door afdrukbare tekens'\n    },\n    description: {\n      en: 'If a list of links is provided within the same element, those links should be seperated by a non-linked, printable character. Structures like lists are not included in this.',\n      nl: 'Als een rij met links binnen eenzelfde element staat, moeten de links gescheiden zijn door een niet-gelinkt, afdrukbaar teken. Dit geldt niet voor een gestructureerde lijst.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = ALinksAreSeparatedByPrintableCharacters;\n"
  },
  {
    "path": "src/assessments/ALinksDontOpenNewWindow.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar NewWindowStringsComponent = require('NewWindowStringsComponent');\nvar ALinksDontOpenNewWindow = {\n  run: function (test) {\n    // Links without a target attribute pass.\n    test.get('scope').forEach((scope) => {\n      let links = DOM.scry('a', scope);\n      let passLinks = [];\n      let checkLinks = []\n      links.forEach((link) => {\n        let target = DOM.getAttribute(link, 'target');\n        if (['_new', '_blank'].indexOf(target) > -1) {\n          checkLinks.push(link);\n        }\n        else {\n          passLinks.push(link);\n        }\n      });\n      passLinks.forEach(function (element) {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      });\n      // Links with a target attribute pass if the link text indicates that the\n      // link will open a new window.\n      checkLinks.forEach(function (element) {\n        var $link = element;\n        var passes = false;\n        var i = 0;\n        var text = DOM.text($link) + ' ' + DOM.getAttribute($link, 'title');\n        var phrase = '';\n        // Test the link text against strings the indicate the link will open\n        // in a new window.\n        do {\n          phrase = NewWindowStringsComponent[i];\n          if (text.search(phrase) > -1) {\n            passes = true;\n          }\n          ++i;\n\n        } while (!passes && i < NewWindowStringsComponent.length);\n        // Build a Case.\n        if (passes) {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n        else {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not open a new window without warning',\n      nl: 'Met links open je geen nieuw scherm zonder melding'\n    },\n    description: {\n      en: 'Links which open a new window using the \\\"target\\\" attribute should warn users.',\n      nl: 'Voordat links door middel van het \\\"target\\\"-attribuut een nieuw scherm openen moet de gebruiker een melding hiervan krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.5': {\n          techniques: [\n            'H83',\n            'SCR24'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = ALinksDontOpenNewWindow;\n"
  },
  {
    "path": "src/assessments/ALinksNotSeparatedBySymbols.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar SymbolsStringsComponent = require('SymbolsStringsComponent');\nvar ALinksNotSeparatedBySymbols = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var $link = element;\n        var next = DOM.next($link);\n        if (next && DOM.is(next, 'a')) {\n          var text = $link.nextSibling.wholeText;\n          // The string between the links is composed of symbols.\n          if (typeof text === 'string' && SymbolsStringsComponent.indexOf(text.toLowerCase().trim()) !== -1) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n          // The string between the links is composed of words.\n          else {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n        }\n        // If nothing follows the link, then there is nothing to test.\n        else {\n          test.add(Case({\n            element: element,\n            status: 'inapplicable'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not be separated by symbols alone',\n      nl: 'Links mogen niet alleen door symbolen gescheidn worden'\n    },\n    description: {\n      en: 'Since symbols are either not read, or can be confusing when using a screen reader, do not separate links with un-readable symbols.',\n      nl: 'Symbolen worden niet voorgelezen of zijn verwarrend bij het gebruik van een schermlezer. Gebruik geen onleesbare symbolen om links van elkaar te scheiden.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = ALinksNotSeparatedBySymbols;\n"
  },
  {
    "path": "src/assessments/ALinksToMultiMediaRequireTranscript.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar ALinksToMultiMediaRequireTranscript = {\n  run: function (test) {\n    var selector = [\n      'a[href$=\".wmv\"]',\n      'a[href$=\".mpg\"]',\n      'a[href$=\".mov\"]',\n      'a[href$=\".ram\"]',\n      'a[href$=\".aif\"]'\n    ].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any links to a multimedia file should also include a link to a transcript',\n      nl: 'Elke link naar een multimediabestand moet ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'Links to a multimedia file should be followed by a link to a transcript of the file.',\n      nl: 'Links naar een multimediabestand moeten worden gevolgd door een link naar de transcriptie van dit bestand.'\n    },\n    guidelines: {\n      508: [\n        'c'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'media',\n      'content'\n    ]\n  }\n};\nmodule.exports = ALinksToMultiMediaRequireTranscript;\n"
  },
  {
    "path": "src/assessments/ALinksToSoundFilesNeedTranscripts.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar ALinksToSoundFilesNeedTranscripts = {\n  run: function (test) {\n\n    var selector = [\n      'a[href$=\".wav\"]',\n      'a[href$=\".snd\"]',\n      'a[href$=\".mp3\"]',\n      'a[href$=\".iff\"]',\n      'a[href$=\".svx\"]',\n      'a[href$=\".sam\"]',\n      'a[href$=\".smp\"]',\n      'a[href$=\".vce\"]',\n      'a[href$=\".vox\"]',\n      'a[href$=\".pcm\"]',\n      'a[href$=\".aif\"]'\n    ].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any links to a sound file should also include a link to a transcript',\n      nl: 'Elke link naar een geluidsbestand moet ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'Links to a sound file should be followed by a link to a transcript of the file.',\n      nl: 'Links naar een geluidsbestand moeten worden gevolgd door een link naar de transcriptie van dit bestand.'\n    },\n    guidelines: {\n      508: [\n        'c'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'media',\n      'content'\n    ]\n  }\n};\nmodule.exports = ALinksToSoundFilesNeedTranscripts;\n"
  },
  {
    "path": "src/assessments/AMultimediaTextAlternative.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar AMultimediaTextAlternative = {\n  run: function (test) {\n\n    var selector = [\n      'a[href$=\".aif\"]',\n      'a[href$=\".iff\"]',\n      'a[href$=\".mov\"]',\n      'a[href$=\".mp3\"]',\n      'a[href$=\".mpg\"]',\n      'a[href$=\".ram\"]',\n      'a[href$=\".sam\"]',\n      'a[href$=\".smp\"]',\n      'a[href$=\".snd\"]',\n      'a[href$=\".svx\"]',\n      'a[href$=\".pcm\"]',\n      'a[href$=\".vce\"]',\n      'a[href$=\".vox\"]',\n      'a[href$=\".wav\"]',\n      'a[href$=\".wmv\"]'\n    ].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      // Inapplicable.\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        // cantTell.\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'media',\n      'content'\n    ]\n  }\n};\nmodule.exports = AMultimediaTextAlternative;\n"
  },
  {
    "path": "src/assessments/AMustContainText.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar AMustContainText = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        if (!DOM.getAttribute(element, 'href') ||\n          DOM.getComputedStyle(element, 'display') === 'none') {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n\n        if (/\\S/.test(element.innerHTML)) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'failed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should contain text',\n      nl: 'Links moeten tekst bevatten'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing links with no text (or with images that have empty \\\"alt\\\" attributes and no other readable text) hinders these users.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Links zonder tekst (of met afbeeldingen die een leeg \\\"alt\\\"-attribuut hebben en geen andere leesbare tekst) hinderen deze gebruikers.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H30'\n          ]\n        },\n        '2.4.4': {\n          techniques: [\n            'H30'\n          ]\n        },\n        '2.4.9': {\n          techniques: [\n            'H30'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = AMustContainText;\n"
  },
  {
    "path": "src/assessments/AMustHaveTitle.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar AMustHaveTitle = {\n  run: function (test) {\n    test.get('scope').forEach(function (element) {\n      var links = DOM.scry('a', element);\n\n      links.forEach(function (link) {\n        // Has a title attribute and that attribute has a value, then pass.\n        var title = link.getAttribute('title');\n        if (typeof title === 'string' && title.length > 0) {\n          test.add(Case({\n            element: link,\n            status: 'passed'\n          }));\n        }\n        // Does not have a title attribute or the attribute does not have a value.\n        else if (!title || !title.length) {\n          test.add(Case({\n            element: link,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All links must have a \\\"title\\\" attribute',\n      nl: 'Alle links moeten een \\\"title\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Every link must have a \\\"title\\\" attribute.',\n      nl: 'Zorg ervoor dat elke link is voorzien van een \\\"title\\\"-attribuut.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = AMustHaveTitle;\n"
  },
  {
    "path": "src/assessments/AMustNotHaveJavascriptHref.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AMustNotHaveJavascriptHref = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'a[href^=\"javascript:\"]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should not use \\\"javascript\\\" in their location',\n      nl: 'Links moeten geen \\\"javascript\\\" in hun locatie hebben'\n    },\n    description: {\n      en: 'Anchor (<code>a</code>.  elements may not use the \\\"javascript\\\" protocol in their \\\"href\\\" attributes.',\n      nl: 'Anchor(<code>a</code>.-elementen mogen geen \\\"javascript\\\"protocol in hun \\\"href\\\"-attributen hebben staan.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = AMustNotHaveJavascriptHref;\n"
  },
  {
    "path": "src/assessments/ASuspiciousLinkText.js",
    "content": "var CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar SuspiciousLinksStringsComponent = require('SuspiciousLinksStringsComponent');\nvar ASuspiciousLinkText = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!DOM.getAttribute(element, 'href')) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        var text = DOM.text(element);\n        DOM.scry('img[alt]', element).forEach(function (element) {\n          text = text + DOM.getAttribute(element, 'alt');\n        });\n        if (SuspiciousLinksStringsComponent.indexOf(CleanStringComponent(text)) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Link text should be useful',\n      nl: 'Linkteksten moeten bruikbaar en betekenisvol zijn'\n    },\n    description: {\n      en: 'Because many users of screen-readers use links to navigate the page, providing links with text that simply read \\\"click here\\\" gives no hint of the function of the link.',\n      nl: 'Veel gebruikers van schermlezers gebruiken links om op de pagina te navigeren. Links met de tekst \\\"klik hier\\\" zijn voor deze gebruikers niet betekenisvol en niet bruikbaar.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H30'\n          ]\n        },\n        '2.4.4': {\n          techniques: [\n            'H30'\n          ]\n        },\n        '2.4.9': {\n          techniques: [\n            'H30'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = ASuspiciousLinkText;\n"
  },
  {
    "path": "src/assessments/ATitleDescribesDestination.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ATitleDescribesDestination = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'a[title]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The title attribute of all source a (anchor) elements describes the link destination.',\n      nl: 'Het titel-attribuut van alle source a (anchor)-elementen beschrijven de bestemming van de link'\n    },\n    description: {\n      en: 'Every link must have a \\\"title\\\" attribute which describes the purpose or destination of the link.',\n      nl: 'Elke link moet een \\\"title\\\"-attribuut hebben waarin het doel of de bestemming van de link wordt beschreven.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.9': {\n          techniques: [\n            'H33',\n            'H25'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = ATitleDescribesDestination;\n"
  },
  {
    "path": "src/assessments/AnimatedGifMayBePresent.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar AnimatedGifMayBePresent = {\n  run: function (test) {\n\n    /**\n     * Test if gif is animated\n     * Implemented from: https://gist.github.com/3012623.git\n     * @param src\n     * @param ext\n     * @param cb\n     */\n    function isAnimatedGif (src, ext, cb) {\n\n      if (ext !== 'gif') {\n        cb(false);\n        return;\n      }\n\n      var request = new XMLHttpRequest();\n      request.open('GET', src, true);\n      request.responseType = 'arraybuffer';\n      request.addEventListener('load', function () {\n        var arr = new Uint8Array(request.response);\n        var frames = 0;\n\n        // make sure it's a gif (GIF8)\n        if (arr[0] !== 0x47 || arr[1] !== 0x49 || arr[2] !== 0x46 || arr[3] !== 0x38) {\n          cb(false);\n          return;\n        }\n\n        // ported from php http://www.php.net/manual/en/function.imagecreatefromgif.php#104473\n        // an animated gif contains multiple \"frames\", with each frame having a\n        // header made up of:\n        // * a static 4-byte sequence (\\x00\\x21\\xF9\\x04)\n        // * 4 variable bytes\n        // * a static 2-byte sequence (\\x00\\x2C) (some variants may use \\x00\\x21 ?)\n        // We read through the file til we reach the end of the file, or we've found\n        // at least 2 frame headers\n        for (var i = 0; i < arr.length - 9; i++) {\n          if (arr[i] === 0x00 && arr[i + 1] === 0x21 &&\n            arr[i + 2] === 0xF9 && arr[i + 3] === 0x04 &&\n            arr[i + 8] === 0x00 &&\n            (arr[i + 9] === 0x2C || arr[i + 9] === 0x21)) {\n            frames++;\n          }\n          if (frames > 1) {\n            cb(true);\n            return;\n          }\n        }\n\n        cb(false);\n      });\n      request.send();\n    }\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img', scope).forEach(function (element) {\n\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var imgSrc = DOM.getAttribute(element, 'src');\n        var ext = DOM.getAttribute(element, 'src').split('.').pop().toLowerCase();\n\n        if (ext !== 'gif') {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n\n        isAnimatedGif(imgSrc, ext, function (animated) {\n          if (animated) {\n            _case.set({\n              status: 'cantTell'\n            });\n            return;\n          }\n          else {\n            _case.set({\n              status: 'inapplicable'\n            });\n            return;\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Test if a .gif is used on the page. Test if the .gif contains more then one frame',\n      nl: 'Test of een .gif afbeelding gebruikt is op de pagina. Test of het .gif bestand uit meer dan één frame bestaat'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'gif'\n    ]\n  }\n};\nmodule.exports = AnimatedGifMayBePresent;\n"
  },
  {
    "path": "src/assessments/AppletContainsTextEquivalent.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar AppletContainsTextEquivalent = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('applet', scope)\n        .forEach(function (element) {\n          var _case = Case({\n            element: element\n          });\n          test.add(_case);\n          if (IsUnreadable(DOM.text(element))) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n          else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All applets should contain the same content within the body of the applet',\n      nl: 'Alle applets moeten dezelfde content bevatten in de body van de applet'\n    },\n    description: {\n      en: 'Applets should contain their text equivalents or description within the <code>applet</code> tag itself.',\n      nl: 'Applets moeten hun tekstuele equivalent of beschrijving bevatten in de <code>applet</code> tag.'\n    },\n    guidelines: {\n      508: [\n        'm'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74',\n            'H35'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'applet',\n      'content'\n    ]\n  }\n};\nmodule.exports = AppletContainsTextEquivalent;\n"
  },
  {
    "path": "src/assessments/AppletContainsTextEquivalentInAlt.js",
    "content": "var PlaceholderComponent = require('PlaceholderComponent');\nvar AppletContainsTextEquivalentInAlt = {\n  run: function (test) {\n    PlaceholderComponent(test, {\n      selector: 'applet',\n      attribute: 'alt',\n      empty: true\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All applets should contain a text equivalent in the \\\"alt\\\" attribute',\n      nl: 'Alle applets moeten een tekstuele equivalent bevatten in het \\\"alt\\\"-attribuut'\n    },\n    description: {\n      en: 'Applets should contain their text equivalents or description in an \\\"alt\\\" attribute.',\n      nl: 'Applets moeten hun tekstuele equivalent of beschrijving bevatten in een \\\"alt\\\"-attribuut.'\n    },\n    guidelines: {\n      508: [\n        'm'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74',\n            'H35'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'applet',\n      'content'\n    ]\n  }\n};\nmodule.exports = AppletContainsTextEquivalentInAlt;\n"
  },
  {
    "path": "src/assessments/AppletProvidesMechanismToReturnToParent.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AppletProvidesMechanismToReturnToParent = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All applets should provide a way for keyboard users to escape',\n      nl: 'Alle applets moeten door toetsenbordgebruikers kunnen worden verlaten'\n    },\n    description: {\n      en: 'Ensure that a user who has only a keyboard as an input device can escape an <code>applet</code> element. This requires manual confirmation.',\n      nl: 'Zorg ervoor dat gebruikers die alleen het toetsenbord gebruiken als bediening een <code>applet</code>-element kunnen verlaten. Hiervoor is handmatige bevestiging nodig.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'applet',\n      'content'\n    ]\n  }\n};\nmodule.exports = AppletProvidesMechanismToReturnToParent;\n"
  },
  {
    "path": "src/assessments/AppletTextEquivalentsGetUpdated.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AppletTextEquivalentsGetUpdated = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: {\n      508: [\n        'm'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74',\n            'H35'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'applet',\n      'content'\n    ]\n  }\n};\nmodule.exports = AppletTextEquivalentsGetUpdated;\n"
  },
  {
    "path": "src/assessments/AppletUIMustBeAccessible.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AppletUIMustBeAccessible = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any user interface in an applet must be accessible',\n      nl: 'Elke user interface in een applet moet toegankelijk zijn'\n    },\n    description: {\n      en: 'Applet content should be assessed for accessibility.',\n      nl: 'Content in een applet moet getoetst worden op toegankelijkheid.'\n    },\n    guidelines: {\n      508: [\n        'm'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74',\n            'H35'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'applet',\n      'content'\n    ]\n  }\n};\nmodule.exports = AppletUIMustBeAccessible;\n"
  },
  {
    "path": "src/assessments/AppletsDoNotFlicker.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AppletsDoNotFlicker = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All applets do not flicker',\n      nl: 'Applets knipperen of flitsen niet'\n    },\n    description: {\n      en: 'Applets should not flicker.',\n      nl: 'Geen enkele applet mag knipperen of flitsen.'\n    },\n    guidelines: {\n      508: [\n        'j'\n      ],\n      wcag: {\n        '2.2.2': {\n          techniques: [\n            'F7'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'applet',\n      'content'\n    ]\n  }\n};\nmodule.exports = AppletsDoNotFlicker;\n"
  },
  {
    "path": "src/assessments/AppletsDonotUseColorAlone.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AppletsDonotUseColorAlone = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'applet';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Applets should not use color alone to communicate content',\n      nl: 'Applets mogen niet alleen kleur gebruiken om een boodschap over te brengen'\n    },\n    description: {\n      en: 'Applets should contain content that makes sense without color and is accessible to users who are color blind.',\n      nl: 'Applets moeten content bevatten die ook bruikbaar is zonder kleur en die toegankelijk is voor gebruikers met kleurenblindheid.'\n    },\n    guidelines: {\n      508: [\n        'c'\n      ]\n    },\n    tags: [\n      'objects',\n      'applet',\n      'content'\n    ]\n  }\n};\nmodule.exports = AppletsDonotUseColorAlone;\n"
  },
  {
    "path": "src/assessments/AreaAltIdentifiesDestination.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AreaAltIdentifiesDestination = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope)\n        .filter((element) => {\n          let alt = DOM.getAttribute(element, 'alt');\n          return !(alt && alt.length > 0);\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All \\\"area\\\" elements must have an \\\"alt\\\" attribute which describes the link destination',\n      nl: 'Alle \\\"area\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben die de bestemming van de link beschrijft'\n    },\n    description: {\n      en: 'All <code>area</code> elements within a <code>map</code> must have an \\\"alt\\\" attribute',\n      nl: 'Alle <code>area</code>-elementen binnen een <code>map</code> moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'applet',\n      'content'\n    ],\n    options: {\n      test: 'area[alt]'\n    }\n  }\n};\nmodule.exports = AreaAltIdentifiesDestination;\n"
  },
  {
    "path": "src/assessments/AreaAltRefersToText.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AreaAltRefersToText = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Alt text for \\\"area\\\" elements should replicate the text found in the image',\n      nl: 'Alt-tekst voor \\\"area\\\"-elementen moeten de tekst bevatten zoals die ook in de afbeelding staat'\n    },\n    description: {\n      en: 'If an image is being used as a map, and an <code>area</code> encompasses text within the image, then the \\\"alt\\\" attribute of that <code>area</code> element should be the same as the text found in the image.',\n      nl: 'Als een afbeelding als kaart wordt gebruikt, en een <code>area</code> bevat tekst binnen de afbeelding, dan moet het \\\"alt\\\"-attribuut van dat <code>area</code>-element hetzelfde zijn als de tekst die in de afbeelding staat.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'imagemap',\n      'content'\n    ]\n  }\n};\nmodule.exports = AreaAltRefersToText;\n"
  },
  {
    "path": "src/assessments/AreaDontOpenNewWindow.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nconst Case = require('Case');\nconst DOM = require('DOM');\nconst NewWindowStringsComponent = require('NewWindowStringsComponent');\n\nconst AreaDontOpenNewWindow = {\n  run: function (test) {\n    // Links without a target attribute pass.\n    test.get('scope').forEach((scope) => {\n      let areas = DOM.scry('area', scope);\n      let passAreas = [];\n      let checkAreas = []\n      areas.forEach((link) => {\n        let target = DOM.getAttribute(link, 'target');\n        if (['_new', '_blank'].indexOf(target) > -1) {\n          checkAreas.push(link);\n        }\n        else {\n          passAreas.push(link);\n        }\n      });\n      passAreas.forEach(function (element) {\n        test.add(Case({\n          element: element,\n          status: 'passed'\n        }));\n      });\n      // Links with a target attribute pass if the link text indicates that the\n      // link will open a new window.\n      checkAreas.forEach(function (element) {\n        var $link = element;\n        var passes = false;\n        var i = 0;\n        var text = DOM.text($link) + ' ' + DOM.getAttribute($link, 'title');\n        var phrase = '';\n        // Test the link text against strings the indicate the link will open\n        // in a new window.\n        do {\n          phrase = NewWindowStringsComponent[i];\n          if (text.search(phrase) > -1) {\n            passes = true;\n          }\n          ++i;\n\n        } while (!passes && i < NewWindowStringsComponent.length);\n        // Build a Case.\n        if (passes) {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n        else {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'No \\\"area\\\" elements should open a new window without warning',\n      nl: '\\\"area\\\"-elementen mogen geen nieuw scherm openen zonder melding'\n    },\n    description: {\n      en: 'No <code>area</code> elements should open a new window without warning.',\n      nl: '<code>area</code>-elementen mogen geen nieuw scherm openen zonder dat de gebruiker hiervan een melding krijgt.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'imagemap',\n      'content'\n    ]\n  }\n};\nmodule.exports = AreaDontOpenNewWindow;\n"
  },
  {
    "path": "src/assessments/AreaHasAltValue.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AreaHasAltValue = {\n  run: function (test) {\n\n    var selector = 'area';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (element.hasAttribute('alt') && (element.getAttribute('alt') || '').length > 0) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"area\\\" elements must have an \\\"alt\\\" attribute',\n      nl: 'Alle \\\"area\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>area</code> elements within a <code>map</code> must have an \\\"alt\\\" attribute.',\n      nl: 'Alle <code>area</code>-elementen binnen een <code>map</code> moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'F65',\n            'G74',\n            'H24'\n          ]\n        },\n        '1.4.3': {\n          techniques: [\n            'G145'\n          ]\n        }\n      }\n    },\n    tags: [\n      'imagemap',\n      'content'\n    ]\n  }\n};\nmodule.exports = AreaHasAltValue;\n"
  },
  {
    "path": "src/assessments/AreaLinksToSoundFile.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar AreaLinksToSoundFile = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = [\n      'area[href$=\"wav\"]',\n      'area[href$=\"snd\"]',\n      'area[href$=\"mp3\"]',\n      'area[href$=\"iff\"]',\n      'area[href$=\"svx\"]',\n      'area[href$=\"sam\"]',\n      'area[href$=\"smp\"]',\n      'area[href$=\"vce\"]',\n      'area[href$=\"vox\"]',\n      'area[href$=\"pcm\"]',\n      'area[href$=\"aif\"]'\n    ].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"area\\\" elements which link to a sound file should also provide a link to a transcript',\n      nl: 'Alle \\\"area\\\"-elementen met een link naar een geluidsbestand moeten ook een link bevatten naar een transcriptie'\n    },\n    description: {\n      en: 'All <code>area</code> elements which link to a sound file should have a text transcript.',\n      nl: 'Alle \\\"area\\\"-elementen met een link naar een geluidsbestand moeten een transcriptie hebben in tekst.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74'\n          ]\n        }\n      }\n    },\n    tags: [\n      'imagemap',\n      'media',\n      'content'\n    ]\n  }\n};\nmodule.exports = AreaLinksToSoundFile;\n"
  },
  {
    "path": "src/assessments/AudioMayBePresent.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar AudioMayBePresent = {\n  run: function (test) {\n    var audioExtensions = ['mp3', 'm4p', 'ogg', 'oga', 'opus', 'wav', 'wma', 'wv'];\n\n    test.get('scope').forEach(function (scope) {\n      var $this = scope;\n      var hasCase = false; // Test if a case has been created\n\n      // Audio is definately an audio, and objects could be too.\n      DOM.scry('object, audio', $this).forEach(function (element) {\n        hasCase = true;\n        test.add(Case({\n          element: element,\n          status: 'cantTell'\n        }));\n      });\n\n      // Links refering to files with an audio extensions are good indicators too\n      DOM.scry('a[href]', $this).forEach(function (element) {\n        var $this = element;\n        var extension = DOM.getAttribute($this, 'href').split('.').pop();\n        if (audioExtensions.indexOf(extension) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // if no case was added, return inapplicable\n      if (!hasCase) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      }\n    });\n\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Audio or object uses a link that points to a file with a video extension',\n      nl: 'Audio of object met een link naar een bestand met een video extensie'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'audio'\n    ]\n  }\n};\nmodule.exports = AudioMayBePresent;\n"
  },
  {
    "path": "src/assessments/BasefontIsNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar BasefontIsNotUsed = {\n  run: function (test) {\n\n    var selector = 'basefont';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Basefont should not be used',\n      nl: 'Basefont moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>basefont</code> tag is deprecated and should not be used. Investigate using stylesheets instead.',\n      nl: 'The <code>basefont</code>-tag is afgekeurd en moet niet worden gebruikt. Gebruik in plaats hiervan stylesheets.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'document',\n      'deprecated'\n    ]\n  }\n};\nmodule.exports = BasefontIsNotUsed;\n"
  },
  {
    "path": "src/assessments/BlinkIsNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar BlinkIsNotUsed = {\n  run: function (test) {\n\n    var selector = 'blink';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"blink\\\" tag should not be used',\n      nl: 'De \\\"blink\\\"-tag moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>blink</code> tag should not be used. Ever.',\n      nl: 'Het is nooit toegestaan om de \\\"blink\\\"-tag te gebruiken.'\n    },\n    guidelines: {\n      wcag: {\n        '2.2.2': {\n          techniques: [\n            'F47'\n          ]\n        }\n      }\n    },\n    tags: [\n      'deprecated',\n      'content'\n    ]\n  }\n};\nmodule.exports = BlinkIsNotUsed;\n"
  },
  {
    "path": "src/assessments/BlockquoteNotUsedForIndentation.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar BlockquoteNotUsedForIndentation = {\n  run: function (test) {\n\n    var selector = 'blockquote';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n\n          if (element.hasAttribute('cite') && (element.getAttribute('cite') || '').length > 0) {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n          else {\n            test.add(Case({\n              element: element,\n              status: 'cantTell'\n            }));\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The \\\"blockquote\\\" tag should not be used just for indentation',\n      nl: 'De \\\"blockquote\\\"-tag mag niet gebruikt worden om in te springen'\n    },\n    description: {\n      en: 'Blockquote tags are for long-form quotes, and should not be used to indent paragraphs. Use CSS to indent the paragraph instead.',\n      nl: 'Blockquotes zijn bedoeld voor lange stukken geciteerde tekst, en niet om tekst te laten inspringen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H49'\n          ]\n        }\n      }\n    },\n    tags: [\n      'blockquote',\n      'content'\n    ]\n  }\n};\nmodule.exports = BlockquoteNotUsedForIndentation;\n"
  },
  {
    "path": "src/assessments/BlockquoteUseForQuotations.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar BlockquoteUseForQuotations = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var blockquote = DOM.parents(element)\n          .find((parent) => DOM.is(parent, 'blockquote'));\n        if (blockquote) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        if (DOM.text(element).substr(0, 1).search(/'|\"|«|“|「/) > -1 &&\n           DOM.text(element).substr(-1, 1).search(/'|\"|»|„|」/) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'If long quotes are in the document, use the \\\"blockquote\\\" element to mark them',\n      nl: 'Gebruik voor lange citaten in het document het \\\"blockquote\\\"-element'\n    },\n    description: {\n      en: 'If there is a paragraph or more of a quote, use the blockquote element to mark it as such.',\n      nl: 'Als er een hele alinea of meer alinea\\'s zijn van geciteerde tekst, gebruik dan blockquote om deze als zodanig te markeren.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H49'\n          ]\n        }\n      }\n    },\n    tags: [\n      'blockquote',\n      'content'\n    ]\n  }\n};\nmodule.exports = BlockquoteUseForQuotations;\n"
  },
  {
    "path": "src/assessments/BoldIsNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar BoldIsNotUsed = {\n  run: function (test) {\n\n    var selector = 'bold';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"b\\\" (bold) element is not used',\n      nl: 'Het \\\"b\\\"-element (bold) wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>b</code> (bold) element provides no emphasis for non-sighted readers. Use the <code>strong</code> tag instead.',\n      nl: 'Het <code>b</code>-element voorziet niet in nadruk voor blinde en slechtziende gebruikers. Gebruik de <code>strong</code>-tag instead.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'semantics',\n      'content'\n    ]\n  }\n};\nmodule.exports = BoldIsNotUsed;\n"
  },
  {
    "path": "src/assessments/ButtonDoesNotChangeContextOnFocus.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ButtonDoesNotChangeContextOnFocus = {\n  run: function (test, options) {\n    options = options || {\n      searchEvent: 'onfocus'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Buttons must not contain an \\\"onfocus\\\" attribute',\n      nl: 'Knoppen bevatten geen \\\"onfocus\\\"-attribuut'\n    },\n    description: {\n      en: 'Actions like \\\"onfocus\\\" can take control away from users who are trying to navigate the page. Using an \\\"onfocus\\\" attribute for things like buttons should be replaced with css.',\n      nl: 'Acties zoals \\\"onfocus\\\" kunnen de controle ontnemen van gebruikers die op een pagina proberen te navigeren. Het gebruik van een \\\"onfocus\\\"-attribuut voor zaken als knoppen moet worden vervangen door middel van css.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = ButtonDoesNotChangeContextOnFocus;\n"
  },
  {
    "path": "src/assessments/ButtonHasName.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ButtonHasName = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'button',\n      content: 'true',\n      empty: 'true',\n      attribute: 'title'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Button should contain text',\n      nl: 'Een knop moet tekst bevatten'\n    },\n    description: {\n      en: 'Buttons should contain a text value within the element, or have a value attribute.',\n      nl: 'Knoppen moeten een tekstwaarde binnen het element hebben, of een waarde-attribuut.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'content'\n    ]\n  }\n};\nmodule.exports = ButtonHasName;\n"
  },
  {
    "path": "src/assessments/CheckboxHasLabel.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar CheckboxHasLabel = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'input[type=\"checkbox\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All checkboxes must have a corresponding label',\n      nl: 'Alle keuzevakjes moeten een bijbehorend label hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"checkbox\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle  <code>input</code>-elementen met een \\\"keuzevakje\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: [\n        'c'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H44',\n            'F68'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H44',\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = CheckboxHasLabel;\n"
  },
  {
    "path": "src/assessments/ClosingTagsAreUsed.js",
    "content": "/**\n * Not yet implemented.\n */\nvar ClosingTagsAreUsed = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All tags that require closing tags have closing tags',\n      nl: 'Alle tags die een afsluitende tag behoeven, hebben een afsluitende tag'\n    },\n    description: {\n      en: 'When using tags such as p, ul, or li, there must be a closing tag.',\n      nl: 'Gebruik voor tags als p, ul, of li altijd een afsluitende tag, dus /p, /ul, /li.'\n    },\n    guidelines: {\n      wcag: {\n        '4.1.1': {\n          techniques: [\n            'H74'\n          ]\n        }\n      }\n    },\n    tags: [\n      'html'\n    ]\n  }\n};\nmodule.exports = ClosingTagsAreUsed;\n"
  },
  {
    "path": "src/assessments/ColorBackgroundGradientContrast.js",
    "content": "var Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar Rainbow = require('rainbowvis.js/rainbowvis.js');\n\nvar ColorBackgroundGradientContrast = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorBackgroundGradientContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorBackgroundGradientContrast (test, Case, options, element) {\n      // Check if there's a background gradient using DOM.\n      var failureFound, numberOfSamples;\n      var rainbow = new Rainbow();\n      var backgroundGradientColors = colors.getBackgroundGradient(element);\n\n      if (!backgroundGradientColors) {\n        return;\n      }\n\n      // Convert colors to hex notation.\n      for (var i = 0; i < backgroundGradientColors.length; i++) {\n        if (backgroundGradientColors[i].substr(0, 3) === 'rgb') {\n          backgroundGradientColors[i] = colors.colorToHex(backgroundGradientColors[i]);\n        }\n      }\n\n      // Create a rainbow.\n      rainbow.setSpectrumByArray(backgroundGradientColors);\n      // @todo, make the number of samples configurable.\n      numberOfSamples = backgroundGradientColors.length * options.gradientSampleMultiplier;\n\n      // Check each color.\n      failureFound = false;\n      for (i = 0; !failureFound && i < numberOfSamples; i++) {\n        var testResult = colors.testElmBackground(options.algorithm, element,\n              '#' + rainbow.colourAt(i));\n\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The background gradient makes the text unreadable');\n          failureFound = true;\n        }\n      }\n\n      // If no failure was found, the element passes for this case type.\n      if (!failureFound) {\n        buildCase(test, Case, element, 'passed', id, 'The background gradient does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n\n      var textNodes = document.evaluate(\n        'descendant::text()[normalize-space()]',\n        scope,\n        null,\n        window.XPathResult.ORDERED_NODE_ITERATOR_TYPE,\n        null\n      );\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and run testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorBackgroundGradientContrast(test, Case, options, element);\n      });\n\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: [\n            'G18'\n          ]\n        }\n      }\n    },\n    tags: [\n      'color'\n    ]\n  }\n};\nmodule.exports = ColorBackgroundGradientContrast;\n"
  },
  {
    "path": "src/assessments/ColorBackgroundImageContrast.js",
    "content": "var Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar ColorBackgroundImageContrast = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorBackgroundImageContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorBackgroundImageContrast (test, Case, options, element) {\n      // Check if there's a backgroundImage using DOM.\n      var backgroundImage = colors.getBackgroundImage(element);\n      if (!backgroundImage) {\n        return;\n      }\n\n      var img = document.createElement('img');\n      img.crossOrigin = 'Anonymous';\n\n      // Get average color of the background image. The image must first load\n      // before information about it is available to the DOM.\n      img.onload = function () {\n        var averageColorBackgroundImage = colors.getAverageRGB(img);\n        var testResult = colors.testElmBackground(options.algorithm, element,\n              averageColorBackgroundImage);\n\n        // Build a case.\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The element\\'s background image makes the text unreadable');\n\n        }\n        else {\n          buildCase(test, Case, element, 'passed', id, 'The element\\'s background image does not affect readability');\n        }\n      };\n\n      img.onerror = img.onabort = function () {\n        buildCase(test, Case, element, 'cantTell', id, 'The element\\'s background image could not be loaded (' + backgroundImage + ')');\n      };\n\n      // Load the image.\n      img.src = backgroundImage;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate(\n        'descendant::text()[normalize-space()]',\n        scope,\n        null,\n        window.XPathResult.ORDERED_NODE_ITERATOR_TYPE,\n        null\n      );\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorBackgroundImageContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: [\n            'G18'\n          ]\n        }\n      }\n    },\n    tags: [\n      'color'\n    ]\n  }\n};\nmodule.exports = ColorBackgroundImageContrast;\n"
  },
  {
    "path": "src/assessments/ColorElementBehindBackgroundGradientContrast.js",
    "content": "var Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nconst DOM = require('DOM');\nvar Rainbow = require('rainbowvis.js/rainbowvis.js');\n\nvar ColorElementBehindBackgroundGradientContrast = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindBackgroundGradientContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorElementBehindBackgroundGradientContrast (test, Case, options, element) {\n      // Check if there's a background gradient using element behind current element.\n      var behindGradientColors;\n      var failureFound;\n      var rainbow = new Rainbow();\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        behindGradientColors = colors.getBehindElementBackgroundGradient(element);\n      }\n\n      if (!behindGradientColors) {\n        return;\n      }\n\n      // Convert colors to hex notation.\n      for (var i = 0; i < behindGradientColors.length; i++) {\n        if (behindGradientColors[i].substr(0, 3) === 'rgb') {\n          behindGradientColors[i] = colors.colorToHex(behindGradientColors[i]);\n        }\n      }\n\n      // Create a rainbow.\n      rainbow.setSpectrumByArray(behindGradientColors);\n      var numberOfSamples = behindGradientColors.length * options.gradientSampleMultiplier;\n\n      // Check each color.\n      failureFound = false;\n      for (i = 0; !failureFound && i < numberOfSamples; i++) {\n        failureFound = !colors.testElmBackground(options.algorithm, element,\n              '#' + rainbow.colourAt(i));\n      }\n\n      // If no failure was found, the element passes for this case type.\n      if (failureFound) {\n        buildCase(test, Case, element, 'failed', id, 'The background gradient of the element behind this element makes the text unreadable');\n      }\n      else {\n        buildCase(test, Case, element, 'passed', id, 'The background gradient of the element behind this element does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate(\n        'descendant::text()[normalize-space()]',\n        scope,\n        null,\n        window.XPathResult.ORDERED_NODE_ITERATOR_TYPE,\n        null\n      );\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindBackgroundGradientContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: [\n            'G18'\n          ]\n        }\n      }\n    },\n    tags: [\n      'color'\n    ]\n  }\n};\nmodule.exports = ColorElementBehindBackgroundGradientContrast;\n"
  },
  {
    "path": "src/assessments/ColorElementBehindBackgroundImageContrast.js",
    "content": "var Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nconst DOM = require('DOM');\nvar ColorElementBehindBackgroundImageContrast = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindBackgroundImageContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorElementBehindBackgroundImageContrast (test, Case, options, element) {\n      // Check if there's a backgroundImage using element behind current element.\n      var behindBackgroundImage;\n\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        behindBackgroundImage = colors.getBehindElementBackgroundImage(element);\n      }\n\n      if (!behindBackgroundImage) {\n        return;\n      }\n\n      var img = document.createElement('img');\n      img.crossOrigin = 'Anonymous';\n      // The image must first load before information about it is available to\n      // the DOM.\n      img.onload = function () {\n\n        // Get average color of the background image.\n        var averageColorBehindBackgroundImage = colors.getAverageRGB(img);\n        var testResult = colors.testElmBackground(options.algorithm, element,\n              averageColorBehindBackgroundImage);\n        if (!testResult) {\n          buildCase(test, Case, element, 'failed', id, 'The background image of the element behind this element makes the text unreadable');\n\n        }\n        else {\n          buildCase(test, Case, element, 'passed', id, 'The background image of the element behind this element does not affect readability');\n        }\n      };\n      img.onerror = img.onabort = function () {\n        buildCase(test, Case, element, 'cantTell', id, 'The background image of the element behind this element could not be loaded (' + behindBackgroundImage + ')');\n      };\n      // Load the image.\n      img.src = behindBackgroundImage;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate(\n        'descendant::text()[normalize-space()]',\n        scope,\n        null,\n        window.XPathResult.ORDERED_NODE_ITERATOR_TYPE,\n        null\n      );\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindBackgroundImageContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: [\n            'G18'\n          ]\n        }\n      }\n    },\n    tags: [\n      'color'\n    ]\n  }\n};\nmodule.exports = ColorElementBehindBackgroundImageContrast;\n"
  },
  {
    "path": "src/assessments/ColorElementBehindContrast.js",
    "content": "var Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nconst DOM = require('DOM');\nvar ColorElementBehindContrast = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorElementBehindContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    function colorElementBehindContrast (test, Case, options, element) {\n      // Check text and background using element behind current element.\n      var backgroundColorBehind;\n      // The option element is problematic.\n      if (!DOM.is(element, 'option')) {\n        backgroundColorBehind = colors.getBehindElementBackgroundColor(element);\n      }\n      if (!backgroundColorBehind) {\n        return;\n      }\n\n      var testResult = colors.testElmBackground(options.algorithm, element,\n            backgroundColorBehind);\n\n      // Build a case.\n      if (!testResult) {\n        buildCase(test, Case, element, 'failed', id, 'The element behind this element makes the text unreadable');\n      }\n      else {\n        buildCase(test, Case, element, 'passed', id, 'The element behind this element does not affect readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate(\n        'descendant::text()[normalize-space()]',\n        scope,\n        null,\n        window.XPathResult.ORDERED_NODE_ITERATOR_TYPE,\n        null\n      );\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorElementBehindContrast(test, Case, options, element);\n      });\n\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: [\n            'G18'\n          ]\n        }\n      }\n    },\n    tags: [\n      'color'\n    ]\n  }\n};\nmodule.exports = ColorElementBehindContrast;\n"
  },
  {
    "path": "src/assessments/ColorFontContrast.js",
    "content": "var Case = require('Case');\nvar ColorComponent = require('ColorComponent');\nvar ColorFontContrast = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var colors = ColorComponent.colors;\n    var buildCase = ColorComponent.buildCase;\n    var id = 'colorFontContrast';\n    // Hard-coding this for now. Requires a way to pass options from the test\n    // definitions down to the test functions.\n    options.algorithm = 'wcag';\n    options.gradientSampleMultiplier = 3;\n\n    /**\n     *\n     */\n    function colorFontContrast (test, Case, options, element) {\n      // Check text and background color using DOM.\n      // Build a case.\n      if (!colors.testElmContrast(options.algorithm, element)) {\n        buildCase(test, Case, element, 'failed', id, 'The font contrast of the text impairs readability');\n      }\n      else {\n        buildCase(test, Case, element, 'passed', id, 'The font contrast of the text is sufficient for readability');\n      }\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var textNodes = document.evaluate(\n        'descendant::text()[normalize-space()]',\n        scope,\n        null,\n        window.XPathResult.ORDERED_NODE_ITERATOR_TYPE,\n        null\n      );\n      var nodes = [];\n      var textNode = textNodes.iterateNext();\n\n      // Loop has to be separated. If we try to iterate and rund testCandidates\n      // the xpath thing will crash because document is being modified.\n      while (textNode) {\n        if (ColorComponent.textShouldBeTested(textNode)) {\n          nodes.push(textNode.parentNode);\n        }\n        textNode = textNodes.iterateNext();\n      }\n\n      if (nodes.length === 0) {\n        buildCase(test, Case, null, 'inapplicable', '', 'There is no text to evaluate');\n      }\n\n      nodes.forEach(function (element) {\n        colorFontContrast(test, Case, options, element);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All elements should have appropriate color contrast',\n      nl: 'Alle elementen moeten een toepasselijk kleurcontract hebben'\n    },\n    description: {\n      en: 'For users who have color blindness, all text or other elements should have a color contrast of 5:1.',\n      nl: 'Voor gebruikers met kleurenblindheid moeten alle tekst- en andere elementen een kleurcontrast hebben van 5:1.'\n    },\n    guidelines: {\n      wcag: {\n        '1.4.3': {\n          techniques: [\n            'G18'\n          ]\n        }\n      }\n    },\n    tags: [\n      'color'\n    ]\n  }\n};\nmodule.exports = ColorFontContrast;\n"
  },
  {
    "path": "src/assessments/CssDocumentMakesSenseStyleTurnedOff.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n *\n * This test did not test anything, so now it just returns untested.\n */\nvar Case = require('Case');\n\nvar CssDocumentMakesSenseStyleTurnedOff = {\n  run: function (test) {\n    test.get('scope').forEach(function () {\n      test.add(Case({\n        element: undefined,\n        status: 'untested'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The document must be readable with styles turned off',\n      nl: 'Het document moet leesbaar zijn met stijlen uit'\n    },\n    description: {\n      en: 'With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.',\n      nl: 'Als alle stijlen voor een pagina zijn uitgezet, moet de content van de pagina nog steeds betekenisvol zijn. Zet stijlen uit in de browser en controleer of de content op de pagina nog steeds leesbaar en duidelijk is.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'G140'\n          ]\n        },\n        '1.4.5': {\n          techniques: [\n            'G140'\n          ]\n        },\n        '1.4.9': {\n          techniques: [\n            'G140'\n          ]\n        }\n      }\n    },\n    tags: [\n      'color'\n    ]\n  }\n};\nmodule.exports = CssDocumentMakesSenseStyleTurnedOff;\n"
  },
  {
    "path": "src/assessments/DefinitionListsAreUsed.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar DefinitionListsAreUsed = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('dl', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        _case.set({\n          status: 'inapplicable'\n        });\n      });\n    });\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p, li', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var $item = element;\n        DOM.scry('span, strong, em, b, i', element).forEach(function (element) {\n          if (DOM.text(element).length < 50 && DOM.text($item).search(DOM.text(element)) === 0) {\n            if (DOM.is(element, 'span')) {\n              if (DOM.getComputedStyle(element, 'font-weight') === DOM.getComputedStyle($item, 'font-weight') &&\n                  DOM.getComputedStyle(element, 'font-style') === DOM.getComputedStyle($item, 'font-style')) {\n                _case.set({\n                  status: 'passed'\n                });\n                return;\n              }\n            }\n            _case.set({\n              status: 'failed'\n            });\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use a definition list for defining terms',\n      nl: 'Gebruik een definition list voor definities'\n    },\n    description: {\n      en: 'When providing a list of terms or definitions, use a definition list.',\n      nl: 'Wanneer er gebruik wordt gemaakt van een lijst termen of definities, gebruik hiervoor dan een definition list.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H48'\n          ]\n        }\n      }\n    },\n    tags: [\n      'structure'\n    ]\n  }\n};\nmodule.exports = DefinitionListsAreUsed;\n"
  },
  {
    "path": "src/assessments/DoNotUseGraphicalSymbolToConveyInformation.js",
    "content": "var TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\n\nvar DoNotUseGraphicalSymbolToConveyInformation = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      // Passes and fails.\n      DOM.scry(TextSelectorComponent, scope)\n        .filter((element) =>\n          !DOM.is(element, 'abbr') && !DOM.is(element, 'acronym')\n        )\n        .forEach(function (element) {\n          var whiteList = '✓';\n          var blackList = '?xo[]()+-!*xX';\n\n          var text = DOM.text(element);\n\n          // @todo add support for other languages.\n          // Remove all alphanumeric characters.\n          var textLeft = text.replace(/[\\W\\s]+/g, '');\n          // If we have an empty string something is wrong.\n          if (textLeft.length === 0) {\n            // Unless if it's white listed.\n            if (whiteList.indexOf(text) === -1) {\n              test.add(Case({\n                element: element,\n                status: 'failed'\n              }));\n            }\n          }\n          // Check regularly used single character symbols.\n          else if (text.length === 1 && blackList.indexOf(text) >= 0) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n          else {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n        });\n      // Not applicables.\n      DOM.scry(TextSelectorComponent, scope)\n        .filter('abbr, acronym')\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'inapplicable'\n          }));\n        });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Using a graphical symbol alone to convey information',\n      nl: 'Gebruik van alleen een grafisch symbool om informatie over te brengen'\n    },\n    description: {\n      en: 'The objective of this technique is to show how using a graphical symbol to convey information can make content difficult to comprehend. A graphical symbol may be an image, an image of text or a pictorial or decorative character symbol (glyph) which imparts information nonverbally. Examples of graphical symbols include an image of a red circle with a line through it, a smiley face, or a glyph which represents a check mark, arrow, or other symbol but is not the character with that meaning. Assistive technology users may have difficulty determining the meaning of the graphical symbol. If a graphical symbol is used to convey information, provide an alternative using features of the technology or use a different mechanism that can be marked with an alternative to represent the graphical symbol. For example, an image with a text alternative can be used instead of the glyph.',\n      nl: 'Het doel van deze techniek is te laten zien dat content moeilijker begrepen kan worden wanneer een grafisch symbool wordt gebruikt om informatie over te brengen. Een grafisch symbool kan een afbeelding, een afbeelding van tekst of een pictogram of decoratief teken zijn (glyph) dat non-verbaal informatie overbrengt. Voorbeelden hiervan zijn een rode cirkel met een lijn erdoorheen, een smiley of een vinkje, pijl of ander symbool dat niet noodzakelijkerwijs een duidelijke betekenis heeft. Gebruikers van hulpprogramma\\'s hebben vaak moeite om de bedoeling van een grafisch symbool te duiden. Als een grafisch symbool gebruikt wordt om informatie over te brengen, biedt dan ook een (tekstueel) alternatief.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.3': {\n          techniques: [\n            'F26'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = DoNotUseGraphicalSymbolToConveyInformation;\n"
  },
  {
    "path": "src/assessments/DoctypeProvided.js",
    "content": "var Case = require('Case');\nvar DoctypeProvided = {\n  run: function (test) {\n    test.get('scope').forEach((doc) => {\n      if (!document.doctype) {\n        test.add(Case({\n          element: doc,\n          status: 'failed'\n        }));\n      }\n      else {\n        test.add(Case({\n          element: doc,\n          status: 'passed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should contain a valid \\\"doctype\\\" declaration',\n      nl: 'Het document moet een geldige \\\"doctype\\\"-verklaring hebben'\n    },\n    description: {\n      en: 'Each document must contain a valid doctype declaration.',\n      nl: 'Ieder document moet een geldige doctype-verklaring hebben.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'doctype'\n    ]\n  }\n};\nmodule.exports = DoctypeProvided;\n"
  },
  {
    "path": "src/assessments/DocumentAbbrIsUsed.js",
    "content": "var AcronymComponent = require('AcronymComponent');\nvar DocumentAbbrIsUsed = {\n  run: function (test) {\n    AcronymComponent(test, 'abbr');\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Abbreviations must be marked with an \\\"abbr\\\" element',\n      nl: 'Afkortingen moeten worden gemarkeerd met een \\\"abbr\\\"-element'\n    },\n    description: {\n      en: 'Abbreviations should be marked with an <code>abbr</code> element, at least once on the page for each abbreviation.',\n      nl: 'Afkortingen moeten worden gemarkeerd door middel van het <code>abbr</code>-element. Doe dit ten minste een keer per pagina voor elke afkorting.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.4': {\n          techniques: [\n            'H28'\n          ]\n        }\n      }\n    },\n    tags: [\n      'acronym',\n      'content'\n    ]\n  }\n};\nmodule.exports = DocumentAbbrIsUsed;\n"
  },
  {
    "path": "src/assessments/DocumentAcronymsHaveElement.js",
    "content": "var AcronymComponent = require('AcronymComponent');\nvar DocumentAcronymsHaveElement = {\n  run: function (test) {\n    AcronymComponent(test, 'acronym');\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Acronyms must be marked with an \\\"acronym\\\" element',\n      nl: 'Acroniemen moeten worden gemarkeerd met een \\\"acronym\\\"-element'\n    },\n    description: {\n      en: 'Acronyms should be marked with an <code>acronym</code> element, at least once on the page for each acronym.',\n      nl: 'Acroniemen moeten worden gemarkeerd door middel van het <code>acronym</code>-element. Doe dit ten minste een keer per pagina voor elke acroniem.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.4': {\n          techniques: [\n            'H28'\n          ]\n        }\n      }\n    },\n    tags: [\n      'acronym',\n      'content'\n    ]\n  }\n};\nmodule.exports = DocumentAcronymsHaveElement;\n"
  },
  {
    "path": "src/assessments/DocumentAutoRedirectNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar DocumentAutoRedirectNotUsed = {\n  run: function (test) {\n\n    var selector = 'meta[http-equiv=refresh]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Auto-redirect with \\\"meta\\\" elements must not be used',\n      nl: 'Auto-redirect met \\\"meta\\\"-elementen moeten niet worden gebruikt'\n    },\n    description: {\n      en: 'Because different users have different speeds and abilities when it comes to parsing the content of a page, a \\\"meta-refresh\\\" method to redirect users can prevent users from fully understanding the document before being redirected.',\n      nl: 'Omdat verschillende gebruikers verschillende snelheden en vaardigheden hebben met het scannen van content op een pagina, kan een \\\"meta-refresh\\\"-methode om gebruikers door te sturen hen verhinderen het document volledig te begrijpen voor ze worden doorgestuurd.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'document'\n    ]\n  }\n};\nmodule.exports = DocumentAutoRedirectNotUsed;\n"
  },
  {
    "path": "src/assessments/DocumentContentReadableWithoutStylesheets.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n *\n * This test did not test anything, so now it just returns untested.\n */\nvar Case = require('Case');\n\nvar DocumentContentReadableWithoutStylesheets = {\n  run: function (test) {\n    test.get('scope').forEach(function () {\n      test.add(Case({\n        element: undefined,\n        status: 'untested'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Content should be readable without style sheets',\n      nl: 'Content moet zonder stylesheets leesbaar zijn'\n    },\n    description: {\n      en: 'With all the styles for a page turned off, the content of the page should still make sense. Try to turn styles off in the browser and see if the page content is readable and clear.',\n      nl: 'Ook als alle stijlen voor een pagina zijn uitgezet, moet de content van de pagina nog steeds betekenisvol zijn. Zet de stylesheets uit in de browser en controleer of de content nog steeds leesbaar en duidelijk is.'\n    },\n    guidelines: {\n      508: [\n        'd'\n      ],\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'G140'\n          ]\n        },\n        '1.4.5': {\n          techniques: [\n            'G140'\n          ]\n        },\n        '1.4.9': {\n          techniques: [\n            'G140'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document',\n      'color'\n    ]\n  }\n};\nmodule.exports = DocumentContentReadableWithoutStylesheets;\n"
  },
  {
    "path": "src/assessments/DocumentHasTitleElement.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar DocumentHasTitleElement = {\n  run: function (test) {\n\n    var selector = 'head title';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (candidates.length === 1) {\n        test.add(Case({\n          element: candidates[0],\n          status: 'passed'\n        }));\n      }\n      else if (candidates.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: 'failed'\n        }));\n      }\n      else if (candidates.length > 1) {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should have a title element',\n      nl: 'Het document moet een titelelement hebben'\n    },\n    description: {\n      en: 'The document should have a title element.',\n      nl: 'Het document moet een titelelement hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: [\n            'H25'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document',\n      'head'\n    ]\n  }\n};\nmodule.exports = DocumentHasTitleElement;\n"
  },
  {
    "path": "src/assessments/DocumentIDsMustBeUnique.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar DocumentIDsMustBeUnique = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var ids = {};\n      DOM.scry('[id]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (typeof ids[DOM.getAttribute(element, 'id')] === 'undefined' && Object.keys(ids).length === 0) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          ids[DOM.getAttribute(element, 'id')] = DOM.getAttribute(element, 'id');\n        }\n        else if (typeof ids[DOM.getAttribute(element, 'id')] === 'undefined') {\n          _case.set({\n            status: 'passed'\n          });\n          ids[DOM.getAttribute(element, 'id')] = DOM.getAttribute(element, 'id');\n        }\n        else {\n          _case.set({\n            status: 'failed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All element \\\"id\\\" attributes must be unique',\n      nl: 'Alle element \\\"id\\\"-attributen moeten uniek zijn'\n    },\n    description: {\n      en: 'Element \\\"id\\\" attributes must be unique.',\n      nl: 'Element \\\"id\\\"-attributen moeten uniek zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '4.1.1': {\n          techniques: [\n            'F77',\n            'H93'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document',\n      'semantics'\n    ]\n  }\n};\nmodule.exports = DocumentIDsMustBeUnique;\n"
  },
  {
    "path": "src/assessments/DocumentIsWrittenClearly.js",
    "content": "var TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar TextStatisticsComponent = require('TextStatisticsComponent');\nvar IsUnreadable = require('IsUnreadable');\nvar DocumentIsWrittenClearly = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          var text = TextStatisticsComponent.cleanText(DOM.text(element));\n          var _case = Case({\n            element: element\n          });\n          test.add(_case);\n          if (IsUnreadable(text)) {\n            _case.set({\n              status: 'inapplicable'\n            });\n            return;\n          }\n          if (Math.round((206.835 - (1.015 * TextStatisticsComponent.averageWordsPerSentence(text)) - (84.6 * TextStatisticsComponent.averageSyllablesPerWord(text)))) < 60) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n          else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The document should be written to the target audience and read clearly',\n      nl: 'Het document moet geschreven zijn op het niveau van de doelgroep'\n    },\n    description: {\n      en: 'If a document is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content.',\n      nl: 'Als de inhoud van een document moeilijker is dan het vastgestelde taalniveau, moet een samenvatting of andere begeleiding worden toegevoegd om de gebruiker te helpen met de content.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.5': {\n          techniques: [\n            'G86'\n          ]\n        }\n      }\n    },\n    tags: [\n      'language',\n      'content'\n    ]\n  }\n};\nmodule.exports = DocumentIsWrittenClearly;\n"
  },
  {
    "path": "src/assessments/DocumentLangIsISO639Standard.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar LanguageCodesStringsComponent = require('LanguageCodesStringsComponent');\nvar DocumentLangIsISO639Standard = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var element = DOM.is(scope, 'html') ?\n        scope :\n        DOM.scry('html')[0];\n\n      var _case = Case({\n        element: element\n      });\n\n      var langAttr = DOM.getAttribute(element, 'lang');\n      var matchedLang = false; // Check to see if a languagecode was matched\n\n      test.add(_case);\n      if (!DOM.is(element, 'html') || !langAttr) {\n        _case.set({\n          status: 'inapplicable'\n        });\n      }\n      else {\n        // Loop over all language codes, checking if the current lang attribute starts\n        // with a value that's in the languageCodes array\n        LanguageCodesStringsComponent.forEach(function (currentLangCode) {\n          if (!matchedLang && langAttr.indexOf(currentLangCode) === 0) {\n            matchedLang = true;\n          }\n        });\n\n        if (!matchedLang) {\n          _case.set({status: 'failed'});\n\n        }\n        else if (langAttr.match(/^[a-z]{2}(-[A-Z]{2})?$/) === null) {\n          _case.set({status: 'failed'});\n\n        }\n        else {\n          _case.set({status: 'passed'});\n        }\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document\\'s language attribute should be a standard code',\n      nl: 'Het language-attribuut van het document moet een standaard code zijn'\n    },\n    description: {\n      en: 'The document should have a default langauge, and that language should use the valid 2 or 3 letter language code according to ISO specification 639.',\n      nl: 'Het document moet een standaardtaal hebben en die taal moet de geldige 2- of 3-letterige taalcode hebben volgens de ISO-specificatie 639.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.1': {\n          techniques: [\n            'H57'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document',\n      'language'\n    ]\n  }\n};\nmodule.exports = DocumentLangIsISO639Standard;\n"
  },
  {
    "path": "src/assessments/DocumentLangNotIdentified.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nvar DocumentLangNotIdentified = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var lang = document.documentElement.lang;\n      if (lang && lang.length > 1) {\n        test.add(Case({\n          element: scope,\n          status: 'passed'\n        }));\n      }\n      else {\n        test.add(Case({\n          element: scope,\n          status: 'failed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document must have a \\\"lang\\\" attribute',\n      nl: 'Het document moet een \\\"lang\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'The document should have a default langauge, by setting the \\\"lang\\\" attribute in the <code>html</code> element.',\n      nl: 'Het document moet een standaardtaal hebben, vastgelegd in het \\\"lang\\\"-attribuut in het <code>html</code>-element.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'document',\n      'language'\n    ]\n  }\n};\nmodule.exports = DocumentLangNotIdentified;\n"
  },
  {
    "path": "src/assessments/DocumentMetaNotUsedWithTimeout.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar DocumentMetaNotUsedWithTimeout = {\n  run: function (test) {\n\n    var selector = 'meta';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('http-equiv') && element.getAttribute('http-equiv') === 'refresh') {\n            if (element.hasAttribute('content') && (element.getAttribute('content') || '').length > 0) {\n              status = 'failed';\n            }\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Meta elements must not be used to refresh the content of a page',\n      nl: 'Meta-elementen mogen niet worden gebruikt om content op een pagina te verversen'\n    },\n    description: {\n      en: 'Because different users have different speeds and abilities when it comes to parsing the content of a page, a \\\"meta-refresh\\\" method to reload the content of the page can prevent users from having full access to the content. Try to use a \\\"refresh this\\\" link instead.',\n      nl: 'Omdat verschillende gebruikers verschillende snelheden en vaardigheden hebben met het scannen van content op een pagina, kan een \\\"meta-refresh\\\"-methode om de pagina te herladen gebruikers hinderen in toegang tot de content. Gebruik een \\\"refresh this\\\" link hiervoor.'\n    },\n    guidelines: {\n      wcag: {\n        '2.2.1': {\n          techniques: [\n            'F40',\n            'F41'\n          ]\n        },\n        '2.2.4': {\n          techniques: [\n            'F40',\n            'F41'\n          ]\n        },\n        '3.2.5': {\n          techniques: [\n            'F41'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document'\n    ]\n  }\n};\nmodule.exports = DocumentMetaNotUsedWithTimeout;\n"
  },
  {
    "path": "src/assessments/DocumentReadingDirection.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar DocumentReadingDirection = {\n  run: function (test) {\n\n    var selector = [\n      '[lang=\"he\"]',\n      '[lang=\"ar\"]'\n    ].join(', ');\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          if (element.hasAttribute('dir') && (element.getAttribute('dir') || '') === 'rtl') {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n          else {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Reading direction of text is correctly marked',\n      nl: 'De leesrichting van de tekst staat juist aangegeven'\n    },\n    description: {\n      en: 'Where required, the reading direction of the document (for language that read in different directions), or portions of the text, must be declared.',\n      nl: 'Voor talen die een andere leesrichting hebben, moet de leesrichting van (een deel van) de tekst in een document worden opgenomen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'H34'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document',\n      'language'\n    ]\n  }\n};\nmodule.exports = DocumentReadingDirection;\n"
  },
  {
    "path": "src/assessments/DocumentStrictDocType.js",
    "content": "var Case = require('Case');\nvar DocumentStrictDocType = {\n  run: function (test) {\n    if (typeof document.doctype === 'undefined' ||\n      !document.doctype ||\n      document.doctype.systemId.search('strict') === -1) {\n      test.add(Case({\n        element: document,\n        status: 'failed'\n      }));\n    }\n    else {\n      test.add(Case({\n        element: document,\n        status: 'passed'\n      }));\n    }\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The page uses a strict doctype',\n      nl: 'De pagina gebruikt een strikt doctype'\n    },\n    description: {\n      en: 'The doctype of the page or document should be either an HTML or XHTML strict doctype.',\n      nl: 'Het doctype van een pagina of document moet een HTML of XHTML strikt doctype zijn.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'document',\n      'doctype'\n    ]\n  }\n};\nmodule.exports = DocumentStrictDocType;\n"
  },
  {
    "path": "src/assessments/DocumentTitleDescribesDocument.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar DocumentTitleDescribesDocument = {\n  run: function (test) {\n\n    var selector = 'head title';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      var status = (candidates.length === 1) ? 'passed' : 'failed';\n\n      if (candidates.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: status\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The title describes the document',\n      nl: 'De titel beschrijft het document'\n    },\n    description: {\n      en: 'The document title should actually describe the page. Often, screen readers use the title to navigate from one window to another.',\n      nl: 'De documenttitel moet een beschrijving zijn van de pagina. Schermlezen gebruiken de titels van pagina\\'s om van het ene naar het andere scherm te navigeren.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: [\n            'F25',\n            'G88'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document',\n      'head'\n    ]\n  }\n};\nmodule.exports = DocumentTitleDescribesDocument;\n"
  },
  {
    "path": "src/assessments/DocumentTitleIsNotPlaceholder.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar DocumentTitleIsNotPlaceholder = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'head > title',\n      content: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document title should not be placeholder text',\n      nl: 'De documenttitle moet geen placeholder tekst zijn'\n    },\n    description: {\n      en: 'The document title should not be wasted placeholder text which does not describe the page.',\n      nl: 'De documenttitel moet geen placeholder tekst zijn die geen goede beschrijving van de pagina is.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: [\n            'F25',\n            'G88'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document',\n      'head'\n    ]\n  }\n};\nmodule.exports = DocumentTitleIsNotPlaceholder;\n"
  },
  {
    "path": "src/assessments/DocumentTitleIsShort.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar DocumentTitleIsShort = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      var title = DOM.scry('head title', scope)[0];\n      test.add(Case({\n        element: title,\n        status: DOM.text(title).length > 150 ? 'failed' : 'passed'\n      }));\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The document title should be short',\n      nl: 'De documenttitel moet kort zijn'\n    },\n    description: {\n      en: 'The document title should be short and succinct. This test fails at 150 characters, but authors should consider this to be a suggestion.',\n      nl: 'De documenttitel moet kort en beknopt zijn. Probeer bij een titel langer dan 150 tekense de titel in te korten waar mogelijk.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'document',\n      'head'\n    ]\n  }\n};\nmodule.exports = DocumentTitleIsShort;\n"
  },
  {
    "path": "src/assessments/DocumentTitleNotEmpty.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar DocumentTitleNotEmpty = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'head > title',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document should not have an empty title',\n      nl: 'Het document mag geen lege titel hebben'\n    },\n    description: {\n      en: 'The document should have a title element that is not white space.',\n      nl: 'Het document moet een titelelement hebben dat is ingevuld.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.2': {\n          techniques: [\n            'F25',\n            'H25'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document',\n      'head'\n    ]\n  }\n};\nmodule.exports = DocumentTitleNotEmpty;\n"
  },
  {
    "path": "src/assessments/DocumentVisualListsAreMarkedUp.js",
    "content": "var TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar DocumentVisualListsAreMarkedUp = {\n  run: function (test) {\n\n    var itemStarters = [\n      '♦', '›', '»', '‣', '▶', '◦', '✓', '◽', '•', '—', '◾', // single characters\n      '-\\\\D', // dash, except for negative numbers\n      '\\\\\\\\', // Just an escaped slash\n      '\\\\*(?!\\\\*)', // *, but not ** (which could be a foot note)\n      '\\\\.\\\\s', 'x\\\\s', // characters that should be followed by a space\n      '&bull;', '&#8226;', // HTML entities\n      '[0-9]+\\\\.', '\\\\(?[0-9]+\\\\)', // Numbers: 1., 13., 13), (14)\n      '[\\\\u25A0-\\\\u25FF]', // Unicode characters that look like bullets\n      '[IVX]{1,5}\\\\.\\\\s' // Roman numerals up to (at least) 27, followed by \". \" E.g. II. IV.\n    ];\n\n    var symbols = new RegExp(\n      '(^|<br[^>]*>)' + // Match the String start or a <br> element\n      '[\\\\s]*' + // Optionally followed by white space characters\n      '(' + itemStarters.join('|') + ')', // Followed by a character that could indicate a list\n    'gi'); // global (for counting), case insensitive (capitalisation in elements / entities)\n    test.get('scope').forEach((scope) => {\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          var _case = Case({\n            element: element\n          });\n          test.add(_case);\n          let text = element.innerHTML\n            // Get rid of runs of space.\n            .replace(/[ \\t\\n\\r][ \\t\\n\\r]*/g, ' ')\n            .trim();\n          var matches = text.match(symbols);\n          _case.set({\n            status: (matches && matches.length > 2) ? 'failed' : 'passed'\n          });\n        });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Visual lists of items are marked using ordered or unordered lists',\n      nl: 'Lijsten moeten gemarkeerd worden als ordered of unordered lists'\n    },\n    description: {\n      en: 'Use the ordered (<code>ol</code>) or unordered (<code>ul</code>) elements for lists of items, instead of just using new lines which start with numbers or characters to create a visual list.',\n      nl: 'Gebruik ordered (<code>ol</code>) of unordered (<code>ul</code>) elementen voor lijsten, in plaats van een nieuwe regel per item aan te maken die je laat beginnen met een nummer of teken om een visuele lijst te maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H28',\n            'H48',\n            'T2'\n          ]\n        }\n      }\n    },\n    tags: [\n      'list',\n      'semantics',\n      'content'\n    ]\n  }\n};\nmodule.exports = DocumentVisualListsAreMarkedUp;\n"
  },
  {
    "path": "src/assessments/ElementAttributesAreValid.js",
    "content": "/**\n * Not yet implemented.\n */\nvar ElementAttributesAreValid = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Attributes should have spaces between them and be wrapped in quotes',\n      nl: 'Attributen moeten gescheiden zijn door spaties en ze moeten tussen aanhalingstekens'\n    },\n    description: {\n      en: 'Attributes should have spaces between them and be wrapped in quotes.',\n      nl: 'Tussen attributen moeten spaties staan en ze moeten tussen aanhalingstekens staan.'\n    },\n    guidelines: {\n      '4.1.1': {\n        techniques: [\n          'F70'\n        ]\n      }\n    }\n  }\n};\nmodule.exports = ElementAttributesAreValid;\n"
  },
  {
    "path": "src/assessments/ElementsDoNotHaveDuplicateAttributes.js",
    "content": "/**\n * Not yet implemented.\n */\nvar ElementsDoNotHaveDuplicateAttributes = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Elements should not have duplicate attributes',\n      nl: 'Elementen mogen geen dubbele attributen hebben'\n    },\n    description: {\n      en: 'Elements should only have one type of any attribute. For example, there should not be two \\'class\\' attributes.',\n      nl: 'Elementen mogen maar een type attribuut hebben. Er mogen bijvoorbeeld niet twee \\'class\\'-attributen zijn.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'content'\n    ]\n  }\n};\nmodule.exports = ElementsDoNotHaveDuplicateAttributes;\n"
  },
  {
    "path": "src/assessments/EmbedHasAssociatedNoEmbed.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar EmbedHasAssociatedNoEmbed = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('embed', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var noembeds = DOM.scry('noembed', element);\n        var next = DOM.next(element);\n        var hasSiblingNoembed = next && DOM.is(next, 'noembed');\n        _case.set({\n          status: (noembeds.length || hasSiblingNoembed) ? 'passed' : 'failed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"embed\\\" elements have an associated \\\"noembed\\\" element',\n      nl: 'Alle \\\"embed\\\" elementen moeten een bijbehorend \\\"noembed\\\"-element hebben'\n    },\n    description: {\n      en: 'Because some users cannot use the <code>embed</code> element, provide alternative content in a <code>noembed</code> element.',\n      nl: 'Sommige gebruikers kunnen het <code>embed</code>-element niet gebruiken. Biedt hiervoor alternatieve content aan in een <code>noembed</code>-element.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'object',\n      'embed',\n      'content'\n    ]\n  }\n};\nmodule.exports = EmbedHasAssociatedNoEmbed;\n"
  },
  {
    "path": "src/assessments/EmbedMustHaveAltAttribute.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar EmbedMustHaveAltAttribute = {\n  run: function (test) {\n\n    var selector = 'embed';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var alt = element.getAttribute('alt');\n          if (alt && typeof alt === 'string' && alt.length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: '\\\"Embed\\\" elements must have an \\\"alt\\\" attribute',\n      nl: '\\\"Embed\\\"-elementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>embed</code> elements must have an \\\"alt\\\" attribute.',\n      nl: 'Alle <code>embed</code>-elementen moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'object',\n      'embed',\n      'content'\n    ]\n  }\n};\nmodule.exports = EmbedMustHaveAltAttribute;\n"
  },
  {
    "path": "src/assessments/FieldsetHasLabel.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FieldsetHasLabel = {\n  run: function (test, options) {\n\n    options = options || {};\n\n    var selector = 'fieldset';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope)\n        .filter((element) => {\n          return DOM.scry('legend', element).length === 0\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Fieldsets require a label element',\n      nl: 'Fieldsets behoeven een label-element'\n    },\n    description: {\n      en: 'Fieldsets used to group similar form elements like checkboxes should have a label that describes the group of elements.',\n      nl: 'Fieldsets die een groep gelijkwaardige elementen bevatten moeten een label hebben die deze groep elementen beschrijft.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = FieldsetHasLabel;\n"
  },
  {
    "path": "src/assessments/FileHasLabel.js",
    "content": "/**\n * Test for a label associated with a file input element.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FileHasLabel = {\n  run: function (test) {\n\n    var sFiles = '[type=\"file\"]';\n    var sLabels = 'label';\n\n    function countOfLabelsById (id, labels) {\n      // Map labels by for attribute value.\n      var labelsByFor = 0;\n      for (var i = 0, il = labels.length; i < il; ++i) {\n        var $label = labels[i];\n        if (DOM.getAttribute($label, 'for') === id) {\n          labelsByFor++;\n        }\n      }\n      return labelsByFor;\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var files = DOM.scry(sFiles, scope);\n      var labels = DOM.scry(sLabels, scope);\n\n      if (files.length === 0) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        files.forEach(function (element) {\n          var $file = element;\n          var status = 'failed';\n\n          // Check for an associated label.\n          var id = DOM.getAttribute($file, 'id');\n          if (id) {\n            var labelCount = countOfLabelsById(id, labels);\n            if (labelCount === 1) {\n              status = 'passed';\n            }\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"file\\\" input elements have a corresponding label',\n      nl: 'Alle \\\"file\\\"-invoerelementen hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"file\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user.',\n      nl: 'Alle <code>input</code>-elementen van het type \\\"file\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: [\n        'n'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H44',\n            'F68'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H44'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = FileHasLabel;\n"
  },
  {
    "path": "src/assessments/FocusIndicatorVisible.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar ConvertToPxComponent = require('ConvertToPxComponent');\nvar FocusElements = require('FocusElements');\nvar FocusIndicatorVisible = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      FocusElements(scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var $el = element;\n        var noFocus = {\n          borderWidth: DOM.getComputedStyle($el, 'border-width'),\n          borderColor: DOM.getComputedStyle($el, 'border-color'),\n          backgroundColor: DOM.getComputedStyle($el, 'background-color'),\n          boxShadow: DOM.getComputedStyle($el, 'box-shadow')\n        };\n\n        var listener = function () {\n          if (noFocus.backgroundColor.trim() !== DOM.getComputedStyle($el, 'background-color').trim()) {\n            element.blur();\n            _case.set({\n              status: 'passed'\n            });\n            return;\n          }\n\n          var borderWidth = ConvertToPxComponent(DOM.getComputedStyle($el, 'border-width'));\n          if (borderWidth > 2 && borderWidth !== ConvertToPxComponent(noFocus.borderWidth)) {\n            element.blur();\n            _case.set({\n              status: 'passed'\n            });\n            return;\n          }\n\n          var boxShadow = (DOM.getComputedStyle($el, 'box-shadow') && DOM.getComputedStyle($el, 'box-shadow') !== 'none') ? DOM.getComputedStyle($el, 'box-shadow').match(/(-?\\d+px)|(rgb\\(.+\\))/g) : false;\n          if (boxShadow && DOM.getComputedStyle($el, 'box-shadow') !== noFocus.boxShadow && ConvertToPxComponent(boxShadow[3]) > 3) {\n            element.blur();\n            _case.set({\n              status: 'passed'\n            });\n            return;\n          }\n          element.blur();\n          _case.set({\n            status: 'failed'\n          });\n\n          element.removeEventListener('focus', listener, false);\n        };\n        // Focus needs to be triggered through a web driver protocol.\n        element.addEventListener('focus', listener, false);\n      });\n    });\n  },\n\n  meta: {\n    title: {\n      en: 'Focus indicators have high visibility',\n      nl: 'Focus indicators moeten goed zichtbaar zijn'\n    },\n    description: {\n      en: 'When a focus indicator is used, it should have enough contrast with the background and big enough to be highly visible.',\n      nl: 'Wanneer je een focus indicator gebruikt, moet het contrast tussen de indicator en de achtergrond groot genoeg zijn in verband met de zichtbaarheid.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.7': {\n          techniques: [\n            'C15',\n            'G165',\n            'G195'\n          ]\n        }\n      }\n    },\n    tags: [\n      'focus',\n      'content'\n    ]\n  }\n};\nmodule.exports = FocusIndicatorVisible;\n"
  },
  {
    "path": "src/assessments/FontIsNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FontIsNotUsed = {\n  run: function (test) {\n\n    var selector = 'font';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Font elements should not be used',\n      nl: 'Het font element moet niet worden gebruikt'\n    },\n    description: {\n      en: 'The <code>basefont</code> tag is deprecated and should not be used. Investigate using stylesheets instead.',\n      nl: 'De <code>basefont</code>-tag is afgekeurd en moet niet worden gebruikt. Gebruik in plaats hiervan stylesheets.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'content'\n    ]\n  }\n};\nmodule.exports = FontIsNotUsed;\n"
  },
  {
    "path": "src/assessments/FormButtonsHaveValue.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FormButtonsHaveValue = {\n  run: function (test) {\n\n    var selector = 'input[type=button], input[type=submit], input[type=reset]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          // If the button has a value, it passes.\n          var val = element.getAttribute('value');\n          if (val && typeof val === 'string' && val.length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Input elements for button, submit, or reset must have a value attribute',\n      nl: 'Invoerelementen voor knoppen, indienen of resetten moeten een waarde-attribuut hebben'\n    },\n    description: {\n      en: 'Any form element that is rendered as a button has to have a readable value attribute.',\n      nl: 'Elk invoerelement dat eruit ziet als een knop moet een leesbaar waarde-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = FormButtonsHaveValue;\n"
  },
  {
    "path": "src/assessments/FormErrorMessageHelpsUser.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FormErrorMessageHelpsUser = {\n  run: function (test) {\n\n    var selector = 'form';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Forms offer the user a way to check the results of their form before performing an irrevocable action',\n      nl: 'Formulieren bieden gebruikers de gelegenheid om hun formulier te controleren voor ze een onomkeerbare actie uitvoeren'\n    },\n    description: {\n      en: 'If the form allows users to perform some irrevocable action, like ordreing a product, ensure that users have the ability to review the contents of the form they submitted first. This is not something that can be checked through automated testing and requires manual confirmation.',\n      nl: 'Als een formulier een gebruiker toestaat om een onomkeerbare actie uit te voeren, zoals het bestellen van een product, zorg er dan voor dat ze eerst het formulier kunnen controleren. Dit kan niet met een automatische test en moet handmatig gecontroleerd en bevestigd worden.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = FormErrorMessageHelpsUser;\n"
  },
  {
    "path": "src/assessments/FormHasGoodErrorMessage.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FormHasGoodErrorMessage = {\n  run: function (test) {\n\n    var selector = 'form';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Form error messages should assist in solving errors',\n      nl: 'Foutmeldingen in formulieren moeten fouten helpen oplossen'\n    },\n    description: {\n      en: 'If the form has some required fields or other ways in which the user can commit an error, check that the reply is accessible. Use the words \\\"required\\\" or \\\"error\\\" within the <code>label</code> element of input items where the errors happened.',\n      nl: 'Als het formulier verplichte velden heeft of op andere manier verkeerd ingevuld kan worden, controleer dan of de bijbehorende foutmelding begrijpelijk is. Gebruik de woorden \\\"required\\\" of \\\"error\\\" in het <code>label</code>-element of in de invoeritems waar de fout is opgetredenitems where the errors happened.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = FormHasGoodErrorMessage;\n"
  },
  {
    "path": "src/assessments/FormHasSubmitButton.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar FormHasSubmitButton = {\n  run: function (test) {\n\n    var selector = 'input[type=submit], button[type=submit]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('form', scope);\n\n      if (candidates.length === 0) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var submitButton = DOM.scry(selector, element);\n\n          var status = (submitButton.length === 1) ? 'passed' : 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Form should have a submit button',\n      nl: 'Formulieren moeten een indienknop hebben'\n    },\n    description: {\n      en: 'Forms should have a button that allows the user to select when they want to submit the form.',\n      nl: 'Formulieren moeten een knop hebben waarmee de gebruiker kan bepalen wanneer zij een formulieren willen versturen.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.2': {\n          techniques: [\n            'H32',\n            'G80'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = FormHasSubmitButton;\n"
  },
  {
    "path": "src/assessments/FormWithRequiredLabel.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar FormWithRequiredLabel = {\n  run: function (test) {\n    var redundant = RedundantStringsComponent;\n    var lastStyle, currentStyle = false;\n    redundant.required[redundant.required.indexOf('*')] = /\\*/g;\n    test.get('scope').forEach(function (scope) {\n      var $local = scope;\n      DOM.scry('label', $local).forEach(function (element) {\n        var text = DOM.text(element).toLowerCase();\n        var $label = element;\n        var _case = test.add(Case({\n          element: element\n        }));\n        var input = DOM.scry('#' + DOM.getAttribute($label, 'for'), scope)[0];\n        var isAriaRequired = DOM.getAttribute(input, 'aria-required') === 'true';\n        for (var word in redundant.required) {\n          if (\n            text.search(word) >= 0 &&\n            !isAriaRequired\n          ) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n        }\n        currentStyle = DOM.getComputedStyle($label, 'color') + DOM.getComputedStyle($label, 'font-weight') + DOM.getComputedStyle($label, 'background-color');\n        if (lastStyle && currentStyle !== lastStyle) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        lastStyle = currentStyle;\n        if (typeof _case.get('status') === 'undefined') {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Input items which are required are marked as so in the label element',\n      nl: 'Invoervelden die verplicht zijn, zijn zo gemarkeerd in het label-element'\n    },\n    description: {\n      en: 'If a form element is required, it should be marked as so. This should not be a mere red asterisk, but instead either a \\'required\\' image with alt text of \\\"required\\\" or the actual text \\\"required\\\". The indicator that an item is required should be included in the input element\\'s <code>label</code> element.',\n      nl: 'Als een formulierveld verplicht is, moet het ook zichtbaar zijn. Doe dit niet alleen met een asterisk achter het veld, maar met bijvoorbeeld een afbeelding met als alttekst \\\"required\\\" of de tekst \\\"required\\\". De indicatie dat een veld verplicht is moet opgenomen zijn in het <code>label</code>-element van het invoerveld.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'ARIA2'\n          ]\n        },\n        '1.4.1': {\n          techniques: [\n            'F81'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'ARIA2',\n            'H90'\n          ]\n        },\n        '3.3.3': {\n          techniques: [\n            'ARIA2'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = FormWithRequiredLabel;\n"
  },
  {
    "path": "src/assessments/FrameIsNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FrameIsNotUsed = {\n  run: function (test) {\n    var selector = 'frame';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Frames are not used',\n      nl: 'Gebruik geen frames'\n    },\n    description: {\n      en: 'Frames should not be used to organize a page.',\n      nl: 'Gebruik geen frames om een pagina te organiseren.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = FrameIsNotUsed;\n"
  },
  {
    "path": "src/assessments/FrameRelationshipsMustBeDescribed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FrameRelationshipsMustBeDescribed = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('frameset', scope)\n        .filter((element) => {\n          let longdesc = DOM.getAttribute(element, 'longdesc');\n          return !longdesc || longdesc.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Complex framesets should contain a \\\"longdesc\\\" attribute',\n      nl: 'Complexe framesets moeten een \\\"longdesc\\\"-attribuut bevatten'\n    },\n    description: {\n      en: 'If a <code>frameset</code> contains three or more frames, use a \\\"longdesc\\\" attribute to help describe the purpose of the frames.',\n      nl: 'Als een <code>frameset</code> drie of meer frames bevat, gebruik dan een \\\"longdesc\\\"-attribuut om het doel van de frames te beschrijven.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = FrameRelationshipsMustBeDescribed;\n"
  },
  {
    "path": "src/assessments/FrameSrcIsAccessible.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FrameSrcIsAccessible = {\n  run: function (test, options) {\n\n    var selector = 'frame';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The source for each frame is accessible content.',\n      nl: 'De bron van elk frame is toegankelijke content.'\n    },\n    description: {\n      en: 'Each frame should contain accessible content, and contain content accessible to screen readers, like HTML as opposed to an image.',\n      nl: 'Elk frame moet toegankelijke content bevatten, en content die toegankelijk is voor schermlezers, zoals HTML in tegenstelling tot een afbeelding.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = FrameSrcIsAccessible;\n"
  },
  {
    "path": "src/assessments/FrameTitlesDescribeFunction.js",
    "content": "/**\n * Not yet implemented.\n */\nvar FrameTitlesDescribeFunction = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All \\\"frame\\\" elements should have a \\\"title\\\" attribute that describes the purpose of the frame',\n      nl: 'Alle \\\"frame\\\" elementen moeten een \\\"title\\\"-attribuut hebben dat het doel van het frame beschrijft'\n    },\n    description: {\n      en: 'Each <code>frame</code> elements should have a \\\"title\\\" attribute which describes the purpose or function of the frame.',\n      nl: 'Elk <code>frame</code>-element moet een \\\"title\\\"-attribuut hebben dat het doel of de functie van het frame beschrijft.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.1': {\n          techniques: [\n            'H64'\n          ]\n        }\n      }\n    },\n    tags: [\n      'deprecated',\n      'frame'\n    ],\n    options: {\n      attribute: 'title'\n    }\n  }\n};\nmodule.exports = FrameTitlesDescribeFunction;\n"
  },
  {
    "path": "src/assessments/FrameTitlesNotEmpty.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FrameTitlesNotEmpty = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      let candidates = DOM.scry('frame, iframe', scope)\n        .filter((element) => {\n          let title = DOM.getAttribute(element, 'title');\n          return !title || title.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Frames cannot have empty \\\"title\\\" attributes',\n      nl: 'Frames mogen geen leeg \\\"title\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>frame</code> elements must have a valid \\\"title\\\" attribute.',\n      nl: 'Alle <code>frame</code>-elementen moeten een geldig \\\"title\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.1': {\n          techniques: [\n            'H64'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H64'\n          ]\n        }\n      }\n    },\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = FrameTitlesNotEmpty;\n"
  },
  {
    "path": "src/assessments/FrameTitlesNotPlaceholder.js",
    "content": "/**\n * Not yet implemented.\n */\nvar FrameTitlesNotPlaceholder = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Frames cannot have \\\"title\\\" attributes that are just placeholder text',\n      nl: 'Frames mogen geen \\\"title\\\"-attribuut hebben met placeholdertekst'\n    },\n    description: {\n      en: 'Frame \\\"title\\\" attributes should not be simple placeholder text like \\\"frame\\\".',\n      nl: 'Frame \\\"title\\\"-attributen mogen geen placeholdertekst bevatten zoals \\\"frame\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.1': {\n          techniques: [\n            'H64'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H64'\n          ]\n        }\n      }\n    },\n    tags: [\n      'deprecated',\n      'frame'\n    ],\n    options: {\n      attribute: 'title'\n    }\n  }\n};\nmodule.exports = FrameTitlesNotPlaceholder;\n"
  },
  {
    "path": "src/assessments/FramesAreUsedToGroupContent.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FramesAreUsedToGroupContent = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('body', scope)\n        .filter((element) => {\n          let framesets = DOM.scry('frameset', element);\n          return framesets.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use frame elements to group repeated materials',\n      nl: 'Gebruik frame-elementen om herhaalde content te groeperen'\n    },\n    description: {\n      en: 'When blocks of repeated content are used on a site, use frames to group content that is the same across pages.',\n      nl: 'Wanneer blokken content op een site herhaald worden, gebruik dan frames om content die op verschillende pagina\\'s voorkomt te groeperen.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.1': {\n          techniques: [\n            'H70'\n          ]\n        }\n      }\n    },\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = FramesAreUsedToGroupContent;\n"
  },
  {
    "path": "src/assessments/FramesHaveATitle.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FramesHaveATitle = {\n  run: function (test, options) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('frame, iframe', scope)\n        .filter((element) => DOM.isVisible(element));\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"frame\\\" elements should have a \\\"title\\\" attribute',\n      nl: 'Alle \\\"frame\\\"-elementen moeten een \\\"title\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Each <code>frame</code> elements should have a \\\"title\\\" attribute.',\n      nl: 'Elk <code>frame</code>-elementen moeten een \\\"title\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.1': {\n          techniques: [\n            'H64'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H64'\n          ]\n        }\n      }\n    },\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = FramesHaveATitle;\n"
  },
  {
    "path": "src/assessments/FramesetIsNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FramesetIsNotUsed = {\n  run: function (test, options) {\n\n    var selector = 'frameset';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"frameset\\\" element should not be used',\n      nl: 'Het \\\"frameset\\\"-element wordt niet gebruikt'\n    },\n    description: {\n      en: 'Frames and framesets should not be used to organize content.',\n      nl: 'Frames en framesets moeten niet gebruikt worden om content te organiseren.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = FramesetIsNotUsed;\n"
  },
  {
    "path": "src/assessments/FramesetMustHaveNoFramesSection.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar FramesetMustHaveNoFramesSection = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('frameset', scope)\n        .filter((element) => {\n          let noframes = DOM.scry('noframes', element);\n          return noframes.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All framesets should contain a noframes section',\n      nl: 'Alle framesets moeten een noframes-sectie bevatten'\n    },\n    description: {\n      en: 'If a <code>frameset</code> contains three or more frames, use a \\\"longdesc\\\" attribute to help describe the purpose of the frames.',\n      nl: 'Als een <code>frameset</code> drie of meer frames bevat, gebruik dan een \\\"longdesc\\\"-attribuut om het doel van de frames te beschrijven.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = FramesetMustHaveNoFramesSection;\n"
  },
  {
    "path": "src/assessments/HeaderH1.js",
    "content": "var HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH1 = {\n  run: function (test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 1\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h1 is not h3 through h6',\n      nl: 'De header die volgt op een h1 is niet h3 tot h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h1</code> header with a <code>h3</code>, <code>h4</code>, <code>h5</code>, or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h1</code>-header niet volgen door een <code>h3</code>, <code>h4</code>, <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: [\n            'G130'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH1;\n"
  },
  {
    "path": "src/assessments/HeaderH1Format.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar HeaderH1Format = {\n  run: function (test) {\n\n    var selector = 'h1';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h1 elements are not used for formatting',\n      nl: 'H1-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h1</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h1</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'T3'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH1Format;\n"
  },
  {
    "path": "src/assessments/HeaderH2.js",
    "content": "var HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH2 = {\n  run: function (test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 2\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h2 is not h4, h5, or h6',\n      nl: 'De header volgend op een h2 is geen h4, h5, of h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h2</code> header with a <code>h4</code>, <code>h5</code>, or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h2</code>-header niet volgen door een <code>h4</code>, <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: [\n            'G130'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH2;\n"
  },
  {
    "path": "src/assessments/HeaderH2Format.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar HeaderH2Format = {\n  run: function (test) {\n\n    var selector = 'h2';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h2 elements are not used for formatting',\n      nl: 'H2-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h2</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h2</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'T3'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH2Format;\n"
  },
  {
    "path": "src/assessments/HeaderH3.js",
    "content": "var HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH3 = {\n  run: function (test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 3\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h3 is not an h5 or h6',\n      nl: 'De header volgend op een h3 is geen h5, of h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h3</code> header with a <code>h5<code> or <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h3</code>-header niet volgen door een <code>h5</code>, of <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: [\n            'G130'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH3;\n"
  },
  {
    "path": "src/assessments/HeaderH3Format.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar HeaderH3Format = {\n  run: function (test) {\n\n    var selector = 'h3';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h3 elements are not used for formatting',\n      nl: 'H3-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h3</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h3</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'T3'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH3Format;\n"
  },
  {
    "path": "src/assessments/HeaderH4.js",
    "content": "var HeadingLevelComponent = require('HeadingLevelComponent');\nvar HeaderH4 = {\n  run: function (test) {\n    HeadingLevelComponent(test, {\n      headingLevel: 4\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The header following an h4 is not an h6',\n      nl: 'De header volgend op een h4 is geen h6'\n    },\n    description: {\n      en: 'Header order should not skip a level. Do not follow a <code>h4</code> haeder with a <code>h6</code>.',\n      nl: 'Headers mogen geen niveau overslaan. Laat een <code>h4/code> header niet volgen door een <code>h6</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.6': {\n          techniques: [\n            'G130'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH4;\n"
  },
  {
    "path": "src/assessments/HeaderH4Format.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar HeaderH4Format = {\n  run: function (test) {\n\n    var selector = 'h4';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h4 elements are not used for formatting',\n      nl: 'H4-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h4</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h4</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'T3'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH4Format;\n"
  },
  {
    "path": "src/assessments/HeaderH5Format.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar HeaderH5Format = {\n  run: function (test) {\n\n    var selector = 'h5';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h5 elements are not used for formatting',\n      nl: 'H5-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h5</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h5</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'T3'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH5Format;\n"
  },
  {
    "path": "src/assessments/HeaderH6Format.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar HeaderH6Format = {\n  run: function (test) {\n\n    var selector = 'h6';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All h6 elements are not used for formatting',\n      nl: 'H6-elementen worden niet gebruikt voor formatting'\n    },\n    description: {\n      en: 'An <code>h6</code> element may not be used purely for formatting.',\n      nl: 'Een <code>h6</code>-element mag niet alleen gebruikt worden voor formatting.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'T3'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeaderH6Format;\n"
  },
  {
    "path": "src/assessments/HeadersAttrRefersToATableCell.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar HeadersAttrRefersToATableCell = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      // Table cell headers without referred ids\n      DOM.scry('table', scope).forEach(function (element) {\n        var self = element;\n        var _case = Case();\n        test.add(_case);\n        var elmHeaders = DOM.scry('th[headers], td[headers]', self);\n\n        if (elmHeaders.length === 0) {\n          _case.set({\n            status: 'inapplicable'\n          });\n          return;\n        }\n        else {\n          elmHeaders.forEach(function (element) {\n            var that = element;\n            var headers = DOM.getAttribute(element, 'headers').split(/\\s+/);\n            headers.forEach(function (item) {\n              if (item === '' || DOM.scry('th#' + item + ',td#' + item, self).length > 0) {\n                _case.set({\n                  element: that,\n                  status: 'passed'\n                });\n                return;\n              }\n              else {\n                _case.set({\n                  element: that,\n                  status: 'failed'\n                });\n                return;\n              }\n            });\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Table cell headers attrtibutes must within the same table have an associated data cell with the same id',\n      nl: 'Tabel cellen met een headers attribuut moeten binnen dezelfde tabel een overeenkomende data cel hebben in het id attribuut dezelfde waarde'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'headers',\n      'td',\n      'th'\n    ]\n  }\n};\nmodule.exports = HeadersAttrRefersToATableCell;\n"
  },
  {
    "path": "src/assessments/HeadersHaveText.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar HeadersHaveText = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'h1, h2, h3, h4, h5, h6',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All headers should contain readable text',\n      nl: 'Alle headers moeten leesbare tekst bevatten'\n    },\n    description: {\n      en: 'Users with screen readers use headings like the tabs <em>h1</em> to navigate the structure of a page. All headings should contain either text, or images with appropriate <em>alt</em> attributes.',\n      nl: 'Gebruikers van schermlezers gebruiken headers om via de structuur van een pagina te navigeren. Alle headers moeten daarom tekst bevatten of afbeeldingen met toepasselijk <em>alt</em>-attributen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'G141'\n          ]\n        },\n        '2.4.10': {\n          techniques: [\n            'G141'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeadersHaveText;\n"
  },
  {
    "path": "src/assessments/HeadersUseToMarkSections.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar HeadersUseToMarkSections = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case();\n        test.add(_case);\n        [\n          DOM.scry('strong', element)[0],\n          DOM.scry('em', element)[0],\n          DOM.scry('i', element)[0],\n          DOM.scry('b', element)[0]\n        ].forEach(function (inlineText) {\n          if (inlineText) {\n            _case.set({\n              element: element,\n              status: (DOM.text(inlineText).trim() === DOM.text(element).trim()) ?\n                'failed' :\n                'passed'\n            });\n          }\n        });\n      });\n    });\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('ul, ol', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var $list = element;\n        let prevHeaders = DOM.prevAll($list).filter((element) => {\n          return DOM.is(element, 'h1, h2, h3, h4, h5, h6');\n        });\n        let items = DOM.scry('li', $list);\n        let itemLinks = DOM.scry('li', $list)\n          .filter((element) => DOM.scry('a', element).length > 0);\n        if (\n          prevHeaders.length ||\n          items.length !== itemLinks.length\n        ) {\n          _case.set({\n            status: 'passed'\n          });\n          return;\n        }\n        var isNavigation = true;\n        itemLinks.forEach(function (element) {\n          if (DOM.text(DOM.scry('a', element)[0]).trim() !== DOM.text(element).trim()) {\n            isNavigation = false;\n          }\n        });\n        if (isNavigation) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use headers to mark the beginning of each section',\n      nl: 'Gebruik headers om de start van elke sectie aan te geven.'\n    },\n    description: {\n      en: 'Check that each logical section of the page is broken or introduced with a header (h1-h6) element.',\n      nl: 'Controleer dat elke logische sectie van een pagina wordt onderbroken door of start met een header-element (h1-h6).'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'G141'\n          ]\n        },\n        '2.4.1': {\n          techniques: [\n            'G141',\n            'H69'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = HeadersUseToMarkSections;\n"
  },
  {
    "path": "src/assessments/IIsNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar IIsNotUsed = {\n  run: function (test) {\n\n    var selector = 'i';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"i\\\" (italic) element is not used',\n      nl: 'Het \\\"i\\\"-element (cursief) wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>i</code> (italic) element provides no emphasis for non-sighted readers. Use the <code>em</code> tag instead.',\n      nl: 'Het <code>i</code>-element biedt geen nadruk voor slechtziende en blinde lezers. Gebruik in plaats daarvan de <code>em</code>-tag.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'content'\n    ]\n  }\n};\nmodule.exports = IIsNotUsed;\n"
  },
  {
    "path": "src/assessments/IdrefsHasCorrespondingId.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IdrefsHasCorrespondingId = {\n  run: function (test) {\n\n    function getAttribute ($element) {\n      var attribute = [];\n      var attributeList = ['headers', 'aria-controls', 'aria-describedby', 'aria-flowto', 'aria-labelledby', 'aria-owns'];\n\n      attributeList.forEach(function (item) {\n        var attr = DOM.getAttribute($element, item);\n\n        if (typeof attr !== typeof undefined && attr !== false) {\n          attribute = attr;\n          return;\n        }\n      });\n      return attribute.split(/\\s+/);\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var testableElements = DOM.scry([\n        'td[headers]',\n        'th[headers]',\n        '[aria-controls]',\n        '[aria-describedby]',\n        '[aria-flowto]',\n        '[aria-labelledby]',\n        '[aria-owns]'\n      ].join(', '), scope);\n\n      if (testableElements.length === 0) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n        return;\n      }\n      else {\n        testableElements.forEach(function (element) {\n          var _case = test.add(Case({\n            element: element\n          }));\n\n          var attributes = getAttribute(element);\n          var status = 'passed';\n\n          attributes.forEach(function (item) {\n            if (item !== '' && DOM.scry('#' + item, scope).length === 0) {\n              status = 'failed';\n              return;\n            }\n          });\n\n          _case.set({\n            status: status\n          });\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Elements with an idref attribute must correspond to an element with an ID',\n      nl: 'Elementen met een idref-attribuut moeten corresponderen met een element met een ID'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F17'\n          ]\n        },\n        '4.1.1': {\n          techniques: [\n            'F17'\n          ]\n        }\n      }\n    }\n  }\n};\nmodule.exports = IdrefsHasCorrespondingId;\n"
  },
  {
    "path": "src/assessments/IframeMustNotHaveLongdesc.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar IframeMustNotHaveLongdesc = {\n  run: function (test) {\n\n    var selector = 'iframe';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('longdesc')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Inline frames (\\\"iframes\\\") should not have a \\\"longdesc\\\" attribute',\n      nl: 'Inline frames (\\\"iframes\\\") krijgen geen \\\"longdesc\\\"-attribuut'\n    },\n    description: {\n      en: 'Inline frames (iframe) should not have a \\\"longdesc\\\" attribute.',\n      nl: 'Inline frames (\\\"iframes\\\") krijgen geen \\\"longdesc\\\"-attribuut.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'iframe',\n      'content'\n    ]\n  }\n};\nmodule.exports = IframeMustNotHaveLongdesc;\n"
  },
  {
    "path": "src/assessments/ImageMapServerSide.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImageMapServerSide = {\n  run: function (test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('ismap')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All links in a server-side map should have duplicate links available in the document',\n      nl: 'Alle links in een server-side map moeten elders in het document terugkeren'\n    },\n    description: {\n      en: 'Any image with an \\\"usemap\\\" attribute for a server-side image map should have the available links duplicated elsewhere.',\n      nl: 'Elke afbeelding met een \\\"usemap\\\"-attribuut voor een server-side map moet de beschikbare links ook elders hebben.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'iframe',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImageMapServerSide;\n"
  },
  {
    "path": "src/assessments/ImgAltEmptyForDecorativeImages.js",
    "content": "/**\n * @todo Needs to take role=\"presentation\" into account.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImgAltEmptyForDecorativeImages = {\n  run: function (test, options) {\n\n    var selector = 'img[alt]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'If an image is purely decorative, the \\\"alt\\\" text must be empty',\n      nl: 'Als een afbeelding alleen ter decoratie is, moet de \\\"alt\\\"-tekst leeg zijn'\n    },\n    description: {\n      en: 'Any image that is only decorative (serves no function or adds to the purpose of the page content) should have an empty \\\"alt\\\" attribute.',\n      nl: 'Elke afbeelding die alleen ter decoratie is (en die dus geen functie heeft of bijdraagt aan het doel van een contentpagina) moet een leeg \\\"alt\\\"-attirbuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.3': {\n          techniques: [\n            'F26'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgAltEmptyForDecorativeImages;\n"
  },
  {
    "path": "src/assessments/ImgAltIdentifiesLinkDestination.js",
    "content": "/**\n * @todo This needs to test do some semantic analysis.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImgAltIdentifiesLinkDestination = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('a img[alt]', scope).slice(0, 1);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Any image within a link must have \\\"alt\\\" text the describes the link destination',\n      nl: 'Elke afbeelding binnen een link moet een \\\"alt\\\"-tekst hebben die de bestemming van de link beschrijft'\n    },\n    description: {\n      en: 'Any image that is within a link should have an \\\"alt\\\" attribute which identifies the destination or purpose of the link.',\n      nl: 'Elke afbeelding binnen link moet een \\\"alt\\\"-tekst hebben die de bestemming of het doel van de link beschrijft.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgAltIdentifiesLinkDestination;\n"
  },
  {
    "path": "src/assessments/ImgAltIsDifferent.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar ImgAltIsDifferent = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img', scope)\n        .filter((element) => {\n          let src = DOM.getAttribute(element, 'src');\n          return !src || src.length === 0;\n        })\n        .forEach(function (element) {\n          var _case = Case({\n            element: element,\n            status: 'inapplicable'\n          });\n          test.add(_case);\n        });\n\n      DOM.scry('img[alt][src]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'src') === DOM.getAttribute(element, 'alt') || DOM.getAttribute(element, 'src').split('/').pop() === DOM.getAttribute(element, 'alt')) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Image \\\"alt\\\" attributes should not be the same as the filename',\n      nl: '\\\"Alt\\\"-attributen van afbeeldingen moeten niet hetzelfde zijn als de bestandsnaam'\n    },\n    description: {\n      en: 'All <code>img</code> elements should have an \\\"alt\\\" attribute that is not just the name of the file',\n      nl: 'Alle <code>img</code>-elementen moeten een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam van de afbeelding.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H37'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgAltIsDifferent;\n"
  },
  {
    "path": "src/assessments/ImgAltIsSameInText.js",
    "content": "/**\n * @todo This test needs to do some semantic analysis.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImgAltIsSameInText = {\n  run: function (test, options) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Check that any text within an image is also in the \\\"alt\\\" attribute',\n      nl: 'Controleer dat tekst in een afbeelding ook is opgenomen in het \\\"alt\\\"-attribuut'\n    },\n    description: {\n      en: 'If an image has text within it, that text should be repeated in the \\\"alt\\\" attribute',\n      nl: 'Als een afbeelding tekst bevat, moet deze tekst herhaald worden in het \\\"alt\\\"-attribuut.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'G74',\n            'H37'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgAltIsSameInText;\n"
  },
  {
    "path": "src/assessments/ImgAltIsTooLong.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar ImgAltIsTooLong = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        _case.set({\n          status: (DOM.getAttribute(element, 'alt').length > 100) ? 'failed' : 'passed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Image Alt text is too long',\n      nl: 'Altteksten voor een afbeelding zijn kort'\n    },\n    description: {\n      en: 'All \\\"alt\\\" attributes for <code>img</code> elements should be clear and concise. \\\"Alt\\\" attributes over 100 characters long should be reviewed to see if they are too long.',\n      nl: 'Alle \\\"alt\\\"-attributen voor <code>img</code>-elementen moeten duidelijk en bondig zijn. Verifieer \\\"alt\\\"-attributen langer dan 100 tekens en kort ze in waar mogelijk.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H37'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgAltIsTooLong;\n"
  },
  {
    "path": "src/assessments/ImgAltNotEmptyInAnchor.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgAltNotEmptyInAnchor = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a[href]', scope)\n        .filter((element) => DOM.scry('img', element).length > 0)\n        .forEach(function (element) {\n          var $a = element;\n          var text = DOM.text($a);\n\n          var _case = Case({\n            element: element\n          });\n          test.add(_case);\n\n          // Concat all alt attributes of images to the text of the paragraph\n          DOM.scry('img[alt]', $a).forEach(function (element) {\n            text += ' ' + DOM.getAttribute(element, 'alt');\n          });\n\n          if (IsUnreadable(text)) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n          else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'An image within a link cannot have an empty \\\"alt\\\" attribute if there is no other text within the link',\n      nl: 'Een afbeelding binnen een link mag geen leeg \\\"alt\\\"-attribuut hebben als er geen andere tekst is in de link'\n    },\n    description: {\n      en: 'Any image that is within a link (an <code>a</code> element) that has no other text cannot have an empty or missing \\\"alt\\\" attribute.',\n      nl: 'Elke afbeelding binnen een link (een <code>a</code>-element) die geen andere tekst heeft, mag geen leeg of ontbrekend \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '2.4.4': {\n          techniques: [\n            'H30'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgAltNotEmptyInAnchor;\n"
  },
  {
    "path": "src/assessments/ImgAltNotPlaceHolder.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ImgAltNotPlaceHolder = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'img',\n      attribute: 'alt'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Images should not have a simple placeholder text as an \\\"alt\\\" attribute',\n      nl: 'Afbeeldingen mogen geen placeholdertkest als \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decorativey or which is purely for layout purposes cannot have an \\\"alt\\\" attribute that consists solely of placeholders.',\n      nl: 'Elke afbeelding die niet ter decoratie is of die alleen voor lay-out doeleinden is bedoeld, mag geen \\\"alt\\\"-attribuut hebben met daarin placeholdertekst.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'F30',\n            'F39'\n          ]\n        },\n        '1.2.1': {\n          techniques: [\n            'F30'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgAltNotPlaceHolder;\n"
  },
  {
    "path": "src/assessments/ImgGifNoFlicker.js",
    "content": "/**\n * Not yet implemented.\n */\nvar ImgGifNoFlicker = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any animated GIF should not flicker',\n      nl: 'Geen enkele animated GIF mag knipperen of flitsen'\n    },\n    description: {\n      en: 'Animated GIF files should not flicker with a frequency over 2 Hz and lower than 55 Hz. You can check the flicker rate of this GIF <a href=\\\"http://tools.webaccessibile.org/test/check.aspx\\\">using an online tool</a>.',\n      nl: 'Animated GIF-bestanden mogen niet knipperen of flitsen met een frequentie hoger dan 2 Hz en lager dan 55 Hz. Controleer de frequentie van deze GIF met een <a href=\\\"http://tools.webaccessibile.org/test/check.aspx\\\">online tool</a>.'\n    },\n    guidelines: {\n      508: [\n        'j'\n      ],\n      wcag: {\n        '2.2.2': {\n          techniques: [\n            'G152'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgGifNoFlicker;\n"
  },
  {
    "path": "src/assessments/ImgHasAlt.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImgHasAlt = {\n  run: function (test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Image elements must have an \\\"alt\\\" attribute',\n      nl: 'Afbeeldingselementen moeten een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>img</code> elements must have an alt attribute.',\n      nl: 'Alle <code>img</code>-elementen moeten een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'F65',\n            'H37'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgHasAlt;\n"
  },
  {
    "path": "src/assessments/ImgHasLongDesc.js",
    "content": "var ValidURLComponent = require('ValidURLComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar ImgHasLongDesc = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('img[longdesc]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'longdesc') === DOM.getAttribute(element, 'alt') ||\n            !ValidURLComponent(DOM.getAttribute(element, 'longdesc'))) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A \\\"longdesc\\\" attribute is required for any image where additional information not in the \\\"alt\\\" attribute is required',\n      nl: 'Een \\\"longdesc\\\"-attribuut is verplicht voor elke afbeelding waar aanvullende informatie niet benodigd is in het \\\"alt\\\"-attribuut'\n    },\n    description: {\n      en: 'Any image that has an \\\"alt\\\" attribute that does not fully convey the meaning of the image must have a \\\"longdesc\\\" attribute.',\n      nl: 'Elke afbeelding die een \\\"alt\\\"-attribuut heeft dat de volledige betekenis van de afbeelding bevat, moet een \\\"longdesc\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.4': {\n          techniques: [\n            'G91'\n          ]\n        },\n        '2.4.9': {\n          techniques: [\n            'G91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgHasLongDesc;\n"
  },
  {
    "path": "src/assessments/ImgImportantNoSpacerAlt.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgImportantNoSpacerAlt = {\n  run: function (test) {\n    var removePX = (strVal) => {\n      if (/px$/.test(strVal)) {\n        strVal = strVal.slice(0, -2);\n      }\n      return strVal;\n    };\n    test.get('scope').forEach((scope) => {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var computedWidth =\n          parseInt(removePX(DOM.getComputedStyle(element, 'width')), 10);\n        var computedHeight =\n          parseInt(removePX(DOM.getComputedStyle(element, 'height')), 10);\n        var width = (computedWidth) ?\n          computedWidth :\n          parseInt(DOM.getAttribute(element, 'width'), 10);\n        var height = (computedHeight) ?\n          computedHeight :\n          parseInt(DOM.getAttribute(element, 'height'), 10);\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (IsUnreadable(DOM.getAttribute(element, 'alt').trim()) &&\n            DOM.getAttribute(element, 'alt').length > 0 &&\n            width > 50 &&\n            height > 50) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Images that are important should not have a purely white-space \\\"alt\\\" attribute',\n      nl: 'Afbeeldingen die belangrijk zijn mogen geen leeg \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decorativey or which is purely for layout purposes cannot have an \\\"alt\\\" attribute that consists solely of white space (i.e. a space).',\n      nl: 'Elke afbeelding die niet ter decoratie is of die alleen voor lay-out doeleinden is bedoeld, mag geen leeg \\\"alt\\\"-attribuut hebben (bijvoorbeeld alleen een spatie).'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgImportantNoSpacerAlt;\n"
  },
  {
    "path": "src/assessments/ImgMapAreasHaveDuplicateLink.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar ImgMapAreasHaveDuplicateLink = {\n  run: function (test) {\n    var links = {};\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        links[DOM.getAttribute(element, 'href')] = DOM.getAttribute(element, 'href');\n      });\n\n      DOM.scry('img[usemap]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var $image = element;\n        var $map = DOM.scry(DOM.getAttribute($image, 'usemap'), scope);\n        if (!$map.length) {\n          $map = DOM.scry('map[name=\"' + DOM.getAttribute($image, 'usemap').replace('#', '') + '\"]', scope);\n        }\n        if ($map.length) {\n          var failed = false;\n          DOM.scry('area', $map).forEach(function (element) {\n            if (typeof links[DOM.getAttribute(element, 'href')] === 'undefined') {\n              failed = true;\n            }\n          });\n          _case.set({\n            status: (failed) ? 'failed' : 'passed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'inapplicable'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All links within a client-side image are duplicated elsewhere in the document',\n      nl: 'Alle links met een client-side afbeelding moeten elders in het document terugkeren'\n    },\n    description: {\n      en: 'Any image that has a \\\"usemap\\\" attribute must have links replicated somewhere else in the document.',\n      nl: 'Elke afbeelding met een \\\"usemap\\\"-attribuut moet een link elders in het document hebben.'\n    },\n    guidelines: {\n      508: [\n        'ef',\n        'ef'\n      ]\n    },\n    tags: [\n      'image',\n      'imagemap'\n    ]\n  }\n};\nmodule.exports = ImgMapAreasHaveDuplicateLink;\n"
  },
  {
    "path": "src/assessments/ImgNonDecorativeHasAlt.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ImgNonDecorativeHasAlt = {\n  run: function (test) {\n    function removePX (val) {\n      if (/px$/.test(val)) {\n        val = val.slice(0, -2);\n      }\n      return val;\n    }\n    test.get('scope').forEach((scope) => {\n      DOM.scry('img[alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var computedWidth =\n          parseInt(removePX(DOM.getComputedStyle(element, 'width')), 10);\n        var computedHeight =\n          parseInt(removePX(DOM.getComputedStyle(element, 'height')), 10);\n        if (IsUnreadable(DOM.getAttribute(element, 'alt')) &&\n            (computedWidth > 100 || computedHeight > 100)) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Any non-decorative images should have a non-empty \\\"alt\\\" attribute',\n      nl: 'Elke niet-decoratieve afbeelding moet een gevuld \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Any image that is not used decoratively or which is purely for layout purposes cannot have an empty \\\"alt\\\" attribute.',\n      nl: 'Elke afbeelding die niet ter decoratie is of voor lay-out doeleinden wordt gebruikt, moet een gevuld \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'F38'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgNonDecorativeHasAlt;\n"
  },
  {
    "path": "src/assessments/ImgNotReferredToByColorAlone.js",
    "content": "/**\n * @todo This test needs to test something.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImgNotReferredToByColorAlone = {\n  run: function (test, options) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'For any image, the \\\"alt\\\" text cannot refer to color alone',\n      nl: 'Voor elke afbeelding geldt dat de \\\"alt\\\"-tekst niet alleen aan kleur mag refereren'\n    },\n    description: {\n      en: 'The \\\"alt\\\" text or content text for any image should not refer to the image by color alone. This is often fixed by changing the \\\"alt\\\" text to the meaning of the image',\n      nl: 'De \\\"alt\\\"-tekst of content voor elke afbeelding mag niet alleen maar een kleur bevatten. Neem in de \\\"alt\\\"-tekst de betekenis van de afbeelding op.'\n    },\n    guidelines: {\n      508: [\n        'c'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'F13'\n          ]\n        },\n        '1.4.1': {\n          techniques: [\n            'F13'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'color',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgNotReferredToByColorAlone;\n"
  },
  {
    "path": "src/assessments/ImgServerSideMapNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImgServerSideMapNotUsed = {\n  run: function (test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('ismap')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Server-side image maps should not be used',\n      nl: 'Server-side image maps moeten niet worden gebruikt'\n    },\n    description: {\n      en: 'Server-side image maps should not be used.',\n      nl: 'Server-side image maps mogen niet worden gebruikt.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'image',\n      'imagemap',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgServerSideMapNotUsed;\n"
  },
  {
    "path": "src/assessments/ImgShouldNotHaveTitle.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImgShouldNotHaveTitle = {\n  run: function (test) {\n\n    var selector = 'img';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('title')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Images should not have a \\\"title\\\" attribute',\n      nl: 'Afbeeldingen moeten geen \\\"title\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Images should not contain a \\\"title\\\" attribute.',\n      nl: 'Afbeeldingen zouden geen \\\"title\\\"-attribuut moeten bevatten.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgShouldNotHaveTitle;\n"
  },
  {
    "path": "src/assessments/ImgWithMapHasUseMap.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ImgWithMapHasUseMap = {\n  run: function (test) {\n\n    var selector = 'img[ismap]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('usemap')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any image with an \\\"ismap\\\" attribute have a valid \\\"usemap\\\" attribute',\n      nl: 'Elke afbeelding met een \\\"ismap\\\"-attribuut heeft een geldig \\\"usemap\\\"-attribuut'\n    },\n    description: {\n      en: 'If an image has an \\\"ismap\\\" attribute it must have a valid \\\"usemap\\\" attribute.',\n      nl: 'Als een afbeelding een \\\"ismap\\\"-attribuut heeft, moet het ook een geldig \\\"usemap\\\"-attribuut hebben'\n    },\n    guidelines: {\n      508: [\n        'ef',\n        'ef'\n      ]\n    },\n    tags: [\n      'image',\n      'imagemap',\n      'content'\n    ]\n  }\n};\nmodule.exports = ImgWithMapHasUseMap;\n"
  },
  {
    "path": "src/assessments/InputCheckboxRequiresFieldset.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar InputCheckboxRequiresFieldset = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=\"checkbox\"]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var fieldset = DOM.parents(element)\n          .find((parent) => DOM.is(parent, 'fieldset'));\n        if (!fieldset) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Logical groups of check boxes should be grouped with a fieldset',\n      nl: 'Logische groepen van keuzevakjes moeten gegroepeerd zijn in een fieldset'\n    },\n    description: {\n      en: 'Related \\\"checkbox\\\" input fields should be grouped together using a <code>fieldset</code>.',\n      nl: 'Gerelateerde \\\"keuzevakjes\\\"-invoervelden moeten bij elkaar staan in een <code>fieldset</code>.'\n    },\n    guidelines: {\n      wcag: {\n        '3.3.2': {\n          techniques: [\n            'H71'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputCheckboxRequiresFieldset;\n"
  },
  {
    "path": "src/assessments/InputDoesNotUseColorAlone.js",
    "content": "/**\n * Not yet implemented.\n */\nvar InputDoesNotUseColorAlone = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'An \\\"input\\\" element should not use color alone',\n      nl: 'Een invoerveld mag niet alleen maar kleur gebruiken'\n    },\n    description: {\n      en: 'All input elements should not refer to content by color alone.',\n      nl: 'Elk invoerveld moet naar content verwijzen door middel van meer dan alleen kleur.'\n    },\n    guidelines: {\n      508: [\n        'c'\n      ]\n    },\n    tags: [\n      'form',\n      'color',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputDoesNotUseColorAlone;\n"
  },
  {
    "path": "src/assessments/InputElementsDontHaveAlt.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar InputElementsDontHaveAlt = {\n  run: function (test) {\n\n    var selector = 'input[type]';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope)\n        .filter((element) => {\n          let type = DOM.getAttribute(element, 'type');\n          return type !== 'image';\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Input elements which are not images should not have an \\\"alt\\\" attribute',\n      nl: 'Invoervelden die geen afbeelding zijn, moeten geen \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'Input elements which are not images should not have an \\\"alt\\\" attribute, because of inconsistencies in how user agents use the \\\"alt\\\" attribute.',\n      nl: 'Invoervelden die geen afbeelding zijn, moeten geen \\\"alt\\\"-attribuut hebben, omdat user agents het \\\"alt\\\"-attribuut niet consistent gebruiken.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputElementsDontHaveAlt;\n"
  },
  {
    "path": "src/assessments/InputImageAltIdentifiesPurpose.js",
    "content": "/**\n * Not yet implemented.\n */\nvar InputImageAltIdentifiesPurpose = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute that describes the function of the input',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat de functie van de invoer beschrijft'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"image\\\" should have an \\\"alt\\\" attribute.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H36'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputImageAltIdentifiesPurpose;\n"
  },
  {
    "path": "src/assessments/InputImageAltIsNotFileName.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar InputImageAltIsNotFileName = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image][alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'src') === DOM.getAttribute(element, 'alt')) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not the same as the filename',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"image\\\" should have an \\\"alt\\\" attribute which is not the same as the filename.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat anders is dan de bestandsnaam.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H36'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputImageAltIsNotFileName;\n"
  },
  {
    "path": "src/assessments/InputImageAltIsNotPlaceholder.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputImageAltIsNotPlaceholder = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'input[type=\"image\"]',\n      attribute: 'alt'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not placeholder text.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben anders dan alleen placeholdertekst.'\n    },\n    description: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is not placeholder text.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben anders dan alleen placeholdertekst.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H36'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputImageAltIsNotPlaceholder;\n"
  },
  {
    "path": "src/assessments/InputImageAltIsShort.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar InputImageAltIsShort = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.getAttribute(element, 'alt').length > 100) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is as short as possible',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat zo kort mogelijk is'\n    },\n    description: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute which is as short as possible.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben dat zo kort mogelijk is.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H36'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputImageAltIsShort;\n"
  },
  {
    "path": "src/assessments/InputImageAltNotRedundant.js",
    "content": "var CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar RedundantStringsComponent = require('RedundantStringsComponent');\nvar InputImageAltNotRedundant = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input[type=image][alt]', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (RedundantStringsComponent.inputImage.indexOf(CleanStringComponent(DOM.getAttribute(element, 'alt'))) > -1) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"alt\\\" text for input \\\"image\\\" submit buttons must not be filler text',\n      nl: 'De \\\"alt\\\"-tekst for \\\"image\\\"-knoppen moet anders zijn dan alleen placeholdertekst'\n    },\n    description: {\n      en: 'Every form image button should not simply use filler text like \\\"button\\\" or \\\"submit\\\" as the \\\"alt\\\" text.',\n      nl: 'Elke formulierknop die een afbeelding is, moet bruikbare tekst als \\\"alt\\\"-tekst hebben, anders dan \\\"knop\\\" of \\\"verstuur\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H36'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputImageAltNotRedundant;\n"
  },
  {
    "path": "src/assessments/InputImageHasAlt.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar InputImageHasAlt = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('input[type=image]', scope)\n        .filter((element) => DOM.isVisible(element));\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (element.hasAttribute('alt')) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements with a type of \\\"image\\\" must have an \\\"alt\\\" attribute',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"image\\\" should have an \\\"alt\\\" attribute.',\n      nl: 'Elk \\\"invoer\\\"-element met een type \\\"afbeelding\\\" moet een \\\"alt\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'F65',\n            'G94',\n            'H36'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputImageHasAlt;\n"
  },
  {
    "path": "src/assessments/InputImageNotDecorative.js",
    "content": "/**\n * Not yet implemented.\n */\nvar InputImageNotDecorative = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The \\\"alt\\\" text for input \\\"image\\\" buttons must be the same as text inside the image',\n      nl: 'De \\\"alt\\\"-tekst voor afbeeldingen van invoerknoppen moet hetzelfde zijn als de tekst in de afbeeldingen'\n    },\n    description: {\n      en: 'Every form image button which has text within the image (say, a picture of the word \\\"Search\\\" in a special font) must also have this text in the \\\"alt\\\" text.',\n      nl: 'Elke formulierknop die een afbeelding is en tekst in de afbeelding heeft (bijvoorbeeld \\\"Zoek\\\") moet deze tekst ook in de \\\"alt\\\"-tekst hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H36'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'image',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputImageNotDecorative;\n"
  },
  {
    "path": "src/assessments/InputTextHasLabel.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar InputTextHasLabel = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'input'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements should have a corresponding \\\"label\\\"',\n      nl: 'Alle invoerelementen moeten een bijbehorend \\\"label\\\" hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H44',\n            'F68'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H44',\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputTextHasLabel;\n"
  },
  {
    "path": "src/assessments/InputTextHasValue.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputTextHasValue = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'input[type=\"text\"]',\n      attribute: 'value',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"input\\\" elements of type \\\"text\\\" must have a default text',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"text\\\" should have a default text.',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputTextHasValue;\n"
  },
  {
    "path": "src/assessments/InputTextValueNotEmpty.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar InputTextValueNotEmpty = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'input[type=\"text\"]',\n      attribute: 'value',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Text input elements require a non-whitespace default text',\n      nl: 'Tekstinvoerelementen mogen geen lege standaardtekst hebben'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"text\\\" should have a default text which is not empty.',\n      nl: 'Alle invoerelementen van het type \\\"text\\\" moeten een standaardtekst hebben die gevuld is.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputTextValueNotEmpty;\n"
  },
  {
    "path": "src/assessments/InputWithoutLabelHasTitle.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar InputWithoutLabelHasTitle = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var testableElements = DOM.scry('input, select, textarea', scope);\n      if (testableElements.length === 0) {\n        var _case = Case({\n          element: scope,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n        return;\n      }\n      else {\n        testableElements.forEach(function (element) {\n          var _case = Case({\n            element: element\n          });\n          test.add(_case);\n\n          if (DOM.getComputedStyle(element, 'display') === 'none') {\n            _case.set({\n              status: 'inapplicable'\n            });\n            return;\n          }\n          if (!DOM.scry('label[for=' + DOM.getAttribute(element, 'id') + ']', scope).length &&\n            (!DOM.getAttribute(element, 'title') || IsUnreadable(DOM.getAttribute(element, 'title')))) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n          else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Form controls without label should have a title attribute',\n      nl: 'Formulierelementen zonder label moeten een titelattribuut hebben'\n    },\n    description: {\n      en: 'If it is not possible to have a label for a form control, then a title attribute on the element should be provided that describes the purpose of the control.',\n      nl: 'Als een formulierelement geen label kan krijgen, dan moet een dat element een titelattribuut krijgen dat het doel van het element beschrijft.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H65'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H65'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H65'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H65'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = InputWithoutLabelHasTitle;\n"
  },
  {
    "path": "src/assessments/KINGStrongList.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar KINGStrongList = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('strong', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        _case.set({\n          status: DOM.is(element.parentElement, 'li') ? 'passed' : 'failed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Use strong in lists only'\n    },\n    description: {\n      en: 'STRONG only allowed when parent element is LI.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'KING'\n    ]\n  }\n};\nmodule.exports = KINGStrongList;\n"
  },
  {
    "path": "src/assessments/KINGUseCurrencyAsSymbol.js",
    "content": "var GetTextContentsComponent = require('GetTextContentsComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar KINGUseCurrencyAsSymbol = {\n  run: function (test) {\n    function testCurrencyFormat (element) {\n      // Detect dates with several separators.\n      var currencyNames = [\n        'dollar',\n        'euro',\n        'pound',\n        'franc',\n        'krona',\n        'rupee',\n        'ruble',\n        'dinar'\n      ];\n      // Test the words and any eventual extra letters for s and all.\n      var currencyReg = new RegExp('\\\\d{1,}\\\\s*(' + currencyNames.join('|') + ')\\\\w*\\\\b|(' + currencyNames.join('|') + ')\\\\w*\\\\b\\\\s*\\\\d{1,}', 'ig');\n\n      var text = GetTextContentsComponent(element);\n      var _case = Case({\n        element: element\n      });\n      test.add(_case);\n\n      _case.set({\n        status: currencyReg.test(text) ? 'failed' : 'passed'\n      });\n    }\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(testCurrencyFormat);\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Use a symbol for a currency'\n    },\n    description: {\n      en: 'Only use symbol and currency name instead of common name such as € or EUR.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'KING'\n    ]\n  }\n};\nmodule.exports = KINGUseCurrencyAsSymbol;\n"
  },
  {
    "path": "src/assessments/KINGUseLongDateFormat.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar KINGUseLongDateFormat = {\n  run: function (test) {\n\n    function testDateFormat (element) {\n      // Detect dates with several separators.\n      var dateReg = /\\d{1,2}([./-])\\d{1,2}\\1\\d{2,4}/g;\n      var elemChildNodes = element.childNodes;\n      var issueOccured = false;\n\n      // Lets find all the *direct* text node children.\n      var textNodeChildren = [];\n      var i = 0;\n      var childCount;\n\n      for (childCount = elemChildNodes.length; i < childCount; i++) {\n        if (elemChildNodes[i].nodeType === Node.TEXT_NODE) {\n          textNodeChildren.push(elemChildNodes[i]);\n        }\n      }\n\n      // Now we're going to check if any text node matches the pattern.\n      // Micro-optimization: check also if issueOccured == false, because we\n      // are not reporting more than one issue occurence.\n      for (i = 0; i < textNodeChildren.length && !issueOccured; i++) {\n        var curTextContent = textNodeChildren[i].nodeValue;\n\n        if (dateReg.test(curTextContent)) {\n          issueOccured = true;\n        }\n      }\n\n      var _case = Case({\n        element: element\n      });\n      test.add(_case);\n\n      // Only test if there is one date in the wrong format and call it.\n      _case.set({\n        status: issueOccured ? 'failed' : 'passed'\n      });\n    }\n\n    // Note it should also contain div, but that would lead to other issues.\n    var appliableElements = 'a, article, aside, b, blockquote, caption, cite, dd, del, div, em, figcaption, footer, h1, h2, h3, h4, h5, h6, header, i, label, legend, li, mark, nav, option, p, q, s, section, small, span, strong, sub, summary, sup, td, th, title, u';\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(appliableElements, scope).forEach(testDateFormat);\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Use a long date format'\n    },\n    description: {\n      en: 'Short date formats might confuse users, Always use the month name: 20 May 2014.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'KING'\n    ]\n  }\n};\nmodule.exports = KINGUseLongDateFormat;\n"
  },
  {
    "path": "src/assessments/KINGUsePercentageWithSymbol.js",
    "content": "var GetTextContentsComponent = require('GetTextContentsComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar KINGUsePercentageWithSymbol = {\n  run: function (test) {\n    function testPercentFormat (element) {\n      // Detect dates with several separators.\n      var percentName = [\n        'percent',\n        'pct\\\\.'\n      ];\n      // Test the words and any eventual extra letters for s and all.\n      var percentReg = new RegExp('\\\\d{1,}\\\\s*(' + percentName.join('|') + ')|(' + percentName.join('|') + ')\\\\s*\\\\d{1,}', 'ig');\n\n      var text = GetTextContentsComponent(element);\n      var _case = Case({\n        element: element\n      });\n      test.add(_case);\n\n      _case.set({\n        status: percentReg.test(text) ? 'failed' : 'passed'\n      });\n    }\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(testPercentFormat);\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Use a symbol within a percentage'\n    },\n    description: {\n      en: ''\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'KING'\n    ]\n  }\n};\nmodule.exports = KINGUsePercentageWithSymbol;\n"
  },
  {
    "path": "src/assessments/LabelDoesNotContainInput.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar LabelDoesNotContainInput = {\n  run: function (test) {\n\n    var selector = 'label';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n\n          if (DOM.scry('input', element).length > 0) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Label elements should not contain an input element',\n      nl: 'Labelelementen moeten geen invoerelementen bevatten'\n    },\n    description: {\n      en: 'Label elements should not wrap around another input element, as this can cause the label to be read twice by screen readers.',\n      nl: 'Labelelementen moeten niet om een ander invoerelement heenstaan, omdat dan het label twee keer kan worden voorgelezen door schermlezers.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = LabelDoesNotContainInput;\n"
  },
  {
    "path": "src/assessments/LabelMustBeUnique.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar LabelMustBeUnique = {\n  run: function (test) {\n    var labels = {};\n    test.get('scope').forEach(function (scope) {\n      let labelElements = DOM.scry('label[for]', scope);\n\n      labelElements.forEach(function (element) {\n        if (typeof labels[DOM.getAttribute(element, 'for')] === 'undefined') {\n          labels[DOM.getAttribute(element, 'for')] = 0;\n        }\n        labels[DOM.getAttribute(element, 'for')]++;\n      });\n\n      labelElements.forEach(function (element) {\n        var _case = Case({\n          element: element,\n          status: (labels[DOM.getAttribute(element, 'for')] === 1) ?\n            'passed' :\n            'failed'\n        });\n        test.add(_case);\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Every form input must have only one label',\n      nl: 'Elk formulierinvoerveld heeft maar een label'\n    },\n    description: {\n      en: 'Each form input should have only one <code>label</code> element.',\n      nl: 'Elk formulierinvoerveld mag maar een <code>label</code> element hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F17'\n          ]\n        },\n        '4.1.1': {\n          techniques: [\n            'F17'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = LabelMustBeUnique;\n"
  },
  {
    "path": "src/assessments/LabelMustNotBeEmpty.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar LabelMustNotBeEmpty = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'label',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Labels must contain text',\n      nl: 'Labels moeten tekst bevatten'\n    },\n    description: {\n      en: 'Labels in forms must contain readable text that describes the target form element.',\n      nl: 'Labels in formulieren moeten leesbare tekst bevatten die het formulierelement beschrijven.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H44',\n            'F68'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H44'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = LabelMustNotBeEmpty;\n"
  },
  {
    "path": "src/assessments/LabelsAreAssignedToAnInput.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar LabelsAreAssignedToAnInput = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry('label', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (!DOM.getAttribute(element, 'for')) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          var forAttr = DOM.getAttribute(element, 'for');\n          var forElement = DOM.scry('#' + forAttr, scope)[0];\n          if (\n            forElement &&\n            DOM.is(forElement, ':input')\n          ) {\n            _case.set({\n              status: 'passed'\n            });\n          }\n          else {\n            _case.set({\n              status: 'failed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All labels should be associated with an input',\n      nl: 'Alle labels moeten horen bij een invoerveld'\n    },\n    description: {\n      en: 'All <code>label</code> elements should be assigned to an input item, and should have a <em>for</em> attribute which equals the <em>id</em> attribute of a form element.',\n      nl: 'Alle <code>label</code>-elementen moeten horen bij een invoerveld, en moeten een een <em>for</em>-attribuut hebben dat hetzelfde is als het <em>id</em>-attribuut van een formulierelement.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = LabelsAreAssignedToAnInput;\n"
  },
  {
    "path": "src/assessments/LanguageChangesAreIdentified.js",
    "content": "var GetTextContentsComponent = require('GetTextContentsComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar guessLanguage = require('guessLanguage/lib/guessLanguage');\nvar LanguageChangesAreIdentified = {\n  run: function (test) {\n    var noCharactersMatch = function ($element, language, matches, regularExpression) {\n      var $children = DOM.scry('[lang=' + language + ']', $element);\n      var childMatches;\n      if ($children.length === 0) {\n        return true;\n      }\n      matches = matches.length;\n      $children.forEach(function (element) {\n        childMatches = GetTextContentsComponent(element).match(regularExpression);\n        if (childMatches) {\n          matches -= childMatches.length;\n        }\n      });\n      return matches > 0;\n    };\n\n    var findCurrentLanguage = function ($element, scope) {\n      if (DOM.hasAttribute($element, 'lang')) {\n        return DOM.getAttribute($element, 'lang').trim().toLowerCase().split('-')[0];\n      }\n      var langScope = DOM.parents($element).find((parent) => {\n        return DOM.hasAttribute(parent, 'lang');\n      })[0];\n      if (langScope) {\n        return DOM.getAttribute(langScope, 'lang').trim().toLowerCase().split('-')[0];\n      }\n      return LanguageComponent.getDocumentLanguage(scope, true);\n    };\n\n    test.get('scope').forEach((scope) => {\n      let currentLanguage = LanguageComponent.getDocumentLanguage(scope, true);\n      let text, matches, $element, failed;\n\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          var self = element;\n          $element = element;\n          currentLanguage = findCurrentLanguage($element, scope);\n          text = GetTextContentsComponent($element);\n          failed = false;\n\n          var singletons = LanguageComponent.scriptSingletons;\n          for (var code in singletons) {\n            if (singletons.hasOwnProperty(code)) {\n              var regularExpression = singletons[code];\n              if (code === currentLanguage) {\n                return;\n              }\n              matches = text.match(regularExpression);\n              if (matches && matches.length && noCharactersMatch($element, code, matches, regularExpression)) {\n                test.add(Case({\n                  element: self,\n                  info: {\n                    language: code\n                  },\n                  status: 'failed'\n                }));\n                failed = true;\n              }\n            }\n          }\n          var scripts = LanguageComponent.scripts;\n          for (var name in scripts) {\n            if (scripts.hasOwnProperty(name)) {\n              var script = scripts[name];\n            }\n            if (script.languageindexOf(currentLanguage) !== -1) {\n              return;\n            }\n            matches = text.match(script.regularExpression);\n            if (matches && matches.length && noCharactersMatch($element, name, matches, regularExpression)) {\n              test.add(Case({\n                element: self,\n                info: {\n                  language: name\n                },\n                status: 'failed'\n              }));\n              failed = true;\n            }\n          }\n          if (typeof guessLanguage !== 'undefined' && !DOM.scry('[lang]', $element).length && DOM.text($element).trim().length > 400) {\n            guessLanguage.info(DOM.text($element), function (info) {\n              if (info[0] !== currentLanguage) {\n                test.add(Case({\n                  element: self,\n                  info: {\n                    language: info[0]\n                  },\n                  status: 'failed'\n                }));\n                failed = true;\n              }\n            });\n          }\n          // Passes.\n          if (!failed) {\n            test.add(Case({\n              element: self,\n              status: 'passed'\n            }));\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use language attributes to indicate changes in language',\n      nl: 'Gebruik het taal-attribuut om aan te geven dat de taal verandert'\n    },\n    description: {\n      en: 'When the language of the document changes, make sure to wrap those changes in an element with the <code>lang</code> attribute.',\n      nl: 'Als de taal van het document verandert, zet deze veranderingen dan in een element met het <code>lang</code>-attribuut.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.2': {\n          techniques: [\n            'H58'\n          ]\n        }\n      }\n    },\n    tags: [\n      'language',\n      'content'\n    ]\n  }\n};\nmodule.exports = LanguageChangesAreIdentified;\n"
  },
  {
    "path": "src/assessments/LanguageDirAttributeIsUsed.js",
    "content": "var GetTextContentsComponent = require('GetTextContentsComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageDirAttributeIsUsed = {\n  run: function (test) {\n\n    var textDirection = LanguageComponent.textDirection;\n\n    function countDirAttributes (element) {\n      var currentDirection = DOM.getAttribute(element, 'dir');\n      if (!currentDirection) {\n        var dirScope = DOM.parents(element).find((parent) => {\n          return DOM.hasAttribute(parent, 'dir');\n        });\n        var parentDir = dirScope && DOM.getAttribute(dirScope, 'dir');\n        currentDirection = parentDir || currentDirection;\n      }\n      if (typeof currentDirection === 'string') {\n        currentDirection = currentDirection.toLowerCase();\n      }\n      if (typeof textDirection[currentDirection] === 'undefined') {\n        currentDirection = 'ltr';\n      }\n      var oppositeDirection = (currentDirection === 'ltr') ? 'rtl' : 'ltr';\n      var text = GetTextContentsComponent(element);\n      var textMatches = text.match(textDirection[oppositeDirection]);\n      if (!textMatches) {\n        return;\n      }\n      var matches = textMatches.length;\n      DOM.scry('[dir=' + oppositeDirection + ']', element).forEach(function () {\n        var childMatches = element.textContent.match(textDirection[oppositeDirection]);\n        if (childMatches) {\n          matches -= childMatches.length;\n        }\n      });\n\n      var _case = test.add(Case({\n        element: element\n      }));\n\n      _case.set({\n        status: (matches > 0) ? 'failed' : 'passed'\n      });\n    }\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(countDirAttributes);\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Use the dir attribute when the language direction changes',\n      nl: 'Gebruik het dir-attribuut als de richting van de taal verandert'\n    },\n    description: {\n      en: 'When there are nested directional changes in text, use an inline element with a <code>dir</code> attribute to indicate direction.',\n      nl: 'Gebruik een inline element met een <code>dir</code>-attribuut om richting aan te geven wanneer er geneste richtingsveranderingen in de tekst zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'H56'\n          ]\n        }\n      }\n    },\n    tags: [\n      'language',\n      'content'\n    ]\n  }\n};\nmodule.exports = LanguageDirAttributeIsUsed;\n"
  },
  {
    "path": "src/assessments/LanguageDirectionPunctuation.js",
    "content": "var GetTextContentsComponent = require('GetTextContentsComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageDirectionPunctuation = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      let punctuation = {};\n      let punctuationRegex = /[\\u2000-\\u206F]|[!\"#$%&'\\(\\)\\]\\[\\*+,\\-.\\/:;<=>?@^_`{|}~]/gi;\n      let currentDirection = (DOM.getAttribute(scope, 'dir')) ? DOM.getAttribute(scope, 'dir').toLowerCase() : 'ltr';\n      let oppositeDirection = (currentDirection === 'ltr') ? 'rtl' : 'ltr';\n      let textDirection = LanguageComponent.textDirection;\n\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          if (DOM.getAttribute(element, 'dir')) {\n            currentDirection = DOM.getAttribute(element, 'dir').toLowerCase();\n          }\n          else {\n            var dirScope = DOM.parents(element).find((parent) => {\n              return DOM.hasAttribute(parent, 'dir');\n            });\n            var dir = DOM.getAttribute(dirScope, 'dir');\n            currentDirection = dir || currentDirection;\n          }\n          if (typeof textDirection[currentDirection] === 'undefined') {\n            currentDirection = 'ltr';\n          }\n          oppositeDirection = (currentDirection === 'ltr') ? 'rtl' : 'ltr';\n          var text = GetTextContentsComponent(element);\n          var matches = text.match(textDirection[oppositeDirection]);\n          var _case = test.add(Case({\n            element: element\n          }));\n          if (!matches) {\n            _case.set({status: 'inapplicable'});\n            return;\n          }\n          var first = text.search(textDirection[oppositeDirection]);\n          var last = text.lastIndexOf(matches.pop());\n          while (punctuation = punctuationRegex.exec(text)) {\n            if (punctuation.index === first - 1 ||\n              punctuation.index === last + 1) {\n              _case.set({status: 'failed'});\n              return;\n            }\n          }\n          _case.set({status: 'passed'});\n        });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Place punctuation around language direction changes in the right order',\n      nl: 'Zet interpunctie bij richtingsveranderingen in taal in de juiste volgorde'\n    },\n    description: {\n      en: 'If punctuation is used around a change in language direction, ensure the punctuation appears in the correct place.',\n      nl: 'Als er interpunctie staat bij een richtingsverandering in de taal, zorg dat deze dan op de goede plek staat.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'G57'\n          ]\n        }\n      }\n    },\n    tags: [\n      'language',\n      'content'\n    ]\n  }\n};\nmodule.exports = LanguageDirectionPunctuation;\n"
  },
  {
    "path": "src/assessments/LanguageUnicodeDirection.js",
    "content": "var TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar LanguageComponent = require('LanguageComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar LanguageUnicodeDirection = {\n  run: function (test) {\n    var textDirection = LanguageComponent.textDirection;\n    var textDirectionChanges = LanguageComponent.textDirectionChanges;\n    test.get('scope').forEach(function (scope) {\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          var _case = test.add(Case({\n            element: element\n          }));\n          var $el = element;\n          var text = DOM.text($el).trim();\n          var otherDirection = (text.substr(0, 1).search(textDirection.ltr) !== -1) ?\n            'rtl' :\n            'ltr';\n          if (text.search(textDirection[otherDirection]) === -1) {\n            _case.set({status: 'inapplicable'});\n          }\n          else {\n            if (text.search(textDirectionChanges[otherDirection]) !== -1) {\n              _case.set({status: 'passed'});\n            }\n            else {\n              _case.set({status: 'failed'});\n            }\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Use the unicode language direction',\n      nl: 'Gebruik de unicode taalrichting'\n    },\n    description: {\n      en: 'When there are nested directional changes in language, use unicode RTL/LTR characters.',\n      nl: 'Gebruik de unicode RTL/LTR afkortingen als er geneste richtingsveranderingen in de taal zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'H34'\n          ]\n        }\n      }\n    },\n    tags: [\n      'language',\n      'content'\n    ]\n  }\n};\nmodule.exports = LanguageUnicodeDirection;\n"
  },
  {
    "path": "src/assessments/LegendTextNotEmpty.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar LegendTextNotEmpty = {\n  run: function (test) {\n\n    var selector = 'legend';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          if (DOM.text(element).trim().length > 0) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Legend text must not contain just whitespace',\n      nl: 'Legend-tekst moet ingevuld zijn'\n    },\n    description: {\n      en: 'If a <code>legend</code> element is used in a fieldset, the <code>legend</code> should not contain empty text.',\n      nl: 'Als een <code>legend</code>-element wordt gebruikt in een fieldset, moet de <code>legend</code> ingevuld zijn.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H71'\n          ]\n        },\n        '2.4.6': {\n          techniques: [\n            'G131'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H71'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = LegendTextNotEmpty;\n"
  },
  {
    "path": "src/assessments/LegendTextNotPlaceholder.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar LegendTextNotPlaceholder = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'legend',\n      content: 'true',\n      emtpy: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: '\\\"Legend\\\" text must not contain placeholder text',\n      nl: '\\\"Legend\\\"-tekst moet geen placeholdertekst bevatten'\n    },\n    description: {\n      en: 'If a <code>legend</code> element is used in a fieldset, the <code>legend</code> should not contain useless placeholder text like \\\"form\\\" or \\\"field\\\".',\n      nl: 'Als een <code>legend</code>-element wordt gebruikt in een fieldset, moet de <code>legend</code> geen placeholdertekst bevatten zoals \\\"form\\\" of \\\"field\\\".'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H71'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.4.6': {\n          techniques: [\n            'G131'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H71'\n          ]\n        },\n        '4.1.3': {\n          techniques: [\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = LegendTextNotPlaceholder;\n"
  },
  {
    "path": "src/assessments/LiDontUseImageForBullet.js",
    "content": "/**\n * @todo Needs refinement.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar LiDontUseImageForBullet = {\n  run: function (test) {\n\n    var selector = 'li';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'passed';\n          var hasImgChild = DOM.children(element).some(\n            (child) => DOM.is(child, 'img')\n          );\n          if (hasImgChild) {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    guidelines: [\n\n    ],\n    tags: [\n      'list',\n      'content'\n    ]\n  }\n};\nmodule.exports = LiDontUseImageForBullet;\n"
  },
  {
    "path": "src/assessments/LinkDoesNotChangeContextOnFocus.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar LinkDoesNotChangeContextOnFocus = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'a[href]',\n      searchEvent: 'onfocus'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Link elements must not contain an \\\"onfocus\\\" attribute',\n      nl: 'Link-elementen bevatten geen \\\"onfocus\\\"-attribuut'\n    },\n    description: {\n      en: 'Actions like \\\"onfocus\\\" can take control away from users who are trying to navigate the page. Using an \\\"onfocus\\\" attribute for things like links should be replaced with css.',\n      nl: 'Acties zoals \\\"onfocus\\\" kunnen de controle ontnemen van gebruikers die op een pagina proberen te navigeren. Het gebruik van een \\\"onfocus\\\"-attribuut voor zaken als links moet worden vervangen door middel van css.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = LinkDoesNotChangeContextOnFocus;\n"
  },
  {
    "path": "src/assessments/LinkHasAUniqueContext.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nconst TableHeadersComponent = require('TableHeadersComponent');\nvar LinkHasAUniqueContext = {\n  run: function (test) {\n\n    var blockStyle = [\n      'block',\n      'flex',\n      'list-item',\n      'table',\n      'table-caption',\n      'table-cell'\n    ];\n\n    function getLinkSentence (link) {\n      // Find the closest block-like element\n      var block = link;\n      var text = simplifyText(DOM.text(link));\n\n      while (!DOM.is(block, 'body, html') && blockStyle.indexOf(DOM.getComputedStyle(block, 'display')) === -1) {\n        block = block.parentNode;\n      }\n\n      var sentences = DOM.text(block).match(/[^\\.!\\?]+[\\.!\\?]+/g);\n      if (sentences === null) {\n        sentences = [DOM.text(block)];\n      }\n\n      for (var i = 0; i < sentences.length; i+= 1) {\n        if (simplifyText(sentences[i]).indexOf(text) !== -1) {\n          return sentences[i].trim();\n        }\n      }\n    }\n\n    function simplifyText (text) {\n      var tmp = text.match(/\\w+/g);\n      if (tmp !== null) {\n        text = tmp.join(' ');\n      }\n      return text.toLowerCase();\n    }\n\n    function txtNotAlike (a, b) {\n      return simplifyText('' + a) !== simplifyText('' + b);\n    }\n\n    function shareContext (linkA, linkB) {\n\n      if (linkA.href === linkB.href) {\n        return false;\n      }\n      else if (txtNotAlike(linkA.title, linkB.title)) {\n        return false;\n      }\n\n      // Find the nearest list item, paragraph or table cell of both items\n      var selector = 'p, li, dd, dt, td, th';\n      var linkACtxt = DOM.parents(linkA).find(\n        (parent) => DOM.is(parent, selector)\n      );\n      var linkBCtxt = DOM.parents(linkB).find(\n        (parent) => DOM.is(parent, selector)\n      );\n\n      // check if they are different\n      if (linkACtxt.length !== 0 && linkBCtxt.length !== 0 &&\n      txtNotAlike(getLinkText(linkACtxt), getLinkText(linkBCtxt))) {\n        return false;\n      }\n\n      // If one is a table cell and the other isn't, allow it\n      if (DOM.is(linkACtxt, 'td, th') && !DOM.is(linkBCtxt, 'td, th')) {\n        return false;\n\n      }\n      else if (DOM.is(linkACtxt, 'td, th') && DOM.is(linkBCtxt, 'td, th')) {\n        var headerDiff = false;\n        var headersA = [];\n\n        // Make a list with the simplified text of link A\n        TableHeadersComponent.tableHeaders(linkACtxt).forEach(function (element) {\n          headersA.push(simplifyText(element.innerText));\n        });\n\n        // Compare it to the header context of link B\n        TableHeadersComponent.tableHeaders(linkBCtxt).forEach(function (element) {\n          var text = simplifyText(element.innerText);\n          var pos = headersA.indexOf(text);\n          // Link B has something not part of link A's context, pass\n          if (pos === -1) {\n            headerDiff = true;\n          }\n          // Remove items part of both header lists\n          else {\n            headersA.splice(pos, 1);\n          }\n        });\n        // Pass if A or B had a header not part of the other.\n        if (headerDiff || headersA.length > 0) {\n          return false;\n        }\n      }\n\n      if (txtNotAlike(getLinkSentence(linkA), getLinkSentence(linkB))) {\n        return false;\n      }\n\n      return true;\n    }\n\n    /**\n     * Get the text value of the link, including alt attributes\n     * @param  {jQuery} link\n     * @return {string}\n     */\n    function getLinkText (link) {\n      var text = link.innerText;\n      DOM.scry('img[alt]', link).forEach(function (element) {\n        text += ' ' + element.alt.trim();\n      });\n      return simplifyText(text);\n    }\n\n    test.get('scope').forEach(function (scope) {\n      var links = DOM.scry('a[href]', scope)\n        .filter((element) => DOM.isVisible(element));\n      var linkMap = {};\n\n      if (links.length === 0) {\n        var _case = Case({\n          element: scope,\n          status: 'inapplicable'\n        });\n        test.add(_case);\n      }\n\n      // Make a map with the link text as key and an array of links with\n      // that link text as it's value\n      links.forEach(function (element) {\n        var text = getLinkText(element);\n        if (typeof linkMap[text] === 'undefined') {\n          linkMap[text] = [];\n        }\n        linkMap[text].push(element);\n      });\n\n      // Iterate over each item in the linkMap\n      for (var linkText in linkMap) {\n        if (linkMap.hasOwnProperty(linkText)) {\n          links = linkMap[linkText];\n        }\n        else {\n          continue;\n        }\n\n        // Link text is not unique, so the context should be checked\n        while (links.length > 1) {\n          var linkA = links.pop();\n          var linkAFailed = false;\n\n          for (var i = links.length - 1; i >= 0; i -= 1) {\n            var linkB = links[i];\n            if (shareContext(linkA, linkB)) {\n              linkAFailed = true;\n              links.splice(i, 1);\n              test.add(Case({\n                element: linkB,\n                status: 'failed'\n              }));\n            }\n          }\n          test.add(Case({\n            element: linkA,\n            status: (linkAFailed ? 'failed' : 'passed')\n          }));\n        }\n\n        // The link text is unique, pass\n        if (links.length === 1) {\n          test.add(Case({\n            element: links[0],\n            status: 'passed'\n          }));\n        }\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Links should have a unique context',\n      nl: 'Links moeten een unieke context hebben'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = LinkHasAUniqueContext;\n"
  },
  {
    "path": "src/assessments/LinkUsedForAlternateContent.js",
    "content": "/**\n * @todo Needs refinement.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar LinkUsedForAlternateContent = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('html', scope)\n        .filter((element) => {\n          let links = DOM.scry('link[rel=\"alternative\"]', element);\n          return links.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Use a \\\"link\\\" element for alternate content',\n      nl: 'Gebruik een \\\"link\\\"-element for andersoortige content'\n    },\n    description: {\n      en: 'Documents which contain things like videos, sound, or other forms of media that are not accessible, should provide a <code>link</code> element with a \\\"rel\\\" attribute of \\\"alternate\\\" in the document header.',\n      nl: 'Documenten die content zoals video\\'s, geluid of andere niet-toegankelijke vormen van media bevatten, moeten een <code>link</code>-element met een \\\"rel\\\"-attribuut of \\\"alternate\\\" in de documentheaderlink aanbieden.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'document'\n    ]\n  }\n};\nmodule.exports = LinkUsedForAlternateContent;\n"
  },
  {
    "path": "src/assessments/LinkUsedToDescribeNavigation.js",
    "content": "/**\n * @todo Needs refinement.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar LinkUsedToDescribeNavigation = {\n  run: function (test, options) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('html', scope)\n        .filter((element) => {\n          let links = DOM.scry('link', element)\n            .filter((element) => {\n              let rel = DOM.getAttribute(element, 'rel');\n              return rel === 'index';\n            });\n          return links.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The document uses link elements to describe navigation if it is within a collection.',\n      nl: 'Het document gebruikt link-elementen om navigatie te beschrijven wanneer het binnen een collectie staat.'\n    },\n    description: {\n      en: 'The link element can provide metadata about the position of an HTML page within a set of Web units or can assist in locating content with a set of Web units.',\n      nl: 'Het link-element kan metadata bevatten over de positie van een HTML-pagina binnen een swet web units, of kan behulpzaamn zijn bij het lokaliseren van content binnen web units.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'document'\n    ]\n  }\n};\nmodule.exports = LinkUsedToDescribeNavigation;\n"
  },
  {
    "path": "src/assessments/ListNotUsedForFormatting.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar ListNotUsedForFormatting = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('ol, ul', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        if (DOM.scry('li', element).length < 2) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Lists should not be used for formatting',\n      nl: 'Lijsten worden niet gebruikt voor opmaak'\n    },\n    description: {\n      en: 'Lists like <code>ul</code> and <code>ol</code> are to provide a structured list, and should not be used to format text. This test views any list with just one item as suspicious, but should be manually reviewed.',\n      nl: 'Lijsten zoals <code>ul</code> en <code>ol</code> zijn bedoeld om gestructureerde lijsten te maken. Ze moeten niet gebruikt worden om text op te maken. Controleer of deze lijst echt bedoeld is als lijst of om tekst op te maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'F1'\n          ]\n        }\n      }\n    },\n    tags: [\n      'list',\n      'content'\n    ]\n  }\n};\nmodule.exports = ListNotUsedForFormatting;\n"
  },
  {
    "path": "src/assessments/ListOfLinksUseList.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar ListOfLinksUseList = {\n  run: function (test) {\n    var unreadableText = /(♦|›|»|‣|▶|.|◦|>|✓|◽|•|—|◾|\\||\\*|&bull;|&#8226;)/g;\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        // Only test if there's another a tag.\n        var next = DOM.next(element);\n        if (next && DOM.is(next, 'a')) {\n          var nextText = element.nextSibling.wholeText.replace(unreadableText, '');\n          if (!DOM.is(element.parentElement, 'li') && IsUnreadable(nextText)) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n          else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A list of links separated by non-readable characters should be in an ul or ol',\n      nl: 'Een lijst van links die worden gescheiden door onleesbare tekens moeten in een bulleted of genummerde lijst staan'\n    },\n    description: {\n      en: 'A list of links without separation between them should be placed in an ol or ul element.',\n      nl: 'Een lijst van links die niet duidelijk gescheiden zijn moeten in een bulleted of genummerde lijst staan.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H48'\n          ]\n        }\n      }\n    },\n    tags: [\n      'link',\n      'content'\n    ]\n  }\n};\nmodule.exports = ListOfLinksUseList;\n"
  },
  {
    "path": "src/assessments/MarqueeIsNotUsed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar MarqueeIsNotUsed = {\n  run: function (test) {\n\n    var selector = 'marquee';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'The \\\"marquee\\\" tag should not be used',\n      nl: 'De \\\"marquee\\\"-tag wordt niet gebruikt'\n    },\n    description: {\n      en: 'The <code>marquee</code> element is difficult for users to read and is not a standard HTML element. Try to find another way to convey the importance of this text.',\n      nl: 'Het <code>marquee</code>-element is moeilijk te lezen voor gebruikers en is geen standaard HTML-element. Gebruik een andere manier om aan te duiden dat het belangrijke content is.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'content'\n    ]\n  }\n};\nmodule.exports = MarqueeIsNotUsed;\n"
  },
  {
    "path": "src/assessments/NewWindowIsOpened.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar NewWindowIsOpened = {\n  run: function (test) {\n\n    var _case;\n\n    window.addEventListener('click', function (event) {\n      event.preventDefault();\n    });\n\n    window.open = function (event) {\n      test.forEach(function (_case) {\n        var href = _case.get('element').href;\n        if (href.indexOf(event) > -1) {\n          _case.set('status', 'failed');\n        }\n      });\n    };\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('a', scope).forEach(function (element) {\n        // Save a reference to this clicked tag.\n        _case = Case({\n          element: element\n        });\n        test.add(_case);\n      });\n    });\n    test.forEach(function (_case) {\n      let element = _case.get('element');\n      if (element && element.click) {\n        element.click();\n      }\n    });\n\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'A link should not open a new window',\n      nl: 'Een link opent geen nieuw scherm'\n    },\n    description: {\n      en: 'Avoid confusion that may be caused by the appearance of new windows that were not requested by the user.',\n      nl: 'Voorkom verwarring die veroorzaakt wordt door het openen van nieuwe schermen die de gebruiker niet verwacht.'\n    },\n    guidelines: {\n      wcag: {\n        '2.0.0': {\n          techniques: [\n            'H83'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript',\n      'html'\n    ]\n  }\n};\nmodule.exports = NewWindowIsOpened;\n"
  },
  {
    "path": "src/assessments/NoembedHasEquivalentContent.js",
    "content": "/**\n * @todo Needs refinement.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar NoembedHasEquivalentContent = {\n  run: function (test, options) {\n\n    var selector = 'noembed';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Noembed elements must be the same content as their \\\"embed\\\" element',\n      nl: 'Noembed-elementen moeten dezelfde content hebben als hun \\\"embed\\\"-element'\n    },\n    description: {\n      en: 'All <code>noembed</code> elements must contain or link to an accessible version of their <code>embed</code> counterparts.',\n      nl: 'Alle <code>noembed</code>-elementen moeten een toegankelijke versie van hun <code>embed</code>-tegenhangers bevatten of hier naar linken.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = NoembedHasEquivalentContent;\n"
  },
  {
    "path": "src/assessments/NoframesSectionMustHaveTextEquivalent.js",
    "content": "/**\n * @todo Needs refinement.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar NoframesSectionMustHaveTextEquivalent = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('frameset', scope)\n        .filter((element) => {\n          let noframes = DOM.scry('noframes', element);\n          return noframes.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All \\\"noframes\\\" elements should contain the text content from all frames',\n      nl: 'Alle \\\"noframes\\\"-elementen moeten de content van alle frames bevatten'\n    },\n    description: {\n      en: 'The <code>noframes</code> content should either replicate or link to the content visible within the frames.',\n      nl: 'The <code>noframes</code>-content moet de zichtbare content binnen de frames repliceren of er naar linken.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'deprecated',\n      'frame'\n    ]\n  }\n};\nmodule.exports = NoframesSectionMustHaveTextEquivalent;\n"
  },
  {
    "path": "src/assessments/ObjectContentUsableWhenDisabled.js",
    "content": "/**\n * @todo Needs refinement.\n *\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectContentUsableWhenDisabled = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'When objects are disabled, content should still be available',\n      nl: 'Als objecten zijn uitgeschakeld, moet de content nog wel beschikbaar zijn'\n    },\n    description: {\n      en: 'The content within objects should still be available, even if the object is disabled. To do this, place a link to the direct object source within the <code>object</code> tag.',\n      nl: 'Content binnen objecten moet beschikbaar blijven, ook als het object is uitgeschakeld. Plaats hiervoor een link naar de bron van het object binnen de <code>object</code>-tag.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectContentUsableWhenDisabled;\n"
  },
  {
    "path": "src/assessments/ObjectDoesNotFlicker.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectDoesNotFlicker = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Objects do not flicker',\n      nl: 'Objecten knipperen of flitsen niet'\n    },\n    description: {\n      en: 'The content within an <code>object</code> tag must not flicker.',\n      nl: 'De content binnen een <code>object</code>-tag knippert of flitst niet.'\n    },\n    guidelines: {\n      508: [\n        'j'\n      ],\n      wcag: {\n        '2.2.2': {\n          techniques: [\n            'F7'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectDoesNotFlicker;\n"
  },
  {
    "path": "src/assessments/ObjectDoesNotUseColorAlone.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectDoesNotUseColorAlone = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Objects must not use color to communicate alone',\n      nl: 'Objecten gebruiken meer dan alleen kleur om hun boodschap over te brengen'\n    },\n    description: {\n      en: 'Objects should contain content that makes sense without color and is accessible to users who are color blind.',\n      nl: 'Objecten moeten content bevatten die duidelijk is zonder het kleurgebruik en toegankelijk is voor gebruikers met kleurenblindheid.'\n    },\n    guidelines: {\n      508: [\n        'c'\n      ]\n    },\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectDoesNotUseColorAlone;\n"
  },
  {
    "path": "src/assessments/ObjectInterfaceIsAccessible.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectInterfaceIsAccessible = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Interfaces within objects must be accessible',\n      nl: 'Interfaces binnen objecten moeten toegankelijk zijn'\n    },\n    description: {\n      en: 'Object content should be assessed for accessibility.',\n      nl: 'Content binnen objecten moeten gecontroleerd worden op toegankelijkheid.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectInterfaceIsAccessible;\n"
  },
  {
    "path": "src/assessments/ObjectLinkToMultimediaHasTextTranscript.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectLinkToMultimediaHasTextTranscript = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Objects which reference multimedia files should also provide a link to a transcript',\n      nl: 'Objecten die verwijzen naar multimediabestanden moeten ook een link aanbieden naar de transcriptie'\n    },\n    description: {\n      en: 'If an object contains a video, a link to the transcript should be provided near the object.',\n      nl: 'Als een object een video bevat, moet een link naar de transcriptie hiervan worden aangeboden bij het object.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectLinkToMultimediaHasTextTranscript;\n"
  },
  {
    "path": "src/assessments/ObjectMustContainText.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ObjectMustContainText = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'object',\n      content: 'true',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects must contain their text equivalents',\n      nl: 'Objecten moeten hun tekstuele equivalent bevatten'\n    },\n    description: {\n      en: 'All <code>object</code> elements should contain a text equivalent if the object cannot be rendered.',\n      nl: 'Alle <code>object</code>-elementen moeten een tekstequivalent bevatten in het geval het object niet getoond kan worden.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'FLASH1',\n            'H27'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectMustContainText;\n"
  },
  {
    "path": "src/assessments/ObjectMustHaveEmbed.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar ObjectMustHaveEmbed = {\n  run: function (test) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasEmbed = DOM.scry('embed', element).length > 0;\n\n          // If a test is defined, then use it\n          if (hasEmbed) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Every object should contain an \\\"embed\\\" element',\n      nl: 'Elk object moet een \\\"embed\\\"-element bevatten'\n    },\n    description: {\n      en: 'Every <code>object</code> element must also contain an <code>embed</code> element.',\n      nl: 'Elk <code>object</code>-element moet ook een \\\"embed\\\"-element bevatten.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectMustHaveEmbed;\n"
  },
  {
    "path": "src/assessments/ObjectMustHaveTitle.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectMustHaveTitle = {\n  run: function (test) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasTitle = element.hasAttribute('title');\n\n          // If a test is defined, then use it\n          if (hasTitle) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects should have a title attribute',\n      nl: 'Objecten moeten een titelattribuut hebben'\n    },\n    description: {\n      en: 'All <code>object</code> elements should contain a \\\"title\\\" attribute.',\n      nl: 'Alle <code>object</code>-elementen moeten een \\\"titel\\\"-attribuut bevatten.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H27'\n          ]\n        }\n      }\n    },\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectMustHaveTitle;\n"
  },
  {
    "path": "src/assessments/ObjectMustHaveValidTitle.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar ObjectMustHaveValidTitle = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'object',\n      attribute: 'title',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects must not have an empty title attribute',\n      nl: 'Objecten hebben geen leeg titelattribuut'\n    },\n    description: {\n      en: 'All <code>object</code> elements should have a \\\"title\\\" attribute which is not empty.',\n      nl: 'All <code>object</code>-elementen hebben een \\\"titel\\\"-attribuut dat gevuld is.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectMustHaveValidTitle;\n"
  },
  {
    "path": "src/assessments/ObjectProvidesMechanismToReturnToParent.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectProvidesMechanismToReturnToParent = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All objects should provide a way for keyboard users to escape',\n      nl: 'Alle objecten moeten een manier bevatten voor toetsenbordgebruikers een manier om het object te verlaten'\n    },\n    description: {\n      en: 'Ensure that a user who has only a keyboard as an input device can escape a <code>object</code> element. This requires manual confirmation.',\n      nl: 'Zorg ervoor dat een gebruiker die alleen het toetsenbord als bediening gebruikt een <code>object</code>-element. Hiervoor is handmatige bevestiging nodig.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectProvidesMechanismToReturnToParent;\n"
  },
  {
    "path": "src/assessments/ObjectShouldHaveLongDescription.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectShouldHaveLongDescription = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'An object might require a long description',\n      nl: 'Een object heeft soms een lange beschrijving nodig'\n    },\n    description: {\n      en: 'Objects might require a long description, especially if their content is complicated.',\n      nl: 'Objecten hebben soms een lange beschrijving nodig, zeker in het geval van ingewikkelde content.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectShouldHaveLongDescription;\n"
  },
  {
    "path": "src/assessments/ObjectTextUpdatesWhenObjectChanges.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectTextUpdatesWhenObjectChanges = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The text equivalents of an object should update if the object changes',\n      nl: 'De tekstuele equivalent van een object moet bijgewerkt worden als het object verandert'\n    },\n    description: {\n      en: 'If an object changes, the text equivalent of that object should also change.',\n      nl: 'Als een object verandert, moet zijn tekstuele equivalent ook veranderen.'\n    },\n    guidelines: {\n      508: [\n        'a'\n      ]\n    },\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectTextUpdatesWhenObjectChanges;\n"
  },
  {
    "path": "src/assessments/ObjectUIMustBeAccessible.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectUIMustBeAccessible = {\n  run: function (test, options) {\n\n    var selector = 'object';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Content within an \\\"object\\\" element should be usable with objects disabled',\n      nl: 'Content binnen een \\\"object\\\"-element moet bruikbaar blijven als het object uitgeschakeld is'\n    },\n    description: {\n      en: 'Objects who\\'s content changes using java, ActiveX, or other similar technologies, should have their default text change when the object\\'s content changes.',\n      nl: 'Van objecten waarvan de content java, ActiveX of vergelijkbare technologie�n gebruiken, moet de standaardtekst veranderen als de content van het object verandert.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectUIMustBeAccessible;\n"
  },
  {
    "path": "src/assessments/ObjectWithClassIDHasNoText.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ObjectWithClassIDHasNoText = {\n  run: function (test, options) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('object[classid]', scope)\n        .filter((element) => /\\S/.test(element.innerHTML));\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Objects with \\\"classid\\\" attributes should change their text if the content of the object changes',\n      nl: 'Objecten met \\\"classid\\\"-attributen moeten hun tekst veranderen wanneer de content van het object verandert'\n    },\n    description: {\n      en: 'Objects with \\\"classid\\\" attributes, should have their default text change when the object\\'s content changes.',\n      nl: 'Van objecten met \\\"classid\\\"-attributen moet de standaardtekst veranderen als de content van het object verandert.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'objects',\n      'content'\n    ]\n  }\n};\nmodule.exports = ObjectWithClassIDHasNoText;\n"
  },
  {
    "path": "src/assessments/PNotUsedAsHeader.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar SuspectPHeaderTags = require('SuspectPHeaderTags');\nvar SuspectPCSSStyles = require('SuspectPCSSStyles');\nvar PNotUsedAsHeader = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        var $paragraph = element;\n\n        // If the text has a period, it is probably a sentence and not a header.\n        if (DOM.text($paragraph).search(/[\\.!:;]/) >= 1) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n        var failed = false;\n        // Look for any indication that the paragraph contains at least a full sentence\n        if (DOM.text(element).search(/[\\.!:;]/) < 1) {\n          var priorParagraph = DOM.prev($paragraph);\n          if (!priorParagraph || !DOM.is(priorParagraph, 'p')) {\n            priorParagraph = [];\n          }\n          // Checking if any of SuspectPHeaderTags has exact the same text as a paragraph.\n          SuspectPHeaderTags.forEach(function (tag) {\n            if (DOM.scry(tag, $paragraph).length) {\n              DOM.scry(tag, $paragraph).forEach(function (element) {\n                if (DOM.text(element).trim() === DOM.text($paragraph).trim()) {\n                  _case.set({\n                    status: 'failed'\n                  });\n                  failed = true;\n                }\n              });\n            }\n          });\n          // Checking if previous paragraph has a different values for style properties given in SuspectPCSSStyles.\n          if (priorParagraph.length) {\n            SuspectPCSSStyles.forEach(function (cssProperty) {\n              if (DOM.getComputedStyle($paragraph, cssProperty) !== DOM.getComputedStyle(priorParagraph, cssProperty)) {\n                _case.set({\n                  status: 'failed'\n                });\n                failed = true;\n                return false; // Micro optimization - we no longer need to iterate here. jQuery css() method might be expensive.\n              }\n            });\n          }\n          if (DOM.getComputedStyle($paragraph, 'font-weight') === 'bold') {\n            _case.set({\n              status: 'failed'\n            });\n            failed = true;\n          }\n        }\n        if (!failed) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Paragraphs must not be used for headers',\n      nl: 'Alinea\\'s worden niet gebruikt als header'\n    },\n    description: {\n      en: 'Headers like <code>h1</code> - <code>h6</code> are extremely useful for non-sighted users to navigate the structure of the page, and formatting a paragraph to just be big or bold, while it might visually look like a header, does not make it one.',\n      nl: 'Headers van <code>h1</code> - <code>h6</code> zijn handig voor blinde en slechtziende gebruikers om door een pagina te navigeren. Maak alinea\\'s daarom niet op zodat deze lijkt op een header. Dit werkt verwarrend.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'G141',\n            'H42'\n          ]\n        },\n        '2.4.10': {\n          techniques: [\n            'G141'\n          ]\n        }\n      }\n    },\n    tags: [\n      'header',\n      'content'\n    ]\n  }\n};\nmodule.exports = PNotUsedAsHeader;\n"
  },
  {
    "path": "src/assessments/ParagarphIsWrittenClearly.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar TextStatisticsComponent = require('TextStatisticsComponent');\nvar ParagraphIsWrittenClearly = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('p', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var text = TextStatisticsComponent.cleanText(DOM.text(element));\n        if (Math.round((206.835 - (1.015 * TextStatisticsComponent.averageWordsPerSentence(text)) - (84.6 * TextStatisticsComponent.averageSyllablesPerWord(text)))) < 60) {\n          _case.set({\n            status: 'failed'\n          });\n        }\n        else {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The paragraph should be written to the target audience and read clearly',\n      nl: 'Het paragraph moet geschreven zijn op het niveau van de doelgroep'\n    },\n    description: {\n      en: 'If a paragraph is beyond a 10th grade level, then a summary or other guide should also be provided to guide the user through the content.',\n      nl: 'Als de inhoud van een paragraph moeilijker is dan het vastgestelde taalniveau, moet een samenvatting of andere begeleiding worden toegevoegd om de gebruiker te helpen met de content.'\n    },\n    guidelines: {\n      wcag: {\n        '3.1.5': {\n          techniques: [\n            'G86'\n          ]\n        }\n      }\n    },\n    tags: [\n      'language',\n      'content'\n    ]\n  }\n};\nmodule.exports = ParagraphIsWrittenClearly;\n"
  },
  {
    "path": "src/assessments/PasswordHasLabel.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar PasswordHasLabel = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'input[type=\"password\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All password input elements should have a corresponding label',\n      nl: 'Alle paswoordinvoerelementen hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements with a type of \\\"password\\\"should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen van het type \\\"paswoord\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: [\n        'n'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H44',\n            'F68'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H44',\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = PasswordHasLabel;\n"
  },
  {
    "path": "src/assessments/PreShouldNotBeUsedForTabularLayout.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar PreShouldNotBeUsedForTabularLayout = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('pre', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n        var rows = DOM.text(element).split(/[\\n\\r]+/);\n        _case.set({\n          status: (rows.length > 1 && DOM.text(element).search(/\\t/) > -1) ? 'failed' : 'passed'\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Pre elements should not be used for tabular data',\n      nl: 'Pre-elementen worden niet gebruikt om data als tabel te rangschikken'\n    },\n    description: {\n      en: 'If a <code>pre</code> element is used for tabular data, change the data to use a well-formed table.',\n      nl: 'Als een <code>pre</code>-element wordt gebruikt om data als tabel te rangschikken, verander de data dan zodat je een echte tabel kunt maken.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F33',\n            'F34',\n            'F48'\n          ]\n        },\n        '1.3.2': {\n          techniques: [\n            'F33',\n            'F34'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = PreShouldNotBeUsedForTabularLayout;\n"
  },
  {
    "path": "src/assessments/RadioHasLabel.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar RadioHasLabel = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'input[type=\"radio\"]'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All \\\"radio\\\" input elements have a corresponding label',\n      nl: 'Alle invoerelementen van het type \\\"radio\\\" hebben een bijbehorend label'\n    },\n    description: {\n      en: 'All <code>input</code> elements of type \\\"radio\\\" should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>input</code>-elementen van het \\\"radio\\\" moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      508: [\n        'n'\n      ],\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H44',\n            'F68'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H44',\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = RadioHasLabel;\n"
  },
  {
    "path": "src/assessments/RadioMarkedWithFieldgroupAndLegend.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar RadioMarkedWithFieldgroupAndLegend = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('input[type=radio]', scope)\n        .filter((element) => {\n          let parents = DOM.parents(element)\n            .filter((element) => DOM.is(element, 'fieldset'));\n          return parents.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All radio button groups are marked using fieldset and legend elements',\n      nl: 'Alle groepjes van radio buttons zijn gemarkeerd met fieldset- en legend-elementen'\n    },\n    description: {\n      en: 'Form element content must contain both fieldset and legend elements if there are related radio buttons.',\n      nl: 'Content van formulierelementen moeten zowel fieldset- als legend-elementen bevatten als er gerelateerde radio buttons instaan.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H71'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H71'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = RadioMarkedWithFieldgroupAndLegend;\n"
  },
  {
    "path": "src/assessments/ScriptContentAccessibleWithScriptsTurnedOff.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ScriptContentAccessibleWithScriptsTurnedOff = {\n  run: function (test, options) {\n\n    var selector = 'script';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Content on the page should still be available if scripts are disabled',\n      nl: 'Content op de pagina moet beschikbaar blijven als scripts zijn uitgeschakeld'\n    },\n    description: {\n      en: 'All scripts should be assessed to see if, when the user is browsing with scrips turned off, the page content is still available.',\n      nl: 'Alle scripts moeten gecontroleerd worden of, wanneer een gebruiker scripts heeft uitgezet, de content van de pagina nog steeds beschikbaar is.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptContentAccessibleWithScriptsTurnedOff;\n"
  },
  {
    "path": "src/assessments/ScriptFocusIndicatorVisible.js",
    "content": "var ConvertToPxComponent = require('ConvertToPxComponent');\nconst DOM = require('DOM');\nvar FocusElements = require('FocusElements');\n\nvar ScriptFocusIndicatorVisible = {\n  run: function () {\n    FocusElements().forEach(function (element) {\n\n      // Preparation for test: remove focus indicators done with CSS\n      var sheet, rules, rulesCache, rule;\n\n      rulesCache = [];\n\n      for (var i = 0, l = document.styleSheets.length; i < l; ++i) {\n        sheet = document.styleSheets[i];\n        rules = sheet.cssRules || sheet.rules;\n\n        for (var j = rules.length - 1; j >= 0; --j) {\n          rule = rules[j];\n          if (rule.selectorText && rule.selectorText.indexOf(':focus') !== -1) {\n            rulesCache.push({\n              css: rule.cssText,\n              index: j,\n              sheet: i\n            });\n\n            sheet.deleteRule(j);\n          }\n        }\n      }\n\n      var noFocus = {\n        borderWidth: DOM.getComputedStyle(element, 'border-width'),\n        borderColor: DOM.getComputedStyle(element, 'border-color'),\n        backgroundColor: DOM.getComputedStyle(element, 'background-color'),\n        boxShadow: DOM.getComputedStyle(element, 'box-shadow'),\n        outlineWidth: DOM.getComputedStyle(element, 'outline-width'),\n        outlineColor: DOM.getComputedStyle(element, 'outline-color')\n      };\n\n      element.focus();\n\n      // it is sufficient to not remove the default outline on focus: pass test\n      var outlineWidth = ConvertToPxComponent(DOM.getComputedStyle(element, 'outline-width'));\n      if (outlineWidth > 2 && outlineWidth !== ConvertToPxComponent(noFocus.outlineWidth)) {\n        element.blur();\n        return;\n      }\n\n      // in any other case, it is acceptable to change other visual components\n\n      if (noFocus.backgroundColor !== DOM.getComputedStyle(element, 'background-color')) {\n        element.blur();\n        return;\n      }\n\n      var borderWidth = ConvertToPxComponent(DOM.getComputedStyle(element, 'border-width'));\n      if (borderWidth > 2 && borderWidth !== ConvertToPxComponent(noFocus.borderWidth)) {\n        element.blur();\n        return;\n      }\n\n      var boxShadow = (DOM.getComputedStyle(element, 'box-shadow') && DOM.getComputedStyle(element, 'box-shadow') !== 'none') ? DOM.getComputedStyle(element, 'box-shadow').match(/(-?\\d+px)|(rgb\\(.+\\))/g) : false;\n      if (boxShadow && DOM.getComputedStyle(element, 'box-shadow') !== noFocus.boxShadow && ConvertToPxComponent(boxShadow[3]) > 3) {\n        element.blur();\n        return;\n      }\n\n      element.blur();\n\n      var ruleCache;\n\n      for (var k = rulesCache.length - 1; k >= 0; --i) {\n        ruleCache = rulesCache[k];\n\n        document.styleSheets[ruleCache.sheet].insertRule(ruleCache.css, ruleCache.index);\n      }\n    });\n  },\n\n  meta: {\n    title: {\n      en: 'Script focus indicators have high visibility',\n      nl: 'Script focus indicatoren zijn goed zichtbaar'\n    },\n    description: {\n      en: 'When a focus indicator is used with script, it should have enough contrast with the background and big enough to be highly visible.',\n      nl: 'Wanneer je een focus indicator gebruikt met script, moet het contrast tussen de indicator en de achtergrond groot genoeg zijn in verband met de zichtbaarheid.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.7': {\n          techniques: [\n            'C15',\n            'G165',\n            'G195',\n            'SCR31'\n          ]\n        }\n      }\n    },\n    tags: [\n      'focus',\n      'content'\n    ]\n  }\n};\nmodule.exports = ScriptFocusIndicatorVisible;\n"
  },
  {
    "path": "src/assessments/ScriptInBodyMustHaveNoscript.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ScriptInBodyMustHaveNoscript = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('body', scope)\n        .filter((element) => {\n          let noscripts = DOM.scry('noscript', element);\n          let scripts = DOM.scry('script', element);\n          return noscripts.length === 0 && scripts.length > 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Scripts should have a corresponding \\\"noscript\\\" element',\n      nl: 'Scripts moeten een bijbehorend \\\"noscript\\\"-element hebben'\n    },\n    description: {\n      en: 'Scripts should be followed by a <code>noscripts</code> element to guide the user to content in an alternative way.',\n      nl: 'Scripts moeten worden gevolgd door een <code>noscripts</code>-element om de gebruiker de weg te wijzen naar de content op een andere manier.'\n    },\n    guidelines: {\n      508: [\n        'l'\n      ]\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptInBodyMustHaveNoscript;\n"
  },
  {
    "path": "src/assessments/ScriptOnFocusChangeBackgroundOrBorder.js",
    "content": "/**\n * Test scriptOnFocusChangeBackgroundOrBorder.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ScriptOnFocusChangeBackgroundOrBorder = {\n  run: function (test) {\n    var buildCase = function (element, status, id, message) {\n      test.add(Case({\n        element: element,\n        message: message,\n        status: status\n      }));\n    };\n\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('input,button,a', scope).forEach(function (element) {\n        var $this = element;\n\n        var noFocus = {\n          background: DOM.getComputedStyle($this, 'background'),\n          border: DOM.getComputedStyle($this, 'border')\n        };\n\n        $this.focus();\n\n        // Blur and make sure all changes are reverted.\n        $this.blur();\n        if (noFocus.background !== DOM.getComputedStyle($this, 'background') || noFocus.border !== DOM.getComputedStyle($this, 'border')) {\n          buildCase(this, 'failed', null, 'Using script to change the background color or border of the element with focus');\n        }\n        else {\n          buildCase(this, 'passed', null, 'Using script to change the background color or border of the element with focus');\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Using script to change the background color or border of the element with focus'\n    },\n    description: {\n      en: 'Using script to change the background color or border of the element with focus'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.7': {\n          techniques: [\n            'SCR31'\n          ]\n        }\n      }\n    },\n    tags: [\n      'content'\n    ]\n  }\n};\nmodule.exports = ScriptOnFocusChangeBackgroundOrBorder;\n"
  },
  {
    "path": "src/assessments/ScriptOnclickRequiresOnKeypress.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnclickRequiresOnKeypress = {\n  run: function (test, options) {\n    options = options || {\n      selector: '[onclick]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'onclick'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has an \\\"onclick\\\" attribute it should also have an \\\"onkeypress\\\" attribute',\n      nl: 'Als een element een \\\"onclick\\\"-attribuut heeft, moet het ook een \\\"onkeypress\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has an \\\"onclick\\\" attribute it should also have an \\\"onkeypress\\\" attribute',\n      nl: 'Als een element een \\\"onclick\\\"-attribuut heeft, moet het ook een \\\"onkeypress\\\"-attribuut hebben'\n    },\n    guidelines: {\n      508: [\n        'l'\n      ],\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'G90',\n            'SCR2',\n            'SCR20'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'G90',\n            'SCR20'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptOnclickRequiresOnKeypress;\n"
  },
  {
    "path": "src/assessments/ScriptOndblclickRequiresOnKeypress.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOndblclickRequiresOnKeypress = {\n  run: function (test, options) {\n    options = options || {\n      selector: '[ondblclick]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'ondblclick'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any element with an \\\"ondblclick\\\" attribute should have a keyboard-related action as well',\n      nl: 'Elk element met een \\\"ondblclick\\\"-attribuut moet een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord'\n    },\n    description: {\n      en: 'If an element has an \\\"ondblclick\\\" attribute, it should also have a keyboard-related action.',\n      nl: 'Als een element een \\\"ondblclick\\\"-attribuut heeft, moet het ook een actie bevatten die kan worden uitgevoerd met een toetsenbord.'\n    },\n    guidelines: {\n      508: [\n        'l'\n      ],\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'G90',\n            'SCR2',\n            'SCR20'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'G90',\n            'SCR20'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptOndblclickRequiresOnKeypress;\n"
  },
  {
    "path": "src/assessments/ScriptOnmousedownRequiresOnKeypress.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmousedownRequiresOnKeypress = {\n  run: function (test, options) {\n    options = options || {\n      selector: '[onmousedown]',\n      correspondingEvent: 'onkeydown',\n      searchEvent: 'onmousedown'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"mousedown\\\" attribute it should also have an \\\"onkeydown\\\" attribute',\n      nl: 'Als een element een \\\"mousedown\\\"-attribuut heeft moet het ook een \\\"onkeydown\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"mousedown\\\" attribute it should also have an \\\"onkeydown\\\" attribute.',\n      nl: 'Als een element een \\\"mousedown\\\"-attribuut heeft moet het ook een \\\"onkeydown\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: [\n        'l'\n      ],\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'G90',\n            'SCR2',\n            'SCR20'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'G90',\n            'SCR20'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptOnmousedownRequiresOnKeypress;\n"
  },
  {
    "path": "src/assessments/ScriptOnmousemove.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmousemove = {\n  run: function (test, options) {\n    options = options || {\n      selector: '[onmousemove]',\n      correspondingEvent: 'onkeypress',\n      searchEvent: 'onmousemove'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Any element with an \\\"onmousemove\\\" attribute should have a keyboard-related action as well',\n      nl: 'Elk element met een \\\"onmousemove\\\"-attribuut moet een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord'\n    },\n    description: {\n      en: 'If an element has an \\\"onmousemove\\\" attribute it should have a keyboard-related action as well.',\n      nl: 'Als een element een \\\"onmousemove\\\"-attribuut heeft, moet het een vergelijkbare actie hebben die kan worden uitgevoerd met een toetsenbord.'\n    },\n    guidelines: {\n      508: [\n        'l'\n      ],\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'G90',\n            'SCR2',\n            'SCR20'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'G90',\n            'SCR20'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptOnmousemove;\n"
  },
  {
    "path": "src/assessments/ScriptOnmouseoutHasOnmouseblur.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseoutHasOnmouseblur = {\n  run: function (test, options) {\n    options = options || {\n      selector: '[onmouseout]',\n      correspondingEvent: 'onblur',\n      searchEvent: 'onmouseout'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseout\\\" attribute it should also have an \\\"onblur\\\" attribute',\n      nl: 'Als een element een \\\"onmouseout\\\"-attribuut heeft, moet het ook een \\\"onblur\\\" attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseout\\\" attribute it should also have an \\\"onblur\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseout\\\"-attribuut heeft, moet het ook een \\\"onblur\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: [\n        'l'\n      ],\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'G90',\n            'SCR2',\n            'SCR20'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'G90',\n            'SCR20'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptOnmouseoutHasOnmouseblur;\n"
  },
  {
    "path": "src/assessments/ScriptOnmouseoverHasOnfocus.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseoverHasOnfocus = {\n  run: function (test, options) {\n    options = options || {\n      selector: '[onmouseover]',\n      correspondingEvent: 'onfocus',\n      searchEvent: 'onmouseover'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseover\\\" attribute it should also have an \\\"onfocus\\\" attribute',\n      nl: 'Als een element een \\\"onmouseover\\\"-attribuut heeft, moet het ook een \\\"onfocus\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseover\\\" attribute it should also have an \\\"onfocus\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseover\\\"-attribuut heeft, moet het ook een \\\"onfocus\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: [\n        'l'\n      ],\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'G90',\n            'SCR2',\n            'SCR20'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'G90',\n            'SCR20'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptOnmouseoverHasOnfocus;\n"
  },
  {
    "path": "src/assessments/ScriptOnmouseupHasOnkeyup.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar ScriptOnmouseupHasOnkeyup = {\n  run: function (test, options) {\n    options = options || {\n      selector: '[onmouseup]',\n      correspondingEvent: 'onkeyup',\n      searchEvent: 'onmouseup'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'If an element has a \\\"onmouseup\\\" attribute it should also have an \\\"onkeyup\\\" attribute',\n      nl: 'Als een element een \\\"onmouseup\\\"-attribuut heeft, moet het ook een \\\"onkeyup\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'If an element has a \\\"onmouseup\\\" attribute it should also have an \\\"onkeyup\\\" attribute.',\n      nl: 'Als een element een \\\"onmouseup\\\"-attribuut heeft, moet het ook een \\\"onkeyup\\\"-attribuut hebben.'\n    },\n    guidelines: {\n      508: [\n        'l'\n      ],\n      wcag: {\n        '2.1.1': {\n          techniques: [\n            'G90',\n            'SCR2',\n            'SCR20'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'G90',\n            'SCR20'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptOnmouseupHasOnkeyup;\n"
  },
  {
    "path": "src/assessments/ScriptsDoNotFlicker.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ScriptsDoNotFlicker = {\n  run: function (test, options) {\n\n    var selector = 'script';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Scripts should not cause the screen to flicker',\n      nl: 'Scripts mogen het scherm niet laten knipperen of flitsen'\n    },\n    description: {\n      en: 'All scripts should be assessed to see if their interface does not flicker.',\n      nl: 'Alle scripts moeten gecontroleerd worden om te zien of zij de interface niet laten knipperen of flitsen.'\n    },\n    guidelines: {\n      508: [\n        'j'\n      ],\n      wcag: {\n        '2.2.2': {\n          techniques: [\n            'F7'\n          ]\n        }\n      }\n    },\n    tags: [\n      'javascript'\n    ]\n  }\n};\nmodule.exports = ScriptsDoNotFlicker;\n"
  },
  {
    "path": "src/assessments/ScriptsDoNotUseColorAlone.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar ScriptsDoNotUseColorAlone = {\n  run: function (test, options) {\n\n    var selector = 'script';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'The interface in scripts should not use color alone',\n      nl: 'De interface in scripts gebruikt niet alleen maar kleur'\n    },\n    description: {\n      en: 'All scripts should be assessed to see if their interface does not have an interface which requires distinguishing between colors alone.',\n      nl: 'Alle scripts moeten gecontroleerd worden om te zien of hun interface geen interface heeft die alleen op kleur kan worden onderscheiden.'\n    },\n    guidelines: {\n      508: [\n        'c'\n      ]\n    },\n    tags: [\n      'javascript',\n      'color'\n    ]\n  }\n};\nmodule.exports = ScriptsDoNotUseColorAlone;\n"
  },
  {
    "path": "src/assessments/SelectDoesNotChangeContext.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar EventComponent = require('EventComponent');\n\nvar SelectDoesNotChangeContext = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'select',\n      searchEvent: 'onchange'\n    };\n    EventComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: '\\\"Select\\\" elements must not contain an \\\"onchange\\\" attribute',\n      nl: '\\\"Select\\\" elements bevatten geen \\\"onchange\\\" attribute'\n    },\n    description: {\n      en: 'Actions like \\\"onchange\\\" can take control away from users who are trying to navigate the page. Using an \\\"onchange\\\" attribute for things like select-list menus should instead be replaced with a drop-down and a button which initiates the action.',\n      nl: 'Acties als \\\"onchange\\\" kunnen de controle ontnemen van gebruikers die op een pagina proberen te navigeren. Het gebruik van een \\\"onchange\\\"-attribuut voor zaken zoals select-list menu\\'s moet vervangen worden door een drop-down en een knop waarmee je de actie start.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = SelectDoesNotChangeContext;\n"
  },
  {
    "path": "src/assessments/SelectHasAssociatedLabel.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar SelectHasAssociatedLabel = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'select'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All select elements have an explicitly associated label',\n      nl: 'Alle select-elementen hebben een expliciet bijbehorend label'\n    },\n    description: {\n      en: 'All <code>select</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle <code>select</code>-elementen moeten een bijbehorend <code>label</code>-element hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H44',\n            'F68'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H44',\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = SelectHasAssociatedLabel;\n"
  },
  {
    "path": "src/assessments/SelectJumpMenu.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar HasEventListenerComponent = require('HasEventListenerComponent');\nvar SelectJumpMenu = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry('select', scope).forEach(function (element) {\n        var hasChangeListener = HasEventListenerComponent(element, 'change');\n        if (hasChangeListener) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n        else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Select jump menus should jump on button press, not on state change',\n      nl: 'Select jump menu\\'s moeten springen wanneer de knop wordt gebruikt, niet bij statusverandering'\n    },\n    description: {\n      en: 'If you wish to use a \\'Jump\\' menu with a select item that then redirects users to another page, the jump should occur on the user pressing a button, rather than on the change event of that select element.',\n      nl: 'Als je een \\'Jump\\'-menu wilt gebruiken met een select item dat gebruikers naar een andere pagina verwijst, moet de verwijzing plaatsvinden als de gebruiker een knop gebruikt en niet op het moment dat het select element verandert.'\n    },\n    guidelines: {\n      wcag: {\n        '3.2.2': {\n          techniques: [\n            'F37'\n          ]\n        },\n        '3.2.5': {\n          techniques: [\n            'F9'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = SelectJumpMenu;\n"
  },
  {
    "path": "src/assessments/SiteMap.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar SiteMapStringsComponent = require('SiteMapStringsComponent');\n\nvar SiteMap = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry('a[href]', scope).forEach(function (element) {\n        let set = false;\n        let _case = Case({\n          element: element\n        });\n        test.add(_case);\n        let text = DOM.text(element).toLowerCase();\n        SiteMapStringsComponent.forEach(function (str) {\n          if (text.search(str) > -1) {\n            set = true;\n            return;\n          }\n        });\n        if (set === false) {\n          _case.set({\n            status: 'failed'\n          });\n          return;\n        }\n\n        if (set) {\n          _case.set({\n            status: 'passed'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Websites must have a site map',\n      nl: 'Websites moeten een sitemap hebben'\n    },\n    description: {\n      en: 'Every web site should have a page which provides a site map or another method to navigate most of the site from a single page to save time for users of assistive devices.',\n      nl: 'Elke website moet een pagina hebben waarop een sitemap staat of een andere methode om op de site te navigeren vanaf een pagina. Dit spaart gebruikers die hulpmiddelen gebruiken tijd.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.5': {\n          techniques: [\n            'G63'\n          ]\n        },\n        '2.4.8': {\n          techniques: [\n            'G63'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document'\n    ]\n  }\n};\n\nmodule.exports = SiteMap;\n"
  },
  {
    "path": "src/assessments/SkipToContentLinkProvided.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\n\nvar SkipContentStringsComponent = require('SkipContentStringsComponent');\n\nvar SkipToContentLinkProvided = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var $local = scope;\n      var skipLinkFound = false;\n\n      DOM.scry('a[href*=\"#\"]', $local).forEach(function (element) {\n        if (skipLinkFound) {\n          return;\n        }\n        var $link = element;\n\n        var fragment = DOM.getAttribute($link, 'href').split('#').pop();\n        var $target = DOM.scry('#' + fragment, $local);\n        var strs = SkipContentStringsComponent.slice();\n        while (!skipLinkFound && strs.length) {\n          var str = strs.pop();\n          if (DOM.text($link).search(str) > -1 && $target.length) {\n            $link.focus();\n            if (DOM.isVisible($link)) {\n              skipLinkFound = true;\n              test.add(Case({\n                element: $link,\n                status: 'passed'\n              }));\n              return;\n            }\n            $link.blur();\n          }\n        }\n      });\n      if (!skipLinkFound) {\n        test.add(Case({\n          status: 'failed'\n        }));\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'A \\\"skip to content\\\" link should exist as one of the first links on the page',\n      nl: 'Er moet een \\\"skip to content\\\"-link zijn als een van de eerste links op de pagina'\n    },\n    description: {\n      en: 'A link reading \\\"skip to content\\\" should be the first link on a page.',\n      nl: 'Er moet een link zijn om naar de content te navigeren als een van de eerste links op de pagina.'\n    },\n    guidelines: {\n      508: [\n        'o'\n      ],\n      wcag: {\n        '2.4.1': {\n          techniques: [\n            'G1'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document'\n    ]\n  }\n};\nmodule.exports = SkipToContentLinkProvided;\n"
  },
  {
    "path": "src/assessments/SvgContainsTitle.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar SvgContainsTitle = {\n  run: function (test) {\n\n    var selector = 'svg';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasTitle = DOM.scry('title', element).length === 1;\n\n          // If a test is defined, then use it\n          if (hasTitle) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Inline SVG should use Title elements',\n      nl: 'Inline SVG moet titelelementen gebruiken'\n    },\n    description: {\n      en: 'Any inline SVG image should have an embedded <code>title</code> element.',\n      nl: 'Elke inline SVG-afbeelding moet een ingebed <code>title</code>-element hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'F65'\n          ]\n        }\n      }\n    },\n    tags: [\n      'image',\n      'svg',\n      'content'\n    ]\n  }\n};\nmodule.exports = SvgContainsTitle;\n"
  },
  {
    "path": "src/assessments/TabIndexFollowsLogicalOrder.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar TabIndexFollowsLogicalOrder = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var index = 0;\n      DOM.scry('[tabindex]', scope).forEach(function (element) {\n        var $el = element;\n        var tabindex = DOM.getAttribute($el, 'tabindex');\n        if (parseInt(tabindex, 10) >= 0 && parseInt(tabindex, 10) !== index + 1) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n        else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n        index++;\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The tab order of a document is logical',\n      nl: 'De tabvolgorde van een document is logisch'\n    },\n    description: {\n      en: 'Check that the tab order of a page is logical.',\n      nl: 'Controleer of de tabvolgorde van een pagina logisch is.'\n    },\n    guidelines: {\n      wcag: {\n        '2.4.3': {\n          techniques: [\n            'H4'\n          ]\n        }\n      }\n    },\n    tags: [\n      'document'\n    ]\n  }\n};\nmodule.exports = TabIndexFollowsLogicalOrder;\n"
  },
  {
    "path": "src/assessments/TableCaptionIdentifiesTable.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar TableCaptionIdentifiesTable = {\n  run: function (test, options) {\n\n    var selector = 'caption';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Captions should identify their table',\n      nl: 'Beschrijvingen moeten hun tabellen identificeren'\n    },\n    description: {\n      en: 'Check to make sure that a table\\'s caption identifies the table with a name, figure number, etc.',\n      nl: 'Controleer of de beschrijving van een tabel de tabel identificeert met een naam, nummer en dergelijke.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H39'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableCaptionIdentifiesTable;\n"
  },
  {
    "path": "src/assessments/TableComplexHasSummary.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar TableComplexHasSummary = {\n  run: function (test, options) {\n\n    var selector = 'table';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      candidates.filter((element) => {\n        let captions = DOM.scry('caption', element);\n        let summary = DOM.getAttribute(element, 'summary');\n        return (!summary || summary.length === 0) || captions.length === 0;\n      });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Complex tables should have a summary',\n      nl: 'Complexe tabellen moeten een samenvatting hebben'\n    },\n    description: {\n      en: 'If a table is complex (for example, has some cells with \\\"colspan\\\" attributes, the table should have a summary.',\n      nl: 'Als een tabel complex is (bijvoorbeeld, als er cellen zijn met \\\"colspan\\\"-attributen, moet de tabel een samenvatting hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H39'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableComplexHasSummary;\n"
  },
  {
    "path": "src/assessments/TableDataShouldHaveTh.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableDataShouldHaveTh = {\n  run: function (test) {\n\n    var selector = 'table';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasHeading = DOM.scry('th', element).length > 0;\n          // If a test is defined, then use it\n          if (hasHeading) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Data tables should contain \\\"th\\\" elements',\n      nl: 'Datatabellen moeten \\\"th\\\"-elementen bevatten'\n    },\n    description: {\n      en: 'Tables which contain data (as opposed to layout tables) should contain <code>th</code> elements to mark headers for screen readers and enhance the structure of the document.',\n      nl: 'Tabellen die data bevatten (in tegenstelling tot lay-out tabellen) moeten <code>th</code>-elementen bevatten om koppen te markeren voor schermlezers en om de structuur van het document te verbeteren.'\n    },\n    guidelines: {\n      508: [\n        'g'\n      ],\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableDataShouldHaveTh;\n"
  },
  {
    "path": "src/assessments/TableIsGrouped.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar TableIsGrouped = {\n  run: function (test, options) {\n\n    var selector = 'table';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope)\n        .filter((element) => {\n          let theads = DOM.scry('thead', element);\n          let tfoots = DOM.scry('tfoot', element);\n          return theads.length === 0 || tfoots.length === 0;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Mark up the areas of tables using thead and tbody',\n      nl: 'Gebruik thead en tbody voor tabellen'\n    },\n    description: {\n      en: 'Mark up the areas of tables using thead and tbody.',\n      nl: 'Gebruik thead en tbody voor tabellen.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableIsGrouped;\n"
  },
  {
    "path": "src/assessments/TableLayoutDataShouldNotHaveTh.js",
    "content": "var IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableLayoutDataShouldNotHaveTh = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        var _case = Case({\n          element: element\n        });\n        test.add(_case);\n\n        if (DOM.scry('th', element).length !== 0) {\n          if (!IsDataTableComponent(element)) {\n            _case.set({\n              status: 'failed'\n            });\n          }\n          else {\n            _case.set({\n              status: 'passed'\n            });\n          }\n        }\n        else {\n          _case.set({\n            status: 'inapplicable'\n          });\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Layout tables should not contain \\\"th\\\" elements',\n      nl: 'Lay-out tabellen bevatten geen \\\"th\\\"-elementen'\n    },\n    description: {\n      en: 'Tables which are used purely for layout (as opposed to data tables), <strong>should not</strong> contain <code>th</code> elements, which would make the table appear to be a data table.',\n      nl: 'Tabellen die alleen voor lay-out worden gebruikt (in tegenstelling tot datatabellen), moeten geen <code>th</code>-elementen bevatten, omdat deze de indruk wekken dat het een datatabel betreft.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F46'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'layout',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableLayoutDataShouldNotHaveTh;\n"
  },
  {
    "path": "src/assessments/TableLayoutHasNoCaption.js",
    "content": "var IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableLayoutHasNoCaption = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (DOM.scry('caption', element).length) {\n          if (!IsDataTableComponent(element)) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n          else {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n        }\n        else {\n          test.add(Case({\n            element: element,\n            status: 'inapplicable'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All tables used for layout have no \\\"caption\\\" element',\n      nl: 'Alle tabellen die alleen voor lay-out worden gebruikt hebben geen \\\"caption\\\"-element'\n    },\n    description: {\n      en: 'If a table contains no data, and is used simply for layout, then it should not contain a <code>caption</code> element.',\n      nl: 'Als een tabel geen data bevat en alle voor lay-out wordt gebruikt, moet hij geen <code>caption</code>-element krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F46'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'layout',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableLayoutHasNoCaption;\n"
  },
  {
    "path": "src/assessments/TableLayoutHasNoSummary.js",
    "content": "var IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar IsUnreadable = require('IsUnreadable');\nvar TableLayoutHasNoSummary = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope).forEach(function (element) {\n        var _case = test.add(Case({\n          element: element\n        }));\n        if (!IsDataTableComponent(element) && !IsUnreadable(DOM.getAttribute(element, 'summary'))) {\n          _case.set({status: 'failed'});\n        }\n        else {\n          _case.set({status: 'passed'});\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All tables used for layout have no summary or an empty summary',\n      nl: 'Alle tabellen die alleen voor lay-out worden gebruikt hebben geen samenvatting'\n    },\n    description: {\n      en: 'If a table contains no data, and is used simply for layout, then it should not have a \\\"summary\\\" attribute.',\n      nl: 'Als een tabel geen data bevat en alleen voor lay-out wordt gebruikt, moet hij geen \\\"summary\\\"-attribuut krijgen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F46'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'layout',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableLayoutHasNoSummary;\n"
  },
  {
    "path": "src/assessments/TableLayoutMakesSenseLinearized.js",
    "content": "var IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableLayoutMakesSenseLinearized = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (!IsDataTableComponent(element)) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'All tables used for layout should make sense when removed',\n      nl: 'Als tabellen voor lay-out worden gebruikt moet de pagina nog duidelijk blijven als de tabel wordt verwijderd'\n    },\n    description: {\n      en: 'If a <code>table</code> element is used for layout purposes only, then the content of the table should make sense if the table is linearized.',\n      nl: 'Als een <code>table</code>-element alleen voor lay-out-doeleinden wordt gebruikt, moet de inhoud van de tabel nog steeds duidelijk zijn als de tabel wordt verwijderd.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'G57'\n          ]\n        },\n        '4.1.1': {\n          techniques: [\n            'F49'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'layout',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableLayoutMakesSenseLinearized;\n"
  },
  {
    "path": "src/assessments/TableNotUsedForLayout.js",
    "content": "var IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableNotUsedForLayout = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        if (!IsDataTableComponent(element)) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n        else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Tables should not be used for layout',\n      nl: 'Tabellen moet niet worden gebruikt voor lay-out'\n    },\n    description: {\n      en: 'Tables are for data, not for creating a page layout. Consider using standard HTML and CSS techniques instead.',\n      nl: 'Tabellen zijn voor data, niet om een pagina op te maken. Gebruik hiervoor HTML en CSS.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'F49'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'layout',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableNotUsedForLayout;\n"
  },
  {
    "path": "src/assessments/TableShouldUseHeaderIDs.js",
    "content": "var IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableShouldUseHeaderIDs = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        var $table = element;\n        var tableFailed = false;\n        if (IsDataTableComponent($table)) {\n          DOM.scry('th', $table).forEach(function (element) {\n            if (!tableFailed && !DOM.getAttribute(element, 'id')) {\n              tableFailed = true;\n              test.add(Case({\n                element: $table,\n                status: 'failed'\n              }));\n            }\n          });\n          if (!tableFailed) {\n            DOM.scry('td[header]', $table).forEach(function (element) {\n              if (!tableFailed) {\n                DOM.getAttribute(element, 'header').split(' ').forEach(function (id) {\n                  if (!DOM.scry('#' + id, $table).length) {\n                    tableFailed = true;\n                    test.add(Case({\n                      element: $table,\n                      status: 'failed'\n                    }));\n                  }\n                });\n              }\n            });\n          }\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Table cells use IDs to identify headers',\n      nl: 'Tabelcellen gebruiken IDs om koppen te identificeren'\n    },\n    description: {\n      en: 'If a table is not being used for layout, it should use IDs and header attributes to identify table headers.',\n      nl: 'Een tabel moet IDs en header-attributen gebruiken om tabelkoppen te identificeren.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H43'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableShouldUseHeaderIDs;\n"
  },
  {
    "path": "src/assessments/TableSummaryDescribesTable.js",
    "content": "/**\n * Not yet implemented.\n */\nvar TableSummaryDescribesTable = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Table summaries should describe the navigation and structure of the table',\n      nl: 'Tabelsamenvattingen moeten de navigatie en structuur van de tabel beschrijven'\n    },\n    description: {\n      en: 'Table <code>summary</code> elements should describe the navigation tools and structure of the table, as well as provide an overview of what the table describes.',\n      nl: 'Tabel \\\"summary\\\"-elementen moeten de navigatie en structuur van de tabel beschrijven, en een overzicht bieden van wat er in de tabel staat.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableSummaryDescribesTable;\n"
  },
  {
    "path": "src/assessments/TableSummaryDoesNotDuplicateCaption.js",
    "content": "var CleanStringComponent = require('CleanStringComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableSummaryDoesNotDuplicateCaption = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope)\n        .filter((element) => DOM.scry('caption', element).length > 0)\n        .forEach(function (element) {\n          var caption = DOM.scry('caption', element)[0];\n          var summary = caption && DOM.getAttribute(caption, 'summary');\n          if (summary && CleanStringComponent(summary) === CleanStringComponent(DOM.text(element))) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n          else {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Table \\\"summary\\\" elements should not duplicate the \\\"caption\\\" element',\n      nl: 'Tabel \\\"summary\\\"-elementen mogen niet hetzelfde zijn als het \\\"caption\\\"-element'\n    },\n    description: {\n      en: 'The summary and the caption must be different, as both provide different information. A <code>caption</code>. /code element identifies the table, while the \\\"summary\\\" attribute describes the table contents.',\n      nl: 'De samenvatting en beschrijving van een tabel moeten verschillen, want ze bieden verschillende informatie. Een <code>caption</code>-element identificeert welke tabel het betreft en het \\\"summary\\\"-attribuut beschrijft de inhoud van de tabel.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableSummaryDoesNotDuplicateCaption;\n"
  },
  {
    "path": "src/assessments/TableSummaryIsEmpty.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar PlaceholderComponent = require('PlaceholderComponent');\n\nvar TableSummaryIsEmpty = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'table',\n      attribute: 'summary',\n      empty: 'true'\n    };\n    PlaceholderComponent(test, options);\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All data tables should have a summary',\n      nl: 'Alle datatabellen moeten een samenvatting hebben'\n    },\n    description: {\n      en: 'If a table contains data, it should have a \\\"summary\\\" attribute.',\n      nl: 'Als een tabel data bevat, moet hij een \\\"summary\\\"-attribuut hebben.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableSummaryIsEmpty;\n"
  },
  {
    "path": "src/assessments/TableSummaryIsNotTooLong.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar TableSummaryIsNotTooLong = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table[summary]', scope).forEach(function (element) {\n        if (DOM.getAttribute(element, 'summary').trim().length > 100) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    guidelines: [\n\n    ],\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableSummaryIsNotTooLong;\n"
  },
  {
    "path": "src/assessments/TableUseColGroup.js",
    "content": "var IsDataTableComponent = require('IsDataTableComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableUseColGroup = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry('table', scope).forEach(function (table) {\n        if (\n          IsDataTableComponent(table) &&\n          !DOM.scry('colgroup', table).length\n        ) {\n          test.add(Case({\n            element: table,\n            status: 'failed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Group columns using \\\"colgroup\\\" or \\\"col\\\" elements',\n      nl: 'Groepeer kolommen met \\\"colgroup\\\"- of \\\"col\\\"-elementen'\n    },\n    description: {\n      en: 'To help complex table headers make sense, use <code>colgroup</code> or <code>col</code> to group them together.',\n      nl: 'Maak complexe tabelkoppen duidelijker door \\\"colgroup\\\"- of \\\"col\\\"-elementen te gebruiken om ze te groeperen.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableUseColGroup;\n"
  },
  {
    "path": "src/assessments/TableUsesAbbreviationForHeader.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar TableUsesAbbreviationForHeader = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('th', scope)\n        .filter((element) => {\n          let abbr = DOM.getAttribute(element, 'abbr');\n          return !abbr || abbr === '';\n        })\n        .forEach(function (element) {\n          if (DOM.text(element).length > 20) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 0,\n    title: {\n      en: 'Table headers over 20 characters should provide an \\\"abbr\\\" attribute',\n      nl: 'Tabelkoppen met meer dan 20 tekens moeten een \\\"abbr\\\"-attribuut hebben'\n    },\n    description: {\n      en: 'For long table headers, use an \\\"abbr\\\" attribute that is less than short (less than 20 characters long).',\n      nl: 'Gebruik een \\\"abbr\\\"-attribuut korter dan 20 tekens voor lange tabelkoppen.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableUsesAbbreviationForHeader;\n"
  },
  {
    "path": "src/assessments/TableUsesCaption.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TableUsesCaption = {\n  run: function (test) {\n\n    var selector = 'table';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'inapplicable'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status = 'failed';\n          var hasCaption = DOM.scry('caption', element).length === 1;\n\n          // If a test is defined, then use it\n          if (hasCaption) {\n            status = 'passed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Data tables should contain a \\\"caption\\\" element if not described elsewhere',\n      nl: 'Datatabellen moeten een \\\"caption\\\"-element hebben als ze nergens anders beschreven worden'\n    },\n    description: {\n      en: 'Unless otherwise described in the document, tables should contain <code>caption</code> elements to describe the purpose of the table.',\n      nl: 'Tenzij elders in het document beschreven, moeten tabellen een \\\"caption\\\"-element hebben om het doel van de tabel te beschrijven.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H39'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableUsesCaption;\n"
  },
  {
    "path": "src/assessments/TableUsesScopeForRow.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar TableUsesScopeForRow = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('table', scope).forEach(function (element) {\n        DOM.scry('td:first-child', element).forEach(function (element) {\n          var next = DOM.next(element);\n          if (next) {\n            var isBold = DOM.getComputedStyle(element, 'font-weight') === 'bold';\n            var nextIsNotBold = DOM.getComputedStyle(next, 'font-weight') !== 'bold';\n            var boldDoesNotFollowsBold = (isBold && nextIsNotBold);\n            var hasStrong = DOM.scry('strong', element).length\n            var nextIsNotStrong = DOM.scry('strong', next).length === 0;\n            var strongDoesNotFollowStrong = (hasStrong && nextIsNotStrong);\n\n            if (boldDoesNotFollowsBold || strongDoesNotFollowStrong) {\n              test.add(new Case({\n                element: element,\n                status: 'failed'\n              }));\n            }\n          }\n        });\n        DOM.scry('td:last-child', element).forEach(function (element) {\n          var $prev = DOM.prev(element);\n          var isBold = DOM.getComputedStyle(element, 'font-weight') === 'bold';\n          var prevIsNotBold = DOM.getComputedStyle($prev, 'font-weight') !== 'bold';\n          var boldDoesNotFollowsBold = (isBold && prevIsNotBold);\n          var hasStrong = DOM.scry('strong', element).length\n          var prevIsNotStrong = DOM.scry('strong', $prev).length === 0;\n          var strongDoesNotFollowStrong = (hasStrong && prevIsNotStrong);\n\n          if (boldDoesNotFollowsBold || strongDoesNotFollowStrong) {\n            test.add(new Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n        });\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Data tables should use scoped headers for rows with headers',\n      nl: 'Datatabellen moeten het \\\"scope\\\"-attribuut gebruiken voor rijen met koppen'\n    },\n    description: {\n      en: 'Where there are table headers for both rows and columns, use the \\\"scope\\\" attribute to help relate those headers with their appropriate cells. This test looks for the first and last cells in each row and sees if they differ in layout or font weight.',\n      nl: 'Als er tabelkoppen zijn voor zowel rijen als kolommen, gebruik dan het \\\"scope\\\"-attribuut om het juiste verband te leggen tussen de koppen en bijbehorende cellen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'H63'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableUsesScopeForRow;\n"
  },
  {
    "path": "src/assessments/TableWithBothHeadersUseScope.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar TableWithBothHeadersUseScope = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry('th', scope)\n        // Find all the th elements that don't have scope.\n        .filter((element) => {\n          let scope = element.getAttribute(element, 'scope');\n          return !scope || scope.length === 0;\n        })\n        // of them, filter down to the th elements not in the first row.\n        .filter((element) => {\n          let parents = DOM.parents(element);\n          let row = parents.filter((element) => DOM.is(element, 'tr'))[0];\n          let table = parents.filter((element) => DOM.is(element, 'table'))[0];\n          let firstRow = DOM.scry('tr', table)[0];\n          return row !== firstRow;\n        });\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: 'passed'\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Data tables with multiple headers should use the \\\"scope\\\" attribute',\n      nl: 'Datatabellen met meerdere headers moeten het \\\"scope\\\"-attribuut gebruiken'\n    },\n    description: {\n      en: 'Where there are table headers for both rows and columns, use the \\\"scope\\\" attribute to help relate those headers with their appropriate cells.',\n      nl: 'Als er tabelkoppen zijn voor zowel rijen als kolommen, gebruik dan het \\\"scope\\\"-attribuut om het juiste verband te leggen tussen de koppen en bijbehorende cellen.'\n    },\n    guidelines: {\n      508: [\n        'h'\n      ],\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TableWithBothHeadersUseScope;\n"
  },
  {
    "path": "src/assessments/TabularDataIsInTable.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar TabularDataIsInTable = {\n  run: function (test) {\n    test.get('scope').forEach(function (scope) {\n      DOM.scry('pre', scope).forEach(function (element) {\n        if (DOM.text(element).search('\\t') >= 0) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n        else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All tabular information should use a table',\n      nl: 'Alle tabelinformatie moet ook daadwerkelijk in een tabel staan'\n    },\n    description: {\n      en: 'Tables should be used when displaying tabular information.',\n      nl: 'Gebruik een echte tabel wanneer je tabelinformatie wilt tonen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.1': {\n          techniques: [\n            'F33',\n            'F34',\n            'F48'\n          ]\n        },\n        '1.3.2': {\n          techniques: [\n            'F33',\n            'F34'\n          ]\n        }\n      }\n    },\n    tags: [\n      'table',\n      'content'\n    ]\n  }\n};\nmodule.exports = TabularDataIsInTable;\n"
  },
  {
    "path": "src/assessments/TagsAreNestedCorrectly.js",
    "content": "/**\n * Not yet implemented.\n */\nvar TagsAreNestedCorrectly = {\n  run: function () {\n    return;\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All tags should be nested correctly',\n      nl: 'Alle tags moeten juist genest worden'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: {\n      wcag: {\n        '4.1.1': {\n          techniques: [\n            'H74'\n          ]\n        }\n      }\n    },\n    tags: [\n      'html'\n    ]\n  }\n};\nmodule.exports = TagsAreNestedCorrectly;\n"
  },
  {
    "path": "src/assessments/TextIsNotSmall.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar ConvertToPxComponent = require('ConvertToPxComponent');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar TextSelectorComponent = require('TextSelectorComponent');\n\nvar TextIsNotSmall = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          var fontSize = DOM.getComputedStyle(element, 'font-size');\n          if (fontSize.search('em') > 0) {\n            fontSize = ConvertToPxComponent(fontSize);\n          }\n          fontSize = parseInt(fontSize.replace('px', ''), 10);\n\n          if (fontSize < 10) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n          else {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'The text size is not less than 9 pixels high',\n      nl: 'De grootte van de tekst is meer dan 8 pixels hoog'\n    },\n    description: {\n      en: 'To help users with difficulty reading small text, ensure text size is no less than 9 pixels high.',\n      nl: 'Help gebruikers die moeite hebben met het lezen van kleine letters, door ervoor te zorgen dat tekst groter is dan 8 pixels hoog.'\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'textsize',\n      'content'\n    ]\n  }\n};\nmodule.exports = TextIsNotSmall;\n"
  },
  {
    "path": "src/assessments/TextareaHasAssociatedLabel.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nvar LabelComponent = require('LabelComponent');\n\nvar TextareaHasAssociatedLabel = {\n  run: function (test, options) {\n    options = options || {\n      selector: 'textarea'\n    };\n    LabelComponent(test, options);\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All textareas should have a corresponding label',\n      nl: 'Alle \\\"textarea\\\"-elementen moeten een bijbehorend label hebben'\n    },\n    description: {\n      en: 'All <code>textarea</code> elements should have a corresponding <code>label</code> element. Screen readers often enter a \\\"form mode\\\" where only label text is read aloud to the user',\n      nl: 'Alle \\\"textarea\\\"-elementen moeten een bijbehorend label hebben. Schermlezers maken vaak gebruik van een \\\"formuliereninstelling\\\" waarbij alleen de tekst van de labels hardop aan de gebruiker wordt voorgelezen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.1.1': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '1.3.1': {\n          techniques: [\n            'H44',\n            'F68'\n          ]\n        },\n        '2.1.1': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '2.1.3': {\n          techniques: [\n            'H91'\n          ]\n        },\n        '3.3.2': {\n          techniques: [\n            'H44'\n          ]\n        },\n        '4.1.2': {\n          techniques: [\n            'H44',\n            'H91'\n          ]\n        }\n      }\n    },\n    tags: [\n      'form',\n      'content'\n    ]\n  }\n};\nmodule.exports = TextareaHasAssociatedLabel;\n"
  },
  {
    "path": "src/assessments/VideoMayBePresent.js",
    "content": "var Case = require('Case');\nconst DOM = require('DOM');\nvar VideoMayBePresent = {\n  run: function (test) {\n\n    var videoExtensions = ['webm', 'flv', 'ogv', 'ogg', 'avi', 'mov', 'qt', 'wmv', 'asf',\n    'mp4', 'm4p', 'm4v', 'mpg', 'mp2', 'mpeg', 'mpg', 'mpe', 'mpv', 'm2v', '3gp', '3g2'];\n    var videoHosts = ['//www.youtube.com/embed/', '//player.vimeo.com/video/'];\n\n    test.get('scope').forEach(function (scope) {\n      var hasCase = false; // Test if a case has been created\n\n      // video elm is definately a video, and objects could be too.\n      DOM.scry('object, video', scope).forEach(function (element) {\n        hasCase = true;\n        test.add(Case({\n          element: element,\n          status: 'cantTell'\n        }));\n      });\n\n      // Links refering to files with an video extensions are probably video\n      // though the file may not exist.\n      DOM.scry('a[href]', scope).forEach(function (element) {\n        var extension = element.getAttribute('href').split('.').pop();\n        if (videoExtensions.indexOf(extension) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // some iframes with URL's of known video providers are also probably videos\n      DOM.scry('iframe', scope).forEach(function (element) {\n        if (element.src.indexOf(videoHosts[0]) !== -1 ||\n        element.src.indexOf(videoHosts[1]) !== -1) {\n          hasCase = true;\n          test.add(Case({\n            element: element,\n            status: 'cantTell'\n          }));\n        }\n      });\n\n      // if no case was added, return inapplicable\n      if (!hasCase) {\n        test.add(Case({\n          element: scope,\n          status: 'inapplicable'\n        }));\n      }\n\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'Video or object uses a link that points to a file with a video extension',\n      nl: 'Video of object met een link naar een bestand met een video extensie'\n    },\n    description: {\n      en: '',\n      nl: ''\n    },\n    guidelines: [\n\n    ],\n    tags: [\n      'link',\n      'video'\n    ]\n  }\n};\nmodule.exports = VideoMayBePresent;\n"
  },
  {
    "path": "src/assessments/VideoProvidesCaptions.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nvar Case = require('Case');\nconst DOM = require('DOM');\n\nvar VideoProvidesCaptions = {\n  run: function (test, options) {\n\n    var selector = 'video';\n\n    test.get('scope').forEach(function (scope) {\n      var candidates = DOM.scry(selector, scope);\n      if (!candidates.length) {\n        test.add(Case({\n          element: undefined,\n          status: (options.test ? 'inapplicable' : 'passed')\n        }));\n      }\n      else {\n        candidates.forEach(function (element) {\n          var status;\n\n          // If a test is defined, then use it\n          if (options.test && !DOM.is(element, options.test)) {\n            status = 'passed';\n          }\n          else {\n            status = 'failed';\n          }\n\n          test.add(Case({\n            element: element,\n            status: status\n          }));\n        });\n      }\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'All video tags must provide captions',\n      nl: 'Alle video tags moeten bijschriften bieden'\n    },\n    description: {\n      en: 'All HTML5 video tags must provide captions.',\n      nl: 'Alle HTML5 video tags moeten bijschriften bieden.'\n    },\n    guidelines: {\n      508: [\n        'b',\n        'b'\n      ],\n      wcag: {\n        '1.2.2': {\n          techniques: [\n            'G87'\n          ]\n        },\n        '1.2.4': {\n          techniques: [\n            'G87'\n          ]\n        }\n      }\n    },\n    tags: [\n      'media',\n      'content'\n    ]\n  }\n};\nmodule.exports = VideoProvidesCaptions;\n"
  },
  {
    "path": "src/assessments/VideosEmbeddedOrLinkedNeedCaptions.js",
    "content": "var Case = require('Case');\nvar VideoComponent = require('VideoComponent');\nvar VideosEmbeddedOrLinkedNeedCaptions = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      VideoComponent.findVideos(scope, function (element, pass) {\n        if (!pass) {\n          test.add(Case({\n            element: element,\n            status: 'failed'\n          }));\n        }\n        else {\n          test.add(Case({\n            element: element,\n            status: 'passed'\n          }));\n        }\n      });\n    });\n  },\n\n  meta: {\n    testability: 1,\n    title: {\n      en: 'All linked or embedded videos need captions',\n      nl: 'Alle gekoppelde of ingebedde video\\'s moeten bijschriften hebben'\n    },\n    description: {\n      en: 'Any video hosted or otherwise which is linked or embedded must have a caption.',\n      nl: 'Elke video die is gekoppeld of ingebed in content moet een bijschrift hebben.'\n    },\n    guidelines: {\n      wcag: {\n        '1.2.2': {\n          techniques: [\n            'G87'\n          ]\n        },\n        '1.2.4': {\n          techniques: [\n            'G87'\n          ]\n        }\n      }\n    },\n    tags: [\n      'media',\n      'content'\n    ]\n  }\n};\nmodule.exports = VideosEmbeddedOrLinkedNeedCaptions;\n"
  },
  {
    "path": "src/assessments/WhiteSpaceInWord.js",
    "content": "var TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar WhiteSpaceInWord = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          let whitespaceGroup, nonWhitespace;\n          nonWhitespace = (DOM.text(element)) ? DOM.text(element).match(/[^\\s\\\\]/g) : false;\n          whitespaceGroup = (DOM.text(element)) ? DOM.text(element).match(/[^\\s\\\\]\\s[^\\s\\\\]/g) : false;\n          if (nonWhitespace &&\n              whitespaceGroup &&\n              whitespaceGroup.length > 3 &&\n              whitespaceGroup.length >= (nonWhitespace.length / 2) - 2\n          ) {\n            test.add(Case({\n              element: element,\n              status: 'failed'\n            }));\n          }\n          else {\n            test.add(Case({\n              element: element,\n              status: 'passed'\n            }));\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Whitespace should not be used between characters in a word',\n      nl: 'Zet geen witruimte tussen letters in een woord'\n    },\n    description: {\n      en: 'Using extra whitespace between letters in a word causes screen readers to not interpret the word correctly, use the letter-spacing CSS property instead.',\n      nl: 'Het gebruik van witruimte tussen de letters van een woord, zorgen dat schermlezers het woord niet volledig kunnen lezen. Gebruik in plaats hiervan css om de ruimte tussen letters te bepalen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'F32',\n            'C8'\n          ]\n        }\n      }\n    },\n    tags: [\n      'content'\n    ]\n  }\n};\nmodule.exports = WhiteSpaceInWord;\n"
  },
  {
    "path": "src/assessments/WhiteSpaceNotUsedForFormatting.js",
    "content": "var TextSelectorComponent = require('TextSelectorComponent');\nvar Case = require('Case');\nconst DOM = require('DOM');\nvar TextNodeFilterComponent = require('TextNodeFilterComponent');\nvar WhiteSpaceNotUsedForFormatting = {\n  run: function (test) {\n    test.get('scope').forEach((scope) => {\n      DOM.scry(TextSelectorComponent, scope)\n        .filter(function (element) {\n          return TextNodeFilterComponent(element);\n        })\n        .forEach(function (element) {\n          var _case = test.add(Case({\n            element: element\n          }));\n          if (DOM.scry('br', element).length === 0) {\n            _case.set({status: 'passed'});\n            return;\n          }\n          var lines = DOM.text(element).toLowerCase().split(/(<br\\ ?\\/?>)+/);\n          var lineCount = 0;\n          lines.forEach(function (line) {\n            if (line.search(/(\\s|\\&nbsp;) {2,}/g) !== -1) {\n              lineCount++;\n            }\n          });\n          if (lineCount > 1) {\n            _case.set({status: 'failed'});\n          }\n          else {\n            _case.set({status: 'cantTell'});\n          }\n        });\n    });\n  },\n\n  meta: {\n    testability: 0.5,\n    title: {\n      en: 'Whitespace should not be used for conveying information',\n      nl: 'Gebruik geen witruimte om informatie over te brengen'\n    },\n    description: {\n      en: 'Spaces or tabs are not read by assistive technology and should not be used to convey meaning.',\n      nl: 'Spaties of tabs worden niet voorgelezen door hulpprogramma\\'s en moeten niet worden gebruikt om betekenis over te dragen.'\n    },\n    guidelines: {\n      wcag: {\n        '1.3.2': {\n          techniques: [\n            'G57'\n          ]\n        }\n      }\n    },\n    tags: [\n      'content'\n    ]\n  }\n};\nmodule.exports = WhiteSpaceNotUsedForFormatting;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.1.1.js",
    "content": "/**\n * Success Criterion 1.1.1: Non-text content\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/text-equiv-all.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G1C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.1.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {\n    F3: 'Using CSS to include images that convey important information',\n    F13: 'Having a text alternative that does not include information that is conveyed by color differences in the image',\n    F20: 'Not updating text alternatives when changes to non-text content occur',\n    F30: 'Using text alternatives that are not alternatives (e.g., filenames or placeholder text)',\n    F38: 'Not marking up decorative images in HTML in a way that allows assistive technology to ignore them',\n    F39: 'Providing a text alternative that is not null (e.g., alt=\"spacer\" or alt=\"image\") for images that should be ignored by assistive technology',\n    F65: 'Omitting the alt attribute or text alternative on img elements, area elements, and input elements of type \"image\"',\n    F67: 'Providing long descriptions for non-text content that does not serve the same purpose or does not present the same information',\n    F71: 'Using text look-alikes to represent text without providing a text alternative',\n    F72: 'Using ASCII art without providing a text alternative'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G1C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.2.1.js",
    "content": "/**\n * Success Criterion 1.2.1: Audio-only and Video-only (Prerecorded)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-av-only-alt.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G2C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.2.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G2C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.2.2.js",
    "content": "/**\n * Success Criterion 1.2.2: Captions (pre-recorded)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-captions.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G2C2 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.2.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G93: 'Providing open (always visible) captions',\n    // OR\n    G87: 'Providing closed captions'\n  };\n\n  // Failures\n  sc.failures = {\n    F74: 'Not labeling a synchronized media alternative to text as an alternative',\n    // OR\n    F75: 'Providing synchronized media without captions when the synchronized media presents more information than is presented on the page',\n    // OR\n    F8: 'Captions omitting some dialogue or important sound effects'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G2C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.2.3.js",
    "content": "/**\n * Success Criterion 1.2.3: Audio description or media alternative (pre-recorded)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-audio-desc.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G2C3 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.2.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G2C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.2.4.js",
    "content": "/**\n * Success Criterion 1.2.4: Captions (live)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-real-time-captions.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G2C4 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.2.4',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G9: 'Creating captions for live synchronized media',\n    // AND\n    G93: 'Providing open (always visible) captions',\n    G87: 'Providing closed captions using any readily available media format that has a video player that supports closed captioning'\n  };\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G2C4;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.2.5.js",
    "content": "/**\n * Success Criterion 1.2.5: Audio description (pre-recorded)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-audio-desc-only.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G2C5 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.2.5',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G78: 'Providing a second, user-selectable, audio track that includes audio descriptions',\n    // OR\n    G173: 'Providing a version of a movie with audio descriptions',\n    // OR\n    'SC1.2.8': 'Providing a movie with extended audio descriptions',\n    G8: 'Providing a movie with extended audio descriptions',\n    // OR if a talking head video\n    G203: 'Using a static text alternative to describe a talking head video'\n  };\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G2C5;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.2.7.js",
    "content": "/**\n * Success Criterion 1.2.7: Extended Audio Description (Prerecorded)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-extended-ad.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G2C7 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.2.7',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G2C7;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.2.8.js",
    "content": "/**\n * Success Criterion 1.2.8: Media Alternative (Prerecorded)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-text-doc.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G2C8 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.2.8',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G2C8;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.2.9.js",
    "content": "/**\n * Success Criterion 1.2.9: Audio-only (Live)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-live-audio-only.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G2C9 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.2.9',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G2C9;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.3.1.js",
    "content": "/**\n * Success Criterion 1.3.1: Info and relationships\n *\n * @see http://www.w3.org/WAI/WCAG20/quickref/#qr-content-structure-separation-programmatic\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G3C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.3.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    // Situation A: The technology provides semantic structure to make information and relationships conveyed through presentation programmatically determinable\n    G115: 'Using semantic elements to mark up structure AND H49: Using semantic markup to mark emphasized or special text',\n    // OR\n    G117: 'Using text to convey information that is conveyed by variations in presentation of text',\n    // OR\n    G140: 'Separating information and structure from presentation to enable different presentations',\n    // OR Making information and relationships conveyed through presentation programmatically determinable using the following techniques:\n    G138: 'Using semantic markup whenever color cues are used',\n    H48: 'Using ol, ul and dl for lists or groups of links',\n    H42: 'Using h1-h6 to identify headings',\n    SCR21: 'Using functions of the Document Object Model (DOM) to add content to a page (Scripting)',\n    // Tables\n    H51: 'Using table markup to present tabular information',\n    H39: 'Using caption elements to associate data table captions with data tables',\n    H73: 'Using the summary attribute of the table element to give an overview of data tables',\n    H63: 'Using the scope attribute to associate header cells and data cells in data tables',\n    H43: 'Using id and headers attributes to associate data cells with header cells in data tables',\n    // Forms\n    H44: 'Using label elements to associate text labels with form controls',\n    H65: 'Using the title attribute to identify form controls when the label element cannot be used',\n    H71: 'Providing a description for groups of form controls using fieldset and legend elements',\n    H85: 'Using OPTGROUP to group OPTION elements inside a SELECT',\n    // OR\n    ARIA11: 'Using ARIA landmarks to identify regions of a page (ARIA)',\n    // OR\n    ARIA12: 'Using role=heading to identify headings (ARIA)',\n    // OR\n    ARIA13: 'Using aria-labelledby to name regions and landmarks (ARIA)',\n    // OR\n    ARIA16: 'Using aria-labelledby to provide a name for user interface controls (ARIA)',\n    ARIA17: 'Using grouping roles to identify related form controls (ARIA)'\n  };\n\n  // Failures\n  sc.failures = {\n    // Web page structure\n    F2: 'Using changes in text presentation to convey information without using the appropriate markup or text',\n    F17: 'Insufficient information in DOM to determine one-to-one relationships (e.g., between labels with same id) in HTML',\n    F42: 'Using scripting events to emulate links in a way that is not programmatically determinable',\n    F43: 'Using structural markup in a way that does not represent relationships in the content',\n    F87: 'Inserting non-decorative content by using :before and :after pseudo-elements and the content property in CSS',\n    // Tables\n    F46: 'Using th elements, caption elements, or non-empty summary attributes in layout tables',\n    F48: 'Using the pre element to markup tabular information',\n    F90: 'Incorrectly associating table headers and content via the headers and id attributes',\n    F91: 'Not correctly marking up table headers',\n    F33: 'Using white space characters to create multiple columns in plain text content',\n    F34: 'Using white space characters to format tables in plain text content',\n    // Forms\n    F68: 'Association of label and user interface controls not being programmatically determinable'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G3C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.3.2.js",
    "content": "/**\n * Success Criterion 1.3.2: Meaningful sequence\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/content-structure-separation-sequence.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G3C2 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.3.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G57: 'Ordering the content in a meaningful sequence (scope: for all the content in the Web page)',\n    // OR\n    H34: 'Using a Unicode right-to-left mark (RLM) or left-to-right mark (LRM) to mix text direction inline (languageUnicodeDirection)',\n    H56: 'Using the dir attribute on an inline element to resolve problems with nested directional runs',\n    C6: 'Positioning content based on structural markup (CSS)',\n    C8: 'Using CSS letter-spacing to control spacing within a word',\n    // OR\n    C27: 'Making the DOM order match the visual order (CSS)'\n  };\n\n  // Failures\n  sc.failures = {\n    // HTML Failures\n    F49: 'Using an HTML layout table that does not make sense when linearized',\n    F32: 'Using white space characters to control spacing within a word (whiteSpaceInWord)',\n    F1: 'Changing the meaning of content by positioning information with CSS',\n    // Plain text Failures\n    F34: 'Using white space characters to format tables in plain text content (tabularDataIsInTable)',\n    F33: 'Using white space characters to create multiple columns in plain text content (tabularDataIsInTable)'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G3C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.3.3.js",
    "content": "/**\n * Success Criterion 1.3.3: Sensory characteristics\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/content-structure-separation-understanding.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G3C3 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.3.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G96: 'Providing textual identification of items that otherwise rely only on sensory information to be understood'\n  };\n\n  // Failures\n  sc.failures = {\n    F14: 'Identifying content only by its shape or location',\n    F26: 'Using a graphical symbol alone to convey information'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G3C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.1.js",
    "content": "/**\n * Success Criterion 1.4.1: Use of Color\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-without-color.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.2.js",
    "content": "/**\n * Success Criterion 1.4.2: Audio control\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-dis-audio.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C2 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    // This criteria applies if any media objects exist on the page. It's a\n    // very crude preEvaluator, to be fair.\n    return !!$('audio, video, object, embed').length;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G60: 'Playing a sound that turns off automatically within three seconds',\n    G170: 'Providing a control near the beginning of the Web page that turns off sounds that play automatically',\n    G171: 'Playing sounds only on user request'\n  };\n\n  // Failures\n  sc.failures = {\n    F23: 'Playing a sound longer than 3 seconds where there is no mechanism to turn it off'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.3.js",
    "content": "/**\n * Success Criterion 1.4.3: Contrast\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-contrast.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C3 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  /**\n   * (unused right now)\n   *\n   * Evaluates the Success Criteria.\n   */\n  /*\n  function evaluator (tests) {\n    // The set of tests that were run that pertain to this Success Criteria. This\n    // will be the union of the tests that were run and the required tests.\n    var criteriaTests = sc.filterTests(tests, sc.requiredTests);\n    // If the length of the union equals the length of the required tests,\n    // then we have the necessary tests to evaluate this success criteria.\n    if (criteriaTests.length === requiredTests.length) {\n      // Find the tests to evaluate.\n      var cssTextHasContrast = DOM.scry('cssTextHasContrast', tests);\n      // Cycle through the cases in the Success Criteria.\n      sc.forEach(function (index, _case) {\n        var selector = _case.get('selector');\n        var conclusion = 'untested';\n        var testCase, caseGroups;\n\n        // Process 'labelsAreAssignedToAnInput'.\n        caseGroups = cssTextHasContrast.groupCasesBySelector(selector);\n        testCase = caseGroups && caseGroups[selector] && caseGroups[selector][0];\n\n        if (testCase) {\n          conclusion = testCase.get('status') || 'cantTell';\n        }\n\n        // Add the case to the Success Criteria.\n        sc.addConclusion(conclusion, _case);\n      });\n    }\n  }*/\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G148: 'Not specifying background color, not specifying text color, and not using technology features that change those defaults',\n    G174: 'Providing a control with a sufficient contrast ratio that allows users to switch to a presentation that uses sufficient contrast',\n    G18: 'Ensuring that a contrast ratio of at least 4.5:1 exists between text (and images of text) and background behind the text for situation A AND G145: Ensuring that a contrast ratio of at least 3:1 exists between text (and images of text) and background behind the text for situation B'\n  };\n\n  // Failures\n  sc.failures = {\n    F24: 'Specifying foreground colors without specifying background colors or vice versa',\n    F83: 'Using background images that do not provide sufficient contrast with foreground text (or images of text)'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.4.js",
    "content": "/**\n * Success Criterion 1.4.4: Resize text\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-scale.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C4 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.4',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G142: 'Using a technology that has commonly-available user agents that support zoom',\n    C12: 'Using percent for font sizes',\n    C13: 'Using named font sizes',\n    C14: 'Using em units for font, sizes',\n    SCR34: 'Calculating size and ,position in a way that scales with text size (Scripting)',\n    G146: 'Using liquid layout',\n    G178: 'Providing controls on the Web page that allow users to incrementally change the size of all text on the page up to 200 percent',\n    G179: 'Ensuring that there is no loss of content or functionality when the text resizes and text containers do not change their width'\n  };\n\n  // Failures\n  sc.failures = {\n    F69: 'Resizing visually rendered text up to 200 percent causes the text, image or controls to be clipped, truncated or obscured',\n    F80: 'Text-based form controls do not resize when visually rendered text is resized up to 200%'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C4;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.5.js",
    "content": "/**\n * Success Criterion 1.4.5: Images of text\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-text-presentation.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C5 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    // Check for image tags. If the page does not have any, then there is\n    // nothing to test.\n    return !!document.querySelectorAll('img, map').length;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.5',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    C22: 'Using CSS to control visual presentation of text (CSS)',\n    C30: 'Using CSS to replace text with images of text and providing user interface controls to switch',\n    G140: 'Separating information and structure from presentation to enable different presentations'\n  };\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C5;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.6.js",
    "content": "/**\n * Success Criterion 1.4.6: Contrast (Enhanced)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast7.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C6 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.6',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C6;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.7.js",
    "content": "/**\n * Success Criterion 1.4.7: Low or No Background Audio\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-noaudio.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C7 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.7',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C7;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.8.js",
    "content": "/**\n * Success Criterion 1.4.8: Visual Presentation\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-visual-presentation.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C8 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.8',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C8;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-1.4.9.js",
    "content": "/**\n * Success Criterion 1.4.9: Images of Text (No Exception)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/visual-audio-contrast-text-images.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP1G4C9 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:1.4.9',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP1G4C9;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.1.1.js",
    "content": "/**\n * Success Criterion 2.1.1: Keyboard\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/keyboard-operation-keyboard-operable.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G1C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.1.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G1C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.1.2.js",
    "content": "/**\n * Success Criterion 2.1.2: No keyboard trap\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/keyboard-operation-trapping.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G1C2 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.1.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G1C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.1.3.js",
    "content": "/**\n * Success Criterion 2.1.3: Keyboard (No Exception)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/keyboard-operation-all-funcs.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G1C3 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.1.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G1C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.2.1.js",
    "content": "/**\n * Success Criterion 2.2.1: Timing Adjustable\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/time-limits-required-behaviors.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G2C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.2.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G2C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.2.2.js",
    "content": "/**\n * Success Criterion 2.2.2: Pause, Stop, Hide\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/time-limits-pause.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G2C2 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.2.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G2C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.2.3.js",
    "content": "/**\n * Success Criterion 2.2.3: No Timing\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/time-limits-no-exceptions.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G2C3 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.2.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G2C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.2.4.js",
    "content": "/**\n * Success Criterion 2.2.4: Interruptions\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/time-limits-postponed.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G2C4 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.2.4',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G2C4;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.2.5.js",
    "content": "/**\n * Success Criterion 2.2.5: Re-authenticating\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/time-limits-server-timeout.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G2C5 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.2.5',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G2C5;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.3.1.js",
    "content": "/**\n * Success Criterion 2.3.1: Three Flashes or Below Threshold\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/seizure-does-not-violate.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G3C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.3.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G3C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.3.2.js",
    "content": "/**\n * Success Criterion 2.3.2: Three Flashes\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/seizure-three-times.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G3C2 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.3.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G3C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.1.js",
    "content": "/**\n * Success Criterion 2.4.1: Bypass blocks\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-skip.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C1 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G1: 'Adding a link at the top of each page that goes directly to the main content area',\n    G123: 'Adding a link at the beginning of a block of repeated content to go to the end of the block',\n    G124: 'Adding links at the top of the page to each area of the content',\n    H69: 'Providing heading elements at the beginning of each section of content',\n    H70: 'Using frame elements to group blocks of repeated material AND H64: Using the title attribute of the frame and iframe elements',\n    SCR28: 'Using an expandable and collapsible menu to bypass block of content'\n  };\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.10.js",
    "content": "/**\n * Success Criterion 2.4.10: Section Headings\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-headings.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C10 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.10',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C10;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.2.js",
    "content": "/**\n * Success Criterion 2.4.2: Page Titled\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-title.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C2 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.3.js",
    "content": "/**\n * Success Criterion 2.4.3: Focus Order\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-focus-order.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C3 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.4.js",
    "content": "/**\n * Success Criterion 2.4.4: Link Purpose (In Context)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-refs.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C4 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.4',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C4;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.5.js",
    "content": "/**\n * Success Criterion 2.4.5: Multiple Ways\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-mult-loc.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C5 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.5',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C5;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.6.js",
    "content": "/**\n * Success Criterion 2.4.6: Headings and Labels\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-descriptive.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C6 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.6',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C6;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.7.js",
    "content": "/**\n * Success Criterion 2.4.7: Focus Visible\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-focus-visible.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C7 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.7',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C7;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.8.js",
    "content": "/**\n * Success Criterion 2.4.8: Location\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-location.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C8 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.8',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C8;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-2.4.9.js",
    "content": "/**\n * Success Criterion 2.4.9: Link Purpose (Link Only)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/navigation-mechanisms-link.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP2G4C9 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:2.4.9',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP2G4C9;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.1.1.js",
    "content": "/**\n * Success Criterion 3.1.1: Language of Page\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-doc-lang-id.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G1C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.1.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G1C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.1.2.js",
    "content": "/**\n * Success Criterion 3.1.2: Language of Parts\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-other-lang-id.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G1C2 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.1.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G1C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.1.3.js",
    "content": "/**\n * Success Criterion 3.1.3: Unusual Words\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-idioms.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G1C3 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.1.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G1C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.1.4.js",
    "content": "/**\n * Success Criterion 3.1.4: Abbreviations\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-located.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G1C4 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.1.4',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G1C4;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.1.5.js",
    "content": "/**\n * Success Criterion 3.1.5: Reading Level\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-supplements.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G1C5 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.1.5',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G1C5;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.1.6.js",
    "content": "/**\n * Success Criterion 3.1.6: Pronunciation\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/meaning-pronunciation.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G1C6 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.1.6',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G1C6;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.2.1.js",
    "content": "/**\n * Success Criterion 3.2.1: On focus\n *\n * @see http://www.w3.org/WAI/WCAG20/quickref/#qr-consistent-behavior-receive-focus\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G2C1 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.2.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G107: 'Using \"activate\" rather than \"focus\" as a trigger for changes of context'\n  };\n\n  // Failures\n  sc.failures = {\n    F52: 'Opening a new window as soon as a new page is loaded',\n    F55: 'Using script to remove focus when focus is received'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G2C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.2.2.js",
    "content": "/**\n * Success Criterion 3.2.2: On input\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/consistent-behavior-unpredictable-change.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G2C2 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.2.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G80: 'Providing a submit button to initiate a change of context',\n    // AND\n    H32: 'Providing submit buttons',\n    H84: 'Using a button with a select element to perform an action',\n\n    G13: 'Describing what will happen before a change to a form control that causes a change of context to occur is made',\n    SCR19: 'Using an onchange event on a select element without causing a change of context'\n  };\n\n  // Failures\n  sc.failures = {\n    F36: 'Automatically submitting a form and presenting new content without prior warning when the last field in the form is given a value',\n    F37: 'Launching a new window without prior warning when the status of a radio button, check box or select list is changed',\n    F76: 'Providing instruction material about the change of context by change of setting in a user interface element at a location that users may bypass'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G2C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.2.3.js",
    "content": "/**\n * Success Criterion 3.2.3: Consistent navigation\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/consistent-behavior-consistent-locations.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G2C3 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.2.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G61: 'Presenting repeated components in the same relative order each time they appear'\n  };\n\n  // Failures\n  sc.failures = {\n    F66: 'Presenting navigation links in a different relative order on different pages'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G2C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.2.4.js",
    "content": "/**\n * Success Criterion 3.2.4: Consistent identification\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/consistent-behavior-consistent-functionality.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G2C4 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.2.4',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    G197: 'Using labels, names, and text alternatives consistently for content that has the same functionality AND following the sufficient techniques for Success Criterion 1.1.1 and sufficient techniques for Success Criterion 4.1.2 for providing labels, names, and text alternatives.'\n  };\n\n  // Failures\n  sc.failures = {\n    F31: 'Using two different labels for the same function on different Web pages within a set of Web pages'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G2C4;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.2.5.js",
    "content": "/**\n * Success Criterion 3.2.5: Change on Request\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/consistent-behavior-no-extreme-changes-context.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G2C5 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.2.5',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G2C5;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.3.1.js",
    "content": "/**\n * Success Criterion 3.3.1: Error Identification\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-identified.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G3C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.3.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G3C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.3.2.js",
    "content": "/**\n * Success Criterion 3.3.2: Labels or Instructions\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-cues.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G3C2 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.3.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G3C2;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.3.3.js",
    "content": "/**\n * Success Criterion 3.3.3: Error suggestions\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-suggestions.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G3C3 = (function () {\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    var complexInputTypes = [\n      // 'button', //  Defines a clickable button (mostly used with a JavaScript to activate a script)\n      'checkbox', //  Defines a checkbox\n      'color', // Defines a color picker\n      'date', //  Defines a date control (year, month and day (no time))\n      'datetime', //  Defines a date and time control (year, month, day, hour, minute, second, and fraction of a second, based on UTC time zone)\n      'datetime-local', //  Defines a date and time control (year, month, day, hour, minute, second, and fraction of a second (no time zone)\n      'email', // Defines a field for an e-mail address\n      'file', //  Defines a file-select field and a \"Browse...\" button (for file uploads)\n      'hidden', //  Defines a hidden input field\n      // 'image', // Defines an image as the submit button\n      'month', // Defines a month and year control (no time zone)\n      'number', //  Defines a field for entering a number\n      'password', //  Defines a password field (characters are masked)\n      'radio', // Defines a radio button\n      'range', // Defines a control for entering a number whose exact value is not important (like a slider control)\n      // 'reset', // Defines a reset button (resets all form values to default values)\n      'search', //  Defines a text field for entering a search string\n      // 'submit', //  Defines a submit button\n      'tel', // Defines a field for entering a telephone number\n      // 'text', //  Default. Defines a single-line text field (default width is 20 characters)\n      'time', //  Defines a control for entering a time (no time zone)\n      'url', // Defines a field for entering a URL\n      'week' //  Defines a week and year control (no time zone)\n    ];\n\n    var requiredAttrs = [\n      {\n        required: 'required'\n      },\n      {\n        'aria-required': 'true'\n      }\n    ];\n\n    // Searches this for complex for types.\n    //\n    // @return boolean\n    //    Whether the complex input type exists in the scoped DOM element.\n    function hasComplexTypes (type) {\n      return !!this.querySelectorAll('[type=\"' + type + '\"]').length;\n    }\n\n    function hasTypesWithAttr (attr) {\n      var key = Object.keys(attr)[0];\n      return !!this.querySelectorAll('[' + key + '=\"' + attr[key] + '\"]').length;\n    }\n\n    // Testing forms.\n    //\n    // If any of the complex form types are present in the document, this\n    // success criteria applies.\n    if (document.querySelectorAll('form').length) {\n      if (complexInputTypes.some(hasComplexTypes, document) ||\n        requiredAttrs.some(hasTypesWithAttr, document)\n      ) {\n        return true;\n      }\n    }\n    else {\n      return false;\n    }\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.3.3',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    // Required fields\n    G83: 'Providing text descriptions to identify required fields that were not completed',\n    ARIA2: 'Identifying a required field with the aria-required property',\n    // Field that requires specific data formats\n    ARIA18: 'Using aria-alertdialog to Identify Errors (ARIA)',\n    G85: 'Providing a text description when user input falls outside the required format or values',\n    G177: 'Providing suggested correction text',\n    SCR18: 'Providing client-side validation and alert (Scripting)',\n    SCR32: 'Providing client-side validation and adding error text via the DOM (Scripting)',\n    // Field with limited set of values\n    // ARIA18: 'Using aria-alertdialog to Identify Errors (ARIA)',\n    G84: 'Providing a text description when the user provides information that is not in the list of allowed values'\n    // G177: 'Providing suggested correction text',\n    // SCR18: 'Providing client-side validation and alert (Scripting)',\n    // SCR32: 'Providing client-side validation and adding error text via the DOM (Scripting)'\n  };\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G3C3;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.3.4.js",
    "content": "/**\n * Success Criterion 3.3.4: Error Prevention (Legal, Financial, Data)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-reversible.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G3C4 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.3.4',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G3C4;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.3.5.js",
    "content": "/**\n * Success Criterion 3.3.5: Help\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-context-help.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G3C5 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.3.5',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G3C5;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-3.3.6.js",
    "content": "/**\n * Success Criterion 3.3.6: Error Prevention (All)\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/minimize-error-reversible-all.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP3G3C6 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:3.3.6',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP3G3C6;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-4.1.1.js",
    "content": "/**\n * Success Criterion 4.1.1: Parsing\n *\n * @see http://www.w3.org/TR/UNDERSTANDING-WCAG20/ensure-compat-parses.html\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP4G1C1 = (function () {\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:4.1.1',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {};\n\n  // Failures\n  sc.failures = {};\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP4G1C1;\n"
  },
  {
    "path": "src/wcag/SuccessCriteria-4.1.2.js",
    "content": "/**\n * Test for WCAG success criterion 4.1.2: Name, Role, Value.\n */\nvar SuccessCriteria = require('SuccessCriteria');\n\nvar SuccessCriteriaP4G1C2 = (function () {\n\n  // The tests that must be run in order to evaluate this Success Criteria.\n  // @todo, identify the complete set of required tests for this Success Criteria.\n  // var requiredTests = ['labelsAreAssignedToAnInput', 'labelMustBeUnique', 'inputWithoutLabelHasTitle'];\n\n  /**\n   * Determines if this Success Criteria applies to the document.\n   */\n  function preEvaluator () {\n    return true;\n  }\n\n  /**\n   * (Unused right now)\n   *\n   * Evaluates the Success Criteria.\n   */\n  // function evaluator (tests) {\n  //   // The set of tests that were run that pertain to this Success Criteria. This\n  //   // will be the union of the tests that were run and the required tests.\n  //   var criteriaTests = sc.filterTests(tests, sc.requiredTests);\n  //   // If the length of the union equals the length of the required tests,\n  //   // then we have the necessary tests to evaluate this success criteria.\n  //   if (criteriaTests.length === requiredTests.length) {\n  //     // Find the tests to evaluate.\n  //     var labelsAreAssignedToAnInput = DOM.scry('labelsAreAssignedToAnInput', tests);\n  //     var labelMustBeUnique = DOM.scry('labelMustBeUnique', tests);\n  //     var inputWithoutLabelHasTitle = DOM.scry('inputWithoutLabelHasTitle', tests);\n\n  //     // Cycle through the cases in the Success Criteria.\n  //     sc.forEach(function (index, _case) {\n  //       var conclusion = 'untested';\n\n  //       if (_case.get('status') !== 'untested') {\n  //         var selector = _case.get('selector');\n  //         if (selector) {\n\n  //           // @dev, we'll look at each test individually for this selector.\n  //           // Process 'labelsAreAssignedToAnInput'.\n  //           var cases_labelsAreAssignedToAnInput = labelsAreAssignedToAnInput.findCasesBySelector(selector);\n  //           // Process 'labelMustBeUnique'.\n  //           var cases_labelMustBeUnique = labelMustBeUnique.findCasesBySelector(selector);\n  //           // Process 'inputWithoutLabelHasTitle'.\n  //           var cases_inputWithoutLabelHasTitle = inputWithoutLabelHasTitle.findCasesBySelector(selector);\n\n  //           var passing = ['passed', 'inapplicable'];\n\n  //           // Make sure the arrays are not empty.\n  //           if ((cases_labelsAreAssignedToAnInput.length >= 1 && cases_labelsAreAssignedToAnInput[0].hasStatus(passing)) &&\n  //             (cases_labelMustBeUnique.length >= 1 && cases_labelMustBeUnique[0].hasStatus(passing)) &&\n  //             (cases_inputWithoutLabelHasTitle.length >= 1 && cases_inputWithoutLabelHasTitle[0].hasStatus(passing))) {\n  //             conclusion = 'passed';\n  //           }\n\n  //           // Don't bother if it isn't passed?\n  //           if (conclusion === 'passed') {\n  //             // (1) Determine if any of the following failures apply to the element\n  //             //   at the selector. If so, fail the Success Criteria for that selector.\n  //             var element = cases_labelMustBeUnique[0].attributes.element;\n\n  //             // F59: Using script to make div or span a user interface control in HTML without providing a role for the control (This failure may be solved in the future using DHTML roadmap techniques.)\n  //             if (element.nodeName === 'DIV' || element.nodeName === 'SPAN') {\n  //               conclusion = 'failed';\n  //             }\n\n  //             // F20: Not updating text alternatives when changes to non-text content occur\n  //             // N/A for labelMustBeUnique.\n\n  //             // F68: Association of label and user interface controls not being programmatically determined\n\n  //             //   F79: Focus state of a user interface component not being programmatically determinable or no notification of change of focus state available\n  //             //   F86: Not providing names for each part of a multi-part form field, such as a US telephone number\n  //             //   F89: Using null alt on an image where the image is the only content in a link ( #59 :ok: )\n  //             // (2) If no Failures are detected, so if the Techniques are satisfied. If\n  //             //   one of the techniques is satisfed for the element at the selector,\n  //             //   Success Criteria is satisfied.\n  //             //\n  //             //   ARIA14: Using aria-label to provide an invisible label where a visible label cannot be used\n  //             //   ARIA16: Using aria-labelledby to provide a name for user interface controls\n  //             //\n  //             //   G108: Using markup features to expose the name and role, allow user-settable properties to be directly set, and provide notification of changes using technology-specific techniques below:\n  //             //   AND\n  //             //\n  //             //   H91: Using HTML form controls and links ( #66 )\n  //             //   H44: Using label elements to associate text labels with form controls\n  //             //   H64: Using the title attribute of the frame and iframe elements ( #65 )\n  //             //   H65: Using the title attribute to identify form controls when the label element cannot be used ( #64 )\n  //             //   H88: Using HTML according to spec ( #86 )\n  //           }\n  //         }\n  //       }\n  //       // Add the case to the Success Criteria.\n  //       sc.addConclusion(conclusion, _case);\n  //     });\n  //   }\n  // }\n\n  // Create a new SuccessCriteria and pass it the evaluation callbacks.\n  var sc = SuccessCriteria({\n    name: 'wcag:4.1.2',\n    preEvaluator: preEvaluator\n  });\n\n  // Techniques\n  sc.techniques = {\n    ARIA14: 'Using aria-label to provide an invisible label where a visible label cannot be used',\n    ARIA16: 'Using aria-labelledby to provide a name for user interface controls',\n    G108: 'Using markup features to expose the name and role, allow user-settable properties to be directly set, and provide notification of changes using technology-specific techniques below:',\n    // AND\n    H91: 'Using HTML form controls and links',\n    H44: 'Using label elements to associate text labels with form controls',\n    H64: 'Using the title attribute of the frame and iframe elements',\n    H65: 'Using the title attribute to identify form controls when the label element cannot be used',\n    H88: 'Using HTML according to spec'\n  };\n\n  // Failures\n  sc.failures = {\n    F59: 'Using script to make div or span a user interface control in HTML without providing a role for the control (This failure may be solved in the future using DHTML roadmap techniques.)',\n    F20: 'Not updating text alternatives when changes to non-text content occur',\n    F68: 'Association of label and user interface controls not being programmatically determined',\n    F79: 'Focus state of a user interface component not being programmatically determinable or no notification of change of focus state available',\n    F86: 'Not providing names for each part of a multi-part form field, such as a US telephone number',\n    F89: 'Using null alt on an image where the image is the only content in a link'\n  };\n\n  return sc;\n}());\n\nmodule.exports = SuccessCriteriaP4G1C2;\n"
  },
  {
    "path": "test/assessmentSpecs/specs/KINGStrongList/KINGStrongList.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>KINGStrongList</title>\n</head>\n<body>\n<div data-expected=\"pass\">\n  <ul>\n    <li>Some <strong id=\"assert-1\">bold</strong> text.</li>\n  </ul>\n</div>\n\n<div data-expected=\"fail\">\n  <p><strong id=\"assert-2\">Bold</strong> at the wrong place.</p>\n</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/KINGStrongList/KINGStrongListSpec.js",
    "content": "xdescribe('assessment: KINGStrongList', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/KINGStrongList/KINGStrongList.html',\n        assessments: [\n          'KINGStrongList'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('KINGStrongList');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.KINGStrongList.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.KINGStrongList.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/KINGUseCurrencyAsSymbol/KINGUseCurrencyAsSymbol.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>KINGUseCurrencyAsSymbol</title>\n</head>\n<body>\n<div data-expected=\"fail\">\n  <p id=\"assert-1\">Text with a few prices, 500 dollars, 500 euros. Dollars 500</p>\n</div>\n\n<div data-expected=\"pass\">\n  <p id=\"assert-2\">Text with a few prices, 500 USD, 300€.</p>\n</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/KINGUseCurrencyAsSymbol/KINGUseCurrencyAsSymbolSpec.js",
    "content": "xdescribe('assessment: KINGUseCurrencyAsSymbol', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/KINGUseCurrencyAsSymbol/KINGUseCurrencyAsSymbol.html',\n        assessments: [\n          'KINGUseCurrencyAsSymbol'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('KINGUseCurrencyAsSymbol');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.KINGUseCurrencyAsSymbol.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.KINGUseCurrencyAsSymbol.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/KINGUseLongDateFormat/KINGUseLongDateFormat.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>KINGUseLongDateFormat</title>\n</head>\n<body>\n<div data-expected=\"fail\">\n  <p id=\"assert-1\">Text with a short date of 12/04/2014, 2/1/14, 12-04-12, 12.04.12.</p>\n</div>\n\n<div data-expected=\"fail\">\n  <ul>\n\t<li id=\"assert-2\">This list item contains short date: 12/04/2014</li>\n  </ul>\n</div>\n\n<div data-expected=\"fail\">\n  <table>\n\t<tbody>\n\t  <td id=\"assert-3\">12/04/2014</td>\n\t</tbody>\n  </table>\n</div>\n\n<div data-expected=\"fail\">\n  <h1 id=\"assert-4\">This headline has bad date format 12.4.2014.</h1>\n</div>\n\n<div data-expected=\"pass\">\n  <!-- Since we don't support <font/> element in KINGUseLongDateFormat test, this TC should not\n  cause an error -->\n  <p id=\"assert-5\">\n\tDate nested in an unsupported tag\n\t<font>12-04-12</font>\n  </p>\n</div>\n\n<div data-expected=\"pass\">\n  <p id=\"assert-6\">Text with long date of 12 may 2014.</p>\n</div>\n\n<div data-expected=\"pass\">\n  <ul>\n\t<li id=\"assert-7\">Text with long date of 12 may 2014</li>\n  </ul>\n</div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/KINGUseLongDateFormat/KINGUseLongDateFormatSpec.js",
    "content": "xdescribe('assessment: KINGUseLongDateFormat', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/KINGUseLongDateFormat/KINGUseLongDateFormat.html',\n        assessments: [\n          'KINGUseLongDateFormat'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(15);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('KINGUseLongDateFormat');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.KINGUseLongDateFormat.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.KINGUseLongDateFormat.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.KINGUseLongDateFormat.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.KINGUseLongDateFormat.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.KINGUseLongDateFormat.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.KINGUseLongDateFormat.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.KINGUseLongDateFormat.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/KINGUsePercentageWithSymbol/KINGUsePercentageWithSymbol.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>KINGUsePercentageWithSymbol</title>\n</head>\n<body>\n<div data-expected=\"fail\">\n  <p id=\"assert-1\">Text with a few percentages, 50 pct., 500 percent.</p>\n</div>\n\n<div data-expected=\"pass\">\n  <p id=\"assert-2\">Text with a few percentages: 50%, 50.30%.</p>\n</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/KINGUsePercentageWithSymbol/KINGUsePercentageWithSymbolSpec.js",
    "content": "xdescribe('assessment: KINGUsePercentageWithSymbol', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/KINGUsePercentageWithSymbol/KINGUsePercentageWithSymbol.html',\n        assessments: [\n          'KINGUsePercentageWithSymbol'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('KINGUsePercentageWithSymbol');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.KINGUsePercentageWithSymbol.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.KINGUsePercentageWithSymbol.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aAdjacentWithSameResourceShouldBeCombined/aAdjacentWithSameResourceShouldBeCombined.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aAdjacentWithSameResourceShouldBeCombined</title>\n  </head>\n  <body>\n    <!-- inapplicable -->\n    <div>\n      <a id=\"assert-1\" href=\"products.html\"><img src=\"assets/go.gif\" alt=\"\" />Products page</a>\n    </div>\n\n    <!-- passed -->\n    <div>\n      <a id=\"assert-2\" href=\"products.html\"><img src=\"assets/go.gif\" alt=\"\" />Products page</a>\n      <a id=\"assert-3\" href=\"bullets.html\"><img src=\"assets/bullet.gif\" alt=\"\" />Bullet page</a>\n    </div>\n\n    <!-- failed -->\n    <div>\n      <a id=\"assert-4\" href=\"products.html\"><img src=\"assets/go.gif\" alt=\"\" /></a>\n      <a id=\"assert-5\" href=\"products.html\">Products page</a>\n    </div>\n\n    <!-- failed -->\n    <div>\n      <a id=\"assert-6\" href=\"products.html\"><img src=\"assets/go.gif\" alt=\"Products page\" /></a>\n      <a id=\"assert-7\" href=\"products.html\">Products page</a>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aAdjacentWithSameResourceShouldBeCombined/aAdjacentWithSameResourceShouldBeCombinedSpec.js",
    "content": "describe('assessment: aAdjacentWithSameResourceShouldBeCombined', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aAdjacentWithSameResourceShouldBeCombined/aAdjacentWithSameResourceShouldBeCombined.html',\n        assessments: [\n          'aAdjacentWithSameResourceShouldBeCombined'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(7);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aAdjacentWithSameResourceShouldBeCombined');\n  });\n\n  it('should return the proper assessment for the test', function () {\n    cases = quailResults.tests.aAdjacentWithSameResourceShouldBeCombined.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('inapplicable');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aImgAltNotRepetitive/aImgAltNotRepetitive.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aImgAltNotRepetitive</title>\n  </head>\n  <body>\n    <div>\n      <a href=\"page1.html\"><img id=\"assert-1\" src=\"assets/rex.jpg\" alt=\"\"/>page1</a>\n    </div>\n\n    <div>\n      <a href=\"page1.html\"><img id=\"assert-2\" src=\"assets/rex.jpg\" alt=\"page1\"/>page1</a>\n    </div>\n\n    <div>\n      <a href=\"page1.html\"><img id=\"assert-3\" data-expected=\"fail\" src=\"assets/rex.jpg\" alt=\"page1\"/><i>page1</i></a>\n    </div>\n\n    <div>\n      <a href=\"page1.html\"><img id=\"assert-4\" data-expected=\"fail\" src=\"assets/rex.jpg\" alt=\"page1\"/>Go to page1</a>\n    </div>\n\n    <div>\n      <a href=\"page1.html\">\n        <i><img id=\"assert-5\" data-expected=\"fail\" src=\"assets/rex.jpg\" alt=\"page1\"/></i>page1</a>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aImgAltNotRepetitive/aImgAltNotRepetitiveSpec.js",
    "content": "describe('assessment: aImgAltNotRepetitive', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aImgAltNotRepetitive/aImgAltNotRepetitive.html',\n        assessments: [\n          'aImgAltNotRepetitive'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(5);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aImgAltNotRepetitive');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.aImgAltNotRepetitive.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.aImgAltNotRepetitive.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.aImgAltNotRepetitive.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.aImgAltNotRepetitive.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.aImgAltNotRepetitive.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aInPHasADistinctStyle/aInPHasADistinctStyle.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>aInPHasADistinctStyle</title>\n    <style>\n      a {\n        text-decoration: none;\n      }\n\n      .prepend:before,\n      .append:after {\n        content: \" \";\n        background: green;\n        display: inline-block;\n        width: .8em;\n        height: .8em;\n      }\n\n      .onlyfocus:focus {\n        text-decoration: underline;\n      }\n    </style>\n  </head>\n  <body>\n    <div data-expected=\"inapplicable\">\n        <p><a id=\"assert-1\" href=\"\">\n            A link\n        </a></p>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n        <p>Some text\n            <a id=\"assert-2\">with no link</a>\n            inside it.</p>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n        <p>Some text\n            <a id=\"assert-3\" href=\"\" style=\"display:none\">with no link</a>\n            inside it.</p>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n        <div style=\"display:none\"><p>No text\n            <a id=\"assert-4\" href=\"/\">with no link</a>\n            inside it.</p></div>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n        <p>Some text with an empty link\n            <a id=\"assert-5\" href=\"/\"></a>\n            inside it.</p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>Some text\n            <a id=\"assert-6\" href=\"/\" style=\"text-decoration:underline\">\n                With a link\n            </a>\n            inside it.</p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>Some text\n            <a id=\"assert-7\" href=\"/\" style=\"display:block; margin:1em;\">\n                With a link\n            </a>\n            inside it.</p>\n    </div>\n\n\n    <div data-expected=\"pass\">\n        <p>Some text\n            <a id=\"assert-8\" href=\"/\" style=\"position:absolute; top:-1em; right:0;\">\n                With a link\n            </a></p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>Some text\n            <a id=\"assert-9\" href=\"/\" style=\"border-bottom:dashed 1px red\">\n                With a link\n            </a>\n            inside it.</p>\n    </div>\n\n    <div data-expected=\"pass\"\n        >\n        <!-- links with images are probably sufficiently distinguishable -->\n        <p>Some text\n            <a id=\"assert-10\" href=\"/\">\n                With a link <img src=\"\" alt=\"\"/>\n            </a>\n            inside it.</p>\n    </div>\n\n\n    <div data-expected=\"inapplicable\">\n        <!-- links with images are probably sufficiently distinguishable -->\n        <p>\n          <a id=\"assert-11\" href=\"/\">Allow multiple links</a>\n          <a id=\"assert-12\" href=\"/\">Inside a paragraph</a>\n        </p>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n        <!-- links with images are probably sufficiently distinguishable -->\n        <p>\n          <a id=\"assert-13\" href=\"/\">Allow</a> |\n          <a id=\"assert-14\" href=\"/\">For</a> -\n          <a id=\"assert-15\" href=\"/\">Certain</a> >\n          <a id=\"assert-16\" href=\"/\">Types</a> &gt;\n          <a id=\"assert-17\" href=\"/\">Of</a> &lt;\n          <a id=\"assert-18\" href=\"/\">Separators</a>\n        </p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <!-- If the link is the only content of an element\n            with a destinct still, it also passes -->\n        <p>Some text\n          <span style=\"background:blue\">\n            <a id=\"assert-19\" href=\"/\" style=\"text-decoration:underline\">\n                      With a link\n                  </a></span>\n            inside it.</p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <!--The above is also true when it comes from\n        native style changes -->\n        <p>Some text\n            <strong><a id=\"assert-20\" href=\"/\">\n                With a link\n            </a> </strong>,\n            <em><a id=\"assert-21\" href=\"/\">\n                With a link\n            </a></em> -\n            <b><a id=\"assert-22\" href=\"/\">\n                With a link\n            </a></b>  ====\n            <u><a id=\"assert-23\" href=\"/\">\n                With a link\n            </a></u> /\n            inside it.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n        <p>Some text\n            <a id=\"assert-24\" href=\"/\" class=\"quail-failed-element\">\n                With a link\n            </a>\n            inside it.</p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>Some text\n            <a id=\"assert-25\" href=\"/\" style=\"color:black\">\n                With a link\n            </a>\n            that is identical.\n            This sometimes happens in page footers with an e-mail address</p>\n    </div>\n\n    <div data-expected=\"fail\">\n        <p style=\"text-decoration:underline\">Some text\n            <a id=\"assert-26\" href=\"/\" class=\"quail-failed-element\">\n                With a link\n            </a>\n            inside it.</p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aInPHasADistinctStyle/aInPHasADistinctStyleSpec.js",
    "content": "describe('assessment: aInPHasADistinctStyle', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aInPHasADistinctStyle/aInPHasADistinctStyle.html',\n        assessments: [\n          'aInPHasADistinctStyle'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(25);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aInPHasADistinctStyle');\n  });\n\n  it('should return the proper assessment for the test', function () {\n    cases = quailResults.tests.aInPHasADistinctStyle.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n    // This test needs to be adjusted to return inapplicable for a tags without\n    // href attributes.\n    // expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    // expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n    // expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n    // expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-9').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-10').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-11').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-12').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-13').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-14').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-15').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-16').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-17').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-18').to.have.quailStatus('inapplicable');\n    expect(cases).quailGetById('assert-19').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-20').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-21').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-22').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-23').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-24').to.have.quailStatus('failed');\n    expect(cases).quailGetById('assert-25').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-26').to.have.quailStatus('failed');\n\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinkTextDoesNotBeginWithRedundantWord/aLinkTextDoesNotBeginWithRedundantWord.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aLinkTextDoesNotBeginWithRedundantWord</title>\n  </head>\n  <body>\n    <div>\n      <p><a id=\"assert-1\" href=\"home.html\">home page</a></p>\n    </div>\n\n    <div>\n      <p><a id=\"assert-2\" href=\"home.html\"><img src=\"assets/star.gif\" alt=\"home page\"/></a></p>\n    </div>\n\n    <div>\n      <p><a id=\"assert-3\" href=\"home.html\">link to home page</a></p>\n    </div>\n\n    <div>\n      <p><a id=\"assert-4\" href=\"home.html\"><img src=\"assets/star.gif\" alt=\"link to home page\"/></a></p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinkTextDoesNotBeginWithRedundantWord/aLinkTextDoesNotBeginWithRedundantWordSpec.js",
    "content": "describe('assessment: aLinkTextDoesNotBeginWithRedundantWord', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aLinkTextDoesNotBeginWithRedundantWord/aLinkTextDoesNotBeginWithRedundantWord.html',\n        assessments: [\n          'aLinkTextDoesNotBeginWithRedundantWord'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.aLinkTextDoesNotBeginWithRedundantWord.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct stats', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aLinkTextDoesNotBeginWithRedundantWord');\n  });\n\n  it('should pass a link without redundant text', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n\n  it('should pass a link without redundant text in the img alt', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n\n  it('should fail a link with redundant text', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n\n  it('should fail a link with redundant text in the img alt', function () {\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinkWithNonText/aLinkWithNonText.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>aLinkWithNonText</title>\n\t</head>\n\t<body>\n\n\t\t<div data-expected=\"inapplicable\">\n\t\t\t<a id=\"assert-1\" name=\"anchor\"></a>\n\t\t</div>\n\n\t\t<div data-expected=\"pass\">\n\t\t  <a id=\"assert-2\" href=\"something.html\"><img src=\"../assets/rex.jpg\" alt=\"Learn more about this cat\"/></a>\n\t\t</div>\n\n\t\t<div data-expected=\"pass\">\n\t\t  <a id=\"assert-3\" href=\"something.html\"><img src=\"../assets/rex.jpg\" alt=\"\"/>Learn more about this cat</a>\n\t\t</div>\n\n\t\t<div data-expected=\"fail\">\n\t\t  <a id=\"assert-4\" href=\"something.html\" class=\"quail-failed-element\"><img src=\"../assets/rex.jpg\" alt=\"\"/></a>\n\t\t</div>\n\n\t\t<div data-expected=\"fail\">\n\t\t  <a id=\"assert-5\" href=\"something.html\" class=\"quail-failed-element\"><object classid=\"http://www.miamachina.it/analogclock.py\" title=\"  \"></object></a>\n\t\t</div>\n\n\t\t<div data-expected=\"fail\">\n\t\t  <a id=\"assert-6\" href=\"something.html\" class=\"quail-failed-element\"><img src=\"../assets/rex.jpg\"/></a>\n\t\t</div>\n\n\t\t\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinkWithNonText/aLinkWithNonTextSpec.js",
    "content": "describe('assessment: aLinkWithNonText', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aLinkWithNonText/aLinkWithNonText.html',\n        assessments: [\n          'aLinkWithNonText'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.aLinkWithNonText.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aLinkWithNonText');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksAreSeparatedByPrintableCharacters/aLinksAreSeparatedByPrintableCharacters.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>aLinksAreSeparatedByPrintableCharacters</title>\n\t</head>\n\t<body>\n\t\t<div data-expected=\"pass\">\n\t\t\t<a id=\"assert-1\" href=\"dogs\">dogs</a> | <a id=\"assert-2\" href=\"cats\">cats</a> | <a id=\"assert-3\" href=\"birds\">birds</a> | <a href=\"snakes\">snakes</a>\n\t\t</div>\n\n\t\t<div data-expected=\"fail\">\n      <a id=\"assert-4\" href=\"dogs\">dogs</a>  <a id=\"assert-5\" href=\"cats\">cats</a>  <a id=\"assert-6\" href=\"birds\">birds</a> <a href=\"snakes\">snakes</a>\n\t\t</div>\n\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksAreSeparatedByPrintableCharacters/aLinksAreSeparatedByPrintableCharactersSpec.js",
    "content": "describe('assessment: aLinksAreSeparatedByPrintableCharacters', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aLinksAreSeparatedByPrintableCharacters/aLinksAreSeparatedByPrintableCharacters.html',\n        assessments: [\n          'aLinksAreSeparatedByPrintableCharacters'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.aLinksAreSeparatedByPrintableCharacters.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aLinksAreSeparatedByPrintableCharacters');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksDontOpenNewWindow/aLinksDontOpenNewWindow.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aLinksDontOpenNewWindow</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\">\n      <p>This link to an <a id=\"assert-1\" href=\"aLinksDontOpenNewWindow.html\">invalid file</a> opens in the same window.</p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"Target is parent\">\n      <p>This link to an <a id=\"assert-2\" href=\"aLinksDontOpenNewWindow.html\" target=\"_parent\">invalid file</a> opens in the same window.</p>\n    </div>D\n\n    <div data-expected=\"pass\" title=\"Target is top\">\n      <a id=\"assert-3\" href=\"newwindow.html\" target=\"_top\">same window</a>\n    </div>\n\n    <div data-expected=\"fail\" title=\"target new\">\n      <p>This link to a <a id=\"assert-4\" href=\"aLinksDontOpenNewWindow.html\" target=\"_new\" class=\"quail-failed-element\">valid file</a> opens in a new window.</p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"target blank with new window text\">\n      <p>This link to a <a id=\"assert-5\" href=\"aLinksDontOpenNewWindow.html\" target=\"_blank\">valid file that opens in a new window</a>.</p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"target blank with new window text in title atribute\">\n      <p>This link to a <a id=\"assert-6\" href=\"aLinksDontOpenNewWindow.html\" title=\"valid file - opens in a new window\" target=\"_blank\">valid file</a>.</p>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksDontOpenNewWindow/aLinksDontOpenNewWindowSpec.js",
    "content": "describe('assessment: aLinksDontOpenNewWindow', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aLinksDontOpenNewWindow/aLinksDontOpenNewWindow.html',\n        assessments: [\n          'aLinksDontOpenNewWindow'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.aLinksDontOpenNewWindow.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aLinksDontOpenNewWindow');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksNotSeparatedBySymbols/aLinksNotSeparatedBySymbols.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>aLinksNotSeparatedBySymbols</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<a id=\"assert-1\" href=\"dogs\" class=\"quail-failed-element\">dogs</a>\n\t\t|\n\t\t<a id=\"assert-2\" href=\"cats\" class=\"quail-failed-element\">cats</a>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<a id=\"assert-3\" href=\"dogs\">dogs</a>\n\t\t<a id=\"assert-4\" href=\"cats\">cats</a>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<a id=\"assert-5\" href=\"birds\">birds</a>\n\t\ttext\n\t\t<a id=\"assert-6\" href=\"snakes\">snakes</a>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksNotSeparatedBySymbols/aLinksNotSeparatedBySymbolsSpec.js",
    "content": "describe('assessment: aLinksNotSeparatedBySymbols', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aLinksNotSeparatedBySymbols/aLinksNotSeparatedBySymbols.html',\n        assessments: [\n          'aLinksNotSeparatedBySymbols'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.aLinksNotSeparatedBySymbols.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aLinksNotSeparatedBySymbols');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('inapplicable');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksToMultiMediaRequireTranscript/aLinksToMultiMediaRequireTranscript-inapplicable.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aLinksToMultiMediaRequireTranscript</title>\n  </head>\n  <body>\n    <div data-expected=\"inapplicable\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksToMultiMediaRequireTranscript/aLinksToMultiMediaRequireTranscript.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aLinksToMultiMediaRequireTranscript</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <p>View <a id=\"assert-1\" href=\"movie.mpg\" class=\"quail-failed-element\">the movie</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>View <a id=\"assert-2\" href=\"movie.mov\" class=\"quail-failed-element\">the movie</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>View <a id=\"assert-3\" href=\"movie.ram\" class=\"quail-failed-element\">the movie</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>View <a id=\"assert-4\" href=\"movie.aif\" class=\"quail-failed-element\">the movie</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>View <a id=\"assert-5\" href=\"movie.wmv\" class=\"quail-failed-element\">the movie</a>.</p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksToMultiMediaRequireTranscript/aLinksToMultiMediaRequireTranscriptSpec.js",
    "content": "describe('assessment: aLinksToMultiMediaRequireTranscript', function () {\n  var client, assessments, quailResults, cases;\n\n  describe('no links to media', function () {\n    // Evaluate the test page with Quail.\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aLinksToMultiMediaRequireTranscript/aLinksToMultiMediaRequireTranscript-inapplicable.html',\n          assessments: [\n            'aLinksToMultiMediaRequireTranscript'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aLinksToMultiMediaRequireTranscript.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aLinksToMultiMediaRequireTranscript');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  describe('links to media', function () {\n    // Evaluate the test page with Quail.\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aLinksToMultiMediaRequireTranscript/aLinksToMultiMediaRequireTranscript.html',\n          assessments: [\n            'aLinksToMultiMediaRequireTranscript'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aLinksToMultiMediaRequireTranscript.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(5);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aLinksToMultiMediaRequireTranscript');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksToSoundFilesNeedTranscripts/aLinksToSoundFilesNeedTranscripts-inapplicable.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aLinksToSoundFilesNeedTranscripts</title>\n  </head>\n  <body>\n    <div data-expected=\"inapplicable\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksToSoundFilesNeedTranscripts/aLinksToSoundFilesNeedTranscripts.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aLinksToSoundFilesNeedTranscripts</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-1\" href=\"carol-talking.sam\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-2\" href=\"carol-talking.smp\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-3\" href=\"carol-talking.vce\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-4\" href=\"carol-talking.vox\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-5\" href=\"carol-talking.pcm\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-6\" href=\"carol-talking.aif\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-7\" href=\"carol-talking.wav\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-8\" href=\"carol-talking.svx\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-9\" href=\"carol-talking.iff\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Listen to <a id=\"assert-10\" href=\"carol-talking.snd\">Carol talking about dogs</a>.</p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aLinksToSoundFilesNeedTranscripts/aLinksToSoundFilesNeedTranscriptsSpec.js",
    "content": "describe('assessment: aLinksToSoundFilesNeedTranscripts', function () {\n  var client, assessments, quailResults, cases;\n\n  describe('no links to media', function () {\n    // Evaluate the test page with Quail.\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aLinksToSoundFilesNeedTranscripts/aLinksToSoundFilesNeedTranscripts-inapplicable.html',\n          assessments: [\n            'aLinksToSoundFilesNeedTranscripts'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aLinksToSoundFilesNeedTranscripts.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aLinksToSoundFilesNeedTranscripts');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  describe('links to media', function () {\n    // Evaluate the test page with Quail.\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aLinksToSoundFilesNeedTranscripts/aLinksToSoundFilesNeedTranscripts.html',\n          assessments: [\n            'aLinksToSoundFilesNeedTranscripts'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aLinksToSoundFilesNeedTranscripts.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(10);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aLinksToSoundFilesNeedTranscripts');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMultimediaTextAlternative/aMultimediaTextAlternative-inapplicable.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aMultimediaTextAlternative</title>\n  </head>\n  <body>\n    <div data-expected=\"inapplicable\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMultimediaTextAlternative/aMultimediaTextAlternative.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aMultimediaTextAlternative</title>\n  </head>\n  <body>\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-1\" href=\"carol-talking.aif\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-2\" href=\"carol-talking.iff\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-3\" href=\"carol-talking.mov\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-4\" href=\"carol-talking.mp3\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-5\" href=\"carol-talking.mpg\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-6\" href=\"carol-talking.ram\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-7\" href=\"carol-talking.sam\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-8\" href=\"carol-talking.smp\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-9\" href=\"carol-talking.snd\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-10\" href=\"carol-talking.svx\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-11\" href=\"carol-talking.pcm\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-12\" href=\"carol-talking.vce\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-13\" href=\"carol-talking.vox\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-14\" href=\"carol-talking.wav\">Carol talking about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <p>Listen to <a id=\"assert-15\" href=\"carol-talking.wmv\">Carol talking about dogs</a>.</p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMultimediaTextAlternative/aMultimediaTextAlternativeSpec.js",
    "content": "describe('assessment: aMultimediaTextAlternative', function () {\n  var client, assessments, quailResults, cases;\n\n  describe('no links to media', function () {\n    // Evaluate the test page with Quail.\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aMultimediaTextAlternative/aMultimediaTextAlternative-inapplicable.html',\n          assessments: [\n            'aMultimediaTextAlternative'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aMultimediaTextAlternative.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aMultimediaTextAlternative');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  describe('links to media', function () {\n    // Evaluate the test page with Quail.\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aMultimediaTextAlternative/aMultimediaTextAlternative.html',\n          assessments: [\n            'aMultimediaTextAlternative'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aMultimediaTextAlternative.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(15);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aMultimediaTextAlternative');\n    });\n\n    it('should return the proper assessment for a file link of type .aif, \\(assert-1\\)', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .iff, \\(assert-2\\)', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .mov, \\(assert-3\\)', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .mp3, \\(assert-4\\)', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .mpg, \\(assert-5\\)', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .ram, \\(assert-6\\)', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .sam, \\(assert-7\\)', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .smp, \\(assert-8\\)', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .snd, \\(assert-9\\)', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .svx, \\(assert-10\\)', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .pcm, \\(assert-11\\)', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .vce, \\(assert-12\\)', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .vox, \\(assert-13\\)', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .wav, \\(assert-14\\)', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for a file link of type .wmv, \\(assert-15\\)', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMustContainText/aMustContainText.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aMustContainText</title>\n  </head>\n  <body>\n\n    <div data-expected=\"inapplicable\">\n      <p>This is a page with an anchor <a id=\"anchor\"></a></p>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n      <p>Select link for more information about dogs.<a id=\"assert-1\" href=\"dogs.html\" style=\"display:none\">Metadata!</a></p>\n    </div>\n\n    <div data-expected=\"pass\">\n      <p>Select link for more information about dogs.<a id=\"assert-2\" href=\"dogs.html\"><img src=\"assets/rex.jpg\" alt=\"more information about dogs\"/></a></p>\n    </div>\n\n    <div data-expected=\"pass\">\n      <p>Select link for more <a id=\"assert-3\" href=\"dogs.html\">information about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Select link for more information about dogs.\n        <!-- The following can fail other tests if CSS isn't used to give the link body. This may occure with background images -->\n        <a id=\"assert-4\" href=\"dogs.html\" title=\"About dogs\"></a>\n      </p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Select link for more information about dogs. <a id=\"assert-5\" href=\"dogs.html\" title=\"more information about dogs\"></a></p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>Select link for more information about dogs. <a id=\"assert-6\" href=\"dogs.html\" title=\"more information about dogs\"></a></p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMustContainText/aMustContainTextSpec.js",
    "content": "describe('assessment: aMustContainText', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aMustContainText/aMustContainText.html',\n        assessments: [\n          'aMustContainText'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.aMustContainText.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(7);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aMustContainText');\n  });\n\n  it('should return the proper assessment for anchor', function () {\n    expect(cases).quailGetById('anchor').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-1', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMustHaveTitle/aMustHaveTitle.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aMustHaveTitle</title>\n  </head>\n  <body>\n    <!-- passed -->\n    <p>We have information about <a id=\"assert-1\" href=\"dogs.html\" title=\"dogs information\">dogs</a> on our site.</p>\n    <!-- failed -->\n    <p>We have more <a id=\"assert-2\" href=\"dogs.html\">information about dogs</a> on our site.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMustHaveTitle/aMustHaveTitleSpec.js",
    "content": "describe('assessment: aMustHaveTitle', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aMustHaveTitle/aMustHaveTitle.html',\n        assessments: [\n          'aMustHaveTitle'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct stats', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aMustHaveTitle');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.aMustHaveTitle.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMustNotHaveJavascriptHref/aMustNotHaveJavascriptHref-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aMustNotHaveJavascriptHref</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\">\n      <a href=\"fallback.html\" onclick=\"dosomething(); return false;\">Scripted link with fallback href</a>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMustNotHaveJavascriptHref/aMustNotHaveJavascriptHref.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aMustNotHaveJavascriptHref</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <a id=\"assert-1\" href=\"javascript:dosomething()\" class=\"quail-failed-element\">Scripted link</a>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aMustNotHaveJavascriptHref/aMustNotHaveJavascriptHrefSpec.js",
    "content": "describe('assessment: aMustNotHaveJavascriptHref', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aMustNotHaveJavascriptHref/aMustNotHaveJavascriptHref-nomatch.html',\n          assessments: [\n            'aMustNotHaveJavascriptHref'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aMustNotHaveJavascriptHref.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aMustNotHaveJavascriptHref');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aMustNotHaveJavascriptHref/aMustNotHaveJavascriptHref.html',\n          assessments: [\n            'aMustNotHaveJavascriptHref'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aMustNotHaveJavascriptHref.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aMustNotHaveJavascriptHref');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aSuspiciousLinkText/aSuspiciousLinkText.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aSuspiciousLinkText</title>\n  </head>\n  <body>\n    <div data-expected=\"inapplicable\">\n      <a id=\"assert-1\" name=\"anchor\"></a>\n    </div>\n\n    <div data-expected=\"pass\">\n      <p>Here is a link to <a id=\"assert-2\" href=\"dogs.html\">information about dogs</a>.</p>\n    </div>\n\n    <div data-expected=\"pass\">\n      <p>This is the introduction to a news story about recent spending by our\n          government.<a id=\"assert-3\" href=\"spending.html\">read more <span class=\"invisible\">about the news story</span></a>\n      </p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"Image alt\">\n      <p>This is the introduction to a news story about recent spending by our\n          government.<a id=\"assert-4\" href=\"spending.html\"><img src=\"../assets/go.gif\" width=\"30\" height=\"10\" alt=\"government spending\"/></a>\n      </p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>For more information about dogs, <a id=\"assert-5\" href=\"dogs.html\">click here</a>.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>This is the introduction to a news story about recent spending by our government.\n        <a id=\"assert-6\" href=\"spending.html\"><img src=\"../assets/go.gif\" width=\"30\" height=\"10\" alt=\"image\"/></a>\n      </p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p>This is the introduction to a news story about recent spending by our government.\n        <a id=\"assert-7\" href=\"spending.html\">read more</a>\n      </p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aSuspiciousLinkText/aSuspiciousLinkTextSpec.js",
    "content": "describe('assessment: aSuspiciousLinkText', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/aSuspiciousLinkText/aSuspiciousLinkText.html',\n        assessments: [\n          'aSuspiciousLinkText'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(7);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('aSuspiciousLinkText');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.aSuspiciousLinkText.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.aSuspiciousLinkText.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.aSuspiciousLinkText.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.aSuspiciousLinkText.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.aSuspiciousLinkText.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.aSuspiciousLinkText.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.aSuspiciousLinkText.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aTitleDescribesDestination/aTitleDescribesDestination-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aTitleDescribesDestination</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\">\n\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aTitleDescribesDestination/aTitleDescribesDestination.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>aTitleDescribesDestination</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\">\n      <p>We have more <a id=\"assert-1\" href=\"dogs.html\" title=\"cats information\">information about dogs</a> on our site.</p>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/aTitleDescribesDestination/aTitleDescribesDestinationSpec.js",
    "content": "describe('assessment: aTitleDescribesDestination', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aTitleDescribesDestination/aTitleDescribesDestination-nomatch.html',\n          assessments: [\n            'aTitleDescribesDestination'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aTitleDescribesDestination.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aTitleDescribesDestination');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/aTitleDescribesDestination/aTitleDescribesDestination.html',\n          assessments: [\n            'aTitleDescribesDestination'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.aTitleDescribesDestination.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('aTitleDescribesDestination');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/animatedGifMayBePresent/animatedGifMayBePresent.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>animatedGifMayBePresent</title>\n  </head>\n  <body>\n    <div data-expected=\"inapplicable\">\n      <img id=\"assert-1\" src=\"assets/kids.jpg\" alt=\"eat at Joes\" width=\"200\" height=\"200\"/>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n      <img id=\"assert-2\" src=\"assets/fish.gif\" alt=\"eat at Joes\" width=\"200\" height=\"200\"/>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <img id=\"assert-3\" src=\"assets/fishswim.gif\" alt=\"A brown and black cat named Rex.\"/>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/animatedGifMayBePresent/animatedGifMayBePresentSpec.js",
    "content": "describe('assessment: animatedGifMayBePresent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/animatedGifMayBePresent/animatedGifMayBePresent.html',\n        assessments: [\n          'animatedGifMayBePresent'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('animatedGifMayBePresent');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.animatedGifMayBePresent.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.animatedGifMayBePresent.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.animatedGifMayBePresent.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('cantTell');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletContainsTextEquivalent/appletContainsTextEquivalent.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletContainsTextEquivalent</title>\n  </head>\n  <body>\n    <div class=\"limit-phantom\" data-expected=\"pass\">\n      <applet id=\"assert-1\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        We are testing your Java version.\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\"><param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n\n    <div class=\"limit-phantom\" data-expected=\"fail\">\n      <applet id=\"assert-2\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\" class=\"quail-failed-element\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\"><param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletContainsTextEquivalent/appletContainsTextEquivalentSpec.js",
    "content": "describe('assessment: appletContainsTextEquivalent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/appletContainsTextEquivalent/appletContainsTextEquivalent.html',\n        assessments: [\n          'appletContainsTextEquivalent'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('appletContainsTextEquivalent');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.appletContainsTextEquivalent.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.appletContainsTextEquivalent.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletContainsTextEquivalentInAlt/appletContainsTextEquivalentInAlt.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletContainsTextEquivalentInAlt</title>\n  </head>\n  <body>\n    <div class=\"limit-phantom\" data-expected=\"pass\">\n      <applet id=\"assert-1\" alt=\"We are testing your java version\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\"><param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n\n    <div class=\"limit-phantom\" data-expected=\"fail\">\n      <applet id=\"assert-2\" alt=\"\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\"><param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n\n    <div class=\"limit-phantom\" data-expected=\"fail\">\n      <applet id=\"assert-3\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\"><param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletContainsTextEquivalentInAlt/appletContainsTextEquivalentInAltSpec.js",
    "content": "describe('assessment: appletContainsTextEquivalentInAlt', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/appletContainsTextEquivalentInAlt/appletContainsTextEquivalentInAlt.html',\n        assessments: [\n          'appletContainsTextEquivalentInAlt'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('appletContainsTextEquivalentInAlt');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.appletContainsTextEquivalentInAlt.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.appletContainsTextEquivalentInAlt.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.appletContainsTextEquivalentInAlt.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletProvidesMechanismToReturnToParent/appletProvidesMechanismToReturnToParent-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletProvidesMechanismToReturnToParent</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletProvidesMechanismToReturnToParent/appletProvidesMechanismToReturnToParent.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletProvidesMechanismToReturnToParent</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <applet id=\"assert-1\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\">\n        <param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletProvidesMechanismToReturnToParent/appletProvidesMechanismToReturnToParentSpec.js",
    "content": "describe('assessment: appletProvidesMechanismToReturnToParent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletProvidesMechanismToReturnToParent/appletProvidesMechanismToReturnToParent-nomatch.html',\n          assessments: [\n            'appletProvidesMechanismToReturnToParent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletProvidesMechanismToReturnToParent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletProvidesMechanismToReturnToParent');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletProvidesMechanismToReturnToParent/appletProvidesMechanismToReturnToParent.html',\n          assessments: [\n            'appletProvidesMechanismToReturnToParent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletProvidesMechanismToReturnToParent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletProvidesMechanismToReturnToParent');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletTextEquivalentsGetUpdated/appletTextEquivalentsGetUpdated-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletTextEquivalentsGetUpdated</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletTextEquivalentsGetUpdated/appletTextEquivalentsGetUpdated.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletTextEquivalentsGetUpdated</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <applet id=\"assert-1\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\">\n        <param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletTextEquivalentsGetUpdated/appletTextEquivalentsGetUpdatedSpec.js",
    "content": "describe('assessment: appletTextEquivalentsGetUpdated', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletTextEquivalentsGetUpdated/appletTextEquivalentsGetUpdated-nomatch.html',\n          assessments: [\n            'appletTextEquivalentsGetUpdated'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletTextEquivalentsGetUpdated.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletTextEquivalentsGetUpdated');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletTextEquivalentsGetUpdated/appletTextEquivalentsGetUpdated.html',\n          assessments: [\n            'appletTextEquivalentsGetUpdated'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletTextEquivalentsGetUpdated.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletTextEquivalentsGetUpdated');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletUIMustBeAccessible/appletUIMustBeAccessible-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletUIMustBeAccessible</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletUIMustBeAccessible/appletUIMustBeAccessible.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletUIMustBeAccessible</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\">\n      <applet id=\"assert-1\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\">\n        <param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletUIMustBeAccessible/appletUIMustBeAccessibleSpec.js",
    "content": "describe('assessment: appletUIMustBeAccessible', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletUIMustBeAccessible/appletUIMustBeAccessible-nomatch.html',\n          assessments: [\n            'appletUIMustBeAccessible'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletUIMustBeAccessible.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletUIMustBeAccessible');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletUIMustBeAccessible/appletUIMustBeAccessible.html',\n          assessments: [\n            'appletUIMustBeAccessible'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletUIMustBeAccessible.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletUIMustBeAccessible');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletsDoNotFlicker/appletsDoNotFlicker-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletsDoNotFlicker</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletsDoNotFlicker/appletsDoNotFlicker.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletsDoNotFlicker</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\">\n      <applet id=\"assert-1\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\">\n        <param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletsDoNotFlicker/appletsDoNotFlickerSpec.js",
    "content": "describe('assessment: appletsDoNotFlicker', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletsDoNotFlicker/appletsDoNotFlicker-nomatch.html',\n          assessments: [\n            'appletsDoNotFlicker'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletsDoNotFlicker.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletsDoNotFlicker');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletsDoNotFlicker/appletsDoNotFlicker.html',\n          assessments: [\n            'appletsDoNotFlicker'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletsDoNotFlicker.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletsDoNotFlicker');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletsDonotUseColorAlone/appletsDonotUseColorAlone-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletsDonotUseColorAlone</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletsDonotUseColorAlone/appletsDonotUseColorAlone.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>appletsDonotUseColorAlone</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\">\n      <applet id=\"assert-1\" code=\"http://www.java.com/en/download/JavaDetection.class\" width=\"500\" height=\"150\">\n        <param name=\"image\" value=\"http://www.java.com/im/download/verify_anim.gif\">\n        <param name=\"centerimage\" value=\"true\">\n        <param name=\"boxborder\" value=\"false\">\n        <param name=\"jnlp_href\" value=\"http://www.java.com/en/download/JavaDetection_applet.jnlp\">\n      </applet>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/appletsDonotUseColorAlone/appletsDonotUseColorAloneSpec.js",
    "content": "describe('assessment: appletsDonotUseColorAlone', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletsDonotUseColorAlone/appletsDonotUseColorAlone-nomatch.html',\n          assessments: [\n            'appletsDonotUseColorAlone'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletsDonotUseColorAlone.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletsDonotUseColorAlone');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/appletsDonotUseColorAlone/appletsDonotUseColorAlone.html',\n          assessments: [\n            'appletsDonotUseColorAlone'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.appletsDonotUseColorAlone.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('appletsDonotUseColorAlone');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaAltIdentifiesDestination/areaAltIdentifiesDestination-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaAltIdentifiesDestination</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\">\n      <img src=\"assets/library.gif\" usemap=\"#map1\" alt=\"Image map of areas in the library\" />\n      <map id=\"map1\" name=\"map1\">\n        <area id=\"assert-1\" shape=\"rect\" coords=\"0,0,50,50\" href=\"assets.html\" alt=\"drawing of a blue book\" />\n      </map>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaAltIdentifiesDestination/areaAltIdentifiesDestination.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaAltIdentifiesDestination</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <img src=\"assets/library.gif\" usemap=\"#map1\" alt=\"Image map of areas in the library\" />\n      <map id=\"map1\" name=\"map1\">\n        <area id=\"assert-1\" shape=\"rect\" coords=\"0,0,50,50\" href=\"reference.html\" />\n      </map>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaAltIdentifiesDestination/areaAltIdentifiesDestinationSpec.js",
    "content": "describe('assessment: areaAltIdentifiesDestination', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaAltIdentifiesDestination/areaAltIdentifiesDestination-nomatch.html',\n          assessments: [\n            'areaAltIdentifiesDestination'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaAltIdentifiesDestination.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaAltIdentifiesDestination');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaAltIdentifiesDestination/areaAltIdentifiesDestination.html',\n          assessments: [\n            'areaAltIdentifiesDestination'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaAltIdentifiesDestination.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaAltIdentifiesDestination');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaAltRefersToText/areaAltRefersToText-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaAltRefersToText</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaAltRefersToText/areaAltRefersToText.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaAltRefersToText</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\">\n      <img src=\"assets/welcome.gif\" usemap=\"#map1\" alt=\"Image map of areas in the library\" />\n      <map id=\"map1\" name=\"map1\">\n        <area id=\"assert-1\" shape=\"rect\" coords=\"0,0,80,30\" href=\"reference.html\" alt=\"Reference\" />\n      </map>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaAltRefersToText/areaAltRefersToTextSpec.js",
    "content": "describe('assessment: areaAltRefersToText', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaAltRefersToText/areaAltRefersToText-nomatch.html',\n          assessments: [\n            'areaAltRefersToText'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaAltRefersToText.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaAltRefersToText');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaAltRefersToText/areaAltRefersToText.html',\n          assessments: [\n            'areaAltRefersToText'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaAltRefersToText.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaAltRefersToText');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaDontOpenNewWindow/areaDontOpenNewWindow.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaDontOpenNewWindow</title>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <map id=\"map1\" name=\"map1\">\n        <area id=\"assert-1\" shape=\"rect\" coords=\"0,0,30,30\" href=\"reference.html\" alt=\"reference section\" />\n      </map>\n    </div>\n\n    <div data-expected=\"pass\">\n      <map id=\"map4\" name=\"map1\">\n        <area id=\"assert-2\" shape=\"rect\" coords=\"0,0,30,30\" href=\"reference.html\" alt=\"hello\" target=\"_parent\" />\n      </map>\n    </div>\n\n    <div data-expected=\"pass\">\n      <map id=\"map1\" name=\"map1\">\n        <area id=\"assert-3\" shape=\"rect\" coords=\"0,0,30,30\" href=\"reference.html\" alt=\"reference section\" target=\"_top\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map id=\"map4\" name=\"map1\">\n        <area id=\"assert-4\" shape=\"rect\" coords=\"0,0,30,30\" href=\"reference.html\" alt=\"hello\" target=\"_new\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map id=\"map1\" name=\"map1\">\n        <area id=\"assert-5\" shape=\"rect\" coords=\"0,0,30,30\" href=\"reference.html\" alt=\"reference section\" target=\"_blank\" />\n      </map>\n    </div>\n\n    <div data-expected=\"pass\">\n      <map id=\"map4\" name=\"map1\">\n        <area id=\"assert-6\" shape=\"rect\" coords=\"0,0,30,30\" href=\"reference.html\" alt=\"hello\" title=\"valid file - opens in a new window\" target=\"_blank\" />\n      </map>\n    </div>\n\n    <div data-expected=\"pass\">\n      <p>This link to an <a id=\"assert-1\" href=\"aLinksDontOpenNewWindow.html\">invalid file</a> opens in the same window.</p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"Target is parent\">\n      <p>This link to an <a id=\"assert-2\" href=\"aLinksDontOpenNewWindow.html\" target=\"_parent\">invalid file</a> opens in the same window.</p>\n    </div>D\n\n    <div data-expected=\"pass\" title=\"Target is top\">\n      <a id=\"assert-3\" href=\"newwindow.html\" target=\"_top\">same window</a>\n    </div>\n\n    <div data-expected=\"fail\" title=\"target new\">\n      <p>This link to a <a id=\"assert-4\" href=\"aLinksDontOpenNewWindow.html\" target=\"_new\">valid file</a> opens in a new window.</p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"target blank with new window text\">\n      <p>This link to a <a id=\"assert-5\" href=\"aLinksDontOpenNewWindow.html\" target=\"_blank\">valid file that opens in a new window</a>.</p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"target blank with new window text in title atribute\">\n      <p>This link to a <a id=\"assert-6\" href=\"aLinksDontOpenNewWindow.html\" title=\"valid file - opens in a new window\" target=\"_blank\">valid file</a>.</p>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaDontOpenNewWindow/areaDontOpenNewWindowSpec.js",
    "content": "describe('assessment: areaDontOpenNewWindow', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaDontOpenNewWindow/areaDontOpenNewWindow.html',\n          assessments: [\n            'areaDontOpenNewWindow'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaDontOpenNewWindow.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(6);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaDontOpenNewWindow');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaHasAltValue/areaHasAltValue-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaHasAltValue</title>\n  </head>\n  <body>\n\n    <div data-expect=\"inapplicable\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaHasAltValue/areaHasAltValue.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaHasAltValue</title>\n  </head>\n  <body>\n\n    <img  usemap=\"#map1\" src=\"\" alt=\"\" />\n    <map id=\"map1\" name=\"map1\">\n      <area id=\"assert-1\" shape=\"rect\" coords=\"0,0,30,30\" href=\"reference.html\" alt=\"reference section\" />\n    </map>\n\n    <img  usemap=\"#map2\" src=\"\" alt=\"\" />\n    <map id=\"map2\" name=\"map2\">\n      <area id=\"assert-2\" shape=\"rect\" coords=\"0,0,30,30\" href=\"reference.html\" />\n    </map>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaHasAltValue/areaHasAltValueSpec.js",
    "content": "describe('assessment: areaHasAltValue', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaHasAltValue/areaHasAltValue-nomatch.html',\n          assessments: [\n            'areaHasAltValue'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaHasAltValue.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaHasAltValue');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaHasAltValue/areaHasAltValue.html',\n          assessments: [\n            'areaHasAltValue'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaHasAltValue.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaHasAltValue');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaLinksToSoundFile/areaLinksToSoundFile-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaLinksToSoundFile</title>\n  </head>\n  <body>\n\n    <div data-expect=\"inapplicable\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaLinksToSoundFile/areaLinksToSoundFile.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>areaLinksToSoundFile</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-1\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.pcm\" alt=\"hello\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-2\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.aif\" alt=\"hello\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-3\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.smp\" alt=\"hello\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <img src=\"../assets/welcome.gif\" usemap=\"#map1\" alt=\"Image map of areas in the library\" />\n      <map name=\"map1\">\n        <area shape=\"rect\" coords=\"0,0,80,30\" href=\"reference.html\" alt=\"Reference\" />\n        <area id=\"assert-4\" shape=\"rect\" coords=\"0,35,110,100\" href=\"avlab.mp3\" alt=\"Audio Visual Lab\" />\n      </map>\n      <a href=\"avlab.txt\">Audio Visual Lab Text Transcript</a>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-5\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.snd\" alt=\"hello\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-6\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.snd\" alt=\"hello\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-7\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.iff\" alt=\"hello\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-8\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.svx\" alt=\"hello\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-9\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.sam\" alt=\"hello\" />\n      </map>\n    </div>\n\n    <div data-expected=\"fail\">\n      <map name=\"map1\">\n        <area id=\"assert-10\" shape=\"rect\" coords=\"0,0,30,30\" href=\"speach.vce\" alt=\"hello\" />\n      </map>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/areaLinksToSoundFile/areaLinksToSoundFileSpec.js",
    "content": "describe('assessment: areaLinksToSoundFile', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaLinksToSoundFile/areaLinksToSoundFile-nomatch.html',\n          assessments: [\n            'areaLinksToSoundFile'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaLinksToSoundFile.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaLinksToSoundFile');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/areaLinksToSoundFile/areaLinksToSoundFile.html',\n          assessments: [\n            'areaLinksToSoundFile'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.areaLinksToSoundFile.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(10);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('areaLinksToSoundFile');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/audioMayBePresent/audioMayBePresent.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>audioMayBePresent</title>\n  </head>\n\n  <body>\n\n    <div data-expected=\"inapplicable\">\n      <a id=\"assert-1\" href=\"horses.html\">Horses</a>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <a id=\"assert-2\" href=\"horses.mp3\">Horses.mp3</a>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <audio id=\"assert-3\" controls src=\"horse.ogg\">\n        Your browser does not support the audio tag.\n      </audio>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <audio id=\"assert-4\" controls>\n        <source src=\"horse.ogg\" type=\"audio/ogg\"></source>\n        Your browser does not support the audio tag.\n      </audio>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <object id=\"assert-5\">May be an audio player</object>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/audioMayBePresent/audioMayBePresentSpec.js",
    "content": "describe('assessment: audioMayBePresent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/audioMayBePresent/audioMayBePresent.html',\n        assessments: [\n          'audioMayBePresent'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    // @todo it should be 5, but the assessment is incorrectly finding cases.\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('audioMayBePresent');\n  });\n\n  //   it('should return the proper assessment for assert-1', function () {\n  //     cases = quailResults.tests.audioMayBePresent.cases;\n  //     expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  //   });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.audioMayBePresent.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('cantTell');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.audioMayBePresent.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('cantTell');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.audioMayBePresent.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('cantTell');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.audioMayBePresent.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('cantTell');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/basefontIsNotUsed/basefontIsNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>basefontIsNotUsed</title>\n  </head>\n  <body>\n\n    <div data-expected=\"inapplicable\">\n      <p>A paragraph with no basefont.</p>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/basefontIsNotUsed/basefontIsNotUsed.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>basefontIsNotUsed</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\">\n      <basefont id=\"assert-1\" face=\"Arial\" size=\"4\">Wow, basefont. Yeah</basefont>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/basefontIsNotUsed/basefontIsNotUsedSpec.js",
    "content": "describe('assessment: basefontIsNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/basefontIsNotUsed/basefontIsNotUsed-nomatch.html',\n          assessments: [\n            'basefontIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.basefontIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('basefontIsNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/basefontIsNotUsed/basefontIsNotUsed.html',\n          assessments: [\n            'basefontIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.basefontIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('basefontIsNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/blinkIsNotUsed/blinkIsNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>blinkIsNotUsed</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\">\n      <p>No blink!</p>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/blinkIsNotUsed/blinkIsNotUsed.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>blinkIsNotUsed</title>\n  </head>\n  <body>\n\n    <div data-expected=\"fail\">\n      <blink id=\"assert-1\">blinks</blink>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/blinkIsNotUsed/blinkIsNotUsedSpec.js",
    "content": "describe('assessment: blinkIsNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/blinkIsNotUsed/blinkIsNotUsed-nomatch.html',\n          assessments: [\n            'blinkIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.blinkIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('blinkIsNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/blinkIsNotUsed/blinkIsNotUsed.html',\n          assessments: [\n            'blinkIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.blinkIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('blinkIsNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/blockquoteNotUsedForIndentation/blockquoteNotUsedForIndentation-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>blockquoteNotUsedForIndentation</title>\n  </head>\n  <body>\n\n    <div data-expected=\"inapplicable\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/blockquoteNotUsedForIndentation/blockquoteNotUsedForIndentation.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>blockquoteNotUsedForIndentation</title>\n  </head>\n  <body>\n\n    <div data-expected=\"pass\">\n      <blockquote id=\"assert-1\" cite=\"John Steinbeck\">Ideas are like rabbits. You get a couple and learn how to handle them, and pretty soon you have a dozen.</blockquote>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <blockquote id=\"assert-2\">Ideas are like rabbits. You get a couple and learn how to handle them, and pretty soon you have a dozen.</blockquote>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/blockquoteNotUsedForIndentation/blockquoteNotUsedForIndentationSpec.js",
    "content": "describe('assessment: blockquoteNotUsedForIndentation', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/blockquoteNotUsedForIndentation/blockquoteNotUsedForIndentation-nomatch.html',\n          assessments: [\n            'blockquoteNotUsedForIndentation'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.blockquoteNotUsedForIndentation.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('blockquoteNotUsedForIndentation');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/blockquoteNotUsedForIndentation/blockquoteNotUsedForIndentation.html',\n          assessments: [\n            'blockquoteNotUsedForIndentation'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.blockquoteNotUsedForIndentation.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('blockquoteNotUsedForIndentation');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/blockquoteUseForQuotations/blockquoteUseForQuotations.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>blockquoteUseForQuotations</title>\n\t</head>\n\t<body>\n\t\t<div data-expected=\"inapplicable\">\n\t\t\t<blockquote>\n\t\t\t\t<p id=\"assert-1\">\"This is a paragraph that is a quote inside a larger blockquote.\"</p>\n\t\t\t</blockquote>\n\t\t</div>\n\n\t\t<div data-expected=\"pass\">\n\t\t  <p id=\"assert-2\">This is a paragraph that is not a quote.</p>\n\t\t</div>\n\n\t\t<div data-expected=\"fail\">\n\t\t  <p id=\"assert-3\">\"This entire paragraph is a single quote.\"</p>\n    </div>\n\n\t\t\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/blockquoteUseForQuotations/blockquoteUseForQuotationsSpec.js",
    "content": "describe('assessment: blockquoteUseForQuotations', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/blockquoteUseForQuotations/blockquoteUseForQuotations.html',\n        assessments: [\n          'blockquoteUseForQuotations'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('blockquoteUseForQuotations');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.blockquoteUseForQuotations.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.blockquoteUseForQuotations.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.blockquoteUseForQuotations.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/boldIsNotUsed/boldIsNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>boldIsNotUsed</title>\n  </head>\n  <body>\n\n    <div data-expected=\"inapplicable\">\n      <p>\n        What she <em>really</em>\n        meant to say was, \"This isn't ok, it is <strong>excellent</strong>!\"\n      </p>\n    </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/boldIsNotUsed/boldIsNotUsed.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>boldIsNotUsed</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <p>What she\n        <bold id=\"assert-1\">really</bold>\n        meant to say was, \"This isn't ok, it is\n        <bold id=\"assert-2\">excellent</bold>!\"\n      </p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/boldIsNotUsed/boldIsNotUsedSpec.js",
    "content": "describe('assessment: boldIsNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/boldIsNotUsed/boldIsNotUsed-nomatch.html',\n          assessments: [\n            'boldIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.boldIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('boldIsNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/boldIsNotUsed/boldIsNotUsed.html',\n          assessments: [\n            'boldIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.boldIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('boldIsNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/buttonDoesNotChangeContextOnFocus/buttonDoesNotChangeContextOnFocus.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>buttonDoesNotChangeContextOnFocus</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n      <form>\n        <input type=\"submit\" value=\"submit\" onfocus=\"foo;\">\n      </form>\n    </div>\n\n    <div data-expected=\"fail\">\n      <form>\n        <input type=\"button\" value=\"submit\" onfocus=\"foo;\">\n      </form>\n    </div>\n\n    <div data-expected=\"fail\">\n      <form>\n        <button onfocus=\"foo;\">Button</button>\n      </form>\n    </div>\n\n    <div data-expected=\"pass\">\n      <form>\n        <input type=\"submit\" value=\"submit\">\n      </form>\n    </div>\n\n    <div data-expected=\"pass\">\n      <form>\n        <input type=\"button\" value=\"submit\">\n      </form>\n    </div>\n\n    <div data-expected=\"pass\">\n      <form>\n        <button>Button</button>\n      </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/buttonDoesNotChangeContextOnFocus/buttonDoesNotChangeContextOnFocusSpec.js",
    "content": "xdescribe('assessment: buttonDoesNotChangeContextOnFocus', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/buttonDoesNotChangeContextOnFocus/buttonDoesNotChangeContextOnFocus.html',\n        assessments: [\n          'buttonDoesNotChangeContextOnFocus'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(0);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('buttonDoesNotChangeContextOnFocus');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.buttonDoesNotChangeContextOnFocus.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/buttonHasName/buttonHasName.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>buttonHasName</title>\n  </head>\n  <body>\n\n    <div data-expected=\"inapplicable\">\n      <button id=\"assert-1\" style=\"display:none\"></button>\n    </div>\n\n    <div data-expected=\"pass\">\n      <button id=\"assert-2\" id=\"button\">Submit form</button>\n    </div>\n\n    <div data-expected=\"pass\">\n      <!-- This should only be done if the button has some sort of background -->\n      <button id=\"assert-3\" id=\"button\" title=\"Submit form\"></button>\n    </div>\n\n    <div data-expected=\"fail\">\n      <button id=\"assert-4\" id=\"button\"></button>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/buttonHasName/buttonHasNameSpec.js",
    "content": "describe('assessment: buttonHasName', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/buttonHasName/buttonHasName.html',\n        assessments: [\n          'buttonHasName'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('buttonHasName');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.buttonHasName.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.buttonHasName.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.buttonHasName.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.buttonHasName.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/checkboxHasLabel/checkboxHasLabel.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>checkboxHasLabel</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n      <p>\n        <input id=\"assert-1\" type=\"checkbox\" title=\"\" name=\"mytext\" tabindex=\"1\"/>\n      </p>\n    </form>\n  </div>\n  <div data-expected=\"fail\">\n    <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n      <p>\n        <input id=\"assert-2\" type=\"checkbox\" title=\"birds\" name=\"mytext\" tabindex=\"1\" />\n      </p>\n    </form>\n  </div>\n  <div data-expected=\"fail\">\n    <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n      <p>\n        <label>\n          <input id=\"assert-3\" type=\"checkbox\" name=\"mytext\" />\n        </label>\n      </p>\n    </form>\n  </div>\n  <div data-expected=\"fail\">\n    <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n      <p>\n        <label for=\"assert-4\"></label>\n        <input id=\"assert-4\" type=\"checkbox\" name=\"mytext\" tabindex=\"1\" />\n      </p>\n    </form>\n  </div>\n  <div data-expected=\"pass\">\n      <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n          <p>\n              <label>\n                  birds\n                  <input id=\"assert-5\" type=\"checkbox\" name=\"mytext\" />\n              </label>\n          </p>\n      </form>\n  </div>\n  <div data-expected=\"pass\">\n    <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n      <p>\n        <label for=\"assert-6\">birds</label>\n        <input id=\"assert-6\" type=\"checkbox\" name=\"mytext\" tabindex=\"1\" />\n      </p>\n    </form>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/checkboxHasLabel/checkboxHasLabelSpec.js",
    "content": "describe('assessment: checkboxHasLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/checkboxHasLabel/checkboxHasLabel.html',\n        assessments: [\n          'checkboxHasLabel'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('checkboxHasLabel');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.checkboxHasLabel.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.checkboxHasLabel.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.checkboxHasLabel.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.checkboxHasLabel.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.checkboxHasLabel.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.checkboxHasLabel.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorBackgroundGradientContrast/colorBackgroundGradientContrast.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>colorBackgroundGradientContrast</title>\n  <style>\n    #test-1 p {\n      color: #fff;\n      padding: 10px;\n      background-image: -webkit-linear-gradient(0deg, #de88de, #98afd6);\n      background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#de88de), color-stop(100%,#98afd6));\n      background-image: -moz-linear-gradient(0deg, #de88de, #98afd6);\n      background-image: -o-linear-gradient(0deg, #de88de, #98afd6);\n      background-image: -ms-linear-gradient(0deg, #de88de, #98afd6);\n      background-image: linear-gradient(0deg, #de88de, #98afd6);\n    }\n    #test-2 p {\n      color: #fff;\n      padding: 10px;\n      background-image: -webkit-linear-gradient(0deg, #610061, #032966);\n      background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#610061), color-stop(100%,#032966));\n      background-image: -moz-linear-gradient(0deg, #610061, #032966);\n      background-image: -o-linear-gradient(0deg, #610061, #032966);\n      background-image: -ms-linear-gradient(0deg, #610061, #032966);\n      background-image: linear-gradient(0deg, #610061, #032966);\n    }\n\n    #test-3 p {\n      color: #fff;\n      padding: 10px;\n      background-image: -webkit-linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      background-image: -webkit-gradient(linear, left top, right top, color-stop(0%,#ff0000), color-stop(25%,#f06d06), color-stop(25%,#f06d06), color-stop(50%,#ffff00), color-stop(75%,#008000), color-stop(100%,#008000));\n      background-image: -moz-linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      background-image: -o-linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      background-image: -ms-linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      background-image: linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n    }\n\n    #test-4 p {\n      color: #fff;\n      padding: 10px;\n      background-image: -webkit-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#ff0000), color-stop(25%,#f06d06), color-stop(50%,#ffff00), color-stop(75%,#008000), color-stop(100%,#008000));\n      background-image: -moz-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -o-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -ms-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      text-align: center;\n    }\n  </style>\n</head>\n<body>\n  <div id=\"test-1\" data-expected=\"fail\">\n    <p id=\"assert-1\">This test is not readable</p>\n  </div>\n\n  <div id=\"test-2\" data-expected=\"pass\">\n    <p id=\"assert-2\">This test is readable</p>\n  </div>\n\n  <div id=\"test-3\" data-expected=\"fail\">\n    <p id=\"assert-3\">This test is not readable</p>\n  </div>\n\n  <div id=\"test-4\" data-expected=\"fail\">\n    <p id=\"assert-4\">This test is not readable, but on screen it is</p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorBackgroundGradientContrast/colorBackgroundGradientContrastSpec.js",
    "content": "describe('assessment: colorBackgroundGradientContrast', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  xdescribe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/colorBackgroundGradientContrast/colorBackgroundGradientContrast-nomatch.html',\n          assessments: [\n            'colorBackgroundGradientContrast'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.colorBackgroundGradientContrast.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('colorBackgroundGradientContrast');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/colorBackgroundGradientContrast/colorBackgroundGradientContrast.html',\n          assessments: [\n            'colorBackgroundGradientContrast'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.colorBackgroundGradientContrast.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(4);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('colorBackgroundGradientContrast');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorBackgroundImageContrast/colorBackgroundImageContrast.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>colorBackgroundImageContrast</title>\n  <style>\n    #test-1 {\n      background-image: url('assets/fish.gif');\n    }\n    #test-1 p {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n    }\n    #test-2 {\n      background-image: url('assets/kids.jpg');\n    }\n    #test-2 p {\n      color: #fff;\n      font-size: 16px;\n      font-weight: 700;\n    }\n    #test-3 {\n      background-image: url('assets/doesnotexist.jpg');\n    }\n    #test-3 p {\n      color: #fff;\n      font-size: 16px;\n      font-weight: 700;\n    }\n    #test-4 {\n      background-image: url('assets/quail.png');\n    }\n    #test-4 p {\n      color: #fff;\n      font-size: 16px;\n      font-weight: 700;\n    }\n  </style>\n</head>\n<body>\n  <div id=\"test-1\" data-expected=\"fail\">\n    <p id=\"assert-1\">This test is not readable, thanks to the fish</p>\n  </div>\n\n  <div id=\"test-2\" data-expected=\"pass\">\n    <p id=\"assert-2\">This test is readable, thanks to the kids</p>\n  </div>\n\n  <div id=\"test-3\" data-expected=\"cantTell\">\n    <p id=\"assert-3\">This test is readable, non existing background</p>\n  </div>\n\n  <div id=\"test-4\" data-expected=\"pass\">\n    <p id=\"assert-4\">This test is readable, external image</p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorBackgroundImageContrast/colorBackgroundImageContrastSpec.js",
    "content": "describe('assessment: colorBackgroundImageContrast', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  xdescribe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/colorBackgroundImageContrast/colorBackgroundImageContrast-nomatch.html',\n          assessments: [\n            'colorBackgroundImageContrast'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.colorBackgroundImageContrast.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('colorBackgroundImageContrast');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/colorBackgroundImageContrast/colorBackgroundImageContrast.html',\n          assessments: [\n            'colorBackgroundImageContrast'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.colorBackgroundImageContrast.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(4);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('colorBackgroundImageContrast');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorElementBehindBackgroundGradientContrast/colorElementBehindBackgroundGradientContrast.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>colorElementBehindBackgroundGradientContrast</title>\n  <style>\n    #test-1 {\n      color: #fff;\n      padding: 10px;\n      background-image: -webkit-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#ff0000), color-stop(25%,#f06d06), color-stop(50%,#ffff00), color-stop(75%,#008000), color-stop(100%,#008000));\n      background-image: -moz-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -o-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -ms-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      text-align: center;\n    }\n    #test-2 {\n      color: #000;\n      padding: 10px;\n      background-image: -webkit-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -webkit-gradient(radial, center center, 0px, center center, 100%, color-stop(0%,#ff0000), color-stop(25%,#f06d06), color-stop(50%,#ffff00), color-stop(75%,#008000), color-stop(100%,#008000));\n      background-image: -moz-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -o-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: -ms-radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      background-image: radial-gradient(#ff0000, #f06d06, #ffff00, #008000);\n      text-align: center;\n    }\n    #test-2 p {\n      background: #E9E9E9;\n    }\n    #test-3 {\n      position: relative;\n      padding: 0;\n    }\n    #test-3 .bck {\n      background-image: -webkit-linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      background-image: -webkit-gradient(linear, left top, right top, color-stop(0%,#ff0000), color-stop(25%,#f06d06), color-stop(25%,#f06d06), color-stop(50%,#ffff00), color-stop(75%,#008000), color-stop(100%,#008000));\n      background-image: -moz-linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      background-image: -o-linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      background-image: -ms-linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      background-image: linear-gradient(to right, #ff0000, #f06d06, #ffff00, #008000);\n      height: 50px;\n      width: 100%;\n      position: absolute;\n    }\n    #test-3 .txt {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n      height: 18px;\n      position: relative;\n    }\n  </style>\n</head>\n<body>\n\n  <div id=\"test-1\" data-expected=\"fail\">\n    <p id=\"assert-1\">This test is not readable, but on screen it is</p>\n  </div>\n\n  <div id=\"test-2\" data-expected=\"pass\">\n    <p id=\"assert-2\">This test is readable, does not check the gradient since there's a background color.</p>\n  </div>\n\n  <div id=\"test-3\" data-expected=\"fail\">\n    <div class=\"bck\"></div>\n    <p id=\"assert-3\" class=\"txt\">This test is not readable.</p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorElementBehindBackgroundGradientContrast/colorElementBehindBackgroundGradientContrastSpec.js",
    "content": "describe('assessment: colorElementBehindBackgroundGradientContrast', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  xdescribe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/colorElementBehindBackgroundGradientContrast/colorElementBehindBackgroundGradientContrast-nomatch.html',\n          assessments: [\n            'colorElementBehindBackgroundGradientContrast'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.colorElementBehindBackgroundGradientContrast.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('colorElementBehindBackgroundGradientContrast');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/colorElementBehindBackgroundGradientContrast/colorElementBehindBackgroundGradientContrast.html',\n          assessments: [\n            'colorElementBehindBackgroundGradientContrast'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.colorElementBehindBackgroundGradientContrast.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(3);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('colorElementBehindBackgroundGradientContrast');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorElementBehindBackgroundImageContrast/colorElementBehindBackgroundImageContrast.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>colorElementBehindBackgroundImageContrast</title>\n  <style>\n\n    #test-1 {\n      background-image: url('assets/fish.gif');\n    }\n    #test-1 p {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n    }\n\n    #test-2 {\n      background-image: url('assets/kids.jpg');\n    }\n    #test-2 p {\n      background: #000;\n      color: #fff;\n      font-size: 16px;\n      font-weight: 700;\n    }\n\n    #test-3 {\n      position: relative;\n      padding: 0;\n    }\n    #test-3 .bck {\n      background-image: url('assets/fish.gif');\n      height: 50px;\n      width: 100%;\n      position: absolute;\n    }\n    #test-3 .txt {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n      height: 50px;\n      position: relative;\n    }\n\n    #test-4 {\n      background-image: url('assets/quail.png');\n    }\n    #test-4 p {\n      background: #000;\n      color: #fff;\n      font-size: 16px;\n      font-weight: 700;\n    }\n\n  </style>\n</head>\n<body>\n\n  <div data-expected=\"fail\" id=\"test-1\">\n    <p id=\"assert-1\">This test is not readable, thanks to the fish</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-2\">\n    <p id=\"assert-2\">This test is readable, thanks to the kids</p>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-3\">\n    <div class=\"bck\"></div>\n    <p id=\"assert-3\" class=\"txt\">This test is not readable.</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-4\">\n    <p id=\"assert-4\">This test is readable, external image</p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorElementBehindBackgroundImageContrast/colorElementBehindBackgroundImageContrastSpec.js",
    "content": "describe('assessment: colorElementBehindBackgroundImageContrast', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/colorElementBehindBackgroundImageContrast/colorElementBehindBackgroundImageContrast.html',\n        assessments: [\n          'colorElementBehindBackgroundImageContrast'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('colorElementBehindBackgroundImageContrast');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.colorElementBehindBackgroundImageContrast.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.colorElementBehindBackgroundImageContrast.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.colorElementBehindBackgroundImageContrast.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.colorElementBehindBackgroundImageContrast.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorElementBehindContrast/colorElementBehindContrast.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>colorElementBehindContrast</title>\n  <style>\n    #test-1 {\n      background: #666;\n    }\n    #test-1 .txt {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n    }\n    #test-2 {\n      background: #fff;\n    }\n    #test-2 .txt {\n      color: #000;\n      font-size: 16px;\n      font-weight: 700;\n    }\n  </style>\n</head>\n<body>\n  <div data-expected=\"fail\" id=\"test-1\">\n    <div class=\"bck\"></div>\n    <p id=\"assert-1\" class=\"txt\">This test is not readable.</p>\n  </div>\n  <div data-expected=\"pass\" id=\"test-2\">\n    <div class=\"bck\"></div>\n    <p id=\"assert-2\" class=\"txt\">This test is readable.</p>\n  </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorElementBehindContrast/colorElementBehindContrastSpec.js",
    "content": "describe('assessment: colorElementBehindContrast', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/colorElementBehindContrast/colorElementBehindContrast.html',\n        assessments: [\n          'colorElementBehindContrast'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('colorElementBehindContrast');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.colorElementBehindContrast.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.colorElementBehindContrast.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorFontContrast/colorFontContrast.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>colorFontContrast</title>\n  <style>\n    #test-1 p {\n      background: #E9E9E9;\n      color: #C8D8DF;\n    }\n\n    #test-2 p {\n      background: #E9E9E9;\n      color: #C8D8DF;\n      font-size: 32px;\n      font-weight: bold;\n    }\n\n    #test-3 p {\n      background: #E9E9E9;\n      color: #000;\n    }\n\n    #test-4 p {\n      background: #E9E9E9;\n      color: #6c6c6c;\n      font-size: 16px;\n    }\n\n    #test-5 p {\n      background: #E9E9E9;\n      color: #666;\n      font-size: 16px;\n      font-weight: bold;\n    }\n\n    #test-6 p {\n      background: #E9E9E9;\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n    }\n\n    #test-7 {\n      background-image: url('assets/fish.gif');\n    }\n    #test-7 p {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n    }\n\n    #test-8 {\n      background-image: url('assets/kids.jpg');\n    }\n    #test-8 p {\n      background: #000;\n      color: #fff;\n      font-size: 16px;\n      font-weight: 700;\n    }\n\n    #test-9 p {\n      color: #fff;\n      padding: 10px;\n      background-image: linear-gradient(to bottom, #de88de, #98afd6);\n    }\n    #test-10 p {\n      color: #fff;\n      padding: 10px;\n      background-image: linear-gradient(to bottom, #610061, #032966);\n    }\n\n    #test-11 p {\n      color: #fff;\n      padding: 10px;\n      background-image: linear-gradient(to right, red, #f06d06, rgb(255, 255, 0), green);\n    }\n\n    #test-12 {\n      color: #fff;\n      padding: 10px;\n      background-image: radial-gradient(red, #f06d06, rgb(255, 255, 0), green);\n      text-align: center;\n    }\n\n    #test-13 {\n      color: #000;\n      padding: 10px;\n      background-image: radial-gradient(red, #f06d06, rgb(255, 255, 0), green);\n      text-align: center;\n    }\n    #test-13 p {\n      background: #E9E9E9;\n    }\n\n    #test-14 {\n      position: relative;\n      padding: 0;\n    }\n    #test-14 .bck {\n      background-image: url('assets/fish.gif');\n      background: #666;\n      height: 50px;\n      width: 100%;\n    }\n    #test-14 .txt {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n      position: relative;\n    }\n\n    #test-16 {\n      position: relative;\n      padding: 0;\n    }\n    #test-16 .bck {\n      background-image: linear-gradient(to right, red, #f06d06, rgb(255, 255, 0), green);\n      height: 50px;\n      width: 100%;\n    }\n    #test-16 .txt {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n      position: relative;\n    }\n\n    #test-18 {\n      position: relative;\n      padding: 0;\n    }\n    #test-18 .bck {\n      background-image: url('assets/fish.gif');\n      height: 50px;\n      width: 100%;\n    }\n    #test-18 .txt {\n      color: #666;\n      font-size: 16px;\n      font-weight: 700;\n      position: relative;\n    }\n\n    #test-19 {\n      background-image: url('assets/doesnotexist.jpg');\n    }\n    #test-19 p {\n      background: #000;\n      color: #fff;\n      font-size: 16px;\n      font-weight: 700;\n    }\n\n    #test-20 {\n      background-image: url('assets/quail.png');\n    }\n    #test-20 p {\n      background: #000;\n      color: #fff;\n      font-size: 16px;\n      font-weight: 700;\n    }\n\n  </style>\n</head>\n<body>\n  <div data-expected=\"pass\" id=\"test-0\">\n    <p id=\"assert-1\">This text is readable</p>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-1\">\n    <p id=\"assert-2\">This text is not readable</p>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-2\">\n    <p id=\"assert-3\">This text is not readable, even if it's huge and bold</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-3\">\n    <p id=\"assert-4\">This test is readable.</p>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-4\">\n    <p id=\"assert-5\">This test is not readable, only 16px and not bold</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-5\">\n    <p id=\"assert-6\">This test is readable, 16px and bold</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-6\">\n    <p id=\"assert-7\">This test is readable, 16px and font weight 700</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-7\">\n    <p id=\"assert-8\">This test is not readable, thanks to the fish</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-8\">\n    <p id=\"assert-9\">This test is readable, thanks to the kids</p>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-9\">\n    <p id=\"assert-10\">This test is not readable</p>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-10\">\n    <p id=\"assert-11\">This test is readable</p>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-11\">\n    <p id=\"assert-12\">This test is not readable</p>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-12\">\n    <p id=\"assert-13\">This test is not readable, but on screen it is</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-13\">\n    <p id=\"assert-14\">This test is readable, does not check the gradient since there's a background color.</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-14\">\n    <div class=\"bck\"></div>\n    <p id=\"assert-15\" class=\"txt\">This test is not readable.</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-16\">\n    <div class=\"bck\"></div>\n    <p id=\"assert-16\" class=\"txt\">This test is not readable.</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-18\">\n    <div class=\"bck\"></div>\n    <p id=\"assert-17\" class=\"txt\">This test is not readable.</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-19\">\n    <p id=\"assert-18\">This test is readable, non existing background</p>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-20\">\n    <p id=\"assert-19\">This test is readable, external image</p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/colorFontContrast/colorFontContrastSpec.js",
    "content": "describe('assessment: colorFontContrast', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/colorFontContrast/colorFontContrast.html',\n        assessments: [\n          'colorFontContrast'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(19);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('colorFontContrast');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-8', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-9', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-9').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-10', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-11', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-12', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-13', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-14', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-14').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-15', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-15').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-16', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-16').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-17', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-17').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-18', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-18').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-19', function () {\n    cases = quailResults.tests.colorFontContrast.cases;\n    expect(cases).quailGetById('assert-19').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/cssDocumentMakesSenseStyleTurnedOff/cssDocumentMakesSenseStyleTurnedOff.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>cssDocumentMakesSenseStyleTurnedOff</title>\n  </head>\n  <body>\n\n    <div data-expect=\"untested\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/cssDocumentMakesSenseStyleTurnedOff/cssDocumentMakesSenseStyleTurnedOffSpec.js",
    "content": "describe('assessment: cssDocumentMakesSenseStyleTurnedOff', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/cssDocumentMakesSenseStyleTurnedOff/cssDocumentMakesSenseStyleTurnedOff.html',\n          assessments: [\n            'cssDocumentMakesSenseStyleTurnedOff'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.cssDocumentMakesSenseStyleTurnedOff.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('cssDocumentMakesSenseStyleTurnedOff');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('untested');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/definitionListsAreUsed/definitionListsAreUsed.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <style>\n    .span span {\n      font-weight: bold;\n    }\n  </style>\n  <title>definitionListsAreUsed</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <ul>\n      <li id=\"assert-1\" class=\"quail-failed-element\"><strong>Term A</strong> - Definition for term A</li>\n      <li class=\"quail-failed-element\"><strong>Term B</strong> - Definition for term B</li>\n    </ul>\n  </div>\n  <div data-expected=\"fail\">\n    <ul class=\"span\">\n      <li id=\"assert-2\" class=\"quail-failed-element\"><span>Term A</span> - Definition for term A</li>\n      <li class=\"quail-failed-element\"><span>Term B</span> - Definition for term B</li>\n    </ul>\n  </div>\n  <div data-expected=\"inapplicable\">\n    <dl id=\"assert-3\">\n      <dt>Term A</dt>\n      <dd>Definition for term A</dd>\n      <dt>Term B</dt>\n      <dd>Definition for term B</dd>\n    </dl>\n  </div>\n  <div data-expected=\"pass\">\n    <ul>\n      <li id=\"assert-4\"><span>This thing</span> is pretty interesting</li>\n      <li><span>And this other thing</span> is also interesting.</li>\n    </ul>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/definitionListsAreUsed/definitionListsAreUsedSpec.js",
    "content": "describe('assessment: definitionListsAreUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/definitionListsAreUsed/definitionListsAreUsed.html',\n        assessments: [\n          'definitionListsAreUsed'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(7);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('definitionListsAreUsed');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.definitionListsAreUsed.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.definitionListsAreUsed.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.definitionListsAreUsed.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.definitionListsAreUsed.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/doNotUseGraphicalSymbolToConveyInformation/doNotUseGraphicalSymbolToConveyInformation.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>doNotUseGraphicalSymbolToConveyInformation</title>\n  </head>\n  <body>\n    <div data-expected=\"p:ignore|span:fail\">\n      <p><span>✓</span> is ok to use?</p>\n    </div>\n\n    <div data-expected=\"p:ignore|span:fail\">\n        <p><span class=\"quail-failed-element\">★★★☆☆</span> can not be used.</p>\n    </div>\n\n    <div data-expected=\"p:ignore|span:fail\">\n        <p><span class=\"quail-failed-element\">*</span> can not be used to mark required fields.</p>\n    </div>\n\n    <div data-expected=\"p:ignore|span:pass\">\n        <p><span>B</span> can be used for testing.</p>\n    </div>\n\n    <div data-expected=\"p:ignore|abbr:inapplicable\">\n        Single letter abbreviations are allowed <abbr title=\"Quail\">X</abbr>.\n    </div>\n\n      </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/doNotUseGraphicalSymbolToConveyInformation/doNotUseGraphicalSymbolToConveyInformationSpec.js",
    "content": "xdescribe('assessment: doNotUseGraphicalSymbolToConveyInformation', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/doNotUseGraphicalSymbolToConveyInformation/doNotUseGraphicalSymbolToConveyInformation.html',\n        assessments: [\n          'doNotUseGraphicalSymbolToConveyInformation'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(0);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('doNotUseGraphicalSymbolToConveyInformation');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.doNotUseGraphicalSymbolToConveyInformation.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/doctypeProvided/doctypeProvided-fail.html",
    "content": "<html id=\"assert-1\" data-expected=\"fail\">\n\t<head>\n\t\t<title>doctypeProvided</title>\n\t</head>\n\t<body>\n\t\t<p>Doctype was provided for this page.</p>\n\n\t\t\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/doctypeProvided/doctypeProvided.html",
    "content": "<!doctype html>\n<html id=\"assert-1\" data-expected=\"pass\">\n\t<head>\n\t\t<title>doctypeProvided</title>\n\t</head>\n\t<body>\n\t\t<p>Doctype was provided for this page.</p>\n\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/doctypeProvided/doctypeProvidedSpec.js",
    "content": "describe('assessment: doctypeProvided', function () {\n  describe('pass case', function () {\n    var client, assessments, quailResults, cases;\n\n    // Evaluate the test page with Quail.\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/doctypeProvided/doctypeProvided.html',\n          assessments: [\n            'doctypeProvided'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('doctypeProvided');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      cases = quailResults.tests.doctypeProvided.cases;\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n});\n\ndescribe('assessment: doctypeProvided', function () {\n  describe('fail case', function () {\n    var client, assessments, quailResults, cases;\n\n    // Evaluate the test page with Quail.\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/doctypeProvided/doctypeProvided-fail.html',\n          assessments: [\n            'doctypeProvided'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('doctypeProvided');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      cases = quailResults.tests.doctypeProvided.cases;\n      expect(cases[0]).to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentAbbrIsUsed/documentAbbrIsUsed.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>documentAbbrIsUsed</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p id=\"assert-1\" class=\"quail-failed-element\">Everyone loves QUAIL.</p>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p id=\"assert-2\">\n\t\t\tEveryone loves <abbr title=\"Quail accesibility information library\">QUAIL</abbr>.\n\t\t</p>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p id=\"assert-3\">This might be A acronym.</p>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p id=\"assert-4\">hello</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentAbbrIsUsed/documentAbbrIsUsedSpec.js",
    "content": "xdescribe('assessment: documentAbbrIsUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentAbbrIsUsed/documentAbbrIsUsed.html',\n        assessments: [\n          'documentAbbrIsUsed'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentAbbrIsUsed');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentAbbrIsUsed.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.documentAbbrIsUsed.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.documentAbbrIsUsed.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.documentAbbrIsUsed.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentAcronymsHaveElement/documentAcronymsHaveElement.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>documentAcronymsHaveElement</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p id=\"assert-1\" class=\"quail-failed-element\">Everyone loves QUAIL.</p>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p id=\"assert-2\">Hi this is a document with no acronyms.</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentAcronymsHaveElement/documentAcronymsHaveElementSpec.js",
    "content": "describe('assessment: documentAcronymsHaveElement', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentAcronymsHaveElement/documentAcronymsHaveElement.html',\n        assessments: [\n          'documentAcronymsHaveElement'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentAcronymsHaveElement');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentAcronymsHaveElement.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.documentAcronymsHaveElement.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentAutoRedirectNotUsed/documentAutoRedirectNotUsed-fail.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>documentAutoRedirectNotUsed-fail</title>\n  <meta id=\"assert-1\" http-equiv=\"refresh\" content=\"http://www.foo.com/bar.html\"/>\n</head>\n  <body>\n    <p>This page has an auto-redirect.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentAutoRedirectNotUsed/documentAutoRedirectNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>documentAutoRedirectNotUsed</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentAutoRedirectNotUsed/documentAutoRedirectNotUsed-pass.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>documentAutoRedirectNotUsed-fail</title>\n</head>\n  <body>\n    <p>This page has no auto-redirect.</p>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentAutoRedirectNotUsed/documentAutoRedirectNotUsedSpec.js",
    "content": "describe('assessment: documentAutoRedirectNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentAutoRedirectNotUsed/documentAutoRedirectNotUsed-pass.html',\n          assessments: [\n            'documentAutoRedirectNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentAutoRedirectNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentAutoRedirectNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentAutoRedirectNotUsed/documentAutoRedirectNotUsed-fail.html',\n          assessments: [\n            'documentAutoRedirectNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentAutoRedirectNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentAutoRedirectNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentContentReadableWithoutStylesheets/documentContentReadableWithoutStylesheets.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>documentContentReadableWithoutStylesheets</title>\n  </head>\n  <body>\n\n    <div data-expect=\"untested\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentContentReadableWithoutStylesheets/documentContentReadableWithoutStylesheetsSpec.js",
    "content": "describe('assessment: documentContentReadableWithoutStylesheets', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentContentReadableWithoutStylesheets/documentContentReadableWithoutStylesheets.html',\n          assessments: [\n            'documentContentReadableWithoutStylesheets'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentContentReadableWithoutStylesheets.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentContentReadableWithoutStylesheets');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('untested');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentHasTitleElement/documentHasTitleElement-fail.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title id=\"assert-1\">documentHasTitleElement</title>\n    <title id=\"assert-2\">And another title</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentHasTitleElement/documentHasTitleElement-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentHasTitleElement/documentHasTitleElement-pass.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title id=\"assert-1\">documentHasTitleElement-pass</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentHasTitleElement/documentHasTitleElementSpec.js",
    "content": "describe('assessment: documentHasTitleElement', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentHasTitleElement/documentHasTitleElement-nomatch.html',\n          assessments: [\n            'documentHasTitleElement'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentHasTitleElement.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentHasTitleElement');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('failed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the too many titles case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentHasTitleElement/documentHasTitleElement-fail.html',\n          assessments: [\n            'documentHasTitleElement'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentHasTitleElement.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentHasTitleElement');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n  });\n\n  describe('the just right case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentHasTitleElement/documentHasTitleElement-pass.html',\n          assessments: [\n            'documentHasTitleElement'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentHasTitleElement.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentHasTitleElement');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentIDsMustBeUnique/documentIDsMustBeUnique.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>documentIDsMustBeUnique</title>\n</head>\n<body>\n\n  <div data-expected=\"inapplicable\">\n    <p id=\"assert-1\" id=\"uniqueid\">This paragraph has a unique</p>\n  </div>\n\n\n  <div data-expected=\"h2:ignore|p:fail\">\n    <h2 id=\"assert-2\">This is a header.</h2>\n    <p id=\"assert-2\">\n      This is the second paragraph.\n    </p>\n  </div>\n\n  <div data-expected=\"h2:ignore|p:pass\">\n    <h2 id=\"three\">This is a header.</h2>\n    <p id=\"assert-3\" id=\"four\">\n      This is the second paragraph.\n    </p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentIDsMustBeUnique/documentIDsMustBeUniqueSpec.js",
    "content": "xdescribe('assessment: documentIDsMustBeUnique', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentIDsMustBeUnique/documentIDsMustBeUnique.html',\n        assessments: [\n          'documentIDsMustBeUnique'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(13);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentIDsMustBeUnique');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentIDsMustBeUnique.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.documentIDsMustBeUnique.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.documentIDsMustBeUnique.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentIsWrittenClearly/documentIsWrittenClearly.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>documentIsWrittenClearly</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <p id=\"assert-1\">\n            Objectively disintermediate B2B action items vis-a-vis backward-compatible\n                methods of empowerment. Dynamically disseminate just in time growth strategies\n                after scalable convergence. Continually mesh wireless value through tactical\n                initiatives. Progressively leverage existing one-to-one process improvements\n                whereas corporate niches. Authoritatively aggregate superior products without\n                progressive content. Credibly provide access to high-payoff deliverables\n                with highly efficient vortals. Authoritatively revolutionize interoperable\n                internal or \"organic\" sources before visionary partnerships. Seamlessly\n                formulate global initiatives without cross functional applications. Authoritatively\n                expedite collaborative markets rather than maintainable methodologies.\n                Progressively parallel task market-driven expertise for emerging initiatives.\n                Completely <strong>administrate value-added process</strong>\n            improvements\n                via reliable web services. Authoritatively underwhelm functional mindshare\n                via distinctive partnerships. Competently initiate customer directed relationships\n                after future-proof initiatives. Professionally revolutionize low-risk high-yield\n                opportunities for frictionless e-commerce. Intrinsicly visualize wireless\n                total linkage and collaborative data. Credibly unleash parallel growth\n                strategies before business partnerships. Energistically extend principle-centered\n                mindshare for team building initiatives. Monotonectally pursue 24/7 supply\n                chains after stand-alone manufactured products. Synergistically maintain\n                clicks-and-mortar information through innovative convergence. Dramatically\n                deploy plug-and-play platforms after orthogonal scenarios. Energistically\n                supply customized benefits with parallel potentialities. Collaboratively\n                initiate prospective vortals rather than stand-alone deliverables. Energistically\n                parallel task leading-edge methodologies after one-to-one bandwidth. Globally\n                extend emerging communities and mission-critical ROI.\n        </p>\n    </div>\n    <div data-expected=\"pass\">\n\n        <p id=\"assert-2\">The quick brown fox jumped over the lazy dogs.</p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p id=\"assert-3\">\n            The quick brown fox jumped over the lazy dogs. The quick brown fox jumped\n                over the lazy dogs. The quick brown fox jumped over the lazy dogs. The\n                quick brown fox jumped over the lazy dogs. The quick brown fox jumped over\n                the lazy dogs. The quick brown fox jumped over the lazy dogs.\n        </p>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n      <a name=\"empty\"></a>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentIsWrittenClearly/documentIsWrittenClearlySpec.js",
    "content": "describe('assessment: documentIsWrittenClearly', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentIsWrittenClearly/documentIsWrittenClearly.html',\n        assessments: [\n          'documentIsWrittenClearly'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentIsWrittenClearly');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentIsWrittenClearly.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.documentIsWrittenClearly.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.documentIsWrittenClearly.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentLangIsISO639Standard/documentLangIsISO639Standard-fail.html",
    "content": "<!doctype html>\n<html id=\"assert-1\" class=\"quail-test self-fail\" data-expected=\"fail\" data-accessibility-test=\"documentLangIsISO639Standard\" lang=\"english\">\n\n    <head>\n        <title>documentLangIsISO639Standard-fail</title>\n    </head>\n\n    <body>\n        <p>This document is missing a standard language code.</p>\n            </body>\n\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentLangIsISO639Standard/documentLangIsISO639Standard-inapplicable.html",
    "content": "<!doctype html>\n<html id=\"assert-1\" data-expected=\"inapplicable\"\ndata-accessibility-test=\"documentLangIsISO639Standard\">\n\n    <head>\n        <title>documentLangIsISO639Standard-inapplicable</title>\n    </head>\n\n    <body>\n        <p>This document has no language code.</p>\n            </body>\n\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentLangIsISO639Standard/documentLangIsISO639Standard.html",
    "content": "<!doctype html>\n<html id=\"assert-1\" data-expected=\"pass\"\ndata-accessibility-test=\"documentLangIsISO639Standard\" lang=\"en-GB\">\n\n    <head>\n        <title>documentLangIsISO639Standard-fail</title>\n    </head>\n\n    <body>\n        <p>This document is missing a standard language code.</p>\n            </body>\n\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentLangIsISO639Standard/documentLangIsISO639StandardSpec.js",
    "content": "describe('assessment: documentLangIsISO639Standard', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentLangIsISO639Standard/documentLangIsISO639Standard.html',\n        assessments: [\n          'documentLangIsISO639Standard'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentLangIsISO639Standard');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentLangIsISO639Standard.cases;\n    expect(cases[0]).to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: documentLangIsISO639Standard', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentLangIsISO639Standard/documentLangIsISO639Standard-fail.html',\n        assessments: [\n          'documentLangIsISO639Standard'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentLangIsISO639Standard');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentLangIsISO639Standard.cases;\n    expect(cases[0]).to.have.quailStatus('failed');\n  });\n});\n\nxdescribe('assessment: documentLangIsISO639Standard', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentLangIsISO639Standard/documentLangIsISO639Standard-inapplicable.html',\n        assessments: [\n          'documentLangIsISO639Standard'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentLangIsISO639Standard');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentLangIsISO639Standard.cases;\n    expect(cases[0]).to.have.quailStatus('inapplicable');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentLangNotIdentified/documentLangNotIdentified-fail.html",
    "content": "<!doctype html>\n<html id=\"assert-1\" lang>\n  <head>\n    <title>documentLangNotIdentified</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentLangNotIdentified/documentLangNotIdentified.html",
    "content": "<!doctype html>\n<html id=\"assert-1\" lang=\"de\">\n  <head>\n    <title>documentLangNotIdentified</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentLangNotIdentified/documentLangNotIdentifiedSpec.js",
    "content": "describe('assessment: documentLangNotIdentified', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the no lang case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentLangNotIdentified/documentLangNotIdentified-fail.html',\n          assessments: [\n            'documentLangNotIdentified'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentLangNotIdentified.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentLangNotIdentified');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases[0]).to.have.quailStatus('failed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the lang case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentLangNotIdentified/documentLangNotIdentified.html',\n          assessments: [\n            'documentLangNotIdentified'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentLangNotIdentified.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentLangNotIdentified');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentMetaNotUsedWithTimeout/documentMetaNotUsedWithTimeout-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>documentMetaNotUsedWithTimeout</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentMetaNotUsedWithTimeout/documentMetaNotUsedWithTimeout.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>documentMetaNotUsedWithTimeout</title>\n    <meta id=\"assert-1\" http-equiv=\"refresh\" />\n    <meta id=\"assert-2\" http-equiv=\"refresh\" content=\"3000; url=http://test.com\" />\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentMetaNotUsedWithTimeout/documentMetaNotUsedWithTimeoutSpec.js",
    "content": "describe('assessment: documentMetaNotUsedWithTimeout', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentMetaNotUsedWithTimeout/documentMetaNotUsedWithTimeout-nomatch.html',\n          assessments: [\n            'documentMetaNotUsedWithTimeout'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentMetaNotUsedWithTimeout.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentMetaNotUsedWithTimeout');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentMetaNotUsedWithTimeout/documentMetaNotUsedWithTimeout.html',\n          assessments: [\n            'documentMetaNotUsedWithTimeout'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentMetaNotUsedWithTimeout.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentMetaNotUsedWithTimeout');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentReadingDirection/documentReadingDirection-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>documentReadingDirection</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentReadingDirection/documentReadingDirection.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<meta charset=\"utf-8\">\n\t<title>documentReadingDirection</title>\n</head>\n<body>\n\t<div data-expected=\"fail\" dir=\"ltr\">\n\t\t<p>\n\t\t\tThe title says \"<span id=\"assert-1\" lang=\"he\">פעילות הבינאום, W3C</span>\" in Hebrew.\n\t\t</p>\n\t</div>\n\t<div data-expected=\"pass\" dir=\"ltr\">\n\n\t\t<p>\n\t\t\tThe title says \"<span id=\"assert-2\" lang=\"he\" dir=\"rtl\">פעילות הבינאום, W3C</span>\"in Hebrew.\n\t\t</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentReadingDirection/documentReadingDirectionSpec.js",
    "content": "describe('assessment: documentReadingDirection', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentReadingDirection/documentReadingDirection-nomatch.html',\n          assessments: [\n            'documentReadingDirection'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentReadingDirection.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentReadingDirection');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentReadingDirection/documentReadingDirection.html',\n          assessments: [\n            'documentReadingDirection'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentReadingDirection.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentReadingDirection');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentStrictDocType/documentStrictDocType-fail-2.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n<html id=\"assert-1\" class=\"quail-test self-fail\" data-expected=\"fail\">\n\n<head>\n    <title>documentStrictDocType-fail-2</title>\n</head>\n\n<body>\n    <p>\n        <img src=\"assets/rex.jpg\" alt=\"A black and brown cat named Rex.\" />\n    </p>\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentStrictDocType/documentStrictDocType-fail-3.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">\n<html id=\"assert-1\" class=\"quail-test self-fail\" data-expected=\"fail\">\n\n<head>\n    <title>documentStrictDocType-fail-3</title>\n</head>\n\n<body>\n    <p>\n        <img src=\"assets/rex.jpg\" alt=\"A black and brown cat named Rex.\" />\n    </p>\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentStrictDocType/documentStrictDocType-fail.html",
    "content": "<html id=\"assert-1\" class=\"quail-test self-fail\" data-expected=\"fail\" title=\"No doctype set\">\n\n<head>\n    <title>documentStrictDocType-fail</title>\n</head>\n\n<body>\n    <p>\n        <img src=\"assets/rex.jpg\" alt=\"A black and brown cat named Rex.\" />\n    </p>\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentStrictDocType/documentStrictDocType-pass-2.html",
    "content": "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Strict//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd\">\n<html id=\"assert-1\" class=\"quail-test self-fail\" data-expected=\"pass\">\n\n<head>\n    <title>documentStrictDocType-pass-2</title>\n</head>\n\n<body>\n    <p>\n        <img src=\"assets/rex.jpg\" alt=\"A black and brown cat named Rex.\" />\n    </p>\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentStrictDocType/documentStrictDocType.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"http://www.w3.org/TR/html4/strict.dtd\">\n<html id=\"assert-1\" data-expected=\"pass\">\n\n<head>\n    <title>documentStrictDocType-pass</title>\n</head>\n\n<body>\n    <p>\n        <img src=\"assets/rex.jpg\" alt=\"A black and brown cat named Rex.\" />\n    </p>\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentStrictDocType/documentStrictDocTypeSpec.js",
    "content": "describe('assessment: documentStrictDocType', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentStrictDocType/documentStrictDocType.html',\n        assessments: [\n          'documentStrictDocType'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentStrictDocType');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentStrictDocType.cases;\n    expect(cases[0]).to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: documentStrictDocType', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentStrictDocType/documentStrictDocType-pass-2.html',\n        assessments: [\n          'documentStrictDocType'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentStrictDocType');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentStrictDocType.cases;\n    expect(cases[0]).to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: documentStrictDocType', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentStrictDocType/documentStrictDocType-fail.html',\n        assessments: [\n          'documentStrictDocType'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentStrictDocType');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentStrictDocType.cases;\n    expect(cases[0]).to.have.quailStatus('failed');\n  });\n});\n\ndescribe('assessment: documentStrictDocType', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentStrictDocType/documentStrictDocType-fail-2.html',\n        assessments: [\n          'documentStrictDocType'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentStrictDocType');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentStrictDocType.cases;\n    expect(cases[0]).to.have.quailStatus('failed');\n  });\n});\n\ndescribe('assessment: documentStrictDocType', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentStrictDocType/documentStrictDocType-fail-3.html',\n        assessments: [\n          'documentStrictDocType'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentStrictDocType');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentStrictDocType.cases;\n    expect(cases[0]).to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleDescribesDocument/documentTitleDescribesDocument-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head></head>\n  <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleDescribesDocument/documentTitleDescribesDocument.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title id=\"assert-1\">documentTitleDescribesDocument</title>\n  </head>\n  <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleDescribesDocument/documentTitleDescribesDocumentSpec.js",
    "content": "describe('assessment: documentTitleDescribesDocument', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentTitleDescribesDocument/documentTitleDescribesDocument.html',\n          assessments: [\n            'documentTitleDescribesDocument'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentTitleDescribesDocument.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentTitleDescribesDocument');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/documentTitleDescribesDocument/documentTitleDescribesDocument-nomatch.html',\n          assessments: [\n            'documentTitleDescribesDocument'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.documentTitleDescribesDocument.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('documentTitleDescribesDocument');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases[0]).to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholder-fail-2.html",
    "content": "<!doctype html>\n<html data-expected=\"fail\">\n    <head>\n        <title id=\"assert-1\">this is the title</title>\n    </head>\n    <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholder-fail-3.html",
    "content": "<!doctype html>\n<html data-expected=\"fail\">\n    <head>\n        <title id=\"assert-1\">untitled document</title>\n    </head>\n    <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholder-fail.html",
    "content": "<!doctype html>\n<html data-expected=\"fail\">\n    <head>\n        <title id=\"assert-1\">title</title>\n    </head>\n    <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholder.html",
    "content": "<!doctype html>\n<html data-expected=\"pass\">\n    <head>\n        <title id=\"assert-1\">documentTitleIsNotPlaceholder-pass</title>\n    </head>\n    <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholderSpec.js",
    "content": "describe('assessment: documentTitleIsNotPlaceholder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholder.html',\n        assessments: [\n          'documentTitleIsNotPlaceholder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentTitleIsNotPlaceholder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentTitleIsNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: documentTitleIsNotPlaceholder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholder-fail.html',\n        assessments: [\n          'documentTitleIsNotPlaceholder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentTitleIsNotPlaceholder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentTitleIsNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n\ndescribe('assessment: documentTitleIsNotPlaceholder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholder-fail-2.html',\n        assessments: [\n          'documentTitleIsNotPlaceholder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentTitleIsNotPlaceholder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentTitleIsNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n\ndescribe('assessment: documentTitleIsNotPlaceholder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentTitleIsNotPlaceholder/documentTitleIsNotPlaceholder-fail-3.html',\n        assessments: [\n          'documentTitleIsNotPlaceholder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentTitleIsNotPlaceholder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentTitleIsNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleIsShort/documentTitleIsShort-fail.html",
    "content": "<!doctype html>\n<html data-expected=\"fail\">\n\n<head>\n    <title id=\"assert-1\" class=\"quail-failed-element\">This is a really really long title and maybe it should be shortened. In\n            fact I think it really should be shortened. Yes, let's all shorted the\n            title so it's more manageable for everyone.</title>\n</head>\n\n<body>\n    </body>\n\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleIsShort/documentTitleIsShort.html",
    "content": "<!doctype html>\n<html data-expected=\"pass\">\n\n<head>\n    <title id=\"assert-1\">Test of documentTitleIsShort</title>\n</head>\n\n<body>\n    </body>\n\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleIsShort/documentTitleIsShortSpec.js",
    "content": "describe('assessment: documentTitleIsShort', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentTitleIsShort/documentTitleIsShort.html',\n        assessments: [\n          'documentTitleIsShort'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentTitleIsShort');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentTitleIsShort.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: documentTitleIsShort', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentTitleIsShort/documentTitleIsShort-fail.html',\n        assessments: [\n          'documentTitleIsShort'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentTitleIsShort');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentTitleIsShort.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleNotEmpty/documentTitleNotEmpty-fail.html",
    "content": "<!doctype html>\n<html data-expected=\"fail\">\n  <head>\n    <title id=\"assert-1\"></title>\n  </head>\n  <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleNotEmpty/documentTitleNotEmpty.html",
    "content": "<!doctype html>\n<html class=\"quail-test self-fail\" data-expected=\"pass\">\n  <head>\n    <title id=\"assert-1\">The title is not empty</title>\n  </head>\n  <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentTitleNotEmpty/documentTitleNotEmptySpec.js",
    "content": "describe('assessment: documentTitleNotEmpty', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentTitleNotEmpty/documentTitleNotEmpty.html',\n        assessments: [\n          'documentTitleNotEmpty'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentTitleNotEmpty');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentTitleNotEmpty.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: documentTitleNotEmpty', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentTitleNotEmpty/documentTitleNotEmpty-fail.html',\n        assessments: [\n          'documentTitleNotEmpty'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentTitleNotEmpty');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.documentTitleNotEmpty.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentVisualListsAreMarkedUp/documentVisualListsAreMarkedUp.html",
    "content": "<!doctype html>\n<html>\n<meta charset=\"utf-8\">\n<head>\n\t<title>documentVisualListsAreMarkedUp</title>\n</head>\n<body>\n\t<div>\n\t\t<p id=\"assert-1\">\n\t\t\t* chocolate\n\t\t\t<br/>\n\t\t\t* vanilla\n\t\t\t<br/>\n\t\t\t* cherry\n\t\t\t<br/>\n\t\t\t* bananna\n\t\t\t<br/>\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-2\">\n\t\t\t-chocolate<br class=\"somestuff\">-vanilla<br>-cherry<br data-attribute>-bananna\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-3\">\n\t\t\t◤ chocolate\n\t\t\t<br/>\n\t\t\t◤ vanilla\n\t\t\t<br/>\n\t\t\t◤ cherry\n\t\t\t<br/>\n\t\t\t◤ bananna\n\t\t\t<br/>\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-4\">\n\t\t\t1. chocolate\n\t\t\t<br/>\n\t\t\t2. vanilla\n\t\t\t<br/>\n\t\t\t3. cherry\n\t\t\t<br/>\n\t\t\t4. bananna\n\t\t\t<br/>\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-5\">\n\t\t\tI. chocolate\n\t\t\t<br/>\n\t\t\tII. vanilla\n\t\t\t<br/>\n\t\t\tIV. cherry\n\t\t\t<br/>\n\t\t\tIX. bananna\n\t\t\t<br/>\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-6\">\n\t\t\t1) chocolate\n\t\t\t<br/>\n\t\t\t2) vanilla\n\t\t\t<br/>\n\t\t\t3) cherry\n\t\t\t<br/>\n\t\t\t4) bananna\n\t\t\t<br/>\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-7\">\n\t\t\t▶ chocolate\n\t\t\t<br/>\n\t\t\t* vanilla\n\t\t\t<br/>\n\t\t\t♦ cherry\n\t\t\t<br/>\n\t\t\t♦ bananna\n\t\t\t<br/>\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-8\">\n\t\t\tOur ice-cream flavours include chocolate*, vanilla*, cherry, and bananna.\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-9\">\n\t\t\t* Too short <br />\n\t\t\t* May not be a list\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<p id=\"assert-10\">\n\t\t\t* Footnotes, <br />\n\t\t\t** are not lists, <br />\n\t\t\t*** so they should pass.\n\t\t</p>\n\t</div>\n\n\t<div>\n\t\t<ul>\n\t\t\t<li id=\"assert-11\">chocolate</li>\n\t\t\t<li id=\"assert-12\">vanilla</li>\n\t\t\t<li id=\"assert-13\">cherry</li>\n\t\t\t<li id=\"assert-14\">bananna</li>\n\t\t</ul>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/documentVisualListsAreMarkedUp/documentVisualListsAreMarkedUpSpec.js",
    "content": "describe('assessment: documentVisualListsAreMarkedUp', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/documentVisualListsAreMarkedUp/documentVisualListsAreMarkedUp.html',\n        assessments: [\n          'documentVisualListsAreMarkedUp'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.documentVisualListsAreMarkedUp.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(14);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('documentVisualListsAreMarkedUp');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-8', function () {\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-9', function () {\n    expect(cases).quailGetById('assert-9').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-10', function () {\n    expect(cases).quailGetById('assert-10').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-11', function () {\n    expect(cases).quailGetById('assert-11').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-12', function () {\n    expect(cases).quailGetById('assert-12').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-13', function () {\n    expect(cases).quailGetById('assert-13').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-14', function () {\n    expect(cases).quailGetById('assert-14').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/embedHasAssociatedNoEmbed/assets/transcript_history_rome.htm",
    "content": "empty text file\n"
  },
  {
    "path": "test/assessmentSpecs/specs/embedHasAssociatedNoEmbed/embedHasAssociatedNoEmbed.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>embedHasAssociatedNoEmbed</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <embed id=\"assert-1\" src=\"assets/history_of_rome.mov\" height=\"60\" width=\"144\" autostart=\"false\"></embed>\n    </div>\n    <div data-expected=\"pass\">\n      <embed id=\"assert-2\" src=\"assets/history_of_rome.mov\" height=\"60\" width=\"144\" autostart=\"false\"></embed>\n      <noembed>\n        <a href=\"assets/transcript_history_rome.htm\">Transcript of \"The history of Rome\"</a>\n      </noembed>\n    </div>\n    <div data-expected=\"pass\">\n      <embed id=\"assert-3\" src=\"assets/history_of_rome.mov\" height=\"60\" width=\"144\" autostart=\"false\">\n      <noembed>\n        <a href=\"assets/transcript_history_rome.htm\">Transcript of \"The history of Rome\"</a>\n      </noembed>\n      </embed>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/embedHasAssociatedNoEmbed/embedHasAssociatedNoEmbedSpec.js",
    "content": "describe('assessment: embedHasAssociatedNoEmbed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/embedHasAssociatedNoEmbed/embedHasAssociatedNoEmbed.html',\n        assessments: [\n          'embedHasAssociatedNoEmbed'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('embedHasAssociatedNoEmbed');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.embedHasAssociatedNoEmbed.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.embedHasAssociatedNoEmbed.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.embedHasAssociatedNoEmbed.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/embedMustHaveAltAttribute/embedMustHaveAltAttribute-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>embedMustHaveAltAttribute</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/embedMustHaveAltAttribute/embedMustHaveAltAttribute.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>embedMustHaveAltAttribute</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<embed id=\"assert-1\" src=\"demo.mov\">\n\t\t\t<noembed>Alternate content for the embed</noembed>\n\t\t</embed>\n\t</div>\n\t<div data-expected=\"pass\">\n\t\t<embed id=\"assert-2\" alt=\"description of the embed\" src=\"demo.mov\">\n\t\t\t<noembed>Alternate content for the embed</noembed>\n\t\t</embed>\n\t</div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/embedMustHaveAltAttribute/embedMustHaveAltAttributeSpec.js",
    "content": "describe('assessment: embedMustHaveAltAttribute', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/embedMustHaveAltAttribute/embedMustHaveAltAttribute-nomatch.html',\n          assessments: [\n            'embedMustHaveAltAttribute'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.embedMustHaveAltAttribute.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('embedMustHaveAltAttribute');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/embedMustHaveAltAttribute/embedMustHaveAltAttribute.html',\n          assessments: [\n            'embedMustHaveAltAttribute'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.embedMustHaveAltAttribute.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('embedMustHaveAltAttribute');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/fieldsetHasLabel/fieldsetHasLabel-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>fieldsetHasLabel</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/fieldsetHasLabel/fieldsetHasLabel.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>fieldsetHasLabel</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<form>\n\t\t\t<fieldset id=\"assert-1\" class=\"quail-failed-element\">\n\t\t\t\t<input id=\"red\" type=\"radio\" name=\"color\" value=\"red\" />\n\t\t\t\t<label for=\"red\">Red</label>\n\t\t\t\t<br />\n\t\t\t\t<input id=\"blue\" type=\"radio\" name=\"color\" value=\"blue\" />\n\t\t\t\t<label for=\"blue\">Blue</label>\n\t\t\t\t<br />\n\t\t\t\t<input id=\"green\" type=\"radio\" name=\"color\" value=\"green\" />\n\t\t\t\t<label for=\"green\">Green</label>\n\t\t\t</fieldset>\n\t\t</form>\n\t</div>\n\t<div data-expected=\"pass\">\n\n\t\t<form>\n\t\t\t<fieldset>\n\t\t\t\t<legend>Choose a Color:</legend>\n\t\t\t\t<input id=\"red\" type=\"radio\" name=\"color\" value=\"red\" />\n\t\t\t\t<label for=\"red\">Red</label>\n\t\t\t\t<br />\n\t\t\t\t<input id=\"blue\" type=\"radio\" name=\"color\" value=\"blue\" />\n\t\t\t\t<label for=\"blue\">Blue</label>\n\t\t\t\t<br />\n\t\t\t\t<input id=\"green\" type=\"radio\" name=\"color\" value=\"green\" />\n\t\t\t\t<label for=\"green\">Green</label>\n\t\t\t</fieldset>\n\t\t</form>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/fieldsetHasLabel/fieldsetHasLabelSpec.js",
    "content": "describe('assessment: fieldsetHasLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/fieldsetHasLabel/fieldsetHasLabel-nomatch.html',\n          assessments: [\n            'fieldsetHasLabel'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.fieldsetHasLabel.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('fieldsetHasLabel');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/fieldsetHasLabel/fieldsetHasLabel.html',\n          assessments: [\n            'fieldsetHasLabel'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.fieldsetHasLabel.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('fieldsetHasLabel');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/fileHasLabel/fileHasLabel.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>fileHasLabel</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n        <input id=\"assert-1\" type=\"file\" title=\"Your File\" name=\"data\" tabindex=\"1\" />\n      </form>\n    </div>\n    <div data-expected=\"fail\">\n      <form action=\"http://www.test.com/testing\" method=\"post\">\n        <input title=\"student file:\" type=\"file\" id=\"assert-2\" name=\"data\" tabindex=\"1\"/>\n      </form>\n    </div>\n    <div data-expected=\"pass\">\n      <form action=\"http://www.test.com/testing\" method=\"post\">\n        <label for=\"assert-3\">I was walking down the street.</label>\n        <input type=\"file\" id=\"assert-3\" name=\"data\" tabindex=\"1\" />\n      </form>\n    </div>\n    <!-- <div data-expected=\"cantTell\">\n      <form action=\"http://www.test.com/testing\" method=\"post\">\n        <label>\n          student file:\n          <input type=\"file\" id=\"assert-4\" name=\"data\" tabindex=\"1\"/>\n        </label>\n      </form>\n    </div> -->\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/fileHasLabel/fileHasLabelSpec.js",
    "content": "describe('assessment: fileHasLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/fileHasLabel/fileHasLabel.html',\n        assessments: [\n          'fileHasLabel'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.fileHasLabel.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('fileHasLabel');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/focusIndicatorVisible/focusIndicatorVisible.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>focusIndicatorVisible</title>\n      <style>\n\n      #test-1 a:focus {\n        border: 3px solid black;\n      }\n\n      #test-1 input:focus {\n        border: 1px solid black;\n      }\n\n      #test-2 a:focus {\n        color: green;\n      }\n\n      #test-2 input:focus {\n        border: 4px solid black;\n      }\n\n      #test-3 a:focus {\n        color: green;\n      }\n\n      #test-3 input:focus {\n        box-shadow: 0 0 1px black;\n      }\n\n      #test-4 a:focus {\n        background-color: #c6e746;\n      }\n\n      #test-4 input:focus {\n        border: 3px solid black;\n      }\n\n      #test-5 a:focus {\n        box-shadow: 0 0 5px #c6e746;\n      }\n\n      #test-5 input:focus {\n        border: 3px solid black;\n      }\n\n      #test-6 *:focus {\n        border: 3px solid black;\n      }\n\n      #test-6 input:focus {\n        border: 3px solid black;\n      }\n    </style>\n</head>\n<body>\n  <div data-expected=\"fail\" id=\"test-1\">\n    <form>\n      <label for=\"assert-1\">An input element with a bad focus</label>\n      <input id=\"assert-1\" type=\"text\" id=\"input1\" class=\"quail-failed-element\"></form>\n  </div>\n\n  <div data-expected=\"fail\" id=\"test-3\">\n    <a id=\"assert-2\" href=\"somewhere\">This link is highly visible when it gets focus</a>\n    <form>\n      <label for=\"assert-3\">An input element with a bad focus</label>\n      <input id=\"assert-3\" type=\"text\" id=\"input3\" class=\"quail-failed-element\"></form>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-4\">\n    <a id=\"assert-4\" href=\"somewhere\">This link is highly visible when it gets focus</a>\n    <form>\n      <label for=\"assert-5\">An input element with a highly-visible focus</label>\n      <input id=\"assert-5\" type=\"text\" id=\"input4\"></form>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-5\">\n    <a id=\"assert-6\" href=\"somewhere\">This link is highly visible when it gets focus</a>\n    <form>\n      <label for=\"assert-7\">An input element with a highly-visible focus</label>\n      <input id=\"assert-7\" type=\"text\" id=\"input5\"></form>\n  </div>\n\n  <div data-expected=\"pass\" id=\"test-6\">\n    <a id=\"assert-8\" href=\"somewhere\">This link is highly visible when it gets focus</a>\n    <form>\n      <label for=\"assert-9\">An input element with a highly-visible focus</label>\n      <input id=\"assert-9\" type=\"text\" id=\"input6\"></form>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/focusIndicatorVisible/focusIndicatorVisibleSpec.js",
    "content": "xdescribe('assessment: focusIndicatorVisible', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/focusIndicatorVisible/focusIndicatorVisible.html',\n        assessments: [\n          'focusIndicatorVisible'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(9);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('focusIndicatorVisible');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-8', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-9', function () {\n    cases = quailResults.tests.focusIndicatorVisible.cases;\n    expect(cases).quailGetById('assert-9').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/fontIsNotUsed/fontIsNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>fontIsNotUsed</title>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <p>This paragraph has no font tag </p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/fontIsNotUsed/fontIsNotUsed.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>fontIsNotUsed</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <p>This paragraph has <font id=\"assert-1\" size=\"4\">a font tag</font></p>\n  </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/fontIsNotUsed/fontIsNotUsedSpec.js",
    "content": "describe('assessment: fontIsNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/fontIsNotUsed/fontIsNotUsed-nomatch.html',\n          assessments: [\n            'fontIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.fontIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('fontIsNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/fontIsNotUsed/fontIsNotUsed.html',\n          assessments: [\n            'fontIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.fontIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('fontIsNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formButtonsHaveValue/formButtonsHaveValue-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>formButtonsHaveValue</title>\n  </head>\n  <body>\n    <div data-expected=\"inapplicable\">\n      <!-- No button here -->\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formButtonsHaveValue/formButtonsHaveValue.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>formButtonsHaveValue</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <form>\n      <input id=\"assert-1\" type=\"submit\">\n    </form>\n  </div>\n\n  <div data-expected=\"fail\">\n    <form>\n      <input id=\"assert-2\" type=\"button\">\n    </form>\n  </div>\n\n  <div data-expected=\"fail\">\n    <form>\n      <input id=\"assert-3\" type=\"reset\">\n    </form>\n  </div>\n\n  <div data-expected=\"pass\">\n    <form>\n      <input id=\"assert-4\" type=\"submit\" value=\"Submit\">\n      <input id=\"assert-5\" type=\"button\" value=\"Do another thing\">\n      <input id=\"assert-6\" type=\"reset\" value=\"Reset\">\n    </form>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formButtonsHaveValue/formButtonsHaveValueSpec.js",
    "content": "describe('assessment: formButtonsHaveValue', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/formButtonsHaveValue/formButtonsHaveValue-nomatch.html',\n          assessments: [\n            'formButtonsHaveValue'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.formButtonsHaveValue.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('formButtonsHaveValue');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/formButtonsHaveValue/formButtonsHaveValue.html',\n          assessments: [\n            'formButtonsHaveValue'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.formButtonsHaveValue.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(6);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('formButtonsHaveValue');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formErrorMessageHelpsUser/formErrorMessageHelpsUser-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>formErrorMessageHelpsUser</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formErrorMessageHelpsUser/formErrorMessageHelpsUser.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>formErrorMessageHelpsUser</title>\n  </head>\n  <body>\n    <div data-expected=\"cantTell\">\n      <p>Shown below are the steps required to purchase a concert ticket.</p>\n      <ol>\n        <li>User fills out the form and selects the \"submit\" button.</li>\n        <li>Data is presented to user with the option to correct data or submit it.</li>\n        <li>If user submits form then credit card is charged for the tickets and tickets are mailed to user.</li>\n      </ol>\n\n      <h1>Step 1 - fill out form</h1>\n\n      <form id=\"assert-1\" action=\"http://www.test.com\">\n        <p>\n          <label for=\"concert\">concert</label>\n          <select name=\"concert\" id=\"concert\">\n            <option label=\"Beethoven\" value=\"c1\">Beethoven</option>\n            <option label=\"Mozart\" value=\"c2\">Mozart</option>\n            <option label=\"Mamaday\" value=\"c3\">Mamaday</option>\n            <option label=\"U2\" value=\"c4\">U2</option>\n          </select>\n          <br/>\n          <label for=\"card\">credit card:</label>\n          <input type=\"text\" size=\"30\" id=\"card\" name=\"card\"\n          />\n          <br/>\n          <input type=\"submit\" value=\"submit\" />\n        </p>\n      </form>\n\n      <h1>Step 2 - data is presented to user</h1>\n\n      <p>Please review the data below. If the data is correct select the \"Purchase Ticket\" button. If data is not correct then select this link to <a href=\"http://www.test.com/fix\">modify the data</a>.</p>\n\n      <form id=\"assert-2\" action=\"http://www.test.com\" >\n        <p>\n          <label for=\"concert\">concert</label>\n          <select name=\"concert\" id=\"concert\">\n            <option label=\"Beethoven\" value=\"c1\">Beethoven</option>\n            <option label=\"Mozart\" value=\"c2\" selected=\"selected\">Mozart</option>\n            <option label=\"Mamaday\" value=\"c3\">Mamaday</option>\n            <option label=\"U2\" value=\"c4\">U2</option>\n          </select>\n          <br/>\n          <label for=\"card\">credit card:</label>\n          <input type=\"text\" size=\"30\" id=\"card\" name=\"card\"\n          value=\"1234xxxxxxx567\" />\n          <br/>\n          <input type=\"submit\" value=\"Purchase Ticket\" />\n        </p>\n      </form>\n    </div>\n    <div data-expected=\"cantTell\">\n      <p>Shown below are the steps required to purchase a concert ticket.</p>\n      <ol>\n        <li>User fills out the form and selects the \"submit\" button.</li>\n        <li>User's credit card is charged for the tickets and tickets are mailed to user.</li>\n      </ol>\n      <form id=\"assert-3\" action=\"http://www.test.com\">\n        <p>\n          <label for=\"concert\">concert</label>\n          <select name=\"concert\" id=\"concert\">\n            <option label=\"Beethoven\" value=\"c1\">Beethoven</option>\n            <option label=\"Mozart\" value=\"c2\">Mozart</option>\n            <option label=\"Mamaday\" value=\"c3\">Mamaday</option>\n            <option label=\"U2\" value=\"c4\">U2</option>\n          </select>\n          <br/>\n          <label for=\"card\">credit card:</label>\n          <input type=\"text\" size=\"30\" id=\"card\" name=\"card\"\n          />\n          <br/>\n          <input type=\"submit\" value=\"submit\" />\n        </p>\n      </form>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formErrorMessageHelpsUser/formErrorMessageHelpsUserSpec.js",
    "content": "describe('assessment: formErrorMessageHelpsUser', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/formErrorMessageHelpsUser/formErrorMessageHelpsUser-nomatch.html',\n          assessments: [\n            'formErrorMessageHelpsUser'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.formErrorMessageHelpsUser.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('formErrorMessageHelpsUser');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/formErrorMessageHelpsUser/formErrorMessageHelpsUser.html',\n          assessments: [\n            'formErrorMessageHelpsUser'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.formErrorMessageHelpsUser.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(3);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('formErrorMessageHelpsUser');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formHasGoodErrorMessage/formHasGoodErrorMessage-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>formHasGoodErrorMessage</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formHasGoodErrorMessage/formHasGoodErrorMessage.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>formHasGoodErrorMessage</title>\n</head>\n<body>\n    <div data-expected=\"cantTell\">\n\n        <p>\n            Assume the form below was submitted to the server and has now been returned\n            with an error message.\n        </p>\n        <p> <strong>Error:</strong>\n            Date should be entered as dd mm yyyy (e.g. 30 12\n            2006).\n        </p>\n        <form id=\"assert-1\" action=\"http://www.test.com\">\n            <p>\n                <label for=\"date\">date:</label>\n                <input type=\"text\" id=\"firstname\" />\n                <br/>\n                <input type=\"submit\" value=\"submit\" />\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"cantTell\">\n\n        <p>\n            Assume the form below was submitted to the server and has now been returned\n            with an error message.\n        </p>\n        <p> <strong>Error:</strong>\n            Form submission wrong.\n        </p>\n        <form id=\"assert-2\" action=\"http://www.test.com\">\n            <p>\n                <label for=\"date\">date:</label>\n                <input type=\"text\" id=\"firstname\" />\n                <br/>\n                <input type=\"submit\" value=\"submit\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formHasGoodErrorMessage/formHasGoodErrorMessageSpec.js",
    "content": "describe('assessment: formHasGoodErrorMessage', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/formHasGoodErrorMessage/formHasGoodErrorMessage-nomatch.html',\n          assessments: [\n            'formHasGoodErrorMessage'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.formHasGoodErrorMessage.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('formHasGoodErrorMessage');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/formHasGoodErrorMessage/formHasGoodErrorMessage.html',\n          assessments: [\n            'formHasGoodErrorMessage'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.formHasGoodErrorMessage.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('formHasGoodErrorMessage');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formHasSubmitButton/formHasSubmitButton-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>formHasSubmitButton</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formHasSubmitButton/formHasSubmitButton.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>formHasSubmitButton</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p>This form is missing a submit button:</p>\n\t\t<form id=\"assert-1\">\n\t\t\t<label for=\"search\">Search</label>\n\t\t\t<input type=\"search\" id=\"search\">\n\t\t\t<button type=\"reset\">Search</button>\n\t\t</form>\n\t</div>\n\t<div data-expected=\"fail\">\n\t\t<p>This form is missing a submit button:</p>\n\t\t<form id=\"assert-2\">\n\t\t\t<label for=\"search\">Search</label>\n\t\t\t<input type=\"search\" id=\"search\"></form>\n\t</div>\n\t<div data-expected=\"pass\">\n\n\t\t<p>This form has a submit button:</p>\n\t\t<form id=\"assert-3\">\n\t\t\t<label for=\"search\">Search</label>\n\t\t\t<input type=\"search\" id=\"search\">\n\t\t\t<button type=\"submit\">Search</button>\n\t\t</form>\n\t</div>\n\t<div data-expected=\"pass\">\n\n\t\t<p>This form has a submit button:</p>\n\t\t<form id=\"assert-4\">\n\t\t\t<label for=\"search\">Search</label>\n\t\t\t<input type=\"search\" id=\"search\">\n\t\t\t<input type=\"submit\" value=\"Search\"/>\n\t\t</form>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formHasSubmitButton/formHasSubmitButtonSpec.js",
    "content": "describe('assessment: formHasSubmitButton', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/formHasSubmitButton/formHasSubmitButton-nomatch.html',\n          assessments: [\n            'formHasSubmitButton'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.formHasSubmitButton.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('formHasSubmitButton');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/formHasSubmitButton/formHasSubmitButton.html',\n          assessments: [\n            'formHasSubmitButton'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.formHasSubmitButton.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(4);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('formHasSubmitButton');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formWithRequiredLabel/formWithRequiredLabel.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>formWithRequiredLabel</title>\n</head>\n<body>\n    <div data-expected=\"label[for='firstname']:ignore|label[for='lastname']:fail\">\n        <form action=\"http://www.test.com\">\n            <p>\n                <label for=\"firstname\" class=\"required\">First Name:</label>\n                <input type=\"text\" id=\"firstname\" />\n                <br/>\n                <label id=\"assert-1\" for=\"lastname\" style=\"color: red;\">Last Name:</label>\n                <input type=\"text\" id=\"lastname\" />\n                <input type=\"submit\" value=\"submit\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com\">\n            <p>\n                <label id=\"assert-2\" for=\"firstname\">First Name: *</label>\n                <input type=\"text\" id=\"firstname\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"pass\">\n        <form action=\"http://www.test.com\">\n            <p>\n                <label for=\"firstname\">First Name: *</label>\n                <input type=\"text\" id=\"firstname\" aria-required=\"true\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"label[for='firstname']:pass|label[for='lastname']:pass|label[for='colour']:pass\">\n        <form action=\"http://www.test.com\">\n            <p>\n                <label for=\"firstname\">First Name (required):</label>\n                <input type=\"text\" id=\"firstname\" />\n                <br/>\n                <label for=\"lastname\">Last Name (required):</label>\n                <input type=\"text\" id=\"lastname\" />\n                <br/>\n                <label for=\"colour\">Favourite Colour:</label>\n                <input type=\"text\" id=\"colour\" />\n                <br/>\n                <input type=\"submit\" value=\"submit\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/formWithRequiredLabel/formWithRequiredLabelSpec.js",
    "content": "describe('assessment: formWithRequiredLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/formWithRequiredLabel/formWithRequiredLabel.html',\n        assessments: [\n          'formWithRequiredLabel'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('formWithRequiredLabel');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.formWithRequiredLabel.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.formWithRequiredLabel.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameIsNotUsed/assets/frame-a.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>frameIsNotUsed | frame A</title>\n  </head>\n  <body></body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameIsNotUsed/frameIsNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>frameIsNotUsed</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameIsNotUsed/frameIsNotUsed.html",
    "content": "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 frameset//EN\" \"http://www.w3.org/TR/html4/frameset.dtd\">\n<html>\n  <head>\n    <title>frameIsNotUsed</title>\n  </head>\n  <frameset cols=\"100%\">\n    <frame id=\"assert-1\">\n  </frameset>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameIsNotUsed/frameIsNotUsedSpec.js",
    "content": "xdescribe('assessment: frameIsNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/frameIsNotUsed/frameIsNotUsed-nomatch.html',\n          assessments: [\n            'frameIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.frameIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('frameIsNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/frameIsNotUsed/frameIsNotUsed.html',\n          assessments: [\n            'frameIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.frameIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('frameIsNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameRelationshipsMustBeDescribed/frameRelationshipsMustBeDescribed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>frameRelationshipsMustBeDescribed</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameRelationshipsMustBeDescribed/frameRelationshipsMustBeDescribedSpec.js",
    "content": "xdescribe('assessment: frameRelationshipsMustBeDescribed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/frameRelationshipsMustBeDescribed/frameRelationshipsMustBeDescribed-nomatch.html',\n          assessments: [\n            'frameRelationshipsMustBeDescribed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.frameRelationshipsMustBeDescribed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('frameRelationshipsMustBeDescribed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/frameRelationshipsMustBeDescribed/frameRelationshipsMustBeDescribed.html',\n          assessments: [\n            'frameRelationshipsMustBeDescribed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.frameRelationshipsMustBeDescribed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('frameRelationshipsMustBeDescribed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameSrcIsAccessible/frameSrcIsAccessible-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>frameSrcIsAccessible</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameSrcIsAccessible/frameSrcIsAccessibleSpec.js",
    "content": "xdescribe('assessment: frameSrcIsAccessible', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/frameSrcIsAccessible/frameSrcIsAccessible-nomatch.html',\n          assessments: [\n            'frameSrcIsAccessible'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.frameSrcIsAccessible.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('frameSrcIsAccessible');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/frameSrcIsAccessible/frameSrcIsAccessible.html',\n          assessments: [\n            'frameSrcIsAccessible'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.frameSrcIsAccessible.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('frameSrcIsAccessible');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameTitlesDescribeFunction/frameTitlesDescribeFunctionSpec.js",
    "content": "xdescribe('assessment: frameTitlesDescribeFunction', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/frameTitlesDescribeFunction/frameTitlesDescribeFunction.html',\n        assessments: [\n          'frameTitlesDescribeFunction'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(0);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('frameTitlesDescribeFunction');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.frameTitlesDescribeFunction.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameTitlesNotEmpty/frameTitlesNotEmpty-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>frameTitlesNotEmpty</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameTitlesNotEmpty/frameTitlesNotEmptySpec.js",
    "content": "xdescribe('assessment: frameTitlesNotEmpty', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/frameTitlesNotEmpty/frameTitlesNotEmpty-nomatch.html',\n          assessments: [\n            'frameTitlesNotEmpty'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.frameTitlesNotEmpty.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('frameTitlesNotEmpty');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/frameTitlesNotEmpty/frameTitlesNotEmpty.html',\n          assessments: [\n            'frameTitlesNotEmpty'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.frameTitlesNotEmpty.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('frameTitlesNotEmpty');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameTitlesNotPlaceholder/frameTitlesNotPlaceholder.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>frameTitlesNotPlaceholder</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<p>This is an iframe.</p>\n\t\t<iframe src=\"../assets/alternative1.html\" title=\"iframe\" class=\"quail-failed-element\"></iframe>\n\t</div>\n\t<div data-expected=\"pass\">\n\n\t\t<p>This is an iframe.</p>\n\t\t<iframe src=\"../assets/alternative1.html\" title=\"A descriptive title\"></iframe>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/frameTitlesNotPlaceholder/frameTitlesNotPlaceholderSpec.js",
    "content": "xdescribe('assessment: frameTitlesNotPlaceholder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/frameTitlesNotPlaceholder/frameTitlesNotPlaceholder.html',\n        assessments: [\n          'frameTitlesNotPlaceholder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(0);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('frameTitlesNotPlaceholder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.frameTitlesNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesAreUsedToGroupContent/framesAreUsedToGroupContent-fail.html",
    "content": "<!doctype html>\n<html data-expected=\"fail\">\n  <head>\n    <title>framesAreUsedToGroupContent</title>\n  </head>\n  <body class=\"quail-failed-element\">\n    <p>There are no frames here</p>\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesAreUsedToGroupContent/framesAreUsedToGroupContent-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>framesAreUsedToGroupContent</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesAreUsedToGroupContent/framesAreUsedToGroupContentSpec.js",
    "content": "xdescribe('assessment: framesAreUsedToGroupContent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/framesAreUsedToGroupContent/framesAreUsedToGroupContent-nomatch.html',\n          assessments: [\n            'framesAreUsedToGroupContent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.framesAreUsedToGroupContent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('framesAreUsedToGroupContent');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/framesAreUsedToGroupContent/framesAreUsedToGroupContent.html',\n          assessments: [\n            'framesAreUsedToGroupContent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.framesAreUsedToGroupContent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('framesAreUsedToGroupContent');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesHaveATitle/framesHaveATitle-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>framesHaveATitle</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesHaveATitle/framesHaveATitle.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>framesHaveATitle</title>\n</head>\n<body>\n\n\t<div data-expected=\"inapplicable\"\n\tdata-accessibility-test=\"framesHaveATitle\">\n\t\t<!-- No frame here -->\n\t</div>\n\n\t<div data-expected=\"inapplicable\"\n\tdata-accessibility-test=\"framesHaveATitle\">\n\t\t<iframe style=\"display:none\"\n\t\tsrc=\"../assets/alternative1.html\"></iframe>\n\t</div>\n\n\t<div data-expected=\"fail\"\n\tdata-accessibility-test=\"framesHaveATitle\">\n\t\t<p>This is an iframe.</p>\n\t\t<iframe src=\"../assets/alternative1.html\"\n\t\tclass=\"quail-failed-element\"></iframe>\n\t</div>\n\n\t<div data-expected=\"pass\"\n\tdata-accessibility-test=\"framesHaveATitle\">\n\t\t<p>This is an iframe.</p>\n\t\t<iframe src=\"../assets/alternative1.html\"\n\t\ttitle=\"A descriptive title\"></iframe>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesHaveATitle/framesHaveATitleSpec.js",
    "content": "xdescribe('assessment: framesHaveATitle', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/framesHaveATitle/framesHaveATitle-nomatch.html',\n          assessments: [\n            'framesHaveATitle'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.framesHaveATitle.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('framesHaveATitle');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/framesHaveATitle/framesHaveATitle.html',\n          assessments: [\n            'framesHaveATitle'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.framesHaveATitle.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('framesHaveATitle');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesetIsNotUsed/framesetIsNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>framesetIsNotUsed</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesetIsNotUsed/framesetIsNotUsedSpec.js",
    "content": "xdescribe('assessment: framesetIsNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/framesetIsNotUsed/framesetIsNotUsed-nomatch.html',\n          assessments: [\n            'framesetIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.framesetIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('framesetIsNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/framesetIsNotUsed/framesetIsNotUsed.html',\n          assessments: [\n            'framesetIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.framesetIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('framesetIsNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesetMustHaveNoFramesSection/framesetMustHaveNoFramesSection-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>framesetMustHaveNoFramesSection</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/framesetMustHaveNoFramesSection/framesetMustHaveNoFramesSectionSpec.js",
    "content": "xdescribe('assessment: framesetMustHaveNoFramesSection', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/framesetMustHaveNoFramesSection/framesetMustHaveNoFramesSection-nomatch.html',\n          assessments: [\n            'framesetMustHaveNoFramesSection'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.framesetMustHaveNoFramesSection.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('framesetMustHaveNoFramesSection');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/framesetMustHaveNoFramesSection/framesetMustHaveNoFramesSection.html',\n          assessments: [\n            'framesetMustHaveNoFramesSection'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.framesetMustHaveNoFramesSection.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('framesetMustHaveNoFramesSection');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH1/headerH1.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>headerH1</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<h1>The First Heading</h1>\n\n\t\t<p>Here is some demo text.</p>\n\n\t\t<h3 id=\"assert-1\">The bad Heading</h3>\n\n\t\t<p>Here is some more demo text.</p>\n\t</div>\n\t<div data-expected=\"pass\">\n\n\t\t<h1>The First Heading</h1>\n\n\t\t<p>Here is some demo text.</p>\n\n\t\t<h2 id=\"assert-2\">The Second Heading</h2>\n\n\t\t<p>Here is some more demo text.</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH1/headerH1Spec.js",
    "content": "describe('assessment: headerH1', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/headerH1/headerH1.html',\n        assessments: [\n          'headerH1'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('headerH1');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.headerH1.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.headerH1.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH1Format/headerH1Format-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH1Format</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH1Format/headerH1Format.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH1Format</title>\n  </head>\n  <body>\n    <h1 id=\"assert-1\">With great tower, falls great gravity.</h1>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH1Format/headerH1FormatSpec.js",
    "content": "describe('assessment: headerH1Format', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH1Format/headerH1Format-nomatch.html',\n          assessments: [\n            'headerH1Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH1Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH1Format');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH1Format/headerH1Format.html',\n          assessments: [\n            'headerH1Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH1Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH1Format');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH2/headerH2.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>headerH2</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n\n    <h2>The First Heading</h2>\n\n    <p>Here is some demo text.</p>\n\n    <h4 id=\"assert-1\">The bad Heading</h4>\n\n    <p>Here is some more demo text.</p>\n  </div>\n  <div data-expected=\"pass\">\n\n    <h2>The First Heading</h2>\n\n    <p>Here is some demo text.</p>\n\n    <h3 id=\"assert-2\">This Heading Is OK</h3>\n\n    <p>Here is some more demo text.</p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH2/headerH2Spec.js",
    "content": "describe('assessment: headerH2', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/headerH2/headerH2.html',\n        assessments: [\n          'headerH2'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('headerH2');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.headerH2.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.headerH2.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH2Format/headerH2Format-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH2Format</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH2Format/headerH2Format.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH2Format</title>\n  </head>\n  <body>\n    <h2 id=\"assert-1\">With great tower, falls great gravity.</h2>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH2Format/headerH2FormatSpec.js",
    "content": "describe('assessment: headerH2Format', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH2Format/headerH2Format-nomatch.html',\n          assessments: [\n            'headerH2Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH2Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH2Format');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH2Format/headerH2Format.html',\n          assessments: [\n            'headerH2Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH2Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH2Format');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH3/headerH3.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>headerH3</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n\n    <h3>The First Heading</h3>\n\n    <p>Here is some demo text.</p>\n\n    <h5 id=\"assert-1\">The bad Heading</h5>\n\n    <p>Here is some more demo text.</p>\n  </div>\n  <div data-expected=\"pass\">\n\n    <h3>The First Heading</h3>\n\n    <p>Here is some demo text.</p>\n\n    <h4 id=\"assert-2\">This Heading Is OK</h4>\n\n    <p>Here is some more demo text.</p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH3/headerH3Spec.js",
    "content": "describe('assessment: headerH3', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/headerH3/headerH3.html',\n        assessments: [\n          'headerH3'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('headerH3');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.headerH3.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.headerH3.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH3Format/headerH3Format-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH3Format</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH3Format/headerH3Format.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH3Format</title>\n  </head>\n  <body>\n    <h3 id=\"assert-1\">With great tower, falls great gravity.</h3>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH3Format/headerH3FormatSpec.js",
    "content": "describe('assessment: headerH3Format', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH3Format/headerH3Format-nomatch.html',\n          assessments: [\n            'headerH3Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH3Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH3Format');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH3Format/headerH3Format.html',\n          assessments: [\n            'headerH3Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH3Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH3Format');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH4/headerH4.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>headerH4</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n\n    <h4>The First Heading</h4>\n\n    <h6 id=\"assert-1\">The Second Heading</h6>\n  </div>\n  <div data-expected=\"pass\">\n\n    <h4>The First Heading</h4>\n    <p>The first paragraph</p>\n\n    <h2 id=\"assert-2\">The Second Heading</h2>\n  </div>\n  <div data-expected=\"pass\">\n\n    <h5>The First Heading</h5>\n    <p>The first paragraph</p>\n\n    <h6 id=\"assert-3\">The Second Heading</h6>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH4/headerH4Spec.js",
    "content": "describe('assessment: headerH4', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/headerH4/headerH4.html',\n        assessments: [\n          'headerH4'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('headerH4');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.headerH4.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.headerH4.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.headerH4.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH4Format/headerH4Format-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH4Format</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH4Format/headerH4Format.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH4Format</title>\n  </head>\n  <body>\n    <h4 id=\"assert-1\">With great tower, falls great gravity.</h4>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH4Format/headerH4FormatSpec.js",
    "content": "describe('assessment: headerH4Format', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH4Format/headerH4Format-nomatch.html',\n          assessments: [\n            'headerH4Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH4Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH4Format');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH4Format/headerH4Format.html',\n          assessments: [\n            'headerH4Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH4Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH4Format');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH5Format/headerH5Format-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH5Format</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH5Format/headerH5Format.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH5Format</title>\n  </head>\n  <body>\n    <h5 id=\"assert-1\">With great tower, falls great gravity.</h5>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH5Format/headerH5FormatSpec.js",
    "content": "describe('assessment: headerH5Format', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH5Format/headerH5Format-nomatch.html',\n          assessments: [\n            'headerH5Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH5Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH5Format');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH5Format/headerH5Format.html',\n          assessments: [\n            'headerH5Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH5Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH5Format');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH6Format/headerH6Format-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH6Format</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH6Format/headerH6Format.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>headerH6Format</title>\n  </head>\n  <body>\n    <h6 id=\"assert-1\">With great tower, falls great gravity.</h6>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headerH6Format/headerH6FormatSpec.js",
    "content": "describe('assessment: headerH6Format', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH6Format/headerH6Format-nomatch.html',\n          assessments: [\n            'headerH6Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH6Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH6Format');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/headerH6Format/headerH6Format.html',\n          assessments: [\n            'headerH6Format'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.headerH6Format.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('headerH6Format');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headersAttrRefersToATableCell/headersAttrRefersToATableCell.html",
    "content": "<!doctype html>\n<html>\n  <head>\n      <title>headersAttrRefersToATableCell</title>\n      <style>\n          td,th {\n              border:solid 1px black;\n              width:100px;\n              padding:0 5px;\n          }\n          table {\n              border-collapse: collapse;\n          }\n      </style>\n  </head>\n  <body>\n\n    <div data-expected=\"inapplicable\">\n        <table>\n            <tr>\n                <td id=\"tbl1-cell1\">a</td>\n                <td id=\"tbl1-cell2\">b</td>\n            </tr>\n            <tr>\n                <td>c</td>\n                <td>d</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"pass\">\n        <table>\n            <tr>\n                <th id=\"tbl2-cell1\">a</th>\n                <th id=\"tbl2-cell2\">b</th>\n            </tr>\n            <tr>\n                <td id=\"assert-2-1\" headers=\"tbl2-cell1\">c</td>\n                <td id=\"assert-2-2\" headers=\"tbl2-cell2\">d</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"pass\">\n        <table>\n            <tr>\n                <th id=\"tbl3-cell1\" headers=\"tbl3-cell3\">a</th>\n                <th id=\"tbl3-cell2\" headers=\"tbl3-cell1\">b</th>\n            </tr>\n            <tr>\n                <td headers=\"\" id=\"tbl3-cell3\">c</td>\n                <td id=\"assert-3\" headers=\"tbl3-cell1 tbl3-cell2\">d</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"pass\">\n        <table>\n            <tr>\n                <th id=\"tbl4-cell1\">a</th>\n                <th id=\"tbl4-cell2\">b</th>\n            </tr>\n            <tr>\n                <td id=\"assert-4-1\" headers=\"tbl4-cell1 tbl4-cell2\">c</td>\n                <td id=\"assert-4-2\" headers=\"tbl4-cell1 tbl4-cell2\">d</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"fail\">\n        <table>\n            <tr>\n                <!-- refers to a different table -->\n                <td id=\"assert-5\" headers=\"tbl5-cell1\" class=\"quail-failed-element\">a</td>\n            </tr>\n        </table>\n\n    </div>\n\n    <div data-expected=\"fail\">\n        <table id=\"tbl6\">\n            <tr>\n                <td id=\"assert-6\" headers=\"tbl6\" class=\"quail-failed-element\">a</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"fail\">\n        <table>\n            <tr id=\"tbl5-row1\">\n                <th>a</th>\n            </tr>\n            <tr>\n                <td id=\"assert-7\" headers=\"tbl7-row1\" class=\"quail-failed-element\">b</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"fail\">\n        <table>\n            <tr>\n                <td id=\"assert-8\" headers=\"not-existing\" class=\"quail-failed-element\">a</td>\n            </tr>\n        </table>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headersAttrRefersToATableCell/headersAttrRefersToATableCellSpec.js",
    "content": "describe('assessment: headersAttrRefersToATableCell', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/headersAttrRefersToATableCell/headersAttrRefersToATableCell.html',\n        assessments: [\n          'headersAttrRefersToATableCell'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(16);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('headersAttrRefersToATableCell');\n  });\n\n  it('should return the proper assessment for tbl1-cell1', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases[0]).to.have.quailStatus('inapplicable');\n  });\n\n  it('should return the proper assessment for assert-2-1', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-2-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2-2', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-2-2').to.have.quailStatus('passed');\n  });\n\n  it('should return the proper assessment for tbl3-cell1', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('tbl3-cell1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for tbl3-cell2', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('tbl3-cell2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for tbl3-cell3', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('tbl3-cell3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n\n  it('should return the proper assessment for assert-4-1', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-4-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4-2', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-4-2').to.have.quailStatus('passed');\n  });\n\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n  });\n\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n  });\n\n  it('should return the proper assessment for assert-8', function () {\n    cases = quailResults.tests.headersAttrRefersToATableCell.cases;\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headersHaveText/headersHaveText.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>headersHaveText</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <h2 id=\"assert-1\"></h2>\n    </div>\n    <div data-expected=\"fail\">\n        <h2 id=\"assert-2\">\n            <img src=\"assets/rex.jpg\">\n        </h2>\n    </div>\n    <div data-expected=\"pass\">\n        <h1 id=\"assert-3\">This is a correct header</h1>\n        <h2 id=\"assert-4\">This header is also OK.</h2>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headersHaveText/headersHaveTextSpec.js",
    "content": "describe('assessment: headersHaveText', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/headersHaveText/headersHaveText.html',\n        assessments: [\n          'headersHaveText'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('headersHaveText');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.headersHaveText.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.headersHaveText.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.headersHaveText.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.headersHaveText.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headersUseToMarkSections/headersUseToMarkSections.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>headersUseToMarkSections</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <p id=\"assert-1\"> <strong>Applicability</strong></p>\n            HTML and XHTML\n            <br/> <strong>This technique is referenced from:</strong>\n            <br/>\n            How to Meet Success Criterion 2.4.1\n            <br/>\n            <strong>User Agent and Assistive Technology Support Notes</strong>\n            <br/>\n            Home Page Reader, JAWS, and WindowEyes all provide navigation via headings\n            and provide information about the level of the heading. The Opera browser\n            provides a mechanism to navigate by headings. Additional plugins support\n            navigation by headings in other user agents.\n            <br/>\n            <strong>Description</strong>\n            <br/>\n            The objective of this technique is to demonstrate how using the heading\n            elements, h and h1 - h6, to markup the beginning of each section in the\n            content can assist in navigation. Most assistive technologies and many\n            user agents provide a mechanism to navigate by heading elements by providing\n            keyboard commands that allow users to jump from one heading to the next.\n            Using heading elements to markup sections of a document allows users to\n            easily navigate from section to section.\n            <br/>\n            <strong>Examples</strong>\n            <br/>\n            Example 1...\n        </p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <div class=\"navigation\">\n        <ul id=\"assert-3\">\n          <li><a href=\"1.html\">Item 1</a></li>\n          <li><a href=\"2.html\">Item 2</a></li>\n          <li><a href=\"3.html\">Item 3</a></li>\n          <li><a href=\"4.html\">Item 4</a></li>\n          <li><a href=\"5.html\">Item 5</a></li>\n        </ul>\n      </div>\n    </div>\n\n    <div data-expected=\"fail\">\n      <div class=\"navigation\">\n        <ul id=\"assert-4\">\n          <li><a href=\"1.html\">Item 1</a></li>\n          <li><a href=\"2.html\">Item 2</a></li>\n          <li><a href=\"3.html\">Item 3</a></li>\n          <li><a href=\"4.html\">Item 4</a></li>\n          <li><a href=\"5.html\">Item 5</a></li>\n        </ul>\n        <h2>Navigation</h2>\n      </div>\n    </div>\n\n\n    <div data-expected=\"pass\">\n      <div class=\"navigation\">\n        <h2>Navigation</h2>\n        <ul id=\"assert-5\">\n          <li><a href=\"1.html\">Item 1</a></li>\n          <li><a href=\"2.html\">Item 2</a></li>\n          <li><a href=\"3.html\">Item 3</a></li>\n          <li><a href=\"4.html\">Item 4</a></li>\n          <li><a href=\"5.html\">Item 5</a></li>\n        </ul>\n      </div>\n    </div>\n\n    <div data-expected=\"pass\">\n\n        <h2>User Agent and Assistive Technology Support Notes</h2>\n\n        <p id=\"assert-2\">\n            Home\n            <strong>Page Reader, JAWS, and WindowEyes</strong>\n            all provide navigation\n                via headingss.\n        </p>\n    </div>\n    <div data-expected=\"pass\">\n\n        <h1>\n            H69: Providing Heading elements at the beginning of each section of content\n        </h1>\n\n        <h2>Applicability</h2>\n\n        <p>HTML and XHTML</p>\n\n        <h2>This technique is referenced from:</h2>\n\n        <p>How to Meet Success Criterion 2.4.1</p>\n\n        <h2>User Agent and Assistive Technology Support Notes</h2>\n\n        <p>\n            Home Page Reader, JAWS, and WindowEyes all provide navigation via headings\n                and provide information about the level of the heading. The Opera browser\n                provides a mechanism to navigate by headings. Additional plugins support\n                navigation by headings in other user agents.\n        </p>\n\n        <h2>Description</h2>\n\n        <p>\n            The objective of this technique is to demonstrate how using the heading\n                elements, h and h1 - h6, to markup the beginning of each section in the\n                content can assist in navigation. Most assistive technologies and many\n                user agents provide a mechanism to navigate by heading elements by providing\n                keyboard commands that allow users to jump from one heading to the next.\n                Using heading elements to markup sections of a document allows users to\n                easily navigate from section to section.\n        </p>\n\n        <h2>Examples</h2>\n\n        <p>Example 1...</p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/headersUseToMarkSections/headersUseToMarkSectionsSpec.js",
    "content": "describe('assessment: headersUseToMarkSections', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/headersUseToMarkSections/headersUseToMarkSections.html',\n        assessments: [\n          'headersUseToMarkSections'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(5);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('headersUseToMarkSections');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.headersUseToMarkSections.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.headersUseToMarkSections.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.headersUseToMarkSections.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.headersUseToMarkSections.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.headersUseToMarkSections.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/iIsNotUsed/iIsNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>iIsNotUsed</title>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <p>\n        What she <em>really</em>\n        meant to say was, \"This isn't ok, it is <strong>excellent</strong>!\"\n      </p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/iIsNotUsed/iIsNotUsed.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>iIsNotUsed</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <p>\n        What she <i id=\"assert-1\">really</i>\n        meant to say was, \"This isn't ok, it is <i id=\"assert-2\">excellent</i> !\"\n      </p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/iIsNotUsed/iIsNotUsedSpec.js",
    "content": "describe('assessment: iIsNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/iIsNotUsed/iIsNotUsed-nomatch.html',\n          assessments: [\n            'iIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.iIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('iIsNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/iIsNotUsed/iIsNotUsed.html',\n          assessments: [\n            'iIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.iIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('iIsNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/idrefsHasCorrespondingId/idrefsHasCorrespondingId.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>idrefsHasCorrespondingId</title>\n</head>\n<body>\n\n  <span id=\"id1\"></span>\n  <span id=\"id2\"></span>\n\n  <div data-expected=\"pass\">\n\n    <!-- Headers must be on th or td element -->\n    <table><tr><td id=\"assert-2\" headers=\"id1 id2\"></td></tr></table>\n    <table><tr><th id=\"assert-3\" headers=\"id1 id2\"></th></tr></table>\n\n    <!-- aria attributes can be on any element -->\n    <input type=\"text\" id=\"assert-4\" aria-controls=\"id1 id2\" />\n    <input type=\"text\" id=\"assert-5\" aria-describedby=\"id1 id2\" />\n    <input type=\"text\" id=\"assert-6\" aria-flowto=\"id1 id2\" />\n    <input type=\"text\" id=\"assert-7\" aria-labelledby=\"id1 id2\" />\n    <input type=\"text\" id=\"assert-8\" aria-owns=\"id1 id2\" />\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- aria attributes on different elements -->\n    <div id=\"assert-9\" aria-controls=\"id1 id2\"></div>\n    <button id=\"assert-10\" aria-describedby=\"id1 id2\"></button>\n    <strong id=\"assert-11\" aria-flowto=\"id1 id2\"></strong>\n    <custom-element id=\"assert-12\" aria-labelledby=\"id1 id2\"></custom-element>\n    <video id=\"assert-13\" aria-owns=\"id1 id2\"></video>\n  </div>\n\n  <div data-expected=\"fail\">\n    <table><tr>\n      <td class=\"quail-failed-element\" id=\"assert-14\" headers=\"non-existing\"></td>\n    </tr></table>\n  </div>\n\n  <div data-expected=\"fail\">\n    <table><tr>\n      <th class=\"quail-failed-element\" id=\"assert-15\" headers=\"non-existing\"></th>\n    </tr></table>\n  </div>\n\n  <div data-expected=\"fail\">\n    <div id=\"assert-16\" aria-controls=\"non-existing\"\n    class=\"quail-failed-element\"></div>\n  </div>\n\n  <div data-expected=\"fail\">\n    <button id=\"assert-17\" aria-describedby=\"non-existing\"\n    class=\"quail-failed-element\"></button>\n  </div>\n\n  <div data-expected=\"fail\">\n    <strong id=\"assert-18\" aria-flowto=\"non-existing\"\n    class=\"quail-failed-element\"></strong>\n  </div>\n\n  <div data-expected=\"fail\">\n    <custom-element id=\"assert-19\" aria-labelledby=\"non-existing\"\n    class=\"quail-failed-element\"></custom-element>\n  </div>\n\n  <div data-expected=\"fail\">\n    <video id=\"assert-20\" aria-owns=\"non-existing\"\n    class=\"quail-failed-element\"></video>\n  </div>\n\n  <div data-expected=\"fail\">\n    <video id=\"assert-21\" aria-owns=\"non-existing id1\"\n    class=\"quail-failed-element\"></video>\n  </div>\n\n  <div data-expected=\"fail\">\n    <video id=\"assert-22\" aria-owns=\"id1 non-existing id2\"\n    class=\"quail-failed-element\"></video>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/idrefsHasCorrespondingId/idrefsHasCorrespondingIdSpec.js",
    "content": "xdescribe('assessment: idrefsHasCorrespondingId', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/idrefsHasCorrespondingId/idrefsHasCorrespondingId.html',\n        assessments: [\n          'idrefsHasCorrespondingId'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(21);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('idrefsHasCorrespondingId');\n  });\n\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-8', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-9', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-9').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-10', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-10').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-11', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-11').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-12', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-12').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-13', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-13').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-14', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-15', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-16', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-16').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-17', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-17').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-18', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-18').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-19', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-19').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-20', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-20').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-21', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-21').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-22', function () {\n    cases = quailResults.tests.idrefsHasCorrespondingId.cases;\n    expect(cases).quailGetById('assert-22').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/iframeMustNotHaveLongdesc/iframeMustNotHaveLongdesc-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>iframeMustNotHaveLongdesc</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/iframeMustNotHaveLongdesc/iframeMustNotHaveLongdesc.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>iframeMustNotHaveLongdesc</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<iframe id=\"assert-1\" longdesc=\"file.html\"></iframe>\n\t</div>\n\t<div data-expected=\"pass\">\n\t\t<iframe id=\"assert-2\"></iframe>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/iframeMustNotHaveLongdesc/iframeMustNotHaveLongdescSpec.js",
    "content": "describe('assessment: iframeMustNotHaveLongdesc', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/iframeMustNotHaveLongdesc/iframeMustNotHaveLongdesc-nomatch.html',\n          assessments: [\n            'iframeMustNotHaveLongdesc'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.iframeMustNotHaveLongdesc.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('iframeMustNotHaveLongdesc');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/iframeMustNotHaveLongdesc/iframeMustNotHaveLongdesc.html',\n          assessments: [\n            'iframeMustNotHaveLongdesc'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.iframeMustNotHaveLongdesc.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('iframeMustNotHaveLongdesc');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imageMapServerSide/imageMapServerSide-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imageMapServerSide</title>\n  </head>\n  <body>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imageMapServerSide/imageMapServerSide.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>imageMapServerSide</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\t<img id=\"assert-1\" src=\"../assets/map.png\" ismap alt=\"map of the country\" class=\"quail-failed-element\"/>\n\t\t</p>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p>\n\t\t\t<img id=\"assert-2\" src=\"../assets/map.png\" alt=\"map of the country\" />\n\t\t</p>\n\t\t<p>\n\t\t\t<a href=\"eastcoast.html\">East Coast</a> |\n\t\t\t<a href=\"central.html\">Central</a> |\n\t\t\t<a href=\"westcoast.html\">West Coast</a>\n\t\t</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imageMapServerSide/imageMapServerSideSpec.js",
    "content": "describe('assessment: imageMapServerSide', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imageMapServerSide/imageMapServerSide-nomatch.html',\n          assessments: [\n            'imageMapServerSide'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imageMapServerSide.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imageMapServerSide');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imageMapServerSide/imageMapServerSide.html',\n          assessments: [\n            'imageMapServerSide'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imageMapServerSide.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imageMapServerSide');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltEmptyForDecorativeImages/imgAltEmptyForDecorativeImages-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgAltEmptyForDecorativeImages</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltEmptyForDecorativeImages/imgAltEmptyForDecorativeImages.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>imgAltEmptyForDecorativeImages</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\tMy poem requires a big space\n\t\t\t<img src=\"../assets/10pttab.gif\" alt=\"\" width=\"5\" height=\"5\" class=\"quail-failed-element\"/>\n\t\t\there.\n\t\t</p>\n\t</div>\n\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\t<a>\n\t\t\t\t<img src=\"../assets/star.gif\" alt=\"red star\"  class=\"quail-failed-element\"/>\n\t\t\t\tdogs\n\t\t\t</a>\n\t\t</p>\n\t</div>\n\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\t<a>\n\t\t\t\t<img src=\"../assets/star.gif\" alt=\"\"  class=\"quail-failed-element\"/>\n\t\t\t\tdogs\n\t\t\t</a>\n\t\t</p>\n\t</div>\n\n\t<div data-expected=\"fail\">\n\n\t\t<p>\n\t\t\tMy poem requires a big space\n\t\t\t<img src=\"../assets/10pttab.gif\" alt=\"big space\" width=\"5\" height=\"5\" class=\"quail-failed-element\"/>\n\t\t\there.\n\t\t</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltEmptyForDecorativeImages/imgAltEmptyForDecorativeImagesSpec.js",
    "content": "xdescribe('assessment: imgAltEmptyForDecorativeImages', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgAltEmptyForDecorativeImages/imgAltEmptyForDecorativeImages-nomatch.html',\n          assessments: [\n            'imgAltEmptyForDecorativeImages'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgAltEmptyForDecorativeImages.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgAltEmptyForDecorativeImages');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgAltEmptyForDecorativeImages/imgAltEmptyForDecorativeImages.html',\n          assessments: [\n            'imgAltEmptyForDecorativeImages'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgAltEmptyForDecorativeImages.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgAltEmptyForDecorativeImages');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIdentifiesLinkDestination/imgAltIdentifiesLinkDestination-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgAltIdentifiesLinkDestination</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIdentifiesLinkDestination/imgAltIdentifiesLinkDestination.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>imgAltIdentifiesLinkDestination</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\t<a href=\"routes.html\">\n\t\t\t\t<img src=\"../assets/map.png\" alt=\"Current routes at Boulders Climbing Gym\"  class=\"quail-failed-element\"/>\n\t\t\t</a>\n\t\t</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIdentifiesLinkDestination/imgAltIdentifiesLinkDestinationSpec.js",
    "content": "xdescribe('assessment: imgAltIdentifiesLinkDestination', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgAltIdentifiesLinkDestination/imgAltIdentifiesLinkDestination-nomatch.html',\n          assessments: [\n            'imgAltIdentifiesLinkDestination'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgAltIdentifiesLinkDestination.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgAltIdentifiesLinkDestination');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgAltIdentifiesLinkDestination/imgAltIdentifiesLinkDestination.html',\n          assessments: [\n            'imgAltIdentifiesLinkDestination'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgAltIdentifiesLinkDestination.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgAltIdentifiesLinkDestination');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIsDifferent/imgAltIsDifferent.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>imgAltIsDifferent</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<img id=\"assert-1\" src=\"assets/rex.jpg\" alt=\"assets/rex.jpg\" />\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<img id=\"assert-2\" src=\"assets/rex.jpg\" alt=\"photo of rex the cat\" />\n\t</div>\n\n\t<div data-expected=\"inapplicable\">\n\t\t<img id=\"assert-3\" alt=\"photo of rex the cat\" />\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIsDifferent/imgAltIsDifferentSpec.js",
    "content": "describe('assessment: imgAltIsDifferent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/imgAltIsDifferent/imgAltIsDifferent.html',\n        assessments: [\n          'imgAltIsDifferent'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('imgAltIsDifferent');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgAltIsDifferent.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.imgAltIsDifferent.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.imgAltIsDifferent.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('inapplicable');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIsSameInText/imgAltIsSameInText-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgAltIsSameInText</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIsSameInText/imgAltIsSameInText.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>imgAltIsSameInText</title>\n\t</head>\n\t<body>\n\t\t<div data-expected=\"fail\">\n\t\t  <img src=\"../assets/rex.jpg\" alt=\"My cat\" class=\"quail-failed-element\"/>\n\t\t</div>\n\n\t\t<div data-expected=\"pass\">\n\t\t  <p>No image</p>\n\t\t</div>\n\n\n\t\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIsSameInText/imgAltIsSameInTextSpec.js",
    "content": "xdescribe('assessment: imgAltIsSameInText', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgAltIsSameInText/imgAltIsSameInText-nomatch.html',\n          assessments: [\n            'imgAltIsSameInText'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgAltIsSameInText.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgAltIsSameInText');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgAltIsSameInText/imgAltIsSameInText.html',\n          assessments: [\n            'imgAltIsSameInText'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgAltIsSameInText.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgAltIsSameInText');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIsTooLong/imgAltIsTooLong.html",
    "content": "<!doctype html>\n<html>\n\t<head>\n\t\t<title>imgAltIsTooLong</title>\n\t</head>\n\t<body>\n\t\t<div data-expected=\"fail\">\n\t\t\t<p>\n        <img id=\"assert-1\" src=\"assets/rex.jpg\" alt=\"A picture of Rex the cat with some extra text. This is very long alt text. In fact, it was much much too long for this image. Sort alt text would be much better and this alt text should be shortened.\" class=\"quail-failed-element\"/>\n      </p>\n\t\t</div>\n\n\t\t<div data-expected=\"pass\">\n\t\t\t<p>\n\t\t\t\t<img id=\"assert-2\" src=\"assets/rex.jpg\" alt=\"photo of rex the cat\" />\n      </p>\n\t\t</div>\n\n\t\t\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltIsTooLong/imgAltIsTooLongSpec.js",
    "content": "describe('assessment: imgAltIsTooLong', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/imgAltIsTooLong/imgAltIsTooLong.html',\n        assessments: [\n          'imgAltIsTooLong'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('imgAltIsTooLong');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgAltIsTooLong.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.imgAltIsTooLong.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltNotEmptyInAnchor/imgAltNotEmptyInAnchor.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgAltNotEmptyInAnchor</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <p>\n        <a id=\"assert-1\" href=\"rex.html\">\n          <img src=\"assets/rex.jpg\" alt=\"\" />\n        </a>\n      </p>\n    </div>\n\n\n    <div data-expected=\"fail\">\n      <p>\n        <a id=\"assert-2\" href=\"rex.html\">\n          <b><img src=\"assets/rex.jpg\" alt=\"\" /></b>\n        </a>\n      </p>\n    </div>\n\n    <div data-expected=\"pass\">\n      <p>\n        <a id=\"assert-3\" href=\"rex.html\">\n          <img src=\"assets/rex.jpg\" alt=\"a story about Rex the cat\"/>\n        </a>\n      </p>\n    </div>\n\n    <div data-expected=\"pass\">\n      <p>\n        <a id=\"assert-4\" href=\"rex.html\">\n          <img src=\"assets/rex.jpg\" alt=\"\"/> <b>a story about Rex the cat</b>\n        </a>\n      </p>\n    </div>\n\n    <div data-expected=\"pass\">\n      <p>\n        <a id=\"assert-5\" href=\"rex.html\">\n          <img src=\"assets/rex.jpg\" alt=\"a story about Rex the cat\"/>\n          <img src=\"assets/rex.jpg\" alt=\"\"/>\n          <img src=\"assets/rex.jpg\" alt=\"\"/>\n        </a>\n      </p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltNotEmptyInAnchor/imgAltNotEmptyInAnchorSpec.js",
    "content": "describe('assessment: imgAltNotEmptyInAnchor', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/imgAltNotEmptyInAnchor/imgAltNotEmptyInAnchor.html',\n        assessments: [\n          'imgAltNotEmptyInAnchor'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(5);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('imgAltNotEmptyInAnchor');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgAltNotEmptyInAnchor.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.imgAltNotEmptyInAnchor.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.imgAltNotEmptyInAnchor.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.imgAltNotEmptyInAnchor.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.imgAltNotEmptyInAnchor.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltNotPlaceHolder/imgAltNotPlaceHolder.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>imgAltNotPlaceHolder</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <img id=\"assert-1\" src=\"assets/rex.jpg\" alt=\"photo\" width=\"150\" height=\"105\" />\n  </div>\n\n  <div data-expected=\"fail\">\n    <img id=\"assert-2\" src=\"assets/rex.jpg\" alt=\"13K bytes\" width=\"150\" height=\"105\" />\n  </div>\n\n  <div data-expected=\"fail\">\n    <p>\n      <img id=\"assert-3\" src=\"assets/rex.jpg\" alt=\"spacer\" width=\"150\" height=\"105\" />\n    </p>\n  </div>\n\n  <div data-expected=\"fail\">\n    <p>\n      <img id=\"assert-4\" src=\"assets/rex.jpg\" alt=\"nbsp\" width=\"150\" height=\"105\" />\n    </p>\n  </div>\n\n  <div data-expected=\"fail\">\n    <img id=\"assert-5\" src=\"assets/rex.jpg\" alt=\"image\" width=\"150\" height=\"105\" />\n  </div>\n\n  <div data-expected=\"pass\">\n    <p>\n      <img id=\"assert-6\" src=\"assets/rex.jpg\" alt=\"Photo of a brown and black cat named Rex.\" />\n    </p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgAltNotPlaceHolder/imgAltNotPlaceHolderSpec.js",
    "content": "describe('assessment: imgAltNotPlaceHolder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/imgAltNotPlaceHolder/imgAltNotPlaceHolder.html',\n        assessments: [\n          'imgAltNotPlaceHolder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('imgAltNotPlaceHolder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgAltNotPlaceHolder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.imgAltNotPlaceHolder.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.imgAltNotPlaceHolder.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.imgAltNotPlaceHolder.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.imgAltNotPlaceHolder.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.imgAltNotPlaceHolder.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgHasAlt/imgHasAlt-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgHasAlt</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgHasAlt/imgHasAlt.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgHasAlt</title>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <img id=\"assert-1\" src=\"assets/rex.jpg\" style=\"display:none\" alt=\"My cat\"/>\n    </div>\n\n    <div data-expected=\"pass\">\n      <img id=\"assert-2\" src=\"assets/rex.jpg\" alt=\"My cat\"/>\n    </div>\n\n    <div data-expected=\"fail\">\n      <img id=\"assert-3\" src=\"assets/rex.jpg\" />\n    </div>\n\n    <div data-expected=\"fail\">\n      <div style=\"display: none\">\n        <img id=\"assert-4\" src=\"assets/rex.jpg\" />\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgHasAlt/imgHasAltSpec.js",
    "content": "describe('assessment: imgHasAlt', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgHasAlt/imgHasAlt-nomatch.html',\n          assessments: [\n            'imgHasAlt'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgHasAlt.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgHasAlt');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgHasAlt/imgHasAlt.html',\n          assessments: [\n            'imgHasAlt'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgHasAlt.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(4);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgHasAlt');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgHasLongDesc/imgHasLongDesc.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>imgHasLongDesc</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <p>\n            The text in this document fully describes the image shown here however\n            the Alt text does not refer to this text.\n            <img id=\"assert-1\" src=\"../assets/chart.gif\" alt=\"a complex chart\" longdesc=\"this should be a URL, OK?\" />\n        </p>\n    </div>\n\n    <div data-expected=\"fail\">\n        <p>\n            The text in this document does not fully describe the complex image shown\n            here.\n            <img id=\"assert-2\" src=\"../assets/chart.gif\" alt=\"a complex chart\" longdesc=\"a complex chart\" />\n        </p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>\n            The text in this document fully describes the image shown here and the\n            Alt text refers to this text.\n            <img src=\"../assets/chart.gif\" alt=\"a complex chart as described above\"/>\n        </p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>\n            The text in this document does not fully describe the image.\n            <img src=\"../assets/chart.gif\" alt=\"a complex chart\" />\n            <a href=\"chart.txt\">(Description of image.)</a>\n        </p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>\n            The text in this document does not fully describe the image shown here\n            but the image contains a longdesc attribute linking to a text file that\n            does describe the image.\n            <img id=\"assert-3\" src=\"../assets/chart.gif\" alt=\"a complex chart\" longdesc=\"chart.html\" />\n        </p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgHasLongDesc/imgHasLongDescSpec.js",
    "content": "describe('assessment: imgHasLongDesc', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/imgHasLongDesc/imgHasLongDesc.html',\n        assessments: [\n          'imgHasLongDesc'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('imgHasLongDesc');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgHasLongDesc.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.imgHasLongDesc.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.imgHasLongDesc.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgImportantNoSpacerAlt/imgImportantNoSpacerAlt.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>imgImportantNoSpacerAlt</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<img id=\"assert-1\" src=\"assets/rex.jpg\" alt=\"  \" width=\"150\" height=\"105\" class=\"quail-failed-element\"/>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<img id=\"assert-2\" src=\"assets/big-fail.png\" alt=\"\" />\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<img id=\"assert-3\" src=\"assets/spacer.gif\" alt=\"  \" width=\"5\" height=\"5\" />\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgImportantNoSpacerAlt/imgImportantNoSpacerAltSpec.js",
    "content": "describe('assessment: imgImportantNoSpacerAlt', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/imgImportantNoSpacerAlt/imgImportantNoSpacerAlt.html',\n        assessments: [\n          'imgImportantNoSpacerAlt'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('imgImportantNoSpacerAlt');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgImportantNoSpacerAlt.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.imgImportantNoSpacerAlt.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.imgImportantNoSpacerAlt.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgMapAreasHaveDuplicateLink/imgMapAreasHaveDuplicateLink.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>imgMapAreasHaveDuplicateLink</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <p>\n            <map name=\"imagemap\" id=\"map1\">\n                <area shape=\"poly\" coords=\"185,0,355,0,295,123\" href=\"horses1.html\" alt=\"horses\"/>\n                <area shape=\"poly\" coords=\"336,202,549,203,549\" href=\"dogs1.html\" alt=\"dogs\"/>\n                <area shape=\"rect\" coords=\"0,10,172,10\" href=\"birds1.html\" alt=\"birds\"/>\n            </map>\n        </p>\n        <p>\n            <img id=\"assert-1\" src=\"assets/navigation.png\" usemap=\"#imagemap\" alt=\"navigation\" />\n        </p>\n        <p>\n            <a href=\"horses1.html\">Horses</a> | <a href=\"dogs1.html\">Dogs</a>\n        </p>\n    </div>\n\n    <div data-expected=\"fail\">\n        <p>\n            <map name=\"imagemap2\" id=\"imagemap2\">\n                <area shape=\"poly\" coords=\"185,0,355,0,295,123\" href=\"horses2.html\" alt=\"horses\"/>\n                <area shape=\"poly\" coords=\"336,202,549,203,549\" href=\"dogs2.html\" alt=\"dogs\"/>\n                <area shape=\"rect\" coords=\"0,10,172,10\" href=\"birds2.html\" alt=\"birds\"/>\n            </map>\n        </p>\n        <p>\n            <img id=\"assert-2\" src=\"assets/navigation.png\" usemap=\"#imagemap2\" alt=\"navigation\" />\n        </p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>\n            <map name=\"imagemap3\" id=\"imagemap3\">\n                <area shape=\"poly\" coords=\"185,0,355,0,295,123\" href=\"horses3.html\" alt=\"horses\"/>\n                <area shape=\"poly\" coords=\"336,202,549,203,549\" href=\"dogs3.html\" alt=\"dogs\"/>\n                <area shape=\"rect\" coords=\"0,10,172,10\" href=\"birds3.html\" alt=\"birds\"/>\n            </map>\n        </p>\n        <p>\n            <img id=\"assert-3\" src=\"assets/navigation.png\" usemap=\"#imagemap3\" alt=\"navigation\" />\n        </p>\n        <p>\n            <a href=\"horses3.html\">Horses</a> | <a href=\"dogs3.html\">Dogs</a> | <a href=\"birds3.html\">Birds</a>\n        </p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgMapAreasHaveDuplicateLink/imgMapAreasHaveDuplicateLinkSpec.js",
    "content": "xdescribe('assessment: imgMapAreasHaveDuplicateLink', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/imgMapAreasHaveDuplicateLink/imgMapAreasHaveDuplicateLink.html',\n        assessments: [\n          'imgMapAreasHaveDuplicateLink'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('imgMapAreasHaveDuplicateLink');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgMapAreasHaveDuplicateLink.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgMapAreasHaveDuplicateLink.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgMapAreasHaveDuplicateLink.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgNonDecorativeHasAlt/imgNonDecorativeHasAlt.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>imgNonDecorativeHasAlt</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\tWe would like to adopt another pet and are looking for one that is similar to what's shown in the picture.\n\t\t</p>\n\t\t<img id=\"assert-1\" src=\"assets/rex.jpg\" alt=\"\" width=\"150\" height=\"105\" />\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p>\n\t\t\tWe would like to adopt another pet and are looking for one that is similar to what's shown in the picture.\n\t\t</p>\n\t\t<img id=\"assert-2\" src=\"assets/rex.jpg\" alt=\"large brown and black cat named Rex\" width=\"150\" height=\"105\" />\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgNonDecorativeHasAlt/imgNonDecorativeHasAltSpec.js",
    "content": "describe('assessment: imgNonDecorativeHasAlt', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/imgNonDecorativeHasAlt/imgNonDecorativeHasAlt.html',\n        assessments: [\n          'imgNonDecorativeHasAlt'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('imgNonDecorativeHasAlt');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.imgNonDecorativeHasAlt.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.imgNonDecorativeHasAlt.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgNotReferredToByColorAlone/imgNotReferredToByColorAlone-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgNotReferredToByColorAlone</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgNotReferredToByColorAlone/imgNotReferredToByColorAlone.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>imgNotReferredToByColorAlone</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <h1>Clayton's Class</h1>\n\n        <p>\n            This is Clayton's class photo from 2004. Clayton is third from the left\n            wearing a red coat and no boots.\n        </p>\n        <p>\n            <img src=\"../assets/kids.jpg\" alt=\"class photo showing 6 children\" class=\"quail-failed-element\"/>\n        </p>\n    </div>\n\n    <div data-expected=\"fail\">\n        <h1>Clayton's Class</h1>\n\n        <p>Clayton is shown below in the class photo from grade 3.</p>\n        <p>\n            <img src=\"../assets/kids.jpg\" alt=\"class photo showing Clayton with red coat.\" class=\"quail-failed-element\"\n            />\n        </p>\n    </div>\n\n    <div data-expected=\"fail\">\n        <h1>Clayton's Class</h1>\n\n        <p>\n            This is Clayton's class photo from 2004. Clayton is the one wearing a\n            red coat.\n        </p>\n        <p>\n            <img src=\"../assets/kids.jpg\" alt=\"class photo showing 6 children\" class=\"quail-failed-element\" />\n        </p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgNotReferredToByColorAlone/imgNotReferredToByColorAloneSpec.js",
    "content": "xdescribe('assessment: imgNotReferredToByColorAlone', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgNotReferredToByColorAlone/imgNotReferredToByColorAlone-nomatch.html',\n          assessments: [\n            'imgNotReferredToByColorAlone'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgNotReferredToByColorAlone.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgNotReferredToByColorAlone');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgNotReferredToByColorAlone/imgNotReferredToByColorAlone.html',\n          assessments: [\n            'imgNotReferredToByColorAlone'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgNotReferredToByColorAlone.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgNotReferredToByColorAlone');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgServerSideMapNotUsed/imgServerSideMapNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgServerSideMapNotUsed</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgServerSideMapNotUsed/imgServerSideMapNotUsed.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>imgServerSideMapNotUsed</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n\n    <p>\n      <img id=\"assert-1\" src=\"assets/image.gif\" alt=\"image map\" ismap />\n    </p>\n    <p>\n      To perform this test, you must look at the server-side image map file\n            and determine if the active areas in the image map use available geometric\n            shapes.\n    </p>\n  </div>\n  <div data-expected=\"fail\">\n\n    <p>\n      <img id=\"assert-2\" src=\"assets/image.gif\" alt=\"image map\" ismap />\n    </p>\n    <p>\n      To perform this test, you must look at the server-side image map file\n            and determine if the active areas in the image map use available geometric\n            shapes.\n    </p>\n  </div>\n\n  <div data-expected=\"pass\">\n    <p>\n      <img id=\"assert-3\" src=\"assets/image.gif\" />\n    </p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgServerSideMapNotUsed/imgServerSideMapNotUsedSpec.js",
    "content": "describe('assessment: imgServerSideMapNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgServerSideMapNotUsed/imgServerSideMapNotUsed-nomatch.html',\n          assessments: [\n            'imgServerSideMapNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgServerSideMapNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgServerSideMapNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgServerSideMapNotUsed/imgServerSideMapNotUsed.html',\n          assessments: [\n            'imgServerSideMapNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgServerSideMapNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(3);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgServerSideMapNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgShouldNotHaveTitle/imgShouldNotHaveTitle-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgShouldNotHaveTitle</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgShouldNotHaveTitle/imgShouldNotHaveTitle.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>imgShouldNotHaveTitle</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<img id=\"assert-1\" src=\"assets/rex.jpg\" alt=\"A brown and black cat named Rex.\" title=\"Rex the bad cat\" class=\"quail-failed-element\"/>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<img id=\"assert-2\" src=\"assets/rex.jpg\" alt=\"A brown and black cat named Rex.\" />\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgShouldNotHaveTitle/imgShouldNotHaveTitleSpec.js",
    "content": "describe('assessment: imgShouldNotHaveTitle', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgShouldNotHaveTitle/imgShouldNotHaveTitle-nomatch.html',\n          assessments: [\n            'imgShouldNotHaveTitle'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgShouldNotHaveTitle.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgShouldNotHaveTitle');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgShouldNotHaveTitle/imgShouldNotHaveTitle.html',\n          assessments: [\n            'imgShouldNotHaveTitle'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgShouldNotHaveTitle.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgShouldNotHaveTitle');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgWithMapHasUseMap/imgWithMapHasUseMap-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>imgWithMapHasUseMap</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgWithMapHasUseMap/imgWithMapHasUseMap.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>imgWithMapHasUseMap</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\t<img id=\"assert-1\" src=\"assets/image.gif\" alt=\"image map\" ismap=\"ismap\" />\n\t\t</p>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p>\n\t\t\t<img id=\"assert-2\" src=\"assets/image.gif\" alt=\"image map\" ismap=\"ismap\" usemap=\"#map1\"/>\n\t\t</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/imgWithMapHasUseMap/imgWithMapHasUseMapSpec.js",
    "content": "describe('assessment: imgWithMapHasUseMap', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgWithMapHasUseMap/imgWithMapHasUseMap-nomatch.html',\n          assessments: [\n            'imgWithMapHasUseMap'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgWithMapHasUseMap.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgWithMapHasUseMap');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/imgWithMapHasUseMap/imgWithMapHasUseMap.html',\n          assessments: [\n            'imgWithMapHasUseMap'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.imgWithMapHasUseMap.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('imgWithMapHasUseMap');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputCheckboxRequiresFieldset/inputCheckboxRequiresFieldset.html",
    "content": "tag\n<!doctype html>\n<html>\n<head>\n    <title>inputCheckboxRequiresFieldset</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <form action=\"http://example.com/donut\" method=\"post\">\n            <p>\n                <input id=\"assert-1\" type=\"checkbox\" name=\"flavour\" id=\"choc\" value=\"chocolate\" class=\"quail-failed-element\"/>\n                <label for=\"choc\">Chocolate</label>\n                <br/>\n                <input id=\"assert-2\" type=\"checkbox\" name=\"flavour\" id=\"cream\" value=\"cream\" class=\"quail-failed-element\"/>\n                <label for=\"cream\">Cream Filled</label>\n                <br/>\n                <input id=\"assert-3\" type=\"checkbox\" name=\"flavour\" id=\"honey\" value=\"honey\" class=\"quail-failed-element\"/>\n                <label for=\"honey\">Honey Glazed</label>\n                <br/>\n                <input type=\"submit\" value=\"Purchase Donuts\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"pass\">\n        <form action=\"http://example.com/donut\" method=\"post\">\n            <fieldset>\n                <legend>Donuts Requested (check all that apply)</legend>\n                <p>\n                    <input id=\"assert-4\" type=\"checkbox\" name=\"flavour\" id=\"choc\" value=\"chocolate\" />\n                    <label for=\"choc\">Chocolate</label>\n                    <br/>\n                    <input id=\"assert-5\" type=\"checkbox\" name=\"flavour\" id=\"cream\" value=\"cream\" />\n                    <label for=\"cream\">Cream Filled</label>\n                    <br/>\n                    <input id=\"assert-6\" type=\"checkbox\" name=\"flavour\" id=\"honey\" value=\"honey\" />\n                    <label for=\"honey\">Honey Glazed</label>\n                </p>\n            </fieldset>\n            <p>\n                <input type=\"submit\" value=\"Purchase Donuts\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputCheckboxRequiresFieldset/inputCheckboxRequiresFieldsetSpec.js",
    "content": "describe('assessment: inputCheckboxRequiresFieldset', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputCheckboxRequiresFieldset/inputCheckboxRequiresFieldset.html',\n        assessments: [\n          'inputCheckboxRequiresFieldset'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputCheckboxRequiresFieldset');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputCheckboxRequiresFieldset.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputCheckboxRequiresFieldset.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.inputCheckboxRequiresFieldset.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.inputCheckboxRequiresFieldset.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.inputCheckboxRequiresFieldset.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.inputCheckboxRequiresFieldset.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputElementsDontHaveAlt/inputElementsDontHaveAlt-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>inputElementsDontHaveAlt</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <form action=\"http://mysite.com\">\n        <p>\n          <input type=\"image\" value=\"submit\" alt=\"submit the form\" />\n        </p>\n      </form>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputElementsDontHaveAlt/inputElementsDontHaveAlt.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>inputElementsDontHaveAlt</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <form action=\"http://mysite.com\">\n      <p>\n        <input id=\"assert-1\" type=\"submit\" value=\"submit\" alt=\"submit the form\" />\n      </p>\n    </form>\n  </div>\n\n  <div data-expected=\"pass\">\n    <form action=\"http://mysite.com\">\n      <p>\n        <input id=\"assert-2\" type=\"submit\" value=\"submit\" />\n      </p>\n    </form>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputElementsDontHaveAlt/inputElementsDontHaveAltSpec.js",
    "content": "describe('assessment: inputElementsDontHaveAlt', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/inputElementsDontHaveAlt/inputElementsDontHaveAlt-nomatch.html',\n          assessments: [\n            'inputElementsDontHaveAlt'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.inputElementsDontHaveAlt.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('inputElementsDontHaveAlt');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/inputElementsDontHaveAlt/inputElementsDontHaveAlt.html',\n          assessments: [\n            'inputElementsDontHaveAlt'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.inputElementsDontHaveAlt.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('inputElementsDontHaveAlt');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageAltIsNotFileName/inputImageAltIsNotFileName.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>inputImageAltIsNotFileName</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<form>\n\t\t\t<label for=\"assert-1\">Name</label>:\n\t\t\t<br/>\n\t\t\t<br/>\n\t\t\t<input type=\"image\" name=\"name\" id=\"assert-1\" src=\"assets/name.jpg\" alt=\"assets/name.jpg\" class=\"quail-failed-element\"/>\n\t\t</form>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<form>\n\t\t\t<label for=\"assert-2\">Name</label>:\n\t\t\t<br/>\n\t\t\t<br/>\n\t\t\t<input type=\"image\" name=\"name\" id=\"assert-2\" src=\"assets/input.jpg\" alt=\"input name\">\n\t\t</form>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageAltIsNotFileName/inputImageAltIsNotFileNameSpec.js",
    "content": "describe('assessment: inputImageAltIsNotFileName', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputImageAltIsNotFileName/inputImageAltIsNotFileName.html',\n        assessments: [\n          'inputImageAltIsNotFileName'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputImageAltIsNotFileName');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputImageAltIsNotFileName.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputImageAltIsNotFileName.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageAltIsNotPlaceholder/inputImageAltIsNotPlaceholder.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>inputImageAltIsNotPlaceholder</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <form>\n          <label for=\"assert-1\">Name</label>:\n          <input type=\"image\" name=\"name\" id=\"assert-1\" src=\"assets/name.jpg\" alt=\"photo\" />\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n        <form>\n          <label for=\"assert-2\">Name</label>:\n          <input type=\"image\" name=\"name\" id=\"assert-2\" src=\"assets/name.jpg\" alt=\"16K bytes\" />\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n        <form>\n          <label for=\"assert-3\">Name</label>:\n          <input type=\"image\" name=\"name\" id=\"assert-3\" src=\"assets/name.jpg\" alt=\"image\" />\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n        <form>\n          <label for=\"assert-4\">Name</label>:\n          <input type=\"image\" name=\"name\" id=\"assert-4\" src=\"assets/name.jpg\" alt=\"input name\" />\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageAltIsNotPlaceholder/inputImageAltIsNotPlaceholderSpec.js",
    "content": "describe('assessment: inputImageAltIsNotPlaceholder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputImageAltIsNotPlaceholder/inputImageAltIsNotPlaceholder.html',\n        assessments: [\n          'inputImageAltIsNotPlaceholder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputImageAltIsNotPlaceholder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputImageAltIsNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputImageAltIsNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.inputImageAltIsNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.inputImageAltIsNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageAltIsShort/inputImageAltIsShort.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>inputImageAltIsShort</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<form>\n\t\t\t<label for=\"assert-1\">Name</label>:\n\t\t\t<br/>\n\t\t\t<br/>\n\t\t\t<input type=\"image\" name=\"name\" id=\"assert-1\" class=\"quail-failed-element\" src=\"assets/name.jpg\" alt=\"This is some very long alt text for the contro's image. Your alt text should not be this long. Shorten the text to make it more accessible and more pleasant for all.\"></form>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<form>\n\t\t\t<label for=\"assert-2\">Name</label>\n\t\t\t:\n\t\t\t<br/>\n\t\t\t<br/>\n\t\t\t<input type=\"image\" name=\"name\" id=\"assert-2\" src=\"assets/input.jpg\" alt=\"name\"></form>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageAltIsShort/inputImageAltIsShortSpec.js",
    "content": "describe('assessment: inputImageAltIsShort', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputImageAltIsShort/inputImageAltIsShort.html',\n        assessments: [\n          'inputImageAltIsShort'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputImageAltIsShort');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputImageAltIsShort.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputImageAltIsShort.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageAltNotRedundant/inputImageAltNotRedundant.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>inputImageAltNotRedundant</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<form action=\"http://example.com/prog/text-read\" method=\"post\">\n\t\t\t<input id=\"assert-1\" type=\"image\" name=\"submit\" \"assets/name.jpg\" alt=\"submit\" class=\"quail-failed-element\"/>\n\t\t</form>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<form action=\"http://example.com/prog/text-read\" method=\"post\">\n\t\t\t<input id=\"assert-2\" type=\"image\" name=\"submit\" \"assets/name.jpg\" alt=\"find dogs\"/>\n\t\t</form>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageAltNotRedundant/inputImageAltNotRedundantSpec.js",
    "content": "describe('assessment: inputImageAltNotRedundant', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputImageAltNotRedundant/inputImageAltNotRedundant.html',\n        assessments: [\n          'inputImageAltNotRedundant'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputImageAltNotRedundant');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputImageAltNotRedundant.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputImageAltNotRedundant.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageHasAlt/inputImageHasAlt-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>inputImageHasAlt</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageHasAlt/inputImageHasAlt.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>inputImageHasAlt</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <form action=\"http://example.com/prog/text-read\" method=\"post\">\n      <p>\n        <!-- Providing a src value causes the tests to fail because the element is not available while the image loads. -->\n        <input id=\"assert-1\" type=\"image\" name=\"submit\" src=\"\" />\n      </p>\n    </form>\n  </div>\n\n  <div data-expected=\"pass\">\n    <form action=\"http://example.com/prog/text-read\" method=\"post\">\n      <p>\n        <!-- Providing a src value causes the tests to fail because the element is not available while the image loads. -->\n        <input id=\"assert-2\" type=\"image\" name=\"submit\" src=\"\" alt=\"Find Dogs\"/>\n      </p>\n    </form>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputImageHasAlt/inputImageHasAltSpec.js",
    "content": "describe('assessment: inputImageHasAlt', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/inputImageHasAlt/inputImageHasAlt-nomatch.html',\n          assessments: [\n            'inputImageHasAlt'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.inputImageHasAlt.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('inputImageHasAlt');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/inputImageHasAlt/inputImageHasAlt.html',\n          assessments: [\n            'inputImageHasAlt'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.inputImageHasAlt.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('inputImageHasAlt');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputTextHasLabel/inputTextHasLabel.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>inputTextHasLabel</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <input id=\"assert-1\" type=\"text\" title=\"first name\" name=\"firstname\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form>\n            Name:\n            <input id=\"assert-2\" type=\"text\" name=\"name\" >\n            <input id=\"assert-3\" type=\"submit\" value=\"Send\">\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <label>First name:</label>\n                <input id=\"assert-4\" type=\"text\" name=\"firstname\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <label>\n                    First name:\n                    <input id=\"assert-5\" type=\"text\" name=\"firstname\" />\n                </label>\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"pass\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <label for=\"assert-6\">First name:</label>\n                <input id=\"assert-6\" type=\"text\" name=\"firstname\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputTextHasLabel/inputTextHasLabelSpec.js",
    "content": "describe('assessment: inputTextHasLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputTextHasLabel/inputTextHasLabel.html',\n        assessments: [\n          'inputTextHasLabel'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputTextHasLabel');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputTextHasLabel.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputTextHasLabel.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.inputTextHasLabel.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.inputTextHasLabel.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.inputTextHasLabel.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.inputTextHasLabel.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputTextHasValue/inputTextHasValue.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>inputTextHasValue</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n      <label for=\"name\">Name</label>:\n      <input id=\"assert-1\" type=\"text\" name=\"name\" id=\"name\" />\n      <input type=\"submit\" value=\"Send\" />\n    </form>\n  </div>\n\n  <div data-expected=\"pass\">\n    <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n      <label for=\"name\">Name</label>:\n      <input id=\"assert-2\" type=\"text\" name=\"name\" id=\"name\" value=\"your name here\" />\n      <input type=\"submit\" value=\"Send\" />\n    </form>\n  </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputTextHasValue/inputTextHasValueSpec.js",
    "content": "describe('assessment: inputTextHasValue', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputTextHasValue/inputTextHasValue.html',\n        assessments: [\n          'inputTextHasValue'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputTextHasValue');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputTextHasValue.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputTextHasValue.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputTextValueNotEmpty/inputTextValueNotEmpty.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>inputTextValueNotEmpty</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<form>\n\t\t\t<label for=\"name\">Name:</label>\n\t\t\t<input id=\"assert-1\" type=\"text\" name=\"name\" id=\"name\" />\n\t\t</form>\n\t</div>\n\t<div data-expected=\"pass\">\n\t\t<form>\n\t\t\t<label for=\"name\">Name:</label>\n\t\t\t<input id=\"assert-2\" type=\"text\" name=\"name\" id=\"name\" value=\"your name\" />\n\t\t</form>\n</div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputTextValueNotEmpty/inputTextValueNotEmptySpec.js",
    "content": "describe('assessment: inputTextValueNotEmpty', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputTextValueNotEmpty/inputTextValueNotEmpty.html',\n        assessments: [\n          'inputTextValueNotEmpty'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputTextValueNotEmpty');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputTextValueNotEmpty.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputTextValueNotEmpty.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputWithoutLabelHasTitle/inputWithoutLabelHasTitle.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>inputWithoutLabelHasTitle</title>\n</head>\n<body>\n\n\n    <div data-expected=\"fail\">\n        <input id=\"assert-1\" type=\"text\" class=\"quail-failed-element\" />\n    </div>\n\n    <div data-expected=\"fail\">\n        <label>Implicit label:\n          <input id=\"assert-2\" type=\"text\" class=\"quail-failed-element\" />\n        </label>\n    </div>\n\n    <div data-expected=\"pass\">\n        <label for=\"assert-3\">Select your favorite pet</label>\n        <select id=\"assert-3\">\n            <option>Cat</option>\n            <option>Dog</option>\n            <option>Fish</option>\n        </select>\n        <input id=\"assert-4\" type=\"text\" title=\"Search keywords\"></input>\n    </div>\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/inputWithoutLabelHasTitle/inputWithoutLabelHasTitleSpec.js",
    "content": "describe('assessment: inputWithoutLabelHasTitle', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/inputWithoutLabelHasTitle/inputWithoutLabelHasTitle.html',\n        assessments: [\n          'inputWithoutLabelHasTitle'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('inputWithoutLabelHasTitle');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.inputWithoutLabelHasTitle.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.inputWithoutLabelHasTitle.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.inputWithoutLabelHasTitle.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.inputWithoutLabelHasTitle.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelDoesNotContainInput/labelDoesNotContainInput-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>labelDoesNotContainInput</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelDoesNotContainInput/labelDoesNotContainInput.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>labelDoesNotContainInput</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<form>\n\t\t\t<label id=\"assert-1\" for=\"name\">\n\t\t\t\tFirst name:\n\t\t\t\t<input type=\"text\" name=\"firstname\" id=\"name\" />\n\t\t\t</label>\n\t\t</form>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<form>\n\t\t\t<label id=\"assert-2\" for=\"name\">First name:</label>\n\t\t\t<input type=\"text\" name=\"firstname\" id=\"name\" />\n\t\t</form>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelDoesNotContainInput/labelDoesNotContainInputSpec.js",
    "content": "describe('assessment: labelDoesNotContainInput', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/labelDoesNotContainInput/labelDoesNotContainInput-nomatch.html',\n          assessments: [\n            'labelDoesNotContainInput'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.labelDoesNotContainInput.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('labelDoesNotContainInput');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/labelDoesNotContainInput/labelDoesNotContainInput.html',\n          assessments: [\n            'labelDoesNotContainInput'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.labelDoesNotContainInput.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('labelDoesNotContainInput');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelMustBeUnique/labelMustBeUnique.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>labelMustBeUnique</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <form>\n      <label id=\"assert-1\" for=\"a\">Label A:</label>\n      <input type=\"text\" name=\"a\" id=\"a\" />\n\n        <label id=\"assert-2\" for=\"a\">Label A:</label>\n        <input type=\"text\" name=\"b\" id=\"b\" />\n    </form>\n  </div>\n\n  <div data-expected=\"pass\">\n    <form>\n      <label id=\"assert-3\" for=\"c\">Label C:</label>\n      <input type=\"text\" name=\"c\" id=\"c\" />\n\n        <label id=\"assert-4\" for=\"d\">Label D:</label>\n        <input type=\"text\" name=\"d\" id=\"d\" />\n    </form>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelMustBeUnique/labelMustBeUniqueSpec.js",
    "content": "describe('assessment: labelMustBeUnique', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/labelMustBeUnique/labelMustBeUnique.html',\n        assessments: [\n          'labelMustBeUnique'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('labelMustBeUnique');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.labelMustBeUnique.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.labelMustBeUnique.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.labelMustBeUnique.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.labelMustBeUnique.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelMustNotBeEmpty/labelMustNotBeEmpty.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>labelMustNotBeEmpty</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com\" method=\"post\">\n            <p>\n                <label id=\"assert-1\" for=\"name1\"></label>\n                <input type=\"text\" name=\"firstname\" id=\"name1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com\" method=\"post\">\n            <p>\n                <label id=\"assert-2\" for=\"name2\">\n                    <img src=\"assets/name.jpg\" alt=\"\" />\n                </label>\n                <input type=\"text\" name=\"firstname\" id=\"name2\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com\" method=\"post\">\n            <p>\n                <label id=\"assert-3\" for=\"name3\"></label>\n                <input type=\"text\" name=\"firstname\" id=\"name3\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"pass\">\n        <form action=\"http://www.test.com\" method=\"post\">\n            <p>\n                <label id=\"assert-4\" for=\"name4\">\n                    <img src=\"assets/name.jpg\" alt=\"firstname\" />\n                </label>\n                <input type=\"text\" name=\"firstname\" id=\"name4\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"pass\">\n        <form action=\"http://www.test.com\" method=\"post\">\n            <p>\n                <label id=\"assert-5\" for=\"name5\">First name:</label>\n                <input type=\"text\" name=\"firstname\" id=\"name5\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelMustNotBeEmpty/labelMustNotBeEmptySpec.js",
    "content": "describe('assessment: labelMustNotBeEmpty', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/labelMustNotBeEmpty/labelMustNotBeEmpty.html',\n        assessments: [\n          'labelMustNotBeEmpty'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(5);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('labelMustNotBeEmpty');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.labelMustNotBeEmpty.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.labelMustNotBeEmpty.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.labelMustNotBeEmpty.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.labelMustNotBeEmpty.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.labelMustNotBeEmpty.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelsAreAssignedToAnInput/labelsAreAssignedToAnInput.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>labelsAreAssignedToAnInput</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <form>\n            <label id=\"assert-1\" class=\"quail-failed-element\">Orphaned Label</label>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form>\n            <label id=\"assert-2\" for=\"something\" class=\"quail-failed-element\">Orphaned Label</label>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form>\n            <label id=\"assert-3\" for=\"something\" class=\"quail-failed-element\">Orphaned Label</label>\n            <p id=\"something\">Wow, wrong thing</p>\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n\n        <form>\n            <label id=\"assert-4\" for=\"name4\">Your Name</label>\n            <input type=\"text\" name=\"name\" id=\"name4\"/>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/labelsAreAssignedToAnInput/labelsAreAssignedToAnInputSpec.js",
    "content": "describe('assessment: labelsAreAssignedToAnInput', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/labelsAreAssignedToAnInput/labelsAreAssignedToAnInput.html',\n        assessments: [\n          'labelsAreAssignedToAnInput'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('labelsAreAssignedToAnInput');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.labelsAreAssignedToAnInput.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.labelsAreAssignedToAnInput.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.labelsAreAssignedToAnInput.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.labelsAreAssignedToAnInput.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/languageChangesAreIdentified/languageChangesAreIdentified.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>languageChangesAreIdentified</title>\n</head>\n<body lang=\"en\">\n    <div data-expected=\"article:pass|p:fail\">\n        <article>This paragraph is just fine, it is written in English.</article>\n        <p class=\"bengali quail-failed-element\">এটি একটি ভাষা একক স্ক্রিপ্ট করা হবে না.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n        <p class=\"quail-failed-element\">\n            This paragraph is just fine, but this arabic script is not OK. هذا هو مكتوب باللغة العربية.\n        </p>\n    </div>\n\n    <div data-expected=\"article:pass|p:fail\">\n        <article>This paragraph is just fine, it is written in English.</article>\n        <p class=\"bengali quail-failed-element\">এটি একটি ভাষা একক স্ক্রিপ্ট করা হবে না.</p>\n    </div>\n\n\n    <div data-expected=\"article:pass|p:fail\" lang=\"en\">\n        <article>\n            This paragraph is just fine, but the paragraph after it is in French. Monotonectally exploit web-enabled leadership skills rather than standards compliant markets. Appropriately visualize process-centric human capital via equity invested scenarios. Continually deploy magnetic communities whereas pandemic potentialities.\n        </article>\n        <p class=\"quail-failed-element\">\n            Ceci est un texte français. Il est maintenant temps pour tous les hommes à venir à l'aide de leur pays. Exploiter Monotonectally compétences en leadership web-enabled plutôt que des normes conformes marchés. Visualiser correctement le capital humain centrée sur les processus par actions investi scénarios. Déployer continuellement communautés magnétiques alors que les potentialités en cas de pandémie.\n        </p>\n    </div>\n\n    <div data-expected=\"article:pass|p:fail\" lang=\"zh\">\n        <article>\n            这是一个较短的句子，但是这是没有问题，因为它是在中国。\n        </article>\n        <p class=\"quail-failed-element\">\n            これは短い文ですが、日本語であるため、それは結構です。\n        </p>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p>\n            This paragraph is just fine, it is written in English.\n            <span lang=\"bn\">এটি একটি ভাষা একক স্ক্রিপ্ট করা হবে না</span>\n            .\n        </p>\n    </div>\n    <div data-expected=\"article:pass|p:pass\">\n        <article>This paragraph is just fine, it is written <i></i>n English. Monotonectally exploit web-enabled leadership skills rather than standards compliant markets. Appropriately visualize process-centric human capital via equity invested scenarios. Continually deploy magnetic communities whereas pandemic potentialities. </article>\n        <p lang=\"ar\">هذا هو مكتوب باللغة العربية</p>\n    </div>\n    <div data-expected=\"pass\" lang=\"fr\">\n        <p>Ceci est un paragraphe en français.</p>\n        <p lang=\"es\">\n            Este es un párrafo en español, traductor Google ha sido muy útil.\n        </p>\n        <p>Ceci est un paragraphe en français. Encore une fois!</p>\n        <p>\n            Ce paragraphe est en français une fois de plus! Mais attendez, il ya quelques... <em lang=\"ja\">いくつかの日本語の単語</em>\n            mots japonais ainsi\n        </p>\n    </div>\n    <div data-expected=\"pass\" lang=\"en\">\n        <p>This paragraph is just fine, it is written in English. Monotonectally exploit web-enabled leadership skills rather than standards compliant markets. Appropriately visualize process-centric human capital via equity invested scenarios. Continually deploy magnetic communities whereas pandemic potentialities. </p>\n        <p lang=\"bn\">এটি একটি ভাষা একক স্ক্রিপ্ট করা হবে না.</p>\n    </div>\n    <script src=\"../../lib/guessLanguage/lib/_languageData.js\"></script>\n    <script src=\"../../lib/guessLanguage/lib/guessLanguage.js\"></script>\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/languageChangesAreIdentified/languageChangesAreIdentifiedSpec.js",
    "content": "xdescribe('assessment: languageChangesAreIdentified', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/languageChangesAreIdentified/languageChangesAreIdentified.html',\n        assessments: [\n          'languageChangesAreIdentified'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(15);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('languageChangesAreIdentified');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.languageChangesAreIdentified.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/languageDirAttributeIsUsed/languageDirAttributeIsUsed.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>languageDirAttributeIsUsed</title>\n</head>\n<body>\n    <div data-expected=\"div[dir='ltr']:ignore|p:ignore|span:fail\">\n        <div dir=\"ltr\">\n            <p id=\"assert-1\" class=\"quail-failed-element\">\n                The title says \"\n                <span lang=\"he\" dir=\"rtl\">פעילות הבינאום</span>\n                , W3C\" in Hebrew. This should also be wrapped in an inline element: \"עפּעס אַנדערש.\"\n            </p>\n        </div>\n    </div>\n\n    <div data-expected=\"fail\">\n        <div dir=\"rtl\">\n            <p id=\"assert-2\" class=\"quail-failed-element\">וואַכטל זענען זייער \"some english text\" קיוט איך טראַכטן.</p>\n        </div>\n    </div>\n\n    <div data-expected=\"fail\">\n        <div dir=\"rtl\">\n            <blockquote>וואַכטל זענען זייער קיוט איך טראַכטן.</blockquote>\n            <p id=\"assert-3\" class=\"quail-failed-element\">וואַכטל זענען זייער \"some english text\" קיוט איך טראַכטן.</p>\n        </div>\n    </div>\n\n    <div data-expected=\"fail\">\n        <div dir=\"ltr\">\n            <p id=\"assert-4\" class=\"quail-failed-element\">The title says \"פעילות הבינאום, W3C\" in Hebrew.</p>\n        </div>\n    </div>\n\n    <div data-expected=\"pass\">\n        <div dir=\"rtl\">\n            <p id=\"assert-5\">\n                וואַכטל זענען זייער \"\n                <span lang=\"en\" dir=\"ltr\">some english text</span>\n                \" קיוט איך טראַכטן.\n            </p>\n        </div>\n    </div>\n\n    <div data-expected=\"pass\">\n        <p id=\"assert-6\">\n            The title says \"\n            <span lang=\"he\" dir=\"rtl\">פעילות הבינאום</span>\n            , W3C\" in Hebrew.\n        </p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/languageDirAttributeIsUsed/languageDirAttributeIsUsedSpec.js",
    "content": "describe('assessment: languageDirAttributeIsUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/languageDirAttributeIsUsed/languageDirAttributeIsUsed.html',\n        assessments: [\n          'languageDirAttributeIsUsed'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('languageDirAttributeIsUsed');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.languageDirAttributeIsUsed.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.languageDirAttributeIsUsed.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.languageDirAttributeIsUsed.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.languageDirAttributeIsUsed.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.languageDirAttributeIsUsed.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.languageDirAttributeIsUsed.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/languageDirectionPunctuation/languageDirectionPunctuation.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <meta charset=\"utf-8\">\n    <title>languageDirectionPunctuation</title>\n  </head>\n  <body dir=\"ltr\">\n    <div data-expected=\"p:pass|span:inapplicable\">\n      <p id=\"assert-1\">\n          This paragraph has <span id=\"assert-2\" lang=\"he\" dir=\"rtl\">פעילות הבינאום</span> right-to-left text, but no punctuation.\n      </p>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n      <p id=\"assert-3\" dir=\"ltr\">This paragraph has no language changes.</p>\n    </div>\n\n    <div data-expected=\"p:fail|span:inapplicable\">\n      <p id=\"assert-4\" dir=\"ltr\">\n          This paragraph has <span id=\"assert-5\" lang=\"he\" dir=\"rtl\">,פעילות הבינאום</span> right-to-left text, but no punctuation.\n      </p>\n    </div>\n      </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/languageDirectionPunctuation/languageDirectionPunctuationSpec.js",
    "content": "xdescribe('assessment: languageDirectionPunctuation', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/languageDirectionPunctuation/languageDirectionPunctuation.html',\n        assessments: [\n          'languageDirectionPunctuation'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(5);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('languageDirectionPunctuation');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.languageDirectionPunctuation.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.languageDirectionPunctuation.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.languageDirectionPunctuation.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('inapplicable');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.languageDirectionPunctuation.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.languageDirectionPunctuation.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('inapplicable');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/languageUnicodeDirection/languageUnicodeDirection.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <meta charset=\"utf-8\">\n    <title>languageUnicodeDirection</title>\n</head>\n<body>\n    <div data-expected=\"fail\" title=\"Missing unicode characters.\">\n        <p id=\"assert-1\">\n            This should also be wrapped in an inline element: \"עפּעס אַנדערש.\"\n        </p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"Appropriate use of html special characters.\">\n        <p id=\"assert-2\">\n            The title says \"&rlm;פעילות הבינאום,&lrm; W3C\" in Hebrew.\n        </p>\n    </div>\n\n    <div data-expected=\"pass\" title=\"Appropriate use of unicode characters.\">\n        <p id=\"assert-3\">\n            The title says \"‎פעילות הבינאום,‎‏\" W3C\" in Hebrew.\n        </p>\n    </div>\n\n    <div data-expected=\"inapplicable\" title=\"No language direction change.\">\n        <p id=\"assert-4\">\n            The title has no right-to-left characters.\n        </p>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/languageUnicodeDirection/languageUnicodeDirectionSpec.js",
    "content": "describe('assessment: languageUnicodeDirection', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/languageUnicodeDirection/languageUnicodeDirection.html',\n        assessments: [\n          'languageUnicodeDirection'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('languageUnicodeDirection');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.languageUnicodeDirection.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.languageUnicodeDirection.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.languageUnicodeDirection.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.languageUnicodeDirection.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('inapplicable');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/legendTextNotEmpty/legendTextNotEmpty-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>legendTextNotEmpty</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/legendTextNotEmpty/legendTextNotEmpty.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>legendTextNotEmpty</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <form action=\"http://example.com/donut\" method=\"post\">\n            <fieldset>\n                <legend id=\"assert-1\" class=\"quail-failed-element\"></legend>\n                <p>\n                    <input type=\"radio\" name=\"flavour\" id=\"choc\" value=\"chocolate\" checked=\"checked\"\n                    />\n                    <label for=\"choc\">Chocolate *</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"cream\" value=\"cream\" />\n                    <label for=\"cream\">Cream Filled</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"honey\" value=\"honey\" />\n                    <label for=\"honey\">Honey Glazed</label>\n                </p>\n            </fieldset>\n            <p>\n                <input type=\"submit\" value=\"Purchase Donut\" />\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n\n        <form action=\"http://example.com/donut\" method=\"post\">\n            <fieldset>\n                <legend id=\"assert-2\">Donut Type</legend>\n                <p>\n                    <input type=\"radio\" name=\"flavour\" id=\"choc\" value=\"chocolate\" checked=\"checked\"\n                    />\n                    <label for=\"choc\">Chocolate (required)</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"cream\" value=\"cream\" />\n                    <label for=\"cream\">Cream Filled</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"honey\" value=\"honey\" />\n                    <label for=\"honey\">Honey Glazed</label>\n                </p>\n            </fieldset>\n            <p>\n                <input type=\"submit\" value=\"Purchase Donut\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/legendTextNotEmpty/legendTextNotEmptySpec.js",
    "content": "describe('assessment: legendTextNotEmpty', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/legendTextNotEmpty/legendTextNotEmpty-nomatch.html',\n          assessments: [\n            'legendTextNotEmpty'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.legendTextNotEmpty.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('legendTextNotEmpty');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/legendTextNotEmpty/legendTextNotEmpty.html',\n          assessments: [\n            'legendTextNotEmpty'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.legendTextNotEmpty.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('legendTextNotEmpty');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/legendTextNotPlaceholder/legendTextNotPlaceholder.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>legendTextNotPlaceholder</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <form action=\"http://example.com/donut\" method=\"post\">\n            <fieldset>\n                <legend id=\"assert-1\">legend</legend>\n                <p>\n                    <input type=\"radio\" name=\"flavour\" id=\"choc\" value=\"chocolate\" checked=\"checked\"\n                    />\n                    <label for=\"choc\">Chocolate</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"cream\" value=\"cream\" />\n                    <label for=\"cream\">Cream Filled</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"honey\" value=\"honey\" />\n                    <label for=\"honey\">Honey Glazed</label>\n                </p>\n            </fieldset>\n            <p>\n                <input type=\"submit\" value=\"Purchase Donut\" />\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n\n        <form action=\"http://example.com/donut\" method=\"post\">\n            <fieldset>\n                <legend id=\"assert-2\">Donut Type</legend>\n                <p>\n                    <input type=\"radio\" name=\"flavour\" id=\"choc\" value=\"chocolate\" checked=\"checked\"\n                    />\n                    <label for=\"choc\">Chocolate</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"cream\" value=\"cream\" />\n                    <label for=\"cream\">Cream Filled</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"honey\" value=\"honey\" />\n                    <label for=\"honey\">Honey Glazed</label>\n                </p>\n            </fieldset>\n            <p>\n                <input type=\"submit\" value=\"Purchase Donut\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/legendTextNotPlaceholder/legendTextNotPlaceholderSpec.js",
    "content": "describe('assessment: legendTextNotPlaceholder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/legendTextNotPlaceholder/legendTextNotPlaceholder.html',\n        assessments: [\n          'legendTextNotPlaceholder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('legendTextNotPlaceholder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.legendTextNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.legendTextNotPlaceholder.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/liDontUseImageForBullet/liDontUseImageForBullet-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>liDontUseImageForBullet</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/liDontUseImageForBullet/liDontUseImageForBullet.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>liDontUseImageForBullet</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <p>\n      <ul>\n        <li id=\"assert-1\">\n          <img src=\"../assets/bullet.png\">This is item one</li>\n      </ul>\n    </p>\n  </div>\n\n  <div data-expected=\"pass\">\n    <p>\n      <ul>\n        <li id=\"assert-2\">This is item one</li>\n      </ul>\n    </p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/liDontUseImageForBullet/liDontUseImageForBulletSpec.js",
    "content": "describe('assessment: liDontUseImageForBullet', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/liDontUseImageForBullet/liDontUseImageForBullet-nomatch.html',\n          assessments: [\n            'liDontUseImageForBullet'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.liDontUseImageForBullet.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('liDontUseImageForBullet');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/liDontUseImageForBullet/liDontUseImageForBullet.html',\n          assessments: [\n            'liDontUseImageForBullet'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.liDontUseImageForBullet.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('liDontUseImageForBullet');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkDoesNotChangeContextOnFocus/linkDoesNotChangeContextOnFocus.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>linkDoesNotChangeContextOnFocus</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n      <a href=\"http://www.google.com\" onfocus=\"foo;\">Open a link</a>\n    </div>\n\n    <div data-expected=\"pass\">\n      <a href=\"http://www.google.com\">Open a link</a>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkDoesNotChangeContextOnFocus/linkDoesNotChangeContextOnFocusSpec.js",
    "content": "xdescribe('assessment: linkDoesNotChangeContextOnFocus', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/linkDoesNotChangeContextOnFocus/linkDoesNotChangeContextOnFocus.html',\n        assessments: [\n          'linkDoesNotChangeContextOnFocus'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(0);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('linkDoesNotChangeContextOnFocus');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.linkDoesNotChangeContextOnFocus.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkHasAUniqueContext/linkHasAUniqueContext.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>linkHasAUniqueContext</title>\n</head>\n<body>\n\n  <div data-expected=\"inapplicable\">\n    <p><!-- No links here --></p>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Different link content -->\n    <a id=\"assert-1\" href=\"dogs\">aaa</a>\n    <a id=\"assert-2\" href=\"cats\">bbb</a>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- same URL -->\n    <a id=\"assert-3\" href=\"dogs\">Dogs!</a>\n    <a id=\"assert-4\" href=\"dogs\">Dogs!</a>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Different img alt -->\n    <a id=\"assert-5\" href=\"dogs\"><img alt=\"Dogs!\">Read more</a>\n    <a id=\"assert-6\" href=\"cats\"><img alt=\"Cats!\">Read more</a>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Different title -->\n    <a id=\"assert-7\" href=\"dogs\" title=\"dogs\">Read more</a>\n    <a id=\"assert-8\" href=\"cats\" title=\"cats\">Read more</a>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Context paragraph -->\n      <p>Dogs! - <a id=\"assert-9\" href=\"dogs\">Read more</a></p>\n    <p>Cats! - <a id=\"assert-10\" href=\"cats\">Read more</a></p>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Context list items -->\n    <ul>\n        <li>Dogs! - <a id=\"assert-11\" href=\"dogs\">Read more</a></li>\n      <li>Cats! - <a id=\"assert-12\" href=\"cats\">Read more</a></li>\n    </ul>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Context list items -->\n    <dl>\n        <dd>Dogs! - <a id=\"assert-13\" href=\"dogs\">Read more</a></dd>\n      <dd>Cats! - <a id=\"assert-14\" href=\"cats\">Read more</a></dd>\n      <dt>Cows! - <a id=\"assert-15\" href=\"cows\">Read more</a></dt>\n        <dt>Horses! - <a id=\"assert-16\" href=\"horses\">Read more</a></dt>\n    </dl>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Context heading -->\n    <table><tr>\n        <td>Dogs! - <i><a id=\"assert-17\" href=\"dogs\">Read more</a></i></td>\n      <td><i>Cats</i>! - <a id=\"assert-18\" href=\"cats\">Read more</a></td>\n    </tr></table>\n  </div>\n\n  <div data-expected=\"fail\">\n    <!-- link text title -->\n    <a id=\"assert-19\" href=\"dogs\" class=\"quail-failed-element\">Read more</a>\n    <a id=\"assert-20\" href=\"cats\" class=\"quail-failed-element\">Read more</a>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Context heading -->\n    <table><tr>\n      <th>Dogs</th><th>Cats</th>\n    </tr><tr>\n        <td><a id=\"assert-21\" href=\"dogs\">Read more</a></td>\n      <td><i><a id=\"assert-22\" href=\"cats\">Read more</a></i></td>\n    </tr></table>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Context heading -->\n    <table><tr>\n        <td headers=\"dogs\"><i><a id=\"assert-23\" href=\"dogs\">Read more</a></i></td>\n      <td headers=\"cats\"><a id=\"assert-24\" href=\"cats\">Read more</a></td>\n    </tr><tr>\n      <td id=\"dogs\">Dogs!</td><td id=\"cats\">Cats!</td>\n    </tr></table>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Context heading -->\n    <table><tr>\n        <th>Dogs!</th><td><i><a id=\"assert-25\" href=\"dogs\">Read more</a></i></td>\n      <th><i>Cats!</i></th><td><a id=\"assert-26\" href=\"cats\">Read more</a></td>\n    </tr></table>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Part of the same sentence -->\n    <div><i><a id=\"assert-27\" href=\"dogs\">Read more</a></i> (about dogs)</div>\n    <p><a id=\"assert-28\" href=\"cats\">Read more</a> <i>(about cats)</i></p>\n  </div>\n\n  <div data-expected=\"fail\">\n    <!-- similar text -->\n    <a id=\"assert-29\" href=\"dogs\" class=\"quail-failed-element\">(READ MORE!)</a>\n    <a id=\"assert-30\" href=\"cats\" class=\"quail-failed-element\">Read &nbsp; more...</a>\n  </div>\n\n  <div data-expected=\"fail\">\n    <!-- Not in the same sentence -->\n    <div>Dogs! -\n      <a id=\"assert-31\" href=\"dogs\" class=\"quail-failed-element\">Read more</a>\n    </div>\n    <div>Cats! -\n      <a id=\"assert-32\" href=\"cats\" class=\"quail-failed-element\">Read more</a>\n    </div>\n  </div>\n\n  <div data-expected=\"fail\">\n    <!-- Not in the same sentence -->\n    <div><a id=\"assert-33\" href=\"dogs\" class=\"quail-failed-element\">Read more</a>.\n      About Dogs!\n    </div>\n    <div><a id=\"assert-34\" href=\"cats\" class=\"quail-failed-element\">Read more</a>.\n      About Cats!\n    </div>\n  </div>\n\n  <div data-expected=\"pass\">\n    <!-- Not in the same sentence -->\n    <div>Dogs<br>\n      <a id=\"assert-35\" href=\"dogs\" class=\"quail-failed-element\">Read more</a>\n    </div>\n    <div>Cats<br>\n      <a id=\"assert-36\" href=\"cats\" class=\"quail-failed-element\">Read more</a>\n    </div>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkHasAUniqueContext/linkHasAUniqueContextSpec.js",
    "content": "xdescribe('assessment: linkHasAUniqueContext', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/linkHasAUniqueContext/linkHasAUniqueContext.html',\n        assessments: [\n          'linkHasAUniqueContext'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(36);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('linkHasAUniqueContext');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-8', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-9', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-10', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-10').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-11', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-12', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-12').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-13', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-14', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-14').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-15', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-16', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-16').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-17', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-17').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-18', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-18').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-19', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-19').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-20', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-20').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-21', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-21').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-22', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-22').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-23', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-23').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-24', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-24').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-25', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-25').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-26', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-26').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-27', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-27').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-28', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-28').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-29', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-29').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-30', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-30').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-31', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-31').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-32', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-32').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-33', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-33').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-34', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-34').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-35', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-35').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-36', function () {\n    cases = quailResults.tests.linkHasAUniqueContext.cases;\n    expect(cases).quailGetById('assert-36').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkUsedForAlternateContent/linkUsedForAlternateContent-fail.html",
    "content": "<!doctype html>\n<html data-expected=\"fail\" data-scope=\"document\">\n\t<head>\n\t\t<title>linkUsedForAlternateContent-fail</title>\n\t</head>\n\t<body class=\"quail-failed-element\">\n\t\t<p>This document has no link to alternate content.</p>\n\t\t\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkUsedForAlternateContent/linkUsedForAlternateContent-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>linkUsedForAlternateContent</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkUsedForAlternateContent/linkUsedForAlternateContent-pass.html",
    "content": "<!doctype html>\n<html data-expected=\"pass\" data-scope=\"document\">\n\t<head>\n    <link rel=\"alternate\" href=\"alternate.txt\">\n\t\t<title>linkUsedForAlternateContent-pass</title>\n\t</head>\n\t<body>\n\t\t<p>This document has a link to alternate content.</p>\n\t\t\t</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkUsedForAlternateContent/linkUsedForAlternateContentSpec.js",
    "content": "xdescribe('assessment: linkUsedForAlternateContent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/linkUsedForAlternateContent/linkUsedForAlternateContent-nomatch.html',\n          assessments: [\n            'linkUsedForAlternateContent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.linkUsedForAlternateContent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('linkUsedForAlternateContent');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/linkUsedForAlternateContent/linkUsedForAlternateContent.html',\n          assessments: [\n            'linkUsedForAlternateContent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.linkUsedForAlternateContent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('linkUsedForAlternateContent');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkUsedToDescribeNavigation/linkUsedToDescribeNavigation-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>linkUsedToDescribeNavigation</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/linkUsedToDescribeNavigation/linkUsedToDescribeNavigationSpec.js",
    "content": "xdescribe('assessment: linkUsedToDescribeNavigation', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/linkUsedToDescribeNavigation/linkUsedToDescribeNavigation-nomatch.html',\n          assessments: [\n            'linkUsedToDescribeNavigation'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.linkUsedToDescribeNavigation.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('linkUsedToDescribeNavigation');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/linkUsedToDescribeNavigation/linkUsedToDescribeNavigation.html',\n          assessments: [\n            'linkUsedToDescribeNavigation'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.linkUsedToDescribeNavigation.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('linkUsedToDescribeNavigation');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/listNotUsedForFormatting/listNotUsedForFormatting.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>listNotUsedForFormatting</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<ol id=\"assert-1\" class=\"quail-failed-element\">\n\t\t\t<li>Item text</li>\n\t\t</ol>\n\t</div>\n\t<div data-expected=\"pass\">\n\n\t\t<ol id=\"assert-2\">\n\t\t\t<li>Item text 1</li>\n\t\t\t<li>Item text 2</li>\n\t\t</ol>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/listNotUsedForFormatting/listNotUsedForFormattingSpec.js",
    "content": "describe('assessment: listNotUsedForFormatting', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/listNotUsedForFormatting/listNotUsedForFormatting.html',\n        assessments: [\n          'listNotUsedForFormatting'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('listNotUsedForFormatting');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.listNotUsedForFormatting.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.listNotUsedForFormatting.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/listOfLinksUseList/listOfLinksUseList.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>listOfLinksUseList</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <a id=\"assert-1\" href=\"#1\">One</a> | <a id=\"assert-2\" href=\"#2\">Two</a> | <a href=\"#3\">Three</a>\n    </div>\n\n    <div data-expected=\"fail\">\n      <a id=\"assert-3\" href=\"#1\">One</a> <a id=\"assert-4\" href=\"#2\">Two</a> <a href=\"#3\">Three</a>\n    </div>\n\n    <div data-expected=\"pass\">\n      <ul>\n        <li><a href=\"#1\">One</a></li>\n        <li><a href=\"#2\">Two</a></li>\n        <li><a href=\"#3\">Three</a></li>\n        <li><a href=\"#4\">Four</a></li>\n      </ul>\n    </div>\n\n\n      </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/listOfLinksUseList/listOfLinksUseListSpec.js",
    "content": "describe('assessment: listOfLinksUseList', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/listOfLinksUseList/listOfLinksUseList.html',\n        assessments: [\n          'listOfLinksUseList'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('listOfLinksUseList');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.listOfLinksUseList.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.listOfLinksUseList.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.listOfLinksUseList.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.listOfLinksUseList.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/marqueeIsNotUsed/marqueeIsNotUsed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>marqueeIsNotUsed</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/marqueeIsNotUsed/marqueeIsNotUsed.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>marqueeIsNotUsed</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <p>\n        <marquee id=\"assert-1\">this is marquee text</marquee>\n      </p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/marqueeIsNotUsed/marqueeIsNotUsedSpec.js",
    "content": "describe('assessment: marqueeIsNotUsed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/marqueeIsNotUsed/marqueeIsNotUsed-nomatch.html',\n          assessments: [\n            'marqueeIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.marqueeIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('marqueeIsNotUsed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/marqueeIsNotUsed/marqueeIsNotUsed.html',\n          assessments: [\n            'marqueeIsNotUsed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.marqueeIsNotUsed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('marqueeIsNotUsed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/newWindowIsOpened/newWindowIsOpened.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>newWindowIsOpened</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <p>\n      <a id=\"product\" href=\"products.html\" onclick=\"window.open('products.html');\" class=\"quail-failed-element\">\n        <img src=\"assets/go.gif\" alt=\"\" />\n      </a>\n    </p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/newWindowIsOpened/newWindowIsOpenedSpec.js",
    "content": "xdescribe('assessment: newWindowIsOpened', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/newWindowIsOpened/newWindowIsOpened.html',\n        assessments: [\n          'newWindowIsOpened'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('newWindowIsOpened');\n  });\n\n  it('should return the proper assessment for product', function () {\n    cases = quailResults.tests.newWindowIsOpened.cases;\n    expect(cases).quailGetById('product').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/noembedHasEquivalentContent/noembedHasEquivalentContent-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>noembedHasEquivalentContent</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/noembedHasEquivalentContent/noembedHasEquivalentContent.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>noembedHasEquivalentContent</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<embed src=\"demo.mov\">\n\t\t\t<noembed class=\"quail-failed-element\">Alternate content for the embed</noembed>\n\t\t</embed>\n\t</div>\n\t<div data-expected=\"pass\">\n\t\t<embed src=\"demo.mov\"></embed>\n\t</div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/noembedHasEquivalentContent/noembedHasEquivalentContentSpec.js",
    "content": "xdescribe('assessment: noembedHasEquivalentContent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/noembedHasEquivalentContent/noembedHasEquivalentContent-nomatch.html',\n          assessments: [\n            'noembedHasEquivalentContent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.noembedHasEquivalentContent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('noembedHasEquivalentContent');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/noembedHasEquivalentContent/noembedHasEquivalentContent.html',\n          assessments: [\n            'noembedHasEquivalentContent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.noembedHasEquivalentContent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('noembedHasEquivalentContent');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/noframesSectionMustHaveTextEquivalent/noframesSectionMustHaveTextEquivalent-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>noframesSectionMustHaveTextEquivalent</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/noframesSectionMustHaveTextEquivalent/noframesSectionMustHaveTextEquivalentSpec.js",
    "content": "xdescribe('assessment: noframesSectionMustHaveTextEquivalent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/noframesSectionMustHaveTextEquivalent/noframesSectionMustHaveTextEquivalent-nomatch.html',\n          assessments: [\n            'noframesSectionMustHaveTextEquivalent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.noframesSectionMustHaveTextEquivalent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('noframesSectionMustHaveTextEquivalent');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/noframesSectionMustHaveTextEquivalent/noframesSectionMustHaveTextEquivalent.html',\n          assessments: [\n            'noframesSectionMustHaveTextEquivalent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.noframesSectionMustHaveTextEquivalent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('noframesSectionMustHaveTextEquivalent');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectContentUsableWhenDisabled/objectContentUsableWhenDisabled-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectContentUsableWhenDisabled</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectContentUsableWhenDisabled/objectContentUsableWhenDisabled.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectContentUsableWhenDisabled</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<object codebase=\"hello\" class=\"quail-failed-element\"/>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectContentUsableWhenDisabled/objectContentUsableWhenDisabledSpec.js",
    "content": "xdescribe('assessment: objectContentUsableWhenDisabled', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectContentUsableWhenDisabled/objectContentUsableWhenDisabled-nomatch.html',\n          assessments: [\n            'objectContentUsableWhenDisabled'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectContentUsableWhenDisabled.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectContentUsableWhenDisabled');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectContentUsableWhenDisabled/objectContentUsableWhenDisabled.html',\n          assessments: [\n            'objectContentUsableWhenDisabled'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectContentUsableWhenDisabled.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectContentUsableWhenDisabled');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectDoesNotFlicker/objectDoesNotFlicker-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectDoesNotFlicker</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectDoesNotFlicker/objectDoesNotFlicker.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectDoesNotFlicker</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\tThere is not a real object here. I need an object that does not flicker.\n\t\t</p>\n\t\t<object class=\"quail-failed-element\"></object>\n\t</div>\n\n\t<div data-expected=\"fail\">\n\t\t<p>\n\t\t\tThere is not a real object here. I need an object that flickers.\n\t\t</p>\n\t\t<object></object>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectDoesNotFlicker/objectDoesNotFlickerSpec.js",
    "content": "xdescribe('assessment: objectDoesNotFlicker', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectDoesNotFlicker/objectDoesNotFlicker-nomatch.html',\n          assessments: [\n            'objectDoesNotFlicker'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectDoesNotFlicker.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectDoesNotFlicker');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectDoesNotFlicker/objectDoesNotFlicker.html',\n          assessments: [\n            'objectDoesNotFlicker'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectDoesNotFlicker.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectDoesNotFlicker');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectDoesNotUseColorAlone/objectDoesNotUseColorAlone-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectDoesNotUseColorAlone</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectDoesNotUseColorAlone/objectDoesNotUseColorAlone.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectDoesNotUseColorAlone</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<object class=\"quail-failed-element\"></object>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p>No object</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectDoesNotUseColorAlone/objectDoesNotUseColorAloneSpec.js",
    "content": "xdescribe('assessment: objectDoesNotUseColorAlone', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectDoesNotUseColorAlone/objectDoesNotUseColorAlone-nomatch.html',\n          assessments: [\n            'objectDoesNotUseColorAlone'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectDoesNotUseColorAlone.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectDoesNotUseColorAlone');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectDoesNotUseColorAlone/objectDoesNotUseColorAlone.html',\n          assessments: [\n            'objectDoesNotUseColorAlone'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectDoesNotUseColorAlone.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectDoesNotUseColorAlone');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectInterfaceIsAccessible/objectInterfaceIsAccessible-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectInterfaceIsAccessible</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectInterfaceIsAccessible/objectInterfaceIsAccessible.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectInterfaceIsAccessible</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<object codebase=\"hello\" class=\"quail-failed-element\"></object>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p>No object</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectInterfaceIsAccessible/objectInterfaceIsAccessibleSpec.js",
    "content": "xdescribe('assessment: objectInterfaceIsAccessible', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectInterfaceIsAccessible/objectInterfaceIsAccessible-nomatch.html',\n          assessments: [\n            'objectInterfaceIsAccessible'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectInterfaceIsAccessible.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectInterfaceIsAccessible');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectInterfaceIsAccessible/objectInterfaceIsAccessible.html',\n          assessments: [\n            'objectInterfaceIsAccessible'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectInterfaceIsAccessible.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectInterfaceIsAccessible');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectLinkToMultimediaHasTextTranscript/objectLinkToMultimediaHasTextTranscript-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectLinkToMultimediaHasTextTranscript</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectLinkToMultimediaHasTextTranscript/objectLinkToMultimediaHasTextTranscript.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectLinkToMultimediaHasTextTranscript</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<object type=\"video\" class=\"quail-failed-element\"></object>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectLinkToMultimediaHasTextTranscript/objectLinkToMultimediaHasTextTranscriptSpec.js",
    "content": "xdescribe('assessment: objectLinkToMultimediaHasTextTranscript', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectLinkToMultimediaHasTextTranscript/objectLinkToMultimediaHasTextTranscript-nomatch.html',\n          assessments: [\n            'objectLinkToMultimediaHasTextTranscript'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectLinkToMultimediaHasTextTranscript.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectLinkToMultimediaHasTextTranscript');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectLinkToMultimediaHasTextTranscript/objectLinkToMultimediaHasTextTranscript.html',\n          assessments: [\n            'objectLinkToMultimediaHasTextTranscript'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectLinkToMultimediaHasTextTranscript.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectLinkToMultimediaHasTextTranscript');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustContainText/objectMustContainText.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectMustContainText</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<object id=\"assert-1\" classid=\"http://www.miamachina.it/analogclock.py\" title=\"a clock object\">\n\t\t\t<img src=\"assets/clock.png\" />\n\t\t</object>\n\t</div>\n\n\t<div data-expected=\"fail\">\n\t\t<object id=\"assert-2\" classid=\"http://www.miamachina.it/analogclock.py\" title=\"a clock object\">\n\t\t</object>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<object id=\"assert-3\" classid=\"http://www.miamachina.it/analogclock.py\" title=\"a clock object\">\n\t\t\tHere is some text that describes the object and its operation.\n\t\t</object>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustContainText/objectMustContainTextSpec.js",
    "content": "describe('assessment: objectMustContainText', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/objectMustContainText/objectMustContainText.html',\n        assessments: [\n          'objectMustContainText'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('objectMustContainText');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.objectMustContainText.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.objectMustContainText.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.objectMustContainText.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustHaveEmbed/objectMustHaveEmbed-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectMustHaveEmbed</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustHaveEmbed/objectMustHaveEmbed.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>objectMustHaveEmbed</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n      <object id=\"assert-1\" classid=\"clsid:A12BCD3F-GH4I-56JK-xyz\" codebase=\"http://example.com/content.cab\" width=\"100\" height=\"80\">\n        <param name=\"Movie\" value=\"moviename.swf\" />\n      </object>\n    </div>\n\n    <div data-expected=\"pass\">\n      <object id=\"assert-2\" classid=\"clsid:A12BCD3F-GH4I-56JK-xyz\" codebase=\"http://example.com/content.cab\" width=\"100\" height=\"80\">\n        <param name=\"Movie\" value=\"moviename.swf\" />\n        <embed src=\"moviename.swf\" width=\"100\" height=\"80\" pluginspage=\"http://example.com/shockwave/download/\"></embed>\n      </object>\n  </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustHaveEmbed/objectMustHaveEmbedSpec.js",
    "content": "describe('assessment: objectMustHaveEmbed', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectMustHaveEmbed/objectMustHaveEmbed-nomatch.html',\n          assessments: [\n            'objectMustHaveEmbed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectMustHaveEmbed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectMustHaveEmbed');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectMustHaveEmbed/objectMustHaveEmbed.html',\n          assessments: [\n            'objectMustHaveEmbed'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectMustHaveEmbed.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectMustHaveEmbed');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustHaveTitle/objectMustHaveTitle-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectMustHaveTitle</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustHaveTitle/objectMustHaveTitle.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectMustHaveTitle</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<object id=\"assert-1\" classid=\"http://www.miamachina.it/analogclock.py\">\n\t\t\tThe text equivalent for the object should go here.\n\t\t</object>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<object id=\"assert-2\" classid=\"http://www.miamachina.it/analogclock.py\" title=\"a clock object\">\n\t\t\tThe text equivalent for the object should go here.\n\t\t</object>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustHaveTitle/objectMustHaveTitleSpec.js",
    "content": "describe('assessment: objectMustHaveTitle', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectMustHaveTitle/objectMustHaveTitle-nomatch.html',\n          assessments: [\n            'objectMustHaveTitle'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectMustHaveTitle.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectMustHaveTitle');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectMustHaveTitle/objectMustHaveTitle.html',\n          assessments: [\n            'objectMustHaveTitle'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectMustHaveTitle.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectMustHaveTitle');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustHaveValidTitle/objectMustHaveValidTitle.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>objectMustHaveValidTitle</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n      <object id=\"assert-1\" classid=\"http://www.miamachina.it/analogclock.py\" title=\"  \">The text equivalent for the object should go here.</object>\n  </div>\n\n  <div data-expected=\"fail\">\n    <object id=\"assert-2\" classid=\"http://www.miamachina.it/analogclock.py\" title=\"\">\n      The text equivalent for the object should go here.\n    </object>\n  </div>\n  <div data-expected=\"pass\">\n    <object id=\"assert-3\" classid=\"http://www.miamachina.it/analogclock.py\" title=\"a clock object\">\n      The text equivalent for the object should go here.\n    </object>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectMustHaveValidTitle/objectMustHaveValidTitleSpec.js",
    "content": "xdescribe('assessment: objectMustHaveValidTitle', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/objectMustHaveValidTitle/objectMustHaveValidTitle.html',\n        assessments: [\n          'objectMustHaveValidTitle'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('objectMustHaveValidTitle');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.objectMustHaveValidTitle.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.objectMustHaveValidTitle.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.objectMustHaveValidTitle.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectProvidesMechanismToReturnToParent/objectProvidesMechanismToReturnToParent-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectProvidesMechanismToReturnToParent</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectProvidesMechanismToReturnToParent/objectProvidesMechanismToReturnToParent.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectProvidesMechanismToReturnToParent</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<p>\n\t\t\tThe following object is not working. This is just an example.\n\t\t</p>\n\t\t<object\n        classid=\"http://www.test2.com\" title=\"a simple object\" class=\"quail-failed-element\"></object>\n\t</div>\n\t<div data-expected=\"fail\">\n\n\t\t<p>\n\t\t\tThe following object is not working. This is just an example.\n\t\t</p>\n\t\t<object\n        classid=\"http://www.test1.com\" title=\"a simple object\" class=\"quail-failed-element\"></object>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectProvidesMechanismToReturnToParent/objectProvidesMechanismToReturnToParentSpec.js",
    "content": "xdescribe('assessment: objectProvidesMechanismToReturnToParent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectProvidesMechanismToReturnToParent/objectProvidesMechanismToReturnToParent-nomatch.html',\n          assessments: [\n            'objectProvidesMechanismToReturnToParent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectProvidesMechanismToReturnToParent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectProvidesMechanismToReturnToParent');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectProvidesMechanismToReturnToParent/objectProvidesMechanismToReturnToParent.html',\n          assessments: [\n            'objectProvidesMechanismToReturnToParent'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectProvidesMechanismToReturnToParent.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectProvidesMechanismToReturnToParent');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectShouldHaveLongDescription/objectShouldHaveLongDescription-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectShouldHaveLongDescription</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectShouldHaveLongDescription/objectShouldHaveLongDescription.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectShouldHaveLongDescription</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<object class=\"quail-failed-element\"></object>\n\t</div>\n\t<div data-expected=\"pass\">\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectShouldHaveLongDescription/objectShouldHaveLongDescriptionSpec.js",
    "content": "xdescribe('assessment: objectShouldHaveLongDescription', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectShouldHaveLongDescription/objectShouldHaveLongDescription-nomatch.html',\n          assessments: [\n            'objectShouldHaveLongDescription'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectShouldHaveLongDescription.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectShouldHaveLongDescription');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectShouldHaveLongDescription/objectShouldHaveLongDescription.html',\n          assessments: [\n            'objectShouldHaveLongDescription'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectShouldHaveLongDescription.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectShouldHaveLongDescription');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectTextUpdatesWhenObjectChanges/objectTextUpdatesWhenObjectChanges-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectTextUpdatesWhenObjectChanges</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectTextUpdatesWhenObjectChanges/objectTextUpdatesWhenObjectChanges.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectTextUpdatesWhenObjectChanges</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<object codebase=\"hello\" class=\"quail-failed-element\"></object>\n\t</div>\n\n\t<div data-expected=\"pass\"></div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectTextUpdatesWhenObjectChanges/objectTextUpdatesWhenObjectChangesSpec.js",
    "content": "xdescribe('assessment: objectTextUpdatesWhenObjectChanges', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectTextUpdatesWhenObjectChanges/objectTextUpdatesWhenObjectChanges-nomatch.html',\n          assessments: [\n            'objectTextUpdatesWhenObjectChanges'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectTextUpdatesWhenObjectChanges.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectTextUpdatesWhenObjectChanges');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectTextUpdatesWhenObjectChanges/objectTextUpdatesWhenObjectChanges.html',\n          assessments: [\n            'objectTextUpdatesWhenObjectChanges'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectTextUpdatesWhenObjectChanges.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectTextUpdatesWhenObjectChanges');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectUIMustBeAccessible/objectUIMustBeAccessible-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectUIMustBeAccessible</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectUIMustBeAccessible/objectUIMustBeAccessible.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectUIMustBeAccessible</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<object classid=\"foo\" class=\"quail-failed-element\"></object>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectUIMustBeAccessible/objectUIMustBeAccessibleSpec.js",
    "content": "xdescribe('assessment: objectUIMustBeAccessible', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectUIMustBeAccessible/objectUIMustBeAccessible-nomatch.html',\n          assessments: [\n            'objectUIMustBeAccessible'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectUIMustBeAccessible.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectUIMustBeAccessible');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectUIMustBeAccessible/objectUIMustBeAccessible.html',\n          assessments: [\n            'objectUIMustBeAccessible'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectUIMustBeAccessible.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectUIMustBeAccessible');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectWithClassIDHasNoText/objectWithClassIDHasNoText-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>objectWithClassIDHasNoText</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectWithClassIDHasNoText/objectWithClassIDHasNoText.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>objectWithClassIDHasNoText</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<object classid=\"foo\" class=\"quail-failed-element\">text equiv for object</object>\n\t</div>\n\t<div data-expected=\"pass\">\n\n\t\t<object classid=\"foo\"></object>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/objectWithClassIDHasNoText/objectWithClassIDHasNoTextSpec.js",
    "content": "xdescribe('assessment: objectWithClassIDHasNoText', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectWithClassIDHasNoText/objectWithClassIDHasNoText-nomatch.html',\n          assessments: [\n            'objectWithClassIDHasNoText'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectWithClassIDHasNoText.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectWithClassIDHasNoText');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/objectWithClassIDHasNoText/objectWithClassIDHasNoText.html',\n          assessments: [\n            'objectWithClassIDHasNoText'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.objectWithClassIDHasNoText.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('objectWithClassIDHasNoText');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/pNotUsedAsHeader/pNotUsedAsHeader.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>pNotUsedAsHeader</title>\n\n    <style type=\"text/css\">\n      blockquote.styled {\n        font-style: italic;\n        font-family: Georgia, Times, \"Times New Roman\", serif;\n      }\n    </style>\n  </head>\n  <body>\n    <p id=\"paragraph-with-strong\"><strong>Headline: foo bar.</strong></p>\n\n    <p id=\"paragraph-with-b\"> <b>Looks like a header</b></p>\n\n    <p id=\"paragraph-with-i\"> <i>Looks like a header</i></p>\n\n    <p id=\"paragraph-with-u\"> <u>Looks like a header</u></p>\n\n    <p id=\"paragraph-with-font\"> <font>Looks like a header</font></p>\n\n    <p id=\"paragraph-with-em\"> <em>Looks like a header</em></p>\n\n    <p id=\"paragraph-with-bold-styling\" style=\"font-weight: bold;\">Looks like a header</p>\n\n    <p id=\"paragraph-with-strong\"> <strong>Looks like a header</strong></p>\n\n    <!--@todo: We need to figure out a convenient way to test it.-->\n    <div>\n      <p>\n        Nobis nulla sollemnes assum est volutpat. Et ii wisi hendrerit saepius\n          duis.\n      </p>\n      <p>Looks like a header, but it's not.</p>\n      <p>\n        Nobis nulla sollemnes assum est volutpat. Et ii wisi hendrerit saepius\n          duis.\n      </p>\n    </div>\n\n    <p id=\"single-sentence-paragraph\"><strong>I am a single sentence paragraph!</strong></p>\n\n    <p id=\"regular-bold-paragraph\">This is a <strong>regular</strong> paragraph</p>\n\n    <p id=\"regular-paragraph\">This is a regular paragraph</p>\n\n    <div>\n        <p>Foo.</p>\n        <blockquote class=\"styled\">\n          <p id=\"paragraph-in-block-quote\">Bar.</p>\n        </blockquote>\n    </div>\n\n    <div>\n      <table style=\"font-size:12.3199996948242px; line-height:1.5em;\">\n        <tbody>\n          <tr>\n            <td>\n              <p id=\"paragraph-in-a-table\">asd</p>\n            </td>\n          </tr>\n        </tbody>\n      </table>\n      <p id=\"paragraph-following-a-table\"><strong>foo</strong> - bar baz bom.</p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/pNotUsedAsHeader/pNotUsedAsHeaderSpec.js",
    "content": "describe('assessment: pNotUsedAsHeader', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/pNotUsedAsHeader/pNotUsedAsHeader.html',\n        assessments: [\n          'pNotUsedAsHeader'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.pNotUsedAsHeader.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct stats', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n    expect(quailResults.stats.cases).to.equal(26);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('pNotUsedAsHeader');\n  });\n\n  it('should recognize b inside paragraph', function () {\n    expect(cases).quailGetById('paragraph-with-b').to.have.quailStatus('failed');\n  });\n\n  it('should recognize i inside paragraph', function () {\n    expect(cases).quailGetById('paragraph-with-i').to.have.quailStatus('failed');\n  });\n\n  it('should recognize u inside paragraph', function () {\n    expect(cases).quailGetById('paragraph-with-u').to.have.quailStatus('failed');\n  });\n\n  it('should recognize font inside paragraph', function () {\n    expect(cases).quailGetById('paragraph-with-font').to.have.quailStatus('failed');\n  });\n\n  it('should recognize em inside paragraph', function () {\n    expect(cases).quailGetById('paragraph-with-em').to.have.quailStatus('failed');\n  });\n\n  it('should recognize strong inside paragraph', function () {\n    expect(cases).quailGetById('paragraph-with-strong').to.have.quailStatus('passed');\n  });\n\n  it('should pass single sentence paragraphs', function () {\n    expect(cases).quailGetById('single-sentence-paragraph').to.have.quailStatus('passed');\n  });\n\n  it('should pass regular paragraphs with bold text', function () {\n    expect(cases).quailGetById('regular-bold-paragraph').to.have.quailStatus('passed');\n  });\n\n  it('should pass regular paragraphs', function () {\n    expect(cases).quailGetById('regular-paragraph').to.have.quailStatus('passed');\n  });\n\n  it('should pass a p tag in a blockquote', function () {\n    expect(cases).quailGetById('paragraph-in-block-quote').to.have.quailStatus('passed');\n  });\n  it('should pass a p tag in a table', function () {\n    expect(cases).quailGetById('paragraph-in-a-table').to.have.quailStatus('passed');\n  });\n  it('should pass a p tag following a p tag in a table', function () {\n    expect(cases).quailGetById('paragraph-following-a-table').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/passwordHasLabel/passwordHasLabel.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>passwordHasLabel</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <input id=\"assert-1\" type=\"password\" title=\"\" name=\"login-password\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <input id=\"assert-2\" type=\"password\" title=\"login password\" name=\"login-password\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <label>\n                    <input id=\"assert-3\" type=\"password\" name=\"loginpassword\"/>\n                </label>\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <label for=\"assert-4\"></label>\n                <input id=\"assert-4\" type=\"password\" name=\"login-password\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <label>\n                    login password:\n                    <input id=\"assert-5\" type=\"password\" name=\"loginpassword\" />\n                </label>\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"pass\">\n        <form action=\"http://somesite.com/prog/adduser\" method=\"post\">\n            <p>\n                <label for=\"assert-6\">Password:</label>\n                <input id=\"assert-6\" type=\"password\" name=\"login-password\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/passwordHasLabel/passwordHasLabelSpec.js",
    "content": "describe('assessment: passwordHasLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/passwordHasLabel/passwordHasLabel.html',\n        assessments: [\n          'passwordHasLabel'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('passwordHasLabel');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.passwordHasLabel.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.passwordHasLabel.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.passwordHasLabel.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.passwordHasLabel.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.passwordHasLabel.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.passwordHasLabel.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/preShouldNotBeUsedForTabularLayout/preShouldNotBeUsedForTabularLayout.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>preShouldNotBeUsedForTabularLayout</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\n\t\t<pre id=\"assert-1\" class=\"quail-failed-element\">\n     dogs  cats\nbig\t  2     4\nsmall 5     7\n\t\t</pre>\n\t</div>\n\t<div data-expected=\"pass\">\n\t\t<pre id=\"assert-2\">No table here</pre>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/preShouldNotBeUsedForTabularLayout/preShouldNotBeUsedForTabularLayoutSpec.js",
    "content": "describe('assessment: preShouldNotBeUsedForTabularLayout', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/preShouldNotBeUsedForTabularLayout/preShouldNotBeUsedForTabularLayout.html',\n        assessments: [\n          'preShouldNotBeUsedForTabularLayout'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('preShouldNotBeUsedForTabularLayout');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.preShouldNotBeUsedForTabularLayout.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.preShouldNotBeUsedForTabularLayout.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/radioHasLabel/radioHasLabel.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>radioHasLabel</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com/testing\" method=\"post\">\n            <p>\n                <input id=\"assert-1\" type=\"radio\" title=\"\" name=\"mytext\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com/testing\" method=\"post\">\n            <p>\n                <input id=\"assert-2\" type=\"radio\" title=\"birds\" name=\"mytext\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com/testing\" method=\"post\">\n            <p>\n                <label>\n                    <input id=\"assert-3\" type=\"radio\" name=\"mytext\" />\n                </label>\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com/testing\" method=\"post\">\n            <p>\n                <label for=\"assert-4\"></label>\n                <input id=\"assert-4\" type=\"radio\" name=\"aradio\" tabindex=\"1\" />\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"fail\">\n        <form action=\"http://www.test.com/testing\" method=\"post\">\n            <p>\n                <label>\n                    birds\n                    <input id=\"assert-5\" type=\"radio\" name=\"mytext\"/>\n                </label>\n            </p>\n        </form>\n    </div>\n\n    <div data-expected=\"pass\">\n        <form action=\"http://www.test.com/testing\" method=\"post\">\n            <p>\n                <label for=\"assert-6\">birds</label>\n                <input id=\"assert-6\" type=\"radio\" name=\"aradio\" tabindex=\"1\"\n                />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/radioHasLabel/radioHasLabelSpec.js",
    "content": "describe('assessment: radioHasLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/radioHasLabel/radioHasLabel.html',\n        assessments: [\n          'radioHasLabel'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(6);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('radioHasLabel');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.radioHasLabel.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.radioHasLabel.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.radioHasLabel.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.radioHasLabel.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.radioHasLabel.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.radioHasLabel.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/radioMarkedWithFieldgroupAndLegend/radioMarkedWithFieldgroupAndLegend-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>radioMarkedWithFieldgroupAndLegend</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/radioMarkedWithFieldgroupAndLegend/radioMarkedWithFieldgroupAndLegend.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>radioMarkedWithFieldgroupAndLegend</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <form action=\"http://example.com/donut\" method=\"post\">\n            <p>\n                <input type=\"radio\" name=\"flavour\" id=\"choc\" value=\"chocolate\" checked=\"checked\"\n                class=\"quail-failed-element\"/>\n                <label for=\"choc\">Chocolate</label>\n                <br/>\n                <input type=\"radio\" name=\"flavour\" id=\"cream\" value=\"cream\" class=\"quail-failed-element\"/>\n                <label for=\"cream\">Cream Filled</label>\n                <br/>\n                <input type=\"radio\" name=\"flavour\" id=\"honey\" value=\"honey\" class=\"quail-failed-element\"/>\n                <label for=\"honey\">Honey Glazed</label>\n                <br/>\n                <input type=\"submit\" value=\"Purchase Donut\" />\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n\n        <form action=\"http://example.com/adduser\" method=\"post\">\n            <fieldset>\n                <label for=\"firstname\">First name:</label>\n                <input type=\"text\" id=\"firstname\" tabindex=\"1\" />\n                <label for=\"lastname\">Last name:</label>\n                <input type=\"text\" id=\"lastname\" tabindex=\"2\" />\n            </fieldset>\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n\n        <form action=\"http://example.com/adduser\" method=\"post\">\n            <legend>Personal information</legend>\n            <label for=\"firstname\">First name:</label>\n            <input type=\"text\" id=\"firstname\" tabindex=\"1\" />\n            <label for=\"lastname\">Last name:</label>\n            <input type=\"text\" id=\"lastname\" tabindex=\"2\" />\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n\n        <form action=\"http://example.com/donut\" method=\"post\">\n            <fieldset>\n                <legend>Donut Type</legend>\n                <p>\n                    <input type=\"radio\" name=\"flavour\" id=\"choc\" value=\"chocolate\" checked=\"checked\"\n                    />\n                    <label for=\"choc\">Chocolate</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"cream\" value=\"cream\" />\n                    <label for=\"cream\">Cream Filled</label>\n                    <br/>\n                    <input type=\"radio\" name=\"flavour\" id=\"honey\" value=\"honey\" />\n                    <label for=\"honey\">Honey Glazed</label>\n                </p>\n            </fieldset>\n            <p>\n                <input type=\"submit\" value=\"Purchase Donut\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/radioMarkedWithFieldgroupAndLegend/radioMarkedWithFieldgroupAndLegendSpec.js",
    "content": "xdescribe('assessment: radioMarkedWithFieldgroupAndLegend', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/radioMarkedWithFieldgroupAndLegend/radioMarkedWithFieldgroupAndLegend-nomatch.html',\n          assessments: [\n            'radioMarkedWithFieldgroupAndLegend'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.radioMarkedWithFieldgroupAndLegend.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('radioMarkedWithFieldgroupAndLegend');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/radioMarkedWithFieldgroupAndLegend/radioMarkedWithFieldgroupAndLegend.html',\n          assessments: [\n            'radioMarkedWithFieldgroupAndLegend'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.radioMarkedWithFieldgroupAndLegend.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('radioMarkedWithFieldgroupAndLegend');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptContentAccessibleWithScriptsTurnedOff/scriptContentAccessibleWithScriptsTurnedOff-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>scriptContentAccessibleWithScriptsTurnedOff</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptContentAccessibleWithScriptsTurnedOff/scriptContentAccessibleWithScriptsTurnedOff.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>scriptContentAccessibleWithScriptsTurnedOff</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<script class=\"quail-failed-element\"></script>\n\t</div>\n\t<div data-expected=\"pass\">\n\t\t<p>No script element here.</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptContentAccessibleWithScriptsTurnedOff/scriptContentAccessibleWithScriptsTurnedOffSpec.js",
    "content": "xdescribe('assessment: scriptContentAccessibleWithScriptsTurnedOff', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/scriptContentAccessibleWithScriptsTurnedOff/scriptContentAccessibleWithScriptsTurnedOff-nomatch.html',\n          assessments: [\n            'scriptContentAccessibleWithScriptsTurnedOff'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.scriptContentAccessibleWithScriptsTurnedOff.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('scriptContentAccessibleWithScriptsTurnedOff');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/scriptContentAccessibleWithScriptsTurnedOff/scriptContentAccessibleWithScriptsTurnedOff.html',\n          assessments: [\n            'scriptContentAccessibleWithScriptsTurnedOff'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.scriptContentAccessibleWithScriptsTurnedOff.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('scriptContentAccessibleWithScriptsTurnedOff');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptInBodyMustHaveNoscript/scriptInBodyMustHaveNoscript-fail.html",
    "content": "<!doctype html>\n<html data-expected=\"fail\" data-scope=\"document\">\n<head>\n\t<title>scriptInBodyMustHaveNoscript-fail</title>\n</head>\n<body class=\"quail-failed-element\">\n\t<p>There is a script element on this page.</p>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptInBodyMustHaveNoscript/scriptInBodyMustHaveNoscript-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>scriptInBodyMustHaveNoscript</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptInBodyMustHaveNoscript/scriptInBodyMustHaveNoscript-pass.html",
    "content": "<!doctype html>\n<html data-expected=\"pass\" data-scope=\"document\">\n<head>\n\t<title>scriptInBodyMustHaveNoscript-pass</title>\n</head>\n<body class=\"quail-failed-element\">\n\t<p>There is a script element on this page.</p>\n  <noscript>This is a no script message.</noscript>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptInBodyMustHaveNoscript/scriptInBodyMustHaveNoscriptSpec.js",
    "content": "xdescribe('assessment: scriptInBodyMustHaveNoscript', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/scriptInBodyMustHaveNoscript/scriptInBodyMustHaveNoscript-nomatch.html',\n          assessments: [\n            'scriptInBodyMustHaveNoscript'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.scriptInBodyMustHaveNoscript.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('scriptInBodyMustHaveNoscript');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/scriptInBodyMustHaveNoscript/scriptInBodyMustHaveNoscript.html',\n          assessments: [\n            'scriptInBodyMustHaveNoscript'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.scriptInBodyMustHaveNoscript.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('scriptInBodyMustHaveNoscript');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnFocusChangeBackgroundOrBorder/scriptOnFocusChangeBackgroundOrBorder.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>scriptOnFocusChangeBackgroundOrBorder</title>\n</head>\n<body>\n  <div>\n    <input id=\"assert-1\" name=\"num-1\" value=\"0\">\n  </div>\n\n  <div>\n    <input id=\"assert-2\" name=\"num-2\" onfocus=\"jQuery(this).css('background-color', 'red');\" onblur=\"jQuery(this).css('background-color', 'white');\" value=\"0\">\n  </div>\n\n  <div>\n    <input id=\"assert-3\" name=\"num-3\" onfocus=\"jQuery(this).css('background-color', 'red');\" value=\"0\">\n  </div>\n</body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnFocusChangeBackgroundOrBorder/scriptOnFocusChangeBackgroundOrBorderSpec.js",
    "content": "xdescribe('assessment: scriptOnFocusChangeBackgroundOrBorder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/scriptOnFocusChangeBackgroundOrBorder/scriptOnFocusChangeBackgroundOrBorder.html',\n        assessments: [\n          'scriptOnFocusChangeBackgroundOrBorder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n        cases = quailResults.tests.scriptOnFocusChangeBackgroundOrBorder.cases;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('scriptOnFocusChangeBackgroundOrBorder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnclickRequiresOnKeypress/scriptOnclickRequiresOnKeypress.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>scriptOnclickRequiresOnKeypress</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <input id=\"assert-1\" name=\"num\" onclick=\"'foo';\" value=\"0\"/>\n  </div>\n\n  <div data-expected=\"pass\">\n    <input id=\"assert-2\" name=\"num\" onclick=\"'foo';\" onkeypress=\"'bar';\" value=\"0\">\n  </div>\n\n  <div data-expected=\"fail\">\n    <a id=\"assert-3\" onclick=\"'foo';\" href=\"scriptOnclickRequiresOnKeypress.html\">A link!</a>\n  </div>\n\n  <div data-expected=\"pass\">\n    <a id=\"assert-4\" onclick=\"'foo';\" onkeypress=\"'bar';\" href=\"scriptOnclickRequiresOnKeypress.html\">A link!</a>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnclickRequiresOnKeypress/scriptOnclickRequiresOnKeypressSpec.js",
    "content": "describe('assessment: scriptOnclickRequiresOnKeypress', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/scriptOnclickRequiresOnKeypress/scriptOnclickRequiresOnKeypress.html',\n        assessments: [\n          'scriptOnclickRequiresOnKeypress'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('scriptOnclickRequiresOnKeypress');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.scriptOnclickRequiresOnKeypress.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.scriptOnclickRequiresOnKeypress.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.scriptOnclickRequiresOnKeypress.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.scriptOnclickRequiresOnKeypress.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOndblclickRequiresOnKeypress/scriptOndblclickRequiresOnKeypress.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>scriptOndblclickRequiresOnKeypress</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <input id=\"assert-1\" name=\"num\" ondblclick=\"'foo';\" value=\"0\" />\n  </div>\n\n  <div data-expected=\"pass\">\n    <input id=\"assert-2\" name=\"num\" value=\"0\" ondblclick=\"'foo';\" onkeypress=\"'foo';\" />\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOndblclickRequiresOnKeypress/scriptOndblclickRequiresOnKeypressSpec.js",
    "content": "describe('assessment: scriptOndblclickRequiresOnKeypress', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/scriptOndblclickRequiresOnKeypress/scriptOndblclickRequiresOnKeypress.html',\n        assessments: [\n          'scriptOndblclickRequiresOnKeypress'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('scriptOndblclickRequiresOnKeypress');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.scriptOndblclickRequiresOnKeypress.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.scriptOndblclickRequiresOnKeypress.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmousedownRequiresOnKeypress/scriptOnmousedownRequiresOnKeypress.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>scriptOnmousedownRequiresOnKeypress</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<input id=\"assert-1\" name=\"num\" onmousedown=\"'foo';\" value=\"0\" />\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<input id=\"assert-2\" name=\"num\" onmousedown=\"'foo';\" onkeydown=\"'bar';\" value=\"0\" />\n\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmousedownRequiresOnKeypress/scriptOnmousedownRequiresOnKeypressSpec.js",
    "content": "describe('assessment: scriptOnmousedownRequiresOnKeypress', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/scriptOnmousedownRequiresOnKeypress/scriptOnmousedownRequiresOnKeypress.html',\n        assessments: [\n          'scriptOnmousedownRequiresOnKeypress'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('scriptOnmousedownRequiresOnKeypress');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.scriptOnmousedownRequiresOnKeypress.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.scriptOnmousedownRequiresOnKeypress.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmousemove/scriptOnmousemove.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>scriptOnmousemove</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <input id=\"assert-1\" name=\"num\" onmousemove=\"'foo';\" value=\"0\" />\n    </div>\n    <div data-expected=\"pass\">\n        <input id=\"assert-2\" onmousemove=\"'foo';\" onkeypress=\"'bar';\" name=\"num\" value=\"0\"/>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmousemove/scriptOnmousemoveSpec.js",
    "content": "describe('assessment: scriptOnmousemove', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/scriptOnmousemove/scriptOnmousemove.html',\n        assessments: [\n          'scriptOnmousemove'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('scriptOnmousemove');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.scriptOnmousemove.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.scriptOnmousemove.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmouseoutHasOnmouseblur/scriptOnmouseoutHasOnmouseblur.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>scriptOnmouseoutHasOnmouseblur</title>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <!-- inputs always have an onblur, but this doesn't guarantee the same\n           behavior. Our test shouldn't be passing here outright, but should\n           report cantTell -->\n      <input id=\"assert-1\" name=\"num2\" onmouseout=\"'foo';\" value=\"0\"/>\n    </div>\n    <div data-expected=\"pass\">\n      <input id=\"assert-2\" name=\"num2\" onmouseout=\"'foo';\" onblur=\"'bar';\" value=\"0\"/>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmouseoutHasOnmouseblur/scriptOnmouseoutHasOnmouseblurSpec.js",
    "content": "describe('assessment: scriptOnmouseoutHasOnmouseblur', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/scriptOnmouseoutHasOnmouseblur/scriptOnmouseoutHasOnmouseblur.html',\n        assessments: [\n          'scriptOnmouseoutHasOnmouseblur'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('scriptOnmouseoutHasOnmouseblur');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.scriptOnmouseoutHasOnmouseblur.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.scriptOnmouseoutHasOnmouseblur.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmouseoverHasOnfocus/scriptOnmouseoverHasOnfocus.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>scriptOnmouseoverHasOnfocus</title>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <input id=\"assert-1\" name=\"num\" onmouseover=\"'foo';\" onfocus=\"'bar';\" value=\"0\">\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmouseoverHasOnfocus/scriptOnmouseoverHasOnfocusSpec.js",
    "content": "describe('assessment: scriptOnmouseoverHasOnfocus', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/scriptOnmouseoverHasOnfocus/scriptOnmouseoverHasOnfocus.html',\n        assessments: [\n          'scriptOnmouseoverHasOnfocus'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('scriptOnmouseoverHasOnfocus');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.scriptOnmouseoverHasOnfocus.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmouseupHasOnkeyup/scriptOnmouseupHasOnkeyup.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>scriptOnmouseupHasOnkeyup</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <input id=\"assert-1\" name=\"num\" onmouseup=\"'foo';\" value=\"0\"/>\n    </div>\n    <div data-expected=\"pass\">\n      <input id=\"assert-2\" name=\"num\" onmouseup=\"'foo';\" onkeyup=\"'bar';\" value=\"0\"/>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptOnmouseupHasOnkeyup/scriptOnmouseupHasOnkeyupSpec.js",
    "content": "describe('assessment: scriptOnmouseupHasOnkeyup', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/scriptOnmouseupHasOnkeyup/scriptOnmouseupHasOnkeyup.html',\n        assessments: [\n          'scriptOnmouseupHasOnkeyup'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('scriptOnmouseupHasOnkeyup');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.scriptOnmouseupHasOnkeyup.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.scriptOnmouseupHasOnkeyup.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptsDoNotFlicker/scriptsDoNotFlicker-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>scriptsDoNotFlicker</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptsDoNotFlicker/scriptsDoNotFlicker.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>scriptsDoNotFlicker</title>\n  <script>\n    // Dummy script to provide an anchor for loading jQuery.\n    \"use strict\";\n  </script>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<script class=\"quail-failed-element\"></script>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<p>No scripts here.</p>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptsDoNotFlicker/scriptsDoNotFlickerSpec.js",
    "content": "xdescribe('assessment: scriptsDoNotFlicker', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/scriptsDoNotFlicker/scriptsDoNotFlicker-nomatch.html',\n          assessments: [\n            'scriptsDoNotFlicker'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.scriptsDoNotFlicker.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('scriptsDoNotFlicker');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/scriptsDoNotFlicker/scriptsDoNotFlicker.html',\n          assessments: [\n            'scriptsDoNotFlicker'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.scriptsDoNotFlicker.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('scriptsDoNotFlicker');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptsDoNotUseColorAlone/scriptsDoNotUseColorAlone-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>scriptsDoNotUseColorAlone</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptsDoNotUseColorAlone/scriptsDoNotUseColorAlone.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>scriptsDoNotUseColorAlone</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<script class=\"quail-failed-element\"></script>\n\t<div data-expected=\"pass\">\n\t\t\t<p>No scripts be here.</p>\n\t</div>\n\n\t\t</body>\n\t</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/scriptsDoNotUseColorAlone/scriptsDoNotUseColorAloneSpec.js",
    "content": "xdescribe('assessment: scriptsDoNotUseColorAlone', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/scriptsDoNotUseColorAlone/scriptsDoNotUseColorAlone-nomatch.html',\n          assessments: [\n            'scriptsDoNotUseColorAlone'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.scriptsDoNotUseColorAlone.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('scriptsDoNotUseColorAlone');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/scriptsDoNotUseColorAlone/scriptsDoNotUseColorAlone.html',\n          assessments: [\n            'scriptsDoNotUseColorAlone'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.scriptsDoNotUseColorAlone.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('scriptsDoNotUseColorAlone');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/selectDoesNotChangeContext/selectDoesNotChangeContext.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>selectDoesNotChangeContext</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <h1>Dynamic Select Statements</h1>\n\n        <form action=\"http://www.example.com/test\" method=\"post\">\n            <p>\n                <label for=\"continent\">Select Continent</label>\n                <select id=\"continent\" onchange=\"countryChange(this);\" class=\"quail-failed-element\">\n                    <option value=\"empty\">Select a Continent</option>\n                    <option value=\"North America\">North America</option>\n                    <option value=\"South America\">South America</option>\n                    <option value=\"Asia\">Asia</option>\n                    <option value=\"Europe\">Europe</option>\n                </select>\n                <br/>\n                <input type=\"submit\" value=\"select country\" />\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form action=\"http://www.example.com/test\" method=\"post\">\n            <p>\n                <label for=\"select1\">Pick A Number:</label>\n                <select name=\"abcselect\" id=\"select1\" onchange=\"form.submit();\" class=\"quail-failed-element\">\n                    <option value=\"1\">1</option>\n                    <option value=\"2\">2</option>\n                    <option value=\"3\">3</option>\n                </select>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n\n        <form action=\"http://www.example.com/test\" method=\"post\">\n            <p>\n                <label for=\"select1\">Pick A Number:</label>\n                <select name=\"abcselect\" id=\"select1\">\n                    <option value=\"1\">1</option>\n                    <option value=\"2\">2</option>\n                    <option value=\"3\">3</option>\n                </select>\n                <br/>\n                <input type=\"submit\" value=\"select number\" />\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/selectDoesNotChangeContext/selectDoesNotChangeContextSpec.js",
    "content": "xdescribe('assessment: selectDoesNotChangeContext', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/selectDoesNotChangeContext/selectDoesNotChangeContext.html',\n        assessments: [\n          'selectDoesNotChangeContext'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(0);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('selectDoesNotChangeContext');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.selectDoesNotChangeContext.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/selectHasAssociatedLabel/selectHasAssociatedLabel.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>selectHasAssociatedLabel</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <select id=\"assert-1\" name=\"abcselect\" title=\"animal\">\n                    <option value=\"1\">dog</option>\n                    <option value=\"2\">cat</option>\n                    <option value=\"3\">bird</option>\n                </select>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <select id=\"assert-2\" name=\"abcselect\" title=\"\">\n                    <option value=\"1\">dog</option>\n                    <option value=\"2\">cat</option>\n                    <option value=\"3\">bird</option>\n                </select>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <select id=\"assert-3\" name=\"abcselect\" title=\"animal\">\n                    <option value=\"1\">dog</option>\n                    <option value=\"2\">cat</option>\n                    <option value=\"3\">bird</option>\n                </select>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <select id=\"assert-4\" name=\"abcselect\" title=\"\">\n                    <option value=\"1\">dog</option>\n                    <option value=\"2\">cat</option>\n                    <option value=\"3\">bird</option>\n                </select>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <label>\n                    <select id=\"assert-5\" name=\"abcselect\">\n                        <option value=\"1\">dog</option>\n                        <option value=\"2\">cat</option>\n                        <option value=\"3\">bird</option>\n                    </select>\n                </label>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <label>\n                    <select id=\"assert-6\" name=\"abcselect\">\n                        <option value=\"1\">dog</option>\n                        <option value=\"2\">cat</option>\n                        <option value=\"3\">bird</option>\n                    </select>\n                </label>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <label>Animal:</label>\n                <select id=\"assert-7\" name=\"abcselect\">\n                    <option value=\"1\">dog</option>\n                    <option value=\"2\">cat</option>\n                    <option value=\"3\">bird</option>\n                </select>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"fail\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <label>\n                    Animal:\n                    <select id=\"assert-8\" name=\"abcselect\">\n                        <option value=\"1\">dog</option>\n                        <option value=\"2\">cat</option>\n                        <option value=\"3\">bird</option>\n                    </select>\n                </label>\n            </p>\n        </form>\n    </div>\n    <div data-expected=\"pass\">\n\n        <form method=\"post\" action=\"http://www.test.com\">\n            <p>\n                <label for=\"assert-9\">Animal:</label>\n                <select id=\"assert-9\" name=\"abcselect\">\n                    <option value=\"1\">dog</option>\n                    <option value=\"2\">cat</option>\n                    <option value=\"3\">bird</option>\n                </select>\n            </p>\n        </form>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/selectHasAssociatedLabel/selectHasAssociatedLabelSpec.js",
    "content": "describe('assessment: selectHasAssociatedLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/selectHasAssociatedLabel/selectHasAssociatedLabel.html',\n        assessments: [\n          'selectHasAssociatedLabel'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(9);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('selectHasAssociatedLabel');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-8', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-9', function () {\n    cases = quailResults.tests.selectHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-9').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/selectJumpMenu/selectJumpMenu.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>selectJumpMenu</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <form>\n      <select id=\"assert-1\" name=\"jumpie\" onchange=\"MM_jumpMenu('parent',this,1);\" class=\"quail-failed-element\">\n        <option value=\"home.html\">Home</option>\n        <option value=\"rex.html\">Rex</option>\n      </select>\n    </form>\n  </div>\n\n  <div data-expected=\"pass\">\n    <form>\n      <select id=\"assert-2\" name=\"jumpie\">\n        <option value=\"home.html\">Home</option>\n        <option value=\"rex.html\">Rex</option>\n      </select>\n      <input type=\"submit\" value=\"go!\"></form>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/selectJumpMenu/selectJumpMenuSpec.js",
    "content": "describe('assessment: selectJumpMenu', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/selectJumpMenu/selectJumpMenu.html',\n        assessments: [\n          'selectJumpMenu'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('selectJumpMenu');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.selectJumpMenu.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.selectJumpMenu.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/siteMap/siteMap.html",
    "content": "<!doctype html>\n<html id=\"assert-1\">\n<head>\n  <title>siteMap</title>\n</head>\n<body>\n  <div data-expected=\"pass\">\n    <a href=\"sitemap.html\">Site Map</a>\n\n    <p>\n      This document is part of a large collection of related documents.\n    </p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/siteMap/siteMapSpec.js",
    "content": "describe('assessment: siteMap', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/siteMap/siteMap.html',\n        assessments: [\n          'siteMap'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('siteMap');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.siteMap.cases;\n    expect(cases[0]).to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/skipToContentLinkProvided/skipToContentLinkProvided-fail-2.html",
    "content": "<!doctype html>\n<html>\n  <head>\n      <title>skipToContentLinkProvided</title>\n      <style>\n        #focus-visible {\n          position: absolute;\n          top: 0;\n          left: -9999px;\n        }\n\n        #focus-visible:focus {\n          left: 0px;\n        }\n      </style>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <a id=\"assert-1\" href=\"#content2\" style=\"display: none;\">Skip to content</a>\n      <div id=\"content2\">\n        This is the main page content.\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/skipToContentLinkProvided/skipToContentLinkProvided-fail.html",
    "content": "<!doctype html>\n<html>\n  <head>\n      <title>skipToContentLinkProvided</title>\n      <style>\n        #focus-visible {\n          position: absolute;\n          top: 0;\n          left: -9999px;\n        }\n\n        #focus-visible:focus {\n          left: 0px;\n        }\n      </style>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <a id=\"assert-1\" href=\"somewhere.html\">Somewhere else</a>\n      <div id=\"content1\">\n        This is the main page content.\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/skipToContentLinkProvided/skipToContentLinkProvided-pass-2.html",
    "content": "<!doctype html>\n<html>\n  <head>\n      <title>skipToContentLinkProvided</title>\n      <style>\n        #focus-visible {\n          position: absolute;\n          top: 0;\n          left: -9999px;\n        }\n\n        #focus-visible:focus {\n          left: 0px;\n        }\n      </style>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <a id=\"assert-1\" href=\"#content4\" id=\"focus-visible\">Skip to content</a>\n      <div id=\"content4\">\n        This is the main page content.\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/skipToContentLinkProvided/skipToContentLinkProvided.html",
    "content": "<!doctype html>\n<html>\n  <head>\n      <title>skipToContentLinkProvided</title>\n      <style>\n        #focus-visible {\n          position: absolute;\n          top: 0;\n          left: -9999px;\n        }\n\n        #focus-visible:focus {\n          left: 0px;\n        }\n      </style>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <a id=\"assert-1\" href=\"#content3\">Skip to content</a>\n      <div id=\"content3\">\n        This is the main page content.\n      </div>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/skipToContentLinkProvided/skipToContentLinkProvidedSpec.js",
    "content": "describe('assessment: skipToContentLinkProvided', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/skipToContentLinkProvided/skipToContentLinkProvided.html',\n        assessments: [\n          'skipToContentLinkProvided'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('skipToContentLinkProvided');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.skipToContentLinkProvided.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: skipToContentLinkProvided', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/skipToContentLinkProvided/skipToContentLinkProvided-pass-2.html',\n        assessments: [\n          'skipToContentLinkProvided'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('skipToContentLinkProvided');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.skipToContentLinkProvided.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: skipToContentLinkProvided', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/skipToContentLinkProvided/skipToContentLinkProvided-fail.html',\n        assessments: [\n          'skipToContentLinkProvided'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('skipToContentLinkProvided');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.skipToContentLinkProvided.cases;\n    expect(cases[0]).to.have.quailStatus('failed');\n  });\n});\n\ndescribe('assessment: skipToContentLinkProvided', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/skipToContentLinkProvided/skipToContentLinkProvided-fail-2.html',\n        assessments: [\n          'skipToContentLinkProvided'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('skipToContentLinkProvided');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.skipToContentLinkProvided.cases;\n    expect(cases[0]).to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/svgContainsTitle/svgContainsTitle-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>svgContainsTitle</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/svgContainsTitle/svgContainsTitle.html",
    "content": "<!doctype html>\n<html>\n  <head>\n      <title>svgContainsTitle</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <svg\n        id=\"assert-1\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        version=\"1.1\"\n        viewBox=\"0 0 100 100\"\n        preserveAspectRatio=\"xMidYMid slice\"\n        style=\"width:100%; height:100%; position:absolute; top:0; left:0; z-index:-1;\">\n          <linearGradient id=\"gradient\">\n            <stop class=\"begin\" offset=\"0%\" />\n            <stop class=\"end\" offset=\"100%\" />\n          </linearGradient>\n          <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" style=\"fill:url(#gradient)\" />\n          <circle cx=\"50\" cy=\"50\" r=\"30\" style=\"fill:url(#gradient)\" />\n      </svg>\n    </div>\n\n    <div data-expected=\"pass\">\n      <svg\n        id=\"assert-2\"\n        xmlns=\"http://www.w3.org/2000/svg\"\n        version=\"1.1\"\n        viewBox=\"0 0 100 100\"\n        preserveAspectRatio=\"xMidYMid slice\"\n        style=\"width:100%; height:100%; position:absolute; top:0; left:0; z-index:-1;\">\n          <title>An example SVG file</title>\n          <linearGradient id=\"gradient\">\n            <stop class=\"begin\" offset=\"0%\" />\n            <stop class=\"end\" offset=\"100%\" />\n          </linearGradient>\n          <rect x=\"0\" y=\"0\" width=\"100\" height=\"100\" style=\"fill:url(#gradient)\" />\n          <circle cx=\"50\" cy=\"50\" r=\"30\" style=\"fill:url(#gradient)\" />\n      </svg>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/svgContainsTitle/svgContainsTitleSpec.js",
    "content": "describe('assessment: svgContainsTitle', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/svgContainsTitle/svgContainsTitle-nomatch.html',\n          assessments: [\n            'svgContainsTitle'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.svgContainsTitle.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('svgContainsTitle');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/svgContainsTitle/svgContainsTitle.html',\n          assessments: [\n            'svgContainsTitle'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.svgContainsTitle.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('svgContainsTitle');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tabIndexFollowsLogicalOrder/tabIndexFollowsLogicalOrder-fail.html",
    "content": "<!doctype html>\n<html>\n  <head>\n      <title>tabIndexFollowsLogicalOrder-fail</title>\n  </head>\n  <body>\n    <div>\n      <form action=\"http://www.example.com/servlet1\" method=\"post\">\n        <label for=\"assert-1\">First Name:</label>\n        <input type=\"text\" id=\"assert-1\" value=\"\" tabindex=\"1\"/>\n        <br/>\n        <label for=\"assert-2\">Last Name:</label>\n        <input type=\"text\" id=\"assert-2\" value=\"\" tabindex=\"4\"/>\n        <br/>\n        <label for=\"assert-3\">First Name:</label>\n        <input type=\"text\" id=\"assert-3\" value=\"\" tabindex=\"1\"/>\n        <br/>\n        <label for=\"assert-4\">Last Name:</label>\n        <input type=\"text\" id=\"assert-4\" value=\"\" tabindex=\"2\"/>\n        <br/>\n        <input type=\"submit\" value=\"submit color\" />\n      </form>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tabIndexFollowsLogicalOrder/tabIndexFollowsLogicalOrder.html",
    "content": "<!doctype html>\n<html>\n  <head>\n      <title>tabIndexFollowsLogicalOrder-fail</title>\n  </head>\n  <body>\n    <div>\n      <form action=\"http://www.example.com/servlet1\" method=\"post\">\n        <label for=\"assert-1\">First Name:</label>\n        <input type=\"text\" id=\"assert-1\" value=\"\" tabindex=\"1\"/>\n        <br/>\n        <label for=\"assert-2\">Last Name:</label>\n        <input type=\"text\" id=\"assert-2\" value=\"\" tabindex=\"2\"/>\n        <br/>\n        <label for=\"assert-3\">First Name:</label>\n        <input type=\"text\" id=\"assert-3\" value=\"\" tabindex=\"3\"/>\n        <br/>\n        <label for=\"assert-4\">Last Name:</label>\n        <input type=\"text\" id=\"assert-4\" value=\"\" tabindex=\"4\"/>\n        <br/>\n        <input type=\"submit\" value=\"submit color\" />\n      </form>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tabIndexFollowsLogicalOrder/tabIndexFollowsLogicalOrderSpec.js",
    "content": "describe('assessment: tabIndexFollowsLogicalOrder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tabIndexFollowsLogicalOrder/tabIndexFollowsLogicalOrder.html',\n        assessments: [\n          'tabIndexFollowsLogicalOrder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tabIndexFollowsLogicalOrder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tabIndexFollowsLogicalOrder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tabIndexFollowsLogicalOrder.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.tabIndexFollowsLogicalOrder.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.tabIndexFollowsLogicalOrder.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n\ndescribe('assessment: tabIndexFollowsLogicalOrder', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tabIndexFollowsLogicalOrder/tabIndexFollowsLogicalOrder-fail.html',\n        assessments: [\n          'tabIndexFollowsLogicalOrder'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tabIndexFollowsLogicalOrder');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tabIndexFollowsLogicalOrder.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tabIndexFollowsLogicalOrder.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.tabIndexFollowsLogicalOrder.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.tabIndexFollowsLogicalOrder.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableCaptionIdentifiesTable/tableCaptionIdentifiesTable-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableCaptionIdentifiesTable</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableCaptionIdentifiesTable/tableCaptionIdentifiesTable.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableCaptionIdentifiesTable</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <table border=\"1\">\n            <caption class=\"quail-failed-element\">Cups of coffee consumed by each senator</caption>\n            <tr>\n                <th>name</th>\n                <th>number of cups</th>\n                <th>type</th>\n                <th>with sugar</th>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n    <div data-expected=\"fail\">\n\n        <table border=\"1\">\n            <caption class=\"quail-failed-element\">Caption Goes Here</caption>\n            <tr>\n                <th>name</th>\n                <th>number of cups</th>\n                <th>type</th>\n                <th>with sugar</th>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableCaptionIdentifiesTable/tableCaptionIdentifiesTableSpec.js",
    "content": "xdescribe('assessment: tableCaptionIdentifiesTable', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableCaptionIdentifiesTable/tableCaptionIdentifiesTable-nomatch.html',\n          assessments: [\n            'tableCaptionIdentifiesTable'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableCaptionIdentifiesTable.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableCaptionIdentifiesTable');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableCaptionIdentifiesTable/tableCaptionIdentifiesTable.html',\n          assessments: [\n            'tableCaptionIdentifiesTable'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableCaptionIdentifiesTable.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableCaptionIdentifiesTable');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableComplexHasSummary/tableComplexHasSummary-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableComplexHasSummary</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableComplexHasSummary/tableComplexHasSummary.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableComplexHasSummary</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <table border=\"1\" class=\"quail-failed-element\">\n            <tr>\n                <th scope=\"col\">State &amp; First</th>\n                <th scope=\"col\">State &amp; Sixth</th>\n                <th scope=\"col\">State &amp; Fifteenth</th>\n                <th scope=\"col\">Fifteenth &amp; Morrison</th>\n            </tr>\n            <tr>\n                <td>4:00</td>\n                <td>4:05</td>\n                <td>4:11</td>\n                <td>4:19</td>\n            </tr>\n            <tr>\n                <td>5:00</td>\n                <td>5:05</td>\n                <td>5:11</td>\n                <td>5:19</td>\n            </tr>\n            <tr>\n                <td>6:00</td>\n                <td>6:05</td>\n                <td>6:11</td>\n                <td>6:19</td>\n            </tr>\n        </table>\n    </div>\n    <div data-expected=\"pass\">\n\n        <table border=\"1\">\n            <caption>Manager Work Days</caption>\n            <tr>\n                <th>Day</th>\n                <th>Manager</th>\n            </tr>\n            <tr>\n                <td>Monday</td>\n                <td>Erol</td>\n            </tr>\n            <tr>\n                <td>Tuesday</td>\n                <td>David</td>\n            </tr>\n            <tr>\n                <td>Wednesday</td>\n                <td>Carol</td>\n            </tr>\n            <tr>\n                <td>Thursday</td>\n                <td>Susan</td>\n            </tr>\n            <tr>\n                <td>Friday</td>\n                <td>Piere</td>\n            </tr>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableComplexHasSummary/tableComplexHasSummarySpec.js",
    "content": "xdescribe('assessment: tableComplexHasSummary', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableComplexHasSummary/tableComplexHasSummary-nomatch.html',\n          assessments: [\n            'tableComplexHasSummary'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableComplexHasSummary.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableComplexHasSummary');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableComplexHasSummary/tableComplexHasSummary.html',\n          assessments: [\n            'tableComplexHasSummary'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableComplexHasSummary.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableComplexHasSummary');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableDataShouldHaveTh/tableDataShouldHaveTh-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableDataShouldHaveTh</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableDataShouldHaveTh/tableDataShouldHaveTh.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableDataShouldHaveTh</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <table id=\"assert-1\" border=\"1\">\n            <tr>\n                <td>name</td>\n                <td>number of cups</td>\n                <td>type</td>\n                <td>with sugar</td>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"pass\">\n        <table id=\"assert-2\" border=\"1\">\n            <tr>\n                <th>name</th>\n                <th>number of cups</th>\n                <th>type</th>\n                <th>with sugar</th>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableDataShouldHaveTh/tableDataShouldHaveThSpec.js",
    "content": "describe('assessment: tableDataShouldHaveTh', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableDataShouldHaveTh/tableDataShouldHaveTh-nomatch.html',\n          assessments: [\n            'tableDataShouldHaveTh'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableDataShouldHaveTh.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableDataShouldHaveTh');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableDataShouldHaveTh/tableDataShouldHaveTh.html',\n          assessments: [\n            'tableDataShouldHaveTh'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableDataShouldHaveTh.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableDataShouldHaveTh');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableIsGrouped/tableIsGrouped-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableIsGrouped</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableIsGrouped/tableIsGrouped.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableIsGrouped</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <table border=\"1\" summary=\"cups of coffee consumed by city politicians\" class=\"quail-failed-element\">\n            <tr>\n                <th>name</th>\n                <th>number of cups</th>\n                <th>type</th>\n                <th>with sugar</th>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"pass\">\n        <table border=\"1\" summary=\"cups of coffee consumed by city politicians\">\n            <thead>\n                <tr>\n                    <th>name</th>\n                    <th>number of cups</th>\n                    <th>type</th>\n                    <th>with sugar</th>\n                </tr>\n            </thead>\n            <tbody>\n                <tr>\n                    <td>Adams, Willie</td>\n                    <td>2</td>\n                    <td>regular</td>\n                    <td>sugar</td>\n                </tr>\n                <tr>\n                    <td>Bacon, Lise</td>\n                    <td>4</td>\n                    <td>regular</td>\n                    <td>no sugar</td>\n                </tr>\n                <tr>\n                    <td>Chaput, Maria</td>\n                    <td>1</td>\n                    <td>decaf</td>\n                    <td>sugar</td>\n                </tr>\n                <tr>\n                    <td>Di Nino, Consiglio</td>\n                    <td>0</td>\n                    <td>not applicable</td>\n                    <td>not applicable</td>\n                </tr>\n                <tr>\n                    <td>Eggleton, Art</td>\n                    <td>6</td>\n                    <td>regular</td>\n                    <td>no sugar</td>\n                </tr>\n            </tbody>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableIsGrouped/tableIsGroupedSpec.js",
    "content": "xdescribe('assessment: tableIsGrouped', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableIsGrouped/tableIsGrouped-nomatch.html',\n          assessments: [\n            'tableIsGrouped'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableIsGrouped.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableIsGrouped');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableIsGrouped/tableIsGrouped.html',\n          assessments: [\n            'tableIsGrouped'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableIsGrouped.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableIsGrouped');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableLayoutDataShouldNotHaveTh/tableLayoutDataShouldNotHaveTh.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableLayoutDataShouldNotHaveTh</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <table id=\"assert-1\" border=\"0\" cellpadding=\"5\" summary=\"this table is used to create 2 columns of text\">\n            <tr>\n                <th>Latin is a dead language.</th>\n                <th>The English language thrives.</th>\n            </tr>\n            <tr>\n                <td>\n                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n                    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n                    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n                    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat\n                    non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n                </td>\n                <td>\n                    But I must explain to you how all this mistaken idea of denouncing pleasure\n                    and praising pain was born and I will give you a complete account of the\n                    system, and expound the actual teachings of the great explorer of the truth,\n                    the master-builder of human happiness. No one rejects, dislikes, or avoids\n                    pleasure itself, because it is pleasure, but because those who do not know\n                    how to pursue pleasure rationally encounter consequences that are extremely\n                    painful. Nor again is there anyone who loves or pursues or desires to obtain\n                    pain of itself, because it is pain, but because occasionally circumstances\n                    occur in which toil and pain can procure him some great pleasure. To take\n                    a trivial example, which of us ever undertakes laborious physical exercise,\n                    except to obtain some advantage from it? But who has any right to find\n                    fault with a man who chooses to enjoy a pleasure that has no annoying consequences,\n                    or one who avoids a pain that produces no resultant pleasure.\n                </td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"inapplicable\">\n        <table id=\"assert-2\" border=\"0\" cellpadding=\"5\" summary=\"this table is used to create 2 columns of text\">\n            <tr>\n                <td>Latin is a dead language.</td>\n                <td>The English language thrives.</td>\n            </tr>\n            <tr>\n                <td>\n                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n                    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n                    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n                    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat\n                    non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n                </td>\n                <td>\n                    But I must explain to you how all this mistaken idea of denouncing pleasure\n                    and praising pain was born and I will give you a complete account of the\n                    system, and expound the actual teachings of the great explorer of the truth,\n                    the master-builder of human happiness. No one rejects, dislikes, or avoids\n                    pleasure itself, because it is pleasure, but because those who do not know\n                    how to pursue pleasure rationally encounter consequences that are extremely\n                    painful. Nor again is there anyone who loves or pursues or desires to obtain\n                    pain of itself, because it is pain, but because occasionally circumstances\n                    occur in which toil and pain can procure him some great pleasure. To take\n                    a trivial example, which of us ever undertakes laborious physical exercise,\n                    except to obtain some advantage from it? But who has any right to find\n                    fault with a man who chooses to enjoy a pleasure that has no annoying consequences,\n                    or one who avoids a pain that produces no resultant pleasure.\n                </td>\n            </tr>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableLayoutDataShouldNotHaveTh/tableLayoutDataShouldNotHaveThSpec.js",
    "content": "describe('assessment: tableLayoutDataShouldNotHaveTh', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableLayoutDataShouldNotHaveTh/tableLayoutDataShouldNotHaveTh.html',\n        assessments: [\n          'tableLayoutDataShouldNotHaveTh'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableLayoutDataShouldNotHaveTh');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableLayoutDataShouldNotHaveTh.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tableLayoutDataShouldNotHaveTh.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('inapplicable');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableLayoutHasNoCaption/tableLayoutHasNoCaption.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>tableLayoutHasNoCaption</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <table id=\"assert-1\" border=\"0\" cellpadding=\"5\">\n      <caption>Latin And English Text</caption>\n      <tr>\n        <td>\n          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n          tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n          quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n          consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n          cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat\n          non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n        </td>\n        <td>\n          But I must explain to you how all this mistaken idea of denouncing pleasure\n          and praising pain was born and I will give you a complete account of the\n          system, and expound the actual teachings of the great explorer of the truth,\n          the master-builder of human happiness. No one rejects, dislikes, or avoids\n          pleasure itself, because it is pleasure, but because those who do not know\n          how to pursue pleasure rationally encounter consequences that are extremely\n          painful. Nor again is there anyone who loves or pursues or desires to obtain\n          pain of itself, because it is pain, but because occasionally circumstances\n          occur in which toil and pain can procure him some great pleasure. To take\n          a trivial example, which of us ever undertakes laborious physical exercise,\n          except to obtain some advantage from it? But who has any right to find\n          fault with a man who chooses to enjoy a pleasure that has no annoying consequences,\n          or one who avoids a pain that produces no resultant pleasure.\n        </td>\n      </tr>\n    </table>\n  </div>\n\n  <div data-expected=\"inapplicable\">\n    <table id=\"assert-2\" border=\"0\" cellpadding=\"5\">\n      <tr>\n        <td>\n          Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n          tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n          quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n          consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n          cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat\n          non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n        </td>\n        <td>\n          But I must explain to you how all this mistaken idea of denouncing pleasure\n          and praising pain was born and I will give you a complete account of the\n          system, and expound the actual teachings of the great explorer of the truth,\n          the master-builder of human happiness. No one rejects, dislikes, or avoids\n          pleasure itself, because it is pleasure, but because those who do not know\n          how to pursue pleasure rationally encounter consequences that are extremely\n          painful. Nor again is there anyone who loves or pursues or desires to obtain\n          pain of itself, because it is pain, but because occasionally circumstances\n          occur in which toil and pain can procure him some great pleasure. To take\n          a trivial example, which of us ever undertakes laborious physical exercise,\n          except to obtain some advantage from it? But who has any right to find\n          fault with a man who chooses to enjoy a pleasure that has no annoying consequences,\n          or one who avoids a pain that produces no resultant pleasure.\n        </td>\n      </tr>\n    </table>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableLayoutHasNoCaption/tableLayoutHasNoCaptionSpec.js",
    "content": "describe('assessment: tableLayoutHasNoCaption', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableLayoutHasNoCaption/tableLayoutHasNoCaption.html',\n        assessments: [\n          'tableLayoutHasNoCaption'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableLayoutHasNoCaption');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableLayoutHasNoCaption.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tableLayoutHasNoCaption.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('inapplicable');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableLayoutHasNoSummary/tableLayoutHasNoSummary.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableLayoutHasNoSummary</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <table id=\"assert-1\" border=\"0\" cellpadding=\"5\" summary=\"OMG table for layout\">\n            <tr>\n                <td>This would be a sidebar.</td>\n                <td>\n                    <table>\n                        <tr>\n                            <td>This is a content area given some border through a table.</td>\n                        </tr>\n                    </table>\n                </td>\n            </tr>\n            <tr>\n                <td>This is a footer.</td>\n            </tr>\n            <tr>\n                <td>This is another footer.</td>\n            </tr>\n        </table>\n    </div>\n    <div data-expected=\"fail\">\n\n        <table id=\"assert-2\" border=\"0\" cellpadding=\"5\" summary=\"OMG table for layout\">\n            <tr>\n                <td rowspan=\"3\">This would be a sidebar.</td>\n            </tr>\n            <tr>\n                <td></td>\n                <td>This is a footer.</td>\n            </tr>\n            <tr>\n                <td></td>\n                <td>This is another footer.</td>\n            </tr>\n        </table>\n    </div>\n    <div data-expected=\"fail\">\n\n        <table id=\"assert-3\" border=\"0\" cellpadding=\"5\" summary=\"this table is used to create 2 columns of text\">\n            <tr>\n                <td>\n                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n                    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n                    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n                    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat\n                    non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n                </td>\n                <td>\n                    But I must explain to you how all this mistaken idea of denouncing pleasure\n                    and praising pain was born and I will give you a complete account of the\n                    system, and expound the actual teachings of the great explorer of the truth,\n                    the master-builder of human happiness. No one rejects, dislikes, or avoids\n                    pleasure itself, because it is pleasure, but because those who do not know\n                    how to pursue pleasure rationally encounter consequences that are extremely\n                    painful. Nor again is there anyone who loves or pursues or desires to obtain\n                    pain of itself, because it is pain, but because occasionally circumstances\n                    occur in which toil and pain can procure him some great pleasure. To take\n                    a trivial example, which of us ever undertakes laborious physical exercise,\n                    except to obtain some advantage from it? But who has any right to find\n                    fault with a man who chooses to enjoy a pleasure that has no annoying consequences,\n                    or one who avoids a pain that produces no resultant pleasure.\n                </td>\n            </tr>\n        </table>\n    </div>\n    <div data-expected=\"pass\">\n\n        <table id=\"assert-4\" border=\"0\" cellpadding=\"5\" summary=\"\">\n            <tr>\n                <td>\n                    Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod\n                    tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,\n                    quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo\n                    consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse\n                    cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat\n                    non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n                </td>\n                <td>\n                    But I must explain to you how all this mistaken idea of denouncing pleasure\n                    and praising pain was born and I will give you a complete account of the\n                    system, and expound the actual teachings of the great explorer of the truth,\n                    the master-builder of human happiness. No one rejects, dislikes, or avoids\n                    pleasure itself, because it is pleasure, but because those who do not know\n                    how to pursue pleasure rationally encounter consequences that are extremely\n                    painful. Nor again is there anyone who loves or pursues or desires to obtain\n                    pain of itself, because it is pain, but because occasionally circumstances\n                    occur in which toil and pain can procure him some great pleasure. To take\n                    a trivial example, which of us ever undertakes laborious physical exercise,\n                    except to obtain some advantage from it? But who has any right to find\n                    fault with a man who chooses to enjoy a pleasure that has no annoying consequences,\n                    or one who avoids a pain that produces no resultant pleasure.\n                </td>\n            </tr>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableLayoutHasNoSummary/tableLayoutHasNoSummarySpec.js",
    "content": "describe('assessment: tableLayoutHasNoSummary', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableLayoutHasNoSummary/tableLayoutHasNoSummary.html',\n        assessments: [\n          'tableLayoutHasNoSummary'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableLayoutHasNoSummary');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableLayoutHasNoSummary.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tableLayoutHasNoSummary.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.tableLayoutHasNoSummary.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.tableLayoutHasNoSummary.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableLayoutMakesSenseLinearized/tableLayoutMakesSenseLinearized.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>tableLayoutMakesSenseLinearized</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <table id=\"assert-1\">\n      <tr>\n        <td>\n          <img src=\"assets/logo.png\" alt=\"XYZ mountaineering\" />\n        </td>\n        <td>top!</td>\n      </tr>\n      <tr>\n        <td colspan=\"2\">XYZ gets you to the</td>\n      </tr>\n    </table>\n  </div>\n\n  <div data-expected=\"fail\">\n    <table id=\"assert-2\">\n      <thead>\n        <tr>\n          <td>Header A</td>\n          <td>Header B</td>\n          <td>Header C</td>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td>This is a sentence</td>\n          <td>taht makes sense visually.</td>\n          <td rowspan=\"2\" valign=\"bottom\">that makes sense but is in the wrong row</td>\n        </tr>\n        <tr>\n          <td>This is another sentence</td>\n          <td>about another thing</td>\n        </tr>\n      </tbody>\n    </table>\n  </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableLayoutMakesSenseLinearized/tableLayoutMakesSenseLinearizedSpec.js",
    "content": "describe('assessment: tableLayoutMakesSenseLinearized', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableLayoutMakesSenseLinearized/tableLayoutMakesSenseLinearized.html',\n        assessments: [\n          'tableLayoutMakesSenseLinearized'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableLayoutMakesSenseLinearized');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableLayoutMakesSenseLinearized.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tableLayoutMakesSenseLinearized.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableNotUsedForLayout/tableNotUsedForLayout.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>tableNotUsedForLayout</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <table id=\"assert-1\">\n      <tr>\n        <td>This is the content area of my table</td>\n        <td>This is a sidebar</td>\n      </tr>\n    </table>\n  </div>\n\n  <div data-expected=\"fail\">\n    <table id=\"assert-2\" border=\"0\" cellpadding=\"5\" summary=\"Table being used for layout\">\n      <tr>\n        <td>This would be a sidebar.</td>\n        <td>\n          <table>\n            <tr>\n              <td>This is a content area given some border through a table.</td>\n            </tr>\n          </table>\n        </td>\n      </tr>\n      <tr>\n        <td>This is a footer.</td>\n      </tr>\n      <tr>\n        <td>This is another footer.</td>\n      </tr>\n    </table>\n  </div>\n\n  <div data-expected=\"pass\">\n    <table id=\"assert-3\">\n      <thead>\n        <tr>\n          <td>Head one</td>\n          <td>Head two</td>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td>Item One</td>\n          <td>Item two</td>\n        </tr>\n        <tr>\n          <td>Item One</td>\n          <td>Item two</td>\n        </tr>\n      </tbody>\n    </table>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableNotUsedForLayout/tableNotUsedForLayoutSpec.js",
    "content": "describe('assessment: tableNotUsedForLayout', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableNotUsedForLayout/tableNotUsedForLayout.html',\n        assessments: [\n          'tableNotUsedForLayout'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableNotUsedForLayout');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableNotUsedForLayout.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tableNotUsedForLayout.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.tableNotUsedForLayout.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableShouldUseHeaderIDs/tableShouldUseHeaderIDs.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableShouldUseHeaderIDs</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <table id=\"assert-1\">\n        <tr>\n          <th rowspan=\"2\">Homework</th>\n          <th colspan=\"3\">Exams</th>\n          <th colspan=\"3\">Projects</th>\n        </tr>\n        <tr>\n          <th id=\"e1\">1</th>\n          <th id=\"e2\">2</th>\n          <th id=\"ef\">Final</th>\n          <th id=\"p1\">1</th>\n          <th id=\"p2\">2</th>\n          <th id=\"pf\">Final</th>\n        </tr>\n        <tr>\n          <td>15%</td>\n          <td>15%</td>\n          <td>15%</td>\n          <td>20%</td>\n          <td>10%</td>\n          <td>10%</td>\n          <td>15%</td>\n        </tr>\n      </table>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableShouldUseHeaderIDs/tableShouldUseHeaderIDsSpec.js",
    "content": "describe('assessment: tableShouldUseHeaderIDs', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableShouldUseHeaderIDs/tableShouldUseHeaderIDs.html',\n        assessments: [\n          'tableShouldUseHeaderIDs'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableShouldUseHeaderIDs');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableShouldUseHeaderIDs.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableSummaryDoesNotDuplicateCaption/tableSummaryDoesNotDuplicateCaption.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>tableSummaryDoesNotDuplicateCaption</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <table id=\"assert-1\" border=\"1\" summary=\"cups of coffee consumed by each senator\">\n      <caption>Cups of coffee consumed by each senator</caption>\n      <tr>\n        <th>name</th>\n        <th>number of cups</th>\n        <th>type</th>\n        <th>with sugar</th>\n      </tr>\n      <tr>\n        <td>Adams, Willie</td>\n        <td>2</td>\n        <td>regular</td>\n        <td>sugar</td>\n      </tr>\n      <tr>\n        <td>Bacon, Lise</td>\n        <td>4</td>\n        <td>regular</td>\n        <td>no sugar</td>\n      </tr>\n      <tr>\n        <td>Chaput, Maria</td>\n        <td>1</td>\n        <td>decaf</td>\n        <td>sugar</td>\n      </tr>\n      <tr>\n        <td>Di Nino, Consiglio</td>\n        <td>0</td>\n        <td>not applicable</td>\n        <td>not applicable</td>\n      </tr>\n      <tr>\n        <td>Eggleton, Art</td>\n        <td>6</td>\n        <td>regular</td>\n        <td>no sugar</td>\n      </tr>\n    </table>\n  </div>\n\n  <div data-expected=\"pass\">\n    <table id=\"assert-2\" border=\"1\" summary=\"This table shows the number of cups of coffee consumed by each senator, the type of coffee (decaf or regular), and whether taken with sugar.\">\n      <caption>Cups of coffee consumed by each senator</caption>\n      <tr>\n        <th>name</th>\n        <th>number of cups</th>\n        <th>type</th>\n        <th>with sugar</th>\n      </tr>\n      <tr>\n        <td>Adams, Willie</td>\n        <td>2</td>\n        <td>regular</td>\n        <td>sugar</td>\n      </tr>\n      <tr>\n        <td>Bacon, Lise</td>\n        <td>4</td>\n        <td>regular</td>\n        <td>no sugar</td>\n      </tr>\n      <tr>\n        <td>Chaput, Maria</td>\n        <td>1</td>\n        <td>decaf</td>\n        <td>sugar</td>\n      </tr>\n      <tr>\n        <td>Di Nino, Consiglio</td>\n        <td>0</td>\n        <td>not applicable</td>\n        <td>not applicable</td>\n      </tr>\n      <tr>\n        <td>Eggleton, Art</td>\n        <td>6</td>\n        <td>regular</td>\n        <td>no sugar</td>\n      </tr>\n    </table>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableSummaryDoesNotDuplicateCaption/tableSummaryDoesNotDuplicateCaptionSpec.js",
    "content": "describe('assessment: tableSummaryDoesNotDuplicateCaption', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableSummaryDoesNotDuplicateCaption/tableSummaryDoesNotDuplicateCaption.html',\n        assessments: [\n          'tableSummaryDoesNotDuplicateCaption'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableSummaryDoesNotDuplicateCaption');\n  });\n\n  xit('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableSummaryDoesNotDuplicateCaption.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tableSummaryDoesNotDuplicateCaption.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableSummaryIsEmpty/tableSummaryIsEmpty.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableSummaryIsEmpty</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n        <table id=\"assert-1\" border=\"1\" summary=\"\">\n            <tr>\n                <th>name</th>\n                <th>number of cups</th>\n                <th>type</th>\n                <th>with sugar</th>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n\n    <div data-expected=\"pass\">\n        <table id=\"assert-2\" border=\"1\" summary=\"This table shows the number of cups of coffee consumed by each senator, the type of coffee (decaf or regular), and whether taken with sugar.\">\n            <tr>\n                <th>name</th>\n                <th>number of cups</th>\n                <th>type</th>\n                <th>with sugar</th>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableSummaryIsEmpty/tableSummaryIsEmptySpec.js",
    "content": "describe('assessment: tableSummaryIsEmpty', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableSummaryIsEmpty/tableSummaryIsEmpty.html',\n        assessments: [\n          'tableSummaryIsEmpty'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableSummaryIsEmpty');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableSummaryIsEmpty.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tableSummaryIsEmpty.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableSummaryIsNotTooLong/tableSummaryIsNotTooLong.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>tableSummaryIsNotTooLong</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <table id=\"assert-1\" border=\"1\" summary=\"This table shows the number of cups of coffee consumed by each senator, the type of coffee (decaf or regular), and whether taken with sugar.\">\n      <tr>\n        <th>name</th>\n        <th>number of cups</th>\n        <th>type</th>\n        <th>with sugar</th>\n      </tr>\n      <tr>\n        <td>Adams, Willie</td>\n        <td>2</td>\n        <td>regular</td>\n        <td>sugar</td>\n      </tr>\n      <tr>\n        <td>Bacon, Lise</td>\n        <td>4</td>\n        <td>regular</td>\n        <td>no sugar</td>\n      </tr>\n      <tr>\n        <td>Chaput, Maria</td>\n        <td>1</td>\n        <td>decaf</td>\n        <td>sugar</td>\n      </tr>\n      <tr>\n        <td>Di Nino, Consiglio</td>\n        <td>0</td>\n        <td>not applicable</td>\n        <td>not applicable</td>\n      </tr>\n      <tr>\n        <td>Eggleton, Art</td>\n        <td>6</td>\n        <td>regular</td>\n        <td>no sugar</td>\n      </tr>\n    </table>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableSummaryIsNotTooLong/tableSummaryIsNotTooLongSpec.js",
    "content": "describe('assessment: tableSummaryIsNotTooLong', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableSummaryIsNotTooLong/tableSummaryIsNotTooLong.html',\n        assessments: [\n          'tableSummaryIsNotTooLong'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableSummaryIsNotTooLong');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableSummaryIsNotTooLong.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUseColGroup/tableUseColGroup.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableUseColGroup</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <p>\n        From the WCAG 2.0 HTML techniques: \"Describe the use and benefits of column\n        structure elements. Much of this may be theoretical.\"\n      </p>\n      <table id=\"assert-1\" border=\"1\" summary=\"cups of coffee consumed by city politicians\">\n        <thead>\n          <tr>\n            <th>name</th>\n            <th>number of cups</th>\n            <th>type</th>\n            <th>with sugar</th>\n          </tr>\n        </thead>\n        <tbody>\n          <tr>\n            <td>Adams, Willie</td>\n            <td>2</td>\n            <td>regular</td>\n            <td>sugar</td>\n          </tr>\n          <tr>\n            <td>Bacon, Lise</td>\n            <td>4</td>\n            <td>regular</td>\n            <td>no sugar</td>\n          </tr>\n          <tr>\n            <td>Chaput, Maria</td>\n            <td>1</td>\n            <td>decaf</td>\n            <td>sugar</td>\n          </tr>\n          <tr>\n            <td>Di Nino, Consiglio</td>\n            <td>0</td>\n            <td>not applicable</td>\n            <td>not applicable</td>\n          </tr>\n          <tr>\n            <td>Eggleton, Art</td>\n            <td>6</td>\n            <td>regular</td>\n            <td>no sugar</td>\n          </tr>\n        </tbody>\n      </table>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUseColGroup/tableUseColGroupSpec.js",
    "content": "describe('assessment: tableUseColGroup', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableUseColGroup/tableUseColGroup.html',\n        assessments: [\n          'tableUseColGroup'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableUseColGroup');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableUseColGroup.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUsesAbbreviationForHeader/tableUsesAbbreviationForHeader.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableUsesAbbreviationForHeader</title>\n  </head>\n  <body>\n    <div data-expected=\"fail\">\n      <table border=\"1\" summary=\"This simple data table demonstrates the use of summary\" >\n        <caption>A Test Table</caption>\n        <tr>\n          <td></td>\n          <th id=\"assert-1\">Col. 1 header really long text</th>\n          <th>Col. 2 header really long text</th>\n        </tr>\n        <tr>\n          <th>Row 1 header</th>\n          <td>C1R1</td>\n          <td>C1R2</td>\n        </tr>\n        <tr>\n          <th>Row 2 header</th>\n          <td>C2R1</td>\n          <td>C2R2</td>\n        </tr>\n      </table>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUsesAbbreviationForHeader/tableUsesAbbreviationForHeaderSpec.js",
    "content": "describe('assessment: tableUsesAbbreviationForHeader', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableUsesAbbreviationForHeader/tableUsesAbbreviationForHeader.html',\n        assessments: [\n          'tableUsesAbbreviationForHeader'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableUsesAbbreviationForHeader');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableUsesAbbreviationForHeader.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUsesCaption/tableUsesCaption-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableUsesCaption</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUsesCaption/tableUsesCaption.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableUsesCaption</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <table id=\"assert-1\" border=\"1\">\n            <tr>\n                <th>name</th>\n                <th>number of cups</th>\n                <th>type</th>\n                <th>with sugar</th>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n    <div data-expected=\"pass\">\n\n        <table id=\"assert-2\" border=\"1\">\n            <caption>Coffee Consumed By Senators</caption>\n            <tr>\n                <th>name</th>\n                <th>number of cups</th>\n                <th>type</th>\n                <th>with sugar</th>\n            </tr>\n            <tr>\n                <td>Adams, Willie</td>\n                <td>2</td>\n                <td>regular</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Bacon, Lise</td>\n                <td>4</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n            <tr>\n                <td>Chaput, Maria</td>\n                <td>1</td>\n                <td>decaf</td>\n                <td>sugar</td>\n            </tr>\n            <tr>\n                <td>Di Nino, Consiglio</td>\n                <td>0</td>\n                <td>not applicable</td>\n                <td>not applicable</td>\n            </tr>\n            <tr>\n                <td>Eggleton, Art</td>\n                <td>6</td>\n                <td>regular</td>\n                <td>no sugar</td>\n            </tr>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUsesCaption/tableUsesCaptionSpec.js",
    "content": "describe('assessment: tableUsesCaption', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableUsesCaption/tableUsesCaption-nomatch.html',\n          assessments: [\n            'tableUsesCaption'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableUsesCaption.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableUsesCaption');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('inapplicable');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableUsesCaption/tableUsesCaption.html',\n          assessments: [\n            'tableUsesCaption'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableUsesCaption.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(2);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableUsesCaption');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('passed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUsesScopeForRow/tableUsesScopeForRow.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>tableUsesScopeForRow</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <table>\n      <thead>\n        <tr>\n          <th>Should be scoped</th>\n          <th>Item two</th>\n          <th>Item three</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td id=\"assert-1\" class=\"quail-failed-element\"><strong>Row one</strong></td>\n          <td>1</td>\n          <td>2</td>\n        </tr>\n        <tr>\n          <td class=\"quail-failed-element\"><strong>Row two</strong></td>\n          <td>1</td>\n          <td>2</td>\n        </tr>\n      </tbody>\n    </table>\n  </div>\n\n  <div data-expected=\"fail\">\n    <table>\n      <thead>\n        <tr>\n          <th>Should be scoped</th>\n          <th>Item two</th>\n          <th>Item three</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <td>1</td>\n          <td>2</td>\n          <td id=\"assert-2\" class=\"quail-failed-element\"><strong>Row one</strong></td>\n        </tr>\n        <tr>\n          <td>1</td>\n          <td>2</td>\n          <td class=\"quail-failed-element\"><strong>Row two</strong></td>\n        </tr>\n      </tbody>\n    </table>\n  </div>\n\n  <div data-expected=\"pass\">\n    <table>\n      <thead>\n        <tr>\n          <th>Should be scoped</th>\n          <th>Item two</th>\n          <th>Item three</th>\n        </tr>\n      </thead>\n      <tbody>\n        <tr>\n          <th scope=\"row\">\n            <strong>Row one</strong>\n          </th>\n          <td>1</td>\n          <td>2</td>\n        </tr>\n        <tr>\n          <th scope=\"row\">Row two</th>\n          <td>1</td>\n          <td>2</td>\n        </tr>\n      </tbody>\n    </table>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableUsesScopeForRow/tableUsesScopeForRowSpec.js",
    "content": "describe('assessment: tableUsesScopeForRow', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tableUsesScopeForRow/tableUsesScopeForRow.html',\n        assessments: [\n          'tableUsesScopeForRow'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tableUsesScopeForRow');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tableUsesScopeForRow.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.tableUsesScopeForRow.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableWithBothHeadersUseScope/tableWithBothHeadersUseScope-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>tableWithBothHeadersUseScope</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableWithBothHeadersUseScope/tableWithBothHeadersUseScope.html",
    "content": "<!doctype html>\n<html>\n<head>\n    <title>tableWithBothHeadersUseScope</title>\n</head>\n<body>\n    <div data-expected=\"fail\">\n\n        <table border=\"1\" class=\"quail-failed-element\">\n            <tr>\n                <th>Name</th>\n                <th>Birth</th>\n                <th>Gender</th>\n            </tr>\n            <tr>\n                <th>Clayton</th>\n                <td>2005-10-10</td>\n                <td>male</td>\n            </tr>\n            <tr>\n                <th>Carol</th>\n                <td>2005-10-11</td>\n                <td>female</td>\n            </tr>\n            <tr>\n                <th>Susan</th>\n                <td>2005-10-12</td>\n                <td>female</td>\n            </tr>\n            <tr>\n                <th>Oleg</th>\n                <td>2005-10-13</td>\n                <td>male</td>\n            </tr>\n            <tr>\n                <th>Belnar</th>\n                <td>2005-10-14</td>\n                <td>male</td>\n            </tr>\n            <tr></tr>\n        </table>\n    </div>\n    <div data-expected=\"pass\">\n\n        <table border=\"1\">\n            <tr>\n                <th scope=\"col\">Name</th>\n                <th scope=\"col\">Birth</th>\n                <th scope=\"col\">Gender</th>\n            </tr>\n            <tr>\n                <th scope=\"row\">Clayton</th>\n                <td>2005-10-10</td>\n                <td>male</td>\n            </tr>\n            <tr>\n                <th scope=\"row\">Carol</th>\n                <td>2005-10-11</td>\n                <td>female</td>\n            </tr>\n            <tr>\n                <th scope=\"row\">Susan</th>\n                <td>2005-10-12</td>\n                <td>female</td>\n            </tr>\n            <tr>\n                <th scope=\"row\">Oleg</th>\n                <td>2005-10-13</td>\n                <td>male</td>\n            </tr>\n            <tr>\n                <th scope=\"row\">Belnar</th>\n                <td>2005-10-14</td>\n                <td>male</td>\n            </tr>\n        </table>\n    </div>\n\n    </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tableWithBothHeadersUseScope/tableWithBothHeadersUseScopeSpec.js",
    "content": "xdescribe('assessment: tableWithBothHeadersUseScope', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableWithBothHeadersUseScope/tableWithBothHeadersUseScope-nomatch.html',\n          assessments: [\n            'tableWithBothHeadersUseScope'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableWithBothHeadersUseScope.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableWithBothHeadersUseScope');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/tableWithBothHeadersUseScope/tableWithBothHeadersUseScope.html',\n          assessments: [\n            'tableWithBothHeadersUseScope'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.tableWithBothHeadersUseScope.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('tableWithBothHeadersUseScope');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tabularDataIsInTable/tabularDataIsInTable.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>tabularDataIsInTable</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <p>\n      <pre id=\"assert-1\" class=\"quail-failed-element\">\nname\t\t\t\tnumber of cups\ttype   \t\twith sugar\nAdams, Willie\t\t2\t\t\t\tregular\t\tsugar\nBacon, Lise\t\t\t4\t\t\t\tregular\t\tno sugar\nChaput, Maria\t\t1\t\t\t\tdecaf\t\tsugar\nDi Nino, Consiglio\t0\t\t\t\tn/a\t\t\tn/a\nEggleton, Art\t\t6\t\t\t\tregular\t\tno sugar\n      </pre>\n    </p>\n  </div>\n\n  <div data-expected=\"pass\">\n    <table border=\"1\" summary=\"This table shows the number of cups of coffee consumed by each senator, the type of coffee (decaf or regular), and whether taken with sugar.\">\n      <tr>\n        <th>name</th>\n        <th>number of cups</th>\n        <th>type</th>\n        <th>with sugar</th>\n      </tr>\n      <tr>\n        <td>Adams, Willie</td>\n        <td>2</td>\n        <td>regular</td>\n        <td>sugar</td>\n      </tr>\n      <tr>\n        <td>Bacon, Lise</td>\n        <td>4</td>\n        <td>regular</td>\n        <td>no sugar</td>\n      </tr>\n      <tr>\n        <td>Chaput, Maria</td>\n        <td>1</td>\n        <td>decaf</td>\n        <td>sugar</td>\n      </tr>\n      <tr>\n        <td>Di Nino, Consiglio</td>\n        <td>0</td>\n        <td>not applicable</td>\n        <td>not applicable</td>\n      </tr>\n      <tr>\n        <td>Eggleton, Art</td>\n        <td>6</td>\n        <td>regular</td>\n        <td>no sugar</td>\n      </tr>\n    </table>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/tabularDataIsInTable/tabularDataIsInTableSpec.js",
    "content": "describe('assessment: tabularDataIsInTable', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/tabularDataIsInTable/tabularDataIsInTable.html',\n        assessments: [\n          'tabularDataIsInTable'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(1);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('tabularDataIsInTable');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.tabularDataIsInTable.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/textIsNotSmall/textIsNotSmall.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>textIsNotSmall</title>\n  <style>\n    #assert-2 {\n      font-size: 7px;\n    }\n  </style>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <p id=\"assert-1\" style=\"font-size: 7px;\">This text is fine.</p>\n  </div>\n\n  <div data-expected=\"fail\">\n    <p id=\"assert-2\">This text is too small.</p>\n  </div>\n\n  <div data-expected=\"pass\">\n    <p id=\"assert-3\">This text is fine.</p>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/textIsNotSmall/textIsNotSmallSpec.js",
    "content": "describe('assessment: textIsNotSmall', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/textIsNotSmall/textIsNotSmall.html',\n        assessments: [\n          'textIsNotSmall'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('textIsNotSmall');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.textIsNotSmall.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.textIsNotSmall.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.textIsNotSmall.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/textareaHasAssociatedLabel/textareaHasAssociatedLabel.html",
    "content": "<!doctype html>\n<html>\n<head>\n\t<title>textareaHasAssociatedLabel</title>\n</head>\n<body>\n\t<div data-expected=\"fail\">\n\t\t<form action=\"http://www.test.com/testing\" method=\"post\">\n\t\t\t<textarea title=\"comments\" name=\"nametext\" id=\"assert-1\" rows=\"5\" cols=\"40\"></textarea>\n\t\t</form>\n\t</div>\n\n\t<div data-expected=\"fail\">\n\t\t<form action=\"http://www.test.com/testing\" method=\"post\">\n\t\t\t<label>Comments:</label>\n\t\t\t<textarea name=\"nametext\" id=\"assert-2\" rows=\"5\" cols=\"40\"></textarea>\n\t\t</form>\n\t</div>\n\n\t<div data-expected=\"fail\">\n\t\t<form action=\"http://www.test.com/testing\" method=\"post\">\n\t\t\t<label>\n\t\t\t\tComments:\n\t\t\t\t<textarea id=\"assert-3\" name=\"nametext\" rows=\"5\" cols=\"40\"></textarea>\n\t\t\t</label>\n\t\t</form>\n\t</div>\n\n\t<div data-expected=\"pass\">\n\t\t<form action=\"http://www.test.com/testing\" method=\"post\">\n\t\t\t<label for=\"assert-4\">Comments:</label>\n\t\t\t<textarea name=\"nametext\" id=\"assert-4\" rows=\"5\" cols=\"40\"></textarea>\n\t\t</form>\n\t</div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/textareaHasAssociatedLabel/textareaHasAssociatedLabelSpec.js",
    "content": "describe('assessment: textareaHasAssociatedLabel', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/textareaHasAssociatedLabel/textareaHasAssociatedLabel.html',\n        assessments: [\n          'textareaHasAssociatedLabel'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(4);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('textareaHasAssociatedLabel');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.textareaHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.textareaHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.textareaHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.textareaHasAssociatedLabel.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/videoMayBePresent/videoMayBePresent.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>videoMayBePresent</title>\n  </head>\n  <body>\n    <div data-expected=\"cantTell\">\n      <video id=\"assert-1\" controls class=\"quail-failed-element\">\n        <source src=\"../assets/sample.ogv\" type=\"video/ogv\"/>\n      </video>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <iframe id=\"assert-2\" width=\"420\" height=\"315\"\n              src=\"http://www.youtube.com/embed/XGSy3_Czz8k\">\n      </iframe>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <iframe id=\"assert-3\" src=\"http://player.vimeo.com/video/107692527\" width=\"420\" height=\"315\"\n      frameborder=\"0\"></iframe>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <object id=\"assert-4\"></object>\n    </div>\n\n    <div data-expected=\"cantTell\">\n      <a id=\"assert-5\" href=\"horse.mov\">Horse.mov</a>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/videoMayBePresent/videoMayBePresentSpec.js",
    "content": "describe('assessment: videoMayBePresent', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/videoMayBePresent/videoMayBePresent.html',\n        assessments: [\n          'videoMayBePresent'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(5);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('videoMayBePresent');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.videoMayBePresent.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('cantTell');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.videoMayBePresent.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('cantTell');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.videoMayBePresent.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('cantTell');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.videoMayBePresent.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('cantTell');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.videoMayBePresent.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('cantTell');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/videoProvidesCaptions/videoProvidesCaptions-nomatch.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>videoProvidesCaptions</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/videoProvidesCaptions/videoProvidesCaptionsSpec.js",
    "content": "xdescribe('assessment: videoProvidesCaptions', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/videoProvidesCaptions/videoProvidesCaptions-nomatch.html',\n          assessments: [\n            'videoProvidesCaptions'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.videoProvidesCaptions.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('videoProvidesCaptions');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/videoProvidesCaptions/videoProvidesCaptions.html',\n          assessments: [\n            'videoProvidesCaptions'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.videoProvidesCaptions.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('videoProvidesCaptions');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/videosEmbeddedOrLinkedNeedCaptions/videosEmbeddedOrLinkedNeedCaptions.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>videosEmbeddedOrLinkedNeedCaptions</title>\n</head>\n<body lang=\"en\">\n  <div data-expected=\"fail\">\n    <p>\n      Hey, check\n      <a href=\"http://www.youtube.com/watch?v=V1HSNV9y25A\" class=\"quail-failed-element\">Out this awesome video.</a>\n    </p>\n  </div>\n  <div data-expected=\"fail\" title=\"No Subtitle\">\n    <video id=\"assert-1\" controls class=\"quail-failed-element\">\n      <source src=\"assets/sample.ogv\" type=\"video/ogv\"/>\n    </video>\n  </div>\n\n  <div class=\"quail-test limit-chrome\" data-expected=\"fail\" title=\"Subtitle file missing\">\n    <video id=\"assert-2\" controls class=\"quail-failed-element\">\n      <source src=\"assets/sample.ogv\" type=\"video/ogv\"/>\n      <track kind=\"subtitles\" src=\"assets/broken.srt\" srclang=\"en\"></track>\n    </video>\n  </div>\n\n  <div data-expected=\"fail\" title=\"Flash without caption plugin\">\n    <object id=\"assert-3\" class=\"quail-failed-element\" id=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" width=\"100%\" height=\"100%\" type=\"application/x-shockwave-flash\" data=\"/behaviour/flash/govvid-v2-mediaplayer.swf\" bgcolor=\"#000000\" name=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" tabindex=\"0\">\n      <param name=\"allowfullscreen\" value=\"true\">\n      <param name=\"allowscriptaccess\" value=\"always\">\n      <param name=\"seamlesstabbing\" value=\"true\">\n      <param name=\"wmode\" value=\"opaque\">\n      <param name=\"flashvars\" value=\"netstreambasepath=http%3A%2F%2Fwww.rijksoverheid.nl%2Fdocumenten-en-publicaties%2Fvideos%2F2014%2F01%2F24%2Fpersconferentie-na-ministerraad-24-januari-2014.html&id=movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf&className=govvid&file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Fflash%2FMP-240114-5081.flv&image=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Ffoto%2FMP-240114-5081.jpg&skin=%2Fbehaviour%2Fflash%2Fgovvid-v2-skin-video.zip&stretching=exactfit&audiodescription.file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Faudio%2FMP-240114-5081.mp3&audiodescription.state=false&audiodescription.pluginmode=FLASH&controlbar.position=bottom&playlist.position=none&dock=false\">\n    </object>\n  </div>\n\n  <div data-expected=\"fail\" title=\"Flash MP4 without caption plugin\">\n    <object id=\"assert-4\" class=\"quail-failed-element\" id=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" width=\"100%\" height=\"100%\" type=\"application/x-shockwave-flash\" data=\"/behaviour/flash/govvid-v2-mediaplayer.swf\" bgcolor=\"#000000\" name=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" tabindex=\"0\">\n      <param name=\"allowfullscreen\" value=\"true\">\n      <param name=\"allowscriptaccess\" value=\"always\">\n      <param name=\"seamlesstabbing\" value=\"true\">\n      <param name=\"wmode\" value=\"opaque\">\n      <param name=\"flashvars\" value=\"netstreambasepath=http%3A%2F%2Fwww.rijksoverheid.nl%2Fdocumenten-en-publicaties%2Fvideos%2F2014%2F01%2F24%2Fpersconferentie-na-ministerraad-24-januari-2014.html&id=movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf&className=govvid&file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Fflash%2FMP-240114-5081.mp4&image=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Ffoto%2FMP-240114-5081.jpg&skin=%2Fbehaviour%2Fflash%2Fgovvid-v2-skin-video.zip&stretching=exactfit&audiodescription.file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Faudio%2FMP-240114-5081.mp3&audiodescription.state=false&audiodescription.pluginmode=FLASH&controlbar.position=bottom&playlist.position=none&dock=false\">\n    </object>\n  </div>\n\n  <div data-expected=\"pass\" title=\"Flash with caption plugin\">\n    <object id=\"assert-5\" id=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" width=\"100%\" height=\"100%\" type=\"application/x-shockwave-flash\" data=\"/behaviour/flash/govvid-v2-mediaplayer.swf\" bgcolor=\"#000000\" name=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" tabindex=\"0\">\n      <param name=\"allowfullscreen\" value=\"true\">\n      <param name=\"allowscriptaccess\" value=\"always\">\n      <param name=\"seamlesstabbing\" value=\"true\">\n      <param name=\"wmode\" value=\"opaque\">\n      <param name=\"flashvars\" value=\"netstreambasepath=http%3A%2F%2Fwww.rijksoverheid.nl%2Fdocumenten-en-publicaties%2Fvideos%2F2014%2F01%2F24%2Fpersconferentie-na-ministerraad-24-januari-2014.html&id=movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf&className=govvid&file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Fflash%2FMP-240114-5081.flv&image=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Ffoto%2FMP-240114-5081.jpg&skin=%2Fbehaviour%2Fflash%2Fgovvid-v2-skin-video.zip&stretching=exactfit&plugins=http%3A%2F%2Fwww.rijksoverheid.nl%2Fbehaviour%2Fflash%2Fcaptions.swf%2Chttp%3A%2F%2Fwww.rijksoverheid.nl%2Fbehaviour%2Fflash%2Faudiodescription.swf&captions.file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Fondertiteling%2FMP-240114-5081.srt&captions.state=false&captions.fontsize=16&captions.pluginmode=FLASH&audiodescription.file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Faudio%2FMP-240114-5081.mp3&audiodescription.state=false&audiodescription.pluginmode=FLASH&controlbar.position=bottom&playlist.position=none&dock=false\">\n    </object>\n  </div>\n\n  <div data-expected=\"fail\" lang=\"fr\" title=\"Subtitle not matching language\">\n    <video id=\"assert-6\" controls class=\"quail-failed-element\">\n      <source src=\"assets/sample.ogv\" type=\"video/ogv\"/>\n      <track kind=\"subtitles\" src=\"assets/subtitle.srt\" srclang=\"en\"></track>\n    </video>\n  </div>\n\n  <div class=\"quail-test limit-chrome\" data-expected=\"pass\" title=\"Object with no subtitles\">\n    <object id=\"assert-7\" id=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" width=\"100%\" height=\"100%\" type=\"application/x-shockwave-flash\" data=\"/behaviour/flash/govvid-v2-mediaplayer.swf\" bgcolor=\"#000000\" name=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" tabindex=\"0\" class=\"quail-failed-element\">\n    <param name=\"allowfullscreen\" value=\"true\">\n    <param name=\"allowscriptaccess\" value=\"always\">\n    <param name=\"seamlesstabbing\" value=\"true\">\n    <param name=\"wmode\" value=\"opaque\">\n    <param name=\"flashvars\" value=\"netstreambasepath=http%3A%2F%2Fwww.rijksoverheid.nl%2Fdocumenten-en-publicaties%2Fvideos%2F2014%2F01%2F24%2Fpersconferentie-na-ministerraad-24-januari-2014.html&id=movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf&className=govvid&file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Fflash%2FMP-240114-5081.flv&image=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Ffoto%2FMP-240114-5081.jpg&skin=%2Fbehaviour%2Fflash%2Fgovvid-v2-skin-video.zip&stretching=exactfit&plugins=http%3A%2F%2Fwww.rijksoverheid.nl%2Fbehaviour%2Fflash%2Fcaptions.swf%2Chttp%3A%2F%2Fwww.rijksoverheid.nl%2Fbehaviour%2Fflash%2Faudiodescription.swf&captions.state=false&captions.fontsize=16&captions.pluginmode=FLASH&audiodescription.file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Faudio%2FMP-240114-5081.mp3&audiodescription.state=false&audiodescription.pluginmode=FLASH&controlbar.position=bottom&playlist.position=none&dock=false\">\n    </object>\n  </div>\n\n  <div data-expected=\"pass\">\n    <p>\n      Hey, check\n      <a href=\"http://youtube.com/watch?v=zJOS0sV2a24\">Out this awesome video.</a>\n    </p>\n    <p>\n      There's also\n      <a href=\"http://youtube.com/help\">another link to throw you off.</a>\n    </p>\n\n  </div>\n\n  <div class=\"quail-test limit-chrome\" data-expected=\"pass\" title=\"Video tag has correct subtitle\">\n    <video id=\"assert-8\" controls>\n      <source src=\"assets/sample.ogv\" type=\"video/ogv\"/>\n      <track kind=\"subtitles\" src=\"assets/subtitle.srt\" srclang=\"en\"></track>\n    </video>\n  </div>\n\n  <div class=\"quail-test limit-chrome\" data-expected=\"pass\" title=\"Object with subtitles\">\n    <object id=\"assert-9\" id=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" width=\"100%\" height=\"100%\" type=\"application/x-shockwave-flash\" data=\"/behaviour/flash/govvid-v2-mediaplayer.swf\" bgcolor=\"#000000\" name=\"movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf\" tabindex=\"0\">\n    <param name=\"allowfullscreen\" value=\"true\">\n    <param name=\"allowscriptaccess\" value=\"always\">\n    <param name=\"seamlesstabbing\" value=\"true\">\n    <param name=\"wmode\" value=\"opaque\">\n    <param name=\"flashvars\" value=\"netstreambasepath=http%3A%2F%2Fwww.rijksoverheid.nl%2Fdocumenten-en-publicaties%2Fvideos%2F2014%2F01%2F24%2Fpersconferentie-na-ministerraad-24-januari-2014.html&id=movie-contentblock-0120192e-2452-4d96-9ba7-8a004d1415bf&className=govvid&file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Fflash%2FMP-240114-5081.flv&image=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Ffoto%2FMP-240114-5081.jpg&skin=%2Fbehaviour%2Fflash%2Fgovvid-v2-skin-video.zip&stretching=exactfit&plugins=http%3A%2F%2Fwww.rijksoverheid.nl%2Fbehaviour%2Fflash%2Fcaptions.swf%2Chttp%3A%2F%2Fwww.rijksoverheid.nl%2Fbehaviour%2Fflash%2Faudiodescription.swf&captions.file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Fondertiteling%2FMP-240114-5081.srt&captions.state=false&captions.fontsize=16&captions.pluginmode=FLASH&audiodescription.file=http%3A%2F%2Fserver.rijksoverheidsvideo.nl%2Faudio%2FMP-240114-5081.mp3&audiodescription.state=false&audiodescription.pluginmode=FLASH&controlbar.position=bottom&playlist.position=none&dock=false\">\n    </object>\n  </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/videosEmbeddedOrLinkedNeedCaptions/videosEmbeddedOrLinkedNeedCaptionsSpec.js",
    "content": "describe('assessment: videosEmbeddedOrLinkedNeedCaptions', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/videosEmbeddedOrLinkedNeedCaptions/videosEmbeddedOrLinkedNeedCaptions.html',\n        assessments: [\n          'videosEmbeddedOrLinkedNeedCaptions'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(9);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('videosEmbeddedOrLinkedNeedCaptions');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-4', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-5', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-5').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-6', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-7', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-7').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-8', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-9', function () {\n    cases = quailResults.tests.videosEmbeddedOrLinkedNeedCaptions.cases;\n    expect(cases).quailGetById('assert-9').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/whiteSpaceInWord/whiteSpaceInWord.html",
    "content": "<!doctype html>\n<html>\n<head>\n  <title>whiteSpaceInWord</title>\n</head>\n<body>\n  <div data-expected=\"fail\">\n    <h4 id=\"assert-1\">H E L L O T H E R E</h4>\n  </div>\n\n  <div data-expected=\"fail\">\n    <h4 id=\"assert-2\">H&nbsp;E&nbsp;L&nbsp;L&nbsp;O T&nbsp;H&nbsp;E&nbsp;R&nbsp;E</h4>\n  </div>\n\n  <div data-expected=\"pass\">\n    <h4 id=\"assert-3\">Hello there</h4>\n  </div>\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/specs/whiteSpaceInWord/whiteSpaceInWordSpec.js",
    "content": "describe('assessment: whiteSpaceInWord', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/whiteSpaceInWord/whiteSpaceInWord.html',\n        assessments: [\n          'whiteSpaceInWord'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(3);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('whiteSpaceInWord');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.whiteSpaceInWord.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.whiteSpaceInWord.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n  it('should return the proper assessment for assert-3', function () {\n    cases = quailResults.tests.whiteSpaceInWord.cases;\n    expect(cases).quailGetById('assert-3').to.have.quailStatus('passed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/whiteSpaceNotUsedForFormatting/whiteSpaceNotUsedForFormattingSpec.js",
    "content": "xdescribe('assessment: whiteSpaceNotUsedForFormatting', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/whiteSpaceNotUsedForFormatting/whiteSpaceNotUsedForFormatting.html',\n        assessments: [\n          'whiteSpaceNotUsedForFormatting'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct number of tests', function () {\n    expect(quailResults.stats.tests).to.equal(1);\n  });\n  it('should return the correct number of cases', function () {\n    expect(quailResults.stats.cases).to.equal(2);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('whiteSpaceNotUsedForFormatting');\n  });\n\n  it('should return the proper assessment for assert-1', function () {\n    cases = quailResults.tests.whiteSpaceNotUsedForFormatting.cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n  });\n  it('should return the proper assessment for assert-2', function () {\n    cases = quailResults.tests.whiteSpaceNotUsedForFormatting.cases;\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/specs/whiteSpaceNotUsedForFormatting/whitespaceNotUsedForFormatting.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>whitespaceNotUsedForFormatting</title>\n  </head>\n  <body>\n    <div data-expected=\"pass\">\n      <p id=\"assert-1\">This is a paragraph that is just a normal text element.</p>\n    </div>\n\n    <div data-expected=\"fail\">\n      <p id=\"assert-2\">Item &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Price<br/>\n         A &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $4<br/>\n         B &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $30<br/>\n         C &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $.34\n       </p>\n    </div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/templates/assessmentHtmlTemplate.html",
    "content": "<!DOCTYPE html>\n<html>\n  <head>\n    <title>{{assessmentName}}</title>\n    <style>\n    </style>\n  </head>\n  <body>\n    <div id=\"assert-1\"></div>\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/templates/assessmentTestTemplate.js",
    "content": "describe('assessment: {{assessmentName}}', function () {\n  var client, assessments, quailResults;\n\n  // Evaluate the test page with Quail.\n  before('load webdrivers and run evaluations with Quail', function () {\n    return quailTestRunner.setup({\n        url: 'http://localhost:9999/{{assessmentName}}/{{assessmentName}}.html',\n        assessments: [\n          '{{assessmentName}}'\n        ]\n      })\n      .spread(function (_client_, _assessments_, _quailResults_) {\n        client = _client_;\n        assessments = _assessments_;\n        quailResults = _quailResults_;\n      });\n  });\n\n  after('end the webdriver session', function () {\n    return quailTestRunner.teardown(client);\n  });\n\n  it('should return the correct stats', function () {\n    expect(quailResults.stats.tests).to.equal(0);\n    expect(quailResults.stats.cases).to.equal(0);\n  });\n\n  it('should have correct key under the test results', function () {\n    expect(quailResults.tests).to.include.keys('{{assessmentName}}');\n  });\n\n  it('should return the proper assessment for the test', function () {\n    var cases = quailResults.tests['{{assessmentName}}'].cases;\n    expect(cases).quailGetById('assert-1').to.have.quailStatus('passed');\n    expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/templates/componentTemplate.js",
    "content": "/**\n * A wrapper for assessments that call a component to determine\n * the test outcome.\n */\nquail.%name% = function (quail, test, Case) {\n  var options = {\n    %options%\n  };\n  quail.components.%component%(quail, test, Case, options);\n};\n"
  },
  {
    "path": "test/assessmentSpecs/templates/htmlTemplate.html",
    "content": "<!doctype html>\n<html>\n  <head>\n    <title>%name%</title>\n  </head>\n  <body>\n\n\n\n  </body>\n</html>\n"
  },
  {
    "path": "test/assessmentSpecs/templates/selectorTemplate.js",
    "content": "/**\n * A simple test case that determines if elements, specified by a selector,\n * exist or not.\n *\n * The test fails for elements that are found and a case is created for each\n * one. The test passes is the selector finds no matching elements.\n */\nquail.%name% = function (quail, test, Case, options) {\n\n  var selector = '%selector%';\n\n  this.get('$scope').each(function () {\n    var candidates = DOM.scry(selector, this);\n    if (!candidates.length) {\n      test.add(quail.lib.Case({\n        element: undefined,\n        status: (options.test ? 'inapplicable' : 'passed')\n      }));\n    }\n    else {\n      candidates.each(function () {\n        var status;\n\n        // If a test is defined, then use it\n        if (options.test && !$(this).is(options.test)) {\n          status = 'passed';\n        }\n        else {\n          status = 'failed';\n        }\n\n        test.add(quail.lib.Case({\n          element: this,\n          status: status\n        }));\n      });\n    }\n  });\n};\n"
  },
  {
    "path": "test/assessmentSpecs/templates/specTemplate.js",
    "content": "describe('assessment: %name%', function () {\n  var client, assessments, quailResults, cases;\n\n  // Evaluate the test page with Quail.\n  describe('the non-match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/%name%/%name%-nomatch.html',\n          assessments: [\n            '%name%'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.%name%.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(1);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('%name%');\n    });\n\n    it('should return the proper assessment for the test', function () {\n      expect(cases[0]).to.have.quailStatus('passed');\n    });\n  });\n\n  // Evaluate the test page with Quail.\n  describe('the match case', function () {\n    before('load webdrivers and run evaluations with Quail', function () {\n      return quailTestRunner.setup({\n          url: 'http://localhost:9999/%name%/%name%.html',\n          assessments: [\n            '%name%'\n          ]\n        })\n        .spread(function (_client_, _assessments_, _quailResults_) {\n          client = _client_;\n          assessments = _assessments_;\n          quailResults = _quailResults_;\n          cases = quailResults.tests.%name%.cases;\n        });\n    });\n\n    after('end the webdriver session', function () {\n      return quailTestRunner.teardown(client);\n    });\n\n    it('should return the correct number of tests', function () {\n      expect(quailResults.stats.tests).to.equal(1);\n    });\n    it('should return the correct number of cases', function () {\n      expect(quailResults.stats.cases).to.equal(0);\n    });\n\n    it('should have correct key under the test results', function () {\n      expect(quailResults.tests).to.include.keys('%name%');\n    });\n\n    it('should return the proper assessment for assert-1', function () {\n      expect(cases).quailGetById('assert-1').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-2', function () {\n      expect(cases).quailGetById('assert-2').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-3', function () {\n      expect(cases).quailGetById('assert-3').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-4', function () {\n      expect(cases).quailGetById('assert-4').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-5', function () {\n      expect(cases).quailGetById('assert-5').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-6', function () {\n      expect(cases).quailGetById('assert-6').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-7', function () {\n      expect(cases).quailGetById('assert-7').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-8', function () {\n      expect(cases).quailGetById('assert-8').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-9', function () {\n      expect(cases).quailGetById('assert-9').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-10', function () {\n      expect(cases).quailGetById('assert-10').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-11', function () {\n      expect(cases).quailGetById('assert-11').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-12', function () {\n      expect(cases).quailGetById('assert-12').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-13', function () {\n      expect(cases).quailGetById('assert-13').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-14', function () {\n      expect(cases).quailGetById('assert-14').to.have.quailStatus('failed');\n    });\n    it('should return the proper assessment for assert-15', function () {\n      expect(cases).quailGetById('assert-15').to.have.quailStatus('failed');\n    });\n  });\n});\n"
  },
  {
    "path": "test/assessmentSpecs/testRunner.js",
    "content": "#!/usr/bin/env node\n\n'use strict';\n\nvar stdio = require('stdio');\nvar fs = require('fs');\nvar http = require('http');\nvar httpServer = require('http-server');\nvar path = require('path');\nvar glob = require('glob');\nvar Q = require('q'); // https://github.com/kriskowal/q\nvar webdriverio = require('webdriverio');\nvar cwd = process.cwd();\n\nvar conf = require('../config/index.js');\n\nvar Mocha = require('mocha');\nvar chai = require('chai');\nvar chaiAsPromised = require('chai-as-promised');\nchai.use(chaiAsPromised);\nvar chaiQuail = require(\n  path.join(cwd, 'node_modules', '@quailjs/quail-core/lib/asserters/chai-quail')\n);\nchai.use(chaiQuail);\nvar seleniumOut;\nvar seleniumError;\n\nglobal.expect = chai.expect;\nglobal.assert = chai.assert;\n\n// HTTP server for testing fixtures like jQuery and Quail.\nvar httpServerFixturesPort = 8888;\nvar httpServerAssessmentPagesPort = 9999;\n\nvar mochaRunner;\nvar _client;\nvar httpServerFixtures;\nvar httpServerAssessmentPages;\n\n// Set up test command execution arguments.\nvar execOptions = stdio.getopt({\n  assessment: {\n    key: 'I',\n    args: 1,\n    description: 'A single assessment to run.'\n  }\n});\n\nQ.getUnhandledReasons(function (err) {\n  console.error('Caught unhandled reason: ' + err);\n});\n\n/**\n * Closes the HTTP servers and exits the process.\n */\nfunction shutdownTestRunner (err) {\n  console.log('Shutting down the testrunner');\n  if (httpServerFixtures) {\n    httpServerFixtures.close();\n  }\n  if (httpServerAssessmentPages) {\n    httpServerAssessmentPages.close();\n  }\n  if (_client && _client.end) {\n    _client.end();\n  }\n  seleniumOut && fs.closeSync(seleniumOut);\n  seleniumError && fs.closeSync(seleniumError);\n\n  if (err) {\n    console.error(err);\n    return process.exit(1);\n  }\n  return process.exit(0);\n}\n\nprocess.on('SIGINT', function () {\n  shutdownTestRunner('Received SIGINT');\n});\n\nprocess.on('uncaughtException', function (err) {\n  console.error('uncaughtException');\n  if (err.code === 'EADDRINUSE') {\n    console.error('Oops!');\n    console.error('Check ports ' + httpServerFixturesPort + ' and ' + httpServerAssessmentPagesPort + ' for running processes.');\n    console.error('You can check for a process associated with a port like this: `lsof -i :' + httpServerFixturesPort + '`');\n    console.error('Get the PID associated with the process, then stop it with this command: `kill -9 <pid>`, where <pid> is the process number.\\n');\n  }\n  else {\n    console.error(err);\n  }\n  shutdownTestRunner(1);\n});\n\n// The root path of the HTTP fixtures server.\nvar assessmentPagesRoot = path.join(__dirname, 'specs');\nvar logPath = path.join(__dirname, '../..', 'logs');\n\n/**\n * Load Quail.\n */\nfunction serveScriptResource (response, resourcePath) {\n  var resource;\n\n  if (resourcePath.indexOf('bundle.js') > -1) {\n    resource = path.join(__dirname, '../..', 'dist', resourcePath);\n  }\n  else {\n    resource = resourcePath;\n  }\n\n  fs.readFile(resource, 'utf-8', function (err, source) {\n    if (err) {\n      response.writeHead(404, {'Content-Type': 'text/html'});\n      response.end('<!DOCTYPE html>\\n<html><body><p>The resource at `' + resource + '` does not exist.</p></body></html>');\n    }\n    else {\n      response.writeHead(200, {'Content-Type': 'application/javascript'});\n      response.end(source);\n    }\n  });\n}\n\n// Build a lightweight http server to serve assets for running Quail.\n// Using http instead of httpServer gives us more opportunity to debug requests.\nhttpServerFixtures = http.createServer(function (request, response) {\n  var url = request.url;\n  if (url.indexOf('.js') > -1 || url.indexOf('.map') > -1) {\n    serveScriptResource(response, url);\n  }\n  // 406\n  else {\n    response.writeHead(406, {'Content-Type': 'text/html'});\n    response.end('<!DOCTYPE html>\\n<html><body><p>The requested resource is only capable of generating content not acceptable according to the Accept headers sent in the request.</p></body></html>');\n  }\n})\n.listen(httpServerFixturesPort);\n\n// HTTP server for assessment pages.\nhttpServerAssessmentPages = httpServer\n  .createServer({\n    root: assessmentPagesRoot,\n    headers: {\n      'Access-Control-Allow-Origin': '*'\n    }\n  })\n  .listen(httpServerAssessmentPagesPort);\n\nfunction startSelenium (callback) {\n  // The local Selenium server.\n  if (!process.env.TRAVIS) {\n    var selenium = require('selenium-standalone');\n    // Set up logging for the Selenium server child process.\n    seleniumOut = fs.openSync(logPath + '/selenium-stdout.log', 'a');\n    seleniumError = fs.openSync(logPath + '/selenium-stderr.log', 'a');\n    var spawnOptions = {\n      stdio: ['pipe', seleniumError, seleniumOut]\n    };\n\n    // Options to pass to `java -jar selenium-server-standalone-X.XX.X.jar`\n    var seleniumArgs = [\n      // '-logLongForm'\n    ];\n\n    var opts = {\n      spawnOptions: spawnOptions,\n      seleniumArgs: seleniumArgs\n    };\n\n    selenium.start(opts, function (err) {\n      if (err) {\n        if (/Error: Missing/.test(err)) {\n          // Try to install selenium.\n          console.warn(\n            'Encountered a missing driver error.',\n            'Run `npm run install-selenium-standalone` to install the missing drivers.',\n            err\n          );\n          shutdownTestRunner(err);\n        }\n        else if (/Selenium process is already running/.test(err)) {\n          callback();\n        }\n        else {\n          shutdownTestRunner(err);\n        }\n      }\n      else {\n        callback();\n      }\n    });\n  }\n  else {\n    callback();\n  }\n}\n\n/**\n * Sets up and runs the Specs.\n */\nfunction runSpecs () {\n  // Methods available in the Spec runner (e.g. Mocha).\n  // @todo Provide these methods through exports and move them into their\n  // own file.\n  global.quailTestRunner = {\n    /**\n     * The setup process involves:\n     * 1. Initiating a webdriver client for the test suite\n     * 2. Preparing the list of assessments\n     * 3. Loading loading the indicated URL in a Selenium browser instance.\n     *   a. jQuery\n     *   b. Quail\n     * 4. Evaluating the page with Quail and returning the results object.\n     *   a. The evaluation of the page either resolves or rejects the promise\n     *      object returned to the testing suite by the setup method.\n     */\n    setup: function (options) {\n      var url = options.url;\n      var indicatedAssessments = options.assessments;\n\n      var clientPromise;\n      var quailDeferred;\n      var assessmentsDeferred;\n\n      /**\n       * Retrieves a webdriver client.\n       */\n      function retrieveWebdriver (resolve, reject) {\n        startSelenium(function () {\n          webdriverio\n            .remote(conf)\n            .init()\n            .timeoutsAsyncScript(5000)\n            .then(function () {\n              // The reference to this.__proto__ is very intentional. It\n              // is the only way to maintain a reference to the client\n              // through the test runner execution. If `this` is refenced,\n              // the referenced object is (presumably) garbage collected\n              // and it disappears.\n              var client = this.__proto__;\n              _client = client;\n              resolve(client);\n            }, function (err) {\n              reject(err);\n            });\n        });\n      }\n\n      /**\n       * Prepares the list of assessments.\n       */\n      function prepareAssessmentList (client) {\n        return Q.Promise(function (resolve, reject) {\n          var assessmentsToRun = [];\n          indicatedAssessments.forEach(function (name) {\n            assessmentsToRun.push(name);\n          });\n          if (Object.keys(assessmentsToRun).length > 0) {\n            assessmentsDeferred.resolve(assessmentsToRun);\n            resolve({\n              client: client,\n              assessments: indicatedAssessments\n            });\n          }\n          else {\n            reject(new Error('No assessments to evaluate'));\n            assessmentsDeferred.reject();\n          }\n        });\n      }\n\n      /**\n       * Loads a file using a <script> tag.\n       *\n       * This function is run in the browser context.\n       */\n      function loadScriptFile (filename, httpServerFixturesPort, finish) {\n        function loadError (error) {\n          finish(new Error({\n            message: error\n          }));\n        }\n\n        function loadSuccess () {\n          finish('Loaded \\'' + filename + '\\'');\n        }\n\n        var head = document.getElementsByTagName('head')[0];\n        // Append scripts.\n        var s = document.createElement('script');\n        s.type = 'text/javascript';\n        s.src = 'http://localhost:' + httpServerFixturesPort + '/' + filename;\n        s.onerror = loadError;\n        s.onload = loadSuccess;\n        if (head) {\n          head.appendChild(s);\n        }\n      }\n\n      /**\n       * Evaluates a page using Quail, which has been loading into the page already.\n       *\n       * This function is run in the browser context.\n       */\n      function evaluateWithQuail (tests, finish) {\n        // Basic output structure attributes.\n        var output = {\n          tests: {},\n          successCriteria: {},\n          stats: {\n            tests: 0,\n            cases: 0\n          }\n        };\n\n        window.globalQuail.run({\n          assessments: tests,\n          // Called when an individual Case in a test is resolved.\n          caseResolve: function (eventName, test, _case) {\n            var name = test.get('name');\n            if (!output.tests[name]) {\n              output.tests[name] = {\n                id: name,\n                title: test.get('title'),\n                description: test.get('description'),\n                type: test.get('type'),\n                testability: test.get('testability'),\n                guidelines: test.get('guidelines') || {},\n                tags: test.get('tags'),\n                cases: []\n              };\n            }\n            // Push the case into the results for this test.\n            output.tests[name].cases.push({\n              status: _case.get('status'),\n              selector: _case.get('selector'),\n              html: _case.get('html')\n            });\n            // Increment the cases count.\n            output.stats.cases++;\n          },\n          // Called when all the Cases in a Test are resolved.\n          testComplete: function () {\n            // Increment the tests count.\n            output.stats.tests++;\n          },\n          // Called when all the Tests in a TestCollection are completed.\n          testCollectionComplete: function () {\n            // Push the results of the test out to the Phantom listener.\n            finish(JSON.stringify(output));\n          }\n        });\n      }\n\n      /**\n       * Assigns the responds of a Quail evaluation to the test suite object.\n       */\n      function respondToQuailEvaluation (ret) {\n        return ret && ret.value && JSON.parse(ret.value) || {};\n      }\n\n      /**\n       * Inject Quail assets and runs the assessments against the provided\n       * webdriver client.\n       */\n      function communicateWithSelenium (assets) {\n        var client = assets.client;\n\n        // Load Quail fixtures into the page.\n        var fixtures = [\n          // Load the Quail script into the page.\n          {\n            args: ['bundle.js', httpServerFixturesPort],\n            evaluate: loadScriptFile\n          },\n          // Evaluate the HTML with Quail.\n          {\n            args: [assets.assessments],\n            evaluate: evaluateWithQuail,\n            respond: respondToQuailEvaluation\n          }\n        ];\n\n        /**\n         * Loads fixtures in a linked list so that asynchronous script evalus are run\n         * sequentially. Later fixtures in the fixture array can depend on results from\n         * any previous fixture. Maybe it would be better to do this with promises?\n         */\n        function loadFixture (fixture, index) {\n          /**\n           * Wraps the configured resolution script in order to kick off the next\n           * fixture evaluation.\n           *\n           * @param Object err\n           *   A WebdriverIO error object.\n           * @param Object ret\n           *   The result of the evalution of the script in the Selenium browser\n           *   context.\n           */\n          function resolveFixture (result) {\n            var data;\n            var resondFn = fixture.respond;\n            // Prepare the next fixture.\n            index = index + 1;\n            fixture = fixtures[index];\n            // Run the response method if it exists.\n            if (typeof resondFn === 'function') {\n              data = resondFn(result);\n            }\n            // Run the next fixture if there is one and no error was returned from\n            // the response method.\n            if (fixture && !data) {\n              loadFixture.apply(client, [fixture, index]);\n            }\n            // Or return control to the test suite. Mocha complains if done() is\n            // invoked with anything that isn't an Error object.\n            else {\n              quailDeferred.resolve(data);\n            }\n          }\n          // Combine the evaluation script, any arguments and the wrapped resolve\n          // function into an arguments array that will be passed to Selenium's\n          // executeAsync method.\n          var args = [].concat(fixture.evaluate, (fixture.args || []));\n          // Run the async evaluation against the client object.\n          client.executeAsync.apply(client, args)\n            .then(\n              resolveFixture,\n              function (err) {\n                console.error(err.message);\n                client.end();\n                quailDeferred.reject(err);\n              }\n            );\n        }\n        // Prepare to start the fixture loading.\n        var loadFixtureBound = loadFixture.bind(client, fixtures[0], 0);\n        // Load the requested URL then start the fixture loading.\n        client.url(url, loadFixtureBound);\n      }\n\n      // Set up the promises that will be returned to the Mocha before function.\n      clientPromise = Q.Promise(retrieveWebdriver);\n      quailDeferred = Q.defer();\n      assessmentsDeferred = Q.defer();\n\n      // Process the assessment list and then Quail once we have a client.\n      clientPromise\n        .then(prepareAssessmentList)\n        .then(communicateWithSelenium)\n        .fail(shutdownTestRunner);\n\n      return Q.all([\n        // Retrieve a webdriver client.\n        clientPromise,\n        // Prepare the list of assessments.\n        assessmentsDeferred.promise,\n        // Retrieve the results from the Quail evaluation.\n        quailDeferred.promise\n      ])\n      .fail(shutdownTestRunner);\n    },\n    /**\n     * Closes the client associated with the test suite.\n     */\n    teardown: function (client) {\n      return Q.promise(function (resolve, reject) {\n        client.end(function (err, ret) {\n          if (err) {\n            reject(err);\n          }\n          else {\n            resolve(ret);\n          }\n        });\n      });\n    }\n  };\n  // Set up Mocha.\n  mochaRunner = new Mocha({\n    timeout: 1000000,\n    reporter: 'spec',\n    bail: true,\n    require: 'babelhook'\n  });\n  /**\n   * Adds files to Mocha and then runs Mocha.\n   */\n  function addAndRunMocha (files) {\n    files.forEach(function (file) {\n      mochaRunner.addFile(file);\n    });\n    mochaRunner.run(shutdownTestRunner);\n  }\n  // Set up the Mocha test runs.\n  var specFiles;\n  // Run a single test if one is indicated, otherwise, run them all.\n  var single = execOptions.assessment;\n  if (single) {\n    specFiles = __dirname + '/specs/**/' + single + 'Spec.js';\n  }\n  else {\n    specFiles = __dirname + '/specs/**/*Spec.js';\n  }\n  // Gather the spec files and add them to the Mocha run.\n  glob(specFiles, function (error, files) {\n    if (error) {\n      shutdownTestRunner(error);\n    }\n    addAndRunMocha(files);\n  });\n}\n// Start the spec testing.\nrunSpecs();\n"
  },
  {
    "path": "test/config/assessmentsToRun.json",
    "content": "[\n  \"aAdjacentWithSameResourceShouldBeCombined\",\n  \"aImgAltNotRepetitive\",\n  \"aInPHasADistinctStyle\",\n  \"aLinkTextDoesNotBeginWithRedundantWord\",\n  \"aLinkWithNonText\",\n  \"aLinksAreSeparatedByPrintableCharacters\",\n  \"aLinksDontOpenNewWindow\",\n  \"aLinksNotSeparatedBySymbols\",\n  \"aLinksToMultiMediaRequireTranscript\",\n  \"aLinksToSoundFilesNeedTranscripts\",\n  \"aMultimediaTextAlternative\",\n  \"aMustContainText\",\n  \"aMustHaveTitle\",\n  \"aMustNotHaveJavascriptHref\",\n  \"aSuspiciousLinkText\",\n  \"aTitleDescribesDestination\",\n  \"animatedGifMayBePresent\",\n  \"appletContainsTextEquivalent\",\n  \"appletContainsTextEquivalentInAlt\",\n  \"appletProvidesMechanismToReturnToParent\",\n  \"appletTextEquivalentsGetUpdated\",\n  \"appletUIMustBeAccessible\",\n  \"appletsDoNotFlicker\",\n  \"appletsDonotUseColorAlone\",\n  \"areaAltIdentifiesDestination\",\n  \"areaAltRefersToText\",\n  \"areaDontOpenNewWindow\",\n  \"areaHasAltValue\",\n  \"areaLinksToSoundFile\",\n  \"audioMayBePresent\",\n  \"basefontIsNotUsed\",\n  \"blinkIsNotUsed\",\n  \"blockquoteNotUsedForIndentation\",\n  \"blockquoteUseForQuotations\",\n  \"boldIsNotUsed\",\n  \"buttonHasName\",\n  \"checkboxHasLabel\",\n  \"colorBackgroundGradientContrast\",\n  \"colorBackgroundImageContrast\",\n  \"colorElementBehindBackgroundGradientContrast\",\n  \"colorElementBehindBackgroundImageContrast\",\n  \"colorElementBehindContrast\",\n  \"colorFontContrast\",\n  \"cssDocumentMakesSenseStyleTurnedOff\",\n  \"definitionListsAreUsed\",\n  \"doctypeProvided\",\n  \"documentAcronymsHaveElement\",\n  \"documentAutoRedirectNotUsed\",\n  \"documentContentReadableWithoutStylesheets\",\n  \"documentHasTitleElement\",\n  \"documentIsWrittenClearly\",\n  \"documentLangIsISO639Standard\",\n  \"documentLangNotIdentified\",\n  \"documentMetaNotUsedWithTimeout\",\n  \"documentReadingDirection\",\n  \"documentStrictDocType\",\n  \"documentTitleDescribesDocument\",\n  \"documentTitleIsNotPlaceholder\",\n  \"documentTitleIsShort\",\n  \"documentTitleNotEmpty\",\n  \"documentVisualListsAreMarkedUp\",\n  \"domOrderMatchesVisualOrder\",\n  \"embedHasAssociatedNoEmbed\",\n  \"embedMustHaveAltAttribute\",\n  \"fieldsetHasLabel\",\n  \"fileHasLabel\",\n  \"fontIsNotUsed\",\n  \"formButtonsHaveValue\",\n  \"formErrorMessageHelpsUser\",\n  \"formHasGoodErrorMessage\",\n  \"formHasSubmitButton\",\n  \"formWithRequiredLabel\",\n  \"headerH1\",\n  \"headerH1Format\",\n  \"headerH2\",\n  \"headerH2Format\",\n  \"headerH3\",\n  \"headerH3Format\",\n  \"headerH4\",\n  \"headerH4Format\",\n  \"headerH5Format\",\n  \"headerH6Format\",\n  \"headersAttrRefersToATableCell\",\n  \"headersHaveText\",\n  \"headersUseToMarkSections\",\n  \"iIsNotUsed\",\n  \"idrefsHasCorrespondingId\",\n  \"iframeMustNotHaveLongdesc\",\n  \"imageMapServerSide\",\n  \"imgAltIsDifferent\",\n  \"imgAltIsTooLong\",\n  \"imgAltNotEmptyInAnchor\",\n  \"imgAltNotPlaceHolder\",\n  \"imgHasAlt\",\n  \"imgHasLongDesc\",\n  \"imgImportantNoSpacerAlt\",\n  \"imgNonDecorativeHasAlt\",\n  \"imgServerSideMapNotUsed\",\n  \"imgShouldNotHaveTitle\",\n  \"imgWithMapHasUseMap\",\n  \"imgWithMathShouldHaveMathEquivalent\",\n  \"inputCheckboxRequiresFieldset\",\n  \"inputElementsDontHaveAlt\",\n  \"inputImageAltIsNotFileName\",\n  \"inputImageAltIsNotPlaceholder\",\n  \"inputImageAltIsShort\",\n  \"inputImageAltNotRedundant\",\n  \"inputImageHasAlt\",\n  \"inputTextHasLabel\",\n  \"inputTextHasValue\",\n  \"inputTextValueNotEmpty\",\n  \"inputWithoutLabelHasTitle\",\n  \"labelDoesNotContainInput\",\n  \"labelMustBeUnique\",\n  \"labelMustNotBeEmpty\",\n  \"labelsAreAssignedToAnInput\",\n  \"languageDirAttributeIsUsed\",\n  \"languageDirectionPunctuation\",\n  \"languageUnicodeDirection\",\n  \"legendTextNotEmpty\",\n  \"legendTextNotPlaceholder\",\n  \"liDontUseImageForBullet\",\n  \"linkHasAUniqueContext\",\n  \"listNotUsedForFormatting\",\n  \"listOfLinksUseList\",\n  \"marqueeIsNotUsed\",\n  \"menuNotUsedToFormatText\",\n  \"newWindowIsOpened\",\n  \"objectMustContainText\",\n  \"objectMustHaveEmbed\",\n  \"objectMustHaveTitle\",\n  \"objectMustHaveValidTitle\",\n  \"pNotUsedAsHeader\",\n  \"passwordHasLabel\",\n  \"preShouldNotBeUsedForTabularLayout\",\n  \"radioHasLabel\",\n  \"scriptOnclickRequiresOnKeypress\",\n  \"scriptOndblclickRequiresOnKeypress\",\n  \"scriptOnmousedownRequiresOnKeypress\",\n  \"scriptOnmousemove\",\n  \"scriptOnmouseoutHasOnmouseblur\",\n  \"scriptOnmouseoverHasOnfocus\",\n  \"scriptOnmouseupHasOnkeyup\",\n  \"selectHasAssociatedLabel\",\n  \"selectJumpMenu\",\n  \"siteMap\",\n  \"skipToContentLinkProvided\",\n  \"svgContainsTitle\",\n  \"tabIndexFollowsLogicalOrder\",\n  \"tableAxisHasCorrespondingId\",\n  \"tableDataShouldHaveTh\",\n  \"tableLayoutDataShouldNotHaveTh\",\n  \"tableLayoutHasNoCaption\",\n  \"tableLayoutHasNoSummary\",\n  \"tableLayoutMakesSenseLinearized\",\n  \"tableNotUsedForLayout\",\n  \"tableShouldUseHeaderIDs\",\n  \"tableSummaryDoesNotDuplicateCaption\",\n  \"tableSummaryIsEmpty\",\n  \"tableSummaryIsNotTooLong\",\n  \"tableUseColGroup\",\n  \"tableUsesAbbreviationForHeader\",\n  \"tableUsesCaption\",\n  \"tableUsesScopeForRow\",\n  \"tabularDataIsInTable\",\n  \"textIsNotSmall\",\n  \"textareaHasAssociatedLabel\",\n  \"videoMayBePresent\",\n  \"videosEmbeddedOrLinkedNeedCaptions\",\n  \"whiteSpaceInWord\",\n  \"_whiteSpaceNotUsedForFormatting\"\n]\n"
  },
  {
    "path": "test/config/defaults.js",
    "content": "module.exports = {};\n"
  },
  {
    "path": "test/config/index.js",
    "content": "var merge = require('deepmerge');\n\nvar env = process.env.TRAVIS ? 'travis-ci' : 'local';\n\nvar defaults = require('./defaults.js');\nvar asked = require('./' + env + '.js');\n\nif (process.env._ENV === 'mobile') {\n  var mobile = require('./mobile');\n  asked = merge(asked,mobile);\n}\n\nmodule.exports = merge(defaults, asked);\n"
  },
  {
    "path": "test/config/local.js",
    "content": "module.exports = {\n  host: 'localhost',\n  port: process.env._PORT || 4444,\n  logLevel: 'silent', // verbose | silent | command | data | result\n  waitforTimeout: 1000,\n  desiredCapabilities: {\n    browserName: process.env._BROWSER || 'phantomjs',\n    'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER,\n    'idle-timeout': 900,\n    build: process.env.TRAVIS_BUILD_NUMBER,\n    'phantomjs.binary.path': './node_modules/phantomjs/bin/phantomjs'\n  }\n};\n"
  },
  {
    "path": "test/config/mobile.js",
    "content": "module.exports = {\n  desiredCapabilities: {\n    browserName: process.env._BROWSER || '',\n    platformName: (process.env._PLATFORM || '').replace(/_/g,' '),\n    platformVersion: (process.env._VERSION || ''),\n    'appium-version': '1.0',\n    deviceName: (process.env._DEVICENAME || '').replace(/_/g,' ')\n  }\n};\n"
  },
  {
    "path": "test/config/travis-ci.js",
    "content": "module.exports = {\n  host: 'localhost',\n  port: process.env._PORT || 4444,\n  logLevel: 'silent',\n  waitforTimeout: 1000,\n  desiredCapabilities: {\n    browserName: process.env._BROWSER || 'phantomjs',\n    'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER,\n    'idle-timeout': 900,\n    build: process.env.TRAVIS_BUILD_NUMBER,\n    'phantomjs.binary.path': './node_modules/phantomjs/bin/phantomjs'\n  }\n};\n/*\nmodule.exports = {\n  host: 'ondemand.saucelabs.com',\n  port: 80,\n  user: process.env.SAUCE_USERNAME,\n  key: process.env.SAUCE_ACCESS_KEY,\n  logLevel: 'silent',\n  waitforTimeout: 1000,\n  desiredCapabilities: {\n    browserName: (process.env._BROWSER || '').replace(/_/g, ' '),\n    platform: (process.env._PLATFORM || '').replace(/_/g, ' '),\n    version: process.env._VERSION,\n    'tunnel-identifier': process.env.TRAVIS_JOB_NUMBER,\n    'idle-timeout': 900,\n    tags: ['webdriverio', process.env._ENV || 'desktop', process.env._BROWSER, process.env._PLATFORM, process.env._VERSION],\n    name: 'webdriverio test',\n    build: process.env.TRAVIS_BUILD_NUMBER,\n    username: process.env.SAUCE_USERNAME,\n    accessKey: process.env.SAUCE_ACCESS_KEY\n  }\n};\n*/\n"
  }
]