diff --git a/.editorconfig b/.editorconfig index 408d8707..818e0724 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,4 +1,3 @@ -# http://editorconfig.org root = true [*] @@ -9,14 +8,6 @@ indent_size = 2 trim_trailing_whitespace = true insert_final_newline = true -[*.md] +[{**/{actual,fixtures,expected,templates}/**,*.md}] trim_trailing_whitespace = false -insert_final_newline = false - -[**/{actual,fixtures,expected}/**] -trim_trailing_whitespace = false -insert_final_newline = false - -[**/templates/**] -trim_trailing_whitespace = false -insert_final_newline = false +insert_final_newline = false \ No newline at end of file diff --git a/.gitattributes b/.gitattributes index 4a3f1d3d..660957e7 100755 --- a/.gitattributes +++ b/.gitattributes @@ -7,4 +7,4 @@ *.jpg binary *.gif binary *.png binary -*.jpeg binary \ No newline at end of file +*.jpeg binary diff --git a/.github/contributing.md b/.github/contributing.md new file mode 100644 index 00000000..3791537b --- /dev/null +++ b/.github/contributing.md @@ -0,0 +1,55 @@ +# Contributing to micromatch + +First and foremost, thank you! We appreciate that you want to contribute to micromatch, your time is valuable, and your contributions mean a lot to us. + +**What does "contributing" mean?** + +Creating an issue is the simplest form of contributing to a project. But there are many ways to contribute, including the following: + +- Updating or correcting documentation +- Feature requests +- Bug reports + +If you'd like to learn more about contributing in general, the [Guide to Idiomatic Contributing](https://github.com/jonschlinkert/idiomatic-contributing) has a lot of useful information. + +**Showing support for micromatch** + +Please keep in mind that open source software is built by people like you, who spend their free time creating things the rest the community can use. + +Don't have time to contribute? No worries, here are some other ways to show your support for micromatch: + +- star the [project](https://github.com/jonschlinkert/micromatch) +- tweet your support for micromatch + +## Issues + +### Before creating an issue + +Please try to determine if the issue is caused by an underlying library, and if so, create the issue there. Sometimes this is difficult to know. We only ask that you attempt to give a reasonable attempt to find out. Oftentimes the readme will have advice about where to go to create issues. + +Try to follow these guidelines + +- **Investigate the issue**: There might be an existing issue (open or closed) that covers the bug you experienced. If so, please do not create a new issue. If necessary you may add comments to the existing issue if you can shed additional light on the problem, or you'd like to help with debugging. +- **Check the readme** - oftentimes you will find notes about creating issues, and where to go depending on the type of issue. +- Create the issue in the appropriate repository: try to find out if the bug you're experiencing is in micromatch or one of its dependencies + +### Creating an issue + +Please be as descriptive as possible when creating an issue. Give us the information we need to successfully answer your question or address your issue by answering the following in your issue: + +- **version**: please note the version of micromatch are you using +- **extensions, plugins, helpers, etc** (if applicable): please list any extensions you're using +- **error messages**: please paste any error messages into the issue, or a [gist](https://gist.github.com/) + +## Above and beyond + +Here are some tips for creating idiomatic issues. Taking just a little bit extra time will make your issue easier to read, easier to resolve, more likely to be found by others who have the same or similar issue in the future. + +- read the [Guide to Idiomatic Contributing](https://github.com/jonschlinkert/idiomatic-contributing) +- take some time to learn basic markdown. This [markdown cheatsheet](https://gist.github.com/jonschlinkert/5854601) is super helpful, as is the GitHub guide to [basic markdown](https://help.github.com/articles/markdown-basics/). +- Learn about [GitHub Flavored Markdown](https://help.github.com/articles/github-flavored-markdown/). And if you want to really go above and beyond, read [mastering markdown](https://guides.github.com/features/mastering-markdown/). +- use backticks to wrap code. This ensures that code will retain its format, making it much more readable to others +- use syntax highlighting by adding the correct language name after the first "code fence" + + +[micromatch]: https://github.com/jonschlinkert/micromatch diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 00000000..c47a6b65 --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,13 @@ +_(Thanks for reporting an issue to micromatch! If you haven't already read the [contributor guidelines](contributing.md), Please do that now, then procede to fill out the details below.)_ + +## Please describe the **minimum necessary steps** to reproduce this issue: + +… + +## What is happening (but shouldn't): + +… + +## What should be happening instead? + +… diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..d375759b --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,108 @@ +Hello, and thanks for contributing to micromatch! + +## tldr + +There are three main goals in this document, depending on the nature of your pr: + +- [description](#description): please tell us about your pr +- [checklist](#checklist): please review the checklist that is most closly related to your pr +- [contributors list](#packagejson-contributors): you're one of us now, please add yourself to `package.json` and let the world know! + +The following sections provide more detail on each. + +**Improve this document** + +Please don't hesitate to [ask questions][issues] for clarification, or to [make suggestions][issues] (or a pull request) to improve this document. + +## Description + +To help the project's maintainers and community to quickly understand the nature of your pull requeset, please create a description that incorporates the following elements: + +- [] what is accomplished by the pr +- [] if there is something potentially controversial in your pr, please take a moment to tell us about your choices + +## Checklist + +Please use the checklist that is most closely related to your pr _(you only need to use one checklist, and you can skip items that aren't applicable or don't make sense)_: + +- [fixing typos]() +- [documentation]() +- [bug fix]() +- [new feature]() +- [other]() + +### Fixing typos + +- [ ] Please review the [readme advice]() section before submitting changes +- [ ] Add your to the [contributors](#packagejson-contributors) array in package.json! + +### Documentation + +- [ ] Please review the [readme advice](#readme-advice) section before submitting changes +- [ ] Add your info to the [contributors](#packagejson-contributors) array in package.json! + +### Bug Fix + +- [ ] All existing unit tests are still passing (if applicable) +- [ ] Add new passing unit tests to cover the code introduced by your pr +- [ ] Update the readme (see [readme advice](#readme-advice)) +- [ ] Update or add any necessary API documentation +- [ ] Add your info to the [contributors](#packagejson-contributors) array in package.json! + +### New Feature + +- [ ] If this is a big feature with breaking changes, consider [opening an issue][issues] to discuss first. This is completely up to you, but please keep in mind that your pr might not be accepted. +- [ ] Run unit tests to ensure all existing tests are still passing +- [ ] Add new passing unit tests to cover the code introduced by your pr +- [ ] Update the readme (see [readme advice](#readme-advice)) +- [ ] Add your info to the [contributors](#packagejson-contributors) array in package.json! + +Thanks for contributing! + +## Readme advice + +Please review this section if you are updating readme documentation. + +**Readme template** + +This project uses [verb][] for documentation. Verb generates the project's readme documentation from the [.verb.md](../.verb.md) template in the root of this project. + +Make all documentation changes in `.verb.md`, and please _do not edit the readme.md directly_, or your changes might accidentally get overwritten. + +**Code comments** + +Please add code comments (following the same style as existing comments) to describe any code changes or new code introduced by your pull request. + +**Optionally build the readme** + +Any changes made `.verb.md` and/or code comments will be automatically incorporated into the README documentation the next time `verb` is run. + +We can take care of building the documentation for you when we merge in your changes, or feel free to run [verb][] yourself. Whatever you prefer is fine with us. + +## package.json contributors + +**Add yourself!** + +When adding your information to the `contributors` array in package.json, please use the following format (provide your name at minimum, the other fields are optional): + +``` +full name (https://website.com) +``` + +**Example** + +```json +// -- package.json -- +{ + "name": "micromatch", + "contributors": [ + "Brian Woodward (https://github.com/jonschlinkert)", + "Jon Schlinkert (https://github.com/doowb)", + ] +} +``` + +_(If a `contributors` array does not already exist, please feel free to add one wherever you want, and congratulations on being the first to contribute!)_ + +[issues]: ../../issues +[verb]: https://github.com/verbose/verb diff --git a/.gitignore b/.gitignore old mode 100755 new mode 100644 index d44a263a..0a16ee9c --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,27 @@ +# always ignore files +*.DS_Store *.sublime-* -_gh_pages -bower_components + +# test related, or directories generated by tests +test/actual +actual +coverage +.nyc* + +# npm node_modules npm-debug.log + +# yarn +yarn.lock +yarn-error.log + +# misc +_gh_pages +_draft +_drafts +bower_components +vendor temp tmp TODO.md -vendor -*.DS_Store -staging -wip -test/bash -coverage diff --git a/.travis.yml b/.travis.yml index 76003c36..58dcd48c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,12 +1,13 @@ sudo: false +os: + - linux + - osx language: node_js node_js: + - node + - '7' - '6' - '5' - '4' - '0.12' - '0.10' -matrix: - fast_finish: true - allow_failures: - - node_js: '0.10' diff --git a/.verb.md b/.verb.md old mode 100755 new mode 100644 index aafb8c8e..56ae4d85 --- a/.verb.md +++ b/.verb.md @@ -1,81 +1,74 @@ -# {%= name %} {%= badge('npm') %} {%= badge('downloads') %} {%= badge('travis') %} +## Quickstart -> {%= description %} -Micromatch supports all of the same matching features as [minimatch][] and [multimatch][]. - -* [mm()](#usage) is the same as [multimatch()][multimatch] -* [mm.match()](#match) is the same as [minimatch.match()][minimatch] -* use [mm.isMatch()](#ismatch) instead of [minimatch()][minimatch] - -## Install -{%= include("install-npm", {save: true}) %} +```js +var mm = require('micromatch'); +mm(list, patterns[, options]); +``` -## Start matching! +The [main export](#micromatch) takes a list of strings and one or more glob patterns: ```js -var mm = require('{%= name %}'); -console.log(mm([''])) +console.log(mm(['foo', 'bar', 'qux'], ['f*', 'b*'])); +//=> ['foo', 'bar'] ``` -## Table of contents - - +Use [.isMatch()](#ismatch) to get true/false: -*** +```js +console.log(mm.isMatch('foo', 'f*')); +//=> true +``` +[Switching](#switching-to-micromatch) from minimatch and multimatch is easy! -### Features -+ [Drop-in replacement][switch] for [minimatch][] and [multimatch][] -+ Built-in support for multiple glob patterns, like `['foo/*.js', '!bar.js']` -+ [Brace Expansion][braces] (`foo/bar-{1..5}.md`, `one/{two,three}/four.md`) -+ Typical glob patterns, like `**/*`, `a/b/*.js`, or `['foo/*.js', '!bar.js']` -+ Methods like `.isMatch()`, `.contains()` and `.any()` +## Why use micromatch? -**Extended globbing features:** +> micromatch is a [drop-in replacement](#switching-to-micromatch) for minimatch and multimatch -+ Logical `OR` (`foo/bar/(abc|xyz).js`) -+ Regex character classes (`foo/bar/baz-[1-5].js`) -+ POSIX [bracket expressions][expand-brackets] (`**/[[:alpha:][:digit:]]/`) -+ [extglobs][extglob] (`**/+(x|y)`, `!(a|b)`, etc). +- Supports all of the same matching features as [minimatch][] and [multimatch][] +- Micromatch uses [snapdragon][] for parsing and compiling globs, which provides granular control over the entire conversion process in a way that is easy to understand, reason about, and maintain. +- More accurate, with more than 36,000 [test assertions](./test) to prove it. +- More complete support for the Bash 4.3 specification than minimatch and multimatch. Micromatch passes _all of the spec tests_ from bash, including some that bash still fails. +- [Faster matching](#benchmarks), from a combination of optimized glob patterns, faster algorithms, and regex caching. +- [Micromatch is safer][braces]{#braces-is-safe}, and is not subject to DoS with brace patterns, like minimatch and multimatch. +- More reliable windows support than minimatch and multimatch. -You can combine these to create whatever matching patterns you need. +### Matching features -**Example** +* Support for multiple glob patterns (no need for wrappers like multimatch) +* Wildcards (`**`, `*.js`) +* Negation (`'!a/*.js'`, `'*!(b).js']`) +* [extglobs][extglob] (`+(x|y)`, `!(a|b)`) +* [POSIX character classes][brackets] (`[[:alpha:][:digit:]]`) +* [brace expansion][braces] (`foo/{1..5}.md`, `bar/{a,b,c}.js`) +* regex character classes (`foo-[1-5].js`) +* regex logical "or" (`foo/(abc|xyz).js`) -```js -// double-negation! -mm(['fa', 'fb', 'f', 'fo'], '!(f!(o))'); -//=> ['fo'] -``` +You can mix and match these features to create whatever patterns you need! -## Why switch to micromatch? +## Switching to micromatch -- Native support for multiple glob patterns, no need for wrappers like [multimatch][] -- [10-55x faster](#benchmarks) and more performant than [minimatch][] and [multimatch][]. This is achieved through a combination of caching and regex optimization strategies, a fundamentally different approach than minimatch. -- More extensive support for the Bash 4.3 specification -- More complete extglob support -- Extensive [unit tests](./test) (approx. 1,300 tests). Minimatch fails many of the tests. +There is one notable difference between micromatch and minimatch in regards to how backslashes are handled. See [the notes about backslashes](#backslashes) for more information. +### From minimatch -### Switch from minimatch - -Use `mm.isMatch()` instead of `minimatch()`: +Use [mm.isMatch()](#ismatch) instead of `minimatch()`: ```js mm.isMatch('foo', 'b*'); //=> false ``` -Use `mm.match()` instead of `minimatch.match()`: +Use [mm.match()](#match) instead of `minimatch.match()`: ```js mm.match(['foo', 'bar'], 'b*'); //=> 'bar' ``` -### Switch from multimatch +### From multimatch Same signature: @@ -84,555 +77,430 @@ mm(['foo', 'bar', 'baz'], ['f*', '*z']); //=> ['foo', 'baz'] ``` +## API +{%= apidocs("index.js") %} -*** - - -## Usage - -Add micromatch to your node.js project: - -```js -var mm = require('{%= name %}'); -``` - -**Signature** +## Options -```js -mm(array_of_strings, glob_patterns[, options]); -``` +- [basename](#optionsbasename) +- [bash](#optionsbash) +- [cache](#optionscache) +- [dot](#optionsdot) +- [failglob](#optionsfailglob) +- [ignore](#optionsignore) +- [matchBase](#optionsmatchBase) +- [nobrace](#optionsnobrace) +- [nocase](#optionsnocase) +- [nodupes](#optionsnodupes) +- [noext](#optionsnoext) +- [noglobstar](#optionsnoglobstar) +- [nonull](#optionsnonull) +- [nullglob](#optionsnullglob) +- [snapdragon](#optionssnapdragon) +- [sourcemap](#optionssourcemap) +- [unescape](#optionsunescape) +- [unixify](#optionsunixify) + +### options.basename + +Allow glob patterns without slashes to match a file path based on its basename. Same behavior as [minimatch][] option `matchBase`. + +**Type**: `Boolean` + +**Default**: `false` **Example** - ```js -mm(['foo', 'bar', 'baz'], 'b*'); -//=> ['bar', 'baz'] -``` - +mm(['a/b.js', 'a/c.md'], '*.js'); +//=> [] -### Usage examples +mm(['a/b.js', 'a/c.md'], '*.js', {matchBase: true}); +//=> ['a/b.js'] +``` -**Brace expansion** +### options.bash -Match files with `.js` or `.txt` extensions. +Enabled by default, this option enforces bash-like behavior with stars immediately following a bracket expression. Bash bracket expressions are similar to regex character classes, but unlike regex, a star following a bracket expression **does not repeat the bracketed characters**. Instead, the star is treated the same as an other star. -```js -mm(['a.js', 'b.md', 'c.txt'], '*.{js,txt}'); -//=> ['a.js', 'c.txt'] -``` +**Type**: `Boolean` -**Extglobs** +**Default**: `true` -Match anything except for files with the `.md` extension. +**Example** ```js -mm(files, '**/*.!(md)'); +var files = ['abc', 'ajz']; +console.log(mm(files, '[a-c]*')); +//=> ['abc', 'ajz'] -//=> ['a.js', 'c.txt'] +console.log(mm(files, '[a-c]*', {bash: false})); ``` -**Multiple patterns** +### options.cache -Match using an array of patterns. +Disable regex and function memoization. -```js -mm(['a.md', 'b.js', 'c.txt', 'd.json'], ['*.md', '*.txt']); -//=> ['a.md', 'c.txt'] -``` +**Type**: `Boolean` -**Negation patterns:** +**Default**: `undefined` -Behavior is designed to be what users would expect, based on conventions that are already well-established. -- [minimatch][] behavior is used when the pattern is a string, so patterns are **inclusive by default**. -- [multimatch][] behavior is used when an array of patterns is passed, so patterns are **exclusive by default**. +### options.dot -```js -mm(['a.js', 'b.md', 'c.txt'], '!*.{js,txt}'); -//=> ['b.md'] +Match dotfiles. Same behavior as [minimatch][] option `dot`. -mm(['a.md', 'b.js', 'c.txt', 'd.json'], ['*.*', '!*.{js,txt}']); -//=> ['a.md', 'd.json'] -``` +**Type**: `Boolean` -*** +**Default**: `false` -## API methods +### options.failglob -```js -var mm = require('micromatch'); -``` +Similar to the `--failglob` behavior in Bash, throws an error when no matches are found. -### .match +**Type**: `Boolean` -```js -mm.match(array, globString); -``` +**Default**: `undefined` -Return an array of files that match the given glob pattern. Useful if you only need to use a single glob pattern. +### options.ignore -**Example** +String or array of glob patterns to match files to ignore. -```js -mm.match(['ab', 'a/b', 'bb', 'b/c'], '?b'); -//=> ['ab', 'bb'] +**Type**: `String|Array` -mm.match(['ab', 'a/b', 'bb', 'b/c'], '*/b'); -//=> ['a/b'] -``` +**Default**: `undefined` -### .isMatch -```js -mm.isMatch(filepath, globString); -``` +### options.matchBase -Returns true if a file path matches the given glob pattern. +Alias for [options.basename](#options-basename). -**Example** +### options.nobrace -```js -mm.isMatch('.verb.md', '*.md'); -//=> false +Disable expansion of brace patterns. Same behavior as [minimatch][] option `nobrace`. -mm.isMatch('.verb.md', '*.md', {dot: true}); -//=> true -``` +**Type**: `Boolean` + +**Default**: `undefined` -### .contains +See [braces][] for more information about extended brace expansion. -Returns true if any part of a file path matches the given glob pattern. Think of this is "has path" versus "is path". -**Example** +### options.nocase -`.isMatch()` would return false for both of the following: +Use a case-insensitive regex for matching files. Same behavior as [minimatch][]. -```js -mm.contains('a/b/c', 'a/b'); -//=> true +**Type**: `Boolean` -mm.contains('a/b/c', 'a/*'); -//=> true -``` +**Default**: `undefined` -### .matcher -Returns a function for matching using the supplied pattern. e.g. create your own "matcher". The advantage of this method is that the pattern can be compiled outside of a loop. +### options.nodupes -**Pattern** +Remove duplicate elements from the result array. -Can be any of the following: +**Type**: `Boolean` -- `glob/string` -- `regex` -- `function` +**Default**: `undefined` **Example** +Example of using the `unescape` and `nodupes` options together: + ```js -var isMatch = mm.matcher('*.md'); -var files = []; - -['a.md', 'b.txt', 'c.md'].forEach(function(fp) { - if (isMatch(fp)) { - files.push(fp); - } -}); +mm.match(['a/b/c', 'a/b/c'], 'a/b/c'); +//=> ['a/b/c', 'a/b/c'] + +mm.match(['a/b/c', 'a/b/c'], 'a/b/c', {nodupes: true}); +//=> ['abc'] ``` -### .filter +### options.noext -Returns a function that can be passed to `Array#filter()`. +Disable extglob support, so that extglobs are regarded as literal characters. -**Params** +**Type**: `Boolean` -- `patterns` **{String|Array}**: +**Default**: `undefined` **Examples** -Single glob: - ```js -var fn = mm.filter('*.md'); -['a.js', 'b.txt', 'c.md'].filter(fn); -//=> ['c.md'] +mm(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)'); +//=> ['a/b', 'a/!(z)'] -var fn = mm.filter('[a-c]'); -['a', 'b', 'c', 'd', 'e'].filter(fn); -//=> ['a', 'b', 'c'] +mm(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)', {noext: true}); +//=> ['a/!(z)'] (matches only as literal characters) ``` -Array of glob patterns: - -```js -var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]; - -var fn = mm.filter(['{1..10}', '![7-9]', '!{3..4}']); -arr.filter(fn); -//=> [1, 2, 5, 6, 10] -``` -_(Internally this function generates the matching function by using the [matcher](#matcher) method. You can use the [matcher](#matcher) method directly to create your own filter function)_ +### options.nonegate +Disallow negation (`!`) patterns, and treat leading `!` as a literal character to match. -### .any +**Type**: `Boolean` -Returns true if a file path matches any of the given patterns. +**Default**: `undefined` -```js -mm.any(filepath, patterns, options); -``` -**Params** +### options.noglobstar -- filepath `{String}`: The file path to test. -- patterns `{String|Array}`: One or more glob patterns -- options: `{Object}`: options to pass to the `.matcher()` method. +Disable matching with globstars (`**`). +**Type**: `Boolean` -**Example** +**Default**: `undefined` ```js -mm.any('abc', ['!*z']); -//=> true -mm.any('abc', ['a*', 'z*']); -//=> true -mm.any('abc', 'a*'); -//=> true -mm.any('abc', ['z*']); -//=> false -``` - - -### .expand +mm(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**'); +//=> ['a/b', 'a/b/c', 'a/b/c/d'] -Returns an object with a regex-compatible string and tokens. - -```js -mm.expand('*.js'); - -// when `track` is enabled (for debugging), the `history` array is used -// to record each mutation to the glob pattern as it's converted to regex -{ options: { track: false, dot: undefined, makeRe: true, negated: false }, - pattern: '(.*\\/|^)bar\\/(?:(?!(?:^|\\/)\\.).)*?', - history: [], - tokens: - { path: - { whole: '**/bar/**', - dirname: '**/bar/', - filename: '**', - basename: '**', - extname: '', - ext: '' }, - is: - { glob: true, - negated: false, - globstar: true, - dotfile: false, - dotdir: false }, - match: {}, - original: '**/bar/**', - pattern: '**/bar/**', - base: '' } } +mm(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**', {noglobstar: true}); +//=> ['a/b'] ``` -### .makeRe - -Create a regular expression for matching file paths based on the given pattern: - -```js -mm.makeRe('*.js'); -//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ -``` +### options.nonull -## Options +Alias for [options.nullglob](#options-nullglob). -### options.unixify -Normalize slashes in file paths and glob patterns to forward slashes. +### options.nullglob -Type: `{Boolean}` +If `true`, when no matches are found the actual (arrayified) glob pattern is returned instead of an empty array. Same behavior as [minimatch][] option `nonull`. -Default: `undefined` on non-windows, `true` on windows. +**Type**: `Boolean` +**Default**: `undefined` -### options.dot -Match dotfiles. Same behavior as [minimatch]. +### options.snapdragon -Type: `{Boolean}` +Pass your own instance of [snapdragon][], to customize parsers or compilers. -Default: `false` +**Type**: `Object` +**Default**: `undefined` -### options.unescape -Unescape slashes in glob patterns. Use cautiously, especially on windows. +### options.sourcemap -Type: `{Boolean}` +Generate a source map by enabling the `sourcemap` option with the `.parse`, `.compile`, or `.create` methods. -Default: `undefined` +_(Note that sourcemaps are currently not enabled for brace patterns)_ -**Example** +**Examples** -```js -mm.isMatch('abc', '\\a\\b\\c', {unescape: true}); -//=> true +``` js +var mm = require('micromatch'); +var pattern = '*(*(of*(a)x)z)'; + +var res = mm.create('abc/*.js', {sourcemap: true}); +console.log(res.map); +// { version: 3, +// sources: [ 'string' ], +// names: [], +// mappings: 'AAAA,GAAG,EAAC,iBAAC,EAAC,EAAE', +// sourcesContent: [ 'abc/*.js' ] } + +var ast = mm.parse('abc/**/*.js'); +var res = mm.compile(ast, {sourcemap: true}); +console.log(res.map); +// { version: 3, +// sources: [ 'string' ], +// names: [], +// mappings: 'AAAA,GAAG,EAAC,2BAAE,EAAC,iBAAC,EAAC,EAAE', +// sourcesContent: [ 'abc/**/*.js' ] } + +var ast = mm.parse(pattern); +var res = mm.compile(ast, {sourcemap: true}); +console.log(res.map); +// { version: 3, +// sources: [ 'string' ], +// names: [], +// mappings: 'AAAA,CAAE,CAAE,EAAE,CAAE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC', +// sourcesContent: [ '*(*(of*(a)x)z)' ] } ``` -### options.nodupes +### options.unescape -Remove duplicate elements from the result array. +Remove backslashes from returned matches. -Type: `{Boolean}` +**Type**: `Boolean` -Default: `undefined` +**Default**: `undefined` **Example** -Example of using the `unescape` and `nodupes` options together: +In this example we want to match a literal `*`: ```js -mm.match(['abc', '\\a\\b\\c'], '\\a\\b\\c', {unescape: true}); -//=> ['abc', 'abc'] +mm.match(['abc', 'a\\*c'], 'a\\*c'); +//=> ['a\\*c'] -mm.match(['abc', '\\a\\b\\c'], '\\a\\b\\c', {unescape: true, nodupes: true}); -//=> ['abc'] +mm.match(['abc', 'a\\*c'], 'a\\*c', {unescape: true}); +//=> ['a*c'] ``` -### options.matchBase +### options.unixify -Allow glob patterns without slashes to match a file path based on its basename. . Same behavior as [minimatch]. +Convert path separators on returned files to posix/unix-style forward slashes. -Type: `{Boolean}` +**Type**: `Boolean` -Default: `false` +**Default**: `true` on windows, `false` everywhere else **Example** ```js -mm(['a/b.js', 'a/c.md'], '*.js'); -//=> [] +mm.match(['a\\b\\c'], 'a/**'); +//=> ['a/b/c'] -mm(['a/b.js', 'a/c.md'], '*.js', {matchBase: true}); -//=> ['a/b.js'] +mm.match(['a\\b\\c'], {unixify: false}); +//=> ['a\\b\\c'] ``` -### options.nobraces - -Don't expand braces in glob patterns. Same behavior as [minimatch][] `nobrace`. - -Type: `{Boolean}` - -Default: `undefined` - -See [braces][] for more information about extended brace expansion. - - -### options.nobrackets - -Don't expand POSIX bracket expressions. - -Type: `{Boolean}` - -Default: `undefined` - -See [expand-brackets][] for more information about extended bracket expressions. - - -### options.noextglob - -Don't expand extended globs. - -Type: `{Boolean}` - -Default: `undefined` - -See [extglob][] for more information about extended globs. - - -### options.nocase - -Use a case-insensitive regex for matching files. Same behavior as [minimatch][]. - -Type: `{Boolean}` - -Default: `false` - - -### options.nonegate +## Extended globbing -Disallow negation (`!`) patterns. +Micromatch also supports extended globbing features. -Type: `{Boolean}` - -Default: `false` - - -### options.nonull - -If `true`, when no matches are found the actual (array-ified) glob pattern is returned instead of an empty array. Same behavior as [minimatch][]. - -Type: `{Boolean}` - -Default: `false` - - -### options.cache - -Cache the platform (e.g. `win32`) to prevent this from being looked up for every filepath. - -Type: `{Boolean}` - -Default: `true` - - -*** - -## Other features - -Micromatch also supports the following. - -### Extended globbing - -#### extglobs +### extglobs Extended globbing, as described by the bash man page: | **pattern** | **regex equivalent** | **description** | | --- | --- | --- | -| `?(pattern-list)` | `(...|...)?` | Matches zero or one occurrence of the given patterns | -| `*(pattern-list)` | `(...|...)*` | Matches zero or more occurrences of the given patterns | -| `+(pattern-list)` | `(...|...)+` | Matches one or more occurrences of the given patterns | -| `@(pattern-list)` | `(...|...)` * | Matches one of the given patterns | -| `!(pattern-list)` | N/A | Matches anything except one of the given patterns | +| `?(pattern)` | `(pattern)?` | Matches zero or one occurrence of the given patterns | +| `*(pattern)` | `(pattern)*` | Matches zero or more occurrences of the given patterns | +| `+(pattern)` | `(pattern)+` | Matches one or more occurrences of the given patterns | +| `@(pattern)` | `(pattern)` * | Matches one of the given patterns | +| `!(pattern)` | N/A (equivalent regex is much more complicated) | Matches anything except one of the given patterns | -* `@` isn't a RegEx character. +* Note that `@` isn't a RegEx character. Powered by [extglob][]. Visit that library for the full range of options or to report extglob related issues. -See [extglob][] for more information about extended globs. - -#### brace expansion - -In simple cases, brace expansion appears to work the same way as the logical `OR` operator. For example, `(a|b)` will achieve the same result as `{a,b}`. - -Here are some powerful features unique to brace expansion (versus character classes): - - - range expansion: `a{1..3}b/*.js` expands to: `['a1b/*.js', 'a2b/*.js', 'a3b/*.js']` - - nesting: `a{c,{d,e}}b/*.js` expands to: `['acb/*.js', 'adb/*.js', 'aeb/*.js']` +### braces +Brace patterns can be used to match specific ranges or sets of characters. For example, the pattern `*/{1..3}/*` would match any of following strings: -Visit [braces][braces] to ask questions and create an issue related to brace-expansion, or to see the full range of features and options related to brace expansion. - +``` +foo/1/bar +foo/2/bar +foo/3/bar +baz/1/qux +baz/2/qux +baz/3/qux +``` -#### regex character classes +Visit [braces][] to see the full range of features and options related to brace expansion, or to create brace matching or expansion related issues. -With the exception of brace expansion (`{a,b}`, `{1..5}`, etc), most of the special characters convert directly to regex, so you can expect them to follow the same rules and produce the same results as regex. +### regex character classes -For example, given the list: `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: +Given the list: `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: - - `[ac].js`: matches both `a` and `c`, returning `['a.js', 'c.js']` - - `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']` - - `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']` - - `a/[A-Z].js`: matches and uppercase letter, returning `['a/E.md']` +* `[ac].js`: matches both `a` and `c`, returning `['a.js', 'c.js']` +* `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']` +* `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']` +* `a/[A-Z].js`: matches and uppercase letter, returning `['a/E.md']` -Learn about [regex character classes][character-classes]. +Learn about [regex character classes][charclass]. -#### regex groups +### regex groups Given `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: - - `(a|c).js`: would match either `a` or `c`, returning `['a.js', 'c.js']` - - `(b|d).js`: would match either `b` or `d`, returning `['b.js', 'd.js']` - - `(b|[A-Z]).js`: would match either `b` or an uppercase letter, returning `['b.js', 'E.js']` +* `(a|c).js`: would match either `a` or `c`, returning `['a.js', 'c.js']` +* `(b|d).js`: would match either `b` or `d`, returning `['b.js', 'd.js']` +* `(b|[A-Z]).js`: would match either `b` or an uppercase letter, returning `['b.js', 'E.js']` -As with regex, parenthese can be nested, so patterns like `((a|b)|c)/b` will work. But it might be easier to achieve your goal using brace expansion. +As with regex, parens can be nested, so patterns like `((a|b)|c)/b` will work. Although brace expansion might be friendlier to use, depending on preference. -#### POSIX bracket expressions +### POSIX bracket expressions + +POSIX brackets are intended to be more user-friendly than regex character classes. This of course is in the eye of the beholder. **Example** ```js mm.isMatch('a1', '[[:alpha:][:digit:]]'); //=> true -``` -See [expand-brackets][] for more information about extended bracket expressions. +mm.isMatch('a1', '[[:alpha:][:alpha:]]'); +//=> false +``` +See [expand-brackets][] for more information about bracket expressions. *** + ## Notes -Whenever possible parsing behavior for patterns is based on globbing specifications in Bash 4.3. Patterns that aren't described by Bash follow wildmatch spec (used by git). +### Bash 4.3 parity +Whenever possible matching behavior is based on behavior Bash 4.3, which is mostly consistent with minimatch. -## Benchmarks +However, it's suprising how many edge cases and rabbit holes there are with glob matching, and since there is no real glob specification, and micromatch is more accurate than both Bash and minimatch, there are cases where best-guesses were made for behavior. In a few cases where Bash had no answers, we used wildmatch (used by git) as a fallback. -Run the [benchmarks](./benchmark): +### Backslashes -```bash -node benchmark -``` +There is an important, notable difference between minimatch and micromatch _in regards to how backslashes are handled_ in glob patterns. -As of {%= date() %}: +- Micromatch exclusively and explicitly reserves backslashes for escaping characters in a glob pattern, even on windows. This is consistent with bash behavior. +- Minimatch converts all backslashes to forward slashes, which means you can't use backslashes to escape any characters in your glob patterns. -```bash -{%= docs("benchmark/last.md") %} -``` +We made this decision for micromatch for a couple of reasons: -## Tests +- consistency with bash conventions. +- glob patterns are not filepaths. They are a type of [regular language][regular-language] that is converted to a JavaScript regular expression. Thus, when forward slashes are defined in a glob pattern, the resulting regular expression will match windows or POSIX path separators just fine. -### Running tests -{%= include("tests") %} +**A note about joining paths to globs** -### Coverage -As of {%= date() %}: +Note that when you pass something like `path.join('foo', '*')` to micromatch, you are creating a filepath and expecting it to still work as a glob pattern. This causes problems on windows, since the `path.sep` is `\\`. -```sh -Statements : 100% (441/441) -Branches : 100% (270/270) -Functions : 100% (54/54) -Lines : 100% (429/429) -``` +In other words, since `\\` is reserved as an escape character in globs, on windows `path.join('foo', '*')` would result in `foo\\*`, which tells micromatch to match `*` as a literal character. This is the same behavior as bash. ## Contributing -{%= include("contributing") %} -Please be sure to run the benchmarks before/after any code changes to judge the impact before you do a PR. thanks! +All contributions are welcome! Please read [the contributing guide](.github/contributing.md) to get started. -## Related -{%= related(verb.related.list) %} +**Bug reports** -## Contributing -{%= include("contributing") %} +Please create an issue if you encounter a bug or matching behavior that doesn't seem correct. If you find a matching-related issue, please: -## Building docs -{%= include("build-docs") %} +- [research existing issues first](../../issues) (open and closed) +- visit the [GNU Bash documentation][bash] to see how Bash deals with the pattern +- visit the [minimatch][] documentation to cross-check expected behavior in node.js +- if all else fails, since there is no real specification for globs we will probably need to discuss expected behavior and decide how to resolve it. which means any detail you can provide to help with this discussion would be greatly appreciated. -## Running tests -{%= include("tests") %} +**Platform issues** -## Author -{%= include("author") %} +It's important to us that micromatch work consistently on all platforms. If you encounter any platform-specific matching or path related issues, please let us know (pull requests are also greatly appreciated). -## License -{%= copyright({linkify: true}) %} -{%= license %} +## Benchmarks -*** +### Running benchmarks -{%= include("footer") %} +Install dev dependencies: -{%= reflinks(verb.reflinks) %} +```bash +npm i -d && npm run benchmark +``` + +### Latest results +As of {%= date() %} (longer bars are better): + +```sh +{%= bench() %} +``` -[switch]: #switch-from-minimatch -[expand]: #expand -[character-classes]: http://www.regular-expressions.info/charclass.html +[regular-language]: https://en.wikipedia.org/wiki/Regular_language +[bash]: https://www.gnu.org/software/bash/manual/ +[charclass]: http://www.regular-expressions.info/charclass.html [extended]: http://mywiki.wooledge.org/BashGuide/Patterns#Extended_Globs +[brackets]: https://github.com/micromatch/expand-brackets +[braces]: https://github.com/micromatch/braces diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..6ba17ef9 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,37 @@ +## History + +### key + +Changelog entries are classified using the following labels _(from [keep-a-changelog][]_): + +- `added`: for new features +- `changed`: for changes in existing functionality +- `deprecated`: for once-stable features removed in upcoming releases +- `removed`: for deprecated features removed in this release +- `fixed`: for any bug fixes +- `bumped`: updated dependencies, only minor or higher will be listed. + +### [3.0.0] - 2017-04-11 + +TODO + +### [1.0.1] - 2016-12-12 + +**Added** + +- Support for windows path edge cases where backslashes are used in brackets or other unusual combinations. + +### [1.0.0] - 2016-12-12 + +Stable release. + +### [0.1.0] - 2016-10-08 + +First release. + + +[Unreleased]: https://github.com/jonschlinkert/micromatch/compare/0.1.0...HEAD +[0.2.0]: https://github.com/jonschlinkert/micromatch/compare/0.1.0...0.2.0 + +[keep-a-changelog]: https://github.com/olivierlacan/keep-a-changelog + diff --git a/LICENSE b/LICENSE index fa30c4cb..d734237b 100755 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ The MIT License (MIT) -Copyright (c) 2014-2015, Jon Schlinkert. +Copyright (c) 2014-2017, Jon Schlinkert Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index cf04fb9d..86ae723c 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,54 @@ -# micromatch [![NPM version](https://img.shields.io/npm/v/micromatch.svg?style=flat)](https://www.npmjs.com/package/micromatch) [![NPM downloads](https://img.shields.io/npm/dm/micromatch.svg?style=flat)](https://npmjs.org/package/micromatch) [![Build Status](https://travis-ci.org/micromatch/micromatch.svg?branch=master)](https://travis-ci.org/micromatch/micromatch) +# micromatch [![NPM version](https://img.shields.io/npm/v/micromatch.svg?style=flat)](https://www.npmjs.com/package/micromatch) [![NPM monthly downloads](https://img.shields.io/npm/dm/micromatch.svg?style=flat)](https://npmjs.org/package/micromatch) [![NPM total downloads](https://img.shields.io/npm/dt/micromatch.svg?style=flat)](https://npmjs.org/package/micromatch) [![Linux Build Status](https://img.shields.io/travis/micromatch/micromatch.svg?style=flat&label=Travis)](https://travis-ci.org/micromatch/micromatch) [![Windows Build Status](https://img.shields.io/appveyor/ci/micromatch/micromatch.svg?style=flat&label=AppVeyor)](https://ci.appveyor.com/project/micromatch/micromatch) > Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch. -Micromatch supports all of the same matching features as [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch). - -* [mm()](#usage) is the same as [multimatch()](https://github.com/sindresorhus/multimatch) -* [mm.match()](#match) is the same as [minimatch.match()](https://github.com/isaacs/minimatch) -* use [mm.isMatch()](#ismatch) instead of [minimatch()](https://github.com/isaacs/minimatch) +
+Table of Contents + +- [Install](#install) +- [Quickstart](#quickstart) +- [Why use micromatch?](#why-use-micromatch) + * [Matching features](#matching-features) +- [Switching to micromatch](#switching-to-micromatch) + * [From minimatch](#from-minimatch) + * [From multimatch](#from-multimatch) +- [API](#api) +- [Options](#options) + * [options.basename](#optionsbasename) + * [options.bash](#optionsbash) + * [options.cache](#optionscache) + * [options.dot](#optionsdot) + * [options.failglob](#optionsfailglob) + * [options.ignore](#optionsignore) + * [options.matchBase](#optionsmatchbase) + * [options.nobrace](#optionsnobrace) + * [options.nocase](#optionsnocase) + * [options.nodupes](#optionsnodupes) + * [options.noext](#optionsnoext) + * [options.nonegate](#optionsnonegate) + * [options.noglobstar](#optionsnoglobstar) + * [options.nonull](#optionsnonull) + * [options.nullglob](#optionsnullglob) + * [options.snapdragon](#optionssnapdragon) + * [options.sourcemap](#optionssourcemap) + * [options.unescape](#optionsunescape) + * [options.unixify](#optionsunixify) +- [Extended globbing](#extended-globbing) + * [extglobs](#extglobs) + * [braces](#braces) + * [regex character classes](#regex-character-classes) + * [regex groups](#regex-groups) + * [POSIX bracket expressions](#posix-bracket-expressions) +- [Notes](#notes) + * [Bash 4.3 parity](#bash-43-parity) + * [Backslashes](#backslashes) +- [Contributing](#contributing) +- [Benchmarks](#benchmarks) + * [Running benchmarks](#running-benchmarks) + * [Latest results](#latest-results) +- [About](#about) + +
## Install @@ -16,65 +58,75 @@ Install with [npm](https://www.npmjs.com/): $ npm install --save micromatch ``` -## Start matching! +## Quickstart ```js var mm = require('micromatch'); -console.log(mm([''])) +mm(list, patterns[, options]); ``` -*** +The [main export](#micromatch) takes a list of strings and one or more glob patterns: -### Features +```js +console.log(mm(['foo', 'bar', 'qux'], ['f*', 'b*'])); +//=> ['foo', 'bar'] +``` -* [Drop-in replacement](#switch-from-minimatch) for [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch) -* Built-in support for multiple glob patterns, like `['foo/*.js', '!bar.js']` -* [Brace Expansion](https://github.com/jonschlinkert/braces) (`foo/bar-{1..5}.md`, `one/{two,three}/four.md`) -* Typical glob patterns, like `**/*`, `a/b/*.js`, or `['foo/*.js', '!bar.js']` -* Methods like `.isMatch()`, `.contains()` and `.any()` +Use [.isMatch()](#ismatch) to get true/false: -**Extended globbing features:** +```js +console.log(mm.isMatch('foo', 'f*')); +//=> true +``` -* Logical `OR` (`foo/bar/(abc|xyz).js`) -* Regex character classes (`foo/bar/baz-[1-5].js`) -* POSIX [bracket expressions](https://github.com/jonschlinkert/expand-brackets) (`**/[[:alpha:][:digit:]]/`) -* [extglobs](https://github.com/jonschlinkert/extglob) (`**/+(x|y)`, `!(a|b)`, etc). +[Switching](#switching-to-micromatch) from minimatch and multimatch is easy! -You can combine these to create whatever matching patterns you need. +## Why use micromatch? -**Example** +> micromatch is a [drop-in replacement](#switching-to-micromatch) for minimatch and multimatch -```js -// double-negation! -mm(['fa', 'fb', 'f', 'fo'], '!(f!(o))'); -//=> ['fo'] -``` +* Supports all of the same matching features as [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch) +* Micromatch uses [snapdragon](https://github.com/jonschlinkert/snapdragon) for parsing and compiling globs, which provides granular control over the entire conversion process in a way that is easy to understand, reason about, and maintain. +* More accurate, with more than 36,000 [test assertions](./test) to prove it. +* More complete support for the Bash 4.3 specification than minimatch and multimatch. Micromatch passes _all of the spec tests_ from bash, including some that bash still fails. +* [Faster matching](#benchmarks), from a combination of optimized glob patterns, faster algorithms, and regex caching. +* [Micromatch is safer](https://github.com/micromatch/braces#braces-is-safe), and is not subject to DoS with brace patterns, like minimatch and multimatch. +* More reliable windows support than minimatch and multimatch. + +### Matching features + +* Support for multiple glob patterns (no need for wrappers like multimatch) +* Wildcards (`**`, `*.js`) +* Negation (`'!a/*.js'`, `'*!(b).js']`) +* [extglobs](https://github.com/jonschlinkert/extglob) (`+(x|y)`, `!(a|b)`) +* [POSIX character classes](https://github.com/micromatch/expand-brackets) (`[[:alpha:][:digit:]]`) +* [brace expansion](https://github.com/micromatch/braces) (`foo/{1..5}.md`, `bar/{a,b,c}.js`) +* regex character classes (`foo-[1-5].js`) +* regex logical "or" (`foo/(abc|xyz).js`) -## Why switch to micromatch? +You can mix and match these features to create whatever patterns you need! -* Native support for multiple glob patterns, no need for wrappers like [multimatch](https://github.com/sindresorhus/multimatch) -* [10-55x faster](#benchmarks) and more performant than [minimatch](https://github.com/isaacs/minimatch) and [multimatch](https://github.com/sindresorhus/multimatch). This is achieved through a combination of caching and regex optimization strategies, a fundamentally different approach than minimatch. -* More extensive support for the Bash 4.3 specification -* More complete extglob support -* Extensive [unit tests](./test) (approx. 1,300 tests). Minimatch fails many of the tests. +## Switching to micromatch -### Switch from minimatch +There is one notable difference between micromatch and minimatch in regards to how backslashes are handled. See [the notes about backslashes](#backslashes) for more information. -Use `mm.isMatch()` instead of `minimatch()`: +### From minimatch + +Use [mm.isMatch()](#ismatch) instead of `minimatch()`: ```js mm.isMatch('foo', 'b*'); //=> false ``` -Use `mm.match()` instead of `minimatch.match()`: +Use [mm.match()](#match) instead of `minimatch.match()`: ```js mm.match(['foo', 'bar'], 'b*'); //=> 'bar' ``` -### Switch from multimatch +### From multimatch Same signature: @@ -83,436 +135,733 @@ mm(['foo', 'bar', 'baz'], ['f*', '*z']); //=> ['foo', 'baz'] ``` -*** +## API -## Usage +### [micromatch](index.js#L41) -Add micromatch to your node.js project: +The main function takes a list of strings and one or more glob patterns to use for matching. + +**Params** + +* `list` **{Array}**: A list of strings to match +* `patterns` **{String|Array}**: One or more glob patterns to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Array}**: Returns an array of matches + +**Example** ```js var mm = require('micromatch'); +mm(list, patterns[, options]); + +console.log(mm(['a.js', 'a.txt'], ['*.js'])); +//=> [ 'a.js' ] ``` -**Signature** +### [.match](index.js#L107) -```js -mm(array_of_strings, glob_patterns[, options]); -``` +Similar to the main function, but `pattern` must be a string. + +**Params** + +* `list` **{Array}**: Array of strings to match +* `pattern` **{String}**: Glob pattern to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Array}**: Returns an array of matches **Example** ```js -mm(['foo', 'bar', 'baz'], 'b*'); -//=> ['bar', 'baz'] +var mm = require('micromatch'); +mm.match(list, pattern[, options]); + +console.log(mm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a')); +//=> ['a.a', 'a.aa'] ``` -### Usage examples +### [.isMatch](index.js#L168) + +Returns true if the specified `string` matches the given glob `pattern`. + +**Params** -**Brace expansion** +* `string` **{String}**: String to match +* `pattern` **{String}**: Glob pattern to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Boolean}**: Returns true if the string matches the glob pattern. -Match files with `.js` or `.txt` extensions. +**Example** ```js -mm(['a.js', 'b.md', 'c.txt'], '*.{js,txt}'); -//=> ['a.js', 'c.txt'] +var mm = require('micromatch'); +mm.isMatch(string, pattern[, options]); + +console.log(mm.isMatch('a.a', '*.a')); +//=> true +console.log(mm.isMatch('a.b', '*.a')); +//=> false ``` -**Extglobs** +### [.some](index.js#L206) -Match anything except for files with the `.md` extension. +Returns true if some of the strings in the given `list` match any of the given glob `patterns`. + +**Params** + +* `list` **{String|Array}**: The string or array of strings to test. Returns as soon as the first match is found. +* `patterns` **{String|Array}**: One or more glob patterns to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Boolean}**: Returns true if any patterns match `str` + +**Example** ```js -mm(files, '**/*.!(md)'); +var mm = require('micromatch'); +mm.some(list, patterns[, options]); -//=> ['a.js', 'c.txt'] +console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); +// true +console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); +// false ``` -**Multiple patterns** +### [.every](index.js#L242) + +Returns true if every string in the given `list` matches any of the given glob `patterns`. + +**Params** -Match using an array of patterns. +* `list` **{String|Array}**: The string or array of strings to test. +* `patterns` **{String|Array}**: One or more glob patterns to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Boolean}**: Returns true if any patterns match `str` + +**Example** ```js -mm(['a.md', 'b.js', 'c.txt', 'd.json'], ['*.md', '*.txt']); -//=> ['a.md', 'c.txt'] +var mm = require('micromatch'); +mm.every(list, patterns[, options]); + +console.log(mm.every('foo.js', ['foo.js'])); +// true +console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); +// true +console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); +// false +console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); +// false ``` -**Negation patterns:** +### [.any](index.js#L274) -Behavior is designed to be what users would expect, based on conventions that are already well-established. +Returns true if **any** of the given glob `patterns` match the specified `string`. -* [minimatch](https://github.com/isaacs/minimatch) behavior is used when the pattern is a string, so patterns are **inclusive by default**. -* [multimatch](https://github.com/sindresorhus/multimatch) behavior is used when an array of patterns is passed, so patterns are **exclusive by default**. +**Params** + +* `str` **{String|Array}**: The string to test. +* `patterns` **{String|Array}**: One or more glob patterns to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Boolean}**: Returns true if any patterns match `str` + +**Example** ```js -mm(['a.js', 'b.md', 'c.txt'], '!*.{js,txt}'); -//=> ['b.md'] +var mm = require('micromatch'); +mm.any(string, patterns[, options]); -mm(['a.md', 'b.js', 'c.txt', 'd.json'], ['*.*', '!*.{js,txt}']); -//=> ['a.md', 'd.json'] +console.log(mm.any('a.a', ['b.*', '*.a'])); +//=> true +console.log(mm.any('a.a', 'b.*')); +//=> false ``` -*** +### [.all](index.js#L322) + +Returns true if **all** of the given `patterns` match the specified string. + +**Params** -## API methods +* `str` **{String|Array}**: The string to test. +* `patterns` **{String|Array}**: One or more glob patterns to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Boolean}**: Returns true if any patterns match `str` + +**Example** ```js var mm = require('micromatch'); -``` +mm.all(string, patterns[, options]); -### .match +console.log(mm.all('foo.js', ['foo.js'])); +// true -```js -mm.match(array, globString); +console.log(mm.all('foo.js', ['*.js', '!foo.js'])); +// false + +console.log(mm.all('foo.js', ['*.js', 'foo.js'])); +// true + +console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); +// true ``` -Return an array of files that match the given glob pattern. Useful if you only need to use a single glob pattern. +### [.not](index.js#L354) + +Returns a list of strings that _**do not match any**_ of the given `patterns`. + +**Params** + +* `list` **{Array}**: Array of strings to match. +* `patterns` **{String|Array}**: One or more glob pattern to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Array}**: Returns an array of strings that **do not match** the given patterns. **Example** ```js -mm.match(['ab', 'a/b', 'bb', 'b/c'], '?b'); -//=> ['ab', 'bb'] +var mm = require('micromatch'); +mm.not(list, patterns[, options]); -mm.match(['ab', 'a/b', 'bb', 'b/c'], '*/b'); -//=> ['a/b'] +console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); +//=> ['b.b', 'c.c'] ``` -### .isMatch +### [.contains](index.js#L389) -```js -mm.isMatch(filepath, globString); -``` +Returns true if the given `string` contains the given pattern. Similar to [.isMatch](#isMatch) but the pattern can match any part of the string. -Returns true if a file path matches the given glob pattern. +**Params** + +* `str` **{String}**: The string to match. +* `patterns` **{String|Array}**: Glob pattern to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Boolean}**: Returns true if the patter matches any part of `str`. **Example** ```js -mm.isMatch('.verb.md', '*.md'); -//=> false +var mm = require('micromatch'); +mm.contains(string, pattern[, options]); -mm.isMatch('.verb.md', '*.md', {dot: true}); +console.log(mm.contains('aa/bb/cc', '*b')); //=> true +console.log(mm.contains('aa/bb/cc', '*d')); +//=> false ``` -### .contains +### [.matchKeys](index.js#L445) -Returns true if any part of a file path matches the given glob pattern. Think of this is "has path" versus "is path". +Filter the keys of the given object with the given `glob` pattern and `options`. Does not attempt to match nested keys. If you need this feature, use [glob-object](https://github.com/jonschlinkert/glob-object) instead. -**Example** +**Params** + +* `object` **{Object}**: The object with keys to filter. +* `patterns` **{String|Array}**: One or more glob patterns to use for matching. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed +* `returns` **{Object}**: Returns an object with only keys that match the given patterns. -`.isMatch()` would return false for both of the following: +**Example** ```js -mm.contains('a/b/c', 'a/b'); -//=> true +var mm = require('micromatch'); +mm.matchKeys(object, patterns[, options]); -mm.contains('a/b/c', 'a/*'); -//=> true +var obj = { aa: 'a', ab: 'b', ac: 'c' }; +console.log(mm.matchKeys(obj, '*b')); +//=> { ab: 'b' } ``` -### .matcher +### [.matcher](index.js#L474) -Returns a function for matching using the supplied pattern. e.g. create your own "matcher". The advantage of this method is that the pattern can be compiled outside of a loop. +Returns a memoized matcher function from the given glob `pattern` and `options`. The returned function takes a string to match as its only argument and returns true if the string is a match. -**Pattern** - -Can be any of the following: +**Params** -* `glob/string` -* `regex` -* `function` +* `pattern` **{String}**: Glob pattern +* `options` **{Object}**: See available [options](#options) for changing how matches are performed. +* `returns` **{Function}**: Returns a matcher function. **Example** ```js -var isMatch = mm.matcher('*.md'); -var files = []; +var mm = require('micromatch'); +mm.matcher(pattern[, options]); -['a.md', 'b.txt', 'c.md'].forEach(function(fp) { - if (isMatch(fp)) { - files.push(fp); - } -}); +var isMatch = mm.matcher('*.!(*a)'); +console.log(isMatch('a.a')); +//=> false +console.log(isMatch('a.b')); +//=> true ``` -### .filter +### [.makeRe](index.js#L542) -Returns a function that can be passed to `Array#filter()`. +Create a regular expression from the given glob `pattern`. **Params** -* `patterns` **{String|Array}**: - -**Examples** +* `pattern` **{String}**: A glob pattern to convert to regex. +* `options` **{Object}**: See available [options](#options) for changing how matches are performed. +* `returns` **{RegExp}**: Returns a regex created from the given pattern. -Single glob: +**Example** ```js -var fn = mm.filter('*.md'); -['a.js', 'b.txt', 'c.md'].filter(fn); -//=> ['c.md'] +var mm = require('micromatch'); +mm.makeRe(pattern[, options]); -var fn = mm.filter('[a-c]'); -['a', 'b', 'c', 'd', 'e'].filter(fn); -//=> ['a', 'b', 'c'] +console.log(mm.makeRe('*.js')); +//=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ ``` -Array of glob patterns: +### [.braces](index.js#L585) + +Expand the given brace `pattern`. + +**Params** + +* `pattern` **{String}**: String with brace pattern to expand. +* `options` **{Object}**: Any [options](#options) to change how expansion is performed. See the [braces](https://github.com/micromatch/braces) library for all available options. +* `returns` **{Array}** + +**Example** ```js -var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]; +var mm = require('micromatch'); +console.log(mm.braces('foo/{a,b}/bar')); +//=> ['foo/(a|b)/bar'] -var fn = mm.filter(['{1..10}', '![7-9]', '!{3..4}']); -arr.filter(fn); -//=> [1, 2, 5, 6, 10] +console.log(mm.braces('foo/{a,b}/bar', {expand: true})); +//=> ['foo/(a|b)/bar'] ``` -_(Internally this function generates the matching function by using the [matcher](#matcher) method. You can use the [matcher](#matcher) method directly to create your own filter function)_ +### [.create](index.js#L649) + +Parses the given glob `pattern` and returns an array of abstract syntax trees (ASTs), with the compiled `output` and optional source `map` on each AST. -### .any +**Params** -Returns true if a file path matches any of the given patterns. +* `pattern` **{String}**: Glob pattern to parse and compile. +* `options` **{Object}**: Any [options](#options) to change how parsing and compiling is performed. +* `returns` **{Object}**: Returns an object with the parsed AST, compiled string and optional source map. + +**Example** ```js -mm.any(filepath, patterns, options); +var mm = require('micromatch'); +mm.create(pattern[, options]); + +console.log(mm.create('abc/*.js')); +// [{ options: { source: 'string', sourcemap: true }, +// state: {}, +// compilers: +// { ... }, +// output: '(\\.[\\\\\\/])?abc\\/(?!\\.)(?=.)[^\\/]*?\\.js', +// ast: +// { type: 'root', +// errors: [], +// nodes: +// [ ... ], +// dot: false, +// input: 'abc/*.js' }, +// parsingErrors: [], +// map: +// { version: 3, +// sources: [ 'string' ], +// names: [], +// mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE', +// sourcesContent: [ 'abc/*.js' ] }, +// position: { line: 1, column: 28 }, +// content: {}, +// files: {}, +// idx: 6 }] ``` +### [.parse](index.js#L696) + +Parse the given `str` with the given `options`. + **Params** -* filepath `{String}`: The file path to test. -* patterns `{String|Array}`: One or more glob patterns -* options: `{Object}`: options to pass to the `.matcher()` method. +* `str` **{String}** +* `options` **{Object}** +* `returns` **{Object}**: Returns an AST **Example** ```js -mm.any('abc', ['!*z']); -//=> true -mm.any('abc', ['a*', 'z*']); -//=> true -mm.any('abc', 'a*'); -//=> true -mm.any('abc', ['z*']); -//=> false +var mm = require('micromatch'); +mm.parse(pattern[, options]); + +var ast = mm.parse('a/{b,c}/d'); +console.log(ast); +// { type: 'root', +// errors: [], +// input: 'a/{b,c}/d', +// nodes: +// [ { type: 'bos', val: '' }, +// { type: 'text', val: 'a/' }, +// { type: 'brace', +// nodes: +// [ { type: 'brace.open', val: '{' }, +// { type: 'text', val: 'b,c' }, +// { type: 'brace.close', val: '}' } ] }, +// { type: 'text', val: '/d' }, +// { type: 'eos', val: '' } ] } ``` -### .expand +### [.compile](index.js#L749) -Returns an object with a regex-compatible string and tokens. +Compile the given `ast` or string with the given `options`. -```js -mm.expand('*.js'); - -// when `track` is enabled (for debugging), the `history` array is used -// to record each mutation to the glob pattern as it's converted to regex -{ options: { track: false, dot: undefined, makeRe: true, negated: false }, - pattern: '(.*\\/|^)bar\\/(?:(?!(?:^|\\/)\\.).)*?', - history: [], - tokens: - { path: - { whole: '**/bar/**', - dirname: '**/bar/', - filename: '**', - basename: '**', - extname: '', - ext: '' }, - is: - { glob: true, - negated: false, - globstar: true, - dotfile: false, - dotdir: false }, - match: {}, - original: '**/bar/**', - pattern: '**/bar/**', - base: '' } } -``` - -### .makeRe - -Create a regular expression for matching file paths based on the given pattern: +**Params** + +* `ast` **{Object|String}** +* `options` **{Object}** +* `returns` **{Object}**: Returns an object that has an `output` property with the compiled string. + +**Example** ```js -mm.makeRe('*.js'); -//=> /^(?:(?!\.)(?=.)[^/]*?\.js)$/ +var mm = require('micromatch'); +mm.compile(ast[, options]); + +var ast = mm.parse('a/{b,c}/d'); +console.log(mm.compile(ast)); +// { options: { source: 'string' }, +// state: {}, +// compilers: +// { eos: [Function], +// noop: [Function], +// bos: [Function], +// brace: [Function], +// 'brace.open': [Function], +// text: [Function], +// 'brace.close': [Function] }, +// output: [ 'a/(b|c)/d' ], +// ast: +// { ... }, +// parsingErrors: [] } ``` -## Options +### [.clearCache](index.js#L770) -### options.unixify +Clear the regex cache. -Normalize slashes in file paths and glob patterns to forward slashes. +**Example** -Type: `{Boolean}` +```js +mm.clearCache(); +``` -Default: `undefined` on non-windows, `true` on windows. +## Options -### options.dot +* [basename](#optionsbasename) +* [bash](#optionsbash) +* [cache](#optionscache) +* [dot](#optionsdot) +* [failglob](#optionsfailglob) +* [ignore](#optionsignore) +* [matchBase](#optionsmatchBase) +* [nobrace](#optionsnobrace) +* [nocase](#optionsnocase) +* [nodupes](#optionsnodupes) +* [noext](#optionsnoext) +* [noglobstar](#optionsnoglobstar) +* [nonull](#optionsnonull) +* [nullglob](#optionsnullglob) +* [snapdragon](#optionssnapdragon) +* [sourcemap](#optionssourcemap) +* [unescape](#optionsunescape) +* [unixify](#optionsunixify) + +### options.basename + +Allow glob patterns without slashes to match a file path based on its basename. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `matchBase`. + +**Type**: `Boolean` + +**Default**: `false` -Match dotfiles. Same behavior as [minimatch](https://github.com/isaacs/minimatch). +**Example** -Type: `{Boolean}` +```js +mm(['a/b.js', 'a/c.md'], '*.js'); +//=> [] -Default: `false` +mm(['a/b.js', 'a/c.md'], '*.js', {matchBase: true}); +//=> ['a/b.js'] +``` -### options.unescape +### options.bash -Unescape slashes in glob patterns. Use cautiously, especially on windows. +Enabled by default, this option enforces bash-like behavior with stars immediately following a bracket expression. Bash bracket expressions are similar to regex character classes, but unlike regex, a star following a bracket expression **does not repeat the bracketed characters**. Instead, the star is treated the same as an other star. -Type: `{Boolean}` +**Type**: `Boolean` -Default: `undefined` +**Default**: `true` **Example** ```js -mm.isMatch('abc', '\\a\\b\\c', {unescape: true}); -//=> true +var files = ['abc', 'ajz']; +console.log(mm(files, '[a-c]*')); +//=> ['abc', 'ajz'] + +console.log(mm(files, '[a-c]*', {bash: false})); ``` +### options.cache + +Disable regex and function memoization. + +**Type**: `Boolean` + +**Default**: `undefined` + +### options.dot + +Match dotfiles. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `dot`. + +**Type**: `Boolean` + +**Default**: `false` + +### options.failglob + +Similar to the `--failglob` behavior in Bash, throws an error when no matches are found. + +**Type**: `Boolean` + +**Default**: `undefined` + +### options.ignore + +String or array of glob patterns to match files to ignore. + +**Type**: `String|Array` + +**Default**: `undefined` + +### options.matchBase + +Alias for [options.basename](#options-basename). + +### options.nobrace + +Disable expansion of brace patterns. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `nobrace`. + +**Type**: `Boolean` + +**Default**: `undefined` + +See [braces](https://github.com/micromatch/braces) for more information about extended brace expansion. + +### options.nocase + +Use a case-insensitive regex for matching files. Same behavior as [minimatch](https://github.com/isaacs/minimatch). + +**Type**: `Boolean` + +**Default**: `undefined` + ### options.nodupes Remove duplicate elements from the result array. -Type: `{Boolean}` +**Type**: `Boolean` -Default: `undefined` +**Default**: `undefined` **Example** Example of using the `unescape` and `nodupes` options together: ```js -mm.match(['abc', '\\a\\b\\c'], '\\a\\b\\c', {unescape: true}); -//=> ['abc', 'abc'] +mm.match(['a/b/c', 'a/b/c'], 'a/b/c'); +//=> ['a/b/c', 'a/b/c'] -mm.match(['abc', '\\a\\b\\c'], '\\a\\b\\c', {unescape: true, nodupes: true}); +mm.match(['a/b/c', 'a/b/c'], 'a/b/c', {nodupes: true}); //=> ['abc'] ``` -### options.matchBase +### options.noext -Allow glob patterns without slashes to match a file path based on its basename. . Same behavior as [minimatch](https://github.com/isaacs/minimatch). +Disable extglob support, so that extglobs are regarded as literal characters. -Type: `{Boolean}` +**Type**: `Boolean` -Default: `false` +**Default**: `undefined` -**Example** +**Examples** ```js -mm(['a/b.js', 'a/c.md'], '*.js'); -//=> [] +mm(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)'); +//=> ['a/b', 'a/!(z)'] -mm(['a/b.js', 'a/c.md'], '*.js', {matchBase: true}); -//=> ['a/b.js'] +mm(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)', {noext: true}); +//=> ['a/!(z)'] (matches only as literal characters) ``` -### options.nobraces +### options.nonegate -Don't expand braces in glob patterns. Same behavior as [minimatch](https://github.com/isaacs/minimatch) `nobrace`. +Disallow negation (`!`) patterns, and treat leading `!` as a literal character to match. -Type: `{Boolean}` +**Type**: `Boolean` -Default: `undefined` +**Default**: `undefined` -See [braces](https://github.com/jonschlinkert/braces) for more information about extended brace expansion. +### options.noglobstar -### options.nobrackets +Disable matching with globstars (`**`). -Don't expand POSIX bracket expressions. +**Type**: `Boolean` -Type: `{Boolean}` +**Default**: `undefined` -Default: `undefined` +```js +mm(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**'); +//=> ['a/b', 'a/b/c', 'a/b/c/d'] -See [expand-brackets](https://github.com/jonschlinkert/expand-brackets) for more information about extended bracket expressions. +mm(['a/b', 'a/b/c', 'a/b/c/d'], 'a/**', {noglobstar: true}); +//=> ['a/b'] +``` -### options.noextglob +### options.nonull -Don't expand extended globs. +Alias for [options.nullglob](#options-nullglob). -Type: `{Boolean}` +### options.nullglob -Default: `undefined` +If `true`, when no matches are found the actual (arrayified) glob pattern is returned instead of an empty array. Same behavior as [minimatch](https://github.com/isaacs/minimatch) option `nonull`. -See [extglob](https://github.com/jonschlinkert/extglob) for more information about extended globs. +**Type**: `Boolean` -### options.nocase +**Default**: `undefined` -Use a case-insensitive regex for matching files. Same behavior as [minimatch](https://github.com/isaacs/minimatch). +### options.snapdragon -Type: `{Boolean}` +Pass your own instance of [snapdragon](https://github.com/jonschlinkert/snapdragon), to customize parsers or compilers. -Default: `false` +**Type**: `Object` -### options.nonegate +**Default**: `undefined` -Disallow negation (`!`) patterns. +### options.sourcemap -Type: `{Boolean}` +Generate a source map by enabling the `sourcemap` option with the `.parse`, `.compile`, or `.create` methods. -Default: `false` +_(Note that sourcemaps are currently not enabled for brace patterns)_ -### options.nonull +**Examples** -If `true`, when no matches are found the actual (array-ified) glob pattern is returned instead of an empty array. Same behavior as [minimatch](https://github.com/isaacs/minimatch). +``` js +var mm = require('micromatch'); +var pattern = '*(*(of*(a)x)z)'; + +var res = mm.create('abc/*.js', {sourcemap: true}); +console.log(res.map); +// { version: 3, +// sources: [ 'string' ], +// names: [], +// mappings: 'AAAA,GAAG,EAAC,iBAAC,EAAC,EAAE', +// sourcesContent: [ 'abc/*.js' ] } + +var ast = mm.parse('abc/**/*.js'); +var res = mm.compile(ast, {sourcemap: true}); +console.log(res.map); +// { version: 3, +// sources: [ 'string' ], +// names: [], +// mappings: 'AAAA,GAAG,EAAC,2BAAE,EAAC,iBAAC,EAAC,EAAE', +// sourcesContent: [ 'abc/**/*.js' ] } + +var ast = mm.parse(pattern); +var res = mm.compile(ast, {sourcemap: true}); +console.log(res.map); +// { version: 3, +// sources: [ 'string' ], +// names: [], +// mappings: 'AAAA,CAAE,CAAE,EAAE,CAAE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC', +// sourcesContent: [ '*(*(of*(a)x)z)' ] } +``` -Type: `{Boolean}` +### options.unescape -Default: `false` +Remove backslashes from returned matches. -### options.cache +**Type**: `Boolean` -Cache the platform (e.g. `win32`) to prevent this from being looked up for every filepath. +**Default**: `undefined` -Type: `{Boolean}` +**Example** -Default: `true` +In this example we want to match a literal `*`: -*** +```js +mm.match(['abc', 'a\\*c'], 'a\\*c'); +//=> ['a\\*c'] + +mm.match(['abc', 'a\\*c'], 'a\\*c', {unescape: true}); +//=> ['a*c'] +``` + +### options.unixify + +Convert path separators on returned files to posix/unix-style forward slashes. -## Other features +**Type**: `Boolean` + +**Default**: `true` on windows, `false` everywhere else + +**Example** + +```js +mm.match(['a\\b\\c'], 'a/**'); +//=> ['a/b/c'] + +mm.match(['a\\b\\c'], {unixify: false}); +//=> ['a\\b\\c'] +``` -Micromatch also supports the following. +## Extended globbing -### Extended globbing +Micromatch also supports extended globbing features. -#### extglobs +### extglobs Extended globbing, as described by the bash man page: | **pattern** | **regex equivalent** | **description** | | --- | --- | --- | -| `?(pattern-list)` | `(... | ...)?` | Matches zero or one occurrence of the given patterns | -| `*(pattern-list)` | `(... | ...)*` | Matches zero or more occurrences of the given patterns | -| `+(pattern-list)` | `(... | ...)+` | Matches one or more occurrences of the given patterns | -| `@(pattern-list)` | `(... | ...)` * | Matches one of the given patterns | -| `!(pattern-list)` | N/A | Matches anything except one of the given patterns | +| `?(pattern)` | `(pattern)?` | Matches zero or one occurrence of the given patterns | +| `*(pattern)` | `(pattern)*` | Matches zero or more occurrences of the given patterns | +| `+(pattern)` | `(pattern)+` | Matches one or more occurrences of the given patterns | +| `@(pattern)` | `(pattern)` * | Matches one of the given patterns | +| `!(pattern)` | N/A (equivalent regex is much more complicated) | Matches anything except one of the given patterns | -* `@` isn't a RegEx character. +* Note that `@` isn't a RegEx character. Powered by [extglob](https://github.com/jonschlinkert/extglob). Visit that library for the full range of options or to report extglob related issues. -See [extglob](https://github.com/jonschlinkert/extglob) for more information about extended globs. +### braces -#### brace expansion +Brace patterns can be used to match specific ranges or sets of characters. For example, the pattern `*/{1..3}/*` would match any of following strings: -In simple cases, brace expansion appears to work the same way as the logical `OR` operator. For example, `(a|b)` will achieve the same result as `{a,b}`. - -Here are some powerful features unique to brace expansion (versus character classes): - -* range expansion: `a{1..3}b/*.js` expands to: `['a1b/*.js', 'a2b/*.js', 'a3b/*.js']` -* nesting: `a{c,{d,e}}b/*.js` expands to: `['acb/*.js', 'adb/*.js', 'aeb/*.js']` - -Visit [braces](https://github.com/jonschlinkert/braces) to ask questions and create an issue related to brace-expansion, or to see the full range of features and options related to brace expansion. +``` +foo/1/bar +foo/2/bar +foo/3/bar +baz/1/qux +baz/2/qux +baz/3/qux +``` -#### regex character classes +Visit [braces](https://github.com/micromatch/braces) to see the full range of features and options related to brace expansion, or to create brace matching or expansion related issues. -With the exception of brace expansion (`{a,b}`, `{1..5}`, etc), most of the special characters convert directly to regex, so you can expect them to follow the same rules and produce the same results as regex. +### regex character classes -For example, given the list: `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: +Given the list: `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: * `[ac].js`: matches both `a` and `c`, returning `['a.js', 'c.js']` * `[b-d].js`: matches from `b` to `d`, returning `['b.js', 'c.js', 'd.js']` @@ -521,7 +870,7 @@ For example, given the list: `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: Learn about [regex character classes](http://www.regular-expressions.info/charclass.html). -#### regex groups +### regex groups Given `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: @@ -529,161 +878,198 @@ Given `['a.js', 'b.js', 'c.js', 'd.js', 'E.js']`: * `(b|d).js`: would match either `b` or `d`, returning `['b.js', 'd.js']` * `(b|[A-Z]).js`: would match either `b` or an uppercase letter, returning `['b.js', 'E.js']` -As with regex, parenthese can be nested, so patterns like `((a|b)|c)/b` will work. But it might be easier to achieve your goal using brace expansion. +As with regex, parens can be nested, so patterns like `((a|b)|c)/b` will work. Although brace expansion might be friendlier to use, depending on preference. + +### POSIX bracket expressions -#### POSIX bracket expressions +POSIX brackets are intended to be more user-friendly than regex character classes. This of course is in the eye of the beholder. **Example** ```js mm.isMatch('a1', '[[:alpha:][:digit:]]'); //=> true + +mm.isMatch('a1', '[[:alpha:][:alpha:]]'); +//=> false ``` -See [expand-brackets](https://github.com/jonschlinkert/expand-brackets) for more information about extended bracket expressions. +See [expand-brackets](https://github.com/jonschlinkert/expand-brackets) for more information about bracket expressions. *** ## Notes -Whenever possible parsing behavior for patterns is based on globbing specifications in Bash 4.3. Patterns that aren't described by Bash follow wildmatch spec (used by git). +### Bash 4.3 parity -## Benchmarks +Whenever possible matching behavior is based on behavior Bash 4.3, which is mostly consistent with minimatch. -Run the [benchmarks](./benchmark): +However, it's suprising how many edge cases and rabbit holes there are with glob matching, and since there is no real glob specification, and micromatch is more accurate than both Bash and minimatch, there are cases where best-guesses were made for behavior. In a few cases where Bash had no answers, we used wildmatch (used by git) as a fallback. -```bash -node benchmark -``` +### Backslashes -As of July 15, 2016: +There is an important, notable difference between minimatch and micromatch _in regards to how backslashes are handled_ in glob patterns. -```bash -#1: basename-braces - micromatch x 26,420 ops/sec ±0.89% (91 runs sampled) - minimatch x 3,507 ops/sec ±0.64% (97 runs sampled) +* Micromatch exclusively and explicitly reserves backslashes for escaping characters in a glob pattern, even on windows. This is consistent with bash behavior. +* Minimatch converts all backslashes to forward slashes, which means you can't use backslashes to escape any characters in your glob patterns. -#2: basename - micromatch x 25,315 ops/sec ±0.82% (93 runs sampled) - minimatch x 4,398 ops/sec ±0.86% (94 runs sampled) +We made this decision for micromatch for a couple of reasons: -#3: braces-no-glob - micromatch x 341,254 ops/sec ±0.78% (93 runs sampled) - minimatch x 30,197 ops/sec ±1.12% (91 runs sampled) +* consistency with bash conventions. +* glob patterns are not filepaths. They are a type of [regular language](https://en.wikipedia.org/wiki/Regular_language) that is converted to a JavaScript regular expression. Thus, when forward slashes are defined in a glob pattern, the resulting regular expression will match windows or POSIX path separators just fine. -#4: braces - micromatch x 54,649 ops/sec ±0.74% (94 runs sampled) - minimatch x 3,095 ops/sec ±0.82% (95 runs sampled) +**A note about joining paths to globs** -#5: immediate - micromatch x 16,719 ops/sec ±0.79% (95 runs sampled) - minimatch x 4,348 ops/sec ±0.86% (96 runs sampled) +Note that when you pass something like `path.join('foo', '*')` to micromatch, you are creating a filepath and expecting it to still work as a glob pattern. This causes problems on windows, since the `path.sep` is `\\`. -#6: large - micromatch x 721 ops/sec ±0.77% (94 runs sampled) - minimatch x 17.73 ops/sec ±1.08% (50 runs sampled) +In other words, since `\\` is reserved as an escape character in globs, on windows `path.join('foo', '*')` would result in `foo\\*`, which tells micromatch to match `*` as a literal character. This is the same behavior as bash. -#7: long - micromatch x 5,051 ops/sec ±0.87% (97 runs sampled) - minimatch x 628 ops/sec ±0.83% (94 runs sampled) +## Contributing -#8: mid - micromatch x 51,280 ops/sec ±0.80% (95 runs sampled) - minimatch x 1,923 ops/sec ±0.84% (95 runs sampled) +All contributions are welcome! Please read [the contributing guide](.github/contributing.md) to get started. -#9: multi-patterns - micromatch x 22,440 ops/sec ±0.97% (94 runs sampled) - minimatch x 2,481 ops/sec ±1.10% (94 runs sampled) +**Bug reports** -#10: no-glob - micromatch x 722,823 ops/sec ±1.30% (87 runs sampled) - minimatch x 52,967 ops/sec ±1.09% (94 runs sampled) +Please create an issue if you encounter a bug or matching behavior that doesn't seem correct. If you find a matching-related issue, please: -#11: range - micromatch x 243,471 ops/sec ±0.79% (94 runs sampled) - minimatch x 11,736 ops/sec ±0.82% (96 runs sampled) +* [research existing issues first](../../issues) (open and closed) +* visit the [GNU Bash documentation](https://www.gnu.org/software/bash/manual/) to see how Bash deals with the pattern +* visit the [minimatch](https://github.com/isaacs/minimatch) documentation to cross-check expected behavior in node.js +* if all else fails, since there is no real specification for globs we will probably need to discuss expected behavior and decide how to resolve it. which means any detail you can provide to help with this discussion would be greatly appreciated. -#12: shallow - micromatch x 190,874 ops/sec ±0.98% (95 runs sampled) - minimatch x 21,699 ops/sec ±0.81% (97 runs sampled) +**Platform issues** -#13: short - micromatch x 496,393 ops/sec ±3.86% (90 runs sampled) - minimatch x 53,765 ops/sec ±0.75% (95 runs sampled) -``` +It's important to us that micromatch work consistently on all platforms. If you encounter any platform-specific matching or path related issues, please let us know (pull requests are also greatly appreciated). -## Tests +## Benchmarks -### Running tests +### Running benchmarks Install dev dependencies: -```sh -$ npm install -d && npm test +```bash +npm i -d && npm run benchmark ``` -### Coverage +### Latest results -As of July 15, 2016: +As of May 29, 2017 (longer bars are better): ```sh -Statements : 100% (441/441) -Branches : 100% (270/270) -Functions : 100% (54/54) -Lines : 100% (429/429) -``` +# braces-globstar-large-list +micromatch ██████████████████████████████████████████████████████████████████████ (595 ops/sec) +minimatch █ (13.95 ops/sec) +multimatch █ (14.09 ops/sec) + +# braces-multiple +micromatch ██████████████████████████████████████████████████████████████████████ (48,362 ops/sec) +minimatch (2.18 ops/sec) +multimatch (2.15 ops/sec) + +# braces-range +micromatch ██████████████████████████████████████████████████████████████████████ (187,481 ops/sec) +minimatch ████ (12,366 ops/sec) +multimatch ████ (11,841 ops/sec) + +# braces-set +micromatch ██████████████████████████████████████████████████████████████████████ (24,344 ops/sec) +minimatch ██████ (2,255 ops/sec) +multimatch ██████ (2,199 ops/sec) + +# globstar-large-list +micromatch ██████████████████████████████████████████████████████████████████████ (561 ops/sec) +minimatch ███ (25.43 ops/sec) +multimatch ███ (25.27 ops/sec) + +# globstar-long-list +micromatch ██████████████████████████████████████████████████████████████████████ (3,257 ops/sec) +minimatch ██████████ (485 ops/sec) +multimatch ██████████ (485 ops/sec) + +# globstar-short-list +micromatch ██████████████████████████████████████████████████████████████████████ (359,991 ops/sec) +minimatch ████████ (44,763 ops/sec) +multimatch ███████ (39,977 ops/sec) + +# no-glob +micromatch ██████████████████████████████████████████████████████████████████████ (443,740 ops/sec) +minimatch ██████ (44,152 ops/sec) +multimatch ██████ (41,077 ops/sec) + +# star-basename +micromatch ██████████████████████████████████████████████████████████████████████ (10,286 ops/sec) +minimatch ████████████████████ (3,059 ops/sec) +multimatch █████████████████████ (3,129 ops/sec) + +# star +micromatch ██████████████████████████████████████████████████████████████████████ (9,756 ops/sec) +minimatch █████████████████████ (2,978 ops/sec) +multimatch █████████████████████ (2,970 ops/sec) -## Contributing - -Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). +``` -Please be sure to run the benchmarks before/after any code changes to judge the impact before you do a PR. thanks! +## About -## Related +### Related projects -* [braces](https://www.npmjs.com/package/braces): Fastest brace expansion for node.js, with the most complete support for the Bash 4.3 braces… [more](https://github.com/jonschlinkert/braces) | [homepage](https://github.com/jonschlinkert/braces "Fastest brace expansion for node.js, with the most complete support for the Bash 4.3 braces specification.") +* [braces](https://www.npmjs.com/package/braces): Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support… [more](https://github.com/micromatch/braces) | [homepage](https://github.com/micromatch/braces "Bash-like brace expansion, implemented in JavaScript. Safer than other brace expansion libs, with complete support for the Bash 4.3 braces specification, without sacrificing speed.") * [expand-brackets](https://www.npmjs.com/package/expand-brackets): Expand POSIX bracket expressions (character classes) in glob patterns. | [homepage](https://github.com/jonschlinkert/expand-brackets "Expand POSIX bracket expressions (character classes) in glob patterns.") -* [expand-range](https://www.npmjs.com/package/expand-range): Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. See… [more](https://github.com/jonschlinkert/expand-range) | [homepage](https://github.com/jonschlinkert/expand-range "Fast, bash-like range expansion. Expand a range of numbers or letters, uppercase or lowercase. See the benchmarks. Used by micromatch.") -* [extglob](https://www.npmjs.com/package/extglob): Convert extended globs to regex-compatible strings. Add (almost) the expressive power of regular expressions to… [more](https://github.com/jonschlinkert/extglob) | [homepage](https://github.com/jonschlinkert/extglob "Convert extended globs to regex-compatible strings. Add (almost) the expressive power of regular expressions to glob patterns.") -* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or multiplier to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or multiplier to use.") -* [gulp-micromatch](https://www.npmjs.com/package/gulp-micromatch): Filter vinyl files with glob patterns, string, regexp, array, object or matcher function. micromatch stream. | [homepage](https://github.com/tunnckocore/gulp-micromatch#readme "Filter vinyl files with glob patterns, string, regexp, array, object or matcher function. micromatch stream.") -* [is-glob](https://www.npmjs.com/package/is-glob): Returns `true` if the given string looks like a glob pattern or an extglob pattern… [more](https://github.com/jonschlinkert/is-glob) | [homepage](https://github.com/jonschlinkert/is-glob "Returns `true` if the given string looks like a glob pattern or an extglob pattern. This makes it easy to create code that only uses external modules like node-glob when necessary, resulting in much faster code execution and initialization time, and a bet") -* [parse-glob](https://www.npmjs.com/package/parse-glob): Parse a glob pattern into an object of tokens. | [homepage](https://github.com/jonschlinkert/parse-glob "Parse a glob pattern into an object of tokens.") +* [extglob](https://www.npmjs.com/package/extglob): Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob… [more](https://github.com/jonschlinkert/extglob) | [homepage](https://github.com/jonschlinkert/extglob "Extended glob support for JavaScript. Adds (almost) the expressive power of regular expressions to glob patterns.") +* [fill-range](https://www.npmjs.com/package/fill-range): Fill in a range of numbers or letters, optionally passing an increment or `step` to… [more](https://github.com/jonschlinkert/fill-range) | [homepage](https://github.com/jonschlinkert/fill-range "Fill in a range of numbers or letters, optionally passing an increment or `step` to use, or create a regex-compatible range with `options.toRegex`") +* [nanomatch](https://www.npmjs.com/package/nanomatch): Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash… [more](https://github.com/jonschlinkert/nanomatch) | [homepage](https://github.com/jonschlinkert/nanomatch "Fast, minimal glob matcher for node.js. Similar to micromatch, minimatch and multimatch, but complete Bash 4.3 wildcard support only (no support for exglobs, posix brackets or braces)") -## Contributing +### Contributing Pull requests and stars are always welcome. For bugs and feature requests, [please create an issue](../../issues/new). -## Building docs +Please read the [contributing guide](.github/contributing.md) for advice on opening issues, pull requests, and coding standards. + +### Contributors + +| **Commits** | **Contributor** | +| --- | --- | +| 346 | [jonschlinkert](https://github.com/jonschlinkert) | +| 12 | [es128](https://github.com/es128) | +| 3 | [paulmillr](https://github.com/paulmillr) | +| 2 | [TrySound](https://github.com/TrySound) | +| 2 | [doowb](https://github.com/doowb) | +| 2 | [MartinKolarik](https://github.com/MartinKolarik) | +| 2 | [tunnckoCore](https://github.com/tunnckoCore) | +| 1 | [amilajack](https://github.com/amilajack) | +| 1 | [DianeLooney](https://github.com/DianeLooney) | +| 1 | [UltCombo](https://github.com/UltCombo) | +| 1 | [tomByrer](https://github.com/tomByrer) | -_(This document was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme) (a [verb](https://github.com/verbose/verb) generator), please don't edit the readme directly. Any changes to the readme must be made in [.verb.md](.verb.md).)_ +### Building docs -To generate the readme and API documentation with [verb](https://github.com/verbose/verb): +_(This project's readme.md is generated by [verb](https://github.com/verbose/verb-generate-readme), please don't edit the readme directly. Any changes to the readme must be made in the [.verb.md](.verb.md) readme template.)_ + +To generate the readme, run the following command: ```sh -$ npm install -g verb verb-generate-readme && verb +$ npm install -g verbose/verb#dev verb-generate-readme && verb ``` -## Running tests +### Running tests -Install dev dependencies: +Running and reviewing unit tests is a great way to get familiarized with a library and its API. You can install dependencies and run tests with the following command: ```sh -$ npm install -d && npm test +$ npm install && npm test ``` -## Author +### Author **Jon Schlinkert** * [github/jonschlinkert](https://github.com/jonschlinkert) -* [twitter/jonschlinkert](http://twitter.com/jonschlinkert) +* [twitter/jonschlinkert](https://twitter.com/jonschlinkert) -## License +### License -Copyright © 2016, [Jon Schlinkert](https://github.com/jonschlinkert). -Released under the [MIT license](https://github.com/jonschlinkert/micromatch/blob/master/LICENSE). +Copyright © 2017, [Jon Schlinkert](https://github.com/jonschlinkert). +Released under the [MIT License](LICENSE). *** -_This file was generated by [verb](https://github.com/verbose/verb), v0.9.0, on July 15, 2016._ \ No newline at end of file +_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.6.0, on May 29, 2017._ \ No newline at end of file diff --git a/appveyor.yml b/appveyor.yml new file mode 100644 index 00000000..ad16679b --- /dev/null +++ b/appveyor.yml @@ -0,0 +1,28 @@ +# Test against this version of Node.js +environment: + matrix: + # node.js + - nodejs_version: "7.0" + - nodejs_version: "6.0" + - nodejs_version: "5.0" + - nodejs_version: "4.0" + - nodejs_version: "0.12" + - nodejs_version: "0.10" + +# Install scripts. (runs after repo cloning) +install: + # Get the latest stable version of Node.js or io.js + - ps: Install-Product node $env:nodejs_version + # install modules + - npm install + +# Post-install test scripts. +test_script: + # Output useful info for debugging. + - node --version + - npm --version + # run tests + - npm test + +# Don't actually build. +build: off diff --git a/benchmark/check.js b/benchmark/check.js deleted file mode 100644 index 7fbb2b17..00000000 --- a/benchmark/check.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -var fs = require('fs'); -var chalk = require('chalk'); -var path = require('path'); -var mm = require('..'); - -/** - * Sanity check. run to ensure that all fns return a correct - * result. - */ - -fs.readdirSync(__dirname + '/code').forEach(function (fp) { - if (mm.isMatch(fp, 'micromatch.js')) { - var fn = require(path.resolve(__dirname, 'code', fp)); - var name = path.basename(fp, path.extname(fp)); - - fs.readdirSync(__dirname + '/fixtures').forEach(function (fixture) { - if (mm.isMatch(fixture, 'large.js')) { - fixture = path.resolve(__dirname, 'fixtures', fixture); - console.log(chalk.bold(name) + ':', fn.apply(null, require(fixture))); - } - }); - } -}); diff --git a/benchmark/code/isMatch/micromatch.js b/benchmark/code/isMatch/micromatch.js new file mode 100644 index 00000000..34ddb370 --- /dev/null +++ b/benchmark/code/isMatch/micromatch.js @@ -0,0 +1,5 @@ +var micromatch = require('../../..'); + +module.exports = function(file, pattern) { + return micromatch.isMatch(file, pattern); +}; diff --git a/benchmark/code/isMatch/minimatch.js b/benchmark/code/isMatch/minimatch.js new file mode 100644 index 00000000..85bd523f --- /dev/null +++ b/benchmark/code/isMatch/minimatch.js @@ -0,0 +1,5 @@ +var minimatch = require('minimatch'); + +module.exports = function(file, pattern) { + return minimatch(file, pattern); +}; diff --git a/benchmark/code/match/micromatch.js b/benchmark/code/match/micromatch.js new file mode 100644 index 00000000..84a26f6c --- /dev/null +++ b/benchmark/code/match/micromatch.js @@ -0,0 +1,5 @@ +var micromatch = require('../../..'); + +module.exports = function(files, pattern) { + return micromatch.match(files, pattern); +}; diff --git a/benchmark/code/match/minimatch.js b/benchmark/code/match/minimatch.js new file mode 100644 index 00000000..f4e5ee43 --- /dev/null +++ b/benchmark/code/match/minimatch.js @@ -0,0 +1,5 @@ +var minimatch = require('minimatch'); + +module.exports = function(files, pattern) { + return minimatch.match(files, pattern); +}; diff --git a/benchmark/code/match/multimatch.js b/benchmark/code/match/multimatch.js new file mode 100644 index 00000000..e7a5d6d7 --- /dev/null +++ b/benchmark/code/match/multimatch.js @@ -0,0 +1,5 @@ +var multimatch = require('multimatch'); + +module.exports = function(files, pattern) { + return multimatch(files, pattern); +}; diff --git a/benchmark/code/micromatch.js b/benchmark/code/micromatch.js deleted file mode 100755 index 0f85e827..00000000 --- a/benchmark/code/micromatch.js +++ /dev/null @@ -1,3 +0,0 @@ -'use strict'; - -module.exports = require('../..'); \ No newline at end of file diff --git a/benchmark/code/minimatch.js b/benchmark/code/minimatch.js deleted file mode 100755 index 41be0976..00000000 --- a/benchmark/code/minimatch.js +++ /dev/null @@ -1,12 +0,0 @@ -'use strict'; - - -var minimatch = require('minimatch').match; -var multimatch = require('multimatch'); - -module.exports = function (files, patterns, options) { - if (Array.isArray(patterns)) { - return multimatch(files, patterns, options); - } - return minimatch(files, patterns, options); -}; \ No newline at end of file diff --git a/benchmark/fixtures/isMatch/basename.js b/benchmark/fixtures/isMatch/basename.js new file mode 100644 index 00000000..dfa21c58 --- /dev/null +++ b/benchmark/fixtures/isMatch/basename.js @@ -0,0 +1 @@ +module.exports = ["abc.txt", "c*3.txt"]; \ No newline at end of file diff --git a/benchmark/fixtures/isMatch/star.js b/benchmark/fixtures/isMatch/star.js new file mode 100644 index 00000000..a4a46bee --- /dev/null +++ b/benchmark/fixtures/isMatch/star.js @@ -0,0 +1 @@ +module.exports = ["abc.txt", "*"]; \ No newline at end of file diff --git a/benchmark/fixtures/large.js b/benchmark/fixtures/match/braces-globstar-large-list.js similarity index 100% rename from benchmark/fixtures/large.js rename to benchmark/fixtures/match/braces-globstar-large-list.js diff --git a/benchmark/fixtures/match/braces-multiple.js b/benchmark/fixtures/match/braces-multiple.js new file mode 100644 index 00000000..a35ef5a6 --- /dev/null +++ b/benchmark/fixtures/match/braces-multiple.js @@ -0,0 +1,167 @@ +module.exports = [ + [ + "a/g-0001.txt", + "b/g-0001.txt", + "c/g-0001.txt", + "a/h-0001.txt", + "b/h-0001.txt", + "c/h-0001.txt", + "a/i-0001.txt", + "b/i-0001.txt", + "c/i-0001.txt", + "a/g-0200.txt", + "b/g-0200.txt", + "c/g-0200.txt", + "a/h-0200.txt", + "b/h-0200.txt", + "c/h-0200.txt", + "a/i-0200.txt", + "b/i-0200.txt", + "c/i-0200.txt", + "a/g-3000.txt", + "b/g-3000.txt", + "c/g-3000.txt", + "a/h-3000.txt", + "b/h-3000.txt", + "c/h-3000.txt", + "a/i-3000.txt", + "b/i-3000.txt", + "c/i-3000.txt", + "a/g-0001.js", + "b/g-0001.js", + "c/g-0001.js", + "a/h-0001.js", + "b/h-0001.js", + "c/h-0001.js", + "a/i-0001.js", + "b/i-0001.js", + "c/i-0001.js", + "a/g-0200.js", + "b/g-0200.js", + "c/g-0200.js", + "a/h-0200.js", + "b/h-0200.js", + "c/h-0200.js", + "a/i-0200.js", + "b/i-0200.js", + "c/i-0200.js", + "a/g-3000.js", + "b/g-3000.js", + "c/g-3000.js", + "a/h-3000.js", + "b/h-3000.js", + "c/h-3000.js", + "a/i-3000.js", + "b/i-3000.js", + "c/i-3000.js", + "a/g-0001.md", + "b/g-0001.md", + "c/g-0001.md", + "a/h-0001.md", + "b/h-0001.md", + "c/h-0001.md", + "a/i-0001.md", + "b/i-0001.md", + "c/i-0001.md", + "a/g-0200.md", + "b/g-0200.md", + "c/g-0200.md", + "a/h-0200.md", + "b/h-0200.md", + "c/h-0200.md", + "a/i-0200.md", + "b/i-0200.md", + "c/i-0200.md", + "a/g-3000.md", + "b/g-3000.md", + "c/g-3000.md", + "a/h-3000.md", + "b/h-3000.md", + "c/h-3000.md", + "a/i-3000.md", + "b/i-3000.md", + "c/i-3000.md", + "a/g-0001.hbs", + "b/g-0001.hbs", + "c/g-0001.hbs", + "a/h-0001.hbs", + "b/h-0001.hbs", + "c/h-0001.hbs", + "a/i-0001.hbs", + "b/i-0001.hbs", + "c/i-0001.hbs", + "a/g-0200.hbs", + "b/g-0200.hbs", + "c/g-0200.hbs", + "a/h-0200.hbs", + "b/h-0200.hbs", + "c/h-0200.hbs", + "a/i-0200.hbs", + "b/i-0200.hbs", + "c/i-0200.hbs", + "a/g-3000.hbs", + "b/g-3000.hbs", + "c/g-3000.hbs", + "a/h-3000.hbs", + "b/h-3000.hbs", + "c/h-3000.hbs", + "a/i-3000.hbs", + "b/i-3000.hbs", + "c/i-3000.hbs", + "a/g-0001.json", + "b/g-0001.json", + "c/g-0001.json", + "a/h-0001.json", + "b/h-0001.json", + "c/h-0001.json", + "a/i-0001.json", + "b/i-0001.json", + "c/i-0001.json", + "a/g-0200.json", + "b/g-0200.json", + "c/g-0200.json", + "a/h-0200.json", + "b/h-0200.json", + "c/h-0200.json", + "a/i-0200.json", + "b/i-0200.json", + "c/i-0200.json", + "a/g-3000.json", + "b/g-3000.json", + "c/g-3000.json", + "a/h-3000.json", + "b/h-3000.json", + "c/h-3000.json", + "a/i-3000.json", + "b/i-3000.json", + "c/i-3000.json", + "a/g-0001.coffee", + "b/g-0001.coffee", + "c/g-0001.coffee", + "a/h-0001.coffee", + "b/h-0001.coffee", + "c/h-0001.coffee", + "a/i-0001.coffee", + "b/i-0001.coffee", + "c/i-0001.coffee", + "a/g-0200.coffee", + "b/g-0200.coffee", + "c/g-0200.coffee", + "a/h-0200.coffee", + "b/h-0200.coffee", + "c/h-0200.coffee", + "a/i-0200.coffee", + "b/i-0200.coffee", + "c/i-0200.coffee", + "a/g-3000.coffee", + "b/g-3000.coffee", + "c/g-3000.coffee", + "a/h-3000.coffee", + "b/h-3000.coffee", + "c/h-3000.coffee", + "a/i-3000.coffee", + "b/i-3000.coffee", + "c/i-3000.coffee" + ], + "{a..c}/{g..i}-{0001..3000}.{md,js}" +]; \ No newline at end of file diff --git a/benchmark/fixtures/range.js b/benchmark/fixtures/match/braces-range.js similarity index 100% rename from benchmark/fixtures/range.js rename to benchmark/fixtures/match/braces-range.js diff --git a/benchmark/fixtures/braces.js b/benchmark/fixtures/match/braces-set.js similarity index 100% rename from benchmark/fixtures/braces.js rename to benchmark/fixtures/match/braces-set.js diff --git a/benchmark/fixtures/match/globstar-large-list.js b/benchmark/fixtures/match/globstar-large-list.js new file mode 100644 index 00000000..e63d8818 --- /dev/null +++ b/benchmark/fixtures/match/globstar-large-list.js @@ -0,0 +1,7925 @@ +module.exports = [ + [ + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.js", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.js", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.js", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.md", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.md", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.md", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.txt", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.txt", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.txt", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa01.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa01.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa01.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob01.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob01.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob01.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc01.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc01.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc01.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa02.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa02.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa02.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob02.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob02.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob02.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc02.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc02.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc02.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa03.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa03.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa03.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob03.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob03.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob03.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc03.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc03.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc03.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa04.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa04.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa04.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob04.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob04.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob04.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc04.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc04.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc04.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa05.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa05.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa05.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob05.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob05.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob05.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc05.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc05.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc05.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa06.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa06.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa06.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob06.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob06.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob06.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc06.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc06.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc06.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa07.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa07.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa07.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob07.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob07.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob07.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc07.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc07.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc07.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa08.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa08.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa08.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob08.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob08.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob08.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc08.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc08.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc08.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa09.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa09.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa09.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob09.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob09.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob09.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc09.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc09.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc09.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooa10.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooa10.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooa10.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/foob10.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/foob10.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/foob10.hbs", + "a/b/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/ca/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/da/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/cb/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/db/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/cc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/dc/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/cd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/dd/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/ce/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/de/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/cf/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/df/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/cg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/dg/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/ch/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/dh/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/ci/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/di/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/cj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/dj/f/g/foo/bar-baz-quux/h/fez/bang/klmnop/fooc10.hbs", + "a/b/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/ca/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/da/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/cb/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/db/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/cc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/dc/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/cd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/dd/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/ce/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/de/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/cf/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/df/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/cg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/dg/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/ch/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/dh/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/ci/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/di/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/cj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/dj/f/g/foo/bar-baz-quux/i/fez/bang/klmnop/fooc10.hbs", + "a/b/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/ca/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/e/d/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/da/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/cb/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/db/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/cc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/dc/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/cd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/dd/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/ce/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/de/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/cf/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/df/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/cg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/dg/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/ch/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/dh/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/ci/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/di/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/cj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs", + "a/dj/f/g/foo/bar-baz-quux/j/fez/bang/klmnop/fooc10.hbs" + ], + "**/fooc09.js" +]; \ No newline at end of file diff --git a/benchmark/fixtures/long.js b/benchmark/fixtures/match/globstar-long-list.js similarity index 100% rename from benchmark/fixtures/long.js rename to benchmark/fixtures/match/globstar-long-list.js diff --git a/benchmark/fixtures/match/globstar-short-list.js b/benchmark/fixtures/match/globstar-short-list.js new file mode 100644 index 00000000..636e1871 --- /dev/null +++ b/benchmark/fixtures/match/globstar-short-list.js @@ -0,0 +1,2 @@ +var fixture = ['a/a/a', 'a/a/b', 'a/a/c', 'a/a/c', 'a/a/a/a/a/c', 'a/b/b', 'a/a/b/b/b/b/bb/c', 'a/c/c/s/z/c', 'a/b/c', 'a/c/c/b/c', 'z/a/a/z']; +module.exports = [fixture, 'a/**/c']; diff --git a/benchmark/fixtures/no-glob.js b/benchmark/fixtures/match/no-glob.js similarity index 100% rename from benchmark/fixtures/no-glob.js rename to benchmark/fixtures/match/no-glob.js diff --git a/benchmark/fixtures/basename.js b/benchmark/fixtures/match/star-basename.js similarity index 100% rename from benchmark/fixtures/basename.js rename to benchmark/fixtures/match/star-basename.js diff --git a/benchmark/fixtures/immediate.js b/benchmark/fixtures/match/star.js similarity index 100% rename from benchmark/fixtures/immediate.js rename to benchmark/fixtures/match/star.js diff --git a/benchmark/helper.js b/benchmark/helper.js new file mode 100644 index 00000000..a4f0cb6e --- /dev/null +++ b/benchmark/helper.js @@ -0,0 +1,83 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var repeat = require('repeat-string'); + +function bench() { + var filepath = path.join(__dirname, 'last.md'); + var str = fs.readFileSync(filepath, 'utf8'); + var sections = str.split(/(?=\n?(?:# benchmark))/); + sections.shift(); + + var len = sections.length; + var idx = -1; + var res = []; + + while (++idx < len) { + var section = sections[idx].trim(); + var tok = parseSection(section); + if (tok) res.push(tok); + } + + return res.join('\n'); +} + +function parseSection(str) { + var lines = str.split('\n').filter(Boolean); + if (!lines.length) return; + var title = lines.shift().trim(); + var m = /^.*\/fixtures\/match\/([^(]+)/.exec(title); + + var tok = {title: (m ? m[1] : title).trim()}; + tok.title = tok.title.slice(0, tok.title.length - 3); + + tok.micromatch = parseStats(lines); + tok['minimatch '] = parseStats(lines); + tok.multimatch = parseStats(lines); + var vals = values(tok); + var max = Math.max.apply(Math, vals); + + var str = ''; + str += ['#', tok.title].join(' ') + '\n'; + str += format('micromatch', tok, max, 100); + str += format('minimatch ', tok, max, 100); + str += format('multimatch', tok, max, 100); + // console.log(str) + return str; +} + +function parseStats(lines) { + var str = lines.shift().trim(); + var m = /^([^\s]+)\s*x\s*([\d,.]+)/.exec(str); + if (!m) return 0; + var str = m[2]; + var num = String(str).split(',').join(''); + return { + num: num, + str: str + }; +} + +function values(obj) { + var vals = []; + for (var key in obj) { + if (key === 'title') continue; + vals.push(obj[key].num); + } + return vals; +} + +function bar(tok, longest, diff) { + return repeat('█', (tok.num / longest) * 70); +} + +function format(name, tok, max, diff) { + return [name, bar(tok[name], max, diff), '(' + tok[name].str + ' ops/sec)', '\n'].join(' '); +} + +/** + * Expose `.bench` helper + */ + +module.exports.bench = bench; diff --git a/benchmark/index.js b/benchmark/index.js index ed80d2b3..a4dcb85e 100755 --- a/benchmark/index.js +++ b/benchmark/index.js @@ -1,11 +1,43 @@ 'use strict'; +var path = require('path'); +var util = require('util'); +var cyan = require('ansi-cyan'); +var opts = { alias: {pattern: 'p' }}; +var argv = require('minimist')(process.argv.slice(2), opts); +var isPrimitive = require('is-primitive'); +var isObject = require('is-object'); var Suite = require('benchmarked'); -var suite = new Suite({ - result: false, - fixtures: 'fixtures/*.js', - add: 'code/*.js', - cwd: __dirname -}); - -suite.run(); + +function run(type, pattern) { + var suite = new Suite({ + cwd: __dirname, + fixtures: path.join('fixtures', type, pattern || '*.js'), + code: path.join('code', type, '*.js') + }); + + if (argv.dry) { + console.log(type); + console.log(); + suite.dryRun(function(code, fixture) { + console.log(cyan('%s > %s'), code.key, fixture.key); + var args = require(fixture.path); + var last = []; + if (args.length > 2) { + last = args.pop(); + } + var expected = util.inspect(last, {depth: null}); + var res = code.run.apply(null, args); + console.log(util.inspect(res, {depth: null})); + if (Array.isArray(res)) { + console.log(); + console.log(cyan(' total:'), res.length, 'items'); + } + console.log(); + }); + } else { + suite.run(); + } +} + +run(argv._[0] || 'match', argv._[1] || argv.pattern); diff --git a/benchmark/last.md b/benchmark/last.md index 1f32b461..ca7368bb 100644 --- a/benchmark/last.md +++ b/benchmark/last.md @@ -1,51 +1,81 @@ -#1: basename-braces - micromatch x 26,420 ops/sec ±0.89% (91 runs sampled) - minimatch x 3,507 ops/sec ±0.64% (97 runs sampled) +Benchmarking: (10 of 10) + · braces-globstar-large-list + · braces-multiple + · braces-range + · braces-set + · globstar-large-list + · globstar-long-list + · globstar-short-list + · no-glob + · star-basename + · star -#2: basename - micromatch x 25,315 ops/sec ±0.82% (93 runs sampled) - minimatch x 4,398 ops/sec ±0.86% (94 runs sampled) +# benchmark/fixtures/match/braces-globstar-large-list.js (485691 bytes) + micromatch x 595 ops/sec ±0.42% (89 runs sampled) + minimatch x 13.95 ops/sec ±1.04% (37 runs sampled) + multimatch x 14.09 ops/sec ±0.63% (37 runs sampled) -#3: braces-no-glob - micromatch x 341,254 ops/sec ±0.78% (93 runs sampled) - minimatch x 30,197 ops/sec ±1.12% (91 runs sampled) + fastest is micromatch -#4: braces - micromatch x 54,649 ops/sec ±0.74% (94 runs sampled) - minimatch x 3,095 ops/sec ±0.82% (95 runs sampled) +# benchmark/fixtures/match/braces-multiple.js (3362 bytes) + micromatch x 48,362 ops/sec ±0.63% (84 runs sampled) + minimatch x 2.18 ops/sec ±1.95% (9 runs sampled) + multimatch x 2.15 ops/sec ±3.75% (9 runs sampled) -#5: immediate - micromatch x 16,719 ops/sec ±0.79% (95 runs sampled) - minimatch x 4,348 ops/sec ±0.86% (96 runs sampled) + fastest is micromatch -#6: large - micromatch x 721 ops/sec ±0.77% (94 runs sampled) - minimatch x 17.73 ops/sec ±1.08% (50 runs sampled) +# benchmark/fixtures/match/braces-range.js (727 bytes) + micromatch x 187,481 ops/sec ±0.84% (88 runs sampled) + minimatch x 12,366 ops/sec ±1.45% (88 runs sampled) + multimatch x 11,841 ops/sec ±1.04% (92 runs sampled) -#7: long - micromatch x 5,051 ops/sec ±0.87% (97 runs sampled) - minimatch x 628 ops/sec ±0.83% (94 runs sampled) + fastest is micromatch -#8: mid - micromatch x 51,280 ops/sec ±0.80% (95 runs sampled) - minimatch x 1,923 ops/sec ±0.84% (95 runs sampled) +# benchmark/fixtures/match/braces-set.js (2858 bytes) + micromatch x 24,344 ops/sec ±1.07% (90 runs sampled) + minimatch x 2,255 ops/sec ±1.30% (88 runs sampled) + multimatch x 2,199 ops/sec ±0.40% (92 runs sampled) -#9: multi-patterns - micromatch x 22,440 ops/sec ±0.97% (94 runs sampled) - minimatch x 2,481 ops/sec ±1.10% (94 runs sampled) + fastest is micromatch -#10: no-glob - micromatch x 722,823 ops/sec ±1.30% (87 runs sampled) - minimatch x 52,967 ops/sec ±1.09% (94 runs sampled) +# benchmark/fixtures/match/globstar-large-list.js (485686 bytes) + micromatch x 561 ops/sec ±0.37% (85 runs sampled) + minimatch x 25.43 ops/sec ±0.55% (44 runs sampled) + multimatch x 25.27 ops/sec ±0.37% (44 runs sampled) -#11: range - micromatch x 243,471 ops/sec ±0.79% (94 runs sampled) - minimatch x 11,736 ops/sec ±0.82% (96 runs sampled) + fastest is micromatch -#12: shallow - micromatch x 190,874 ops/sec ±0.98% (95 runs sampled) - minimatch x 21,699 ops/sec ±0.81% (97 runs sampled) +# benchmark/fixtures/match/globstar-long-list.js (90647 bytes) + micromatch x 3,257 ops/sec ±0.53% (89 runs sampled) + minimatch x 485 ops/sec ±1.01% (89 runs sampled) + multimatch x 485 ops/sec ±0.41% (89 runs sampled) -#13: short - micromatch x 496,393 ops/sec ±3.86% (90 runs sampled) - minimatch x 53,765 ops/sec ±0.75% (95 runs sampled) + fastest is micromatch + +# benchmark/fixtures/match/globstar-short-list.js (182 bytes) + micromatch x 359,991 ops/sec ±1.04% (88 runs sampled) + minimatch x 44,763 ops/sec ±1.07% (90 runs sampled) + multimatch x 39,977 ops/sec ±0.50% (90 runs sampled) + + fastest is micromatch + +# benchmark/fixtures/match/no-glob.js (701 bytes) + micromatch x 443,740 ops/sec ±1.36% (87 runs sampled) + minimatch x 44,152 ops/sec ±1.82% (90 runs sampled) + multimatch x 41,077 ops/sec ±0.45% (90 runs sampled) + + fastest is micromatch + +# benchmark/fixtures/match/star-basename.js (12339 bytes) + micromatch x 10,286 ops/sec ±0.46% (92 runs sampled) + minimatch x 3,059 ops/sec ±0.37% (90 runs sampled) + multimatch x 3,129 ops/sec ±1.36% (90 runs sampled) + + fastest is micromatch + +# benchmark/fixtures/match/star.js (12338 bytes) + micromatch x 9,756 ops/sec ±0.81% (88 runs sampled) + minimatch x 2,978 ops/sec ±0.38% (90 runs sampled) + multimatch x 2,970 ops/sec ±1.22% (91 runs sampled) + + fastest is micromatch diff --git a/benchmark/package.json b/benchmark/package.json new file mode 100644 index 00000000..6af446ee --- /dev/null +++ b/benchmark/package.json @@ -0,0 +1,36 @@ +{ + "name": "extglob-benchmarks", + "version": "0.0.0", + "private": true, + "main": "index.js", + "scripts": { + "test": "mocha" + }, + "lintDeps": { + "dependencies": { + "options": { + "ignore": [ + "index.js" + ] + } + }, + "devDependencies": { + "files": [ + "code/**/*.js", + "*.js" + ] + } + }, + "devDependencies": { + "ansi-cyan": "^0.1.1", + "benchmarked": "^1.1.1", + "braces": "^2.2.0", + "is-object": "^1.0.1", + "is-primitive": "^2.0.0", + "minimatch": "^3.0.4", + "minimist": "^1.2.0", + "multimatch": "^2.1.0", + "repeat-string": "^1.6.1", + "write": "^0.3.3" + } +} diff --git a/docs/comparison.md b/docs/comparison.md deleted file mode 100644 index 266677e8..00000000 --- a/docs/comparison.md +++ /dev/null @@ -1,130 +0,0 @@ -# micromatch vs. minimatch - -> Can micromatch be used as a drop-in replacement for minimatch? - -For mainstream features, I tried to keep as much parity as possible between micromatch and minimatch. But there are some differences. - -## Key differences - -- the main minimatch function, `minimatch()`, works like `micromatch.isMatch()` -- the main micromatch function, `micromatch()`, works like [multimatch](https://github.com/sindresorhus/multimatch), with support for multiple patterns. -- micromatch optimizes patterns to generate the leanest possible regex to use for matching without sacrificing accuracy. - -## Caching - -Micromatch uses multiple levels of caching, each basic and specifically designed for where it's being used. Glob patterns are parsed into tokens, which are then used to generate the regex to be used for matching. Like Minimatch, these patterns, tokens and resulting regex are cached to avoid repeatedly parsing the same pattern and options. - -It's worth noting that in the past minimatch used caching as well, but using a different strategy that offered little advantage. - -## Tokenization strategy - -Key points: - -- **faster regex**: spend more time tokenizing the glob pattern since the time to parse and compile to regex is a fraction of the time it takes to do the actual matching against large sets. In other words, the "easy" way is to use a small set of replacement patterns for a given set of glob characters, but the end result is a huge un-optimized regex that takes much longer to do the actual matching. We want fast regex matching. -- **avoid parsing entirely**: use [is-glob] and similar checks to avoid completely parsing the pattern when it's not necessary -- **specialized functions**: for brace expansiona and range expansion, dedication libraries were created along with extensive unit tests and granular benchmarks. In some of these benchmarks, micromatch is more than 100x faster than minimatch. - - -## Optimized regular expressions - -Micromatch's optimizations are achieved in a number of different ways. - -**Brace expansion** - -It's not uncommon to do this in a gulp or Grunt task: - -```js -src('*.{yml,json}'); -``` - - -## Features - -| **feature** | **micromatch** | **minimatch** | **notes** | -| --- | --- | --- | --- | -| multiple patterns | yes | no | ex: `['*.js', '!foo']` | -| `#` comments in file paths | no | yes | | -| [brace expansion] | yes | yes | ex: `*.{txt,md}` | -| regex character classes | yes | sort of | ex: `[a-c]*.js`, match file names starting with `a` through `c` | -| [extglobs] | yes | yes | ex: `+(foo|bar)` | -| POSIX [bracket expressions] | yes | no | (character classes) ex: `[[:alpha:][:lower:]]` | -| regex or string | yes | no | Micromatch will take a regex or a glob pattern to use for matching. | - - -### multiple pattern support - -Support for matching against multiple patterns, like `['*.js', '!foo']`: - -- Minimatch: **no** -- Micromatch: **yes** - -Because of this, there is also a [_key difference_](#main-export-key-differences) in how the main exported function from each library is used. - -**Key difference** - -- `micromatch()`: the main `micromatch()` function works like [multimatch](https://github.com/sindresorhus/multimatch), and supports matching with multiple patterns (e.g. `['*.js', '!foo']`). -- `minimatch()`: the main `minimatch()` function works like `micromatch.isMatch()`, returning true if a single path matches the given pattern. - - -## API - -### Methods - -| **method** | **micromatch** | **minimatch** | **notes** | -| --- | --- | --- | --- | -| `matchOne` | no | yes | like match, but only the first file | -| `makeRe` | yes | yes | create a regular expression from the pattern. | -| `match` | yes | yes | return an array of matches from a single pattern | -| `filter` | yes | yes | like match but returns a function that can be passed to `Array.filter` | -| `contains` | yes | no | like match, but matches any part of a path, not just the entire path | -| `expand` | yes | no | returns an [object of tokens][expand], which are passed to `.makeRe()` | -| `matcher` | yes | no | returns a function to use for matching | -| `isMatch` | yes | no | returns true if a path matches the given pattern. Works like `minimatch()` | -| `matchKeys` | yes | no | match the keys in an object | - - -## Options - -| option | micromatch | minimatch | description | -| --- | --- | --- | --- | -| `flipNegate` | no | yes | | -| `failglob` | yes | no | throw when no matches are found (bash parity) | -| `ignore` | yes | no | string or array of patterns to ignore. like negate, but passed on options. | -| `nocase` | yes | yes | ... | -| `nonull` | yes | yes | ... | -| `nullglob` | yes | yes | ... | -| `nonegate` | yes | yes | ... | - - - -## Other differences - -**benchmarks** - -micromatch is faster in every benchmark by a significant margin. One significant case that stands out is matching on arrays with thousands of items (like filepaths in a project). Here are the results from the benchmarks for matching against an array of ~7-8k items: - -```js -micromatch.js x 773 ops/sec ±0.62% (98 runs sampled) -minimatch.js x 27.52 ops/sec ±0.66% (49 runs sampled) -``` - -**Bash 4.3** - -micromatch has better Bash 4.3 coverage along with extensive, organized unit tests - -**micromatch isn't a constructor** - -However, if you're using `new Minimatch()` because you need to do some kind of customization to the pre-regex pattern or whatever, then you should be able to achieve the same or similar results with micromatch. - -In particular, `micromatch.expand()` parses the glob pattern and [returns an object][expand]. You can then pass that to the `.makeRe()` method to generate the regex for matching. - - -## Notes - -_(nothing yet)_ - - -[expand]: https://github.com/jonschlinkert/micromatch#expand -[brace expansion]: https://github.com/jonschlinkert/braces -[extglobs]: https://github.com/jonschlinkert/extglob -[bracket expressions]: https://github.com/jonschlinkert/expand-brackets diff --git a/docs/minimatch.md b/docs/minimatch.md deleted file mode 100644 index d568279c..00000000 --- a/docs/minimatch.md +++ /dev/null @@ -1,214 +0,0 @@ -# Comparison: micromatch vs. minimatch - -> This document is based on the readme from [minimatch], with additions to show how the two libraries, minimatch and micromatch, compare to one another. - -**Matching with RegExp** - -Both libraries work by converting glob expressions into JavaScript `RegExp` objects. However, there are key differences in approach. - -**Parse > Tokenize > Convert to regex** - -For the most part, both libraries follow this formula. - -- glob pattern is parsed into tokens -- if applicable, pattern is expanded to multiple patterns, as with brace patterns (`/{a,b}/*.js`) - - -**Major implementation differences** - -Micromatch's huge speed advantage comes from a few different areas: - -- basic caching -- tokenization strategy -- regex optimizations -- single responsibility functions - - -**Example compiled regex** - -```js -micro.makeRe('*.{yml,json}'); -//=> /^(?:(?!\.)(?=.)[^/]*?\.(yml|json))$/ - -mini.makeRe('*.{yml,json}'); -//=> /^(?:(?!\.)(?=.)[^/]*?\.yml|(?!\.)(?=.)[^/]*?\.json)$/ -``` - - -## Usage - -```js -var minimatch = require("minimatch"); -var micromatch = require('micromatch'); -``` - -**Minimatch** - -Match the path on the left against the pattern on the right: - -```js -minimatch("foo.js", "*.js"); // true! -``` - -**Micromatch** - -The micromatch equivalent is `micromatch.isMatch()` - - -```js -minimatch.isMatch('foo.js', '*.js'); // true! -``` - - -## Features - -Both libraries support these glob features: - -* Brace Expansion -* Extended glob matching -* "Globstar" `**` matching - - -## Constructor - -**Minimatch Class** - -Create a minimatch object by instanting the `minimatch.Minimatch` class. - -```js -var Minimatch = require("minimatch").Minimatch; -var mm = new Minimatch(pattern, options); -``` - -**Micromatch** - -No support. If you need access to tokens as they are generated (to avoid parsing the glob more than once), you can use `micromatch.expand()`. - - -## Functions - -### minimatch(path, pattern, options) - -Main export. Tests a path against the pattern using the options. - -```js -var isJS = minimatch(file, "*.js", { matchBase: true }) -``` - -### minimatch.filter(pattern, options) - -Returns a function that tests its -supplied argument, suitable for use with `Array.filter`. Example: - -```js -var javascripts = fileList.filter(minimatch.filter("*.js", {matchBase: true})) -``` - -### minimatch.match(list, pattern, options) - -Match against the list of -files, in the style of fnmatch or glob. If nothing is matched, and -options.nonull is set, then return a list containing the pattern itself. - -```js -var javascripts = minimatch.match(fileList, "*.js", {matchBase: true})) -``` - -### minimatch.makeRe(pattern, options) - -Make a regular expression object from the pattern. - -## Options - -All options are `false` by default. - -### debug - -Dump a ton of stuff to stderr. - -### nobrace - -Do not expand `{a,b}` and `{1..3}` brace sets. - -### noglobstar - -Disable `**` matching against multiple folder names. - -### dot - -Allow patterns to match filenames starting with a period, even if -the pattern does not explicitly have a period in that spot. - -Note that by default, `a/**/b` will **not** match `a/.d/b`, unless `dot` -is set. - -### noext - -Disable "extglob" style patterns like `+(a|b)`. - -### nocase - -Perform a case-insensitive match. - -### nonull - -When a match is not found by `minimatch.match`, return a list containing -the pattern itself if this option is set. When not set, an empty list -is returned if there are no matches. - -### matchBase - -If set, then patterns without slashes will be matched -against the basename of the path if it contains slashes. For example, -`a?b` would match the path `/xyz/123/acb`, but not `/xyz/acb/123`. - -### nocomment - -Suppress the behavior of treating `#` at the start of a pattern as a -comment. - -### nonegate - -Suppress the behavior of treating a leading `!` character as negation. - -### flipNegate - -Returns from negate expressions the same as if they were not negated. -(Ie, true on a hit, false on a miss.) - - -## Comparisons to other fnmatch/glob implementations - -While strict compliance with the existing standards is a worthwhile -goal, some discrepancies exist between minimatch and other -implementations, and are intentional. - -If the pattern starts with a `!` character, then it is negated. Set the -`nonegate` flag to suppress this behavior, and treat leading `!` -characters normally. This is perhaps relevant if you wish to start the -pattern with a negative extglob pattern like `!(a|B)`. Multiple `!` -characters at the start of a pattern will negate the pattern multiple -times. - -If a pattern starts with `#`, then it is treated as a comment, and -will not match anything. Use `\#` to match a literal `#` at the -start of a line, or set the `nocomment` flag to suppress this behavior. - -The double-star character `**` is supported by default, unless the -`noglobstar` flag is set. This is supported in the manner of bsdglob -and bash 4.1, where `**` only has special significance if it is the only -thing in a path part. That is, `a/**/b` will match `a/x/y/b`, but -`a/**b` will not. - -If an escaped pattern has no matches, and the `nonull` flag is set, -then minimatch.match returns the pattern as-provided, rather than -interpreting the character escapes. For example, -`minimatch.match([], "\\*a\\?")` will return `"\\*a\\?"` rather than -`"*a?"`. This is akin to setting the `nullglob` option in bash, except -that it does not resolve escaped pattern characters. - -If brace expansion is not disabled, then it is performed before any -other interpretation of the glob pattern. Thus, a pattern like -`+(a|{b),c)}`, which would not be valid in bash or zsh, is expanded -**first** into the set of `+(a|b)` and `+(a|c)`, and those patterns are -checked for validity. Since those two are valid, matching proceeds. diff --git a/docs/switching-from-minimatch.md b/docs/switching-from-minimatch.md deleted file mode 100644 index bd7cec44..00000000 --- a/docs/switching-from-minimatch.md +++ /dev/null @@ -1,28 +0,0 @@ -# Switching from minimatch - -> Use `mm.isMatch()` instead of `minimatch()` - -**Minimatch** - -The main `minimatch()` function returns true/false for a single file path and pattern: - -```js -var minimatch = require('minimatch'); -minimatch('foo.js', '*.js'); -//=> 'true' -``` - -**Micromatch** - -With micromatch, `.isMatch()` to get the same result: - -```js -var mm = require('micromatch'); -mm.isMatch('foo.js', '*.js'); -//=> 'true' -``` - -This implementation difference is necessary since the main `micromatch()` method supports matching on multiple globs, with behavior similar to [multimatch][]. - -[multimatch]: https://github.com/sindresorhus/multimatch -[minimatch]: https://github.com/isaacs/minimatch diff --git a/examples/all.js b/examples/all.js new file mode 100644 index 00000000..4059b917 --- /dev/null +++ b/examples/all.js @@ -0,0 +1,13 @@ +var mm = require('..'); + +console.log(mm.all('foo.js', ['foo.js'])); +// true + +console.log(mm.all('foo.js', ['*.js', '!foo.js'])); +// false + +console.log(mm.all('foo.js', ['*.js', 'foo.js'])); +// true + +console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); +// true diff --git a/examples/any.js b/examples/any.js new file mode 100644 index 00000000..b3fe45fe --- /dev/null +++ b/examples/any.js @@ -0,0 +1,8 @@ +var mm = require('..'); + +console.log(mm.any('foo.js', ['foo.js'])); +// true + +// the following is correct, because one of the patterns matches +console.log(mm.any('foo.js', ['*.js', '!foo.js'])); +// true diff --git a/examples/braces.js b/examples/braces.js index 237eb53e..6f7b5e98 100644 --- a/examples/braces.js +++ b/examples/braces.js @@ -1,7 +1,18 @@ var mm = require('../'); -console.log(mm.braces('{a,b}')); -//=> [ 'a', 'b' ] +/** + * Brace optimization + */ -console.log(mm.braces('foo/{a,b}/bar')); +console.log(mm.braces('{a,b,c}/{001..100}')); +//=> [ '{a,b,c}/{1..100}' ] + +/** + * Brace expansion + */ + +console.log(mm.braceExpand('{a,b,c}/{001..100}')); +//=> ['a/a', 'a/b', 'a/c', 'a/d', 'a/e', 'b/a', 'b/b', 'b/c', 'b/d', 'b/e', 'c/a', 'c/b', 'c/c', 'c/d', 'c/e'] + +console.log(mm.braces('{a,b,c}/{001..100}', {expand: true})); //=> [ 'foo/a/bar', 'foo/b/bar' ] diff --git a/examples/create.js b/examples/create.js new file mode 100644 index 00000000..e3e1edd2 --- /dev/null +++ b/examples/create.js @@ -0,0 +1,5 @@ +var mm = require('../'); + +console.log(mm.create('{a,b}', {expand: true})); +console.log(mm.create('{a,b}')); + diff --git a/examples/dot.js b/examples/dot.js deleted file mode 100644 index 5d1be25a..00000000 --- a/examples/dot.js +++ /dev/null @@ -1,7 +0,0 @@ -var mm = require('..'); - -console.log(mm.makeRe('.a/{,*/}xyz.md')) -console.log(mm.isMatch('.a/xyz.md', '.a/{,*/}xyz.md')); - -console.log(mm.makeRe('.a/**/xyz.md')) -console.log(mm.isMatch('.a/xyz.md', '.a/**/xyz.md')); diff --git a/examples/every.js b/examples/every.js new file mode 100644 index 00000000..ade309c4 --- /dev/null +++ b/examples/every.js @@ -0,0 +1,13 @@ +var mm = require('..'); + +console.log(mm.every('foo.js', ['foo.js'])); +// true + +console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); +// true + +console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); +// false + +console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); +// false diff --git a/examples/extglob.js b/examples/extglob.js new file mode 100644 index 00000000..b0e2a7e7 --- /dev/null +++ b/examples/extglob.js @@ -0,0 +1,9 @@ +'use strict'; + +var mm = require('..'); +var pattern = '*(*(of*(a)x)z)'; + +// var res = mm(pattern); +// console.log(res.ast.nodes); +// console.log(res); +console.log(mm(['a/b.js', 'a/b.md'], 'a/*.!(js)')) diff --git a/examples/extglobs.js b/examples/extglobs.js index 2a6437f3..1e6dae09 100644 --- a/examples/extglobs.js +++ b/examples/extglobs.js @@ -1,4 +1,4 @@ -var mm = require('../'); +var mm = require('..'); console.log(mm.isMatch('src/a/b/c.js', 'src/**/*!(_test).js')); //=> true @@ -12,5 +12,8 @@ console.log(mm.isMatch('src/a/b/c_test.js', 'src/**/.!(_test).js')); console.log(mm.isMatch('src/a/b/c_test.js', 'src/**/.!(_test).js')); //=> false +console.log(mm('a**(z)')); +//=> false + // var arr = ['a.a', 'a.b', 'a.c.d', 'c.c', 'a.', 'd.d', 'e.e', 'f.f'] // console.log(mm(arr, '!(*.a|*.b|*.c)')); diff --git a/examples/negation.js b/examples/negation.js new file mode 100644 index 00000000..0017496c --- /dev/null +++ b/examples/negation.js @@ -0,0 +1,3 @@ +var mm = require('../'); + +console.log(mm('!**/a.js').ast); diff --git a/examples/not.js b/examples/not.js new file mode 100644 index 00000000..654b8063 --- /dev/null +++ b/examples/not.js @@ -0,0 +1,16 @@ +var mm = require('..'); + +console.log(mm.not('foo.js', ['foo.js'])); +// [] + +console.log(mm.not(['foo.js', 'bar.js'], ['*.js'])); +// [] + +console.log(mm.not(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); +// ['foo.js'] + +console.log(mm.not(['foo.js', 'bar.js', 'baz.js', 'foo.md'], ['!*.js'], {ignore: 'baz.js'})); +// ['foo.js', 'bar.js'] + +console.log(mm.not(['foo.js'], ['*.js', '!foo.js'])); +// ['foo.js'] diff --git a/examples/options.dot.js b/examples/options.dot.js new file mode 100644 index 00000000..e7ba61db --- /dev/null +++ b/examples/options.dot.js @@ -0,0 +1,16 @@ +var nm = require('..'); +var mm = require('minimatch'); + +console.log(nm.makeRe('.a/{,*/}xyz.md')) +console.log(nm.isMatch('.a/xyz.md', '.a/{,*/}xyz.md')); + +console.log(nm.makeRe('.a/**/xyz.md')) +console.log(nm.isMatch('.a/xyz.md', '.a/**/xyz.md')); +console.log(nm.isMatch('./b/.c', '?/.?')); +console.log(nm.isMatch('./b/.c', '?/.?*')); +console.log(nm.isMatch('b/.c', '?/.?*')); +console.log(nm.isMatch('./', '?', {dot: true})); + +// this is wrong +console.log(mm('./', '?/', {dot: true})); +console.log(mm('./b/.c', '?/.?*')); diff --git a/examples/basename.js b/examples/options.matchBase.js similarity index 100% rename from examples/basename.js rename to examples/options.matchBase.js diff --git a/examples/options.nodupes.js b/examples/options.nodupes.js new file mode 100644 index 00000000..5c003d24 --- /dev/null +++ b/examples/options.nodupes.js @@ -0,0 +1,27 @@ +var mm = require('..'); +var mi = require('minimatch'); + +var files = [ + '.editorconfig', + '.git', + '.gitignore', + '.nyc_output', + '.travis.yml', + '.verb.md', + 'CHANGELOG.md', + 'CONTRIBUTING.md', + 'LICENSE', + 'coverage', + 'example.js', + 'example.md', + 'example.css', + 'index.js', + 'node_modules', + 'package.json', + 'test.js', + 'utils.js' +] + +console.log(mm(files, ['example.*', '*.js'], { + nodupes: true +})) diff --git a/examples/options.sourceMap.js b/examples/options.sourceMap.js new file mode 100644 index 00000000..479f4d49 --- /dev/null +++ b/examples/options.sourceMap.js @@ -0,0 +1,14 @@ +'use strict'; + +var mm = require('..'); +var pattern = '*(*(of*(a)x)z)'; + +var ast = mm.parse(pattern); +var res = mm.compile(ast, {sourcemap: true}); +console.log(res) +// { map: +// { version: 3, +// sources: [ 'string' ], +// names: [], +// mappings: 'AAAA,CAAE,CAAE,EAAE,CAAE,CAAC,EAAC,CAAC,EAAC,CAAC,EAAC', +// sourcesContent: [ '*(*(of*(a)x)z)' ] }}, diff --git a/examples/parser.js b/examples/parser.js new file mode 100644 index 00000000..aed7531d --- /dev/null +++ b/examples/parser.js @@ -0,0 +1,10 @@ +'use strict'; + +var parsers = require('../lib/parsers'); +var Extglob = require('../lib/extglob'); +var extglob = new Extglob(); +extglob.use(parsers); + +var pattern = '*(*(of*(a)x)z)'; +var res = extglob.parse(pattern); +console.log(res); diff --git a/examples/some.js b/examples/some.js new file mode 100644 index 00000000..92c4fd66 --- /dev/null +++ b/examples/some.js @@ -0,0 +1,10 @@ +var mm = require('..'); + +console.log(mm.some('foo.js', ['foo.js'])); +// true + +console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); +// true + +console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); +// false diff --git a/examples/star.js b/examples/star.js new file mode 100644 index 00000000..aed7531d --- /dev/null +++ b/examples/star.js @@ -0,0 +1,10 @@ +'use strict'; + +var parsers = require('../lib/parsers'); +var Extglob = require('../lib/extglob'); +var extglob = new Extglob(); +extglob.use(parsers); + +var pattern = '*(*(of*(a)x)z)'; +var res = extglob.parse(pattern); +console.log(res); diff --git a/gulpfile.js b/gulpfile.js index 5e3e3315..bb23e3d5 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -2,8 +2,8 @@ var gulp = require('gulp'); var mocha = require('gulp-mocha'); +var unused = require('gulp-unused'); var istanbul = require('gulp-istanbul'); -var eslint = require('gulp-eslint'); gulp.task('coverage', function() { return gulp.src(['index.js', 'lib/*.js']) @@ -11,16 +11,15 @@ gulp.task('coverage', function() { .pipe(istanbul.hookRequire()); }); -gulp.task('mocha', ['coverage'], function() { +gulp.task('test', ['coverage'], function() { return gulp.src('test/*.js') .pipe(mocha({reporter: 'spec'})) .pipe(istanbul.writeReports()); }); -gulp.task('eslint', function() { - return gulp.src(['gulpfile.js', 'index.js', 'lib/*.js']) - .pipe(eslint()) - .pipe(eslint.format()); +gulp.task('unused', function() { + return gulp.src(['index.js', 'lib/*.js']) + .pipe(unused({keys: Object.keys(require('./lib/utils.js'))})); }); -gulp.task('default', ['mocha', 'eslint']); +gulp.task('default', ['test']); diff --git a/index.js b/index.js old mode 100755 new mode 100644 index f898ec17..9f0acacf --- a/index.js +++ b/index.js @@ -1,431 +1,848 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. +'use strict'; + +/** + * Module dependencies */ -'use strict'; +var util = require('util'); +var braces = require('braces'); +var toRegex = require('to-regex'); +var extend = require('extend-shallow'); -var expand = require('./lib/expand'); +/** + * Local dependencies + */ + +var compilers = require('./lib/compilers'); +var parsers = require('./lib/parsers'); +var cache = require('./lib/cache'); var utils = require('./lib/utils'); +var MAX_LENGTH = 1024 * 64; /** - * The main function. Pass an array of filepaths, - * and a string or array of glob patterns + * The main function takes a list of strings and one or more + * glob patterns to use for matching. + * + * ```js + * var mm = require('micromatch'); + * mm(list, patterns[, options]); * - * @param {Array|String} `files` - * @param {Array|String} `patterns` - * @param {Object} `opts` - * @return {Array} Array of matches + * console.log(mm(['a.js', 'a.txt'], ['*.js'])); + * //=> [ 'a.js' ] + * ``` + * @param {Array} `list` A list of strings to match + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of matches + * @summary false + * @api public */ -function micromatch(files, patterns, opts) { - if (!files || !patterns) return []; - opts = opts || {}; +function micromatch(list, patterns, options) { + patterns = utils.arrayify(patterns); + list = utils.arrayify(list); - if (typeof opts.cache === 'undefined') { - opts.cache = true; + var len = patterns.length; + if (list.length === 0 || len === 0) { + return []; } - if (!Array.isArray(patterns)) { - return match(files, patterns, opts); + if (len === 1) { + return micromatch.match(list, patterns[0], options); } - var len = patterns.length, i = 0; - var omit = [], keep = []; + var negated = false; + var omit = []; + var keep = []; + var idx = -1; - while (len--) { - var glob = patterns[i++]; - if (typeof glob === 'string' && glob.charCodeAt(0) === 33 /* ! */) { - omit.push.apply(omit, match(files, glob.slice(1), opts)); + while (++idx < len) { + var pattern = patterns[idx]; + + if (typeof pattern === 'string' && pattern.charCodeAt(0) === 33 /* ! */) { + omit.push.apply(omit, micromatch.match(list, pattern.slice(1), options)); + negated = true; } else { - keep.push.apply(keep, match(files, glob, opts)); + keep.push.apply(keep, micromatch.match(list, pattern, options)); } } - return utils.diff(keep, omit); + + // minimatch.match parity + if (negated && keep.length === 0) { + if (options && options.unixify === false) { + keep = list.slice(); + } else { + var unixify = utils.unixify(options); + for (var i = 0; i < list.length; i++) { + keep.push(unixify(list[i])); + } + } + } + + var matches = utils.diff(keep, omit); + if (!options || options.nodupes !== false) { + return utils.unique(matches); + } + + return matches; } /** - * Return an array of files that match the given glob pattern. + * Similar to the main function, but `pattern` must be a string. * - * This function is called by the main `micromatch` function If you only - * need to pass a single pattern you might get very minor speed improvements - * using this function. + * ```js + * var mm = require('micromatch'); + * mm.match(list, pattern[, options]); * - * @param {Array} `files` - * @param {String} `pattern` - * @param {Object} `options` - * @return {Array} + * console.log(mm.match(['a.a', 'a.aa', 'a.b', 'a.c'], '*.a')); + * //=> ['a.a', 'a.aa'] + * ``` + * @param {Array} `list` Array of strings to match + * @param {String} `pattern` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of matches + * @api public */ -function match(files, pattern, opts) { - if (utils.typeOf(files) !== 'string' && !Array.isArray(files)) { - throw new Error(msg('match', 'files', 'a string or array')); +micromatch.match = function(list, pattern, options) { + if (Array.isArray(pattern)) { + throw new TypeError('expected pattern to be a string'); } - files = utils.arrayify(files); - opts = opts || {}; + var unixify = utils.unixify(options); + var isMatch = memoize('match', pattern, options, micromatch.matcher); + var matches = []; - var negate = opts.negate || false; - var orig = pattern; + list = utils.arrayify(list); + var len = list.length; + var idx = -1; - if (typeof pattern === 'string') { - negate = pattern.charAt(0) === '!'; - if (negate) { - pattern = pattern.slice(1); + while (++idx < len) { + var ele = list[idx]; + if (ele === pattern || isMatch(ele)) { + matches.push(utils.value(ele, unixify, options)); } + } - // we need to remove the character regardless, - // so the above logic is still needed - if (opts.nonegate === true) { - negate = false; + // if no options were passed, uniquify results and return + if (typeof options === 'undefined') { + return utils.unique(matches); + } + + if (matches.length === 0) { + if (options.failglob === true) { + throw new Error('no matches found for "' + pattern + '"'); + } + if (options.nonull === true || options.nullglob === true) { + return [options.unescape ? utils.unescape(pattern) : pattern]; } } - var _isMatch = matcher(pattern, opts); - var len = files.length, i = 0; - var res = []; + // if `opts.ignore` was defined, diff ignored list + if (options.ignore) { + matches = micromatch.not(matches, options.ignore, options); + } - while (i < len) { - var file = files[i++]; - var fp = utils.unixify(file, opts); + return options.nodupes !== false ? utils.unique(matches) : matches; +}; - if (!_isMatch(fp)) { continue; } - res.push(fp); +/** + * Returns true if the specified `string` matches the given glob `pattern`. + * + * ```js + * var mm = require('micromatch'); + * mm.isMatch(string, pattern[, options]); + * + * console.log(mm.isMatch('a.a', '*.a')); + * //=> true + * console.log(mm.isMatch('a.b', '*.a')); + * //=> false + * ``` + * @param {String} `string` String to match + * @param {String} `pattern` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if the string matches the glob pattern. + * @api public + */ + +micromatch.isMatch = function(str, pattern, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); } - if (res.length === 0) { - if (opts.failglob === true) { - throw new Error('micromatch.match() found no matches for: "' + orig + '".'); - } + if (isEmptyString(str) || isEmptyString(pattern)) { + return false; + } - if (opts.nonull || opts.nullglob) { - res.push(utils.unescapeGlob(orig)); - } + var equals = utils.equalsPattern(options); + if (equals(str)) { + return true; } - // if `negate` was defined, diff negated files - if (negate) { res = utils.diff(files, res); } + var isMatch = memoize('isMatch', pattern, options, micromatch.matcher); + return isMatch(str); +}; - // if `ignore` was defined, diff ignored filed - if (opts.ignore && opts.ignore.length) { - pattern = opts.ignore; - opts = utils.omit(opts, ['ignore']); - res = utils.diff(res, micromatch(res, pattern, opts)); - } +/** + * Returns true if some of the strings in the given `list` match any of the + * given glob `patterns`. + * + * ```js + * var mm = require('micromatch'); + * mm.some(list, patterns[, options]); + * + * console.log(mm.some(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // true + * console.log(mm.some(['foo.js'], ['*.js', '!foo.js'])); + * // false + * ``` + * @param {String|Array} `list` The string or array of strings to test. Returns as soon as the first match is found. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public + */ - if (opts.nodupes) { - return utils.unique(res); +micromatch.some = function(list, patterns, options) { + if (typeof list === 'string') { + list = [list]; } - return res; -} + for (var i = 0; i < list.length; i++) { + if (micromatch(list[i], patterns, options).length === 1) { + return true; + } + } + return false; +}; /** - * Returns a function that takes a glob pattern or array of glob patterns - * to be used with `Array#filter()`. (Internally this function generates - * the matching function using the [matcher] method). + * Returns true if every string in the given `list` matches + * any of the given glob `patterns`. * * ```js - * var fn = mm.filter('[a-c]'); - * ['a', 'b', 'c', 'd', 'e'].filter(fn); - * //=> ['a', 'b', 'c'] + * var mm = require('micromatch'); + * mm.every(list, patterns[, options]); + * + * console.log(mm.every('foo.js', ['foo.js'])); + * // true + * console.log(mm.every(['foo.js', 'bar.js'], ['*.js'])); + * // true + * console.log(mm.every(['foo.js', 'bar.js'], ['*.js', '!foo.js'])); + * // false + * console.log(mm.every(['foo.js'], ['*.js', '!foo.js'])); + * // false * ``` - * @param {String|Array} `patterns` Can be a glob or array of globs. - * @param {Options} `opts` Options to pass to the [matcher] method. - * @return {Function} Filter function to be passed to `Array#filter()`. + * @param {String|Array} `list` The string or array of strings to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public */ -function filter(patterns, opts) { - if (!Array.isArray(patterns) && typeof patterns !== 'string') { - throw new TypeError(msg('filter', 'patterns', 'a string or array')); +micromatch.every = function(list, patterns, options) { + if (typeof list === 'string') { + list = [list]; } - - patterns = utils.arrayify(patterns); - var len = patterns.length, i = 0; - var patternMatchers = Array(len); - while (i < len) { - patternMatchers[i] = matcher(patterns[i++], opts); - } - - return function(fp) { - if (fp == null) return []; - var len = patternMatchers.length, i = 0; - var res = true; - - fp = utils.unixify(fp, opts); - while (i < len) { - var fn = patternMatchers[i++]; - if (!fn(fp)) { - res = false; - break; - } + for (var i = 0; i < list.length; i++) { + if (micromatch(list[i], patterns, options).length !== 1) { + return false; } - return res; - }; -} + } + return true; +}; /** - * Returns true if the filepath contains the given - * pattern. Can also return a function for matching. + * Returns true if **any** of the given glob `patterns` + * match the specified `string`. * * ```js - * isMatch('foo.md', '*.md', {}); - * //=> true + * var mm = require('micromatch'); + * mm.any(string, patterns[, options]); * - * isMatch('*.md', {})('foo.md') + * console.log(mm.any('a.a', ['b.*', '*.a'])); * //=> true + * console.log(mm.any('a.a', 'b.*')); + * //=> false * ``` - * @param {String} `fp` - * @param {String} `pattern` - * @param {Object} `opts` - * @return {Boolean} + * @param {String|Array} `str` The string to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public */ -function isMatch(fp, pattern, opts) { - if (typeof fp !== 'string') { - throw new TypeError(msg('isMatch', 'filepath', 'a string')); +micromatch.any = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); } - fp = utils.unixify(fp, opts); - if (utils.typeOf(pattern) === 'object') { - return matcher(fp, pattern); + if (isEmptyString(str) || isEmptyString(patterns)) { + return false; + } + + if (typeof patterns === 'string') { + patterns = [patterns]; } - return matcher(pattern, opts)(fp); -} + + for (var i = 0; i < patterns.length; i++) { + if (micromatch.isMatch(str, patterns[i], options)) { + return true; + } + } + return false; +}; /** - * Returns true if the filepath matches the - * given pattern. + * Returns true if **all** of the given `patterns` match + * the specified string. + * + * ```js + * var mm = require('micromatch'); + * mm.all(string, patterns[, options]); + * + * console.log(mm.all('foo.js', ['foo.js'])); + * // true + * + * console.log(mm.all('foo.js', ['*.js', '!foo.js'])); + * // false + * + * console.log(mm.all('foo.js', ['*.js', 'foo.js'])); + * // true + * + * console.log(mm.all('foo.js', ['*.js', 'f*', '*o*', '*o.js'])); + * // true + * ``` + * @param {String|Array} `str` The string to test. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if any patterns match `str` + * @api public */ -function contains(fp, pattern, opts) { - if (typeof fp !== 'string') { - throw new TypeError(msg('contains', 'pattern', 'a string')); +micromatch.all = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); + } + if (typeof patterns === 'string') { + patterns = [patterns]; } + for (var i = 0; i < patterns.length; i++) { + if (!micromatch.isMatch(str, patterns[i], options)) { + return false; + } + } + return true; +}; - opts = opts || {}; - opts.contains = (pattern !== ''); - fp = utils.unixify(fp, opts); +/** + * Returns a list of strings that _**do not match any**_ of the given `patterns`. + * + * ```js + * var mm = require('micromatch'); + * mm.not(list, patterns[, options]); + * + * console.log(mm.not(['a.a', 'b.b', 'c.c'], '*.a')); + * //=> ['b.b', 'c.c'] + * ``` + * @param {Array} `list` Array of strings to match. + * @param {String|Array} `patterns` One or more glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Array} Returns an array of strings that **do not match** the given patterns. + * @api public + */ + +micromatch.not = function(list, patterns, options) { + var opts = extend({}, options); + var ignore = opts.ignore; + delete opts.ignore; + + list = utils.arrayify(list); - if (opts.contains && !utils.isGlob(pattern)) { - return fp.indexOf(pattern) !== -1; + var matches = utils.diff(list, micromatch(list, patterns, opts)); + if (ignore) { + matches = utils.diff(matches, micromatch(list, ignore)); } - return matcher(pattern, opts)(fp); -} + + return opts.nodupes !== false ? utils.unique(matches) : matches; +}; /** - * Returns true if a file path matches any of the - * given patterns. + * Returns true if the given `string` contains the given pattern. Similar + * to [.isMatch](#isMatch) but the pattern can match any part of the string. * - * @param {String} `fp` The filepath to test. - * @param {String|Array} `patterns` Glob patterns to use. - * @param {Object} `opts` Options to pass to the `matcher()` function. - * @return {String} + * ```js + * var mm = require('micromatch'); + * mm.contains(string, pattern[, options]); + * + * console.log(mm.contains('aa/bb/cc', '*b')); + * //=> true + * console.log(mm.contains('aa/bb/cc', '*d')); + * //=> false + * ``` + * @param {String} `str` The string to match. + * @param {String|Array} `patterns` Glob pattern to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Boolean} Returns true if the patter matches any part of `str`. + * @api public */ -function any(fp, patterns, opts) { - if (!Array.isArray(patterns) && typeof patterns !== 'string') { - throw new TypeError(msg('any', 'patterns', 'a string or array')); +micromatch.contains = function(str, patterns, options) { + if (typeof str !== 'string') { + throw new TypeError('expected a string: "' + util.inspect(str) + '"'); } - patterns = utils.arrayify(patterns); - var len = patterns.length; + if (typeof patterns === 'string') { + if (isEmptyString(str) || isEmptyString(patterns)) { + return false; + } - fp = utils.unixify(fp, opts); - while (len--) { - var isMatch = matcher(patterns[len], opts); - if (isMatch(fp)) { + var equals = utils.equalsPattern(patterns, options); + if (equals(str)) { + return true; + } + var contains = utils.containsPattern(patterns, options); + if (contains(str)) { return true; } } - return false; -} + + var opts = extend({}, options, {contains: true}); + return micromatch.any(str, patterns, opts); +}; /** - * Filter the keys of an object with the given `glob` pattern - * and `options` - * - * @param {Object} `object` - * @param {Pattern} `object` - * @return {Array} + * Returns true if the given pattern and options should enable + * the `matchBase` option. + * @return {Boolean} + * @api private */ -function matchKeys(obj, glob, options) { - if (utils.typeOf(obj) !== 'object') { - throw new TypeError(msg('matchKeys', 'first argument', 'an object')); - } +micromatch.matchBase = function(pattern, options) { + if (pattern && pattern.indexOf('/') !== -1 || !options) return false; + return options.basename === true || options.matchBase === true; +}; - var fn = matcher(glob, options); - var res = {}; +/** + * Filter the keys of the given object with the given `glob` pattern + * and `options`. Does not attempt to match nested keys. If you need this feature, + * use [glob-object][] instead. + * + * ```js + * var mm = require('micromatch'); + * mm.matchKeys(object, patterns[, options]); + * + * var obj = { aa: 'a', ab: 'b', ac: 'c' }; + * console.log(mm.matchKeys(obj, '*b')); + * //=> { ab: 'b' } + * ``` + * @param {Object} `object` The object with keys to filter. + * @param {String|Array} `patterns` One or more glob patterns to use for matching. + * @param {Object} `options` See available [options](#options) for changing how matches are performed + * @return {Object} Returns an object with only keys that match the given patterns. + * @api public + */ - for (var key in obj) { - if (obj.hasOwnProperty(key) && fn(key)) { - res[key] = obj[key]; - } +micromatch.matchKeys = function(obj, patterns, options) { + if (!utils.isObject(obj)) { + throw new TypeError('expected the first argument to be an object'); } - return res; -} + var keys = micromatch(Object.keys(obj), patterns, options); + return utils.pick(obj, keys); +}; /** - * Return a function for matching based on the - * given `pattern` and `options`. + * Returns a memoized matcher function from the given glob `pattern` and `options`. + * The returned function takes a string to match as its only argument and returns + * true if the string is a match. + * + * ```js + * var mm = require('micromatch'); + * mm.matcher(pattern[, options]); * - * @param {String} `pattern` - * @param {Object} `options` - * @return {Function} + * var isMatch = mm.matcher('*.!(*a)'); + * console.log(isMatch('a.a')); + * //=> false + * console.log(isMatch('a.b')); + * //=> true + * ``` + * @param {String} `pattern` Glob pattern + * @param {Object} `options` See available [options](#options) for changing how matches are performed. + * @return {Function} Returns a matcher function. + * @api public */ -function matcher(pattern, opts) { - // pattern is a function - if (typeof pattern === 'function') { - return pattern; +micromatch.matcher = function matcher(pattern, options) { + if (Array.isArray(pattern)) { + return compose(pattern, options, matcher); } - // pattern is a regex + + // if pattern is a regex if (pattern instanceof RegExp) { - return function(fp) { - return pattern.test(fp); - }; + return test(pattern); } - if (typeof pattern !== 'string') { - throw new TypeError(msg('matcher', 'pattern', 'a string, regex, or function')); + // if pattern is invalid + if (!utils.isString(pattern)) { + throw new TypeError('expected pattern to be an array, string or regex'); } - // strings, all the way down... - pattern = utils.unixify(pattern, opts); + // if pattern is a non-glob string + if (!utils.hasSpecialChars(pattern)) { + if (options && options.nocase === true) { + pattern = pattern.toLowerCase(); + } + return utils.matchPath(pattern, options); + } - // pattern is a non-glob string - if (!utils.isGlob(pattern)) { - return utils.matchPath(pattern, opts); + // if pattern is a glob string + var re = micromatch.makeRe(pattern, options); + + // if `options.matchBase` or `options.basename` is defined + if (micromatch.matchBase(pattern, options)) { + return utils.matchBasename(re, options); } - // pattern is a glob string - var re = makeRe(pattern, opts); - // `matchBase` is defined - if (opts && opts.matchBase) { - return utils.hasFilename(re, opts); + function test(regex) { + var equals = utils.equalsPattern(options); + var unixify = utils.unixify(options); + + return function(str) { + if (equals(str)) { + return true; + } + + if (regex.test(unixify(str))) { + return true; + } + return false; + }; } - // `matchBase` is not defined - return function(fp) { - fp = utils.unixify(fp, opts); - return re.test(fp); - }; -} + + var fn = test(re); + fn.result = re.result; + return fn; +}; /** - * Create and cache a regular expression for matching - * file paths. + * Create a regular expression from the given glob `pattern`. * - * If the leading character in the `glob` is `!`, a negation - * regex is returned. + * ```js + * var mm = require('micromatch'); + * mm.makeRe(pattern[, options]); * - * @param {String} `glob` - * @param {Object} `options` - * @return {RegExp} + * console.log(mm.makeRe('*.js')); + * //=> /^(?:(\.[\\\/])?(?!\.)(?=.)[^\/]*?\.js)$/ + * ``` + * @param {String} `pattern` A glob pattern to convert to regex. + * @param {Object} `options` See available [options](#options) for changing how matches are performed. + * @return {RegExp} Returns a regex created from the given pattern. + * @api public */ -function toRegex(glob, options) { - // clone options to prevent mutating the original object - var opts = Object.create(options || {}); - var flags = opts.flags || ''; - if (opts.nocase && flags.indexOf('i') === -1) { - flags += 'i'; +micromatch.makeRe = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected pattern to be a string'); } - var parsed = expand(glob, opts); - - // pass in tokens to avoid parsing more than once - opts.negated = opts.negated || parsed.negated; - opts.negate = opts.negated; - glob = wrapGlob(parsed.pattern, opts); - var re; + if (pattern.length > MAX_LENGTH) { + throw new Error('expected pattern to be less than ' + MAX_LENGTH + ' characters'); + } - try { - re = new RegExp(glob, flags); - return re; - } catch (err) { - err.reason = 'micromatch invalid regex: (' + re + ')'; - if (opts.strict) throw new SyntaxError(err); + function makeRe() { + var result = micromatch.create(pattern, options); + var asts = []; + var output = result.map(function(obj) { + obj.ast.state = obj.state; + asts.push(obj.ast); + return obj.output; + }); + + var regex = toRegex(output.join('|'), options); + regex.result = asts; + return regex; } - // we're only here if a bad pattern was used and the user - // passed `options.silent`, so match nothing - return /$^/; -} + return memoize('makeRe', pattern, options, makeRe); +}; /** - * Create the regex to do the matching. If the leading - * character in the `glob` is `!` a negation regex is returned. + * Expand the given brace `pattern`. + * + * ```js + * var mm = require('micromatch'); + * console.log(mm.braces('foo/{a,b}/bar')); + * //=> ['foo/(a|b)/bar'] * - * @param {String} `glob` - * @param {Boolean} `negate` + * console.log(mm.braces('foo/{a,b}/bar', {expand: true})); + * //=> ['foo/(a|b)/bar'] + * ``` + * @param {String} `pattern` String with brace pattern to expand. + * @param {Object} `options` Any [options](#options) to change how expansion is performed. See the [braces][] library for all available options. + * @return {Array} + * @api public */ -function wrapGlob(glob, opts) { - var prefix = (opts && !opts.contains) ? '^' : ''; - var after = (opts && !opts.contains) ? '$' : ''; - glob = ('(?:' + glob + ')' + after); - if (opts && opts.negate) { - return prefix + ('(?!^' + glob + ').*$'); +micromatch.braces = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); + } + + function expand() { + if (options && options.nobrace === true) return [pattern]; + if (!/\{.*\}/.test(pattern)) return [pattern]; + return braces(pattern, options); } - return prefix + glob; -} + + return memoize('braces', pattern, options, expand); +}; /** - * Create and cache a regular expression for matching file paths. - * If the leading character in the `glob` is `!`, a negation - * regex is returned. + * Proxy to the [micromatch.braces](#method), for parity with + * minimatch. + */ + +micromatch.braceExpand = function(pattern, options) { + var opts = extend({}, options, {expand: true}); + return micromatch.braces(pattern, opts); +}; + +/** + * Parses the given glob `pattern` and returns an array of abstract syntax + * trees (ASTs), with the compiled `output` and optional source `map` on + * each AST. + * + * ```js + * var mm = require('micromatch'); + * mm.create(pattern[, options]); * - * @param {String} `glob` - * @param {Object} `options` - * @return {RegExp} + * console.log(mm.create('abc/*.js')); + * // [{ options: { source: 'string', sourcemap: true }, + * // state: {}, + * // compilers: + * // { ... }, + * // output: '(\\.[\\\\\\/])?abc\\/(?!\\.)(?=.)[^\\/]*?\\.js', + * // ast: + * // { type: 'root', + * // errors: [], + * // nodes: + * // [ ... ], + * // dot: false, + * // input: 'abc/*.js' }, + * // parsingErrors: [], + * // map: + * // { version: 3, + * // sources: [ 'string' ], + * // names: [], + * // mappings: 'AAAA,GAAG,EAAC,kBAAC,EAAC,EAAE', + * // sourcesContent: [ 'abc/*.js' ] }, + * // position: { line: 1, column: 28 }, + * // content: {}, + * // files: {}, + * // idx: 6 }] + * ``` + * @param {String} `pattern` Glob pattern to parse and compile. + * @param {Object} `options` Any [options](#options) to change how parsing and compiling is performed. + * @return {Object} Returns an object with the parsed AST, compiled string and optional source map. + * @api public */ -function makeRe(glob, opts) { - if (utils.typeOf(glob) !== 'string') { - throw new Error(msg('makeRe', 'glob', 'a string')); +micromatch.create = function(pattern, options) { + return memoize('create', pattern, options, function() { + function create(str, opts) { + return micromatch.compile(micromatch.parse(str, opts), opts); + } + + pattern = micromatch.braces(pattern, options); + var len = pattern.length; + var idx = -1; + var res = []; + + while (++idx < len) { + res.push(create(pattern[idx], options)); + } + return res; + }); +}; + +/** + * Parse the given `str` with the given `options`. + * + * ```js + * var mm = require('micromatch'); + * mm.parse(pattern[, options]); + * + * var ast = mm.parse('a/{b,c}/d'); + * console.log(ast); + * // { type: 'root', + * // errors: [], + * // input: 'a/{b,c}/d', + * // nodes: + * // [ { type: 'bos', val: '' }, + * // { type: 'text', val: 'a/' }, + * // { type: 'brace', + * // nodes: + * // [ { type: 'brace.open', val: '{' }, + * // { type: 'text', val: 'b,c' }, + * // { type: 'brace.close', val: '}' } ] }, + * // { type: 'text', val: '/d' }, + * // { type: 'eos', val: '' } ] } + * ``` + * @param {String} `str` + * @param {Object} `options` + * @return {Object} Returns an AST + * @api public + */ + +micromatch.parse = function(pattern, options) { + if (typeof pattern !== 'string') { + throw new TypeError('expected a string'); } - return utils.cache(toRegex, glob, opts); -} + + function parse() { + var snapdragon = utils.instantiate(null, options); + parsers(snapdragon, options); + + if (pattern.slice(0, 2) === './') { + pattern = pattern.slice(2); + } + + pattern = utils.combineDuplicates(pattern, '\\*\\*\\/|\\/\\*\\*'); + var ast = snapdragon.parse(pattern, options); + utils.define(ast, 'snapdragon', snapdragon); + ast.input = pattern; + return ast; + } + + return memoize('parse', pattern, options, parse); +}; /** - * Make error messages consistent. Follows this format: + * Compile the given `ast` or string with the given `options`. * * ```js - * msg(methodName, argNumber, nativeType); - * // example: - * msg('matchKeys', 'first', 'an object'); + * var mm = require('micromatch'); + * mm.compile(ast[, options]); + * + * var ast = mm.parse('a/{b,c}/d'); + * console.log(mm.compile(ast)); + * // { options: { source: 'string' }, + * // state: {}, + * // compilers: + * // { eos: [Function], + * // noop: [Function], + * // bos: [Function], + * // brace: [Function], + * // 'brace.open': [Function], + * // text: [Function], + * // 'brace.close': [Function] }, + * // output: [ 'a/(b|c)/d' ], + * // ast: + * // { ... }, + * // parsingErrors: [] } * ``` + * @param {Object|String} `ast` + * @param {Object} `options` + * @return {Object} Returns an object that has an `output` property with the compiled string. + * @api public + */ + +micromatch.compile = function(ast, options) { + if (typeof ast === 'string') { + ast = micromatch.parse(ast, options); + } + + return memoize('compile', ast.input, options, function() { + var snapdragon = utils.instantiate(ast, options); + compilers(snapdragon, options); + return snapdragon.compile(ast, options); + }); +}; + +/** + * Clear the regex cache. * - * @param {String} `method` - * @param {String} `num` - * @param {String} `type` - * @return {String} + * ```js + * mm.clearCache(); + * ``` + * @api public */ -function msg(method, what, type) { - return 'micromatch.' + method + '(): ' + what + ' should be ' + type + '.'; +micromatch.clearCache = function() { + micromatch.cache.caches = {}; +}; + +/** + * Returns true if the given value is effectively an empty string + */ + +function isEmptyString(val) { + return String(val) === '' || String(val) === './'; +} + +/** + * Compose a matcher function with the given patterns. + * This allows matcher functions to be compiled once and + * called multiple times. + */ + +function compose(patterns, options, matcher) { + var matchers; + + return memoize('compose', String(patterns), options, function() { + return function(file) { + // delay composition until it's invoked the first time, + // after that it won't be called again + if (!matchers) { + matchers = []; + for (var i = 0; i < patterns.length; i++) { + matchers.push(matcher(patterns[i], options)); + } + } + + var len = matchers.length; + while (len--) { + if (matchers[len](file) === true) { + return true; + } + } + return false; + }; + }); +} + +/** + * Memoize a generated regex or function. A unique key is generated + * from the `type` (usually method name), the `pattern`, and + * user-defined options. + */ + +function memoize(type, pattern, options, fn) { + var key = utils.createKey(type + '=' + pattern, options); + + if (options && options.cache === false) { + return fn(pattern, options); + } + + if (cache.has(type, key)) { + return cache.get(type, key); + } + + var val = fn(pattern, options); + cache.set(type, key, val); + return val; } /** - * Public methods + * Expose compiler, parser and cache on `micromatch` */ -/* eslint no-multi-spaces: 0 */ -micromatch.any = any; -micromatch.braces = micromatch.braceExpand = utils.braces; -micromatch.contains = contains; -micromatch.expand = expand; -micromatch.filter = filter; -micromatch.isMatch = isMatch; -micromatch.makeRe = makeRe; -micromatch.match = match; -micromatch.matcher = matcher; -micromatch.matchKeys = matchKeys; +micromatch.compilers = compilers; +micromatch.parsers = parsers; +micromatch.caches = cache.caches; /** * Expose `micromatch` + * @type {Function} */ module.exports = micromatch; diff --git a/lib/cache.js b/lib/cache.js new file mode 100644 index 00000000..fffc4c17 --- /dev/null +++ b/lib/cache.js @@ -0,0 +1 @@ +module.exports = new (require('fragment-cache'))(); diff --git a/lib/chars.js b/lib/chars.js deleted file mode 100644 index a1ffe371..00000000 --- a/lib/chars.js +++ /dev/null @@ -1,67 +0,0 @@ -'use strict'; - -var chars = {}, unesc, temp; - -function reverse(object, prepender) { - return Object.keys(object).reduce(function(reversed, key) { - var newKey = prepender ? prepender + key : key; // Optionally prepend a string to key. - reversed[object[key]] = newKey; // Swap key and value. - return reversed; // Return the result. - }, {}); -} - -/** - * Regex for common characters - */ - -chars.escapeRegex = { - '?': /\?/g, - '@': /\@/g, - '!': /\!/g, - '+': /\+/g, - '*': /\*/g, - '(': /\(/g, - ')': /\)/g, - '[': /\[/g, - ']': /\]/g -}; - -/** - * Escape characters - */ - -chars.ESC = { - '?': '__UNESC_QMRK__', - '@': '__UNESC_AMPE__', - '!': '__UNESC_EXCL__', - '+': '__UNESC_PLUS__', - '*': '__UNESC_STAR__', - ',': '__UNESC_COMMA__', - '(': '__UNESC_LTPAREN__', - ')': '__UNESC_RTPAREN__', - '[': '__UNESC_LTBRACK__', - ']': '__UNESC_RTBRACK__' -}; - -/** - * Unescape characters - */ - -chars.UNESC = unesc || (unesc = reverse(chars.ESC, '\\')); - -chars.ESC_TEMP = { - '?': '__TEMP_QMRK__', - '@': '__TEMP_AMPE__', - '!': '__TEMP_EXCL__', - '*': '__TEMP_STAR__', - '+': '__TEMP_PLUS__', - ',': '__TEMP_COMMA__', - '(': '__TEMP_LTPAREN__', - ')': '__TEMP_RTPAREN__', - '[': '__TEMP_LTBRACK__', - ']': '__TEMP_RTBRACK__' -}; - -chars.TEMP = temp || (temp = reverse(chars.ESC_TEMP)); - -module.exports = chars; diff --git a/lib/compilers.js b/lib/compilers.js new file mode 100644 index 00000000..d39f27dd --- /dev/null +++ b/lib/compilers.js @@ -0,0 +1,78 @@ +'use strict'; + +var nanomatch = require('nanomatch'); +var extglob = require('extglob'); + +module.exports = function(snapdragon) { + var compilers = snapdragon.compiler.compilers; + var opts = snapdragon.options; + + // register nanomatch compilers + snapdragon.use(nanomatch.compilers); + + // get references to some specific nanomatch compilers before they + // are overridden by the extglob and/or custom compilers + var escape = compilers.escape; + var qmark = compilers.qmark; + var slash = compilers.slash; + var star = compilers.star; + var text = compilers.text; + var plus = compilers.plus; + var dot = compilers.dot; + var eos = compilers.eos; + + // register extglob compilers or escape exglobs if disabled + if (opts.extglob === false || opts.noext === true) { + snapdragon.compiler.use(escapeExtglobs); + } else { + snapdragon.use(extglob.compilers); + } + + snapdragon.use(function() { + this.options.star = this.options.star || function(/*node*/) { + return '[^/]*?'; + }; + }); + + // custom micromatch compilers + snapdragon.compiler + + // reset referenced compiler + .set('dot', dot) + .set('escape', escape) + .set('plus', plus) + .set('slash', slash) + .set('qmark', qmark) + .set('star', star) + .set('text', text); +}; + +function escapeExtglobs(compiler) { + compiler.set('paren', function(node) { + var val = ''; + visit(node, function(tok) { + if (tok.val) val += '\\' + tok.val; + }); + return this.emit(val, node); + }); + + /** + * Visit `node` with the given `fn` + */ + + function visit(node, fn) { + return node.nodes ? mapVisit(node.nodes, fn) : fn(node); + } + + /** + * Map visit over array of `nodes`. + */ + + function mapVisit(nodes, fn) { + var len = nodes.length; + var idx = -1; + while (++idx < len) { + visit(nodes[idx], fn); + } + } +} diff --git a/lib/expand.js b/lib/expand.js deleted file mode 100644 index e99b081e..00000000 --- a/lib/expand.js +++ /dev/null @@ -1,304 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -var utils = require('./utils'); -var Glob = require('./glob'); - -/** - * Expose `expand` - */ - -module.exports = expand; - -/** - * Expand a glob pattern to resolve braces and - * similar patterns before converting to regex. - * - * @param {String|Array} `pattern` - * @param {Array} `files` - * @param {Options} `opts` - * @return {Array} - */ - -function expand(pattern, options) { - if (typeof pattern !== 'string') { - throw new TypeError('micromatch.expand(): argument should be a string.'); - } - - var glob = new Glob(pattern, options || {}); - var opts = glob.options; - - if (!utils.isGlob(pattern)) { - glob.pattern = glob.pattern.replace(/([\/.])/g, '\\$1'); - return glob; - } - - glob.pattern = glob.pattern.replace(/(\+)(?!\()/g, '\\$1'); - glob.pattern = glob.pattern.split('$').join('\\$'); - - if (typeof opts.braces !== 'boolean' && typeof opts.nobraces !== 'boolean') { - opts.braces = true; - } - - if (glob.pattern === '.*') { - return { - pattern: '\\.' + star, - tokens: tok, - options: opts - }; - } - - if (glob.pattern === '*') { - return { - pattern: oneStar(opts.dot), - tokens: tok, - options: opts - }; - } - - // parse the glob pattern into tokens - glob.parse(); - var tok = glob.tokens; - tok.is.negated = opts.negated; - - // dotfile handling - if ((opts.dotfiles === true || tok.is.dotfile) && opts.dot !== false) { - opts.dotfiles = true; - opts.dot = true; - } - - if ((opts.dotdirs === true || tok.is.dotdir) && opts.dot !== false) { - opts.dotdirs = true; - opts.dot = true; - } - - // check for braces with a dotfile pattern - if (/[{,]\./.test(glob.pattern)) { - opts.makeRe = false; - opts.dot = true; - } - - if (opts.nonegate !== true) { - opts.negated = glob.negated; - } - - // if the leading character is a dot or a slash, escape it - if (glob.pattern.charAt(0) === '.' && glob.pattern.charAt(1) !== '/') { - glob.pattern = '\\' + glob.pattern; - } - - /** - * Extended globs - */ - - // expand braces, e.g `{1..5}` - glob.track('before braces'); - if (tok.is.braces) { - glob.braces(); - } - glob.track('after braces'); - - // expand extglobs, e.g `foo/!(a|b)` - glob.track('before extglob'); - if (tok.is.extglob) { - glob.extglob(); - } - glob.track('after extglob'); - - // expand brackets, e.g `[[:alpha:]]` - glob.track('before brackets'); - if (tok.is.brackets) { - glob.brackets(); - } - glob.track('after brackets'); - - // special patterns - glob._replace('[!', '[^'); - glob._replace('(?', '(%~'); - glob._replace(/\[\]/, '\\[\\]'); - glob._replace('/[', '/' + (opts.dot ? dotfiles : nodot) + '[', true); - glob._replace('/?', '/' + (opts.dot ? dotfiles : nodot) + '[^/]', true); - glob._replace('/.', '/(?=.)\\.', true); - - // windows drives - glob._replace(/^(\w):([\\\/]+?)/gi, '(?=.)$1:$2', true); - - // negate slashes in exclusion ranges - if (glob.pattern.indexOf('[^') !== -1) { - glob.pattern = negateSlash(glob.pattern); - } - - if (opts.globstar !== false && glob.pattern === '**') { - glob.pattern = globstar(opts.dot); - - } else { - glob.pattern = balance(glob.pattern, '[', ']'); - glob.escape(glob.pattern); - - // if the pattern has `**` - if (tok.is.globstar) { - glob.pattern = collapse(glob.pattern, '/**'); - glob.pattern = collapse(glob.pattern, '**/'); - glob._replace('/**/', '(?:/' + globstar(opts.dot) + '/|/)', true); - glob._replace(/\*{2,}/g, '**'); - - // 'foo/*' - glob._replace(/(\w+)\*(?!\/)/g, '$1[^/]*?', true); - glob._replace(/\*\*\/\*(\w)/g, globstar(opts.dot) + '\\/' + (opts.dot ? dotfiles : nodot) + '[^/]*?$1', true); - - if (opts.dot !== true) { - glob._replace(/\*\*\/(.)/g, '(?:**\\/|)$1'); - } - - // 'foo/**' or '{**,*}', but not 'foo**' - if (tok.path.dirname !== '' || /,\*\*|\*\*,/.test(glob.orig)) { - glob._replace('**', globstar(opts.dot), true); - } - } - - // ends with /* - glob._replace(/\/\*$/, '\\/' + oneStar(opts.dot), true); - // ends with *, no slashes - glob._replace(/(?!\/)\*$/, star, true); - // has 'n*.' (partial wildcard w/ file extension) - glob._replace(/([^\/]+)\*/, '$1' + oneStar(true), true); - // has '*' - glob._replace('*', oneStar(opts.dot), true); - glob._replace('?.', '?\\.', true); - glob._replace('?:', '?:', true); - - glob._replace(/\?+/g, function(match) { - var len = match.length; - if (len === 1) { - return qmark; - } - return qmark + '{' + len + '}'; - }); - - // escape '.abc' => '\\.abc' - glob._replace(/\.([*\w]+)/g, '\\.$1'); - // fix '[^\\\\/]' - glob._replace(/\[\^[\\\/]+\]/g, qmark); - // '///' => '\/' - glob._replace(/\/+/g, '\\/'); - // '\\\\\\' => '\\' - glob._replace(/\\{2,}/g, '\\'); - } - - // unescape previously escaped patterns - glob.unescape(glob.pattern); - glob._replace('__UNESC_STAR__', '*'); - - // escape dots that follow qmarks - glob._replace('?.', '?\\.'); - - // remove unnecessary slashes in character classes - glob._replace('[^\\/]', qmark); - - if (glob.pattern.length > 1) { - if (/^[\[?*]/.test(glob.pattern)) { - // only prepend the string if we don't want to match dotfiles - glob.pattern = (opts.dot ? dotfiles : nodot) + glob.pattern; - } - } - - return glob; -} - -/** - * Collapse repeated character sequences. - * - * ```js - * collapse('a/../../../b', '../'); - * //=> 'a/../b' - * ``` - * - * @param {String} `str` - * @param {String} `ch` Character sequence to collapse - * @return {String} - */ - -function collapse(str, ch) { - var res = str.split(ch); - var isFirst = res[0] === ''; - var isLast = res[res.length - 1] === ''; - res = res.filter(Boolean); - if (isFirst) res.unshift(''); - if (isLast) res.push(''); - return res.join(ch); -} - -/** - * Negate slashes in exclusion ranges, per glob spec: - * - * ```js - * negateSlash('[^foo]'); - * //=> '[^\\/foo]' - * ``` - * - * @param {String} `str` glob pattern - * @return {String} - */ - -function negateSlash(str) { - return str.replace(/\[\^([^\]]*?)\]/g, function(match, inner) { - if (inner.indexOf('/') === -1) { - inner = '\\/' + inner; - } - return '[^' + inner + ']'; - }); -} - -/** - * Escape imbalanced braces/bracket. This is a very - * basic, naive implementation that only does enough - * to serve the purpose. - */ - -function balance(str, a, b) { - var aarr = str.split(a); - var alen = aarr.join('').length; - var blen = str.split(b).join('').length; - - if (alen !== blen) { - str = aarr.join('\\' + a); - return str.split(b).join('\\' + b); - } - return str; -} - -/** - * Special patterns to be converted to regex. - * Heuristics are used to simplify patterns - * and speed up processing. - */ - -/* eslint no-multi-spaces: 0 */ -var qmark = '[^/]'; -var star = qmark + '*?'; -var nodot = '(?!\\.)(?=.)'; -var dotfileGlob = '(?:\\/|^)\\.{1,2}($|\\/)'; -var dotfiles = '(?!' + dotfileGlob + ')(?=.)'; -var twoStarDot = '(?:(?!' + dotfileGlob + ').)*?'; - -/** - * Create a regex for `*`. - * - * If `dot` is true, or the pattern does not begin with - * a leading star, then return the simpler regex. - */ - -function oneStar(dotfile) { - return dotfile ? '(?!' + dotfileGlob + ')(?=.)' + star : (nodot + star); -} - -function globstar(dotfile) { - if (dotfile) { return twoStarDot; } - return '(?:(?!(?:\\/|^)\\.).)*?'; -} diff --git a/lib/glob.js b/lib/glob.js deleted file mode 100644 index c6133267..00000000 --- a/lib/glob.js +++ /dev/null @@ -1,193 +0,0 @@ -'use strict'; - -var chars = require('./chars'); -var utils = require('./utils'); - -/** - * Expose `Glob` - */ - -var Glob = module.exports = function Glob(pattern, options) { - if (!(this instanceof Glob)) { - return new Glob(pattern, options); - } - this.options = options || {}; - this.pattern = pattern; - this.history = []; - this.tokens = {}; - this.init(pattern); -}; - -/** - * Initialize defaults - */ - -Glob.prototype.init = function(pattern) { - this.orig = pattern; - this.negated = this.isNegated(); - this.options.track = this.options.track || false; - this.options.makeRe = true; -}; - -/** - * Push a change into `glob.history`. Useful - * for debugging. - */ - -Glob.prototype.track = function(msg) { - if (this.options.track) { - this.history.push({msg: msg, pattern: this.pattern}); - } -}; - -/** - * Return true if `glob.pattern` was negated - * with `!`, also remove the `!` from the pattern. - * - * @return {Boolean} - */ - -Glob.prototype.isNegated = function() { - if (this.pattern.charCodeAt(0) === 33 /* '!' */) { - this.pattern = this.pattern.slice(1); - return true; - } - return false; -}; - -/** - * Expand braces in the given glob pattern. - * - * We only need to use the [braces] lib when - * patterns are nested. - */ - -Glob.prototype.braces = function() { - if (this.options.nobraces !== true && this.options.nobrace !== true) { - // naive/fast check for imbalanced characters - var a = this.pattern.match(/[\{\(\[]/g); - var b = this.pattern.match(/[\}\)\]]/g); - - // if imbalanced, don't optimize the pattern - if (a && b && (a.length !== b.length)) { - this.options.makeRe = false; - } - - // expand brace patterns and join the resulting array - var expanded = utils.braces(this.pattern, this.options); - this.pattern = expanded.join('|'); - } -}; - -/** - * Expand bracket expressions in `glob.pattern` - */ - -Glob.prototype.brackets = function() { - if (this.options.nobrackets !== true) { - this.pattern = utils.brackets(this.pattern); - } -}; - -/** - * Expand bracket expressions in `glob.pattern` - */ - -Glob.prototype.extglob = function() { - if (this.options.noextglob === true) return; - - if (utils.isExtglob(this.pattern)) { - this.pattern = utils.extglob(this.pattern, {escape: true}); - } -}; - -/** - * Parse the given pattern - */ - -Glob.prototype.parse = function(pattern) { - this.tokens = utils.parseGlob(pattern || this.pattern, true); - return this.tokens; -}; - -/** - * Replace `a` with `b`. Also tracks the change before and - * after each replacement. This is disabled by default, but - * can be enabled by setting `options.track` to true. - * - * Also, when the pattern is a string, `.split()` is used, - * because it's much faster than replace. - * - * @param {RegExp|String} `a` - * @param {String} `b` - * @param {Boolean} `escape` When `true`, escapes `*` and `?` in the replacement. - * @return {String} - */ - -Glob.prototype._replace = function(a, b, escape) { - this.track('before (find): "' + a + '" (replace with): "' + b + '"'); - if (escape) b = esc(b); - if (a && b && typeof a === 'string') { - this.pattern = this.pattern.split(a).join(b); - } else { - this.pattern = this.pattern.replace(a, b); - } - this.track('after'); -}; - -/** - * Escape special characters in the given string. - * - * @param {String} `str` Glob pattern - * @return {String} - */ - -Glob.prototype.escape = function(str) { - this.track('before escape: '); - var re = /["\\](['"]?[^"'\\]['"]?)/g; - - this.pattern = str.replace(re, function($0, $1) { - var o = chars.ESC; - var ch = o && o[$1]; - if (ch) { - return ch; - } - if (/[a-z]/i.test($0)) { - return $0.split('\\').join(''); - } - return $0; - }); - - this.track('after escape: '); -}; - -/** - * Unescape special characters in the given string. - * - * @param {String} `str` - * @return {String} - */ - -Glob.prototype.unescape = function(str) { - var re = /__([A-Z]+)_([A-Z]+)__/g; - this.pattern = str.replace(re, function($0, $1) { - return chars[$1][$0]; - }); - this.pattern = unesc(this.pattern); -}; - -/** - * Escape/unescape utils - */ - -function esc(str) { - str = str.split('?').join('%~'); - str = str.split('*').join('%%'); - return str; -} - -function unesc(str) { - str = str.split('%~').join('?'); - str = str.split('%%').join('*'); - return str; -} diff --git a/lib/parsers.js b/lib/parsers.js new file mode 100644 index 00000000..f80498ce --- /dev/null +++ b/lib/parsers.js @@ -0,0 +1,83 @@ +'use strict'; + +var extglob = require('extglob'); +var nanomatch = require('nanomatch'); +var regexNot = require('regex-not'); +var toRegex = require('to-regex'); +var not; + +/** + * Characters to use in negation regex (we want to "not" match + * characters that are matched by other parsers) + */ + +var TEXT = '([!@*?+]?\\(|\\)|\\[:?(?=.*?:?\\])|:?\\]|[*+?!^$.\\\\/])+'; +var createNotRegex = function(opts) { + return not || (not = textRegex(TEXT)); +}; + +/** + * Parsers + */ + +module.exports = function(snapdragon) { + var parsers = snapdragon.parser.parsers; + + // register nanomatch parsers + snapdragon.use(nanomatch.parsers); + + // get references to some specific nanomatch parsers before they + // are overridden by the extglob and/or parsers + var escape = parsers.escape; + var slash = parsers.slash; + var qmark = parsers.qmark; + var plus = parsers.plus; + var star = parsers.star; + var dot = parsers.dot; + + // register extglob parsers + snapdragon.use(extglob.parsers); + + // custom micromatch parsers + snapdragon.parser + .use(function() { + // override "notRegex" created in nanomatch parser + this.notRegex = /^\!+(?!\()/; + }) + // reset the referenced parsers + .capture('escape', escape) + .capture('slash', slash) + .capture('qmark', qmark) + .capture('star', star) + .capture('plus', plus) + .capture('dot', dot) + + /** + * Override `text` parser + */ + + .capture('text', function() { + if (this.isInside('bracket')) return; + var pos = this.position(); + var m = this.match(createNotRegex(this.options)); + if (!m || !m[0]) return; + + // escape regex boundary characters and simple brackets + var val = m[0].replace(/([[\]^$])/g, '\\$1'); + + return pos({ + type: 'text', + val: val + }); + }); +}; + +/** + * Create text regex + */ + +function textRegex(pattern) { + var notStr = regexNot.create(pattern, {contains: true, strictClose: false}); + var prefix = '(?:[\\^]|\\\\|'; + return toRegex(prefix + notStr + ')', {strictClose: false}); +} diff --git a/lib/utils.js b/lib/utils.js index 7c24a510..0dc0982e 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -1,70 +1,189 @@ 'use strict'; -var win32 = process && process.platform === 'win32'; -var path = require('path'); -var fileRe = require('filename-regex'); var utils = module.exports; +var path = require('path'); /** * Module dependencies */ +var Snapdragon = require('snapdragon'); +utils.define = require('define-property'); utils.diff = require('arr-diff'); -utils.unique = require('array-unique'); -utils.braces = require('braces'); -utils.brackets = require('expand-brackets'); -utils.extglob = require('extglob'); -utils.isExtglob = require('is-extglob'); -utils.isGlob = require('is-glob'); +utils.extend = require('extend-shallow'); +utils.pick = require('object.pick'); utils.typeOf = require('kind-of'); -utils.normalize = require('normalize-path'); -utils.omit = require('object.omit'); -utils.parseGlob = require('parse-glob'); -utils.cache = require('regex-cache'); +utils.unique = require('array-unique'); + +/** + * Returns true if the platform is windows, or `path.sep` is `\\`. + * This is defined as a function to allow `path.sep` to be set in unit tests, + * or by the user, if there is a reason to do so. + * @return {Boolean} + */ + +utils.isWindows = function() { + return path.sep === '\\' || process.platform === 'win32'; +}; + +/** + * Get the `Snapdragon` instance to use + */ + +utils.instantiate = function(ast, options) { + var snapdragon; + // if an instance was created by `.parse`, use that instance + if (utils.typeOf(ast) === 'object' && ast.snapdragon) { + snapdragon = ast.snapdragon; + // if the user supplies an instance on options, use that instance + } else if (utils.typeOf(options) === 'object' && options.snapdragon) { + snapdragon = options.snapdragon; + // create a new instance + } else { + snapdragon = new Snapdragon(options); + } + + utils.define(snapdragon, 'parse', function(str, options) { + var parsed = Snapdragon.prototype.parse.apply(this, arguments); + parsed.input = str; + + // escape unmatched brace/bracket/parens + var last = this.parser.stack.pop(); + if (last && this.options.strictErrors !== true) { + var open = last.nodes[0]; + var inner = last.nodes[1]; + if (last.type === 'bracket') { + if (inner.val.charAt(0) === '[') { + inner.val = '\\' + inner.val; + } + + } else { + open.val = '\\' + open.val; + var sibling = open.parent.nodes[1]; + if (sibling.type === 'star') { + sibling.loose = true; + } + } + } + + // add non-enumerable parser reference + utils.define(parsed, 'parser', this.parser); + return parsed; + }); + + return snapdragon; +}; + +/** + * Create the key to use for memoization. The key is generated + * by iterating over the options and concatenating key-value pairs + * to the pattern string. + */ + +utils.createKey = function(pattern, options) { + if (typeof options === 'undefined') { + return pattern; + } + var val = pattern; + var keys = Object.keys(options); + for (var i = 0; i < keys.length; i++) { + var key = keys[i]; + val += ';' + key + '=' + String(options[key]); + } + return val; +}; + +/** + * Cast `val` to an array + * @return {Array} + */ + +utils.arrayify = function(val) { + if (typeof val === 'string') return [val]; + return val ? (Array.isArray(val) ? val : [val]) : []; +}; + +/** + * Return true if `val` is a non-empty string + */ + +utils.isString = function(val) { + return typeof val === 'string'; +}; + +/** + * Return true if `val` is a non-empty string + */ + +utils.isObject = function(val) { + return utils.typeOf(val) === 'object'; +}; /** - * Get the filename of a filepath + * Combines duplicate characters in the provided string. + * @param {String} `str` + * @returns {String} + */ + +utils.combineDuplicates = function(str, val) { + var re = new RegExp('(' + val + ')(?=(?:' + val + ')*\\1)', 'g'); + return str.replace(re, ''); +}; + +/** + * Returns true if the given `str` has special characters + */ + +utils.hasSpecialChars = function(str) { + return /(?:(?:(^|\/)[!.])|[*?+()|\[\]{}]|[+@]\()/.test(str); +}; + +/** + * Normalize slashes in the given filepath. * - * @param {String} `string` + * @param {String} `filepath` * @return {String} */ -utils.filename = function filename(fp) { - var seg = fp.match(fileRe()); - return seg && seg[0]; +utils.toPosixPath = function(str) { + return str.replace(/\\+/g, '/'); }; /** - * Returns a function that returns true if the given - * pattern is the same as a given `filepath` + * Strip backslashes before special characters in a string. * - * @param {String} `pattern` - * @return {Function} + * @param {String} `str` + * @return {String} */ -utils.isPath = function isPath(pattern, opts) { - opts = opts || {}; - return function(fp) { - var unixified = utils.unixify(fp, opts); - if(opts.nocase){ - return pattern.toLowerCase() === unixified.toLowerCase(); - } - return pattern === unixified; - }; +utils.unescape = function(str) { + return utils.toPosixPath(str.replace(/\\(?=[*+?!.])/g, '')); }; /** - * Returns a function that returns true if the given - * pattern contains a `filepath` - * - * @param {String} `pattern` - * @return {Function} + * Strip the prefix from a filepath + * @param {String} `fp` + * @return {String} */ -utils.hasPath = function hasPath(pattern, opts) { - return function(fp) { - return utils.unixify(pattern, opts).indexOf(fp) !== -1; - }; +utils.stripPrefix = function(str) { + if (str.charAt(0) !== '.') { + return str; + } + var ch = str.charAt(1); + if (utils.isSlash(ch)) { + return str.slice(2); + } + return str; +}; + +/** + * Returns true if the given str is an escaped or + * unescaped path character + */ + +utils.isSlash = function(str) { + return str === '/' || str === '\\/' || str === '\\' || str === '\\\\'; }; /** @@ -75,75 +194,119 @@ utils.hasPath = function hasPath(pattern, opts) { * @return {Function} */ -utils.matchPath = function matchPath(pattern, opts) { - var fn = (opts && opts.contains) - ? utils.hasPath(pattern, opts) - : utils.isPath(pattern, opts); - return fn; +utils.matchPath = function(pattern, options) { + return (options && options.contains) + ? utils.containsPattern(pattern, options) + : utils.equalsPattern(pattern, options); }; /** - * Returns a function that returns true if the given - * regex matches the `filename` of a file path. - * - * @param {RegExp} `re` - * @return {Boolean} + * Returns true if the given (original) filepath or unixified path are equal + * to the given pattern. */ -utils.hasFilename = function hasFilename(re) { - return function(fp) { - var name = utils.filename(fp); - return name && re.test(name); - }; +utils._equals = function(filepath, unixPath, pattern) { + return pattern === filepath || pattern === unixPath; }; /** - * Coerce `val` to an array - * - * @param {*} val - * @return {Array} + * Returns true if the given (original) filepath or unixified path contain + * the given pattern. */ -utils.arrayify = function arrayify(val) { - return !Array.isArray(val) - ? [val] - : val; +utils._contains = function(filepath, unixPath, pattern) { + return filepath.indexOf(pattern) !== -1 || unixPath.indexOf(pattern) !== -1; }; /** - * Normalize all slashes in a file path or glob pattern to - * forward slashes. + * Returns a function that returns true if the given + * pattern is the same as a given `filepath` + * + * @param {String} `pattern` + * @return {Function} */ -utils.unixify = function unixify(fp, opts) { - if (opts && opts.unixify === false) return fp; - if (opts && opts.unixify === true || win32 || path.sep === '\\') { - return utils.normalize(fp, false); - } - if (opts && opts.unescape === true) { - return fp ? fp.toString().replace(/\\(\w)/g, '$1') : ''; - } - return fp; +utils.equalsPattern = function(pattern, options) { + var unixify = utils.unixify(options); + options = options || {}; + + return function fn(filepath) { + var equal = utils._equals(filepath, unixify(filepath), pattern); + if (equal === true || options.nocase !== true) { + return equal; + } + var lower = filepath.toLowerCase(); + return utils._equals(lower, unixify(lower), pattern); + }; }; /** - * Escape/unescape utils + * Returns a function that returns true if the given + * pattern contains a `filepath` + * + * @param {String} `pattern` + * @return {Function} */ -utils.escapePath = function escapePath(fp) { - return fp.replace(/[\\.]/g, '\\$&'); +utils.containsPattern = function(pattern, options) { + var unixify = utils.unixify(options); + options = options || {}; + + return function(filepath) { + var contains = utils._contains(filepath, unixify(filepath), pattern); + if (contains === true || options.nocase !== true) { + return contains; + } + var lower = filepath.toLowerCase(); + return utils._contains(lower, unixify(lower), pattern); + }; }; -utils.unescapeGlob = function unescapeGlob(fp) { - return fp.replace(/[\\"']/g, ''); +/** + * Returns a function that returns true if the given + * regex matches the `filename` of a file path. + * + * @param {RegExp} `re` Matching regex + * @return {Function} + */ + +utils.matchBasename = function(re) { + return function(filepath) { + return re.test(filepath) || re.test(path.basename(filepath)); + }; }; -utils.escapeRe = function escapeRe(str) { - return str.replace(/[-[\\$*+?.#^\s{}(|)\]]/g, '\\$&'); +/** + * Determines the filepath to return based on the provided options. + * @return {any} + */ + +utils.value = function(str, unixify, options) { + if (options && options.unixify === false) { + return str; + } + return unixify(str); }; /** - * Expose `utils` + * Returns a function that normalizes slashes in a string to forward + * slashes, strips `./` from beginning of paths, and optionally unescapes + * special characters. + * @return {Function} */ -module.exports = utils; +utils.unixify = function(options) { + options = options || {}; + return function(filepath) { + if (utils.isWindows() || options.unixify === true) { + filepath = utils.toPosixPath(filepath); + } + if (options.stripPrefix !== false) { + filepath = utils.stripPrefix(filepath); + } + if (options.unescape === true) { + filepath = utils.unescape(filepath); + } + return filepath; + }; +}; diff --git a/package.json b/package.json index f2aef5b1..4c78130a 100644 --- a/package.json +++ b/package.json @@ -2,11 +2,24 @@ "name": "micromatch", "description": "Glob matching for javascript/node.js. A drop-in replacement and faster alternative to minimatch and multimatch.", "version": "2.3.11", - "homepage": "https://github.com/jonschlinkert/micromatch", + "homepage": "https://github.com/micromatch/micromatch", "author": "Jon Schlinkert (https://github.com/jonschlinkert)", - "repository": "jonschlinkert/micromatch", + "contributors": [ + "Amila Welihinda (amilajack.com)", + "Bogdan Chadkin (https://github.com/TrySound)", + "Brian Woodward (https://twitter.com/doowb)", + "Charlike Mike Reagent (https://i.am.charlike.online)", + "Elan Shanker (https://github.com/es128)", + "Fabrício Matté (http://ultcombo.js.org)", + "Jon Schlinkert (http://twitter.com/jonschlinkert)", + "Martin Kolárik (https://kolarik.sk)", + "Paul Miller (paulmillr.com)", + "Tom Byrer (https://github.com/tomByrer)", + "(https://github.com/DianeLooney)" + ], + "repository": "micromatch/micromatch", "bugs": { - "url": "https://github.com/jonschlinkert/micromatch/issues" + "url": "https://github.com/micromatch/micromatch/issues" }, "license": "MIT", "files": [ @@ -21,34 +34,33 @@ "test": "mocha" }, "dependencies": { - "arr-diff": "^2.0.0", - "array-unique": "^0.2.1", - "braces": "^1.8.2", - "expand-brackets": "^0.1.4", - "extglob": "^0.3.1", - "filename-regex": "^2.0.0", - "is-extglob": "^1.0.0", - "is-glob": "^2.0.1", - "kind-of": "^3.0.2", - "normalize-path": "^2.0.1", - "object.omit": "^2.0.0", - "parse-glob": "^3.0.4", - "regex-cache": "^0.4.2" + "arr-diff": "^3.0.0", + "array-unique": "^0.3.2", + "braces": "^2.0.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "extglob": "^1.1.0", + "fragment-cache": "^0.2.1", + "kind-of": "^3.1.0", + "nanomatch": "^1.1.1", + "object.pick": "^1.2.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "devDependencies": { - "benchmarked": "^0.1.4", - "chalk": "^1.1.1", - "gulp": "^3.9.0", - "gulp-eslint": "^1.1.1", - "gulp-format-md": "^0.1.8", - "gulp-istanbul": "^0.10.1", - "gulp-mocha": "^2.1.3", - "minimatch": "^3.0.0", + "bash-match": "^0.2.0", + "extend-shallow": "^2.0.1", + "for-own": "^1.0.0", + "gulp": "^3.9.1", + "gulp-istanbul": "^1.1.1", + "gulp-mocha": "^3.0.0", + "gulp-unused": "^0.2.1", + "is-windows": "^1.0.1", + "minimatch": "^3.0.3", "minimist": "^1.2.0", - "mocha": "^2", - "multimatch": "^2.0.0", - "should": "^8", - "write": "^0.2.1" + "mocha": "^3.4.2", + "multimatch": "^2.1.0" }, "keywords": [ "bash", @@ -67,6 +79,7 @@ "matcher", "matches", "matching", + "micromatch", "minimatch", "multimatch", "path", @@ -78,37 +91,56 @@ "shell", "wildcard" ], + "lintDeps": { + "dependencies": { + "lock": { + "snapdragon": "^0.8.1" + } + }, + "devDependencies": { + "options": { + "ignore": [ + "benchmark/**" + ] + }, + "files": [ + "examples/*.js", + "gulpfile.js", + "test/**/*.js" + ] + } + }, "verb": { + "toc": "collapsible", + "layout": "default", + "tasks": [ + "readme" + ], + "plugins": [ + "gulp-format-md" + ], + "helpers": [ + "./benchmark/helper.js" + ], "related": { "list": [ "braces", "expand-brackets", - "expand-range", "extglob", "fill-range", - "gulp-micromatch", - "is-glob", - "parse-glob" + "nanomatch" ] }, + "lint": { + "reflinks": true + }, "reflinks": [ - "braces", - "expand-brackets", "extglob", + "glob-object", "minimatch", "multimatch", - "verb" - ], - "toc": false, - "layout": false, - "tasks": [ - "readme" - ], - "plugins": [ - "gulp-format-md" - ], - "lint": { - "reflinks": true - } + "snapdragon", + "expand-brackets" + ] } } diff --git a/test/_fixtures.js b/test/_fixtures.js new file mode 100644 index 00000000..6133098f --- /dev/null +++ b/test/_fixtures.js @@ -0,0 +1,83 @@ +module.exports = [ + 'a', + 'a.md', + 'a.js', + 'a/', + 'a/b', + 'a/b/.c.md', + 'a/b/c', + 'a/b/c.md', + 'a/b/c/', + 'a/b/c/d', + 'a/b/c/d/', + 'a/b/c/d/e/f/z.js', + 'a/b/c/z.js', + 'a/bb', + 'a/cb', + 'abbbz', + 'abc', + 'abd', + 'z.js', + 'za.js', + + // literal "!" + '!a.js', + '!a/b', + '!a/b/', + '!a/b/c', + '!a/b/c/', + '!a/!b', + '!a/!b/c', + '!a/!b/c/d', + '!a/b/.c.md', + + // root + '/a/', + '/a/b', + '/a/cb', + '/a/bb', + '/a/b/c', + '/a/b/c/', + '/a/b/c/d', + '/a/b/c/d/', + + // cwd + '.', + './', + + // ancestor directories + '..', + '../c', + '../c', + './../c', + './a/../c', + '/..', + '/../c', + '/../.c', + '/../.c/', + '/a/../c', + 'a/../c', + + // dot files + '../.b/.c', + '../b/.c', + './.b/.c', + './b/.c', + '.b', + '.b.c', + '.b.c/', + '.b/', + '.b/.c', + '.b/c', + 'b/.c', + 'b/.c/', + + // wildcards in filepaths + 'a/+b/c', + '+a/+b/c', + 'a (foo)', + 'a (foo)/(bar)', + 'a/b/c (1)', + 'a/b (2)/c (1)', + 'a/b/c [def]', +]; diff --git a/test/support/patterns.js b/test/_patterns.js similarity index 63% rename from test/support/patterns.js rename to test/_patterns.js index a2b27908..8448f9a0 100644 --- a/test/support/patterns.js +++ b/test/_patterns.js @@ -1,4 +1,93 @@ module.exports = [ + '!**', + '!**/*', + '!**/*.md', + '!*.*', + '!*.js', + '!*/**/*', + '!*/**/*/', + '!*/*/*', + '!/**', + '!/**/', + '!/*/', + '!/*/**/*/', + '!/*/*/', + '!a/!b*', + '!a/!b/*', + '!a/*?b', + '!a/?', + '!a/?*b', + '!a/??b', + '!a/?b', + '!a/b/!*', + '!a/b/*', + '!a/b/c*', + '*', + '**', + '***', + '**********', + '**/', + '**/*', + '**/**', + '**/**/**', + '**/*.md', + '**/*?.md', + '**/.?.md', + '**/?.md', + '**/z*.js', + '*.js', + '*/', + '*/*', + '*/*/*', + '*/*/*/*', + '/*', + '/**', + '/**/', + '/**/*', + '/*/', + '/*/*', + '/*/**/', + '/*/**/*', + '/*/*/', + '/*/*/*', + '/*/*/*/*', + '/*/*/*/*/', + '?', + '?*?******?', + '?*?***?', + '?*?***?***????', + '?*?*?', + '?/', + '?/.?', + '?/.?*', + '?/?', + '?/?/?', + '??', + '??/??', + '???', + '????', + 'a/*', + 'a/*/', + 'a/b/*', + 'a/**/', + 'a/**/b', + 'a/**b', + 'a/*/', + 'a/*?b', + 'a/?', + 'a/?*b', + 'a/??b', + 'a/?b', + 'a/b', + 'a/b*', + 'a/b/*', + 'a/b/c', + 'a/b/c/*', + 'a/b/c/**/*.js', + 'a/b/c/*.js', +]; + +module.exports.other = [ 'code/{for,while,*-{test,exec}}*.js', 'code/{for-*,while*}.js', '**/a/*/b/c/.js', @@ -102,5 +191,5 @@ module.exports = [ 'E:**/*.js', 'E:**/*.md', 'E:\\\\**/*.js', - 'E:\\\\**/*.md', -]; \ No newline at end of file + 'E:\\\\**/*.md' +]; diff --git a/test/actual/micro-dot-matchBase.js b/test/actual/micro-dot-matchBase.js deleted file mode 100644 index 6cc8f578..00000000 --- a/test/actual/micro-dot-matchBase.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("**/a/*/b/c/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b\/c\/\.js)$/); - -var actual = fn("**/a/*/b/c.d/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b\/c\.d\/\.js)$/); - -var actual = fn("**/*.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/*.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|gitignore))$/); - -var actual = fn("**/{a,/.gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(a|\/\.gitignore))$/); - -var actual = fn("**/{a..z..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(a|c|e|g|i|k|m|o|q|s|u|w|y)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{a..c}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[a-c]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[1-10]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(1|3|5|7|9)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[b-s]\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[01-10]\.js)$/); - -var actual = fn("a"); -actual.should.eql(/^(?:a)$/); - -var actual = fn("a/"); -actual.should.eql(/^(?:a\/)$/); - -var actual = fn("a/*"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?)$/); - -var actual = fn(".*"); -actual.should.eql(/^(?:(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/*.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("**/*."); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.)$/); - -var actual = fn("**/*.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.a)$/); - -var actual = fn("**/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\.js)$/); - -var actual = fn("**/.*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\.md)$/); - -var actual = fn("**/.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.a)$/); - -var actual = fn("**/.a.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.a\.js)$/); - -var actual = fn("**/.gitignore"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("*.*"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.a"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.a)$/); - -var actual = fn("*.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*.{gitignore,*}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(gitignore|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?))$/); - -var actual = fn("*.{*,gitignore,js}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore|js))$/); - -var actual = fn("*.{*,gitignore}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore))$/); - -var actual = fn(".{*,gitignore}"); -actual.should.eql(/^(?:.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/.(js|gitignore))$/); - -var actual = fn("**/.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/.(js|md))$/); - -var actual = fn("**/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(a|b)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[a-z]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("*.js"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("*.md"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("*.{js,txt}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|txt))$/); - -var actual = fn("*/*.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*/.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.gitignore)$/); - -var actual = fn(".a"); -actual.should.eql(/^(?:\.a)$/); - -var actual = fn(".gitignore"); -actual.should.eql(/^(?:\.gitignore)$/); - -var actual = fn(".js"); -actual.should.eql(/^(?:\.js)$/); - -var actual = fn(".md"); -actual.should.eql(/^(?:\.md)$/); - -var actual = fn("a/**/c/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/c/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/j/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/j\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/j/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/j\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.txt"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.txt)$/); - -var actual = fn("a/*/.b"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.b)$/); - -var actual = fn("a/*/.b.a"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.b\.a)$/); - -var actual = fn("a/*/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.js)$/); - -var actual = fn("a/*/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.md)$/); - -var actual = fn("a/*/b"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b)$/); - -var actual = fn("a/*/c/*.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*/c/*.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/.*/b"); -actual.should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - -var actual = fn("a/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.js)$/); - -var actual = fn("a/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.md)$/); - -var actual = fn("a/?/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\.js)$/); - -var actual = fn("a/?/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\.md)$/); - -var actual = fn("a/?/c/?/*/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/e\.js)$/); - -var actual = fn("a/?/c/?/*/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/e\.md)$/); - -var actual = fn("a/?/c/?/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/e\.js)$/); - -var actual = fn("a/?/c/?/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/e\.md)$/); - -var actual = fn("a/?/c/???/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]..\/e\.js)$/); - -var actual = fn("a/?/c/???/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]..\/e\.md)$/); - -var actual = fn("a/??/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/].\/c\.js)$/); - -var actual = fn("a/??/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/].\/c\.md)$/); - -var actual = fn("a/???/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]..\/c\.js)$/); - -var actual = fn("a/???/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]..\/c\.md)$/); - -var actual = fn("a/????/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]...\/c\.js)$/); - -var actual = fn("a/????/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]...\/c\.md)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c(d|e)\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.js)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c(d|e)\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.md)$/); - -var actual = fn("a/b/c/*.js"); -actual.should.eql(/^(?:a\/b\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("A/b/C/*.js"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c/*.md"); -actual.should.eql(/^(?:a\/b\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.md"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.MD"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.MD)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|a\/b\/ce(f|g)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md|a\/b\/ce(f|g)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/*.js"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e}/*.md"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/xyz\.js)$/); - -var actual = fn("a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/xyz\.md)$/); - -var actual = fn("a/{c..e}.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[c-e]\.js)$/); - -var actual = fn("E:**/*.js"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("E:**/*.md"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("E:\\**/*.js"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("E:\\**/*.md"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); diff --git a/test/actual/micro-dot.js b/test/actual/micro-dot.js deleted file mode 100644 index 6cc8f578..00000000 --- a/test/actual/micro-dot.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("**/a/*/b/c/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b\/c\/\.js)$/); - -var actual = fn("**/a/*/b/c.d/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b\/c\.d\/\.js)$/); - -var actual = fn("**/*.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/*.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|gitignore))$/); - -var actual = fn("**/{a,/.gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(a|\/\.gitignore))$/); - -var actual = fn("**/{a..z..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(a|c|e|g|i|k|m|o|q|s|u|w|y)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{a..c}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[a-c]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[1-10]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(1|3|5|7|9)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[b-s]\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[01-10]\.js)$/); - -var actual = fn("a"); -actual.should.eql(/^(?:a)$/); - -var actual = fn("a/"); -actual.should.eql(/^(?:a\/)$/); - -var actual = fn("a/*"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?)$/); - -var actual = fn(".*"); -actual.should.eql(/^(?:(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/*.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("**/*."); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.)$/); - -var actual = fn("**/*.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.a)$/); - -var actual = fn("**/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\.js)$/); - -var actual = fn("**/.*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\.md)$/); - -var actual = fn("**/.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.a)$/); - -var actual = fn("**/.a.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.a\.js)$/); - -var actual = fn("**/.gitignore"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("*.*"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.a"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.a)$/); - -var actual = fn("*.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*.{gitignore,*}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(gitignore|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?))$/); - -var actual = fn("*.{*,gitignore,js}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore|js))$/); - -var actual = fn("*.{*,gitignore}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore))$/); - -var actual = fn(".{*,gitignore}"); -actual.should.eql(/^(?:.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/.((?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/.(js|gitignore))$/); - -var actual = fn("**/.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/.(js|md))$/); - -var actual = fn("**/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(a|b)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[a-z]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("*.js"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("*.md"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("*.{js,txt}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.(js|txt))$/); - -var actual = fn("*/*.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*/.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.gitignore)$/); - -var actual = fn(".a"); -actual.should.eql(/^(?:\.a)$/); - -var actual = fn(".gitignore"); -actual.should.eql(/^(?:\.gitignore)$/); - -var actual = fn(".js"); -actual.should.eql(/^(?:\.js)$/); - -var actual = fn(".md"); -actual.should.eql(/^(?:\.md)$/); - -var actual = fn("a/**/c/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/c/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/j/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/j\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/j/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/j\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.txt"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.txt)$/); - -var actual = fn("a/*/.b"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.b)$/); - -var actual = fn("a/*/.b.a"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.b\.a)$/); - -var actual = fn("a/*/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.js)$/); - -var actual = fn("a/*/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.md)$/); - -var actual = fn("a/*/b"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b)$/); - -var actual = fn("a/*/c/*.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*/c/*.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/.*/b"); -actual.should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - -var actual = fn("a/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.js)$/); - -var actual = fn("a/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.md)$/); - -var actual = fn("a/?/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\.js)$/); - -var actual = fn("a/?/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\.md)$/); - -var actual = fn("a/?/c/?/*/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/e\.js)$/); - -var actual = fn("a/?/c/?/*/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/e\.md)$/); - -var actual = fn("a/?/c/?/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/e\.js)$/); - -var actual = fn("a/?/c/?/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/e\.md)$/); - -var actual = fn("a/?/c/???/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]..\/e\.js)$/); - -var actual = fn("a/?/c/???/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]..\/e\.md)$/); - -var actual = fn("a/??/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/].\/c\.js)$/); - -var actual = fn("a/??/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/].\/c\.md)$/); - -var actual = fn("a/???/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]..\/c\.js)$/); - -var actual = fn("a/???/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]..\/c\.md)$/); - -var actual = fn("a/????/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]...\/c\.js)$/); - -var actual = fn("a/????/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]...\/c\.md)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c(d|e)\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.js)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c(d|e)\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.md)$/); - -var actual = fn("a/b/c/*.js"); -actual.should.eql(/^(?:a\/b\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("A/b/C/*.js"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c/*.md"); -actual.should.eql(/^(?:a\/b\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.md"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.MD"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.MD)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|a\/b\/ce(f|g)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md|a\/b\/ce(f|g)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/*.js"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e}/*.md"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/xyz\.js)$/); - -var actual = fn("a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/xyz\.md)$/); - -var actual = fn("a/{c..e}.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[c-e]\.js)$/); - -var actual = fn("E:**/*.js"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("E:**/*.md"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("E:\\**/*.js"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("E:\\**/*.md"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); diff --git a/test/actual/micro-matchBase.js b/test/actual/micro-matchBase.js deleted file mode 100644 index a45f84bc..00000000 --- a/test/actual/micro-matchBase.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("**/a/*/b/c/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\/\.js)$/); - -var actual = fn("**/a/*/b/c.d/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\.d\/\.js)$/); - -var actual = fn("**/*.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/*.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.(js|gitignore))$/); - -var actual = fn("**/{a,/.gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(a|\/\.gitignore))$/); - -var actual = fn("**/{a..z..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(a|c|e|g|i|k|m|o|q|s|u|w|y)\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{a..c}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-c]\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[1-10]\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(1|3|5|7|9)\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[b-s]\/xyz\/(?!\.)(?=.)[^/]*?-(?!\.)(?=.)[01-10]\.js)$/); - -var actual = fn("a"); -actual.should.eql(/^(?:a)$/); - -var actual = fn("a/"); -actual.should.eql(/^(?:a\/)$/); - -var actual = fn("a/*"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?)$/); - -var actual = fn(".*"); -actual.should.eql(/^(?:(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/*.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("**/*."); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.)$/); - -var actual = fn("**/*.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.a)$/); - -var actual = fn("**/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.js)$/); - -var actual = fn("**/.*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.md)$/); - -var actual = fn("**/.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.a)$/); - -var actual = fn("**/.a.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.a\.js)$/); - -var actual = fn("**/.gitignore"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("*.*"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.a"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.a)$/); - -var actual = fn("*.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*.{gitignore,*}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.(gitignore|(?!\.)(?=.)[^/]*?))$/); - -var actual = fn("*.{*,gitignore,js}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore|js))$/); - -var actual = fn("*.{*,gitignore}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore))$/); - -var actual = fn(".{*,gitignore}"); -actual.should.eql(/^(?:.((?!\.)(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/.((?!\.)(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/.(js|gitignore))$/); - -var actual = fn("**/.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/.(js|md))$/); - -var actual = fn("**/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(a|b)\/(?!\.)(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("*.js"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("*.md"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("*.{js,txt}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.(js|txt))$/); - -var actual = fn("*/*.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*/.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\/\.gitignore)$/); - -var actual = fn(".a"); -actual.should.eql(/^(?:\.a)$/); - -var actual = fn(".gitignore"); -actual.should.eql(/^(?:\.gitignore)$/); - -var actual = fn(".js"); -actual.should.eql(/^(?:\.js)$/); - -var actual = fn(".md"); -actual.should.eql(/^(?:\.md)$/); - -var actual = fn("a/**/c/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/c/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/j/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/j/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.txt"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.txt)$/); - -var actual = fn("a/*/.b"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/\.b)$/); - -var actual = fn("a/*/.b.a"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/\.b\.a)$/); - -var actual = fn("a/*/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$/); - -var actual = fn("a/*/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$/); - -var actual = fn("a/*/b"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/b)$/); - -var actual = fn("a/*/c/*.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*/c/*.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/.*/b"); -actual.should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - -var actual = fn("a/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$/); - -var actual = fn("a/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$/); - -var actual = fn("a/?/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\.js)$/); - -var actual = fn("a/?/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\.md)$/); - -var actual = fn("a/?/c/?/*/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.js)$/); - -var actual = fn("a/?/c/?/*/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.md)$/); - -var actual = fn("a/?/c/?/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.js)$/); - -var actual = fn("a/?/c/?/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.md)$/); - -var actual = fn("a/?/c/???/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]..\/e\.js)$/); - -var actual = fn("a/?/c/???/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]..\/e\.md)$/); - -var actual = fn("a/??/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/].\/c\.js)$/); - -var actual = fn("a/??/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/].\/c\.md)$/); - -var actual = fn("a/???/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]..\/c\.js)$/); - -var actual = fn("a/???/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]..\/c\.md)$/); - -var actual = fn("a/????/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]...\/c\.js)$/); - -var actual = fn("a/????/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]...\/c\.md)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/c(d|e)\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/c(d|e)\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md)$/); - -var actual = fn("a/b/c/*.js"); -actual.should.eql(/^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("A/b/C/*.js"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c/*.md"); -actual.should.eql(/^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.md"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.MD"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.MD)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ce(f|g)\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ce(f|g)\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/*.js"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e}/*.md"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/xyz\.js)$/); - -var actual = fn("a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/xyz\.md)$/); - -var actual = fn("a/{c..e}.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[c-e]\.js)$/); - -var actual = fn("E:**/*.js"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("E:**/*.md"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("E:\\**/*.js"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("E:\\**/*.md"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$/); diff --git a/test/actual/micro-negate.js b/test/actual/micro-negate.js deleted file mode 100644 index 07c3b415..00000000 --- a/test/actual/micro-negate.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("!**/a/*/b/c/.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\/\.js)$).*$/); - -var actual = fn("!**/a/*/b/c.d/.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\.d\/\.js)$).*$/); - -var actual = fn("!**/*.{*,gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore))$).*$/); - -var actual = fn("!**/*.{js,gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.(js|gitignore))$).*$/); - -var actual = fn("!**/{a,/.gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(a|\/\.gitignore))$).*$/); - -var actual = fn("!**/{a..z..2}/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(a|c|e|g|i|k|m|o|q|s|u|w|y)\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!**/{a..c}/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-c]\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!**/{1..10}/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[1-10]\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!**/{1..10..2}/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(1|3|5|7|9)\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[b-s]\/xyz\/(?!\.)(?=.)[^/]*?-(?!\.)(?=.)[01-10]\.js)$).*$/); - -var actual = fn("!a"); -actual.should.eql(/^(?!^(?:a)$).*$/); - -var actual = fn("!a/"); -actual.should.eql(/^(?!^(?:a\/)$).*$/); - -var actual = fn("!a/*"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?)$).*$/); - -var actual = fn("!.*"); -actual.should.eql(/^(?!^(?:(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/**/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/**/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/.*/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/*.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?)$).*$/); - -var actual = fn("!**/*."); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.)$).*$/); - -var actual = fn("!**/*.a"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.a)$).*$/); - -var actual = fn("!**/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!**/*.md"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!**/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/.*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.js)$).*$/); - -var actual = fn("!**/.*.md"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.md)$).*$/); - -var actual = fn("!**/.a"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\.a)$).*$/); - -var actual = fn("!**/.a.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\.a\.js)$).*$/); - -var actual = fn("!**/.gitignore"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$).*$/); - -var actual = fn("!*.*"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.[^/]*?)$).*$/); - -var actual = fn("!*.a"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.a)$).*$/); - -var actual = fn("!*.gitignore"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.gitignore)$).*$/); - -var actual = fn("!*.{gitignore,*}"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.(gitignore|(?!\.)(?=.)[^/]*?))$).*$/); - -var actual = fn("!*.{*,gitignore,js}"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore|js))$).*$/); - -var actual = fn("!*.{*,gitignore}"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore))$).*$/); - -var actual = fn("!.{*,gitignore}"); -actual.should.eql(/^(?!^(?:.((?!\.)(?=.)[^/]*?|gitignore))$).*$/); - -var actual = fn("!**/.{*,gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/.((?!\.)(?=.)[^/]*?|gitignore))$).*$/); - -var actual = fn("!**/.{js,gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/.(js|gitignore))$).*$/); - -var actual = fn("!**/.{js,md}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/.(js|md))$).*$/); - -var actual = fn("!**/*.{js,md}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.(js|md))$).*$/); - -var actual = fn("!**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(a|b)\/(?!\.)(?=.)[^/]*?\.(js|md))$).*$/); - -var actual = fn("!**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.(js|md))$).*$/); - -var actual = fn("!*.js"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!*.md"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!*.{js,txt}"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.(js|txt))$).*$/); - -var actual = fn("!*/*.gitignore"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]*?\.gitignore)$).*$/); - -var actual = fn("!*/.gitignore"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\/\.gitignore)$).*$/); - -var actual = fn("!.a"); -actual.should.eql(/^(?!^(?:\.a)$).*$/); - -var actual = fn("!.gitignore"); -actual.should.eql(/^(?!^(?:\.gitignore)$).*$/); - -var actual = fn("!.js"); -actual.should.eql(/^(?!^(?:\.js)$).*$/); - -var actual = fn("!.md"); -actual.should.eql(/^(?!^(?:\.md)$).*$/); - -var actual = fn("!a/**/c/*.js"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/**/c/*.md"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/**/j/**/z/*.js"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/**/j/**/z/*.md"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/**/z/*.js"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/**/z/*.md"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/*.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/*.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/*.txt"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\.txt)$).*$/); - -var actual = fn("!a/*/.b"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/\.b)$).*$/); - -var actual = fn("!a/*/.b.a"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/\.b\.a)$).*$/); - -var actual = fn("!a/*/?/**/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$).*$/); - -var actual = fn("!a/*/?/**/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$).*$/); - -var actual = fn("!a/*/b"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/b)$).*$/); - -var actual = fn("!a/*/c/*.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/*/c/*.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/.*/b"); -actual.should.eql(/^(?!^(?:a\/(?=.)\.[^/]*?\/b)$).*$/); - -var actual = fn("!a/?/**/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$).*$/); - -var actual = fn("!a/?/**/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$).*$/); - -var actual = fn("!a/?/c.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\.js)$).*$/); - -var actual = fn("!a/?/c.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\.md)$).*$/); - -var actual = fn("!a/?/c/?/*/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.js)$).*$/); - -var actual = fn("!a/?/c/?/*/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.md)$).*$/); - -var actual = fn("!a/?/c/?/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.js)$).*$/); - -var actual = fn("!a/?/c/?/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.md)$).*$/); - -var actual = fn("!a/?/c/???/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]..\/e\.js)$).*$/); - -var actual = fn("!a/?/c/???/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]..\/e\.md)$).*$/); - -var actual = fn("!a/??/c.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/].\/c\.js)$).*$/); - -var actual = fn("!a/??/c.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/].\/c\.md)$).*$/); - -var actual = fn("!a/???/c.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]..\/c\.js)$).*$/); - -var actual = fn("!a/???/c.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]..\/c\.md)$).*$/); - -var actual = fn("!a/????/c.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]...\/c\.js)$).*$/); - -var actual = fn("!a/????/c.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]...\/c\.md)$).*$/); - -var actual = fn("!a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?!^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/c(d|e)\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js)$).*$/); - -var actual = fn("!a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?!^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/c(d|e)\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md)$).*$/); - -var actual = fn("!a/b/c/*.js"); -actual.should.eql(/^(?!^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!A/b/C/*.js"); -actual.should.eql(/^(?!^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/b/c/*.md"); -actual.should.eql(/^(?!^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!A/b/C/*.md"); -actual.should.eql(/^(?!^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!A/b/C/*.MD"); -actual.should.eql(/^(?!^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.MD)$).*$/); - -var actual = fn("!a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?!^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ce(f|g)\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?!^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ce(f|g)\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/b/c{d,e}/*.js"); -actual.should.eql(/^(?!^(?:a\/b\/c(d|e)\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/b/c{d,e}/*.md"); -actual.should.eql(/^(?!^(?:a\/b\/c(d|e)\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?!^(?:a\/b\/c(d|e)\/xyz\.js)$).*$/); - -var actual = fn("!a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?!^(?:a\/b\/c(d|e)\/xyz\.md)$).*$/); - -var actual = fn("!a/{c..e}.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[c-e]\.js)$).*$/); - -var actual = fn("!E:**/*.js"); -actual.should.eql(/^(?!^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!E:**/*.md"); -actual.should.eql(/^(?!^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!E:\\**/*.js"); -actual.should.eql(/^(?!^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!E:\\**/*.md"); -actual.should.eql(/^(?!^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$).*$/); diff --git a/test/actual/micro.js b/test/actual/micro.js deleted file mode 100644 index a45f84bc..00000000 --- a/test/actual/micro.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("**/a/*/b/c/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\/\.js)$/); - -var actual = fn("**/a/*/b/c.d/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\.d\/\.js)$/); - -var actual = fn("**/*.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/*.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.(js|gitignore))$/); - -var actual = fn("**/{a,/.gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(a|\/\.gitignore))$/); - -var actual = fn("**/{a..z..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(a|c|e|g|i|k|m|o|q|s|u|w|y)\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{a..c}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-c]\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[1-10]\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(1|3|5|7|9)\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[b-s]\/xyz\/(?!\.)(?=.)[^/]*?-(?!\.)(?=.)[01-10]\.js)$/); - -var actual = fn("a"); -actual.should.eql(/^(?:a)$/); - -var actual = fn("a/"); -actual.should.eql(/^(?:a\/)$/); - -var actual = fn("a/*"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?)$/); - -var actual = fn(".*"); -actual.should.eql(/^(?:(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/*.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("**/*."); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.)$/); - -var actual = fn("**/*.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.a)$/); - -var actual = fn("**/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.js)$/); - -var actual = fn("**/.*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.md)$/); - -var actual = fn("**/.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.a)$/); - -var actual = fn("**/.a.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.a\.js)$/); - -var actual = fn("**/.gitignore"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("*.*"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.a"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.a)$/); - -var actual = fn("*.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*.{gitignore,*}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.(gitignore|(?!\.)(?=.)[^/]*?))$/); - -var actual = fn("*.{*,gitignore,js}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore|js))$/); - -var actual = fn("*.{*,gitignore}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.((?!\.)(?=.)[^/]*?|gitignore))$/); - -var actual = fn(".{*,gitignore}"); -actual.should.eql(/^(?:.((?!\.)(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/.((?!\.)(?=.)[^/]*?|gitignore))$/); - -var actual = fn("**/.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/.(js|gitignore))$/); - -var actual = fn("**/.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/.(js|md))$/); - -var actual = fn("**/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(a|b)\/(?!\.)(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.(js|md))$/); - -var actual = fn("*.js"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("*.md"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("*.{js,txt}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.(js|txt))$/); - -var actual = fn("*/*.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*/.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\/\.gitignore)$/); - -var actual = fn(".a"); -actual.should.eql(/^(?:\.a)$/); - -var actual = fn(".gitignore"); -actual.should.eql(/^(?:\.gitignore)$/); - -var actual = fn(".js"); -actual.should.eql(/^(?:\.js)$/); - -var actual = fn(".md"); -actual.should.eql(/^(?:\.md)$/); - -var actual = fn("a/**/c/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/c/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/j/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/j/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.txt"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.txt)$/); - -var actual = fn("a/*/.b"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/\.b)$/); - -var actual = fn("a/*/.b.a"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/\.b\.a)$/); - -var actual = fn("a/*/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$/); - -var actual = fn("a/*/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$/); - -var actual = fn("a/*/b"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/b)$/); - -var actual = fn("a/*/c/*.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*/c/*.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/.*/b"); -actual.should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - -var actual = fn("a/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$/); - -var actual = fn("a/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$/); - -var actual = fn("a/?/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\.js)$/); - -var actual = fn("a/?/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\.md)$/); - -var actual = fn("a/?/c/?/*/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.js)$/); - -var actual = fn("a/?/c/?/*/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.md)$/); - -var actual = fn("a/?/c/?/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.js)$/); - -var actual = fn("a/?/c/?/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.md)$/); - -var actual = fn("a/?/c/???/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]..\/e\.js)$/); - -var actual = fn("a/?/c/???/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]..\/e\.md)$/); - -var actual = fn("a/??/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/].\/c\.js)$/); - -var actual = fn("a/??/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/].\/c\.md)$/); - -var actual = fn("a/???/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]..\/c\.js)$/); - -var actual = fn("a/???/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]..\/c\.md)$/); - -var actual = fn("a/????/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]...\/c\.js)$/); - -var actual = fn("a/????/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]...\/c\.md)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/c(d|e)\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/c(d|e)\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md)$/); - -var actual = fn("a/b/c/*.js"); -actual.should.eql(/^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("A/b/C/*.js"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c/*.md"); -actual.should.eql(/^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.md"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.MD"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.MD)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ce(f|g)\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ce(f|g)\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/*.js"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e}/*.md"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/xyz\.js)$/); - -var actual = fn("a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?:a\/b\/c(d|e)\/xyz\.md)$/); - -var actual = fn("a/{c..e}.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[c-e]\.js)$/); - -var actual = fn("E:**/*.js"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("E:**/*.md"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("E:\\**/*.js"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("E:\\**/*.md"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$/); diff --git a/test/actual/mini-dot-matchBase.js b/test/actual/mini-dot-matchBase.js deleted file mode 100644 index b09cc47d..00000000 --- a/test/actual/mini-dot-matchBase.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("**/a/*/b/c/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b\/c\/\.js)$/); - -var actual = fn("**/a/*/b/c.d/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b\/c\.d\/\.js)$/); - -var actual = fn("**/*.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("**/*.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("**/{a,/.gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("**/{a..z..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/g\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/i\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/k\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/m\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/o\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/q\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/s\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/u\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/w\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/y\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{a..c}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/b\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/1\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/2\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/3\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/4\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/5\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/6\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/7\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/8\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/9\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/10\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/1\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/3\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/5\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/7\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/9\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?:a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js)$/); - -var actual = fn("a"); -actual.should.eql(/^(?:a)$/); - -var actual = fn("a/"); -actual.should.eql(/^(?:a\/)$/); - -var actual = fn("a/*"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?)$/); - -var actual = fn(".*"); -actual.should.eql(/^(?:(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/*.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("**/*."); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.)$/); - -var actual = fn("**/*.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.a)$/); - -var actual = fn("**/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\.js)$/); - -var actual = fn("**/.*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\.md)$/); - -var actual = fn("**/.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.a)$/); - -var actual = fn("**/.a.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.a\.js)$/); - -var actual = fn("**/.gitignore"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("*.*"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.a"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.a)$/); - -var actual = fn("*.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*.{gitignore,*}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.{*,gitignore,js}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("*.{*,gitignore}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn(".{*,gitignore}"); -actual.should.eql(/^(?:(?=.)\.[^/]*?|\.gitignore)$/); - -var actual = fn("**/.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("**/.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("**/.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.md)$/); - -var actual = fn("**/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\(a\|b\)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\(a\|b\)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[a-z]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[a-z]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("*.js"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("*.md"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("*.{js,txt}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.txt)$/); - -var actual = fn("*/*.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*/.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.gitignore)$/); - -var actual = fn(".a"); -actual.should.eql(/^(?:\.a)$/); - -var actual = fn(".gitignore"); -actual.should.eql(/^(?:\.gitignore)$/); - -var actual = fn(".js"); -actual.should.eql(/^(?:\.js)$/); - -var actual = fn(".md"); -actual.should.eql(/^(?:\.md)$/); - -var actual = fn("a/**/c/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/c/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/j/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/j\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/j/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/j\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.txt"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.txt)$/); - -var actual = fn("a/*/.b"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.b)$/); - -var actual = fn("a/*/.b.a"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.b\.a)$/); - -var actual = fn("a/*/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.js)$/); - -var actual = fn("a/*/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.md)$/); - -var actual = fn("a/*/b"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b)$/); - -var actual = fn("a/*/c/*.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*/c/*.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/.*/b"); -actual.should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - -var actual = fn("a/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.js)$/); - -var actual = fn("a/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.md)$/); - -var actual = fn("a/?/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\.js)$/); - -var actual = fn("a/?/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\.md)$/); - -var actual = fn("a/?/c/?/*/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/e\.js)$/); - -var actual = fn("a/?/c/?/*/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/e\.md)$/); - -var actual = fn("a/?/c/?/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/e\.js)$/); - -var actual = fn("a/?/c/?/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/e\.md)$/); - -var actual = fn("a/?/c/???/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/]\/e\.js)$/); - -var actual = fn("a/?/c/???/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/]\/e\.md)$/); - -var actual = fn("a/??/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/]\/c\.js)$/); - -var actual = fn("a/??/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/]\/c\.md)$/); - -var actual = fn("a/???/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/]\/c\.js)$/); - -var actual = fn("a/???/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/]\/c\.md)$/); - -var actual = fn("a/????/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/][^/]\/c\.js)$/); - -var actual = fn("a/????/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/][^/]\/c\.md)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/cd\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.js|a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/ce\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.js)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/cd\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.md|a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/ce\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.md)$/); - -var actual = fn("a/b/c/*.js"); -actual.should.eql(/^(?:a\/b\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("A/b/C/*.js"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c/*.md"); -actual.should.eql(/^(?:a\/b\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.md"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.MD"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.MD)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|a\/b\/cef\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|a\/b\/ceg\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md|a\/b\/cef\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md|a\/b\/ceg\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|a\/b\/ce\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md|a\/b\/ce\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?:a\/b\/cd\/xyz\.js|a\/b\/ce\/xyz\.js)$/); - -var actual = fn("a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?:a\/b\/cd\/xyz\.md|a\/b\/ce\/xyz\.md)$/); - -var actual = fn("a/{c..e}.js"); -actual.should.eql(/^(?:a\/c\.js|a\/d\.js|a\/e\.js)$/); - -var actual = fn("E:**/*.js"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("E:**/*.md"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("E:\\**/*.js"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("E:\\**/*.md"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); diff --git a/test/actual/mini-dot.js b/test/actual/mini-dot.js deleted file mode 100644 index b09cc47d..00000000 --- a/test/actual/mini-dot.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("**/a/*/b/c/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b\/c\/\.js)$/); - -var actual = fn("**/a/*/b/c.d/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b\/c\.d\/\.js)$/); - -var actual = fn("**/*.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("**/*.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("**/{a,/.gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("**/{a..z..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/g\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/i\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/k\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/m\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/o\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/q\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/s\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/u\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/w\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/y\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{a..c}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/b\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/1\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/2\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/3\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/4\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/5\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/6\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/7\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/8\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/9\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/10\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/1\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/3\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/5\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/7\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/9\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?:a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/b\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/c\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/d\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/e\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/f\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/g\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/h\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/i\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/j\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/k\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/l\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/m\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/n\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/o\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/p\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/q\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/r\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-01\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-02\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-03\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-04\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-05\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-06\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-07\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-08\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-09\.js|a\/s\/xyz\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?-10\.js)$/); - -var actual = fn("a"); -actual.should.eql(/^(?:a)$/); - -var actual = fn("a/"); -actual.should.eql(/^(?:a\/)$/); - -var actual = fn("a/*"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?)$/); - -var actual = fn(".*"); -actual.should.eql(/^(?:(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/*.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("**/*."); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.)$/); - -var actual = fn("**/*.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.a)$/); - -var actual = fn("**/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("**/*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\.js)$/); - -var actual = fn("**/.*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?\.md)$/); - -var actual = fn("**/.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.a)$/); - -var actual = fn("**/.a.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.a\.js)$/); - -var actual = fn("**/.gitignore"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("*.*"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.a"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.a)$/); - -var actual = fn("*.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*.{gitignore,*}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.{*,gitignore,js}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("*.{*,gitignore}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.[^/]*?|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn(".{*,gitignore}"); -actual.should.eql(/^(?:(?=.)\.[^/]*?|\.gitignore)$/); - -var actual = fn("**/.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?=.)\.[^/]*?|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("**/.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.gitignore)$/); - -var actual = fn("**/.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\.md)$/); - -var actual = fn("**/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\(a\|b\)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/\(a\|b\)\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[a-z]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[a-z]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("*.js"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("*.md"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("*.{js,txt}"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.txt)$/); - -var actual = fn("*/*.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*/.gitignore"); -actual.should.eql(/^(?:(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.gitignore)$/); - -var actual = fn(".a"); -actual.should.eql(/^(?:\.a)$/); - -var actual = fn(".gitignore"); -actual.should.eql(/^(?:\.gitignore)$/); - -var actual = fn(".js"); -actual.should.eql(/^(?:\.js)$/); - -var actual = fn(".md"); -actual.should.eql(/^(?:\.md)$/); - -var actual = fn("a/**/c/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/c/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/j/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/j\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/j/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/j\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/z\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.txt"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.txt)$/); - -var actual = fn("a/*/.b"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.b)$/); - -var actual = fn("a/*/.b.a"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/\.b\.a)$/); - -var actual = fn("a/*/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.js)$/); - -var actual = fn("a/*/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.md)$/); - -var actual = fn("a/*/b"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b)$/); - -var actual = fn("a/*/c/*.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*/c/*.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/.*/b"); -actual.should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - -var actual = fn("a/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.js)$/); - -var actual = fn("a/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/e\.md)$/); - -var actual = fn("a/?/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\.js)$/); - -var actual = fn("a/?/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\.md)$/); - -var actual = fn("a/?/c/?/*/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/e\.js)$/); - -var actual = fn("a/?/c/?/*/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/e\.md)$/); - -var actual = fn("a/?/c/?/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/e\.js)$/); - -var actual = fn("a/?/c/?/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/e\.md)$/); - -var actual = fn("a/?/c/???/e.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/]\/e\.js)$/); - -var actual = fn("a/?/c/???/e.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/]\/e\.md)$/); - -var actual = fn("a/??/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/]\/c\.js)$/); - -var actual = fn("a/??/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/]\/c\.md)$/); - -var actual = fn("a/???/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/]\/c\.js)$/); - -var actual = fn("a/???/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/]\/c\.md)$/); - -var actual = fn("a/????/c.js"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/][^/]\/c\.js)$/); - -var actual = fn("a/????/c.md"); -actual.should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/][^/][^/][^/]\/c\.md)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/cd\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.js|a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/ce\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.js)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/cd\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.md|a\/b\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/ce\/(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?\/xyz\.md)$/); - -var actual = fn("a/b/c/*.js"); -actual.should.eql(/^(?:a\/b\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("A/b/C/*.js"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c/*.md"); -actual.should.eql(/^(?:a\/b\/c\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.md"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.MD"); -actual.should.eql(/^(?:A\/b\/C\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.MD)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|a\/b\/cef\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|a\/b\/ceg\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md|a\/b\/cef\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md|a\/b\/ceg\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js|a\/b\/ce\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md|a\/b\/ce\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?:a\/b\/cd\/xyz\.js|a\/b\/ce\/xyz\.js)$/); - -var actual = fn("a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?:a\/b\/cd\/xyz\.md|a\/b\/ce\/xyz\.md)$/); - -var actual = fn("a/{c..e}.js"); -actual.should.eql(/^(?:a\/c\.js|a\/d\.js|a\/e\.js)$/); - -var actual = fn("E:**/*.js"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("E:**/*.md"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); - -var actual = fn("E:\\**/*.js"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.js)$/); - -var actual = fn("E:\\**/*.md"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\.md)$/); diff --git a/test/actual/mini-matchBase.js b/test/actual/mini-matchBase.js deleted file mode 100644 index 1cd249fa..00000000 --- a/test/actual/mini-matchBase.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("**/a/*/b/c/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\/\.js)$/); - -var actual = fn("**/a/*/b/c.d/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\.d\/\.js)$/); - -var actual = fn("**/*.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("**/*.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("**/{a,/.gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("**/{a..z..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/e\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/g\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/i\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/k\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/m\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/o\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/q\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/s\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/u\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/w\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/y\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{a..c}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/b\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/1\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/2\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/3\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/4\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/5\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/6\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/7\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/8\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/9\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/10\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/1\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/3\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/5\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/7\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/9\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?:a\/b\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-10\.js)$/); - -var actual = fn("a"); -actual.should.eql(/^(?:a)$/); - -var actual = fn("a/"); -actual.should.eql(/^(?:a\/)$/); - -var actual = fn("a/*"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?)$/); - -var actual = fn(".*"); -actual.should.eql(/^(?:(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/*.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("**/*."); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.)$/); - -var actual = fn("**/*.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.a)$/); - -var actual = fn("**/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.js)$/); - -var actual = fn("**/.*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.md)$/); - -var actual = fn("**/.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.a)$/); - -var actual = fn("**/.a.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.a\.js)$/); - -var actual = fn("**/.gitignore"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("*.*"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.a"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.a)$/); - -var actual = fn("*.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*.{gitignore,*}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.gitignore|(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.{*,gitignore,js}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.[^/]*?|(?!\.)(?=.)[^/]*?\.gitignore|(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("*.{*,gitignore}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.[^/]*?|(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn(".{*,gitignore}"); -actual.should.eql(/^(?:(?=.)\.[^/]*?|\.gitignore)$/); - -var actual = fn("**/.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("**/.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.js|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("**/.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.js|(?:(?!(?:\/|^)\.).)*?\/\.md)$/); - -var actual = fn("**/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\(a\|b\)\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/\(a\|b\)\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("*.js"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("*.md"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("*.{js,txt}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.js|(?!\.)(?=.)[^/]*?\.txt)$/); - -var actual = fn("*/*.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*/.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\/\.gitignore)$/); - -var actual = fn(".a"); -actual.should.eql(/^(?:\.a)$/); - -var actual = fn(".gitignore"); -actual.should.eql(/^(?:\.gitignore)$/); - -var actual = fn(".js"); -actual.should.eql(/^(?:\.js)$/); - -var actual = fn(".md"); -actual.should.eql(/^(?:\.md)$/); - -var actual = fn("a/**/c/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/c/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/j/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/j/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.txt"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.txt)$/); - -var actual = fn("a/*/.b"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/\.b)$/); - -var actual = fn("a/*/.b.a"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/\.b\.a)$/); - -var actual = fn("a/*/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$/); - -var actual = fn("a/*/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$/); - -var actual = fn("a/*/b"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/b)$/); - -var actual = fn("a/*/c/*.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*/c/*.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/.*/b"); -actual.should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - -var actual = fn("a/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$/); - -var actual = fn("a/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$/); - -var actual = fn("a/?/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\.js)$/); - -var actual = fn("a/?/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\.md)$/); - -var actual = fn("a/?/c/?/*/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.js)$/); - -var actual = fn("a/?/c/?/*/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.md)$/); - -var actual = fn("a/?/c/?/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.js)$/); - -var actual = fn("a/?/c/?/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.md)$/); - -var actual = fn("a/?/c/???/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/][^/][^/]\/e\.js)$/); - -var actual = fn("a/?/c/???/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/][^/][^/]\/e\.md)$/); - -var actual = fn("a/??/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/]\/c\.js)$/); - -var actual = fn("a/??/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/]\/c\.md)$/); - -var actual = fn("a/???/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/][^/]\/c\.js)$/); - -var actual = fn("a/???/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/][^/]\/c\.md)$/); - -var actual = fn("a/????/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/][^/][^/]\/c\.js)$/); - -var actual = fn("a/????/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/][^/][^/]\/c\.md)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/cd\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js|a\/b\/(?:(?!(?:\/|^)\.).)*?\/ce\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/cd\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md|a\/b\/(?:(?!(?:\/|^)\.).)*?\/ce\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md)$/); - -var actual = fn("a/b/c/*.js"); -actual.should.eql(/^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("A/b/C/*.js"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c/*.md"); -actual.should.eql(/^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.md"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.MD"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.MD)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/cef\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ceg\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/cef\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ceg\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ce\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ce\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?:a\/b\/cd\/xyz\.js|a\/b\/ce\/xyz\.js)$/); - -var actual = fn("a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?:a\/b\/cd\/xyz\.md|a\/b\/ce\/xyz\.md)$/); - -var actual = fn("a/{c..e}.js"); -actual.should.eql(/^(?:a\/c\.js|a\/d\.js|a\/e\.js)$/); - -var actual = fn("E:**/*.js"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("E:**/*.md"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("E:\\**/*.js"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("E:\\**/*.md"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$/); diff --git a/test/actual/mini-negate.js b/test/actual/mini-negate.js deleted file mode 100644 index 426c24ed..00000000 --- a/test/actual/mini-negate.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("!**/a/*/b/c/.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\/\.js)$).*$/); - -var actual = fn("!**/a/*/b/c.d/.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\.d\/\.js)$).*$/); - -var actual = fn("!**/*.{*,gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.gitignore)$).*$/); - -var actual = fn("!**/*.{js,gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.gitignore)$).*$/); - -var actual = fn("!**/{a,/.gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/a|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$).*$/); - -var actual = fn("!**/{a..z..2}/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/e\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/g\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/i\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/k\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/m\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/o\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/q\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/s\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/u\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/w\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/y\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!**/{a..c}/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/b\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!**/{1..10}/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/1\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/2\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/3\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/4\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/5\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/6\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/7\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/8\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/9\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/10\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!**/{1..10..2}/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/1\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/3\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/5\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/7\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/9\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?!^(?:a\/b\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-10\.js)$).*$/); - -var actual = fn("!a"); -actual.should.eql(/^(?!^(?:a)$).*$/); - -var actual = fn("!a/"); -actual.should.eql(/^(?!^(?:a\/)$).*$/); - -var actual = fn("!a/*"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?)$).*$/); - -var actual = fn("!.*"); -actual.should.eql(/^(?!^(?:(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/**/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/**/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/.*/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/*.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?)$).*$/); - -var actual = fn("!**/*."); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.)$).*$/); - -var actual = fn("!**/*.a"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.a)$).*$/); - -var actual = fn("!**/*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!**/*.md"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!**/.*"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$).*$/); - -var actual = fn("!**/.*.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.js)$).*$/); - -var actual = fn("!**/.*.md"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.md)$).*$/); - -var actual = fn("!**/.a"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\.a)$).*$/); - -var actual = fn("!**/.a.js"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\.a\.js)$).*$/); - -var actual = fn("!**/.gitignore"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$).*$/); - -var actual = fn("!*.*"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.[^/]*?)$).*$/); - -var actual = fn("!*.a"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.a)$).*$/); - -var actual = fn("!*.gitignore"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.gitignore)$).*$/); - -var actual = fn("!*.{gitignore,*}"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.gitignore|(?!\.)(?=.)[^/]*?\.[^/]*?)$).*$/); - -var actual = fn("!*.{*,gitignore,js}"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.[^/]*?|(?!\.)(?=.)[^/]*?\.gitignore|(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!*.{*,gitignore}"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.[^/]*?|(?!\.)(?=.)[^/]*?\.gitignore)$).*$/); - -var actual = fn("!.{*,gitignore}"); -actual.should.eql(/^(?!^(?:(?=.)\.[^/]*?|\.gitignore)$).*$/); - -var actual = fn("!**/.{*,gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$).*$/); - -var actual = fn("!**/.{js,gitignore}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\.js|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$).*$/); - -var actual = fn("!**/.{js,md}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\.js|(?:(?!(?:\/|^)\.).)*?\/\.md)$).*$/); - -var actual = fn("!**/*.{js,md}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/\(a\|b\)\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/\(a\|b\)\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?!^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!*.js"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!*.md"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!*.{js,txt}"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\.js|(?!\.)(?=.)[^/]*?\.txt)$).*$/); - -var actual = fn("!*/*.gitignore"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]*?\.gitignore)$).*$/); - -var actual = fn("!*/.gitignore"); -actual.should.eql(/^(?!^(?:(?!\.)(?=.)[^/]*?\/\.gitignore)$).*$/); - -var actual = fn("!.a"); -actual.should.eql(/^(?!^(?:\.a)$).*$/); - -var actual = fn("!.gitignore"); -actual.should.eql(/^(?!^(?:\.gitignore)$).*$/); - -var actual = fn("!.js"); -actual.should.eql(/^(?!^(?:\.js)$).*$/); - -var actual = fn("!.md"); -actual.should.eql(/^(?!^(?:\.md)$).*$/); - -var actual = fn("!a/**/c/*.js"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/**/c/*.md"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/**/j/**/z/*.js"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/**/j/**/z/*.md"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/**/z/*.js"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/**/z/*.md"); -actual.should.eql(/^(?!^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/*.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/*.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/*.txt"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\.txt)$).*$/); - -var actual = fn("!a/*/.b"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/\.b)$).*$/); - -var actual = fn("!a/*/.b.a"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/\.b\.a)$).*$/); - -var actual = fn("!a/*/?/**/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$).*$/); - -var actual = fn("!a/*/?/**/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$).*$/); - -var actual = fn("!a/*/b"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/b)$).*$/); - -var actual = fn("!a/*/c/*.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/*/c/*.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/.*/b"); -actual.should.eql(/^(?!^(?:a\/(?=.)\.[^/]*?\/b)$).*$/); - -var actual = fn("!a/?/**/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$).*$/); - -var actual = fn("!a/?/**/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$).*$/); - -var actual = fn("!a/?/c.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\.js)$).*$/); - -var actual = fn("!a/?/c.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\.md)$).*$/); - -var actual = fn("!a/?/c/?/*/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.js)$).*$/); - -var actual = fn("!a/?/c/?/*/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.md)$).*$/); - -var actual = fn("!a/?/c/?/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.js)$).*$/); - -var actual = fn("!a/?/c/?/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.md)$).*$/); - -var actual = fn("!a/?/c/???/e.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/][^/][^/]\/e\.js)$).*$/); - -var actual = fn("!a/?/c/???/e.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/][^/][^/]\/e\.md)$).*$/); - -var actual = fn("!a/??/c.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/][^/]\/c\.js)$).*$/); - -var actual = fn("!a/??/c.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/][^/]\/c\.md)$).*$/); - -var actual = fn("!a/???/c.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/][^/][^/]\/c\.js)$).*$/); - -var actual = fn("!a/???/c.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/][^/][^/]\/c\.md)$).*$/); - -var actual = fn("!a/????/c.js"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/][^/][^/][^/]\/c\.js)$).*$/); - -var actual = fn("!a/????/c.md"); -actual.should.eql(/^(?!^(?:a\/(?!\.)(?=.)[^/][^/][^/][^/]\/c\.md)$).*$/); - -var actual = fn("!a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?!^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/cd\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js|a\/b\/(?:(?!(?:\/|^)\.).)*?\/ce\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js)$).*$/); - -var actual = fn("!a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?!^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/cd\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md|a\/b\/(?:(?!(?:\/|^)\.).)*?\/ce\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md)$).*$/); - -var actual = fn("!a/b/c/*.js"); -actual.should.eql(/^(?!^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!A/b/C/*.js"); -actual.should.eql(/^(?!^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/b/c/*.md"); -actual.should.eql(/^(?!^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!A/b/C/*.md"); -actual.should.eql(/^(?!^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!A/b/C/*.MD"); -actual.should.eql(/^(?!^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.MD)$).*$/); - -var actual = fn("!a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?!^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/cef\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ceg\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?!^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/cef\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ceg\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/b/c{d,e}/*.js"); -actual.should.eql(/^(?!^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ce\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!a/b/c{d,e}/*.md"); -actual.should.eql(/^(?!^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ce\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?!^(?:a\/b\/cd\/xyz\.js|a\/b\/ce\/xyz\.js)$).*$/); - -var actual = fn("!a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?!^(?:a\/b\/cd\/xyz\.md|a\/b\/ce\/xyz\.md)$).*$/); - -var actual = fn("!a/{c..e}.js"); -actual.should.eql(/^(?!^(?:a\/c\.js|a\/d\.js|a\/e\.js)$).*$/); - -var actual = fn("!E:**/*.js"); -actual.should.eql(/^(?!^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!E:**/*.md"); -actual.should.eql(/^(?!^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$).*$/); - -var actual = fn("!E:\\**/*.js"); -actual.should.eql(/^(?!^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$).*$/); - -var actual = fn("!E:\\**/*.md"); -actual.should.eql(/^(?!^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$).*$/); diff --git a/test/actual/mini.js b/test/actual/mini.js deleted file mode 100644 index 1cd249fa..00000000 --- a/test/actual/mini.js +++ /dev/null @@ -1,305 +0,0 @@ -var actual = fn("**/a/*/b/c/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\/\.js)$/); - -var actual = fn("**/a/*/b/c.d/.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\/b\/c\.d\/\.js)$/); - -var actual = fn("**/*.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("**/*.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("**/{a,/.gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("**/{a..z..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/e\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/g\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/i\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/k\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/m\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/o\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/q\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/s\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/u\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/w\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/y\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{a..c}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/a\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/b\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/1\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/2\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/3\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/4\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/5\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/6\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/7\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/8\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/9\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/10\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/{1..10..2}/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/1\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/3\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/5\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/7\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/9\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/{b..s}/xyz/*-{01..10}.js"); -actual.should.eql(/^(?:a\/b\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/b\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/c\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/d\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/e\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/f\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/g\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/h\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/i\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/j\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/k\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/l\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/m\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/n\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/o\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/p\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/q\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/r\/xyz\/(?!\.)(?=.)[^/]*?-10\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-01\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-02\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-03\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-04\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-05\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-06\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-07\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-08\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-09\.js|a\/s\/xyz\/(?!\.)(?=.)[^/]*?-10\.js)$/); - -var actual = fn("a"); -actual.should.eql(/^(?:a)$/); - -var actual = fn("a/"); -actual.should.eql(/^(?:a\/)$/); - -var actual = fn("a/*"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?)$/); - -var actual = fn(".*"); -actual.should.eql(/^(?:(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/*.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("**/*."); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.)$/); - -var actual = fn("**/*.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.a)$/); - -var actual = fn("**/*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("**/*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("**/.*"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?)$/); - -var actual = fn("**/.*.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.js)$/); - -var actual = fn("**/.*.md"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?\.md)$/); - -var actual = fn("**/.a"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.a)$/); - -var actual = fn("**/.a.js"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.a\.js)$/); - -var actual = fn("**/.gitignore"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("*.*"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.a"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.a)$/); - -var actual = fn("*.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*.{gitignore,*}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.gitignore|(?!\.)(?=.)[^/]*?\.[^/]*?)$/); - -var actual = fn("*.{*,gitignore,js}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.[^/]*?|(?!\.)(?=.)[^/]*?\.gitignore|(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("*.{*,gitignore}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.[^/]*?|(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn(".{*,gitignore}"); -actual.should.eql(/^(?:(?=.)\.[^/]*?|\.gitignore)$/); - -var actual = fn("**/.{*,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?=.)\.[^/]*?|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("**/.{js,gitignore}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.js|(?:(?!(?:\/|^)\.).)*?\/\.gitignore)$/); - -var actual = fn("**/.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.js|(?:(?!(?:\/|^)\.).)*?\/\.md)$/); - -var actual = fn("**/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("**/(a|b)/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\(a\|b\)\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/\(a\|b\)\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("**/[a-z]/*.{js,md}"); -actual.should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.js|(?:(?!(?:\/|^)\.).)*?\/(?!\.)(?=.)[a-z]\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("*.js"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("*.md"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("*.{js,txt}"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\.js|(?!\.)(?=.)[^/]*?\.txt)$/); - -var actual = fn("*/*.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]*?\.gitignore)$/); - -var actual = fn("*/.gitignore"); -actual.should.eql(/^(?:(?!\.)(?=.)[^/]*?\/\.gitignore)$/); - -var actual = fn(".a"); -actual.should.eql(/^(?:\.a)$/); - -var actual = fn(".gitignore"); -actual.should.eql(/^(?:\.gitignore)$/); - -var actual = fn(".js"); -actual.should.eql(/^(?:\.js)$/); - -var actual = fn(".md"); -actual.should.eql(/^(?:\.md)$/); - -var actual = fn("a/**/c/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/c/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/j/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/j/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/j\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/**/z/*.js"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/**/z/*.md"); -actual.should.eql(/^(?:a\/(?:(?!(?:\/|^)\.).)*?\/z\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/*.txt"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\.txt)$/); - -var actual = fn("a/*/.b"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/\.b)$/); - -var actual = fn("a/*/.b.a"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/\.b\.a)$/); - -var actual = fn("a/*/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$/); - -var actual = fn("a/*/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$/); - -var actual = fn("a/*/b"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/b)$/); - -var actual = fn("a/*/c/*.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/*/c/*.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/.*/b"); -actual.should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - -var actual = fn("a/?/**/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.js)$/); - -var actual = fn("a/?/**/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/(?:(?!(?:\/|^)\.).)*?\/e\.md)$/); - -var actual = fn("a/?/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\.js)$/); - -var actual = fn("a/?/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\.md)$/); - -var actual = fn("a/?/c/?/*/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.js)$/); - -var actual = fn("a/?/c/?/*/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?\/e\.md)$/); - -var actual = fn("a/?/c/?/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.js)$/); - -var actual = fn("a/?/c/?/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/]\/e\.md)$/); - -var actual = fn("a/?/c/???/e.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/][^/][^/]\/e\.js)$/); - -var actual = fn("a/?/c/???/e.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/]\/c\/(?!\.)(?=.)[^/][^/][^/]\/e\.md)$/); - -var actual = fn("a/??/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/]\/c\.js)$/); - -var actual = fn("a/??/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/]\/c\.md)$/); - -var actual = fn("a/???/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/][^/]\/c\.js)$/); - -var actual = fn("a/???/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/][^/]\/c\.md)$/); - -var actual = fn("a/????/c.js"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/][^/][^/]\/c\.js)$/); - -var actual = fn("a/????/c.md"); -actual.should.eql(/^(?:a\/(?!\.)(?=.)[^/][^/][^/][^/]\/c\.md)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.js"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/cd\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js|a\/b\/(?:(?!(?:\/|^)\.).)*?\/ce\/(?:(?!(?:\/|^)\.).)*?\/xyz\.js)$/); - -var actual = fn("a/b/**/c{d,e}/**/xyz.md"); -actual.should.eql(/^(?:a\/b\/(?:(?!(?:\/|^)\.).)*?\/cd\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md|a\/b\/(?:(?!(?:\/|^)\.).)*?\/ce\/(?:(?!(?:\/|^)\.).)*?\/xyz\.md)$/); - -var actual = fn("a/b/c/*.js"); -actual.should.eql(/^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("A/b/C/*.js"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c/*.md"); -actual.should.eql(/^(?:a\/b\/c\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.md"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("A/b/C/*.MD"); -actual.should.eql(/^(?:A\/b\/C\/(?!\.)(?=.)[^/]*?\.MD)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/cef\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ceg\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e{f,g}}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/cef\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ceg\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/*.js"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.js|a\/b\/ce\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("a/b/c{d,e}/*.md"); -actual.should.eql(/^(?:a\/b\/cd\/(?!\.)(?=.)[^/]*?\.md|a\/b\/ce\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("a/b/c{d,e}/xyz.js"); -actual.should.eql(/^(?:a\/b\/cd\/xyz\.js|a\/b\/ce\/xyz\.js)$/); - -var actual = fn("a/b/c{d,e}/xyz.md"); -actual.should.eql(/^(?:a\/b\/cd\/xyz\.md|a\/b\/ce\/xyz\.md)$/); - -var actual = fn("a/{c..e}.js"); -actual.should.eql(/^(?:a\/c\.js|a\/d\.js|a\/e\.js)$/); - -var actual = fn("E:**/*.js"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("E:**/*.md"); -actual.should.eql(/^(?:(?=.)E:[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$/); - -var actual = fn("E:\\**/*.js"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.js)$/); - -var actual = fn("E:\\**/*.md"); -actual.should.eql(/^(?:(?=.)E:\\[^/]*?[^/]*?\/(?!\.)(?=.)[^/]*?\.md)$/); diff --git a/test/any.js b/test/any.js deleted file mode 100644 index 64220089..00000000 --- a/test/any.js +++ /dev/null @@ -1,232 +0,0 @@ -'use strict'; - -require('should'); -var mm = require('..'); - -describe('.any()', function() { - describe('errors:', function() { - it('should throw on undefined args:', function() { - (function() { - mm.any(); - }).should.throw('micromatch.any(): patterns should be a string or array.'); - }); - - it('should throw on bad args:', function() { - (function() { - mm.any({}); - }).should.throw('micromatch.any(): patterns should be a string or array.'); - }); - }); - - it('should correctly handle empty patterns', function() { - mm.any('ab', '').should.be.false(); - mm.any('a', '').should.be.false(); - mm.any('.', '').should.be.false(); - }); - - it('should support an array of patterns', function() { - mm.any('ab', ['']).should.be.false(); - mm.any('a', ['']).should.be.false(); - mm.any('.', ['']).should.be.false(); - }); - - it('should return true when the path contains the pattern', function() { - mm.any('ab', 'b').should.be.false(); - mm.any('.', '.').should.be.true(); - mm.any('a/b/c', 'a/b').should.be.false(); - mm.any('/ab', '/a').should.be.false(); - mm.any('a', 'a').should.be.true(); - mm.any('ab', 'a').should.be.false(); - mm.any('ab', 'ab').should.be.true(); - mm.any('abcd', 'd').should.be.false(); - mm.any('abcd', 'c').should.be.false(); - mm.any('abcd', 'cd').should.be.false(); - mm.any('abcd', 'bc').should.be.false(); - mm.any('abcd', 'ab').should.be.false(); - }); - - it('should return true when the path contains any of the patterns', function() { - mm.any('ab', ['b', 'foo']).should.be.false(); - mm.any('.', ['.', 'foo']).should.be.true(); - mm.any('a/b/c', ['a/b', 'foo']).should.be.false(); - mm.any('/ab', ['/a', 'foo']).should.be.false(); - mm.any('a', ['a', 'foo']).should.be.true(); - mm.any('ab', ['a', 'foo']).should.be.false(); - mm.any('ab', ['ab', 'foo']).should.be.true(); - mm.any('abcd', ['d', 'foo']).should.be.false(); - mm.any('abcd', ['c', 'foo']).should.be.false(); - mm.any('abcd', ['cd', 'foo']).should.be.false(); - mm.any('abcd', ['bc', 'foo']).should.be.false(); - mm.any('abcd', ['ab', 'foo']).should.be.false(); - }); - - it('should match with common glob patterns', function() { - mm.any('a/b/c', 'a/*').should.be.false(); - mm.any('/ab', '/a').should.be.false(); - mm.any('/ab', '/*').should.be.true(); - mm.any('/cd', '/*').should.be.true(); - mm.any('ab', '*').should.be.true(); - mm.any('ab', 'ab').should.be.true(); - mm.any('/ab', '*/a').should.be.false(); - mm.any('/ab', '*/').should.be.false(); - mm.any('/ab', '*/*').should.be.true(); - mm.any('/ab', '/').should.be.false(); - mm.any('/ab', '/??').should.be.true(); - mm.any('/ab', '/?b').should.be.true(); - mm.any('/ab', '/?').should.be.false(); - mm.any('a/b', '?/?').should.be.true(); - }); - - it('should return false when the path does not contain the pattern', function() { - mm.any('/ab', '?/?').should.be.false(); - mm.any('ab', '*/*').should.be.false(); - mm.any('abcd', 'f').should.be.false(); - mm.any('ab', 'c').should.be.false(); - mm.any('ab', '/a').should.be.false(); - mm.any('/ab', 'a/*').should.be.false(); - mm.any('ef', '/*').should.be.false(); - mm.any('ab', './*').should.be.false(); - }); - - it('should return false when the path does not contain any pattern', function() { - mm.any('/ab', ['?/?', 'foo', 'bar']).should.be.false(); - mm.any('ab', ['*/*', 'foo', 'bar']).should.be.false(); - mm.any('abcd', ['f', 'foo', 'bar']).should.be.false(); - mm.any('ab', ['c', 'foo', 'bar']).should.be.false(); - mm.any('ab', ['/a', 'foo', 'bar']).should.be.false(); - mm.any('/ab', ['a/*', 'foo', 'bar']).should.be.false(); - mm.any('ef', ['/*', 'foo', 'bar']).should.be.false(); - mm.any('ab', ['./*', 'foo', 'bar']).should.be.false(); - }); - - it('should match files that contain the given extension:', function() { - mm.any('.md', '.m').should.be.false(); - mm.any('.c.md', '.*.md').should.be.true(); - mm.any('c.md', '*.md').should.be.true(); - mm.any('a/b/c.md', '.md').should.be.false(); - mm.any('a/b/c.md', 'a/*/*.md').should.be.true(); - mm.any('a/b/c.md', '**/*.md').should.be.true(); - mm.any('c.md', '*.md').should.be.true(); - mm.any('.c.md', '.md').should.be.false(); - mm.any('.c.md', '.c.').should.be.false(); - mm.any('a/b/c.md', '*.md').should.be.false(); - mm.any('a/b/c/c.md', '*.md').should.be.false(); - mm.any('.c.md', '*.md').should.be.false(); - }); - - it('should not match files that do not contain the given extension:', function() { - mm.any('.md', '*.md').should.be.false(); - mm.any('a/b/c/c.md', 'c.js').should.be.false(); - mm.any('a/b/c.md', 'a/*.md').should.be.false(); - }); - - it('should match dotfiles when a dot is explicitly defined in the pattern:', function() { - mm.any('.a', '.a').should.be.true(); - mm.any('.ab', '.*').should.be.true(); - mm.any('.ab', '.a*').should.be.true(); - mm.any('.abc', '.a').should.be.false(); - mm.any('.b', '.b*').should.be.true(); - mm.any('.md', '.md').should.be.true(); - mm.any('.c.md', '*.md').should.be.false(); - mm.any('a/.c.md', 'a/.c.md').should.be.true(); - mm.any('a/b/c/.xyz.md', 'a/b/c/.*.md').should.be.true(); - mm.any('a/.c.md', '*.md').should.be.false(); - mm.any('a/b/c/d.a.md', 'a/b/c/*.md').should.be.true(); - }); - - it('should match dotfiles when `dot` or `dotfiles` is set:', function() { - mm.any('a/b/c/.xyz.md', '.*.md', {dot: true}).should.be.false(); - mm.any('.c.md', '*.md', {dot: true}).should.be.true(); - mm.any('.c.md', '.*', {dot: true}).should.be.true(); - mm.any('a/b/c/.xyz.md', '**/*.md', {dot: true}).should.be.true(); - mm.any('a/b/c/.xyz.md', '**/.*.md', {dot: true}).should.be.true(); - mm.any('a/b/c/.xyz.md', 'a/b/c/*.md', {dot: true}).should.be.true(); - mm.any('a/b/c/.xyz.md', 'a/b/c/.*.md', {dot: true}).should.be.true(); - }); - - it('should not match dotfiles when `dot` or `dotfiles` is not set:', function() { - mm.any('.a', '*.md').should.be.false(); - mm.any('.ba', '.a').should.be.false(); - mm.any('.a.md', 'a/b/c/*.md').should.be.false(); - mm.any('.ab', '*.*').should.be.false(); - mm.any('.md', 'a/b/c/*.md').should.be.false(); - mm.any('.txt', '.md').should.be.false(); - mm.any('.verb.txt', '*.md').should.be.false(); - mm.any('a/b/d/.md', 'a/b/c/*.md').should.be.false(); - }); - - it('should match file paths:', function() { - mm.any('a/b/c/xyz.md', 'a/b/c/*.md').should.be.true(); - mm.any('a/bb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.any('a/bbbb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.any('a/bb.bb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.any('a/bb.bb/aa/bb/aa/c/xyz.md', 'a/**/c/*.md').should.be.true(); - mm.any('a/bb.bb/aa/b.b/aa/c/xyz.md', 'a/**/c/*.md').should.be.true(); - }); - - it('should return true when full file paths are matched:', function() { - mm.any('a/.b', 'a/.*').should.be.true(); - mm.any('a/.b', 'a/').should.be.false(); - mm.any('a/b/z/.a', 'b/z').should.be.false(); - mm.any('a/b/z/.a', 'a/*/z/.a').should.be.true(); - mm.any('a/b/c/d/e/z/c.md', 'a/**/z/*.md').should.be.true(); - mm.any('a/b/c/d/e/z/c.md', 'b/c/d/e').should.be.false(); - mm.any('a/b/c/d/e/j/n/p/o/z/c.md', 'a/**/j/**/z/*.md').should.be.true(); - mm.any('a/b/c/cd/bbb/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.true(); - mm.any('a/b/baz/ce/fez/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.true(); - }); - - it('question marks should not match slashes:', function() { - mm.any('aaa/bbb', 'aaa?bbb').should.be.false(); - }); - - it('should match path segments:', function() { - mm.any('aaa', 'aaa').should.be.true(); - mm.any('aaa', 'aa').should.be.false(); - mm.any('aaa/bbb', 'aaa/bbb').should.be.true(); - mm.any('aaa/bbb', 'aaa/*').should.be.true(); - mm.any('aaa/bba/ccc', 'aaa/*').should.be.false(); - mm.any('aaa/bba/ccc', 'aaa/**').should.be.true(); - mm.any('aaa/bba/ccc', 'aaa*').should.be.false(); - mm.any('aaa/bba/ccc', 'aaa**').should.be.false(); - mm.any('aaa/bba/ccc', 'aaa/*ccc').should.be.false(); - mm.any('aaa/bba/ccc', 'aaa/**ccc').should.be.true(); - mm.any('aaa/bba/ccc', 'aaa/*z').should.be.false(); - mm.any('aaa/bba/ccc', 'aaa/**z').should.be.false(); - mm.any('aaa/bbb', 'aaa[/]bbb').should.be.true(); - mm.any('aaa', '*/*/*').should.be.false(); - mm.any('aaa/bbb', '*/*/*').should.be.false(); - mm.any('aaa/bba/ccc', '*/*/*').should.be.true(); - mm.any('aaa/bb/aa/rr', '*/*/*').should.be.false(); - mm.any('abzzzejklhi', '*j*i').should.be.true(); - mm.any('ab/zzz/ejkl/hi', '*/*z*/*/*i').should.be.true(); - mm.any('ab/zzz/ejkl/hi', '*/*jk*/*i').should.be.false(); - }); - - it('should return false when full file paths are not matched:', function() { - mm.any('a/b/z/.a', 'b/a').should.be.false(); - mm.any('a/.b', 'a/**/z/*.md').should.be.false(); - mm.any('a/b/z/.a', 'a/**/z/*.a').should.be.false(); - mm.any('a/b/z/.a', 'a/*/z/*.a').should.be.false(); - mm.any('a/b/c/j/e/z/c.txt', 'a/**/j/**/z/*.md').should.be.false(); - mm.any('a/b/d/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.any('a/b/c/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.false(); - }); - - it('should match paths with leading `./`:', function() { - mm.any('./.a', 'a/**/z/*.md').should.be.false(); - mm.any('./a/b/z/.a', 'a/**/z/.a').should.be.false(); - mm.any('./a/b/z/.a', './a/**/z/.a').should.be.true(); - mm.any('./a/b/c/d/e/z/c.md', 'a/**/z/*.md').should.be.false(); - mm.any('./a/b/c/d/e/z/c.md', './a/**/z/*.md').should.be.true(); - mm.any('./a/b/c/d/e/z/c.md', './a/**/j/**/z/*.md').should.be.false(); - mm.any('./a/b/c/j/e/z/c.md', './a/**/j/**/z/*.md').should.be.true(); - mm.any('./a/b/c/j/e/z/c.md', 'a/**/j/**/z/*.md').should.be.false(); - mm.any('./a/b/c/d/e/j/n/p/o/z/c.md', './a/**/j/**/z/*.md').should.be.true(); - mm.any('./a/b/c/j/e/z/c.txt', './a/**/j/**/z/*.md').should.be.false(); - mm.any('./a/b/d/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.any('./a/b/c/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.any('./a/b/c/cd/bbb/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.true(); - mm.any('./a/b/baz/ce/fez/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.true(); - }); -}); diff --git a/test/api.all.js b/test/api.all.js new file mode 100644 index 00000000..3927d802 --- /dev/null +++ b/test/api.all.js @@ -0,0 +1,27 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('..'); + +describe('.all()', function() { + it('should throw an error when value is not a string', function() { + assert.throws(function() { + mm.all(); + }); + }); + + it('should return true when all patterns match the given string', function() { + assert(mm.all('z', ['z', '*', '[a-z]'])); + assert(mm.all('b', 'b')); + assert(mm.all('b', '*')); + }); + + it('should return false when some patterns do not match', function() { + assert(!mm.all('a', ['a', 'b', '*'])); + }); + + it('should arrayify a string value', function() { + assert(mm.all('a', ['*'])); + }); +}); diff --git a/test/api.any.js b/test/api.any.js new file mode 100644 index 00000000..185d4d82 --- /dev/null +++ b/test/api.any.js @@ -0,0 +1,260 @@ +'use strict'; + +require('mocha'); +var assert = require('assert'); +var mm = require('..'); + +describe('.any()', function() { + describe('errors', function() { + it('should throw an error when value is not a string', function() { + assert.throws(function() { + mm.any(); + }); + }); + }); + + describe('empty patterns', function() { + it('should correctly handle empty patterns', function() { + assert(!mm.any('', '')); + assert(!mm.any('', [''])); + assert(!mm.any('.', '')); + assert(!mm.any('.', [''])); + assert(!mm.any('./', '')); + assert(!mm.any('./', [''])); + assert(!mm.any('a', '')); + assert(!mm.any('a', [''])); + assert(!mm.any('ab', '')); + assert(!mm.any('ab', [''])); + }); + }); + + describe('non-globs', function() { + it('should match literal paths', function() { + assert(!mm.any('aaa', 'aa')); + assert(mm.any('aaa', 'aaa')); + assert(mm.any('aaa', ['aa', 'aaa'])); + assert(mm.any('aaa/bbb', 'aaa/bbb')); + assert(mm.any('aaa/bbb', 'aaa[/]bbb')); + assert(mm.any('aaa/bbb', ['aaa\\bbb', 'aaa/bbb'])); + assert(mm.any('aaa\\bbb', ['aaa\\bbb', 'aaa/bbb'])); + }); + }); + + describe('stars (single pattern)', function() { + it('should return true when one of the given patterns matches the string', function() { + assert(!mm.any('/ab', '*/*')); + assert(!mm.any('a/.b', 'a/')); + assert(!mm.any('a/b/c/d/e/z/c.md', 'b/c/d/e')); + assert(!mm.any('a/b/z/.a', 'b/z')); + assert(mm.any('.', '.')); + assert(mm.any('/ab', '/*')); + assert(mm.any('/ab', '/??')); + assert(mm.any('/ab', '/?b')); + assert(mm.any('/cd', '/*')); + assert(mm.any('a', 'a')); + assert(mm.any('a/.b', 'a/.*')); + assert(mm.any('a/b', '?/?')); + assert(mm.any('a/b/c/d/e/j/n/p/o/z/c.md', 'a/**/j/**/z/*.md')); + assert(mm.any('a/b/c/d/e/z/c.md', 'a/**/z/*.md')); + assert(mm.any('a/b/c/xyz.md', 'a/b/c/*.md')); + assert(mm.any('a/b/c/xyz.md', ['foo', 'a/b/c/*.md'])); + assert(mm.any('a/b/z/.a', 'a/*/z/.a')); + assert(mm.any('a/bb.bb/aa/b.b/aa/c/xyz.md', 'a/**/c/*.md')); + assert(mm.any('a/bb.bb/aa/bb/aa/c/xyz.md', 'a/**/c/*.md')); + assert(mm.any('a/bb.bb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.any('a/bb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.any('a/bbbb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.any('aaa', ['foo', '*'])); + assert(mm.any('ab', '*')); + assert(mm.any('ab', './*')); + assert(mm.any('ab', 'ab')); + assert(mm.any('ab/', './*/')); + }); + + it('should return false when the path does not match the pattern', function() { + assert(!mm.any('/ab', '*/')); + assert(!mm.any('/ab', '*/*')); + assert(!mm.any('/ab', '*/a')); + assert(!mm.any('/ab', '/')); + assert(!mm.any('/ab', '/?')); + assert(!mm.any('/ab', '/a')); + assert(!mm.any('/ab', '?/?')); + assert(!mm.any('/ab', 'a/*')); + assert(!mm.any('a/.b', 'a/')); + assert(!mm.any('a/b/c', 'a/*')); + assert(!mm.any('a/b/c', 'a/b')); + assert(!mm.any('a/b/c/d/e/z/c.md', 'b/c/d/e')); + assert(!mm.any('a/b/z/.a', 'b/z')); + assert(!mm.any('ab', '*/*')); + assert(!mm.any('ab', '/a')); + assert(!mm.any('ab', 'a')); + assert(!mm.any('ab', 'b')); + assert(!mm.any('ab', 'c')); + assert(!mm.any('ab/', '*/*')); + assert(!mm.any('abcd', 'ab')); + assert(!mm.any('abcd', 'bc')); + assert(!mm.any('abcd', 'c')); + assert(!mm.any('abcd', 'cd')); + assert(!mm.any('abcd', 'd')); + assert(!mm.any('abcd', 'f')); + assert(!mm.any('ef', '/*')); + }); + + it('should match a path segment for each single star', function() { + assert(!mm.any('aaa', '*/*/*')); + assert(!mm.any('aaa/bb/aa/rr', '*/*/*')); + assert(!mm.any('aaa/bba/ccc', 'aaa*')); + assert(!mm.any('aaa/bba/ccc', 'aaa**')); + assert(!mm.any('aaa/bba/ccc', 'aaa/*')); + assert(!mm.any('aaa/bba/ccc', 'aaa/*ccc')); + assert(!mm.any('aaa/bba/ccc', 'aaa/*z')); + assert(!mm.any('aaa/bbb', '*/*/*')); + assert(!mm.any('ab/zzz/ejkl/hi', '*/*jk*/*i')); + assert(mm.any('aaa/bba/ccc', '*/*/*')); + assert(mm.any('aaa/bba/ccc', 'aaa/**')); + assert(mm.any('aaa/bbb', 'aaa/*')); + assert(mm.any('ab/zzz/ejkl/hi', '*/*z*/*/*i')); + assert(mm.any('abzzzejklhi', '*j*i')); + }); + + it('should regard non-exclusive double-stars as single stars', function() { + assert(!mm.any('aaa/bba/ccc', 'aaa/**ccc')); + assert(!mm.any('aaa/bba/ccc', 'aaa/**z')); + }); + + it('should return false when full file paths are not matched:', function() { + assert(!mm.any('a/.b', 'a/**/z/*.md')); + assert(!mm.any('a/b/c/j/e/z/c.txt', 'a/**/j/**/z/*.md')); + assert(!mm.any('a/b/c/xyz.md', 'a/b/**/c{d,e}/**/xyz.md')); + assert(!mm.any('a/b/d/xyz.md', 'a/b/**/c{d,e}/**/xyz.md')); + assert(!mm.any('a/b/z/.a', 'a/**/z/*.a')); + assert(!mm.any('a/b/z/.a', 'a/*/z/*.a')); + assert(!mm.any('a/b/z/.a', 'b/a')); + }); + }); + + describe('stars (multiple patterns)', function() { + it('should return true when any of the patterns match', function() { + assert(mm.any('.', ['.', 'foo'])); + assert(mm.any('a', ['a', 'foo'])); + assert(mm.any('ab', ['*', 'foo', 'bar'])); + assert(mm.any('ab', ['*b', 'foo', 'bar'])); + assert(mm.any('ab', ['./*', 'foo', 'bar'])); + assert(mm.any('ab', ['a*', 'foo', 'bar'])); + assert(mm.any('ab', ['ab', 'foo'])); + }); + + it('should return false when none of the patterns match', function() { + assert(!mm.any('/ab', ['/a', 'foo'])); + assert(!mm.any('/ab', ['?/?', 'foo', 'bar'])); + assert(!mm.any('/ab', ['a/*', 'foo', 'bar'])); + assert(!mm.any('a/b/c', ['a/b', 'foo'])); + assert(!mm.any('ab', ['*/*', 'foo', 'bar'])); + assert(!mm.any('ab', ['/a', 'foo', 'bar'])); + assert(!mm.any('ab', ['a', 'foo'])); + assert(!mm.any('ab', ['b', 'foo'])); + assert(!mm.any('ab', ['c', 'foo', 'bar'])); + assert(!mm.any('abcd', ['ab', 'foo'])); + assert(!mm.any('abcd', ['bc', 'foo'])); + assert(!mm.any('abcd', ['c', 'foo'])); + assert(!mm.any('abcd', ['cd', 'foo'])); + assert(!mm.any('abcd', ['d', 'foo'])); + assert(!mm.any('abcd', ['f', 'foo', 'bar'])); + assert(!mm.any('ef', ['/*', 'foo', 'bar'])); + }); + }); + + describe('file extensions', function() { + it('should match files that contain the given extension:', function() { + assert(mm.any('.c.md', '.*.md')); + assert(mm.any('a/b/c.md', '**/*.md')); + assert(mm.any('a/b/c.md', 'a/*/*.md')); + assert(mm.any('c.md', '*.md')); + }); + + it('should not match files that do not contain the given extension:', function() { + assert(!mm.any('.c.md', '*.md')); + assert(!mm.any('.c.md', '.c.')); + assert(!mm.any('.c.md', '.md')); + assert(!mm.any('.md', '*.md')); + assert(!mm.any('.md', '.m')); + assert(!mm.any('a/b/c.md', '*.md')); + assert(!mm.any('a/b/c.md', '.md')); + assert(!mm.any('a/b/c.md', 'a/*.md')); + assert(!mm.any('a/b/c/c.md', '*.md')); + assert(!mm.any('a/b/c/c.md', 'c.js')); + }); + }); + + describe('dot files', function() { + it('should match dotfiles when a dot is explicitly defined in the pattern:', function() { + assert(mm.any('.a', '.a')); + assert(mm.any('.ab', '.*')); + assert(mm.any('.ab', '.a*')); + assert(mm.any('.b', '.b*')); + assert(mm.any('.md', '.md')); + assert(mm.any('a/.c.md', 'a/.c.md')); + assert(mm.any('a/b/c/.xyz.md', 'a/b/c/.*.md')); + assert(mm.any('a/b/c/d.a.md', 'a/b/c/*.md')); + }); + + it('should match leading `./` when `**` is in the pattern', function() { + assert(mm.any('./a', 'a')); + assert(mm.any('.ab', '.*')); + assert(mm.any('.ab', '.a*')); + assert(mm.any('.b', '.b*')); + assert(mm.any('.md', '.md')); + assert(mm.any('a/.c.md', 'a/.c.md')); + assert(mm.any('a/b/c/.xyz.md', 'a/b/c/.*.md')); + assert(mm.any('a/b/c/d.a.md', 'a/b/c/*.md')); + }); + + it('should not match dotfiles when a dot is not defined in the pattern:', function() { + assert(!mm.any('.abc', '.a')); + assert(!mm.any('.c.md', '*.md')); + assert(!mm.any('a/.c.md', '*.md')); + }); + + it('should match dotfiles when `dot` is set:', function() { + assert(!mm.any('a/b/c/.xyz.md', '.*.md', {dot: true})); + assert(mm.any('.c.md', '*.md', {dot: true})); + assert(mm.any('.c.md', '.*', {dot: true})); + assert(mm.any('a/b/c/.xyz.md', '**/*.md', {dot: true})); + assert(mm.any('a/b/c/.xyz.md', '**/.*.md', {dot: true})); + assert(mm.any('a/b/c/.xyz.md', 'a/b/c/*.md', {dot: true})); + assert(mm.any('a/b/c/.xyz.md', 'a/b/c/.*.md', {dot: true})); + }); + + it('should not match dotfiles when `dot` is not set:', function() { + assert(!mm.any('.a', '*.md')); + assert(!mm.any('.ba', '.a')); + assert(!mm.any('.a.md', 'a/b/c/*.md')); + assert(!mm.any('.ab', '*.*')); + assert(!mm.any('.md', 'a/b/c/*.md')); + assert(!mm.any('.txt', '.md')); + assert(!mm.any('.verb.txt', '*.md')); + assert(!mm.any('a/b/d/.md', 'a/b/c/*.md')); + }); + }); + + describe('qmarks', function() { + it('question marks should not match slashes:', function() { + assert(!mm.any('aaa/bbb', 'aaa?bbb')); + }); + }); + + describe('dot-slash', function() { + it('should match paths with leading `./`:', function() { + assert(!mm.any('./.a', 'a/**/z/*.md')); + assert(!mm.any('./a/b/c/d/e/z/c.md', './a/**/j/**/z/*.md')); + assert(!mm.any('./a/b/c/j/e/z/c.txt', './a/**/j/**/z/*.md')); + assert(mm.any('./a/b/c/d/e/j/n/p/o/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.any('./a/b/c/d/e/z/c.md', './a/**/z/*.md')); + assert(mm.any('./a/b/c/d/e/z/c.md', 'a/**/z/*.md')); + assert(mm.any('./a/b/c/j/e/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.any('./a/b/c/j/e/z/c.md', 'a/**/j/**/z/*.md')); + assert(mm.any('./a/b/z/.a', './a/**/z/.a')); + assert(mm.any('./a/b/z/.a', 'a/**/z/.a')); + }); + }); +}); diff --git a/test/api.braceExpand.js b/test/api.braceExpand.js new file mode 100644 index 00000000..c57b26fe --- /dev/null +++ b/test/api.braceExpand.js @@ -0,0 +1,17 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('..'); + +describe('.braceExpand()', function() { + it('should throw an error when arguments are invalid', function() { + assert.throws(function() { + mm.braceExpand(); + }); + }); + + it('should expand a brace pattern', function() { + assert.deepEqual(mm.braceExpand('{a,b}'), ['a', 'b']); + }); +}); diff --git a/test/api.braces.js b/test/api.braces.js new file mode 100644 index 00000000..1e59577c --- /dev/null +++ b/test/api.braces.js @@ -0,0 +1,21 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('..'); + +describe('.braces()', function() { + it('should throw an error when arguments are invalid', function() { + assert.throws(function() { + mm.braces(); + }); + }); + + it('should create a regex source string from a brace pattern', function() { + assert.deepEqual(mm.braces('{a,b}'), ['(a|b)']); + }); + + it('should expand a brace pattern', function() { + assert.deepEqual(mm.braces('{a,b}', {expand: true}), ['a', 'b']); + }); +}); diff --git a/test/api.compile.js b/test/api.compile.js new file mode 100644 index 00000000..665fa7a0 --- /dev/null +++ b/test/api.compile.js @@ -0,0 +1,47 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('..'); + +describe('.compile()', function() { + it('should throw an error when arguments are invalid', function() { + assert.throws(function() { + mm.compile(); + }); + }); + + it('should return an AST for a glob', function() { + var foo = mm.compile('a/*'); + delete foo.ast.state; + assert.deepEqual(foo.ast, { + type: 'root', + errors: [], + nodes: [ + { type: 'bos', val: '' }, + { type: 'text', val: 'a' }, + { type: 'slash', val: '/' }, + { type: 'star', val: '*' }, + { type: 'eos', val: '' } + ], + input: 'a/*' + }); + + var bar = mm.compile('a/**/*'); + delete bar.ast.state; + assert.deepEqual(bar.ast, { + type: 'root', + errors: [], + nodes: [ + { type: 'bos', val: '' }, + { type: 'text', val: 'a' }, + { type: 'slash', val: '/' }, + { type: 'globstar', val: '**' }, + { type: 'slash', val: '/' }, + { type: 'star', val: '*' }, + { type: 'eos', val: '' } + ], + input: 'a/**/*' + }); + }); +}); diff --git a/test/api.contains.js b/test/api.contains.js new file mode 100644 index 00000000..f05895a5 --- /dev/null +++ b/test/api.contains.js @@ -0,0 +1,322 @@ +'use strict'; + +var path = require('path'); +var sep = path.sep; +var assert = require('assert'); +var mm = require('..'); + +describe('.contains()', function() { + describe('errors', function() { + it('should throw an error arguments are invalid', function() { + assert.throws(function() { + mm.contains(); + }); + }); + }); + + describe('patterns', function() { + it('should correctly deal with empty patterns', function() { + assert(!mm.contains('ab', '')); + assert(!mm.contains('a', '')); + assert(!mm.contains('.', '')); + }); + + it('should return true when the path contains the pattern', function() { + assert(mm.contains('ab', 'b')); + assert(mm.contains('.', '.')); + assert(mm.contains('a/b/c', 'a/b')); + assert(mm.contains('/ab', '/a')); + assert(mm.contains('a', 'a')); + assert(mm.contains('ab', 'a')); + assert(mm.contains('ab', 'ab')); + assert(mm.contains('abcd', 'd')); + assert(mm.contains('abcd', 'c')); + assert(mm.contains('abcd', 'cd')); + assert(mm.contains('abcd', 'bc')); + assert(mm.contains('abcd', 'ab')); + }); + + it('should be true when a glob pattern partially matches the path', function() { + assert(mm.contains('a/b/c', 'a/*')); + assert(mm.contains('/ab', '/a')); + assert(mm.contains('/ab', '/*')); + assert(mm.contains('/cd', '/*')); + assert(mm.contains('ab', '*')); + assert(mm.contains('ab', 'ab')); + assert(mm.contains('/ab', '*/a')); + assert(mm.contains('/ab', '*/')); + assert(mm.contains('/ab', '*/*')); + assert(mm.contains('/ab', '/')); + assert(mm.contains('/ab', '/??')); + assert(mm.contains('/ab', '/?b')); + assert(mm.contains('/ab', '/?')); + assert(mm.contains('a/b', '?/?')); + }); + + it('should return false when the path does not contain the pattern', function() { + assert(!mm.contains('/ab', '?/?')); + assert(!mm.contains('ab', '*/*')); + assert(!mm.contains('abcd', 'f')); + assert(!mm.contains('ab', 'c')); + assert(!mm.contains('ab', '/a')); + assert(!mm.contains('/ab', 'a/*')); + assert(!mm.contains('ef', '/*')); + }); + + it('should match files that contain the given extension:', function() { + assert(mm.contains('ab', './*')); + assert(mm.contains('.c.md', '*.md')); + assert(mm.contains('.c.md', '.*.md')); + assert(mm.contains('.c.md', '.c.')); + assert(mm.contains('.c.md', '.md')); + assert(mm.contains('.md', '.m')); + assert(mm.contains('a/b/c.md', '**/*.md')); + assert(mm.contains('a/b/c.md', '*.md')); + assert(mm.contains('a/b/c.md', '.md')); + assert(mm.contains('a/b/c.md', 'a/*/*.md')); + assert(mm.contains('a/b/c/c.md', '*.md')); + assert(mm.contains('c.md', '*.md')); + }); + + it('should not match files that do not contain the given extension:', function() { + assert(!mm.contains('.md', '*.md')); + assert(!mm.contains('a/b/c/c.md', 'c.js')); + assert(!mm.contains('a/b/c.md', 'a/*.md')); + }); + + it('should match dotfiles when a dot is explicitly defined in the pattern:', function() { + assert(mm.contains('.a', '.a')); + assert(mm.contains('.ab', '.*')); + assert(mm.contains('.ab', '.a*')); + assert(mm.contains('.abc', '.a')); + assert(mm.contains('.b', '.b*')); + assert(mm.contains('.c.md', '*.md')); + assert(mm.contains('.md', '.md')); + assert(mm.contains('a/.c.md', '*.md')); + assert(mm.contains('a/.c.md', 'a/.c.md')); + assert(mm.contains('a/b/c/.xyz.md', 'a/b/c/.*.md')); + assert(mm.contains('a/b/c/d.a.md', 'a/b/c/*.md')); + }); + + it('should match dotfiles when `dot` or `dotfiles` is set:', function() { + assert(mm.contains('.c.md', '*.md', {dot: true})); + assert(mm.contains('.c.md', '.*', {dot: true})); + assert(mm.contains('a/b/c/.xyz.md', '**/*.md', {dot: true})); + assert(mm.contains('a/b/c/.xyz.md', '**/.*.md', {dot: true})); + assert(mm.contains('a/b/c/.xyz.md', '.*.md', {dot: true})); + assert(mm.contains('a/b/c/.xyz.md', 'a/b/c/*.md', {dot: true})); + assert(mm.contains('a/b/c/.xyz.md', 'a/b/c/.*.md', {dot: true})); + }); + + it('should not match dotfiles when `dot` or `dotfiles` is not set:', function() { + assert(!mm.contains('.a', '*.md')); + assert(!mm.contains('.ba', '.a')); + assert(!mm.contains('.a.md', 'a/b/c/*.md')); + assert(!mm.contains('.ab', '*.*')); + assert(!mm.contains('.md', 'a/b/c/*.md')); + assert(!mm.contains('.txt', '.md')); + assert(!mm.contains('.verb.txt', '*.md')); + assert(!mm.contains('a/b/d/.md', 'a/b/c/*.md')); + }); + + it('should match file paths:', function() { + assert(mm.contains('a/b/c/xyz.md', 'a/b/c/*.md')); + assert(mm.contains('a/bb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.contains('a/bbbb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.contains('a/bb.bb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.contains('a/bb.bb/aa/bb/aa/c/xyz.md', 'a/**/c/*.md')); + assert(mm.contains('a/bb.bb/aa/b.b/aa/c/xyz.md', 'a/**/c/*.md')); + }); + + it('should return true when full file paths are matched:', function() { + assert(mm.contains('a/.b', 'a/.*')); + assert(mm.contains('a/.b', 'a/')); + assert(mm.contains('a/b/z/.a', 'b/z')); + assert(mm.contains('a/b/z/.a', 'a/*/z/.a')); + assert(mm.contains('a/b/c/d/e/z/c.md', 'a/**/z/*.md')); + assert(mm.contains('a/b/c/d/e/z/c.md', 'b/c/d/e')); + assert(mm.contains('a/b/c/d/e/j/n/p/o/z/c.md', 'a/**/j/**/z/*.md')); + }); + + it('should match path segments:', function() { + assert(mm.contains('aaa', 'aaa')); + assert(mm.contains('aaa', 'aa')); + assert(mm.contains('aaa/bbb', 'aaa/bbb')); + assert(mm.contains('aaa/bbb', 'aaa/*')); + assert(mm.contains('aaa/bba/ccc', '**/*/ccc')); + assert(mm.contains('aaa/bba/ccc', '*/*a')); + assert(mm.contains('aaa/bba/ccc', 'aaa*')); + assert(mm.contains('aaa/bba/ccc', 'aaa**')); + assert(mm.contains('aaa/bba/ccc', 'aaa/*')); + assert(mm.contains('aaa/bba/ccc', 'aaa/**')); + assert(mm.contains('aaa/bba/ccc', 'aaa/*/ccc')); + assert(mm.contains('aaa/bba/ccc', 'bb')); + assert(mm.contains('aaa/bba/ccc', 'bb*')); + assert(!mm.contains('aaa/bba/ccc', 'aaa/*ccc')); + assert(!mm.contains('aaa/bba/ccc', 'aaa/**ccc')); + assert(!mm.contains('aaa/bba/ccc', 'aaa/*z')); + assert(!mm.contains('aaa/bba/ccc', 'aaa/**z')); + assert(mm.contains('aaa/bbb', 'aaa[/]bbb')); + assert(!mm.contains('aaa', '*/*/*')); + assert(!mm.contains('aaa/bbb', '*/*/*')); + assert(mm.contains('aaa/bba/ccc', '*/*/*')); + assert(mm.contains('aaa/bb/aa/rr', '*/*/*')); + assert(mm.contains('abzzzejklhi', '*j*i')); + assert(mm.contains('ab/zzz/ejkl/hi', '*/*z*/*/*i')); + assert(mm.contains('ab/zzz/ejkl/hi', '*/*jk*/*i')); + }); + + it('should return false when full file paths are not matched:', function() { + assert(!mm.contains('a/b/z/.a', 'b/a')); + assert(!mm.contains('a/.b', 'a/**/z/*.md')); + assert(!mm.contains('a/b/z/.a', 'a/**/z/*.a')); + assert(!mm.contains('a/b/z/.a', 'a/*/z/*.a')); + assert(!mm.contains('a/b/c/j/e/z/c.txt', 'a/**/j/**/z/*.md')); + }); + + it('should match paths with leading `./`:', function() { + assert(!mm.contains('./.a', 'a/**/z/*.md')); + assert(mm.contains('./a/b/z/.a', 'a/**/z/.a')); + assert(mm.contains('./a/b/z/.a', './a/**/z/.a')); + assert(mm.contains('./a/b/c/d/e/z/c.md', 'a/**/z/*.md')); + assert(mm.contains('./a/b/c/d/e/z/c.md', './a/**/z/*.md')); + assert(!mm.contains('./a/b/c/d/e/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.contains('./a/b/c/j/e/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.contains('./a/b/c/j/e/z/c.md', 'a/**/j/**/z/*.md')); + assert(mm.contains('./a/b/c/d/e/j/n/p/o/z/c.md', './a/**/j/**/z/*.md')); + assert(!mm.contains('./a/b/c/j/e/z/c.txt', './a/**/j/**/z/*.md')); + }); + }); + + describe('windows paths', function() { + beforeEach(function() { + path.sep = '\\'; + }); + afterEach(function() { + path.sep = sep; + }); + + it('should match with common glob patterns', function() { + assert(mm.contains('\\ab', '*/')); + assert(mm.contains('\\ab', '*/*')); + assert(mm.contains('\\ab', '*/[a-z]*')); + assert(mm.contains('\\ab', '*/*[a-z]')); + assert(mm.contains('\\ab', '*/a')); + assert(mm.contains('\\ab', '/')); + assert(mm.contains('\\ab', '/*')); + assert(mm.contains('\\ab', '/?')); + assert(mm.contains('\\ab', '/??')); + assert(mm.contains('\\ab', '/?b')); + assert(mm.contains('\\ab', '/a')); + assert(mm.contains('\\cd', '/*')); + assert(mm.contains('a\\b', '?/?')); + assert(mm.contains('a\\b\\c', 'a/*')); + + assert(mm.contains('\\ab', '*/', {unixify: false})); + assert(mm.contains('\\ab', '*/*', {unixify: false})); + assert(mm.contains('\\ab', '*/[a-z]*', {unixify: false})); + assert(mm.contains('\\ab', '*/a', {unixify: false})); + assert(mm.contains('\\ab', '/', {unixify: false})); + assert(mm.contains('\\ab', '/*', {unixify: false})); + assert(mm.contains('\\ab', '/?', {unixify: false})); + assert(mm.contains('\\ab', '/??', {unixify: false})); + assert(mm.contains('\\ab', '/?b', {unixify: false})); + assert(mm.contains('\\ab', '/a', {unixify: false})); + assert(mm.contains('\\cd', '/*', {unixify: false})); + assert(mm.contains('a\\b', '?/?', {unixify: false})); + assert(mm.contains('a\\b\\c', 'a/*', {unixify: false})); + }); + + it('should match files that contain the given extension:', function() { + assert(mm.contains('a\\b\\c.md', '**/*.md')); + assert(mm.contains('a\\b\\c.md', '*.md')); + assert(mm.contains('a\\b\\c.md', '.md')); + assert(mm.contains('a\\b\\c.md', 'a/*/*.md')); + assert(mm.contains('a\\b\\c\\c.md', '*.md')); + }); + + it('should match dotfiles when `dot` or `dotfiles` is set:', function() { + assert(mm.contains('a\\b\\c\\.xyz.md', '.*.md', {unixify: true, dot: true})); + assert(mm.contains('a\\b\\c\\.xyz.md', '**/*.md', {unixify: true, dot: true})); + assert(mm.contains('a\\b\\c\\.xyz.md', '**/.*.md', {unixify: true, dot: true})); + assert(mm.contains('a\\b\\c\\.xyz.md', 'a/b/c/*.md', {unixify: true, dot: true})); + assert(mm.contains('a\\b\\c\\.xyz.md', 'a/b/c/.*.md', {unixify: true, dot: true})); + }); + + it('should not match dotfiles when `dot` or `dotfiles` is not set:', function() { + assert(!mm.contains('a\\b\\d\\.md', 'a/b/c/*.md')); + }); + + it('should match file paths:', function() { + assert(mm.contains('a\\b\\c\\xyz.md', 'a/b/c/*.md')); + assert(mm.contains('a\\bb\\c\\xyz.md', 'a/*/c/*.md')); + assert(mm.contains('a\\bbbb\\c\\xyz.md', 'a/*/c/*.md')); + assert(mm.contains('a\\bb.bb\\c\\xyz.md', 'a/*/c/*.md')); + assert(mm.contains('a\\bb.bb\\aa\\bb\\aa\\c\\xyz.md', 'a/**/c/*.md')); + assert(mm.contains('a\\bb.bb\\aa\\b.b\\aa\\c\\xyz.md', 'a/**/c/*.md')); + }); + + it('should return true when full file paths are matched:', function() { + assert(mm.contains('a\\.b', 'a/.*')); + assert(mm.contains('a\\.b', 'a/')); + assert(mm.contains('a\\b\\z\\.a', 'b/z')); + assert(mm.contains('a\\b\\z\\.a', 'a/*/z/.a')); + assert(mm.contains('a\\b\\c\\d\\e\\z\\c.md', 'a/**/z/*.md')); + assert(mm.contains('a\\b\\c\\d\\e\\z\\c.md', 'b/c/d/e')); + assert(mm.contains('a\\b\\c\\d\\e\\j\\n\\p\\o\\z\\c.md', 'a/**/j/**/z/*.md')); + }); + + it('should match path segments:', function() { + assert(mm.contains('aaa\\bbb', 'aaa/bbb')); + assert(mm.contains('aaa\\bbb', 'aaa/*')); + assert(mm.contains('aaa\\bba\\ccc', '**/*/ccc')); + assert(mm.contains('aaa\\bba\\ccc', '*/*a')); + assert(mm.contains('aaa\\bba\\ccc', 'aaa*')); + assert(mm.contains('aaa\\bba\\ccc', 'aaa**')); + assert(mm.contains('aaa\\bba\\ccc', 'aaa/*')); + assert(mm.contains('aaa\\bba\\ccc', 'aaa/**')); + assert(mm.contains('aaa\\bba\\ccc', 'aaa/*/ccc')); + assert(mm.contains('aaa\\bba\\ccc', 'bb')); + assert(mm.contains('aaa\\bba\\ccc', 'bb*')); + assert(mm.contains('aaa\\bbb', 'aaa[/]bbb')); + assert(mm.contains('aaa\\bbb', 'aaa[\\\\/]bbb')); + assert(!mm.contains('aaa\\bba\\ccc', 'aaa/*ccc')); + assert(!mm.contains('aaa\\bba\\ccc', 'aaa/**ccc')); + assert(!mm.contains('aaa\\bba\\ccc', 'aaa/*z')); + assert(!mm.contains('aaa\\bba\\ccc', 'aaa/**z')); + assert(!mm.contains('\\aaa', '*/*/*')); + assert(!mm.contains('aaa\\bbb', '*/*/*')); + assert(mm.contains('aaa\\bba\\ccc', '*/*/*')); + assert(mm.contains('aaa\\bb\\aa\\rr', '*/*/*')); + assert(mm.contains('ab\\zzz\\ejkl\\hi', '*/*z*/*/*i')); + assert(mm.contains('ab\\zzz\\ejkl\\hi', '*/*jk*/*i')); + }); + + it('should return false when full file paths are not matched:', function() { + assert(!mm.contains('a\\b\\z\\.a', 'b/a')); + assert(!mm.contains('a\\.b', 'a/**/z/*.md')); + assert(!mm.contains('a\\b\\z\\.a', 'a/**/z/*.a')); + assert(!mm.contains('a\\b\\z\\.a', 'a/*/z/*.a')); + assert(!mm.contains('a\\b\\c\\j\\e\\z\\c.txt', 'a/**/j/**/z/*.md')); + }); + + it('should match dotfiles when a dot is explicitly defined in the pattern:', function() { + assert(mm.contains('a\\.c.md', 'a/.c.md')); + assert(mm.contains('a\\b\\c\\.xyz.md', 'a/b/c/.*.md')); + assert(mm.contains('a\\.c.md', '*.md')); + assert(mm.contains('a\\b\\c\\d.a.md', 'a/b/c/*.md')); + }); + + it('should match paths with leading `./`:', function() { + assert(!mm.contains('.\\.a', 'a/**/z/*.md')); + assert(!mm.contains('.\\a\\b\\c\\d\\e\\z\\c.md', './a/**/j/**/z/*.md')); + assert(mm.contains('.\\a\\b\\c\\d\\e\\j\\n\\p\\o\\z\\c.md', './a/**/j/**/z/*.md')); + assert(mm.contains('.\\a\\b\\c\\d\\e\\z\\c.md', './a/**/z/*.md')); + assert(mm.contains('.\\a\\b\\c\\d\\e\\z\\c.md', 'a/**/z/*.md')); + assert(mm.contains('.\\a\\b\\c\\j\\e\\z\\c.md', './a/**/j/**/z/*.md')); + assert(mm.contains('.\\a\\b\\c\\j\\e\\z\\c.md', 'a/**/j/**/z/*.md')); + assert(mm.contains('.\\a\\b\\z\\.a', './a/**/z/.a')); + assert(mm.contains('.\\a\\b\\z\\.a', 'a/**/z/.a')); + }); + }); +}); diff --git a/test/api.every.js b/test/api.every.js new file mode 100644 index 00000000..cb7b361e --- /dev/null +++ b/test/api.every.js @@ -0,0 +1,21 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('..'); + +describe('.every()', function() { + it('should return true if every string matches', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + assert(mm.every(fixtures, ['z', '*/*'])); + }); + + it('should return false when not all strings match', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + assert(!mm.every(fixtures, ['a/*', 'x/*'])); + }); + + it('should arrayify a string value', function() { + assert(mm.every('a', ['*'])); + }); +}); diff --git a/test/api.isMatch.js b/test/api.isMatch.js new file mode 100644 index 00000000..e68c5ec1 --- /dev/null +++ b/test/api.isMatch.js @@ -0,0 +1,327 @@ +'use strict'; + +var assert = require('assert'); +var mm = require('./support/match'); + +describe('.isMatch():', function() { + describe('error handling:', function() { + it('should throw on bad args', function() { + assert.throws(function() { + mm.isMatch({}); + }, /expected a string: "{}"/); + }); + }); + + describe('matching:', function() { + it('should escape plus signs to match string literals', function() { + assert(mm.isMatch('a+b/src/glimini.js', 'a+b/src/*.js')); + assert(mm.isMatch('+b/src/glimini.js', '+b/src/*.js')); + assert(mm.isMatch('coffee+/src/glimini.js', 'coffee+/src/*.js')); + assert(mm.isMatch('coffee+/src/glimini.js', 'coffee+/src/*.js')); + assert(mm.isMatch('coffee+/src/glimini.js', 'coffee+/src/*')); + }); + + it('should not escape plus signs that follow brackets', function() { + assert(mm.isMatch('a', '[a]+')); + assert(mm.isMatch('aa', '[a]+')); + assert(mm.isMatch('aaa', '[a]+')); + assert(mm.isMatch('az', '[a-z]+')); + assert(mm.isMatch('zzz', '[a-z]+')); + }); + + it('should support stars following brackets', function() { + assert(mm.isMatch('a', '[a]*')); + assert(mm.isMatch('aa', '[a]*')); + assert(mm.isMatch('aaa', '[a]*')); + assert(mm.isMatch('az', '[a-z]*')); + assert(mm.isMatch('zzz', '[a-z]*')); + }); + + it('should not escape plus signs that follow parens', function() { + assert(mm.isMatch('a', '(a)+')); + assert(mm.isMatch('ab', '(a|b)+')); + assert(mm.isMatch('aa', '(a)+')); + assert(mm.isMatch('aaab', '(a|b)+')); + assert(mm.isMatch('aaabbb', '(a|b)+')); + }); + + it('should support stars following parens', function() { + assert(mm.isMatch('a', '(a)*')); + assert(mm.isMatch('ab', '(a|b)*')); + assert(mm.isMatch('aa', '(a)*')); + assert(mm.isMatch('aaab', '(a|b)*')); + assert(mm.isMatch('aaabbb', '(a|b)*')); + }); + + it('should not match slashes with single stars', function() { + assert(!mm.isMatch('a/b', '(a)*')); + assert(!mm.isMatch('a/b', '[a]*')); + assert(!mm.isMatch('a/b', 'a*')); + assert(!mm.isMatch('a/b', '(a|b)*')); + }); + + it('should not match dots with stars by default', function() { + assert(!mm.isMatch('.a', '(a)*')); + assert(!mm.isMatch('.a', '*[a]*')); + assert(!mm.isMatch('.a', '*[a]')); + assert(!mm.isMatch('.a', '*a*')); + assert(!mm.isMatch('.a', '*a')); + assert(!mm.isMatch('.a', '*(a|b)')); + }); + + it('should correctly deal with empty globs', function() { + assert(!mm.isMatch('ab', '')); + assert(!mm.isMatch('a', '')); + assert(!mm.isMatch('.', '')); + }); + + it('should match with non-glob patterns', function() { + assert(mm.isMatch('.', '.')); + assert(mm.isMatch('/a', '/a')); + assert(!mm.isMatch('/ab', '/a')); + assert(mm.isMatch('a', 'a')); + assert(!mm.isMatch('ab', '/a')); + assert(!mm.isMatch('ab', 'a')); + assert(mm.isMatch('ab', 'ab')); + assert(!mm.isMatch('abcd', 'cd')); + assert(!mm.isMatch('abcd', 'bc')); + assert(!mm.isMatch('abcd', 'ab')); + }); + + it('should match file names', function() { + assert(mm.isMatch('a.b', 'a.b')); + assert(mm.isMatch('a.b', '*.b')); + assert(mm.isMatch('a.b', 'a.*')); + assert(mm.isMatch('a.b', '*.*')); + assert(mm.isMatch('a-b.c-d', 'a*.c*')); + assert(mm.isMatch('a-b.c-d', '*b.*d')); + assert(mm.isMatch('a-b.c-d', '*.*')); + assert(mm.isMatch('a-b.c-d', '*.*-*')); + assert(mm.isMatch('a-b.c-d', '*-*.*-*')); + assert(mm.isMatch('a-b.c-d', '*.c-*')); + assert(mm.isMatch('a-b.c-d', '*.*-d')); + assert(mm.isMatch('a-b.c-d', 'a-*.*-d')); + assert(mm.isMatch('a-b.c-d', '*-b.c-*')); + assert(mm.isMatch('a-b.c-d', '*-b*c-*')); + + // false + assert(!mm.isMatch('a-b.c-d', '*-bc-*')); + }); + + it('should match with common glob patterns', function() { + assert(!mm.isMatch('/ab', './*/')); + assert(!mm.isMatch('/ef', '*')); + assert(!mm.isMatch('ab', './*/')); + assert(!mm.isMatch('ef', '/*')); + assert(mm.isMatch('/ab', '/*')); + assert(mm.isMatch('/cd', '/*')); + assert(mm.isMatch('ab', '*')); + assert(mm.isMatch('ab', './*')); + assert(mm.isMatch('ab', 'ab')); + assert(mm.isMatch('ab/', './*/')); + }); + + it('should exactly match leading slash', function() { + assert(!mm.isMatch('ef', '/*')); + assert(mm.isMatch('/ef', '/*')); + }); + + it('should match files with the given extension', function() { + assert(!mm.isMatch('.md', '*.md')); + assert(mm.isMatch('.md', '.md')); + assert(!mm.isMatch('.c.md', '*.md')); + assert(mm.isMatch('.c.md', '.*.md')); + assert(mm.isMatch('c.md', '*.md')); + assert(mm.isMatch('c.md', '*.md')); + assert(!mm.isMatch('a/b/c/c.md', '*.md')); + assert(!mm.isMatch('a/b/c.md', 'a/*.md')); + assert(mm.isMatch('a/b/c.md', 'a/*/*.md')); + assert(mm.isMatch('a/b/c.md', '**/*.md')); + assert(mm.isMatch('a/b/c.js', 'a/**/*.*')); + }); + + it('should match wildcards', function() { + assert(!mm.isMatch('a/b/c/z.js', '*.js')); + assert(!mm.isMatch('a/b/z.js', '*.js')); + assert(!mm.isMatch('a/z.js', '*.js')); + assert(mm.isMatch('z.js', '*.js')); + + assert(mm.isMatch('z.js', 'z*.js')); + assert(mm.isMatch('a/z.js', 'a/z*.js')); + assert(mm.isMatch('a/z.js', '*/z*.js')); + }); + + it('should match globstars', function() { + assert(mm.isMatch('a/b/c/z.js', '**/*.js')); + assert(mm.isMatch('a/b/z.js', '**/*.js')); + assert(mm.isMatch('a/z.js', '**/*.js')); + assert(mm.isMatch('a/b/c/d/e/z.js', 'a/b/**/*.js')); + assert(mm.isMatch('a/b/c/d/z.js', 'a/b/**/*.js')); + assert(mm.isMatch('a/b/c/z.js', 'a/b/c/**/*.js')); + assert(mm.isMatch('a/b/c/z.js', 'a/b/c**/*.js')); + assert(mm.isMatch('a/b/c/z.js', 'a/b/**/*.js')); + assert(mm.isMatch('a/b/z.js', 'a/b/**/*.js')); + + assert(!mm.isMatch('a/z.js', 'a/b/**/*.js')); + assert(!mm.isMatch('z.js', 'a/b/**/*.js')); + + // issue #23 + assert(!mm.isMatch('zzjs', 'z*.js')); + assert(!mm.isMatch('zzjs', '*z.js')); + + // issue #24 + assert(mm.isMatch('a', '**')); + assert(!mm.isMatch('a', 'a/**')); + assert(mm.isMatch('a/', '**')); + assert(mm.isMatch('a/b/c/d', '**')); + assert(mm.isMatch('a/b/c/d/', '**')); + assert(mm.isMatch('a/b/c/d/', '**/**')); + assert(mm.isMatch('a/b/c/d/', '**/b/**')); + assert(mm.isMatch('a/b/c/d/', 'a/b/**')); + assert(mm.isMatch('a/b/c/d/', 'a/b/**/')); + assert(mm.isMatch('a/b/c/d/', 'a/b/**/c/**/')); + assert(mm.isMatch('a/b/c/d/', 'a/b/**/c/**/d/')); + assert(!mm.isMatch('a/b/c/d/', 'a/b/**/f')); + assert(mm.isMatch('a/b/c/d/e.f', 'a/b/**/**/*.*')); + assert(mm.isMatch('a/b/c/d/e.f', 'a/b/**/*.*')); + assert(mm.isMatch('a/b/c/d/e.f', 'a/b/**/c/**/d/*.*')); + assert(mm.isMatch('a/b/c/d/e.f', 'a/b/**/d/**/*.*')); + assert(mm.isMatch('a/b/c/d/g/e.f', 'a/b/**/d/**/*.*')); + assert(mm.isMatch('a/b/c/d/g/g/e.f', 'a/b/**/d/**/*.*')); + + // https://github.com/micromatch/micromatch/issues/15 + assert(mm.isMatch('z.js', 'z*')); + assert(mm.isMatch('z.js', '**/z*')); + assert(mm.isMatch('z.js', '**/z*.js')); + assert(mm.isMatch('z.js', '**/*.js')); + assert(mm.isMatch('foo', '**/foo')); + + assert(mm.isMatch('a/b-c/z.js', 'a/b-*/**/z.js')); + assert(mm.isMatch('a/b-c/d/e/z.js', 'a/b-*/**/z.js')); + }); + + it('should match slashes', function() { + assert(!mm.isMatch('bar/baz/foo', '*/foo')); + assert(!mm.isMatch('deep/foo/bar', '**/bar/*')); + assert(!mm.isMatch('deep/foo/bar/baz/x', '*/bar/**')); + assert(!mm.isMatch('foo', 'foo/**')); + assert(!mm.isMatch('foo/bar', 'foo?bar')); + assert(!mm.isMatch('foo/bar/baz', '**/bar*')); + assert(!mm.isMatch('foo/bar/baz', '**/bar**')); + assert(!mm.isMatch('foo/baz/bar', 'foo**bar')); + assert(!mm.isMatch('foo/baz/bar', 'foo*bar')); + assert(mm.isMatch('a/b/j/c/z/x.md', 'a/**/j/**/z/*.md')); + assert(mm.isMatch('a/j/z/x.md', 'a/**/j/**/z/*.md')); + assert(mm.isMatch('bar/baz/foo', '**/foo')); + assert(mm.isMatch('deep/foo/bar/', '**/bar/**')); + assert(mm.isMatch('deep/foo/bar/baz', '**/bar/*')); + assert(mm.isMatch('deep/foo/bar/baz/', '**/bar/*')); + assert(mm.isMatch('deep/foo/bar/baz/', '**/bar/**')); + assert(mm.isMatch('deep/foo/bar/baz/x', '**/bar/*/*')); + assert(mm.isMatch('foo/b/a/z/bar', 'foo/**/**/bar')); + assert(mm.isMatch('foo/b/a/z/bar', 'foo/**/bar')); + assert(mm.isMatch('foo/bar', 'foo/**/**/bar')); + assert(mm.isMatch('foo/bar', 'foo/**/bar')); + assert(mm.isMatch('foo/bar', 'foo[/]bar')); + assert(mm.isMatch('foo/bar/baz/x', '*/bar/**')); + assert(mm.isMatch('foo/baz/bar', 'foo/**/**/bar')); + assert(mm.isMatch('foo/baz/bar', 'foo/**/bar')); + assert(mm.isMatch('foobazbar', 'foo**bar')); + assert(mm.isMatch('XXX/foo', '**/foo')); + + // https://github.com/micromatch/micromatch/issues/89 + assert(mm.isMatch('foo//baz.md', 'foo//baz.md')); + assert(mm.isMatch('foo//baz.md', 'foo/+baz.md')); + assert(mm.isMatch('foo//baz.md', 'foo//+baz.md')); + assert(mm.isMatch('foo//baz.md', 'foo//*baz.md')); + assert(!mm.isMatch('foo//baz.md', 'foo/baz.md')); + assert(!mm.isMatch('foo/baz.md', 'foo//baz.md')); + }); + + it('question marks should not match slashes', function() { + assert(!mm.isMatch('aaa/bbb', 'aaa?bbb')); + }); + + it('should not match dotfiles when `dot` or `dotfiles` are not set', function() { + assert(!mm.isMatch('.c.md', '*.md')); + assert(!mm.isMatch('a/.c.md', '*.md')); + assert(mm.isMatch('a/.c.md', 'a/.c.md')); + assert(!mm.isMatch('.a', '*.md')); + assert(!mm.isMatch('.verb.txt', '*.md')); + assert(mm.isMatch('a/b/c/.xyz.md', 'a/b/c/.*.md')); + assert(mm.isMatch('.md', '.md')); + assert(!mm.isMatch('.txt', '.md')); + assert(mm.isMatch('.md', '.md')); + assert(mm.isMatch('.a', '.a')); + assert(mm.isMatch('.b', '.b*')); + assert(mm.isMatch('.ab', '.a*')); + assert(mm.isMatch('.ab', '.*')); + assert(!mm.isMatch('.ab', '*.*')); + assert(!mm.isMatch('.md', 'a/b/c/*.md')); + assert(!mm.isMatch('.a.md', 'a/b/c/*.md')); + assert(mm.isMatch('a/b/c/d.a.md', 'a/b/c/*.md')); + assert(!mm.isMatch('a/b/d/.md', 'a/b/c/*.md')); + }); + + it('should match dotfiles when `dot` or `dotfiles` is set', function() { + assert(mm.isMatch('.c.md', '*.md', {dot: true})); + assert(mm.isMatch('.c.md', '.*', {dot: true})); + assert(mm.isMatch('a/b/c/.xyz.md', 'a/b/c/*.md', {dot: true})); + assert(mm.isMatch('a/b/c/.xyz.md', 'a/b/c/.*.md', {dot: true})); + }); + + it('should match file paths', function() { + assert(mm.isMatch('a/b/c/xyz.md', 'a/b/c/*.md')); + assert(mm.isMatch('a/bb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.isMatch('a/bbbb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.isMatch('a/bb.bb/c/xyz.md', 'a/*/c/*.md')); + assert(mm.isMatch('a/bb.bb/aa/bb/aa/c/xyz.md', 'a/**/c/*.md')); + assert(mm.isMatch('a/bb.bb/aa/b.b/aa/c/xyz.md', 'a/**/c/*.md')); + }); + + it('should match full file paths', function() { + assert(!mm.isMatch('a/.b', 'a/**/z/*.md')); + assert(mm.isMatch('a/.b', 'a/.*')); + assert(!mm.isMatch('a/b/z/.a', 'a/**/z/*.a')); + assert(!mm.isMatch('a/b/z/.a', 'a/*/z/*.a')); + assert(mm.isMatch('a/b/z/.a', 'a/*/z/.a')); + assert(mm.isMatch('a/b/c/d/e/z/c.md', 'a/**/z/*.md')); + assert(mm.isMatch('a/b/c/d/e/j/n/p/o/z/c.md', 'a/**/j/**/z/*.md')); + assert(!mm.isMatch('a/b/c/j/e/z/c.txt', 'a/**/j/**/z/*.md')); + }); + + it('should match paths with leading `./` when pattern has `./`', function() { + assert(mm.isMatch('./a/b/c/d/e/j/n/p/o/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.isMatch('./a/b/c/d/e/z/c.md', './a/**/z/*.md')); + assert(mm.isMatch('./a/b/c/j/e/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.isMatch('./a/b/z/.a', './a/**/z/.a')); + // sanity checks + assert(!mm.isMatch('./a/b/c/d/e/z/c.md', './a/**/j/**/z/*.md')); + assert(!mm.isMatch('./a/b/c/j/e/z/c.txt', './a/**/j/**/z/*.md')); + }); + + it('should match paths with leading `./`', function() { + assert(!mm.isMatch('./.a', '*.a')); + assert(!mm.isMatch('./.a', './*.a')); + assert(!mm.isMatch('./.a', 'a/**/z/*.md')); + assert(!mm.isMatch('./a/b/c/d/e/z/c.md', './a/**/j/**/z/*.md')); + assert(!mm.isMatch('./a/b/c/j/e/z/c.txt', './a/**/j/**/z/*.md')); + assert(!mm.isMatch('a/b/c/d/e/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.isMatch('./.a', './.a')); + assert(mm.isMatch('./a/b/c.md', 'a/**/*.md')); + assert(mm.isMatch('./a/b/c/d/e/j/n/p/o/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.isMatch('./a/b/c/d/e/z/c.md', '**/*.md')); + assert(mm.isMatch('./a/b/c/d/e/z/c.md', './a/**/z/*.md')); + assert(mm.isMatch('./a/b/c/d/e/z/c.md', 'a/**/z/*.md')); + assert(mm.isMatch('./a/b/c/j/e/z/c.md', './a/**/j/**/z/*.md')); + assert(mm.isMatch('./a/b/c/j/e/z/c.md', 'a/**/j/**/z/*.md')); + assert(mm.isMatch('./a/b/z/.a', './a/**/z/.a')); + assert(mm.isMatch('./a/b/z/.a', 'a/**/z/.a')); + assert(mm.isMatch('.a', './.a')); + assert(mm.isMatch('a/b/c.md', './a/**/*.md')); + assert(mm.isMatch('a/b/c.md', 'a/**/*.md')); + assert(mm.isMatch('a/b/c/d/e/z/c.md', 'a/**/z/*.md')); + assert(mm.isMatch('a/b/c/j/e/z/c.md', 'a/**/j/**/z/*.md')); + }); + }); +}); diff --git a/test/api.js b/test/api.js new file mode 100644 index 00000000..c8be4501 --- /dev/null +++ b/test/api.js @@ -0,0 +1,207 @@ +'use strict'; + +var path = require('path'); +var sep = path.sep; +var mm = require('./support/match'); + +describe('micromatch', function() { + describe('empty list', function() { + it('should return an empty array', function() { + mm([], '*', []); + }); + }); + + describe('options.nodupes', function() { + it('should return an array with duplicates', function() { + mm(['a', 'a', 'a'], ['*', 'a*'], {nodupes: false}, ['a', 'a', 'a', 'a', 'a', 'a']); + }); + }); + + describe('posix paths', function() { + it('should return an array of matches for a literal string', function() { + mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], '(a/b)', ['a/b']); + mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], 'a/b', ['a/b']); + }); + + it('should return an array of matches for an array of literal strings', function() { + mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['(a/b)', 'a/c'], ['a/b', 'a/c']); + mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c'], ['a/b', 'b/b'], ['a/b', 'b/b']); + }); + + it('should support regex logical or', function() { + mm(['a/a', 'a/b', 'a/c'], ['a/(a|c)'], ['a/a', 'a/c']); + mm(['a/a', 'a/b', 'a/c'], ['a/(a|b|c)', 'a/b'], ['a/a', 'a/b', 'a/c']); + }); + + it('should support regex ranges', function() { + mm(['a/a', 'a/b', 'a/c'], 'a/[b-c]', ['a/b', 'a/c']); + mm(['a/a', 'a/b', 'a/c', 'a/x/y', 'a/x'], 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']); + }); + + it('should support single globs (*)', function() { + var fixtures = ['a', 'b', 'a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a', 'x/y', 'z/z']; + mm(fixtures, ['*'], ['a', 'b']); + mm(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']); + mm(fixtures, ['*/*/*'], ['a/a/a', 'a/a/b']); + mm(fixtures, ['*/*/*/*'], ['a/a/a/a']); + mm(fixtures, ['*/*/*/*/*'], ['a/a/a/a/a']); + mm(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']); + mm(fixtures, ['a/*/*'], ['a/a/a', 'a/a/b']); + mm(fixtures, ['a/*/*/*'], ['a/a/a/a']); + mm(fixtures, ['a/*/*/*/*'], ['a/a/a/a/a']); + mm(fixtures, ['a/*/a'], ['a/a/a']); + mm(fixtures, ['a/*/b'], ['a/a/b']); + }); + + it('should support globstars (**)', function() { + var fixtures = ['a', 'a/', 'a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']; + mm(fixtures, ['*'], ['a', 'a/']); + mm(fixtures, ['*/'], ['a/']); + mm(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x']); + mm(fixtures, ['**'], fixtures); + mm(fixtures, ['**/a'], ['a', 'a/', 'a/a']); + mm(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']); + mm(fixtures, ['a/**'], ['a/', 'a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(fixtures, ['a/**/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(fixtures, ['a/**/**/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(['a/b/foo/bar/baz.qux'], 'a/b/**/bar/**/*.*', ['a/b/foo/bar/baz.qux']); + mm(['a/b/bar/baz.qux'], 'a/b/**/bar/**/*.*', ['a/b/bar/baz.qux']); + }); + + it('should support negation patterns', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm(fixtures, ['!a/b'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm(fixtures, ['*/*', '!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']); + mm(fixtures, ['!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']); + mm(fixtures, ['!a/b', '!a/c'], ['a/a', 'b/a', 'b/b', 'b/c']); + mm(fixtures, ['!a/(b)'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm(fixtures, ['!(a/b)'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + }); + + it('should work with file extensions', function() { + var fixtures = ['a.txt', 'a/b.txt', 'a/x/y.txt', 'a/x/y/z']; + mm(fixtures, ['a/**/*.txt'], ['a/b.txt', 'a/x/y.txt']); + mm(fixtures, ['a/*.txt'], ['a/b.txt']); + mm(fixtures, ['a*.txt'], ['a.txt']); + mm(fixtures, ['*.txt'], ['a.txt']); + }); + + it('should match literal brackets', function() { + mm(['a [b]'], 'a \\[b\\]', ['a [b]']); + mm(['a [b] c'], 'a [b] c', ['a [b] c']); + mm(['a [b]'], 'a \\[b\\]*', ['a [b]']); + mm(['a [bc]'], 'a \\[bc\\]*', ['a [bc]']); + mm(['a [b]', 'a [b].js'], 'a \\[b\\].*', ['a [b].js']); + }); + }); + + describe('windows paths', function() { + beforeEach(function() { + path.sep = '\\'; + }); + afterEach(function() { + path.sep = sep; + }); + + it('should return an array of matches for a literal string', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + mm(fixtures, '(a/b)', ['a/b']); + mm(fixtures, 'a/b', ['a/b']); + mm(fixtures, '(a/b)', ['a\\b'], {unixify: false}); + mm(fixtures, 'a/b', ['a\\b'], {unixify: false}); + }); + + it('should return an array of matches for an array of literal strings', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + mm(fixtures, ['(a/b)', 'a/c'], ['a/b', 'a/c']); + mm(fixtures, ['a/b', 'b/b'], ['a/b', 'b/b']); + mm(fixtures, ['(a/b)', 'a/c'], ['a\\b', 'a\\c'], {unixify: false}); + mm(fixtures, ['a/b', 'b/b'], ['a\\b', 'b\\b'], {unixify: false}); + }); + + it('should support regex logical or', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c']; + mm(fixtures, ['a/(a|c)'], ['a/a', 'a/c']); + mm(fixtures, ['a/(a|b|c)', 'a/b'], ['a/a', 'a/b', 'a/c']); + mm(fixtures, ['a/(a|c)'], ['a\\a', 'a\\c'], {unixify: false}); + mm(fixtures, ['a/(a|b|c)', 'a/b'], ['a\\a', 'a\\b', 'a\\c'], {unixify: false}); + }); + + it('should support regex ranges', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'a\\x\\y', 'a\\x']; + mm(fixtures, 'a/[b-c]', ['a/b', 'a/c']); + mm(fixtures, 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']); + mm(fixtures, 'a/[b-c]', ['a\\b', 'a\\c'], {unixify: false}); + mm(fixtures, 'a/[a-z]', ['a\\a', 'a\\b', 'a\\c', 'a\\x'], {unixify: false}); + }); + + it('should support single globs (*)', function() { + var fixtures = ['a', 'b', 'a\\a', 'a\\b', 'a\\c', 'a\\x', 'a\\a\\a', 'a\\a\\b', 'a\\a\\a\\a', 'a\\a\\a\\a\\a', 'x\\y', 'z\\z']; + mm(fixtures, ['*'], ['a', 'b']); + mm(fixtures, ['*/*'], ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']); + mm(fixtures, ['*/*/*'], ['a/a/a', 'a/a/b']); + mm(fixtures, ['*/*/*/*'], ['a/a/a/a']); + mm(fixtures, ['*/*/*/*/*'], ['a/a/a/a/a']); + mm(fixtures, ['a/*'], ['a/a', 'a/b', 'a/c', 'a/x']); + mm(fixtures, ['a/*/*'], ['a/a/a', 'a/a/b']); + mm(fixtures, ['a/*/*/*'], ['a/a/a/a']); + mm(fixtures, ['a/*/*/*/*'], ['a/a/a/a/a']); + mm(fixtures, ['a/*/a'], ['a/a/a']); + mm(fixtures, ['a/*/b'], ['a/a/b']); + + mm(fixtures, ['*/*'], ['a\\a', 'a\\b', 'a\\c', 'a\\x', 'x\\y', 'z\\z'], {unixify: false}); + mm(fixtures, ['*/*/*'], ['a\\a\\a', 'a\\a\\b'], {unixify: false}); + mm(fixtures, ['*/*/*/*'], ['a\\a\\a\\a'], {unixify: false}); + mm(fixtures, ['*/*/*/*/*'], ['a\\a\\a\\a\\a'], {unixify: false}); + mm(fixtures, ['a/*'], ['a\\a', 'a\\b', 'a\\c', 'a\\x'], {unixify: false}); + mm(fixtures, ['a/*/*'], ['a\\a\\a', 'a\\a\\b'], {unixify: false}); + mm(fixtures, ['a/*/*/*'], ['a\\a\\a\\a'], {unixify: false}); + mm(fixtures, ['a/*/*/*/*'], ['a\\a\\a\\a\\a'], {unixify: false}); + mm(fixtures, ['a/*/a'], ['a\\a\\a'], {unixify: false}); + mm(fixtures, ['a/*/b'], ['a\\a\\b'], {unixify: false}); + }); + + it('should support globstars (**)', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'a\\x', 'a\\x\\y', 'a\\x\\y\\z']; + var expected = ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']; + mm(fixtures, ['a/**'], expected); + mm(fixtures, ['a/**/*'], expected); + mm(fixtures, ['a/**/**/*'], expected); + + mm(fixtures, ['a/**'], fixtures, {unixify: false}); + mm(fixtures, ['a/**/*'], fixtures, {unixify: false}); + mm(fixtures, ['a/**/**/*'], fixtures, {unixify: false}); + }); + + it('should work with file extensions', function() { + var fixtures = ['a.txt', 'a\\b.txt', 'a\\x\\y.txt', 'a\\x\\y\\z']; + mm(fixtures, ['a/**/*.txt'], ['a\\b.txt', 'a\\x\\y.txt'], {unixify: false}); + mm(fixtures, ['a/*/*.txt'], ['a\\x\\y.txt'], {unixify: false}); + mm(fixtures, ['a/*.txt'], ['a\\b.txt'], {unixify: false}); + mm(fixtures, ['a/**/*.txt'], ['a/b.txt', 'a/x/y.txt']); + mm(fixtures, ['a/*/*.txt'], ['a/x/y.txt']); + mm(fixtures, ['a/*.txt'], ['a/b.txt']); + mm(fixtures, ['a*.txt'], ['a.txt']); + mm(fixtures, ['a.txt'], ['a.txt']); + }); + + it('should support negation patterns', function() { + var fixtures = ['a', 'a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + mm(fixtures, ['!a/b'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm(fixtures, ['*/*', '!a/b', '!*/c'], ['a/a', 'b/a', 'b/b']); + mm(fixtures, ['!*/c'], ['a', 'a/a', 'a/b', 'b/a', 'b/b']); + mm(fixtures, ['!a/b', '!*/c'], ['a', 'a/a', 'b/a', 'b/b']); + mm(fixtures, ['!a/b', '!a/c'], ['a', 'a/a', 'b/a', 'b/b', 'b/c']); + mm(fixtures, ['!a/(b)'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm(fixtures, ['!(a/b)'], ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + + mm(fixtures, ['!a/b'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false}); + mm(fixtures, ['*/*', '!a/b', '!*/c'], ['a\\a', 'b\\a', 'b\\b'], {unixify: false}); + mm(fixtures, ['!*/c'], ['a', 'a\\a', 'a\\b', 'b\\a', 'b\\b'], {unixify: false}); + mm(fixtures, ['!a/b', '!*/c'], ['a', 'a\\a', 'b\\a', 'b\\b'], {unixify: false}); + mm(fixtures, ['!a/b', '!a/c'], ['a', 'a\\a', 'b\\a', 'b\\b', 'b\\c'], {unixify: false}); + mm(fixtures, ['!a/(b)'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false}); + mm(fixtures, ['!(a/b)'], ['a', 'a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false}); + }); + }); +}); diff --git a/test/api.makeRe.js b/test/api.makeRe.js new file mode 100644 index 00000000..891a9655 --- /dev/null +++ b/test/api.makeRe.js @@ -0,0 +1,21 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('..'); + +describe('.makeRe()', function() { + it('should throw an error when value is not a string', function() { + assert.throws(function() { + mm.makeRe(); + }); + }); + + it('should create a regex for a glob pattern', function() { + assert(mm.makeRe('*') instanceof RegExp); + }); + + it('should create a regex for a string', function() { + assert.deepEqual(mm.makeRe('abc').source, '^(?:abc)$'); + }); +}); diff --git a/test/api.match.js b/test/api.match.js new file mode 100644 index 00000000..404f3258 --- /dev/null +++ b/test/api.match.js @@ -0,0 +1,101 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('./support/match'); + +describe('.match()', function() { + describe('errors', function() { + it('should throw an error when pattern is not a string', function() { + assert.throws(function() { + require('../').match([], []); + }); + }); + }); + + describe('posix paths', function() { + it('should return an array of matches for a literal string', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm(fixtures, '(a/b)', ['a/b']); + mm(fixtures, 'a/b', ['a/b']); + }); + + it('should support regex logical or', function() { + var fixtures = ['a/a', 'a/b', 'a/c']; + mm(fixtures, 'a/(a|c)', ['a/a', 'a/c']); + mm(fixtures, 'a/(a|b|c)', ['a/a', 'a/b', 'a/c']); + }); + + it('should support regex ranges', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'a/x/y', 'a/x']; + mm(fixtures, 'a/[b-c]', ['a/b', 'a/c']); + mm(fixtures, 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']); + }); + + it('should support negation patterns', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm(fixtures, '!*/*', []); + mm(fixtures, '!*/b', ['a/a', 'a/c', 'b/a', 'b/c']); + mm(fixtures, '!a/*', ['b/a', 'b/b', 'b/c']); + mm(fixtures, '!a/b', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm(fixtures, '!a/(b)', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm(fixtures, '!a/(*)', ['b/a', 'b/b', 'b/c']); + mm(fixtures, '!(*/b)', ['a/a', 'a/c', 'b/a', 'b/c']); + mm(fixtures, '!(a/b)', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + }); + }); + + describe('windows paths', function() { + var sep = path.sep; + beforeEach(function() { + path.sep = '\\'; + }); + + afterEach(function() { + path.sep = sep; + }); + + it('should return an array of matches for a literal string', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + mm(fixtures, '(a/b)', ['a\\b'], {unixify: false}); + mm(fixtures, '(a/b)', ['a/b']); + mm(fixtures, 'a/b', ['a\\b'], {unixify: false}); + mm(fixtures, 'a/b', ['a/b']); + }); + + it('should support regex logical or', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c']; + mm(fixtures, 'a/(a|c)', ['a\\a', 'a\\c'], {unixify: false}); + mm(fixtures, 'a/(a|c)', ['a/a', 'a/c']); + mm(fixtures, 'a/(a|b|c)', ['a\\a', 'a\\b', 'a\\c'], {unixify: false}); + mm(fixtures, 'a/(a|b|c)', ['a/a', 'a/b', 'a/c']); + }); + + it('should support regex ranges', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'a\\x\\y', 'a\\x']; + mm(fixtures, 'a/[b-c]', ['a\\b', 'a\\c'], {unixify: false}); + mm(fixtures, 'a/[b-c]', ['a/b', 'a/c']); + mm(fixtures, 'a/[a-z]', ['a\\a', 'a\\b', 'a\\c', 'a\\x'], {unixify: false}); + mm(fixtures, 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']); + }); + + it('should support negation patterns', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + mm(fixtures, '!*/*', []); + mm(fixtures, '!*/b', ['a\\a', 'a\\c', 'b\\a', 'b\\c'], {unixify: false}); + mm(fixtures, '!*/b', ['a/a', 'a/c', 'b/a', 'b/c']); + mm(fixtures, '!a/*', ['b\\a', 'b\\b', 'b\\c'], {unixify: false}); + mm(fixtures, '!a/*', ['b/a', 'b/b', 'b/c']); + mm(fixtures, '!a/b', ['a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false}); + mm(fixtures, '!a/b', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm(fixtures, '!a/(b)', ['a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false}); + mm(fixtures, '!a/(b)', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm(fixtures, '!a/(*)', ['b\\a', 'b\\b', 'b\\c'], {unixify: false}); + mm(fixtures, '!a/(*)', ['b/a', 'b/b', 'b/c']); + mm(fixtures, '!(*/b)', ['a\\a', 'a\\c', 'b\\a', 'b\\c'], {unixify: false}); + mm(fixtures, '!(*/b)', ['a/a', 'a/c', 'b/a', 'b/c']); + mm(fixtures, '!(a/b)', ['a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c'], {unixify: false}); + mm(fixtures, '!(a/b)', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + }); + }); +}); diff --git a/test/api.matchKeys.js b/test/api.matchKeys.js new file mode 100644 index 00000000..5c257e60 --- /dev/null +++ b/test/api.matchKeys.js @@ -0,0 +1,40 @@ +'use strict'; + +var assert = require('assert'); +var mm = require('..'); + +describe('.matchKeys()', function() { + describe('error handling', function() { + it('should throw when the first argument is not an object', function() { + assert.throws(function() { + mm.matchKeys(); + }, /expected the first argument to be an object/); + + assert.throws(function() { + mm.matchKeys('foo'); + }, /expected the first argument to be an object/); + + assert.throws(function() { + mm.matchKeys(['foo']); + }, /expected the first argument to be an object/); + }); + }); + + describe('match object keys', function() { + it('should return a new object with only keys that match the given glob pattern', function() { + assert.deepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, '*'), {a: 'a', b: 'b', c: 'c'}); + assert.deepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, 'a'), {a: 'a'}); + assert.deepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, '[a-b]'), {a: 'a', b: 'b'}); + assert.deepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, '(a|c)'), {a: 'a', c: 'c'}); + assert.notDeepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, 'a'), {b: 'b'}); + }); + + it('should return a new object with only keys that match a regex:', function() { + assert.deepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /.*/), {a: 'a', b: 'b', c: 'c'}); + assert.deepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /a/), {a: 'a'}); + assert.deepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /[a-b]/), {a: 'a', b: 'b'}); + assert.deepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /(a|c)/), {a: 'a', c: 'c'}); + assert.notDeepEqual(mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /a/), {b: 'b'}); + }); + }); +}); diff --git a/test/api.matcher.js b/test/api.matcher.js new file mode 100644 index 00000000..429db951 --- /dev/null +++ b/test/api.matcher.js @@ -0,0 +1,130 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('./support/match'); + +describe('.matcher()', function() { + describe('errors', function() { + it('should throw an error when arguments are invalid', function() { + assert.throws(function() { + mm.matcher(null); + }); + + assert.throws(function() { + mm.matcher(); + }); + + assert.throws(function() { + mm.matcher(function() {}); + }); + }); + }); + + describe('posix paths', function() { + it('should return an array of matches for a literal string', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm.matcher(fixtures, '(a/b)', ['a/b']); + mm.matcher(fixtures, 'a/b', ['a/b']); + }); + + it('should support regex logical or', function() { + var fixtures = ['a/a', 'a/b', 'a/c']; + mm.matcher(fixtures, 'a/(a|c)', ['a/a', 'a/c']); + mm.matcher(fixtures, 'a/(a|b|c)', ['a/a', 'a/b', 'a/c']); + }); + + it('should support regex ranges', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'a/x/y', 'a/x']; + mm.matcher(fixtures, 'a/[b-c]', ['a/b', 'a/c']); + mm.matcher(fixtures, 'a/[a-z]', ['a/a', 'a/b', 'a/c', 'a/x']); + }); + + it('should support negation patterns', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm.matcher(fixtures, '!*/*', []); + mm.matcher(fixtures, '!*/b', ['a/a', 'a/c', 'b/a', 'b/c']); + mm.matcher(fixtures, '!a/*', ['b/a', 'b/b', 'b/c']); + mm.matcher(fixtures, '!a/b', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm.matcher(fixtures, '!a/(b)', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm.matcher(fixtures, '!a/(*)', ['b/a', 'b/b', 'b/c']); + mm.matcher(fixtures, '!(*/b)', ['a/a', 'a/c', 'b/a', 'b/c']); + mm.matcher(fixtures, '!(a/b)', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + }); + }); + + describe('posix paths (array of patterns)', function() { + it('should return an array of matches for a literal string', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm.matcher(fixtures, ['(a/b)'], ['a/b']); + mm.matcher(fixtures, ['a/b'], ['a/b']); + }); + + it('should support regex logical or', function() { + var fixtures = ['a/a', 'a/b', 'a/c']; + mm.matcher(fixtures, ['a/(a|c)'], ['a/a', 'a/c']); + mm.matcher(fixtures, ['a/(a|b|c)'], ['a/a', 'a/b', 'a/c']); + }); + + it('should support regex ranges', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'a/x/y', 'a/x']; + mm.matcher(fixtures, ['a/[b-c]'], ['a/b', 'a/c']); + mm.matcher(fixtures, ['a/[a-z]'], ['a/a', 'a/b', 'a/c', 'a/x']); + }); + + it('should support negation patterns', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm.matcher(fixtures, ['!*/*'], []); + mm.matcher(fixtures, ['!*/*'], []); + mm.matcher(fixtures, ['!*/b'], ['a/a', 'a/c', 'b/a', 'b/c']); + mm.matcher(fixtures, ['!a/*'], ['b/a', 'b/b', 'b/c']); + mm.matcher(fixtures, ['!a/b'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm.matcher(fixtures, ['!a/(b)'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm.matcher(fixtures, ['!a/(*)'], ['b/a', 'b/b', 'b/c']); + mm.matcher(fixtures, ['!(*/b)'], ['a/a', 'a/c', 'b/a', 'b/c']); + mm.matcher(fixtures, ['!(a/b)'], ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + }); + }); + + describe('windows paths', function() { + var sep = path.sep; + beforeEach(function() { + path.sep = '\\'; + }); + + afterEach(function() { + path.sep = sep; + }); + + it('should return an array of matches for a literal string', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + mm.matcher(fixtures, '(a/b)', ['a\\b']); + mm.matcher(fixtures, 'a/b', ['a\\b']); + }); + + it('should support regex logical or', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c']; + mm.matcher(fixtures, 'a/(a|c)', ['a\\a', 'a\\c']); + mm.matcher(fixtures, 'a/(a|b|c)', ['a\\a', 'a\\b', 'a\\c']); + }); + + it('should support regex ranges', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'a\\x\\y', 'a\\x']; + mm.matcher(fixtures, 'a/[b-c]', ['a\\b', 'a\\c']); + mm.matcher(fixtures, 'a/[a-z]', ['a\\a', 'a\\b', 'a\\c', 'a\\x']); + }); + + it('should support negation patterns', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + mm.matcher(fixtures, '!*/*', []); + mm.matcher(fixtures, '!*/b', ['a\\a', 'a\\c', 'b\\a', 'b\\c']); + mm.matcher(fixtures, '!a/*', ['b\\a', 'b\\b', 'b\\c']); + mm.matcher(fixtures, '!a/b', ['a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c']); + mm.matcher(fixtures, '!a/(b)', ['a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c']); + mm.matcher(fixtures, '!a/(*)', ['b\\a', 'b\\b', 'b\\c']); + mm.matcher(fixtures, '!(*/b)', ['a\\a', 'a\\c', 'b\\a', 'b\\c']); + mm.matcher(fixtures, '!(a/b)', ['a\\a', 'a\\c', 'b\\a', 'b\\b', 'b\\c']); + path.sep = sep; + }); + }); +}); diff --git a/test/api.not.js b/test/api.not.js new file mode 100644 index 00000000..b26fa07e --- /dev/null +++ b/test/api.not.js @@ -0,0 +1,111 @@ +'use strict'; + +var path = require('path'); +var sep = path.sep; +var mm = require('./support/match'); + +describe('.not()', function() { + describe('posix paths', function() { + it('should return an array of matches for a literal string', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm.not(fixtures, '(a/b)', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm.not(fixtures, 'a/b', ['a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + }); + + it('should support regex logical or', function() { + var fixtures = ['a/a', 'a/b', 'a/c']; + mm.not(fixtures, 'a/(a|c)', ['a/b']); + mm.not(fixtures, 'a/(a|b|c)', []); + }); + + it('should support regex ranges', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'a/x/y', 'a/x']; + mm.not(fixtures, 'a/[b-c]', ['a/a', 'a/x/y', 'a/x']); + mm.not(fixtures, 'a/[a-z]', ['a/x/y']); + }); + + it('should support globs (*)', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']; + mm.not(fixtures, 'a/*', ['a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']); + mm.not(fixtures, 'a/*/a', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']); + mm.not(fixtures, 'a/*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/a/a', 'a/a/a/a/a']); + mm.not(fixtures, 'a/*/*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a/a']); + mm.not(fixtures, 'a/*/*/*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a']); + }); + + it('should support globstars (**)', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']; + mm.not(fixtures, 'a/**', []); + mm.not(fixtures, 'a/**/*', []); + mm.not(fixtures, 'a/**/**/*', []); + }); + + it('should support negation patterns', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm.not(fixtures, '!a/b', ['a/b']); + mm.not(fixtures, '!a/(b)', ['a/b']); + mm.not(fixtures, '!(a/b)', ['a/b']); + }); + }); + + describe('windows paths', function() { + beforeEach(function() { + path.sep = '\\'; + }); + afterEach(function() { + path.sep = sep; + }); + + it('should return an array of matches for a literal string', function() { + var fixtures = ['a', 'a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + mm.not(fixtures, '(a/b)', ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + mm.not(fixtures, 'a/b', ['a', 'a/a', 'a/c', 'b/a', 'b/b', 'b/c']); + }); + + it('should support regex logical or', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c']; + mm.not(fixtures, 'a/(a|c)', ['a/b']); + mm.not(fixtures, 'a/(a|b|c)', []); + }); + + it('should support regex ranges', function() { + var fixtures = ['.\\a\\a', 'a\\a', 'a\\b', 'a\\c', 'a\\x\\y', 'a\\x']; + mm.not(fixtures, '[a-c]/[a-c]', ['a/x', 'a/x/y']); + mm.not(fixtures, 'a/[b-c]', ['a/a', 'a/x', 'a/x/y']); + mm.not(fixtures, 'a/[a-z]', ['a/x/y']); + }); + + it('should support globs (*)', function() { + var fixtures = ['a\\a', 'a/a', 'a\\b', '.\\a\\b', 'a\\c', 'a\\x', 'a\\a\\a', 'a\\a\\b', 'a\\a\\a\\a', 'a\\a\\a\\a\\a']; + mm.not(fixtures, 'a/*', ['a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']); + mm.not(fixtures, 'a/*/a', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']); + mm.not(fixtures, 'a/*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/a/a', 'a/a/a/a/a']); + mm.not(fixtures, 'a/*/*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a/a']); + mm.not(fixtures, 'a/*/*/*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a']); + }); + + it('should support globstars (**)', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'a\\x', 'a\\x\\y', 'a\\x\\y\\z']; + var expected = ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']; + mm.not(fixtures, '*', expected); + mm.not(fixtures, '**', []); + mm.not(fixtures, '*/*', ['a/x/y', 'a/x/y/z']); + mm.not(fixtures, 'a/**', []); + mm.not(fixtures, 'a/x/**', ['a/a', 'a/b', 'a/c', 'a/x']); + mm.not(fixtures, 'a/**/*', []); + mm.not(fixtures, 'a/**/**/*', []); + }); + + it('should support negation patterns', function() { + var fixtures = ['a\\a', 'a\\b', 'a\\c', 'b\\a', 'b\\b', 'b\\c']; + var expected = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + mm.not(fixtures, '!**', expected); + mm.not(fixtures, '!*/*', expected); + mm.not(fixtures, '!*', []); + mm.not(fixtures, '!a/b', ['a/b']); + mm.not(fixtures, '!a/(b)', ['a/b']); + mm.not(fixtures, '!(a/b)', ['a/b']); + }); + }); +}); + diff --git a/test/api.parse.js b/test/api.parse.js new file mode 100644 index 00000000..12df972d --- /dev/null +++ b/test/api.parse.js @@ -0,0 +1,47 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('..'); + +describe('.parse()', function() { + it('should throw an error when arguments are invalid', function() { + assert.throws(function() { + mm.parse(); + }); + }); + + it('should return an AST for a glob', function() { + var ast = mm.parse('a/*'); + delete ast.state; + assert.deepEqual(ast, { + type: 'root', + errors: [], + nodes: [ + { type: 'bos', val: '' }, + { type: 'text', val: 'a' }, + { type: 'slash', val: '/' }, + { type: 'star', val: '*' }, + { type: 'eos', val: '' } + ], + input: 'a/*' + }); + + ast = mm.parse('a/**/*'); + delete ast.state; + assert.deepEqual(ast, { + type: 'root', + errors: [], + nodes: [ + { type: 'bos', val: '' }, + { type: 'text', val: 'a' }, + { type: 'slash', val: '/' }, + { type: 'globstar', val: '**' }, + { type: 'slash', val: '/' }, + { type: 'star', val: '*' }, + { type: 'eos', val: '' } + ], + input: 'a/**/*' + }); + }); +}); diff --git a/test/api.some.js b/test/api.some.js new file mode 100644 index 00000000..7e81561d --- /dev/null +++ b/test/api.some.js @@ -0,0 +1,21 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('..'); + +describe('.some()', function() { + it('should return true if any matches are found', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + assert(mm.some(fixtures, ['z', 'b/*'])); + }); + + it('should return false if no matches are found', function() { + var fixtures = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c']; + assert(!mm.some(fixtures, ['z', 'x/*'])); + }); + + it('should arrayify a string value', function() { + assert(mm.some('a', ['*'])); + }); +}); diff --git a/test/bash-extglob.js b/test/bash-extglob.js deleted file mode 100644 index 01a78216..00000000 --- a/test/bash-extglob.js +++ /dev/null @@ -1,96 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('mocha'); -var path = require('path'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); -require('should'); - -if ('minimatch' in argv) { - mm = ref.minimatch; -} - -var i = 0; -function match(a, pattern, b) { - mm(a.sort(), pattern).should.eql(b.sort()); - console.log(' ' + i++); -} - -describe('bash', function() { - it('should match extended globs:', function() { - match(['aaac', 'foo'], '*(@(a))a@(c)', ['aaac']); - match(['aaac'], '*(@(a))a@(c)', ['aaac']); - match(['aac'], '*(@(a))a@(c)', ['aac']); - match(['aac'], '*(@(a))b@(c)', []); - match(['abbcd'], '@(ab|a*(b))*(c)d', ['abbcd']); - match(['abcd'], '?@(a|b)*@(c)d', ['abcd']); - match(['abcd'], '@(ab|a*@(b))*(c)d', ['abcd']); - match(['ac'], '*(@(a))a@(c)', ['ac']); - match(['acd'], '@(ab|a*(b))*(c)d', ['acd']); - match(['baaac'], '*(@(a))a@(c)', []); - match(['c'], '*(@(a))a@(c)', []); - match(['effgz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))', ['effgz']); - match(['efgz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))', ['efgz']); - match(['egz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))', ['egz']); - match(['egz'], '@(b+(c)d|e+(f)g?|?(h)i@(j|k))', []); - match(['egzefffgzbcdij'], '*(b+(c)d|e*(f)g?|?(h)i@(j|k))', ['egzefffgzbcdij']); - match(['f'], '!(f)', []); - match(['f'], '*(!(f))', []); - match(['f'], '+(!(f))', []); - match(['fa', 'fb', 'f', 'fo'], '!(f!(o))', ['fo']); - match(['fa', 'fb', 'f', 'fo'], '!(f(o))', ['f', 'fb', 'fa']); - match(['fffooofoooooffoofffooofff'], '*(*(f)*(o))', ['fffooofoooooffoofffooofff']); - match(['ffo'], '*(f*(o))', ['ffo']); - match(['fofo'], '*(f*(o))', ['fofo']); - match(['fofoofoofofoo'], '*(fo|foo)', ['fofoofoofofoo']); - match(['foo', 'bar'], '!(foo)', ['bar']); - match(['foo', 'bar'], '!(foo)*', ['bar']); - match(['foo'], '!(foo)', []); - match(['foo'], '!(x)', ['foo']); - match(['foo'], '!(x)*', ['foo']); - match(['foo/bar'], 'foo/!(foo)', ['foo/bar']); - match(['foob'], '!(foo)b*', []); - match(['foobar', 'baz'], '!(foo)*', ['baz']); - match(['foofoofo'], '@(foo|f|fo)*(f|of+(o))', ['foofoofo']); - match(['fooofoofofooo'], '*(f*(o))', ['fooofoofofooo']); - match(['foooofo'], '*(f*(o))', ['foooofo']); - match(['foooofof'], '*(f*(o))', ['foooofof']); - match(['foooofof'], '*(f+(o))', []); - match(['foooofofx'], '*(f*(o))', []); - match(['foooxfooxfoxfooox'], '*(f*(o)x)', ['foooxfooxfoxfooox']); - match(['foooxfooxfxfooox'], '*(f*(o)x)', ['foooxfooxfxfooox']); - match(['foooxfooxofoxfooox'], '*(f*(o)x)', []); - match(['foot'], '@(!(z*)|*x)', ['foot']); - match(['foox'], '@(!(z*)|*x)', ['foox']); - match(['moo.cow', 'a.b'], '!(*.*).!(*.*)', ['a.b', 'moo.cow']); - match(['moo.cow', 'a.b'], '!(*\\.*).!(*\\.*)', ['a.b', 'moo.cow']); - match(['moo.cow'], '!(*.*).!(*.*)', ['moo.cow']); - match(['mucca.pazza'], 'mu!(*(c))?.pa!(*(z))?', []); - match(['ofoofo'], '*(of+(o))', ['ofoofo']); - match(['ofoofo'], '*(of+(o)|f)', ['ofoofo']); - match(['ofooofoofofooo'], '*(f*(o))', []); - match(['ofoooxoofxo'], '*(*(of*(o)x)o)', ['ofoooxoofxo']); - match(['ofoooxoofxoofoooxoofxo'], '*(*(of*(o)x)o)', ['ofoooxoofxoofoooxoofxo']); - match(['ofoooxoofxoofoooxoofxofo'], '*(*(of*(o)x)o)', []); - match(['ofoooxoofxoofoooxoofxoo'], '*(*(of*(o)x)o)', ['ofoooxoofxoofoooxoofxoo']); - match(['ofoooxoofxoofoooxoofxooofxofxo'], '*(*(of*(o)x)o)', ['ofoooxoofxoofoooxoofxooofxofxo']); - match(['ofxoofxo'], '*(*(of*(o)x)o)', ['ofxoofxo']); - match(['oofooofo'], '*(of|oof+(o))', ['oofooofo']); - match(['ooo'], '!(f)', ['ooo']); - match(['ooo'], '*(!(f))', ['ooo']); - match(['ooo'], '+(!(f))', ['ooo']); - match(['oxfoxfox'], '*(oxf+(ox))', []); - match(['oxfoxoxfox'], '*(oxf+(ox))', ['oxfoxoxfox']); - match(['xfoooofof'], '*(f*(o))', []); - match(['zoot'], '@(!(z*)|*x)', []); - match(['zoox'], '@(!(z*)|*x)', ['zoox']); - }); -}); diff --git a/test/bash.js b/test/bash.js index 0fe18d3d..f237a884 100644 --- a/test/bash.js +++ b/test/bash.js @@ -1,122 +1,267 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - 'use strict'; -var path = require('path'); -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); +require('mocha'); +var assert = require('assert'); +var isWindows = require('is-windows'); +var match = require('./support/match'); var mm = require('..'); -if ('minimatch' in argv) { - mm = ref; -} - // from the Bash 4.3 specification/unit tests -var arr = ['a','b','c','d','abc','abd','abe','bb','bcd','ca','cb','dd','de','Beware','bdir/', '*']; +var fixtures = ['*', '**', '\\*', 'a', 'a/*', 'abc', 'abd', 'abe', 'b', 'bb', 'bcd', 'bdir/', 'Beware', 'c', 'ca', 'cb', 'd', 'dd', 'de']; describe('bash options and features:', function() { describe('failglob:', function() { it('should throw an error when no matches are found:', function() { - (function() { - mm.match(arr, '\\^', {failglob: true}) - }).should.throw('micromatch.match() found no matches for: "\\^".'); + assert.throws(function() { + require('..').match(fixtures, '\\^', {failglob: true}); + }, /no matches found for/); }); }); // $echo a/{1..3}/b describe('bash', function() { it('should handle "regular globbing":', function() { - mm.match(arr, 'a*').should.eql(['a','abc','abd','abe']); - mm.match(arr, '\\a*').should.eql(['a','abc','abd','abe']); + match(fixtures, 'a*', ['a', 'abc', 'abd', 'abe']); + match(fixtures, '\\a*', ['a', 'abc', 'abd', 'abe']); }); it('should match directories:', function() { - mm.match(arr, 'b*/').should.eql(['bdir/']); + match(fixtures, 'b*/', ['bdir/']); }); it('should use quoted characters as literals:', function() { - mm.match(arr, '\\*', {nonull: true}).should.eql(['*']); - mm.match(arr, '\\^', {nonull: true}).should.eql(['^']); - mm.match(arr, '\\^').should.eql([]); + if (isWindows()) { + match(fixtures, '\\*', {nonull: true}, ['*', '/*']); + match(fixtures, '\\*', {nonull: true, unescape: true}, ['*', '/*']); + + match(fixtures, '\\^', {nonull: true}, ['\\^']); + match(fixtures, '\\^', []); + + match(fixtures, 'a\\*', {nonull: true}, ['a\\*']); + match(fixtures, 'a\\*', ['a*'], {nonull: true, unescape: true}); + match(fixtures, 'a\\*', []); + + match(fixtures, ['a\\*', '\\*'], {nonull: true}, ['*', '/*', 'a\\*']); + match(fixtures, ['a\\*', '\\*'], {nonull: true, unescape: true}, ['a*', '*', '/*']); + match(fixtures, ['a\\*', '\\*'], {unescape: true}, ['*', '/*']); + match(fixtures, ['a\\*', '\\*'], ['*', '/*']); - mm.match(arr, 'a\\*', {nonull: true}).should.eql(['a*']); - mm.match(arr, 'a\\*').should.eql([]); + match(fixtures, ['a\\*'], {nonull: true}, ['a\\*']); + match(fixtures, ['a\\*'], []); - mm(arr, ['a\\*', '\\*'], {nonull: true}).should.eql(['a*', '*']); - mm(arr, ['a\\*', '\\*']).should.eql(['*']); + match(fixtures, ['c*', 'a\\*', '*q*'], {nonull: true}, ['c', 'ca', 'cb', 'a\\*', '*q*']); + match(fixtures, ['c*', 'a\\*', '*q*'], ['c', 'ca', 'cb']); + } else { + match(fixtures, '\\*', {nonull: true}, ['*', '\\*']); + match(fixtures, '\\*', {nonull: true, unescape: true}, ['*']); + match(fixtures, '\\*', {nonull: true, unescape: true, unixify: false}, ['*', '\\*']); - mm(arr, ['a\\*'], {nonull: true}).should.eql(['a*']); - mm(arr, ['a\\*']).should.eql([]); + match(fixtures, '\\^', {nonull: true}, ['\\^']); + match(fixtures, '\\^', []); - mm(arr, ['c*','a\\*','*q*'], {nonull: true}).should.eql(['c','ca','cb','a*','*q*']); - mm(arr, ['c*','a\\*','*q*']).should.eql(['c','ca','cb']); + match(fixtures, 'a\\*', {nonull: true}, ['a\\*']); + match(fixtures, 'a\\*', ['a*'], {nonull: true, unescape: true}); + match(fixtures, 'a\\*', []); - mm.match(arr, '"*"*', {nonull: true}).should.eql(['**']); - mm.match(arr, '"*"*').should.eql([]); + match(fixtures, ['a\\*', '\\*'], {nonull: true}, ['a\\*', '*', '\\*']); + match(fixtures, ['a\\*', '\\*'], {nonull: true, unescape: true}, ['a*', '*']); + match(fixtures, ['a\\*', '\\*'], {nonull: true, unescape: true, unixify: false}, ['a*', '*', '\\*']); + match(fixtures, ['a\\*', '\\*'], {unescape: true}, ['*']); + match(fixtures, ['a\\*', '\\*'], {unescape: true, unixify: false}, ['*', '\\*']); + match(fixtures, ['a\\*', '\\*'], ['*', '\\*']); - mm.match(arr, '\\**').should.eql(['*']); // `*` is in the fixtures array + match(fixtures, ['a\\*'], {nonull: true}, ['a\\*']); + match(fixtures, ['a\\*'], []); + + match(fixtures, ['c*', 'a\\*', '*q*'], {nonull: true}, ['c', 'ca', 'cb', 'a\\*', '*q*']); + match(fixtures, ['c*', 'a\\*', '*q*'], ['c', 'ca', 'cb']); + } + }); + + it('should work for quoted characters', function() { + match(fixtures, '"***"', []); + match(fixtures, '"***"', {nonull: true}, ['"***"']); + match(fixtures, '"*"*', ['*', '**']); + }); + + it('should work for escaped characters', function() { + match(fixtures, '\\**', ['*', '**']); }); it('should work for escaped paths/dots:', function() { - mm.match(arr, '"\\.\\./*/"', {nonull: true}).should.eql(['../*/']); - mm.match(arr, 's/\\..*//', {nonull: true}).should.eql(['s/..*//']); + match(fixtures, '"\\.\\./*/"', {nonull: true}, ['"\\.\\./*/"']); + match(fixtures, '"\\.\\./*/"', {nonull: true, unescape: true}, ['"../*/"']); + match(fixtures, 's/\\..*//', {nonull: true}, ['s/\\..*//']); }); it('Pattern from Larry Wall\'s Configure that caused bash to blow up:', function() { - mm.match(arr, '"/^root:/{s/^[^:]*:[^:]*:\\([^:]*\\).*"\'$\'"/\\1/"', {nonull: true}).should.eql(['/^root:/{s/^[^:]*:[^:]*:([^:]*).*$/1/']); - mm.match(arr, '[a-c]b*').should.eql(['abc','abd','abe','bb','cb']); - }); - - it('Make sure character classes work properly:', function() { - mm.match(arr, '[a-y]*[^c]').should.eql(['abd','abe','bb','bcd','ca','cb','dd','de']); - mm.match(arr, 'a*[^c]').should.eql(['abd','abe']); - - mm.match(['a-b','aXb'], 'a[X-]b').should.eql(['a-b','aXb']); - mm.match(arr, '[^a-c]*').should.eql(['d','dd','de','Beware','*']); - mm.match(['a*b/ooo'], 'a\\*b/*').should.eql(['a*b/ooo']); - mm.match(['a*b/ooo'], 'a\\*?/*').should.eql(['a*b/ooo']); - mm.match(arr, 'a[b]c').should.eql(['abc']); - mm.match(arr, 'a["b"]c').should.eql(['abc']); - mm.match(arr, 'a[\\b]c').should.eql(['abc']); - mm.match(arr, 'a?c').should.eql(['abc']); - mm.match(['man/man1/bash.1'], '*/man*/bash.*').should.eql(['man/man1/bash.1']); - }); - - it('tests with multiple `*\'s:', function() { - mm.match(['bbc','abc', 'bbd'], 'a**c').should.eql(['abc']); - mm.match(['bbc','abc', 'bbd'], 'a***c').should.eql(['abc']); - mm.match(['bbc','abc', 'bbc'], 'a*****?c').should.eql(['abc']); - mm.match(['bbc','abc'], '?*****??').should.eql(['bbc', 'abc']); - mm.match(['bbc','abc'], '*****??').should.eql(['bbc', 'abc']); - mm.match(['bbc','abc'], '?*****?c').should.eql(['bbc', 'abc']); - mm.match(['bbc','abc', 'bbd'], '?***?****c').should.eql(['bbc', 'abc']); - mm.match(['bbc','abc'], '?***?****?').should.eql(['bbc', 'abc']); - mm.match(['bbc','abc'], '?***?****').should.eql(['bbc', 'abc']); - mm.match(['bbc','abc'], '*******c').should.eql(['bbc', 'abc']); - mm.match(['bbc','abc'], '*******?').should.eql(['bbc', 'abc']); - mm.match(['abcdecdhjk'], 'a*cd**?**??k').should.eql(['abcdecdhjk']); - mm.match(['abcdecdhjk'], 'a**?**cd**?**??k').should.eql(['abcdecdhjk']); - mm.match(['abcdecdhjk'], 'a**?**cd**?**??k***').should.eql(['abcdecdhjk']); - mm.match(['abcdecdhjk'], 'a**?**cd**?**??***k').should.eql(['abcdecdhjk']); - mm.match(['abcdecdhjk'], 'a**?**cd**?**??***k**').should.eql(['abcdecdhjk']); - mm.match(['abcdecdhjk'], 'a****c**?**??*****').should.eql(['abcdecdhjk']); + match(fixtures, '"/^root:/{s/^[^:]*:[^:]*:\\([^:]*\\).*"\'$\'"/\\1/"', {nonull: true}, ['"/^root:/{s/^[^:]*:[^:]*:\\([^:]*\\).*"\'$\'"/\\1/"']); + match(fixtures, '[a-c]b*', ['abc', 'abd', 'abe', 'bb', 'cb']); + }); + + it('should support character classes', function() { + var f = fixtures.slice(); + f.push('baz', 'bzz', 'BZZ', 'beware', 'BewAre'); + + match(f, 'a*[^c]', ['abd', 'abe']); + match(['a-b', 'aXb'], 'a[X-]b', ['a-b', 'aXb']); + match(f, '[a-y]*[^c]', ['abd', 'abe', 'baz', 'bzz', 'beware', 'bb', 'bcd', 'ca', 'cb', 'dd', 'de', 'bdir/']); + match(['a*b/ooo'], 'a\\*b/*', ['a*b/ooo']); + match(['a*b/ooo'], 'a\\*?/*', ['a*b/ooo']); + match(f, 'a[b]c', ['abc']); + match(f, 'a["b"]c', ['abc']); + match(f, 'a[\\\\b]c', ['abc']); //<= backslash and a "b" + match(f, 'a[\\b]c', []); //<= word boundary in a character class + match(f, 'a[b-d]c', ['abc']); + match(f, 'a?c', ['abc']); + match(['a-b'], 'a[]-]b', ['a-b']); + match(['man/man1/bash.1'], '*/man*/bash.*', ['man/man1/bash.1']); + + if (isWindows()) { + // should not match backslashes on windows, since backslashes are path + // separators and negation character classes should not match path separators + // unless it's explicitly defined in the character class + match(f, '[^a-c]*', ['d', 'dd', 'de', 'Beware', 'BewAre', 'BZZ', '*', '**']); + match(f, '[^a-c]*', ['d', 'dd', 'de', 'BewAre', 'BZZ', '*', '**'], {bash: false}); + match(f, '[^a-c]*', ['d', 'dd', 'de', '*', '**'], {nocase: true}); + } else { + match(f, '[^a-c]*', ['d', 'dd', 'de', 'Beware', 'BewAre', 'BZZ', '*', '**', '\\*']); + match(f, '[^a-c]*', ['d', 'dd', 'de', 'BewAre', 'BZZ', '*', '**', '\\*'], {bash: false}); + match(f, '[^a-c]*', ['d', 'dd', 'de', '*', '**', '\\*'], {nocase: true}); + } + }); + + it('should support basic wildmatch (brackets) features', function() { + assert(!match.isMatch('aab', 'a[]-]b')); + assert(!match.isMatch('ten', '[ten]')); + assert(!match.isMatch('ten', 't[!a-g]n')); + assert(match.isMatch(']', ']')); + assert(match.isMatch('a-b', 'a[]-]b')); + assert(match.isMatch('a]b', 'a[]-]b')); + assert(match.isMatch('a]b', 'a[]]b')); + assert(match.isMatch('aab', 'a[\\]a\\-]b')); + assert(match.isMatch('ten', 't[a-g]n')); + assert(match.isMatch('ton', 't[!a-g]n')); + assert(match.isMatch('ton', 't[^a-g]n')); + }); + + it('should support extended slash-matching features', function() { + assert(!match.isMatch('foo/bar', 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r')); + assert(match.isMatch('foo/bar', 'foo[/]bar')); + assert(match.isMatch('foo-bar', 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r')); + }); + + it('should not expand literal braces inside brackets', function() { + assert.deepEqual(mm.makeRe('foo[{a,b}]+baz'), /^(?:foo[{a,b}]+baz)$/); + assert(match.isMatch('foo{}baz', 'foo[{a,b}]+baz')); + }); + + it('should match literal parens', function() { + assert(match.isMatch('foo(bar)baz', 'foo[bar()]+baz')); + }); + + it('should match escaped characters', function() { + assert(!match.isMatch('', '\\')); + assert(!match.isMatch('XXX/\\', '[A-Z]+/\\')); + assert(match.isMatch('\\', '\\')); + if (isWindows()) { + assert(!match.isMatch('XXX/\\', '[A-Z]+/\\\\')); + } else { + assert(match.isMatch('XXX/\\', '[A-Z]+/\\\\')); + } + assert(match.isMatch('[ab]', '\\[ab]')); + assert(match.isMatch('[ab]', '[\\[:]ab]')); + }); + + it('should match brackets', function() { + assert(!match.isMatch(']', '[!]-]')); + assert(match.isMatch('a', '[!]-]')); + assert(match.isMatch('[ab]', '[[]ab]')); + }); + + it('should regard multiple consecutive stars as a single star', function() { + match(['bbc', 'abc', 'bbd'], 'a**c', ['abc']); + match(['bbc', 'abc', 'bbd'], 'a***c', ['abc']); + match(['bbc', 'abc', 'bbc'], 'a*****?c', ['abc']); + match(['bbc', 'abc'], '?*****??', ['bbc', 'abc']); + match(['bbc', 'abc'], '*****??', ['bbc', 'abc']); + match(['bbc', 'abc'], '?*****?c', ['bbc', 'abc']); + match(['bbc', 'abc', 'bbd'], '?***?****c', ['bbc', 'abc']); + match(['bbc', 'abc'], '?***?****?', ['bbc', 'abc']); + match(['bbc', 'abc'], '?***?****', ['bbc', 'abc']); + match(['bbc', 'abc'], '*******c', ['bbc', 'abc']); + match(['bbc', 'abc'], '*******?', ['bbc', 'abc']); + match(['abcdecdhjk'], 'a*cd**?**??k', ['abcdecdhjk']); + match(['abcdecdhjk'], 'a**?**cd**?**??k', ['abcdecdhjk']); + match(['abcdecdhjk'], 'a**?**cd**?**??k***', ['abcdecdhjk']); + match(['abcdecdhjk'], 'a**?**cd**?**??***k', ['abcdecdhjk']); + match(['abcdecdhjk'], 'a**?**cd**?**??***k**', ['abcdecdhjk']); + match(['abcdecdhjk'], 'a****c**?**??*****', ['abcdecdhjk']); }); it('none of these should output anything:', function() { - mm.match(['abc'], '??**********?****?').should.eql([]); - mm.match(['abc'], '??**********?****c').should.eql([]); - mm.match(['abc'], '?************c****?****').should.eql([]); - mm.match(['abc'], '*c*?**').should.eql([]); - mm.match(['abc'], 'a*****c*?**').should.eql([]); - mm.match(['abc'], 'a********???*******').should.eql([]); - mm.match(['a'], '[]').should.eql([]); - mm.match(['['], '[abc').should.eql([]); + match(['abc'], '??**********?****?', []); + match(['abc'], '??**********?****c', []); + match(['abc'], '?************c****?****', []); + match(['abc'], '*c*?**', []); + match(['abc'], 'a*****c*?**', []); + match(['abc'], 'a********???*******', []); + match(['a'], '[]', []); + match(['['], '[abc', []); + }); + }); + + describe('wildmat', function() { + it('Basic wildmat features', function() { + assert(!match.isMatch('foo', '*f')); + assert(!match.isMatch('foo', '??')); + assert(!match.isMatch('foo', 'bar')); + assert(!match.isMatch('foobar', 'foo\\*bar')); + assert(!match.isMatch('', '')); + assert(match.isMatch('?a?b', '\\??\\?b')); + assert(match.isMatch('aaaaaaabababab', '*ab')); + assert(match.isMatch('f\\oo', 'f\\oo')); + assert(match.isMatch('foo', '*')); + assert(match.isMatch('foo', '*foo*')); + assert(match.isMatch('foo', '???')); + assert(match.isMatch('foo', 'f*')); + assert(match.isMatch('foo', 'foo')); + assert(match.isMatch('foo*', 'foo\\*', {unixify: false})); + assert(match.isMatch('foobar', '*ob*a*r*')); + }); + + it('should support recursion', function() { + assert(!match.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-/-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*')); + assert(!match.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*')); + assert(!match.isMatch('ab/cXd/efXg/hi', '*X*i')); + assert(!match.isMatch('ab/cXd/efXg/hi', '*Xg*i')); + assert(!match.isMatch('abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz', '**/*a*b*g*n*t')); + assert(!match.isMatch('foo', '*/*/*')); + assert(!match.isMatch('foo', 'fo')); + assert(!match.isMatch('foo/bar', '*/*/*')); + assert(!match.isMatch('foo/bar', 'foo?bar')); + assert(!match.isMatch('foo/bb/aa/rr', '*/*/*')); + assert(!match.isMatch('foo/bba/arr', 'foo*')); + assert(!match.isMatch('foo/bba/arr', 'foo**')); + assert(!match.isMatch('foo/bba/arr', 'foo/*')); + assert(!match.isMatch('foo/bba/arr', 'foo/**arr')); + assert(!match.isMatch('foo/bba/arr', 'foo/**z')); + assert(!match.isMatch('foo/bba/arr', 'foo/*arr')); + assert(!match.isMatch('foo/bba/arr', 'foo/*z')); + assert(!match.isMatch('XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1', 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*')); + assert(match.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*')); + assert(match.isMatch('ab/cXd/efXg/hi', '**/*X*/**/*i')); + assert(match.isMatch('ab/cXd/efXg/hi', '*/*X*/*/*i')); + assert(match.isMatch('abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt', '**/*a*b*g*n*t')); + assert(match.isMatch('abcXdefXghi', '*X*i')); + assert(match.isMatch('foo', 'foo')); + assert(match.isMatch('foo/bar', 'foo/*')); + assert(match.isMatch('foo/bar', 'foo/bar')); + assert(match.isMatch('foo/bar', 'foo[/]bar')); + assert(match.isMatch('foo/bb/aa/rr', '**/**/**')); + assert(match.isMatch('foo/bba/arr', '*/*/*')); + assert(match.isMatch('foo/bba/arr', 'foo/**')); + assert(match.isMatch('XXX/adobe/courier/bold/o/normal//12/120/75/75/m/70/iso8859/1', 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*', {unixify: false})); }); }); }); diff --git a/test/bash.spec.js b/test/bash.spec.js new file mode 100644 index 00000000..9cbbcf35 --- /dev/null +++ b/test/bash.spec.js @@ -0,0 +1,36 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var forOwn = require('for-own'); +var parse = require('./support/parse'); +var mm = require('./support/matcher'); + +describe('bash.spec', function() { + var fixtures = parse('*.txt', {cwd: path.join(__dirname, 'fixtures')}); + + forOwn(fixtures, function(lines, filename) { + describe(filename + ':', function() { + lines.forEach(function(line) { + if (typeof line === 'string') { + console.log(line); + return; + } + + var fixture = line[0]; + var pattern = line[1]; + var expected = line[2]; + + var title = '"' + fixture + + '" should' + (expected ? '' : ' not') + + ' match "' + pattern + '"'; + + it(title, function() { + var msg = fixture + (expected ? ' === ' : ' !== ') + pattern; + // assert.equal(mm.isMatch(fixture, pattern), mm.mm.isMatch(fixture, pattern), msg); + assert.equal(mm.isMatch(fixture, pattern), expected, msg); + }); + }); + }); + }); +}); diff --git a/test/bash/dotglob.txt b/test/bash/dotglob.txt new file mode 100644 index 00000000..02244187 --- /dev/null +++ b/test/bash/dotglob.txt @@ -0,0 +1,23 @@ +f a/b/.x **/.x/** +f .x **/.x/** +f .x/ **/.x/** +f .x/a **/.x/** +f .x/a/b **/.x/** +f .x/.x **/.x/** +f a/.x **/.x/** + +t a/b/.x/c **/.x/** +t a/b/.x/c/d **/.x/** +t a/b/.x/c/d/e **/.x/** +t a/b/.x/ **/.x/** +t a/.x/b **/.x/** +t a/.x/b/.x/c **/.x/** + +t .bashrc ?bashrc +t .b/ *.* +t .bar.baz/ *.* +t .bar *.* +f .bar !.*.* + +t .bar.baz/ .*.*/ +t .bar.baz/ .*.* diff --git a/test/bash/glob.txt b/test/bash/glob.txt new file mode 100644 index 00000000..e939d496 --- /dev/null +++ b/test/bash/glob.txt @@ -0,0 +1,78 @@ +f a/b/.x **/.x/** +f .x **/.x/** +f .x/ **/.x/** +f .x/a **/.x/** +f .x/a/b **/.x/** +f .x/.x **/.x/** +f a/.x **/.x/** + +t a/b/.x/c **/.x/** +t a/b/.x/c/d **/.x/** +t a/b/.x/c/d/e **/.x/** +t a/b/.x/ **/.x/** +t a/.x/b **/.x/** +t a/.x/b/.x/c **/.x/** + +t a/c/b a/*/b +t a/.d/b a/*/b +t a/./b a/*/b +t a/../b a/*/b + +t ab ab** +t abcdef ab** +t abef ab** +t abcfef ab** + +f ab ab***ef +t abcdef ab***ef +t abef ab***ef +t abcfef ab***ef + +t .bashrc ?bashrc + +f abbc ab?bc +f abc ab?bc + +t a.a [a-d]*.[a-b] +t a.b [a-d]*.[a-b] +t c.a [a-d]*.[a-b] +t a.a.a [a-d]*.[a-b] + +f a.a !*.[a-b] +f a.b !*.[a-b] +f a.a.a !*.[a-b] +f c.a !*.[a-b] +f d.a.d !*.[a-b] +f a.bb !*.[a-b] +f a.ccc !*.[a-b] +f c.ccc !*.[a-b] + +f a.a !*.[a-b]* +f a.b !*.[a-b]* +f a.a.a !*.[a-b]* +f c.a !*.[a-b]* +f d.a.d !*.[a-b]* +f a.bb !*.[a-b]* +f a.ccc !*.[a-b]* +f c.ccc !*.[a-b]* + +f a.a !*[a-b].[a-b]* +f a.b !*[a-b].[a-b]* +f a.a.a !*[a-b].[a-b]* +f c.a !*[a-b].[a-b]* +f d.a.d !*[a-b].[a-b]* +f a.bb !*[a-b].[a-b]* +f a.ccc !*[a-b].[a-b]* +f c.ccc !*[a-b].[a-b]* + +t abd [a-y]*[^c] +t abe [a-y]*[^c] +t bb [a-y]*[^c] +t bcd [a-y]*[^c] +t ca [a-y]*[^c] +t cb [a-y]*[^c] +t dd [a-y]*[^c] +t de [a-y]*[^c] +t bdir/ [a-y]*[^c] + +f abd **/* diff --git a/test/bash/globstar.txt b/test/bash/globstar.txt new file mode 100644 index 00000000..e17c6884 --- /dev/null +++ b/test/bash/globstar.txt @@ -0,0 +1,30 @@ +f a.js **/*.js +t a/a.js **/*.js +t a/a/b.js **/*.js + +f a/b/z.js a/b/**/*.js +t a/b/c/z.js a/b/**/*.js + +f foo.md **/*.md +t foo/bar.md **/*.md + +f foo/bar foo/**/bar +t foo/bar foo/**bar + +t ab/a/d **/* +t ab/b **/* +t a/b/c/d/a.js **/* +t a/b/c.js **/* +t a/b/c.txt **/* +t a/b/.js/c.txt **/* +f a.js **/* +f za.js **/* +f ab **/* +f a.b **/* + +f foo/ foo/**/ +f foo/bar foo/**/ +f foo/bazbar foo/**/ +f foo/barbar foo/**/ +f foo/bar/baz/qux foo/**/ +t foo/bar/baz/qux/ foo/**/ diff --git a/test/braces.js b/test/braces.js index 3a2e50ce..032f7d61 100644 --- a/test/braces.js +++ b/test/braces.js @@ -1,186 +1,368 @@ /*! - * micromatch + * braces * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License */ 'use strict'; -var path = require('path'); -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); +var assert = require('assert'); +var extend = require('extend-shallow'); var mm = require('..'); -if ('minimatch' in argv) { - mm = ref.minimatch; +function optimize(pattern, options) { + return mm.braces(pattern, extend({optimize: true}, options)); } -// $echo a/{1..3}/b -describe('brace expansion', function() { - it('should create a regex for brace expansion:', function() { - mm.match(['iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm.match(['a/a', 'b/b', 'a/b', 'a/c'], '*/{a,c}').should.eql(['a/a', 'a/c']); - mm.match(['a/a/a', 'b/b/b', 'a/a/b', 'a/a/c'], '**/**/{a,c}').should.eql(['a/a/a', 'a/a/c']); - mm.match(['a/b/d/iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm.match(['a/b/c/iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm.match(['a/b/cd/iii.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/cd/iii.md']); - mm.match(['a/b/ce/iii.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/ce/iii.md']); - - mm.match(['xyz.md'], 'a/b/c{d,e}/xyz.md').should.eql([]); - mm.match(['a.md', 'b.md', 'c.md', 'd.md'], '{a,b,c}.md').should.eql(['a.md', 'b.md', 'c.md']); - mm.match(['a/b/d/xyz.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm.match(['a/b/c/xyz.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm.match(['a/b/cd/xyz.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/cd/xyz.md']); - mm.match(['a/b/ce/xyz.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/ce/xyz.md']); - mm.match(['a/b/cef/xyz.md', 'a/b/ceg/xyz.md'], 'a/b/c{d,e{f,g}}/*.md').should.eql(['a/b/cef/xyz.md', 'a/b/ceg/xyz.md']); - mm.match(['a/b/ceg/xyz.md'], 'a/b/c{d,e{f,g}}/*.md').should.eql(['a/b/ceg/xyz.md']); - mm.match(['a/b/cd/xyz.md'], 'a/b/c{d,e{f,g}}/*.md').should.eql(['a/b/cd/xyz.md']); - }); - - it('should match negation patterns:', function() { - mm.match(['iii.md'], '!a/b/c{d,e}/*.md').should.eql(['iii.md']); - }); - - it('should match character classes:', function() { - mm.match(['aa', 'ab', 'ac', 'ad', 'bad', 'baa', 'bbaa'], '(a|b*|c)').should.eql(['bad', 'baa', 'bbaa']); - mm.match(['aa', 'ab', 'ac', 'ad', 'bad', 'baa', 'bbaa'], '*(a|{b),c)}').should.eql(['aa', 'ab', 'ac', 'baa', 'bbaa']); - }); - - it('should handle range expansion:', function() { - mm.match(['aa', 'ab', 'ac', 'acc', 'ad', 'ae', 'af', 'ag'], '*{a..e}').should.eql(['aa', 'ab', 'ac', 'acc', 'ad', 'ae']); - }); - - it('should optimize regex when `optimize` is true:', function() { - mm.match(['aa', 'ab', 'ac', 'acc', 'ad', 'ae', 'af', 'ag'], '*{a..e}').should.eql(['aa', 'ab', 'ac', 'acc', 'ad', 'ae']); - mm.match(['./a/b/d/xyz.md'], './a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm.match(['./a/b/c/xyz.md'], './a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm.match(['./a/b/x/cd/bar/xyz.md'], './a/b/**/c{d,e}/**/xyz.md').should.eql(['./a/b/x/cd/bar/xyz.md']); - mm.match(['./a/b/baz/ce/fez/xyz.md'], './a/b/**/c{d,e}/**/xyz.md').should.eql(['./a/b/baz/ce/fez/xyz.md']); - }); -}); - -// tests based on https://github.com/vmeurisse/wildmatch -describe('braces sequences', function() { - it('normal sequence', function() { - mm.match(['1', '2', '3'], '{1..2}').should.eql(['1', '2']); - mm.match(['0', '3'], '{1..2}').should.eql([]); - }); - - it('backward counting', function() { - mm.match(['1023', '1022', '1021'], '{1023..1021}').should.eql(['1023', '1022', '1021']); - mm.match(['1024', '1020'], '{1023..1021}').should.eql([]); - }); - - it('forced step', function() { - mm.match(['1', '4', '10'], '{1..10..3}').should.eql(['1', '4', '10']); - mm.match(['0', '2', '3', '13'], '{1..10..3}').should.eql([]); - }); - - it('forced step, last number is not in the result', function() { - mm.match(['1', '5', '9'], '{1..10..4}').should.eql(['1', '5', '9']); - mm.match(['0', '4', '10', '13'], '{1..10..4}').should.eql([]); - }); - - it('negative start', function() { - mm.match(['-1', '0', '1', '2'], '{-1..2}').should.eql(['-1', '0', '1', '2']) - mm.match(['-2', '3', 'a'], '{-1..2}').should.eql([]); - }); - - it('negative steps', function() { - mm.match(['5', '2', '-1'], '{5..-2..-3}').should.eql(['5', '2', '-1']) - mm.match(['6', '4', '-2'], '{5..-2..-3}').should.eql([]); - }); - - it('start equal end', function() { - mm.match(['1'], '{1..1}').should.eql(['1']) - mm.match(['0', '2', '-1'], '{1..1}').should.eql([]); - }); - - it('invalid steps: wrong sign', function() { - //mm.match(['5', '6', '7'], '{5..7..-3}').should.eql(['5', '6', '7']) - mm.match(['2'], '{5..7..-3}').should.eql([]); - }); - - it('invalid steps: 0', function() { - mm.match(['5', '6', '7'], '{5..7..0}').should.eql(['5', '6', '7']) - mm.match(['4', '8'], '{5..7..0}').should.eql([]); +describe('expanded', function() { + it('should handle extglobs in braces', function() { + var fixtures = [ + 'a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'bc', 'cb', 'bc,d', + 'c,db', 'c,d', 'd)', '(b|c', '*(b|c', 'b|c', 'b|cc', 'cb|c', + 'x(a|b|c)', 'x(a|c)', '(a|b|c)', '(a|c)' + ]; + + assert.deepEqual(mm(fixtures, ['a', '*(b|c,d)'], {expand: true}), ['a', 'b', 'bc,d', 'c,db', 'c,d']); + assert.deepEqual(mm(fixtures, '{a,*(b|c,d)}', {expand: true}), ['a', 'b', 'bc,d', 'c,db', 'c,d']); + + var expected = ['a', 'b', 'c', 'ab', 'ac', 'bc', 'cb']; + assert.deepEqual(mm(fixtures, '*(a|b|c)'), expected); + assert.deepEqual(mm(fixtures, '*(a|{b|c,c})'), expected); + assert.deepEqual(mm(fixtures, '*(a|{b|c,c})', {expand: true}), expected); }); }); -describe('braces', function() { - it('Basic braces', function() { - mm.match(['abc', 'zbc'], '{a,z}bc').should.eql(['abc', 'zbc']); - mm.match('bbc', '{a,z}bc').should.eql([]); - mm.match(['bca', 'bcz'], 'bc{a,z}').should.eql(['bca', 'bcz']); - }); - - it('letter sequences', function() { - // normal sequence - mm.match(['a', 'b', 'c'], '{a..c}').should.eql(['a', 'b', 'c']) - mm.match(['d', 'a..c'], '{a..c}').should.eql([]); - - mm.match(['A', 'B', 'C'], '{C..A}').should.eql(['A', 'B', 'C']) - mm.match(['a', 'D'], '{C..A}').should.eql([]); - - mm.match(['a', 'c'], '{a..c..2}').should.eql(['a', 'c']) - mm.match(['b'], '{a..c..2}').should.eql([]); +describe('optimized', function() { + describe('sets', function() { + describe('invalid sets', function() { + it('should handle invalid sets:', function() { + optimize('{0..10,braces}', ['(0..10|braces)']); + optimize('{1..10,braces}', ['(1..10|braces)']); + }); + }); + + describe('escaping', function() { + it('should not expand escaped braces', function() { + optimize('\\{a,b,c,d,e}', ['{a,b,c,d,e}']); + optimize('a/b/c/{x,y\\}', ['a/b/c/{x,y}']); + optimize('a/\\{x,y}/cde', ['a/{x,y}/cde']); + optimize('abcd{efgh', ['abcd{efgh']); + optimize('{abc}', ['{abc}']); + optimize('{x,y,\\{a,b,c\\}}', ['(x|y|\\{a|b|c\\})']); + optimize('{x,y,{a,b,c\\}}', ['\\{x,y,(a|b|c\\})']); + optimize('{x,y,{abc},trie}', ['(x|y|\\{abc\\}|trie)']); + optimize('{x\\,y,\\{abc\\},trie}', ['(x,y|\\{abc\\}|trie)']); + }); + + it('should handle spaces', function() { + // Bash 4.3 says the following should be equivalent to `foo|(1|2)|bar`, + // That makes sense in Bash, since ' ' is a separator, but not here. + optimize('foo {1,2} bar', ['foo (1|2) bar']); + }); + + it('should handle empty braces', function() { + optimize('{ }', ['\\{ \\}']); + optimize('{', ['\\{']); + optimize('{}', ['\\{\\}']); + optimize('}', ['\\}']); + }); + + it('should escape braces when only one value is defined', function() { + optimize('a{b}c', ['a\\{b\\}c']); + optimize('a/b/c{d}e', ['a/b/c\\{d\\}e']); + }); + + it('should not expand braces in sets with es6/bash-like variables', function() { + optimize('abc/${ddd}/xyz', ['abc/\\$\\{ddd\\}/xyz']); + optimize('a${b}c', ['a\\$\\{b\\}c']); + optimize('a/{${b},c}/d', ['a/(\\$\\{b\\}|c)/d']); + optimize('a${b,d}/{foo,bar}c', ['a\\$\\{b,d\\}/(foo|bar)c']); + }); + + it('should not expand escaped commas.', function() { + optimize('a{b\\,c\\,d}e', ['a\\{b,c,d\\}e']); + optimize('a{b\\,c}d', ['a\\{b,c\\}d']); + optimize('{abc\\,def}', ['\\{abc,def\\}']); + optimize('{abc\\,def,ghi}', ['(abc,def|ghi)']); + optimize('a/{b,c}/{x\\,y}/d/e', ['a/(b|c)/\\{x,y\\}/d/e']); + }); + + it('should return sets with escaped commas', function() { + optimize('a/{b,c}/{x\\,y}/d/e', ['a/(b|c)/\\{x,y\\}/d/e']); + }); + + it('should not expand escaped braces.', function() { + optimize('{a,b\\}c,d}', ['(a|b\\}c|d)']); + optimize('\\{a,b,c,d,e}', ['\\{a,b,c,d,e\\}']); + optimize('a/{z,\\{a,b,c,d,e}/d', ['a/(z|\\{a|b|c|d|e)/d']); + optimize('a/\\{b,c}/{d,e}/f', ['a/\\{b,c\\}/(d|e)/f']); + optimize('./\\{x,y}/{a..z..3}/', ['./\\{x,y\\}/(a|d|g|j|m|p|s|v|y)/']); + }); + + it('should not expand escaped braces or commas.', function() { + optimize('{x\\,y,\\{abc\\},trie}', ['(x,y|\\{abc\\}|trie)']); + }); + }); + + describe('set expansion', function() { + it('should support sequence brace operators', function() { + optimize('/usr/{ucb/{ex,edit},lib/{ex,how_ex}}', ['/usr/(ucb/(ex|edit)|lib/(ex|how_ex))']); + optimize('ff{c,b,a}', ['ff(c|b|a)']); + optimize('f{d,e,f}g', ['f(d|e|f)g']); + optimize('x{{0..10},braces}y', ['x(([0-9]|10)|braces)y']); + optimize('{1..10}', ['([1-9]|10)']); + optimize('{a,b,c}', ['(a|b|c)']); + optimize('{braces,{0..10}}', ['(braces|([0-9]|10))']); + optimize('{l,n,m}xyz', ['(l|n|m)xyz']); + optimize('{{0..10},braces}', ['(([0-9]|10)|braces)']); + optimize('{{1..10..2},braces}', ['((1|3|5|7|9)|braces)']); + optimize('{{1..10},braces}', ['(([1-9]|10)|braces)']); + }); + + it('should expand multiple sets', function() { + optimize('a/{a,b}/{c,d}/e', ['a/(a|b)/(c|d)/e']); + optimize('a{b,c}d{e,f}g', ['a(b|c)d(e|f)g']); + optimize('a/{x,y}/c{d,e}f.{md,txt}', ['a/(x|y)/c(d|e)f.(md|txt)']); + }); + + it('should expand nested sets', function() { + optimize('{a,b}{{a,b},a,b}', ['(a|b)((a|b)|a|b)']); + optimize('a{b,c{d,e}f}g', ['a(b|c(d|e)f)g']); + optimize('a{{x,y},z}b', ['a((x|y)|z)b']); + optimize('f{x,y{g,z}}h', ['f(x|y(g|z))h']); + optimize('a{b,c}{d,e}/hx/z', ['a(b|c)(d|e)/hx/z']); + optimize('a{b,c{d,e},h}x/z', ['a(b|c(d|e)|h)x/z']); + optimize('a{b,c{d,e},h}x{y,z}', ['a(b|c(d|e)|h)x(y|z)']); + optimize('a{b,c{d,e},{f,g}h}x{y,z}', ['a(b|c(d|e)|(f|g)h)x(y|z)']); + optimize('a-{b{d,e}}-c', ['a-\\{b(d|e)\\}-c']); + }); + + it('should expand not modify non-brace characters', function() { + optimize('a/b/{d,e}/*.js', ['a/b/(d|e)/*.js']); + optimize('a/**/c/{d,e}/f*.js', ['a/**/c/(d|e)/f*.js']); + optimize('a/**/c/{d,e}/f*.{md,txt}', ['a/**/c/(d|e)/f*.(md|txt)']); + }); + }); + + describe('commas', function() { + it('should work with leading and trailing commas.', function() { + optimize('a{b,}c', ['a(b|)c']); + optimize('a{,b}c', ['a(|b)c']); + }); + }); + + describe('spaces', function() { + it('should handle spaces', function() { + optimize('0{1..9} {10..20}', ['0([1-9]) (1[0-9]|20)']); + optimize('a{ ,c{d, },h}x', ['a( |c(d| )|h)x']); + optimize('a{ ,c{d, },h} ', ['a( |c(d| )|h) ']); + + // see https://github.com/jonschlinkert/micromatch/issues/66 + optimize('/Users/tobiasreich/Sites/aaa/bbb/ccc 2016/src/**/[^_]*.{html,ejs}', ['/Users/tobiasreich/Sites/aaa/bbb/ccc 2016/src/**/[^_]*.(html|ejs)']); + }); + }); }); - it('nested', function() { - mm.match(['abc', '1bc', '2bc'], '{a,{1..2}}bc').should.eql(['abc', '1bc', '2bc']) - mm.match(['bc', '{1..2}bc', '{a,{1..2}}bc'], '{a,{1..2}}bc').should.eql([]); - - mm.match(['br1', 'br2', 'brab', 'bracd', 'brace'], 'br{{1..2},a{b,c{d,e}}}').should.eql(['br1', 'br2', 'brab', 'bracd', 'brace']) - mm.match(['brace1'], 'br{{1..2},a{b,c{d,e}}}').should.eql([]); + /** + * Ranges + */ + + describe('ranges', function() { + describe('escaping / invalid ranges', function() { + it('should not try to expand ranges with decimals', function() { + optimize('{1.1..2.1}', ['\\{1.1..2.1\\}']); + optimize('{1.1..~2.1}', ['\\{1.1..~2.1\\}']); + }); + + it('should escape invalid ranges:', function() { + optimize('{1..0f}', ['{1..0f}']); + optimize('{1..10..ff}', ['{1..10..ff}']); + optimize('{1..10.f}', ['{1..10.f}']); + optimize('{1..10f}', ['{1..10f}']); + optimize('{1..20..2f}', ['{1..20..2f}']); + optimize('{1..20..f2}', ['{1..20..f2}']); + optimize('{1..2f..2}', ['{1..2f..2}']); + optimize('{1..ff..2}', ['{1..ff..2}']); + optimize('{1..ff}', ['{1..ff}']); + optimize('{1..f}', ['([1-f])']); + optimize('{1.20..2}', ['{1.20..2}']); + }); + + it('weirdly-formed brace expansions -- fixed in post-bash-3.1', function() { + optimize('a-{b{d,e}}-c', ['a-\\{b(d|e)\\}-c']); + optimize('a-{bdef-{g,i}-c', ['a-\\{bdef-(g|i)-c']); + }); + + it('should not expand quoted strings.', function() { + optimize('{"klklkl"}{1,2,3}', ['\\{klklkl\\}(1|2|3)']); + optimize('{"x,x"}', ['\\{x,x\\}']); + }); + + it('should escaped outer braces in nested non-sets', function() { + optimize('{a-{b,c,d}}', ['{a-(b|c|d)}']); + optimize('{a,{a-{b,c,d}}}', ['(a|{a-(b|c|d)})']); + }); + + it('should escape imbalanced braces', function() { + optimize('a-{bdef-{g,i}-c', ['a-\\{bdef-(g|i)-c']); + optimize('abc{', ['abc\\{']); + optimize('{abc{', ['\\{abc\\{']); + optimize('{abc', ['\\{abc']); + optimize('}abc', ['\\}abc']); + optimize('ab{c', ['ab\\{c']); + optimize('{{a,b}', ['\\{(a|b)']); + optimize('{a,b}}', ['(a|b)\\}']); + optimize('abcd{efgh', ['abcd\\{efgh']); + optimize('a{b{c{d,e}f}g}h', ['a(b(c(d|e)f)g)h']); + optimize('f{x,y{{g,z}}h}', ['f(x|y((g|z))h)']); + optimize('z{a,b},c}d', ['z(a|b),c\\}d']); + optimize('a{b{c{d,e}f{x,y{{g}h', ['a\\{b\\{c(d|e)f\\{x,y\\{\\{g\\}h']); + optimize('f{x,y{{g}h', ['f\\{x,y\\{\\{g\\}h']); + optimize('f{x,y{{g}}h', ['f{x,y{{g}}h']); + optimize('a{b{c{d,e}f{x,y{}g}h', ['a{b{c(d|e)f(x|y{}g)h']); + optimize('f{x,y{}g}h', ['f(x|y\\{\\}g)h']); + optimize('z{a,b{,c}d', ['z\\{a,b(|c)d']); + }); + }); + + describe('positive numeric ranges', function() { + it('should expand numeric ranges', function() { + optimize('a{0..3}d', ['a([0-3])d']); + optimize('x{10..1}y', ['x([1-9]|10)y']); + optimize('x{3..3}y', ['x3y']); + optimize('{1..10}', ['([1-9]|10)']); + optimize('{1..3}', ['([1-3])']); + optimize('{1..9}', ['([1-9])']); + optimize('{10..1}', ['([1-9]|10)']); + optimize('{10..1}y', ['([1-9]|10)y']); + optimize('{3..3}', ['3']); + optimize('{5..8}', ['([5-8])']); + }); + }); + + describe('negative ranges', function() { + it('should expand ranges with negative numbers', function() { + optimize('{-1..-10}', ['(-[1-9]|-10)']); + optimize('{-10..-1}', ['(-[1-9]|-10)']); + optimize('{-20..0}', ['(-[1-9]|-1[0-9]|-20|0)']); + optimize('{0..-5}', ['(-[1-5]|0)']); + optimize('{9..-4}', ['(-[1-4]|[0-9])']); + }); + }); + + describe('alphabetical ranges', function() { + it('should expand alphabetical ranges', function() { + optimize('0{1..9}/{10..20}', ['0([1-9])/(1[0-9]|20)']); + optimize('0{a..d}0', ['0([a-d])0']); + optimize('a/{b..d}/e', ['a/([b-d])/e']); + optimize('{1..f}', ['([1-f])']); + optimize('{a..A}', ['([A-a])']); + optimize('{A..a}', ['([A-a])']); + optimize('{a..e}', ['([a-e])']); + optimize('{A..E}', ['([A-E])']); + optimize('{a..f}', ['([a-f])']); + optimize('{a..z}', ['([a-z])']); + optimize('{E..A}', ['([A-E])']); + optimize('{f..1}', ['([1-f])']); + optimize('{f..a}', ['([a-f])']); + optimize('{f..f}', ['f']); + }); + + it('should expand multiple ranges:', function() { + optimize('a/{b..d}/e/{f..h}', ['a/([b-d])/e/([f-h])']); + }); + }); + + describe('combo', function() { + it('should expand numerical ranges - positive and negative', function() { + optimize('{-10..10}', ['(-[1-9]|-?10|[0-9])']); + }); + }); + + // HEADS UP! If you're using the `--mm` flag minimatch freezes on these + describe('large numbers', function() { + it('should expand large numbers', function() { + optimize('{2147483645..2147483649}', ['(214748364[5-9])']); + optimize('{214748364..2147483649}', ['(21474836[4-9]|2147483[7-9][0-9]|214748[4-9][0-9]{2}|214749[0-9]{3}|2147[5-9][0-9]{4}|214[8-9][0-9]{5}|21[5-9][0-9]{6}|2[2-9][0-9]{7}|[3-9][0-9]{8}|1[0-9]{9}|20[0-9]{8}|21[0-3][0-9]{7}|214[0-6][0-9]{6}|2147[0-3][0-9]{5}|21474[0-7][0-9]{4}|214748[0-2][0-9]{3}|2147483[0-5][0-9]{2}|21474836[0-4][0-9])']); + }); + }); + + describe('steps > positive ranges', function() { + it('should expand ranges using steps:', function() { + optimize('{1..10..1}', ['([1-9]|10)']); + optimize('{1..10..2}', ['(1|3|5|7|9)']); + optimize('{1..20..20}', ['1']); + optimize('{1..20..20}', ['1']); + optimize('{1..20..20}', ['1']); + optimize('{1..20..2}', ['(1|3|5|7|9|11|13|15|17|19)']); + optimize('{10..0..2}', ['(10|8|6|4|2|0)']); + optimize('{10..1..2}', ['(10|8|6|4|2)']); + optimize('{100..0..5}', ['(100|95|90|85|80|75|70|65|60|55|50|45|40|35|30|25|20|15|10|5|0)']); + optimize('{2..10..1}', ['([2-9]|10)']); + optimize('{2..10..2}', ['(2|4|6|8|10)']); + optimize('{2..10..3}', ['(2|5|8)']); + optimize('{a..z..2}', ['(a|c|e|g|i|k|m|o|q|s|u|w|y)']); + }); + + it('should expand positive ranges with negative steps:', function() { + optimize('{10..0..-2}', ['(10|8|6|4|2|0)']); + }); + }); + + describe('steps > negative ranges', function() { + it('should expand negative ranges using steps:', function() { + optimize('{-1..-10..-2}', ['(-(1|3|5|7|9))']); + optimize('{-1..-10..2}', ['(-(1|3|5|7|9))']); + optimize('{-10..-2..2}', ['(-(10|8|6|4|2))']); + optimize('{-2..-10..1}', ['(-[2-9]|-10)']); + optimize('{-2..-10..2}', ['(-(2|4|6|8|10))']); + optimize('{-2..-10..3}', ['(-(2|5|8))']); + optimize('{-50..-0..5}', ['(0|-(50|45|40|35|30|25|20|15|10|5))']); + optimize('{-9..9..3}', ['(0|3|6|9|-(9|6|3))']); + optimize('{10..1..-2}', ['(10|8|6|4|2)']); + optimize('{100..0..-5}', ['(100|95|90|85|80|75|70|65|60|55|50|45|40|35|30|25|20|15|10|5|0)']); + }); + }); + + describe('steps > alphabetical ranges', function() { + it('should expand alpha ranges with steps', function() { + optimize('{a..e..2}', ['(a|c|e)']); + optimize('{E..A..2}', ['(E|C|A)']); + optimize('{a..z}', ['([a-z])']); + optimize('{a..z..2}', ['(a|c|e|g|i|k|m|o|q|s|u|w|y)']); + optimize('{z..a..-2}', ['(z|x|v|t|r|p|n|l|j|h|f|d|b)']); + }); + + it('should expand alpha ranges with negative steps', function() { + optimize('{z..a..-2}', ['(z|x|v|t|r|p|n|l|j|h|f|d|b)']); + }); + }); + + describe('padding', function() { + it('unwanted zero-padding -- fixed post-bash-4.0', function() { + optimize('{10..0..2}', ['(10|8|6|4|2|0)']); + optimize('{10..0..-2}', ['(10|8|6|4|2|0)']); + optimize('{-50..-0..5}', ['(0|-(50|45|40|35|30|25|20|15|10|5))']); + }); + }); }); - it('escape', function() { - mm.match(['a','b}'], '{a,b\\}}').should.eql([]) - mm.match(['b'], '{a,b\\}}').should.eql([]); - - mm.match(['a,b','c'], '{a\\,b,c}').should.eql(['a,b','c']) - mm.match(['a', 'b'], '{a\\,b,c}').should.eql([]); - - mm.match(['*','a'], '{\\*,a}').should.eql(['*','a']) - mm.match(['xx'], '{\\*,a}').should.eql([]); - }); - - it('invalid', function() { - mm.match(['a'], '{a}').should.eql(['a']) - mm.match(['{a}'], '{a}').should.eql([]) - mm.match(['a'], '{a}').should.eql(['a']); - - mm.match(['{a,b'], '{a,b').should.eql(['{a,b']); - mm.match(['a', 'b'], '{a,b').should.eql([]); - - mm.match(['{a,b}'], '{a,b\\}').should.eql(['{a,b}']) - mm.match(['a', 'b}', '{a,b\\}'], '{a,b\\}').should.eql([]); - - mm.match(['a', '{b}'], '{a,{b}}').should.eql(['a']) - mm.match(['a', '{b}'], '{a,\\{b\\}}').should.eql(['a', '{b}']) - mm.match(['{a,{b}}', 'b'], '{a,{b}}').should.eql(['b']); - - mm.match(['a}', '{b}'], '{a,\\{b}}').should.eql(['a}', '{b}']) - mm.match(['a'], '{a,\\{b}}').should.eql([]); - - mm.match(['{a,b', '{a,c'], '{a,{b,c}').should.eql(['{a,b', '{a,c']); - mm.match(['a', '{b', '{b,c'], '{a,{b,c}').should.eql([]); - - mm.match(['{a..C}'], '{a..C}').should.eql([]); - mm.match(['a', 'C'], '{a..C}').should.eql(['a', 'C']); - - mm.match(['{a..1}'], '{a..1}').should.eql(['{a..1}']); - mm.match(['a', '1'], '{a..1}').should.eql([]); - - mm.match(['{1.1..2.1}'], '{1.1..2.1}').should.eql(['{1.1..2.1}']); - mm.match(['1.1', '2.1'], '{1.1..2.1}').should.eql([]); - - mm.match(['{1..2..1..2}'], '{1..2..1..2}').should.eql([]); - mm.match(['1', '2'], '{1.1..2.1}').should.eql([]); - - mm.match(['{a..b..a}'], '{a..b..a}').should.eql([]); - mm.match(['a', 'b'], '{1.1..2.1}').should.eql([]); + describe('integration', function() { + it('should work with dots in file paths', function() { + optimize('../{1..3}/../foo', ['../([1-3])/../foo']); + optimize('../{2..10..2}/../foo', ['../(2|4|6|8|10)/../foo']); + optimize('../{1..3}/../{a,b,c}/foo', ['../([1-3])/../(a|b|c)/foo']); + optimize('./{a..z..3}/', ['./(a|d|g|j|m|p|s|v|y)/']); + optimize('./{"x,y"}/{a..z..3}/', ['./\\{x,y\\}/(a|d|g|j|m|p|s|v|y)/']); + }); + + it('should expand a complex combination of ranges and sets:', function() { + optimize('a/{x,y}/{1..5}c{d,e}f.{md,txt}', ['a/(x|y)/([1-5])c(d|e)f.(md|txt)']); + }); + + it('should expand complex sets and ranges in `bash` mode:', function() { + optimize('a/{x,{1..5},y}/c{d}e', ['a/(x|([1-5])|y)/c\\{d\\}e']); + }); }); }); diff --git a/test/brackets.js b/test/brackets.js new file mode 100644 index 00000000..36b9fc21 --- /dev/null +++ b/test/brackets.js @@ -0,0 +1,299 @@ +'use strict'; + +var assert = require('assert'); +var mm = require('./support/match'); + +function create(pattern, options) { + return mm.create(pattern, options).map(function(obj) { + return obj.output; + }).join('|'); +} + +describe('brackets', function() { + describe('main export', function() { + it('should create the equivalent regex character classes for POSIX expressions:', function() { + assert.equal(create('foo[[:lower:]]bar'), 'foo[a-z]bar'); + assert.equal(create('foo[[:lower:][:upper:]]bar'), 'foo[a-zA-Z]bar'); + assert.equal(create('[[:alpha:]123]'), '[a-zA-Z123]'); + assert.equal(create('[[:lower:]]'), '[a-z]'); + assert.equal(create('[![:lower:]]'), '[^a-z]'); + assert.equal(create('[[:digit:][:upper:][:space:]]'), '[0-9A-Z \\t\\r\\n\\v\\f]'); + assert.equal(create('[[:xdigit:]]'), '[A-Fa-f0-9]'); + assert.equal(create('[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]'), '[a-zA-Z0-9a-zA-Z \\t\\x00-\\x1F\\x7F0-9\\x21-\\x7Ea-z\\x20-\\x7E \\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~ \\t\\r\\n\\v\\fA-ZA-Fa-f0-9]'); + assert.equal(create('[^[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]'), '[^a-zA-Z0-9a-zA-Z \\t\\x00-\\x1F\\x7F0-9a-z \\t\\r\\n\\v\\fA-ZA-Fa-f0-9]'); + assert.equal(create('[a-c[:digit:]x-z]'), '[a-c0-9x-z]'); + assert.equal(create('[_[:alpha:]][_[:alnum:]][_[:alnum:]]*', {bash: false}), '[_a-zA-Z][_a-zA-Z0-9][_a-zA-Z0-9]*?(\\/|$)', []); + assert.equal(create('[_[:alpha:]][_[:alnum:]][_[:alnum:]]*'), '[_a-zA-Z][_a-zA-Z0-9][_a-zA-Z0-9][^/]*?(\\/|$)', []); + }); + }); + + describe('.match', function() { + it('should support POSIX.2 character classes', function() { + mm(['e'], '[[:xdigit:]]', [ 'e' ]); + mm(['a', '1', '5', 'A'], '[[:alpha:]123]', [ '1', 'a', 'A' ]); + mm(['9', 'A', 'b'], '[![:alpha:]]', ['9']); + mm(['9', 'A', 'b'], '[^[:alpha:]]', ['9']); + mm(['9', 'a', 'B'], '[[:digit:]]', ['9']); + mm(['a', 'b', 'A'], '[:alpha:]', ['a'], 'not a valid posix bracket, but valid char class'); + mm(['a', 'b', 'A'], '[[:alpha:]]', [ 'a', 'A', 'b' ]); + mm(['a', 'aa', 'aB', 'a7'], '[[:lower:][:lower:]]', ['a']); + mm(['a', '7', 'aa', 'aB', 'a7'], '[[:lower:][:digit:]]', [ '7', 'a' ]); + }); + + it('should match word characters', function() { + var fixtures = ['a c', 'a1c', 'a123c', 'a.c', 'a.xy.zc', 'a.zc', 'abbbbc', 'abbbc', 'abbc', 'abc', 'abq', 'axy zc', 'axy', 'axy.zc', 'axyzc']; + mm(fixtures, 'a[a-z]+c', ['abbbbc', 'abbbc', 'abbc', 'abc', 'axyzc']); + }); + + it('should match literal brackets', function() { + mm(['a [b]'], 'a \\[b\\]', ['a [b]']); + mm(['a [b] c'], 'a [b] c', ['a [b] c']); + mm(['a [b]'], 'a \\[b\\]*', ['a [b]']); + mm(['a [bc]'], 'a \\[bc\\]*', ['a [bc]']); + mm(['a [b]', 'a [b].js'], 'a \\[b\\].*', ['a [b].js']); + }); + + it('should match character classes', function() { + mm(['abc', 'abd'], 'a[bc]d', ['abd']); + }); + + it('should match character class alphabetical ranges', function() { + mm(['abc', 'abd', 'ace', 'ac', 'a-'], 'a[b-d]e', ['ace']); + mm(['abc', 'abd', 'ace', 'ac', 'a-'], 'a[b-d]', ['ac']); + }); + + it('should match character classes with leading dashes', function() { + mm(['abc', 'abd', 'ace', 'ac', 'a-'], 'a[-c]', ['a-', 'ac']); + }); + + it('should match character classes with trailing dashes', function() { + mm(['abc', 'abd', 'ace', 'ac', 'a-'], 'a[c-]', ['a-', 'ac']); + }); + + it('should match bracket literals', function() { + mm(['a]c', 'abd', 'ace', 'ac', 'a-'], 'a[]]c', ['a]c']); + }); + + it('should match bracket literals', function() { + mm(['a]', 'abd', 'ace', 'ac', 'a-'], 'a]', ['a]']); + }); + + it('should negation patterns', function() { + mm(['a]', 'acd', 'aed', 'ac', 'a-'], 'a[^bc]d', ['aed']); + }); + + it('should match negated dashes', function() { + mm(['adc', 'a-c'], 'a[^-b]c', ['adc']); + }); + + it('should match negated brackets', function() { + mm(['adc', 'a]c'], 'a[^]b]c', ['adc']); + }); + + it('should match alpha-numeric characters', function() { + mm(['01234', '0123e456', '0123e45g78'], '[\\de]+', ['01234', '0123e456']); + mm(['01234', '0123e456', '0123e45g78'], '[\\de]*', ['01234', '0123e456'], {bash: false}); + mm(['01234', '0123e456', '0123e45g78'], '[\\de]*', ['01234', '0123e456', '0123e45g78']); + mm(['01234', '0123e456', '0123e45g78'], '[e\\d]+', ['01234', '0123e456']); + }); + + it('should not create an invalid posix character class:', function() { + assert.equal(create('[:al:]'), '[:al:]'); + assert.equal(create('[abc[:punct:][0-9]'), '[abc\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~\\[0-9]'); + }); + + it('should return `true` when the pattern matches:', function() { + assert(mm.isMatch('a', '[[:lower:]]')); + assert(mm.isMatch('A', '[[:upper:]]')); + assert(mm.isMatch('A', '[[:digit:][:upper:][:space:]]')); + assert(mm.isMatch('1', '[[:digit:][:upper:][:space:]]')); + assert(mm.isMatch(' ', '[[:digit:][:upper:][:space:]]')); + assert(mm.isMatch('5', '[[:xdigit:]]')); + assert(mm.isMatch('f', '[[:xdigit:]]')); + assert(mm.isMatch('D', '[[:xdigit:]]')); + assert(mm.isMatch('_', '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]')); + assert(mm.isMatch('_', '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:graph:][:lower:][:print:][:punct:][:space:][:upper:][:xdigit:]]')); + assert(mm.isMatch('.', '[^[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]')); + assert(mm.isMatch('5', '[a-c[:digit:]x-z]')); + assert(mm.isMatch('b', '[a-c[:digit:]x-z]')); + assert(mm.isMatch('y', '[a-c[:digit:]x-z]')); + }); + + it('should return `false` when the pattern does not match:', function() { + assert(!mm.isMatch('A', '[[:lower:]]')); + assert(mm.isMatch('A', '[![:lower:]]')); + assert(!mm.isMatch('a', '[[:upper:]]')); + assert(!mm.isMatch('a', '[[:digit:][:upper:][:space:]]')); + assert(!mm.isMatch('.', '[[:digit:][:upper:][:space:]]')); + assert(!mm.isMatch('.', '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]')); + assert(!mm.isMatch('q', '[a-c[:digit:]x-z]')); + }); + }); + + describe('.makeRe()', function() { + it('should make a regular expression for the given pattern:', function() { + assert.deepEqual(mm.makeRe('[[:alpha:]123]'), /^(?:[a-zA-Z123])$/); + assert.deepEqual(mm.makeRe('[![:lower:]]'), /^(?:[^a-z])$/); + }); + }); + + describe('.mm()', function() { + it('should return an array of matching strings:', function() { + mm(['a1B', 'a1b'], '[[:alpha:]][[:digit:]][[:upper:]]', ['a1B']); + mm(['.', 'a', '!'], '[[:digit:][:punct:][:space:]]', ['.', '!']); + }); + }); + + describe('POSIX: From the test suite for the POSIX.2 (BRE) pattern matching code:', function() { + it('First, test POSIX.2 character classes', function() { + assert(mm.isMatch('e', '[[:xdigit:]]')); + assert(mm.isMatch('1', '[[:xdigit:]]')); + assert(mm.isMatch('a', '[[:alpha:]123]')); + assert(mm.isMatch('1', '[[:alpha:]123]')); + }); + + it('should match using POSIX.2 negation patterns', function() { + assert(mm.isMatch('9', '[![:alpha:]]')); + assert(mm.isMatch('9', '[^[:alpha:]]')); + }); + + it('should match word characters', function() { + assert(mm.isMatch('A', '[[:word:]]')); + assert(mm.isMatch('B', '[[:word:]]')); + assert(mm.isMatch('a', '[[:word:]]')); + assert(mm.isMatch('b', '[[:word:]]')); + }); + + it('should match digits with word class', function() { + assert(mm.isMatch('1', '[[:word:]]')); + assert(mm.isMatch('2', '[[:word:]]')); + }); + + it('should not digits', function() { + assert(mm.isMatch('1', '[[:digit:]]')); + assert(mm.isMatch('2', '[[:digit:]]')); + }); + + it('should not match word characters with digit class', function() { + assert(!mm.isMatch('a', '[[:digit:]]')); + assert(!mm.isMatch('A', '[[:digit:]]')); + }); + + it('should match uppercase alpha characters', function() { + assert(mm.isMatch('A', '[[:upper:]]')); + assert(mm.isMatch('B', '[[:upper:]]')); + }); + + it('should not match lowercase alpha characters', function() { + assert(!mm.isMatch('a', '[[:upper:]]')); + assert(!mm.isMatch('b', '[[:upper:]]')); + }); + + it('should not match digits with upper class', function() { + assert(!mm.isMatch('1', '[[:upper:]]')); + assert(!mm.isMatch('2', '[[:upper:]]')); + }); + + it('should match lowercase alpha characters', function() { + assert(mm.isMatch('a', '[[:lower:]]')); + assert(mm.isMatch('b', '[[:lower:]]')); + }); + + it('should not match uppercase alpha characters', function() { + assert(!mm.isMatch('A', '[[:lower:]]')); + assert(!mm.isMatch('B', '[[:lower:]]')); + }); + + it('should match one lower and one upper character', function() { + assert(mm.isMatch('aA', '[[:lower:]][[:upper:]]')); + assert(!mm.isMatch('AA', '[[:lower:]][[:upper:]]')); + assert(!mm.isMatch('Aa', '[[:lower:]][[:upper:]]')); + }); + + it('should match hexidecimal digits', function() { + assert(mm.isMatch('ababab', '[[:xdigit:]]*')); + assert(mm.isMatch('020202', '[[:xdigit:]]*')); + assert(mm.isMatch('900', '[[:xdigit:]]*')); + }); + + it('should match punctuation characters (\\-!"#$%&\'()\\*+,./:;<=>?@[\\]^_`{|}~)', function() { + assert(mm.isMatch('!', '[[:punct:]]')); + assert(mm.isMatch('?', '[[:punct:]]')); + assert(mm.isMatch('#', '[[:punct:]]')); + assert(mm.isMatch('&', '[[:punct:]]')); + assert(mm.isMatch('@', '[[:punct:]]')); + assert(mm.isMatch('+', '[[:punct:]]')); + assert(mm.isMatch('*', '[[:punct:]]')); + assert(mm.isMatch(':', '[[:punct:]]')); + assert(mm.isMatch('=', '[[:punct:]]')); + assert(mm.isMatch('|', '[[:punct:]]')); + assert(mm.isMatch('|++', '[[:punct:]]*')); + }); + + it('should only match one character', function() { + assert(!mm.isMatch('?*+', '[[:punct:]]')); + }); + + it('should only match one or more characters', function() { + assert(mm.isMatch('?*+', '[[:punct:]]*')); + assert(mm.isMatch('*', '[[:punct:]]*')); + assert(mm.isMatch('+', '[[:punct:]]*')); + assert(mm.isMatch('?', '[[:punct:]]*')); + assert(mm.isMatch('?abc', '[[:punct:]]*')); + assert(mm.isMatch('*abc', '[[:punct:]]*')); + assert(mm.isMatch('+abc', '[[:punct:]]*')); + assert(!mm.isMatch('abc+abc', '[[:punct:]]*')); + assert(!mm.isMatch('', '[[:punct:]]*')); + }); + + it('invalid character class expressions are just characters to be matched', function() { + mm(['a'], '[:al:]', ['a']); + mm(['a'], '[[:al:]', ['a']); + mm(['!'], '[abc[:punct:][0-9]', ['!']); + }); + + it('should match the start of a valid sh identifier', function() { + assert(mm.isMatch('PATH', '[_[:alpha:]]*')); + }); + + it('should match the first two characters of a valid sh identifier', function() { + assert(mm.isMatch('PATH', '[_[:alpha:]][_[:alnum:]]*')); + }); + + /** + * Some of these tests (and their descriptions) were ported directly + * from the Bash 4.3 unit tests. + */ + + it('how about A?', function() { + mm(['9'], '[[:digit:]]', ['9']); + mm(['X'], '[[:digit:]]', []); + mm(['aB'], '[[:lower:]][[:upper:]]', ['aB']); + mm(['a', '3', 'aa', 'a3', 'abc'], '[[:alpha:][:digit:]]', ['3', 'a']); + mm(['a', 'b'], '[[:alpha:]\\]', [], []); + }); + + it('OK, what\'s a tab? is it a blank? a space?', function() { + assert(mm.isMatch('\t', '[[:blank:]]')); + assert(mm.isMatch('\t', '[[:space:]]')); + assert(mm.isMatch(' ', '[[:space:]]')); + }); + + it('let\'s check out characters in the ASCII range', function() { + assert(!mm.isMatch('\\377', '[[:ascii:]]')); + assert(!mm.isMatch('9', '[1[:alpha:]123]')); + }); + + it('punctuation', function() { + assert(!mm.isMatch(' ', '[[:punct:]]')); + }); + + it('graph', function() { + assert(mm.isMatch('A', '[[:graph:]]')); + assert(!mm.isMatch('\b', '[[:graph:]]')); + assert(!mm.isMatch('\n', '[[:graph:]]')); + assert(mm.isMatch('\s', '[[:graph:]]')); + }); + }); +}); + diff --git a/test/character-classes.js b/test/character-classes.js deleted file mode 100644 index 2ed19298..00000000 --- a/test/character-classes.js +++ /dev/null @@ -1,27 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -var path = require('path'); -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = ref.minimatch; -} - -describe('character classes', function() { - it('should match character classes:', function() { - mm.match(['ab', 'a', 'bb'], '[ab][ab]').should.eql(['ab', 'bb']); - mm.match(['abc', 'abd', 'abe', 'ab', 'ac'], '[a-c]b*').should.eql(['abc', 'abd', 'abe', 'ab']); - mm.match(['abc', 'abd', 'abe', 'aa', 'ab', 'ac'], '[a-j]*[^c]').should.eql(['abd', 'abe', 'aa', 'ab']); - mm.match(['abc', 'abd', 'abe'], 'a*[^c]').should.eql(['abd', 'abe']); - }); -}); diff --git a/test/comparison.isMatch.js b/test/comparison.isMatch.js new file mode 100644 index 00000000..98bd2921 --- /dev/null +++ b/test/comparison.isMatch.js @@ -0,0 +1,94 @@ +'use strict'; + +var isTravis = process.env.CI || process.env.TRAVIS; +var assert = require('assert'); +var isWindows = require('is-windows'); +var mi = require('./support/matcher'); + +var fixtures = require('./_fixtures'); +var patterns = require('./_patterns'); + +describe('.isMatch', function() { + if (isWindows() || isTravis) { + console.log('these tests use bash to test for bash parity. since bash does not work on most versions of windows, these tests are skipped on windows'); + return; + } + + patterns.forEach(function(pattern) { + // if (pattern.slice(0, 3) !== '!**') return; + // if (pattern.slice(0, 3) !== '!**') return; + + fixtures.forEach(function(fixture) { + // if (fixture !== '!a/b/c') return; + + it('should match ' + fixture + ' with ' + pattern, function() { + var miRes = mi.isMatch(fixture, pattern); + var mmRes = mi.mm.isMatch(fixture, pattern); + var actual = miRes === mmRes; + + // minimatch is wrong on these + if (actual === false) { + // tie-breaker + if (miRes === mi.mm.makeRe(pattern).test(fixture)) { + actual = true; + } else if (/^\?/.test(pattern)) { + actual = true; + } else if (!isWindows() && !isTravis) { + actual = miRes === mi.bash.isMatch(fixture, pattern); + } else { + this.skip(); + return; + } + } + + assert(actual, fixture + ' ' + pattern); + }); + + it('should match ' + fixture + ' with ' + pattern + ' and {dot: true}', function() { + var miRes = mi.isMatch(fixture, pattern, {dot: true}); + var mmRes = mi.mm.isMatch(fixture, pattern, {dot: true}); + var actual = miRes === mmRes; + + // minimatch is wrong on these + if (actual === false) { + // tie-breaker (minimatch is inconsistent with regex and methods) + if (miRes === mi.mm.makeRe(pattern, {dot: true}).test(fixture)) { + actual = true; + } else if (/^\?/.test(pattern) || /^\.\//.test(fixture)) { + actual = true; + } else if (!isWindows() && !isTravis) { + actual = miRes === mi.bash.isMatch(fixture, pattern, {dot: true}); + } else { + this.skip(); + return; + } + } + + assert(actual, fixture + ' ' + pattern); + }); + + it('should match ' + fixture + ' with ' + pattern + ' and {nonegate: true}', function() { + var miRes = mi.isMatch(fixture, pattern, {nonegate: true}); + var mmRes = mi.mm.isMatch(fixture, pattern, {nonegate: true}); + var actual = miRes === mmRes; + + // minimatch is wrong on these + if (actual === false) { + // tie-breaker + if (miRes === mi.mm.makeRe(pattern, {nonegate: true}).test(fixture)) { + actual = true; + } else if (/^\?/.test(pattern) || /^\!/.test(fixture)) { + actual = true; + } else if (!isWindows() && !isTravis) { + actual = miRes === mi.bash.isMatch(fixture, pattern); + } else { + this.skip(); + return; + } + } + + assert(actual, fixture + ' ' + pattern); + }); + }); + }); +}); diff --git a/test/comparison.makeRe.js b/test/comparison.makeRe.js new file mode 100644 index 00000000..4be3004f --- /dev/null +++ b/test/comparison.makeRe.js @@ -0,0 +1,93 @@ +'use strict'; + +var isTravis = process.env.CI || process.env.TRAVIS; +var isWindows = require('is-windows'); +var assert = require('assert'); +var bash = require('bash-match'); +var mm = require('minimatch'); +var mi = require('./support/matcher'); + +var fixtures = require('./_fixtures'); +var patterns = require('./_patterns'); + +describe('.makeRe', function() { + if (isWindows() || isTravis) { + console.log('these tests use bash to test for bash parity. since bash does not work on most versions of windows, these tests are skipped on windows'); + return; + } + + patterns.forEach(function(pattern) { + // if (pattern !== 'a/b/c/**/*.js') return; + + fixtures.forEach(function(fixture) { + // if (fixture !== 'a/b/c/z.js') return; + + it('should match ' + fixture + ' with ' + pattern, function() { + var mmRes = mm.makeRe(pattern).test(fixture); + var miRes = mi.makeRe(pattern).test(fixture); + var actual = miRes === mmRes; + + // minimatch is wrong on these + if (actual === false) { + // tie-breaker + if (miRes === mm(fixture, pattern) || /^\?/.test(pattern)) { + actual = true; + } else if (!isWindows() && !isTravis) { + actual = miRes === mi.bash.isMatch(fixture, pattern); + } else { + this.skip(); + return; + } + } + + assert(actual, fixture + ' ' + pattern); + }); + + it('should match ' + fixture + ' with ' + pattern + ' and {dot: true}', function() { + var mmRes = mm.makeRe(pattern, {dot: true}).test(fixture); + var miRes = mi.makeRe(pattern, {dot: true}).test(fixture); + var actual = miRes === mmRes; + + // minimatch is wrong on these + if (actual === false) { + // tie-breaker + if (miRes === mm(fixture, pattern, {dot: true})) { + actual = true; + } else if (/^\?/.test(pattern) || /^\.\//.test(fixture)) { + actual = true; + } else if (!isWindows() && !isTravis) { + actual = miRes === mi.bash.isMatch(fixture, pattern, {dot: true}); + } else { + this.skip(); + return; + } + } + + assert(actual, fixture + ' ' + pattern); + }); + + it('should match ' + fixture + ' with ' + pattern + ' and {nonegate: true}', function() { + var mmRes = mm.makeRe(pattern, {nonegate: true}).test(fixture); + var miRes = mi.makeRe(pattern, {nonegate: true}).test(fixture); + var actual = miRes === mmRes; + + // minimatch is wrong on these + if (actual === false) { + // tie-breaker + if (miRes === mm(fixture, pattern, {nonegate: true})) { + actual = true; + } else if (/^\?/.test(pattern) || /^\!/.test(fixture)) { + actual = true; + } else if (!isWindows() && !isTravis) { + actual = miRes === mi.bash.isMatch(fixture, pattern, {nonegate: true}); + } else { + this.skip(); + return; + } + } + + assert(actual, fixture + ' ' + pattern); + }); + }); + }); +}); diff --git a/test/contains.js b/test/contains.js deleted file mode 100644 index 62f09a57..00000000 --- a/test/contains.js +++ /dev/null @@ -1,200 +0,0 @@ -'use strict'; - -require('should'); -var mm = require('..'); - -describe('.contains()', function() { - describe('errors:', function() { - it('should throw on undefined args:', function() { - (function() { - mm.contains(); - }).should.throw('micromatch.contains(): pattern should be a string.'); - }); - - it('should throw on bad args:', function() { - (function() { - mm.contains({}); - }).should.throw('micromatch.contains(): pattern should be a string.'); - }); - }); - - it('should correctly deal with empty patterns', function() { - mm.contains('ab', '').should.be.false(); - mm.contains('a', '').should.be.false(); - mm.contains('.', '').should.be.false(); - }); - - it('should return true when the path contains the pattern', function() { - mm.contains('ab', 'b').should.be.true(); - mm.contains('.', '.').should.be.true(); - mm.contains('a/b/c', 'a/b').should.be.true(); - mm.contains('/ab', '/a').should.be.true(); - mm.contains('a', 'a').should.be.true(); - mm.contains('ab', 'a').should.be.true(); - mm.contains('ab', 'ab').should.be.true(); - mm.contains('abcd', 'd').should.be.true(); - mm.contains('abcd', 'c').should.be.true(); - mm.contains('abcd', 'cd').should.be.true(); - mm.contains('abcd', 'bc').should.be.true(); - mm.contains('abcd', 'ab').should.be.true(); - }); - - it('should match with common glob patterns', function() { - mm.contains('a/b/c', 'a/*').should.be.true(); - mm.contains('/ab', '/a').should.be.true(); - mm.contains('/ab', '/*').should.be.true(); - mm.contains('/cd', '/*').should.be.true(); - mm.contains('ab', '*').should.be.true(); - mm.contains('ab', 'ab').should.be.true(); - mm.contains('/ab', '*/a').should.be.true(); - mm.contains('/ab', '*/').should.be.true(); - mm.contains('/ab', '*/*').should.be.true(); - mm.contains('/ab', '/').should.be.true(); - mm.contains('/ab', '/??').should.be.true(); - mm.contains('/ab', '/?b').should.be.true(); - mm.contains('/ab', '/?').should.be.true(); - mm.contains('a/b', '?/?').should.be.true(); - }); - - it('should return false when the path does not contain the pattern', function() { - mm.contains('/ab', '?/?').should.be.false(); - mm.contains('ab', '*/*').should.be.false(); - mm.contains('abcd', 'f').should.be.false(); - mm.contains('ab', 'c').should.be.false(); - mm.contains('ab', '/a').should.be.false(); - mm.contains('/ab', 'a/*').should.be.false(); - mm.contains('ef', '/*').should.be.false(); - mm.contains('ab', './*').should.be.false(); - }); - - it('should match files that contain the given extension:', function() { - mm.contains('.md', '.m').should.be.true(); - mm.contains('.c.md', '.*.md').should.be.true(); - mm.contains('c.md', '*.md').should.be.true(); - mm.contains('a/b/c.md', '.md').should.be.true(); - mm.contains('a/b/c.md', 'a/*/*.md').should.be.true(); - mm.contains('a/b/c.md', '**/*.md').should.be.true(); - mm.contains('c.md', '*.md').should.be.true(); - mm.contains('.c.md', '.md').should.be.true(); - mm.contains('.c.md', '.c.').should.be.true(); - mm.contains('a/b/c.md', '*.md').should.be.true(); - mm.contains('a/b/c/c.md', '*.md').should.be.true(); - mm.contains('.c.md', '*.md').should.be.true(); - }); - - it('should not match files that do not contain the given extension:', function() { - mm.contains('.md', '*.md').should.be.false(); - mm.contains('a/b/c/c.md', 'c.js').should.be.false(); - mm.contains('a/b/c.md', 'a/*.md').should.be.false(); - }); - - it('should match dotfiles when a dot is explicitly defined in the pattern:', function() { - mm.contains('.a', '.a').should.be.true(); - mm.contains('.ab', '.*').should.be.true(); - mm.contains('.ab', '.a*').should.be.true(); - mm.contains('.abc', '.a').should.be.true(); - mm.contains('.b', '.b*').should.be.true(); - mm.contains('.md', '.md').should.be.true(); - mm.contains('.c.md', '*.md').should.be.true(); - mm.contains('a/.c.md', 'a/.c.md').should.be.true(); - mm.contains('a/b/c/.xyz.md', 'a/b/c/.*.md').should.be.true(); - mm.contains('a/.c.md', '*.md').should.be.true(); - mm.contains('a/b/c/d.a.md', 'a/b/c/*.md').should.be.true(); - }); - - it('should match dotfiles when `dot` or `dotfiles` is set:', function() { - mm.contains('a/b/c/.xyz.md', '.*.md', {dot: true}).should.be.true(); - mm.contains('.c.md', '*.md', {dot: true}).should.be.true(); - mm.contains('.c.md', '.*', {dot: true}).should.be.true(); - mm.contains('a/b/c/.xyz.md', '**/*.md', {dot: true}).should.be.true(); - mm.contains('a/b/c/.xyz.md', '**/.*.md', {dot: true}).should.be.true(); - mm.contains('a/b/c/.xyz.md', 'a/b/c/*.md', {dot: true}).should.be.true(); - mm.contains('a/b/c/.xyz.md', 'a/b/c/.*.md', {dot: true}).should.be.true(); - }); - - it('should not match dotfiles when `dot` or `dotfiles` is not set:', function() { - mm.contains('.a', '*.md').should.be.false(); - mm.contains('.ba', '.a').should.be.false(); - mm.contains('.a.md', 'a/b/c/*.md').should.be.false(); - mm.contains('.ab', '*.*').should.be.false(); - mm.contains('.md', 'a/b/c/*.md').should.be.false(); - mm.contains('.txt', '.md').should.be.false(); - mm.contains('.verb.txt', '*.md').should.be.false(); - mm.contains('a/b/d/.md', 'a/b/c/*.md').should.be.false(); - }); - - it('should match file paths:', function() { - mm.contains('a/b/c/xyz.md', 'a/b/c/*.md').should.be.true(); - mm.contains('a/bb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.contains('a/bbbb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.contains('a/bb.bb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.contains('a/bb.bb/aa/bb/aa/c/xyz.md', 'a/**/c/*.md').should.be.true(); - mm.contains('a/bb.bb/aa/b.b/aa/c/xyz.md', 'a/**/c/*.md').should.be.true(); - }); - - it('should return true when full file paths are matched:', function() { - mm.contains('a/.b', 'a/.*').should.be.true(); - mm.contains('a/.b', 'a/').should.be.true(); - mm.contains('a/b/z/.a', 'b/z').should.be.true(); - mm.contains('a/b/z/.a', 'a/*/z/.a').should.be.true(); - mm.contains('a/b/c/d/e/z/c.md', 'a/**/z/*.md').should.be.true(); - mm.contains('a/b/c/d/e/z/c.md', 'b/c/d/e').should.be.true(); - mm.contains('a/b/c/d/e/j/n/p/o/z/c.md', 'a/**/j/**/z/*.md').should.be.true(); - mm.contains('a/b/c/cd/bbb/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.true(); - mm.contains('a/b/baz/ce/fez/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.true(); - }); - - it('question marks should not match slashes:', function() { - mm.contains('aaa/bbb', 'aaa?bbb').should.be.false(); - }); - - it('should match path segments:', function() { - mm.contains('aaa', 'aaa').should.be.true(); - mm.contains('aaa', 'aa').should.be.true(); - mm.contains('aaa/bbb', 'aaa/bbb').should.be.true(); - mm.contains('aaa/bbb', 'aaa/*').should.be.true(); - mm.contains('aaa/bba/ccc', 'aaa/*').should.be.true(); - mm.contains('aaa/bba/ccc', 'aaa/**').should.be.true(); - mm.contains('aaa/bba/ccc', 'aaa*').should.be.true(); - mm.contains('aaa/bba/ccc', 'aaa**').should.be.true(); - mm.contains('aaa/bba/ccc', 'aaa/*ccc').should.be.false(); - mm.contains('aaa/bba/ccc', 'aaa/**ccc').should.be.true(); - mm.contains('aaa/bba/ccc', 'aaa/*z').should.be.false(); - mm.contains('aaa/bba/ccc', 'aaa/**z').should.be.false(); - mm.contains('aaa/bbb', 'aaa[/]bbb').should.be.true(); - mm.contains('aaa', '*/*/*').should.be.false(); - mm.contains('aaa/bbb', '*/*/*').should.be.false(); - mm.contains('aaa/bba/ccc', '*/*/*').should.be.true(); - mm.contains('aaa/bb/aa/rr', '*/*/*').should.be.true(); - mm.contains('abzzzejklhi', '*j*i').should.be.true(); - mm.contains('ab/zzz/ejkl/hi', '*/*z*/*/*i').should.be.true(); - mm.contains('ab/zzz/ejkl/hi', '*/*jk*/*i').should.be.true(); - }); - - it('should return false when full file paths are not matched:', function() { - mm.contains('a/b/z/.a', 'b/a').should.be.false(); - mm.contains('a/.b', 'a/**/z/*.md').should.be.false(); - mm.contains('a/b/z/.a', 'a/**/z/*.a').should.be.false(); - mm.contains('a/b/z/.a', 'a/*/z/*.a').should.be.false(); - mm.contains('a/b/c/j/e/z/c.txt', 'a/**/j/**/z/*.md').should.be.false(); - mm.contains('a/b/d/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.contains('a/b/c/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.false(); - }); - - it('should match paths with leading `./`:', function() { - mm.contains('./.a', 'a/**/z/*.md').should.be.false(); - mm.contains('./a/b/z/.a', 'a/**/z/.a').should.be.true(); - mm.contains('./a/b/z/.a', './a/**/z/.a').should.be.true(); - mm.contains('./a/b/c/d/e/z/c.md', 'a/**/z/*.md').should.be.true(); - mm.contains('./a/b/c/d/e/z/c.md', './a/**/z/*.md').should.be.true(); - mm.contains('./a/b/c/d/e/z/c.md', './a/**/j/**/z/*.md').should.be.false(); - mm.contains('./a/b/c/j/e/z/c.md', './a/**/j/**/z/*.md').should.be.true(); - mm.contains('./a/b/c/j/e/z/c.md', 'a/**/j/**/z/*.md').should.be.true(); - mm.contains('./a/b/c/d/e/j/n/p/o/z/c.md', './a/**/j/**/z/*.md').should.be.true(); - mm.contains('./a/b/c/j/e/z/c.txt', './a/**/j/**/z/*.md').should.be.false(); - mm.contains('./a/b/d/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.contains('./a/b/c/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.contains('./a/b/c/cd/bbb/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.true(); - mm.contains('./a/b/baz/ce/fez/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.true(); - }); -}); diff --git a/test/dotfiles.js b/test/dotfiles.js index abdebda6..690836b8 100644 --- a/test/dotfiles.js +++ b/test/dotfiles.js @@ -1,149 +1,143 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License - */ - 'use strict'; -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = ref; -} +var assert = require('assert'); +var mm = require('./support/match'); describe('dotfiles', function() { - describe('file name', function() { + describe('file name matching', function() { it('should not match a dot when the dot is not explicitly defined', function() { - mm.isMatch('.bashrc', '*bashrc').should.be.false(); - mm.isMatch('.bashrc', '[.]bashrc').should.be.false(); - mm.isMatch('.bashrc', '?bashrc').should.be.false(); + assert(!mm.isMatch('.dot', '*dot')); + assert(!mm.isMatch('a/.dot', 'a/*dot')); }); - it('should match a dot when the dot is explicitly defined', function() { - mm.isMatch('.bashrc', '.[b]ashrc').should.be.true(); - mm.isMatch('.bashrc', '.ba?hrc').should.be.true(); - mm.isMatch('.bashrc', '.bashr*').should.be.true(); + it('should not match leading dots with question marks', function() { + assert(!mm.isMatch('.dot', '?dot')); + assert(!mm.isMatch('/.dot', '/?dot')); + assert(!mm.isMatch('a/.dot', 'a/?dot')); + }); + + it('should match with double dots', function() { + var fixtures = ['a/../a', 'ab/../ac', '../a', 'a', '../../b', '../c', '../c/d']; + mm(fixtures, '../*', ['../a', '../c']); + mm(fixtures, '*/../*', ['a/../a', 'ab/../ac']); + mm(fixtures, '**/../*', ['a/../a', 'ab/../ac', '../a', '../c']); }); - }); - describe('multiple directories', function() { it('should not match a dot when the dot is not explicitly defined', function() { - mm.isMatch('/.bashrc', '/*bashrc').should.be.false(); - mm.isMatch('/.bashrc', '/?bashrc').should.be.false(); - mm.isMatch('/.bashrc', '/[.]bashrc').should.be.false(); - mm.isMatch('/.bashrc', '*/*bashrc').should.be.false(); - mm.isMatch('/.bashrc', '*/?bashrc').should.be.false(); - mm.isMatch('/.bashrc', '*/[.]bashrc').should.be.false(); - mm.isMatch('/.bashrc', '**/*bashrc').should.be.false(); - mm.isMatch('/.bashrc', '**/?bashrc').should.be.false(); - mm.isMatch('/.bashrc', '**/[.]bashrc').should.be.false(); - mm.isMatch('a/.bashrc', '*/*bashrc').should.be.false(); - mm.isMatch('a/.bashrc', '*/?bashrc').should.be.false(); - mm.isMatch('a/.bashrc', '*/[.]bashrc').should.be.false(); - mm.isMatch('a/b/.bashrc', '**/*bashrc').should.be.false(); - mm.isMatch('a/b/.bashrc', '**/?bashrc').should.be.false(); - mm.isMatch('a/b/.bashrc', '**/[.]bashrc').should.be.false(); + var fixtures = ['a/b/.x', '.x', '.x/', '.x/a', '.x/a/b', '.x/.x', 'a/.x', 'a/b/.x/c', 'a/b/.x/c/d', 'a/b/.x/c/d/e', 'a/b/.x/', 'a/.x/b', 'a/.x/b/.x/c']; + mm(fixtures, '**/.x/**', ['.x/', '.x/a', '.x/a/b', 'a/b/.x/c', 'a/b/.x/c/d', 'a/b/.x/c/d/e', 'a/b/.x/', 'a/.x/b']); }); it('should match a dot when the dot is explicitly defined', function() { - mm.isMatch('/.bashrc', '**/.[b]ashrc').should.be.true(); - mm.isMatch('/.bashrc', '**/.ba?hrc').should.be.true(); - mm.isMatch('/.bashrc', '**/.bashr*').should.be.true(); - mm.isMatch('a/.bashrc', '*/.[b]ashrc').should.be.true(); - mm.isMatch('a/.bashrc', '*/.ba?hrc').should.be.true(); - mm.isMatch('a/.bashrc', '*/.bashr*').should.be.true(); - mm.isMatch('a/b/.bashrc', '**/.[b]ashrc').should.be.true(); - mm.isMatch('a/b/.bashrc', '**/.ba?hrc').should.be.true(); - mm.isMatch('a/b/.bashrc', '**/.bashr*').should.be.true(); + // first one is from minimatch tests + var fixtures = ['a/b/.x/c', 'a/b/.x/c/d', 'a/b/.x/c/d/e', 'a/b/.x', 'a/b/.x/', 'a/.x/b', '.x', '.x/', '.x/a', '.x/a/b', 'a/.x/b/.x/c', '.x/.x']; + var expected = ['.x/', '.x/a', '.x/a/b', 'a/.x/b', 'a/b/.x/', 'a/b/.x/c', 'a/b/.x/c/d', 'a/b/.x/c/d/e']; + + mm(fixtures, '**/.x/**', expected); + mm('/.dot', '/[.]dot', ['/.dot']); + mm('.dot', '[.]dot', ['.dot']); + mm('.dot', '.[d]ot', ['.dot']); + mm('.dot', '.dot*', ['.dot']); + mm('.dot', '.d?t', ['.dot']); + + assert(!mm.isMatch('.bar.baz', '.*.*/')); + assert(!mm.isMatch('/.dot', '*/[.]dot')); + assert(mm.isMatch('.bar.baz/', '.*.*')); + assert(mm.isMatch('.bar.baz', '.*.*')); + assert(mm.isMatch('.bar.baz', '.*.baz')); + assert(mm.isMatch('.bar.baz/', '.*.*/')); + assert(mm.isMatch('.dot', '.*ot')); + assert(mm.isMatch('.dot', '.[d]ot')); + assert(mm.isMatch('.dot.foo.bar', '.*ot.*.*')); + assert(mm.isMatch('.dotfile.js', '.*.js')); + assert(mm.isMatch('/.dot', '**/.[d]ot')); + assert(mm.isMatch('/.dot', '**/.dot*')); + assert(mm.isMatch('/.dot', '**/[.]dot')); + assert(mm.isMatch('/.dot', '/[.]dot')); + assert(mm.isMatch('a/.dot', '**/.[d]ot')); + assert(mm.isMatch('a/.dot', '*/.[d]ot')); + assert(mm.isMatch('a/.dot', '*/.dot*')); + assert(mm.isMatch('a/.dot', '*/[.]dot')); + assert(mm.isMatch('a/b/.dot', '**/.[d]ot')); + assert(mm.isMatch('a/b/.dot', '**/.dot*')); + assert(mm.isMatch('a/b/.dot', '**/[.]dot')); + assert(mm.isMatch('a/b/.dot', '.dot', {matchBase: true})); + assert(mm.isMatch('a/b/.dot', '[.]dot', {matchBase: true})); + }); + }); + + describe('multiple directories', function() { + it('should not match a dot when the dot is not explicitly defined', function() { + assert(!mm.isMatch('.dot', '**/*dot')); + assert(!mm.isMatch('.dot', '**/?dot')); + assert(!mm.isMatch('.dot', '*/*dot')); + assert(!mm.isMatch('.dot', '*/?dot')); + assert(!mm.isMatch('.dot', '/*dot')); + assert(!mm.isMatch('.dot', '/?dot')); + assert(!mm.isMatch('/.dot', '**/*dot')); + assert(!mm.isMatch('/.dot', '**/?dot')); + assert(!mm.isMatch('/.dot', '*/*dot')); + assert(!mm.isMatch('/.dot', '*/?dot')); + assert(!mm.isMatch('/.dot', '/*dot')); + assert(!mm.isMatch('/.dot', '/?dot')); + assert(!mm.isMatch('a/.dot', '*/*dot')); + assert(!mm.isMatch('a/.dot', '*/?dot')); + assert(!mm.isMatch('a/b/.dot', '**/*dot')); + assert(!mm.isMatch('a/b/.dot', '**/?dot')); + + // related https://github.com/jonschlinkert/micromatch/issues/63 + assert(!mm.isMatch('/aaa/bbb/.git', '/aaa/bbb/**')); + assert(!mm.isMatch('aaa/bbb/.git', 'aaa/bbb/**')); + assert(!mm.isMatch('/aaa/bbb/ccc/.git', '/aaa/bbb/**')); }); }); describe('options.dot', function() { it('should match dotfiles when `options.dot` is true', function() { - mm.isMatch('.bashrc', '*bashrc', {dot: true}).should.be.true(); - mm.isMatch('.bashrc', '[.]bashrc', {dot: true}).should.be.true(); - mm.isMatch('.bashrc', '?bashrc', {dot: true}).should.be.true(); - - mm.isMatch('a/b/.bashrc', '*bashrc', {dot: true, matchBase: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '[.]bashrc', {dot: true, matchBase: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '?bashrc', {dot: true, matchBase: true}).should.be.true(); - - mm.isMatch('a/b/.bashrc', '**/*bashrc', {dot: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '**/.[b]ashrc', {dot: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '**/[.]bashrc', {dot: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '**/?bashrc', {dot: true}).should.be.true(); + assert(mm.isMatch('.dotfile.js', '.*.js', {dot: true})); + assert(mm.isMatch('.dot', '*dot', {dot: true})); + assert(mm.isMatch('.dot', '?dot', {dot: true})); + assert(mm.isMatch('.dot', '[.]dot', {dot: true})); + assert(mm.isMatch('/a/b/.dot', '**/*dot', {dot: true})); + assert(mm.isMatch('/a/b/.dot', '**/.[d]ot', {dot: true})); + assert(mm.isMatch('/a/b/.dot', '**/?dot', {dot: true})); + assert(mm.isMatch('/a/b/.dot', '**/[.]dot', {dot: false})); + assert(mm.isMatch('/a/b/.dot', '**/[.]dot', {dot: true})); + assert(mm.isMatch('a/b/.dot', '**/*dot', {dot: true})); + assert(mm.isMatch('a/b/.dot', '**/.[d]ot', {dot: true})); + assert(mm.isMatch('a/b/.dot', '**/?dot', {dot: true})); + assert(mm.isMatch('a/b/.dot', '**/[.]dot', {dot: false})); + assert(mm.isMatch('a/b/.dot', '**/[.]dot', {dot: true})); }); - it('should not match dotfiles when `options.dot` is false', function() { - mm.isMatch('a/b/.bashrc', '*bashrc', {dot: false, matchBase: true}).should.be.false(); - mm.isMatch('a/b/.bashrc', '[.]bashrc', {dot: false, matchBase: true}).should.be.false(); - mm.isMatch('a/b/.bashrc', '?bashrc', {dot: false, matchBase: true}).should.be.false(); - - mm.isMatch('a/b/.bashrc', '**/*bashrc', {dot: false}).should.be.false(); - mm.isMatch('a/b/.bashrc', '**/[.]bashrc', {dot: false}).should.be.false(); - mm.isMatch('a/b/.bashrc', '**/?bashrc', {dot: false}).should.be.false(); + it('should match dotfiles when `.dot` and `.matchBase` both defined', function() { + assert(mm.isMatch('a/b/.dot', '*dot', {dot: true, matchBase: true})); + assert(mm.isMatch('a/b/.dot', '[.]dot', {dot: true, matchBase: true})); + assert(mm.isMatch('a/b/.dot', '[.]dot', {dot: false, matchBase: true})); + assert(mm.isMatch('a/b/.dot', '?dot', {dot: true, matchBase: true})); }); - }); - describe('options.dotfiles', function() { - it('should match a dotfile when `options.dotfiles` is true', function() { - mm.isMatch('.bashrc', '*bashrc', {dotfiles: true}).should.be.true(); - mm.isMatch('.bashrc', '[.]bashrc', {dotfiles: true}).should.be.true(); - mm.isMatch('.bashrc', '?bashrc', {dotfiles: true}).should.be.true(); - - mm.isMatch('a/b/.bashrc', '*bashrc', {dotfiles: true, matchBase: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '[.]bashrc', {dotfiles: true, matchBase: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '?bashrc', {dotfiles: true, matchBase: true}).should.be.true(); - - mm.isMatch('a/b/.bashrc', '**/*bashrc', {dotfiles: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '**/.[b]ashrc', {dotfiles: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '**/[.]bashrc', {dotfiles: true}).should.be.true(); - mm.isMatch('a/b/.bashrc', '**/?bashrc', {dotfiles: true}).should.be.true(); + it('should work when the path has leading `./`', function() { + assert(!mm.isMatch('./b/.c', '**')); + assert(mm.isMatch('./b/.c', '**', {dot: true})); + assert(mm.isMatch('./b/.c', '**', {dot: true, matchBase: true})); }); - it('should not match a dotfile when `options.dotfiles` is false', function() { - mm.isMatch('.bashrc', '*bashrc', {dotfiles: false}).should.be.false(); - mm.isMatch('.bashrc', '[.]bashrc', {dotfiles: false}).should.be.false(); - mm.isMatch('.bashrc', '?bashrc', {dotfiles: false}).should.be.false(); - - mm.isMatch('a/b/.bashrc', '*bashrc', {dotfiles: false, matchBase: false}).should.be.false(); - mm.isMatch('a/b/.bashrc', '[.]bashrc', {dotfiles: false, matchBase: false}).should.be.false(); - mm.isMatch('a/b/.bashrc', '?bashrc', {dotfiles: false, matchBase: false}).should.be.false(); - - mm.isMatch('a/b/.bashrc', '**/*bashrc', {dotfiles: false}).should.be.false(); - mm.isMatch('a/b/.bashrc', '**/[.]bashrc', {dotfiles: false}).should.be.false(); - mm.isMatch('a/b/.bashrc', '**/?bashrc', {dotfiles: false}).should.be.false(); + it('should not match dotfiles when `options.dot` is false', function() { + assert(!mm.isMatch('a/b/.dot', '**/*dot', {dot: false})); + assert(!mm.isMatch('a/b/.dot', '**/?dot', {dot: false})); }); - it('should not match a dotfile when `options.dotdirs` is true', function() { - // mm.isMatch('.bashrc', '*bashrc', {dotdirs: true}).should.be.false(); - mm.isMatch('.bashrc', '[.]bashrc', {dotdirs: true}).should.be.true(); - // mm.isMatch('.bashrc', '?bashrc', {dotdirs: true}).should.be.false(); - - mm.isMatch('a/b/.bashrc', '*bashrc', {dotdirs: true, matchBase: false}).should.be.false(); - mm.isMatch('a/b/.bashrc', '[.]bashrc', {dotdirs: true, matchBase: false}).should.be.false(); - mm.isMatch('a/b/.bashrc', '?bashrc', {dotdirs: true, matchBase: false}).should.be.false(); - - // mm.isMatch('a/b/.bashrc', '**/*bashrc', {dotdirs: true}).should.be.false(); - mm.isMatch('a/b/.bashrc', '**/[.]bashrc', {dotdirs: true}).should.be.true(); - // mm.isMatch('a/b/.bashrc', '**/?bashrc', {dotdirs: true}).should.be.false(); + it('should not match dotfiles when `.dot` is false and `.matchBase` is true', function() { + assert(!mm.isMatch('a/b/.dot', '*dot', {dot: false, matchBase: true})); + assert(!mm.isMatch('a/b/.dot', '?dot', {dot: false, matchBase: true})); }); - }); - - describe('options.dot / options.dotfiles', function() { - it('should match a dot `options.dot` is true', function() { - mm.isMatch('.bashrc', '*bashrc', {dot: true}).should.be.true(); - mm.isMatch('.bashrc', '[.]bashrc', {dot: true}).should.be.true(); - mm.isMatch('.bashrc', '?bashrc', {dot: true}).should.be.true(); - mm.isMatch('.bashrc', '*bashrc', {dotfiles: true}).should.be.true(); - mm.isMatch('.bashrc', '[.]bashrc', {dotfiles: true}).should.be.true(); - mm.isMatch('.bashrc', '?bashrc', {dotfiles: true}).should.be.true(); + it('should not match dotfiles when `.dot` is not defined and a dot is not in the glob pattern', function() { + assert(!mm.isMatch('a/b/.dot', '*dot', {matchBase: true})); + assert(!mm.isMatch('a/b/.dot', '?dot', {matchBase: true})); + assert(!mm.isMatch('a/b/.dot', '**/*dot')); + assert(!mm.isMatch('a/b/.dot', '**/?dot')); }); }); }); diff --git a/test/expand.js b/test/expand.js deleted file mode 100644 index be68b8c2..00000000 --- a/test/expand.js +++ /dev/null @@ -1,59 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License - */ - -'use strict'; - -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = ref.minimatch; -} - -describe('expand()', function() { - describe('errors:', function() { - it('should throw on undefined args:', function() { - (function() { - mm.expand(); - }).should.throw('micromatch.expand(): argument should be a string.'); - }); - - it('should throw on bad args:', function() { - (function() { - mm.expand({}); - }).should.throw('micromatch.expand(): argument should be a string.'); - }); - }); - - it('should return an object with information about the glob pattern', function() { - mm.expand('*').should.be.an.Object(); - mm.expand('*').should.have.properties('options', 'pattern'); - }); - - it('should return a string on the `glob` property:', function() { - mm.expand('*').pattern.should.be.a.String(); - mm.expand('*').pattern.should.equal('(?!\\.)(?=.)[^/]*?'); - mm.expand('*.{js,md}').pattern.should.equal('(?!\\.)(?=.)[^/]*?\\.(js|md)'); - mm.expand('{a,b\\}').pattern.should.eql('{a,b}'); - }); - - it('should escape dots:', function() { - mm.expand('.').pattern.should.equal('\\.'); - }); - - it('should expand patterns for file names:', function() { - mm.expand('*.md').pattern.should.equal('(?!\\.)(?=.)[^/]*?\\.md'); - mm.expand('*.md', {dot: true}).pattern.should.equal('(?!(?:\\/|^)\\.{1,2}($|\\/))(?=.)[^/]*?\\.md'); - mm.expand('.*.md').pattern.should.equal('\\.(?!(?:\\/|^)\\.{1,2}($|\\/))(?=.)[^/]*?\\.md'); - }); - - it('should expand extglobs', function() { - mm.expand('?(a*|b)').pattern.should.equal('(?:a[^/]*?|b|)'); - }); -}); diff --git a/test/extglob-char-class.js b/test/extglob-char-class.js deleted file mode 100644 index a8150ddc..00000000 --- a/test/extglob-char-class.js +++ /dev/null @@ -1,38 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('should'); -var assert = require('assert'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = ref.minimatch; -} - -/** - * minimatch and micromatch fail on all of these - */ - -describe.skip('character classes in extglobs', function() { - it('should match using POSIX character classes in extglobs:', function() { - assert.equal(mm.isMatch('a.c', '+([[:alpha:].])'), true); - assert.equal(mm.isMatch('a.c', '+([[:alpha:].])+([[:alpha:].])'), true); - assert.equal(mm.isMatch('a.c', '*([[:alpha:].])'), true); - assert.equal(mm.isMatch('a.c', '*([[:alpha:].])*([[:alpha:].])'), true); - - assert.equal(mm.isMatch('a.c', '?([[:alpha:].])?([[:alpha:].])?([[:alpha:].])'), true); - assert.equal(mm.isMatch('a.c', '@([[:alpha:].])@([[:alpha:].])@([[:alpha:].])'), true); - - assert.equal(mm.isMatch('.', '!([[:alpha:].])'), false); - assert.equal(mm.isMatch('.', '?([[:alpha:].])'), true); - assert.equal(mm.isMatch('.', '@([[:alpha:].])'), true); - }); -}); diff --git a/test/extglob.js b/test/extglob.js deleted file mode 100644 index d2b070e6..00000000 --- a/test/extglob.js +++ /dev/null @@ -1,68 +0,0 @@ -'use strict'; - -require('should'); -var assert = require('assert'); -var mm = require('..'); - -describe('basic extglobs', function() { - it('should NOT optimize extglobs if `options.noextglob` is `true`:', function() { - var opts = { noextglob: true }; - assert.equal(mm.expand('a?(b*)', opts).pattern, 'a[^/](b(?!(?:\\/|^)\\.{1,2}($|\\/))(?=.)[^/]*?)'); - assert.equal(mm.expand('?(a.*|b)', opts).pattern, '(?!\\.)(?=.)[^/](a.(?!(?:\\/|^)\\.{1,2}($|\\/))(?=.)[^/]*?|b)'); - assert.equal(mm.expand('a?(b*)', opts).pattern, 'a[^/](b(?!(?:\\/|^)\\.{1,2}($|\\/))(?=.)[^/]*?)'); - assert.equal(mm.expand('a?(b*)', opts).pattern, 'a[^/](b(?!(?:\\/|^)\\.{1,2}($|\\/))(?=.)[^/]*?)'); - assert.equal(mm.expand('?(a*|b)', opts).pattern, '(?!\\.)(?=.)[^/](a(?!(?:\\/|^)\\.{1,2}($|\\/))(?=.)[^/]*?|b)'); - assert.equal(mm.expand('?(a*|b)', opts).pattern, '(?!\\.)(?=.)[^/](a(?!(?:\\/|^)\\.{1,2}($|\\/))(?=.)[^/]*?|b)'); - }); - - it('should optimize extglobs if `options.noextglob` is `false`:', function() { - var opts = { noextglob: false }; - assert.equal(mm.expand('a?(b*)', opts).pattern, 'a(?:b[^/]*?|)'); - assert.equal(mm.expand('?(a.*|b)', opts).pattern, '(?:a\\.[^/]*?|b|)'); - assert.equal(mm.expand('a?(b*)', opts).pattern, 'a(?:b[^/]*?|)'); - assert.equal(mm.expand('a?(b*)', opts).pattern, 'a(?:b[^/]*?|)'); - assert.equal(mm.expand('?(a*|b)', opts).pattern, '(?:a[^/]*?|b|)'); - assert.equal(mm.expand('?(a*|b)', opts).pattern, '(?:a[^/]*?|b|)'); - }); - - it('should optimize extglobs if `options.noextglob` is undefined:', function() { - assert.equal(mm.expand('a?(b*)').pattern, 'a(?:b[^/]*?|)'); - assert.equal(mm.expand('?(a.*|b)').pattern, '(?:a\\.[^/]*?|b|)'); - assert.equal(mm.expand('a?(b*)').pattern, 'a(?:b[^/]*?|)'); - assert.equal(mm.expand('a?(b*)').pattern, 'a(?:b[^/]*?|)'); - assert.equal(mm.expand('?(a*|b)').pattern, '(?:a[^/]*?|b|)'); - assert.equal(mm.expand('?(a*|b)').pattern, '(?:a[^/]*?|b|)'); - }); - - it('should match extglobs:', function() { - mm.match(['a', 'b', 'c'], '(a|c)').should.eql(['a', 'c']); - mm.match(['axb'], 'a?(b*)').should.eql([]); - mm.match(['ax'], '?(a.*|b)').should.eql([]); - mm.match(['ax'], 'a?(b*)').should.eql([]); - mm.match(['ax'], 'a?(b*)').should.eql([]); - mm.match(['yax', 'b'], '?(a*|b)').should.eql(['b']); - mm.match(['ax'], '?(a*|b)').should.eql(['ax']); - }); - - it('should support matching with extglobs:', function() { - mm.isMatch('foo/abbbb', 'foo/a?(b*)').should.be.true(); - mm.isMatch('abbbb', 'a!(b*)').should.be.false(); - mm.isMatch('foo/abbbb', 'foo/a!(b*)').should.be.false(); - mm.isMatch('abbbb', 'a?(b*)').should.be.true(); - mm.isMatch('abbbb', 'a?(b*)').should.be.true(); - mm.isMatch('abx', 'a?(b*)').should.be.true(); - mm.isMatch('ax', '?(a*|b)').should.be.true(); - mm.isMatch('ax', 'a?(b*)').should.be.false(); - mm.isMatch('ax', 'a?(b*)').should.be.false(); - mm.isMatch('ax', 'a?(b+)').should.be.false(); - mm.isMatch('axb', 'a?(b*)').should.be.false(); - mm.isMatch('axb', 'a?(b*)').should.be.false(); - mm.isMatch('axbbbb', 'a?(b*)').should.be.false(); - mm.isMatch('axbx', 'a?(b*)').should.be.false(); - mm.isMatch('xabbbb', 'a?(b*)').should.be.false(); - mm.isMatch('xbbbb', 'a?(b*)').should.be.false(); - mm.isMatch('xbx', 'a?(b*)').should.be.false(); - mm.isMatch('yax', '?(a*|b)').should.be.false(); - }); -}); - diff --git a/test/extglob1a.js b/test/extglob1a.js deleted file mode 100644 index cf818474..00000000 --- a/test/extglob1a.js +++ /dev/null @@ -1,161 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -var path = require('path'); -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = ref.minimatch; -} - -describe('extglob1a', function() { - it('should match extglobs:', function() { - mm.match(['ba'], 'a!(x)').should.eql([]); - mm.match(['ba', 'ab'], 'a!(x)').should.eql(['ab']); - mm.match(['ba'], 'a*(?(x))').should.eql([]); - mm.match(['ba', 'ax', 'a'], 'a*(?(x))').should.eql(['ax', 'a']); - mm.match(['a', 'ab'], 'a*!(x)/b/?(y)/c').should.eql([]); - mm.match(['ab', 'ba'], 'a?(x)').should.eql([]); - mm.match(['ba'], 'a*!(x)').should.eql([]); - mm.match(['a', 'ab', 'x'], 'a!(x)').should.eql(['a', 'ab']); - mm.match(['a'], 'a?(x)').should.eql(['a']); - mm.match(['a.js', 'a.md', 'a.js.js', 'c.js', 'a.', 'd.js.d'], '*.!(js)').should.eql(['a.md', 'a.', 'd.js.d']); - // mm.match(['a', 'ab'], 'a*(?(x))').should.eql(['a', 'ab']); - mm.match(['a', 'ab'], 'a*(!(x))').should.eql(['a', 'ab']); - mm.match(['a', 'x'], 'a*(!(x))').should.eql(['a']); - mm.match(['a', 'x', 'ab', 'ax'], 'a*(!(x))').should.eql(['a', 'ab']); - }); -}) - -describe('extglobs', function() { - it('should match extended globs:', function() { - mm.match(['a/z', 'a/b'], 'a/!(z)').should.eql(['a/b']); - mm.match(['c/z/v'], 'c/z/v').should.eql(['c/z/v']); - mm.match(['c/a/v'], 'c/!(z)/v').should.eql(['c/a/v']); - mm.match(['c/z/v','c/a/v'], 'c/!(z)/v').should.eql(['c/a/v']); - mm.match(['c/z/v','c/a/v'], 'c/@(z)/v').should.eql(['c/z/v']); - mm.match(['c/z/v','c/a/v'], 'c/+(z)/v').should.eql(['c/z/v']); - mm.match(['c/z/v','c/a/v'], 'c/*(z)/v').should.eql(['c/z/v']); - mm.match(['c/z/v','z','zf','fz'], '?(z)').should.eql(['z']); - mm.match(['c/z/v','z','zf','fz'], '+(z)').should.eql(['z']); - mm.match(['c/z/v','z','zf','fz'], '*(z)').should.eql(['z']); - mm.match(['cz','abz','az'], 'a@(z)').should.eql(['az']); - mm.match(['cz','abz','az'], 'a*@(z)').should.eql(['abz', 'az']); - mm.match(['cz','abz','az'], 'a!(z)').should.eql(['abz']); - mm.match(['cz','abz','az'], 'a?(z)').should.eql(['az']); - mm.match(['cz','abz','az'], 'a+(z)').should.eql(['az']); - mm.match(['az','bz','axz'], 'a+(z)').should.eql(['az']); - mm.match(['cz','abz','az'], 'a*(z)').should.eql(['az']); - mm.match(['cz','abz','az'], 'a**(z)').should.eql(['abz', 'az']); - mm.match(['cz','abz','az'], 'a*!(z)').should.eql(['abz', 'az']); - }); - - it('should match extglobs in file paths:', function() { - mm.match(['a.js', 'a.md', 'a.js.js', 'c.js', 'a.', 'd.js.d'], '*.!(js)').should.eql(['a.md', 'a.', 'd.js.d']); - mm.match(['a.js', 'a.md', 'a.js.js', 'c.js', 'a.', 'd.js.d'], '*!(.js)').should.eql(['a.md', 'a.', 'd.js.d']); - }); - - it('should support exclusion patterns:', function() { - var arr = ['a.a', 'a.b', 'a.a.a', 'c.a', 'a.', 'd.a.d']; - mm.match(arr, '*.+(b|d)').should.eql(['a.b', 'd.a.d']); - mm.match(arr, '*.!(a)').should.eql(['a.b', 'a.', 'd.a.d']); - mm.match(arr, '*.!(*a)').should.eql(['a.b', 'a.', 'd.a.d']); - }); - - it('should match exactly one of the given pattern:', function() { - var arr = ['aa.aa', 'a.bb', 'a.aa.a', 'cc.a', 'a.a', 'c.a', 'dd.aa.d', 'b.a']; - mm.match(arr, '@(b|a)\.@(a)').should.eql(['a.a', 'b.a']); - }); - - it('should support multiple exclusion patterns in one extglob:', function() { - var arr = ['a.a', 'a.b', 'a.c.d', 'c.c', 'a.', 'd.d', 'e.e', 'f.f']; - mm.match(arr, '!(*.a|*.b|*.c)').should.eql(['a.c.d', 'a.', 'd.d', 'e.e', 'f.f']); - }); -}); - -describe('bash', function() { - it('should match extended globs from the bash spec:', function() { - mm.match(['fofo'], '*(f*(o))').should.eql(['fofo']); - mm.match(['ffo'], '*(f*(o))').should.eql(['ffo']); - mm.match(['foooofo'], '*(f*(o))').should.eql(['foooofo']); - mm.match(['foooofof'], '*(f*(o))').should.eql(['foooofof']); - mm.match(['fooofoofofooo'], '*(f*(o))').should.eql(['fooofoofofooo']); - mm.match(['foooofof'], '*(f+(o))').should.eql([]); - mm.match(['xfoooofof'], '*(f*(o))').should.eql([]); - mm.match(['foooofofx'], '*(f*(o))').should.eql([]); - mm.match(['ofxoofxo'], '*(*(of*(o)x)o)').should.eql(['ofxoofxo']); - mm.match(['ofooofoofofooo'], '*(f*(o))').should.eql([]); - mm.match(['foooxfooxfoxfooox'], '*(f*(o)x)').should.eql(['foooxfooxfoxfooox']); - mm.match(['foooxfooxofoxfooox'], '*(f*(o)x)').should.eql([]); - mm.match(['foooxfooxfxfooox'], '*(f*(o)x)').should.eql(['foooxfooxfxfooox']); - mm.match(['ofxoofxo'], '*(*(of*(o)x)o)').should.eql(['ofxoofxo']); - mm.match(['ofoooxoofxo'], '*(*(of*(o)x)o)').should.eql(['ofoooxoofxo']); - mm.match(['ofoooxoofxoofoooxoofxo'], '*(*(of*(o)x)o)').should.eql(['ofoooxoofxoofoooxoofxo']); - mm.match(['ofoooxoofxoofoooxoofxoo'], '*(*(of*(o)x)o)').should.eql(['ofoooxoofxoofoooxoofxoo']); - mm.match(['ofoooxoofxoofoooxoofxofo'], '*(*(of*(o)x)o)').should.eql([]); - mm.match(['ofoooxoofxoofoooxoofxooofxofxo'], '*(*(of*(o)x)o)').should.eql(['ofoooxoofxoofoooxoofxooofxofxo']); - mm.match(['aac'], '*(@(a))a@(c)').should.eql(['aac']); - mm.match(['aac'], '*(@(a))b@(c)').should.eql([]); - mm.match(['ac'], '*(@(a))a@(c)').should.eql(['ac']); - mm.match(['c'], '*(@(a))a@(c)').should.eql([]); - mm.match(['aaac', 'foo'], '*(@(a))a@(c)').should.eql(['aaac']); - mm.match(['baaac'], '*(@(a))a@(c)').should.eql([]); - mm.match(['abcd'], '?@(a|b)*@(c)d').should.eql(['abcd']); - mm.match(['abcd'], '@(ab|a*@(b))*(c)d').should.eql(['abcd']); - mm.match(['acd'], '@(ab|a*(b))*(c)d').should.eql(['acd']); - mm.match(['abbcd'], '@(ab|a*(b))*(c)d').should.eql(['abbcd']); - mm.match(['effgz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))').should.eql(['effgz']); - mm.match(['efgz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))').should.eql(['efgz']); - mm.match(['egz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))').should.eql(['egz']); - mm.match(['egzefffgzbcdij'], '*(b+(c)d|e*(f)g?|?(h)i@(j|k))').should.eql(['egzefffgzbcdij']); - mm.match(['egz'], '@(b+(c)d|e+(f)g?|?(h)i@(j|k))').should.eql([]); - mm.match(['ofoofo'], '*(of+(o))').should.eql(['ofoofo']); - mm.match(['oxfoxoxfox'], '*(oxf+(ox))').should.eql(['oxfoxoxfox']); - mm.match(['oxfoxfox'], '*(oxf+(ox))').should.eql([]); - mm.match(['ofoofo'], '*(of+(o)|f)').should.eql(['ofoofo']); - mm.match(['foofoofo'], '@(foo|f|fo)*(f|of+(o))').should.eql(['foofoofo']); - mm.match(['oofooofo'], '*(of|oof+(o))').should.eql(['oofooofo']); - mm.match(['fffooofoooooffoofffooofff'], '*(*(f)*(o))').should.eql(['fffooofoooooffoofffooofff']); - mm.match(['fofoofoofofoo'], '*(fo|foo)').should.eql(['fofoofoofofoo']); - mm.match(['foo'], '!(x)').should.eql(['foo']); - mm.match(['foo'], '!(x)*').should.eql(['foo']); - mm.match(['foo', 'bar'], '!(foo)').should.eql(['bar']); - mm.match(['foo', 'bar'], '!(foo)*').should.eql(['bar']); - mm.match(['foo/bar'], 'foo/!(foo)').should.eql(['foo/bar']); - mm.match(['foobar', 'baz'], '!(foo)*').should.eql(['baz']); - mm.match(['moo.cow', 'a.b'], '!(*\\.*).!(*\\.*)').should.eql(['moo.cow', 'a.b']); - mm.match(['moo.cow', 'a.b'], '!(*.*).!(*.*)').should.eql(['moo.cow', 'a.b']); - mm.match(['mad.moo.cow'], '^!(*.*).!(*.*)').should.eql([]); - mm.match(['mucca.pazza'], 'mu!(*(c))?.pa!(*(z))?').should.eql([]); - mm.match(['ooo'], '!(f)').should.eql(['ooo']); - mm.match(['ooo'], '*(!(f))').should.eql(['ooo']); - mm.match(['ooo'], '+(!(f))').should.eql(['ooo']); - mm.match(['f'], '!(f)').should.eql([]); - mm.match(['f'], '*(!(f))').should.eql([]); - mm.match(['f'], '+(!(f))').should.eql([]); - mm.match(['foot'], '@(!(z*)|*x)').should.eql(['foot']); - mm.match(['zoot'], '@(!(z*)|*x)').should.eql([]); - mm.match(['foox'], '@(!(z*)|*x)').should.eql(['foox']); - mm.match(['zoox'], '@(!(z*)|*x)').should.eql(['zoox']); - mm.match(['foob'], '!(foo)b*').should.eql([]); - mm.match(['fa', 'fb', 'f', 'fo'], '!(f(o))').should.eql(['fa', 'fb', 'f']); - mm.match(['fa', 'fb', 'f', 'fo'], '!(f!(o))').should.eql(['fo']); - mm.match(['fff'], '!(f)').should.eql(['fff']); - // mm.match(['foobb'], '!(foo)b*').should.eql(['foobb']); - // mm.match(['foo'], '*(!(foo))').should.eql(['foo']); - // mm.match(['foo'], '+(!(f))').should.eql(['foo']); - // mm.match(['foo'], '*(!(f))').should.eql(['foo']); - mm.match(['foo'], '!(f)').should.eql(['foo']); - // mm.match(['fff'], '+(!(f))').should.eql(['fff']); - // mm.match(['fff'], '*(!(f))').should.eql(['fff']); - }); -}); diff --git a/test/extglobs.js b/test/extglobs.js new file mode 100644 index 00000000..62c0cc87 --- /dev/null +++ b/test/extglobs.js @@ -0,0 +1,363 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var mm = require('./support/match'); +var sep = path.sep; + +/** + * These tests were converted directly from bash 4.3 and 4.4 unit tests. + */ + +describe('extglobs', function() { + beforeEach(function() { + path.sep = '\\'; + }); + afterEach(function() { + path.sep = sep; + }); + + it('should match extglobs ending with statechar', function() { + // from minimatch tests + assert(!mm.isMatch('ax', 'a?(b*)')); + assert(mm.isMatch('ax', '?(a*|b)')); + }); + + it('should match extended globs:', function() { + mm(['a.js.js', 'a.md.js'], '*.*(js).js', ['a.js.js']); + mm(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)', ['a/!(z)', 'a/b']); + mm(['c/z/v'], 'c/z/v', ['c/z/v']); + mm(['c/a/v'], 'c/!(z)/v', ['c/a/v']); + mm(['c/z/v', 'c/a/v'], 'c/!(z)/v', ['c/a/v']); + mm(['c/z/v', 'c/a/v'], 'c/@(z)/v', ['c/z/v']); + mm(['c/z/v', 'c/a/v'], 'c/+(z)/v', ['c/z/v']); + mm(['c/z/v', 'c/a/v'], 'c/*(z)/v', ['c/z/v']); + mm(['c/z/v', 'z', 'zf', 'fz'], '?(z)', ['z']); + mm(['c/z/v', 'z', 'zf', 'fz'], '+(z)', ['z']); + mm(['c/z/v', 'z', 'zf', 'fz'], '*(z)', ['z']); + mm(['cz', 'abz', 'az'], 'a@(z)', ['az']); + mm(['cz', 'abz', 'az'], 'a*@(z)', ['az', 'abz']); + mm(['cz', 'abz', 'az'], 'a!(z)', ['abz']); + mm(['cz', 'abz', 'az'], 'a?(z)', ['az']); + mm(['cz', 'abz', 'az'], 'a+(z)', ['az']); + mm(['az', 'bz', 'axz'], 'a+(z)', ['az']); + mm(['cz', 'abz', 'az'], 'a*(z)', ['az']); + mm(['cz', 'abz', 'az'], 'a**(z)', ['az', 'abz']); + mm(['cz', 'abz', 'az'], 'a*!(z)', ['az', 'abz']); + mm(['cz', 'abz', 'az'], 'a!(*)', []); + mm(['a.js', 'a.txt', 'a.md'], 'a.!(js)', ['a.md', 'a.txt']); + mm(['a.js', 'a.txt', 'a.md'], 'a.!(js)*', ['a.md', 'a.txt']); + }); + + it('should support negation', function() { + var arr = ['a', 'b', 'aa', 'ab', 'bb', 'ac', 'aaa', 'aab', 'abb', 'ccc']; + mm(arr, '!(a)*', ['b', 'bb', 'ccc']); + mm(arr, 'a!(b)*', ['a', 'aa', 'aaa', 'aab', 'ac']); + mm(['foo'], '!(foo)', []); + mm(['foo.js'], '!(foo).js', []); + }); + + it('should match exactly one of the given pattern:', function() { + var arr = ['aa.aa', 'a.bb', 'a.aa.a', 'cc.a', 'a.a', 'c.a', 'dd.aa.d', 'b.a']; + mm(arr, '(b|a).(a)', ['a.a', 'b.a']); + mm(arr, '@(b|a).@(a)', ['a.a', 'b.a']); + }); + + it('should work with globs', function() { + var arr = ['123abc', 'ab', 'abab', 'abcdef', 'accdef', 'abcfefg', 'abef', 'abcfef', 'abd', 'acd']; + mm(arr, 'ab*(e|f)', ['ab', 'abef']); + mm(arr, 'ab?*(e|f)', ['abd', 'abef', 'abcfef']); + mm(arr, 'ab*d+(e|f)', ['abcdef']); + mm(arr, 'ab**(e|f)', ['ab', 'abab', 'abcdef', 'abcfefg', 'abcfef', 'abef', 'abd']); + mm(arr, 'ab*+(e|f)', ['abcdef', 'abcfef', 'abef']); + mm(arr, 'ab**(e|f)g', ['abcfefg']); + mm(arr, 'ab***ef', ['abcdef', 'abcfef', 'abef']); + mm(arr, 'ab**', ['ab', 'abab', 'abcdef', 'abcfef', 'abcfefg', 'abd', 'abef']); + mm(arr, '*?(a)bc', ['123abc']); + mm(arr, 'a(b*(foo|bar))d', ['abd']); + mm(arr, '(a+|b)+', ['ab', 'abab']); + mm(arr, '(a+|b)*', ['ab', 'abab', 'accdef', 'abcdef', 'abcfefg', 'abef', 'abcfef', 'abd', 'acd']); + mm(['/dev/udp/129.22.8.102/45'], '/dev\\/@(tcp|udp)\\/*\\/*', ['/dev/udp/129.22.8.102/45']); + mm(['12', '1', '12abc'], '0|[1-9]*([0-9])', ['1', '12'], 'Should match valid numbers'); + mm(['07', '0377', '09'], '+([0-7])', ['0377', '07'], 'Should match octal numbers'); + }); + + it('stuff from korn\'s book', function() { + assert(mm.isMatch('paragraph', 'para@(chute|graph)')); + assert(!mm.isMatch('paramour', 'para@(chute|graph)')); + assert(mm.isMatch('para991', 'para?([345]|99)1')); + assert(!mm.isMatch('para381', 'para?([345]|99)1')); + assert(!mm.isMatch('paragraph', 'para*([0-9])')); + assert(mm.isMatch('para', 'para*([0-9])')); + assert(mm.isMatch('para13829383746592', 'para*([0-9])')); + assert(!mm.isMatch('paragraph', 'para*([0-9])')); + assert(!mm.isMatch('para', 'para+([0-9])')); + assert(mm.isMatch('para987346523', 'para+([0-9])')); + assert(mm.isMatch('paragraph', 'para!(*.[0-9])')); + assert(mm.isMatch('para.38', 'para!(*.[00-09])')); + assert(mm.isMatch('para.graph', 'para!(*.[0-9])')); + assert(mm.isMatch('para39', 'para!(*.[0-9])')); + }); + + it('tests derived from those in rosenblatt\'s korn shell book', function() { + mm(['', '137577991', '2468'], '*(0|1|3|5|7|9)', ['', '137577991']); + mm(['file.c', 'file.C', 'file.cc', 'file.ccc'], '*.c?(c)', ['file.c', 'file.cc']); + mm(['parse.y', 'shell.c', 'Makefile', 'Makefile.in'], '!(*.c|*.h|Makefile.in|config*|README)', ['parse.y', 'Makefile']); + mm(['VMS.FILE;', 'VMS.FILE;0', 'VMS.FILE;1', 'VMS.FILE;139', 'VMS.FILE;1N'], '*\\;[1-9]*([0-9])', ['VMS.FILE;1', 'VMS.FILE;139']); + }); + + it('tests derived from the pd-ksh test suite', function() { + mm(['abcx', 'abcz', 'bbc'], '!([[*])*', ['abcx', 'abcz', 'bbc']); + mm(['abcx', 'abcz', 'bbc'], '+(a|b\\[)*', ['abcx', 'abcz']); + mm(['abd', 'acd'], 'a+(b|c)d', ['abd', 'acd']); + mm(['abd', 'acd', 'ac', 'ab'], 'a!(@(b|B))', ['acd', 'abd', 'ac']); + mm(['abd', 'acd'], 'a!(@(b|B))d', ['acd']); + mm(['abd', 'acd'], 'a[b*(foo|bar)]d', ['abd']); + mm(['abcx', 'abcz', 'bbc', 'aaz', 'aaaz'], '[a*(]*z', ['aaz', 'aaaz'], {bash: false}); + mm(['abcx', 'abcz', 'bbc', 'aaz', 'aaaz'], '[a*(]*z', ['aaz', 'aaaz', 'abcz']); + }); + + it('simple kleene star tests', function() { + assert(!mm.isMatch('foo', '*(a|b\\[)')); + assert(mm.isMatch('foo', '*(a|b\\[)|f*')); + }); + + it('this doesn\'t work in bash either (per bash micromatch.tests notes)', function() { + assert(!mm.isMatch('*(a|b[)', '*(a|b\\[)')); + assert(mm.isMatch('*(a|b[)', '\\*\\(a\\|b\\[\\)')); + }); + + it('should support multiple exclusion patterns in one extglob:', function() { + var arr = ['a.a', 'a.b', 'a.c', 'a.c.d', 'c.c', 'a.', 'd.d', 'e.e', 'f.f', 'a.abcd']; + mm(arr, '*.(a|b|@(ab|a*@(b))*(c)d)', ['a.a', 'a.b', 'a.abcd']); + mm(arr, '!(*.a|*.b|*.c)', ['a.', 'a.c.d', 'd.d', 'e.e', 'f.f']); + mm(arr, '*!(.a|.b|.c)', arr); + mm(arr, '*.!(a|b|c)', ['a.c.d', 'a.', 'd.d', 'e.e', 'f.f']); + }); + + it('should correctly match empty parens', function() { + mm(['def', 'ef'], '()ef', ['ef']); + }); + + it('should match parens', function() { + var arr = ['a(b', 'a\\(b', 'a((b', 'a((((b', 'ab']; + mm(arr, 'a(b', ['a(b']); + mm(arr, 'a(*b', ['a(b', 'a((b', 'a((((b']); + mm(['a(b', 'a((b', 'a((((b', 'ab'], 'a\\(b', ['a(b']); + mm(['a(b', 'a((b', 'a((((b', 'ab'], 'a(b', ['a(b']); + }); + + it('should match escaped backslashes', function() { + mm(['a\\b', 'a/b', 'ab'], 'a\\b', ['a\\b'], {unixify: false}); + mm(['a\\\\z', 'a\\z', 'a\\z', 'az'], 'a\\\\z', ['a\\\\z'], {unixify: false}); + + mm(['a\\b', 'a/b', 'ab'], 'a\\b', ['a/b']); + mm(['a\\\\z', 'a\\z', 'a\\z', 'az'], 'a\\\\z', ['a/z']); + }); +}); + +describe('bash', function() { + it('should match extended globs from the bash spec:', function() { + assert(mm.isMatch('fofo', '*(f*(o))')); + assert(mm.isMatch('ffo', '*(f*(o))')); + assert(mm.isMatch('foooofo', '*(f*(o))')); + assert(mm.isMatch('foooofof', '*(f*(o))')); + assert(mm.isMatch('fooofoofofooo', '*(f*(o))')); + assert(!mm.isMatch('foooofof', '*(f+(o))')); + assert(!mm.isMatch('xfoooofof', '*(f*(o))')); + assert(!mm.isMatch('foooofofx', '*(f*(o))')); + assert(mm.isMatch('ofxoofxo', '*(*(of*(o)x)o)')); + assert(!mm.isMatch('ofooofoofofooo', '*(f*(o))')); + assert(mm.isMatch('foooxfooxfoxfooox', '*(f*(o)x)')); + assert(!mm.isMatch('foooxfooxofoxfooox', '*(f*(o)x)')); + assert(mm.isMatch('foooxfooxfxfooox', '*(f*(o)x)')); + assert(mm.isMatch('ofxoofxo', '*(*(of*(o)x)o)')); + assert(mm.isMatch('ofoooxoofxo', '*(*(of*(o)x)o)')); + assert(mm.isMatch('ofoooxoofxoofoooxoofxo', '*(*(of*(o)x)o)')); + assert(mm.isMatch('ofoooxoofxoofoooxoofxoo', '*(*(of*(o)x)o)')); + assert(!mm.isMatch('ofoooxoofxoofoooxoofxofo', '*(*(of*(o)x)o)')); + assert(mm.isMatch('ofoooxoofxoofoooxoofxooofxofxo', '*(*(of*(o)x)o)')); + assert(mm.isMatch('aac', '*(@(a))a@(c)')); + assert(mm.isMatch('ac', '*(@(a))a@(c)')); + assert(!mm.isMatch('c', '*(@(a))a@(c)')); + assert(mm.isMatch('aaac', '*(@(a))a@(c)')); + assert(!mm.isMatch('baaac', '*(@(a))a@(c)')); + assert(mm.isMatch('abcd', '?@(a|b)*@(c)d')); + assert(mm.isMatch('abcd', '@(ab|a*@(b))*(c)d')); + assert(mm.isMatch('acd', '@(ab|a*(b))*(c)d')); + assert(mm.isMatch('abbcd', '@(ab|a*(b))*(c)d')); + assert(mm.isMatch('effgz', '@(b+(c)d|e*(f)g?|?(h)i@(j|k))')); + assert(mm.isMatch('efgz', '@(b+(c)d|e*(f)g?|?(h)i@(j|k))')); + assert(mm.isMatch('egz', '@(b+(c)d|e*(f)g?|?(h)i@(j|k))')); + assert(mm.isMatch('egzefffgzbcdij', '*(b+(c)d|e*(f)g?|?(h)i@(j|k))')); + assert(!mm.isMatch('egz', '@(b+(c)d|e+(f)g?|?(h)i@(j|k))')); + assert(mm.isMatch('ofoofo', '*(of+(o))')); + assert(mm.isMatch('oxfoxoxfox', '*(oxf+(ox))')); + assert(!mm.isMatch('oxfoxfox', '*(oxf+(ox))')); + assert(mm.isMatch('ofoofo', '*(of+(o)|f)')); + assert(mm.isMatch('foofoofo', '@(foo|f|fo)*(f|of+(o))'), 'Should match as fo+ofo+ofo'); + assert(mm.isMatch('oofooofo', '*(of|oof+(o))')); + assert(mm.isMatch('fffooofoooooffoofffooofff', '*(*(f)*(o))')); + assert(mm.isMatch('fofoofoofofoo', '*(fo|foo)'), 'Should backtrack in alternation matches'); + }); + + it('should support exclusions', function() { + mm(['foob', 'foobb', 'foo', 'bar', 'baz', 'foobar'], '!(foo)b*', ['bar', 'baz']); + // Bash 4.3 says this should match `foo` too. Probably a bug in Bash since this is correct. + mm(['foo', 'bar', 'baz', 'foobar'], '*(!(foo))', ['bar', 'baz', 'foobar']); + // Bash 4.3 says this should match `foo` and `foobar` too, probably a bug in Bash since this is correct. + mm(['foo', 'bar', 'baz', 'foobar'], '!(foo)*', ['bar', 'baz']); + + mm(['moo.cow', 'moo', 'cow'], '!(*.*)', ['moo', 'cow']); + mm(['moo.cow', 'moo', 'cow'], '!(*.*).', []); + assert(!mm.isMatch('f', '!(f)')); + assert(!mm.isMatch('f', '+(!(f))')); + assert(!mm.isMatch('f', '*(!(f))')); + assert(!mm.isMatch('mad.moo.cow', '!(*.*).!(*.*)')); + assert(!mm.isMatch('mucca.pazza', 'mu!(*(c))?.pa!(*(z))?')); + assert(!mm.isMatch('zoot', '@(!(z*)|*x)')); + assert(mm.isMatch('foo', '!(x)')); + assert(mm.isMatch('foo', '!(x)*')); + assert(mm.isMatch('foot', '@(!(z*)|*x)')); + assert(mm.isMatch('foox', '@(!(z*)|*x)')); + assert(mm.isMatch('ooo', '!(f)')); + assert(mm.isMatch('ooo', '*(!(f))')); + assert(mm.isMatch('ooo', '+(!(f))')); + assert(mm.isMatch('zoox', '@(!(z*)|*x)')); + mm(['aaac', 'foo'], '*(@(a))a@(c)', ['aaac']); + mm(['aaac'], '*(@(a))a@(c)', ['aaac']); + mm(['aac'], '*(@(a))a@(c)', ['aac']); + mm(['aac'], '*(@(a))b@(c)', []); + mm(['abbcd'], '@(ab|a*(b))*(c)d', ['abbcd']); + mm(['abcd'], '?@(a|b)*@(c)d', ['abcd']); + mm(['abcd'], '@(ab|a*@(b))*(c)d', ['abcd']); + mm(['ac'], '*(@(a))a@(c)', ['ac']); + mm(['acd'], '@(ab|a*(b))*(c)d', ['acd']); + mm(['baaac'], '*(@(a))a@(c)', []); + mm(['c'], '*(@(a))a@(c)', []); + mm(['effgz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))', ['effgz']); + mm(['efgz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))', ['efgz']); + mm(['egz'], '@(b+(c)d|e*(f)g?|?(h)i@(j|k))', ['egz']); + mm(['egz'], '@(b+(c)d|e+(f)g?|?(h)i@(j|k))', []); + mm(['egzefffgzbcdij'], '*(b+(c)d|e*(f)g?|?(h)i@(j|k))', ['egzefffgzbcdij']); + mm(['f'], '!(f)', []); + mm(['f'], '*(!(f))', []); + mm(['f'], '+(!(f))', []); + mm(['fa', 'fb', 'f', 'fo'], '!(f!(o))', ['fo']); + mm(['fa', 'fb', 'f', 'fo'], '!(f(o))', ['f', 'fb', 'fa']); + mm(['fff', 'foo', 'ooo', 'f'], '*(!(f))', ['fff', 'ooo', 'foo']); + mm(['fff'], '!(f)', ['fff']); + mm(['fff'], '*(!(f))', ['fff']); + mm(['fff'], '+(!(f))', ['fff']); + mm(['fffooofoooooffoofffooofff'], '*(*(f)*(o))', ['fffooofoooooffoofffooofff']); + mm(['ffo'], '*(f*(o))', ['ffo']); + mm(['fofo'], '*(f*(o))', ['fofo']); + mm(['fofoofoofofoo'], '*(fo|foo)', ['fofoofoofofoo']); + mm(['foo', 'bar'], '!(foo)', ['bar']); + mm(['foo'], '!(!(foo))', ['foo']); + mm(['foo'], '!(f)', ['foo']); + mm(['foo'], '!(x)', ['foo']); + mm(['foo'], '!(x)*', ['foo']); + mm(['foo'], '*(!(f))', ['foo']); + mm(['foo'], '*((foo))', ['foo']); + mm(['foo'], '+(!(f))', ['foo']); + mm(['foo/bar'], 'foo/!(foo)', ['foo/bar']); + mm(['foob', 'foobb'], '(foo)bb', ['foobb']); + mm(['foobar'], '!(foo)', ['foobar']); + mm(['foofoofo'], '@(foo|f|fo)*(f|of+(o))', ['foofoofo']); + mm(['fooofoofofooo'], '*(f*(o))', ['fooofoofofooo']); + mm(['foooofo'], '*(f*(o))', ['foooofo']); + mm(['foooofof'], '*(f*(o))', ['foooofof']); + mm(['foooofof'], '*(f+(o))', []); + mm(['foooofofx'], '*(f*(o))', []); + mm(['foooxfooxfoxfooox'], '*(f*(o)x)', ['foooxfooxfoxfooox']); + mm(['foooxfooxfxfooox'], '*(f*(o)x)', ['foooxfooxfxfooox']); + mm(['foooxfooxofoxfooox'], '*(f*(o)x)', []); + mm(['foot'], '@(!(z*)|*x)', ['foot']); + mm(['foox'], '@(!(z*)|*x)', ['foox']); + mm(['mad.moo.cow'], '!(*.*).!(*.*)', []); + mm(['moo.cow', 'moo', 'cow'], '.!(*.*)', []); + mm(['ofoofo'], '*(of+(o))', ['ofoofo']); + mm(['ofoofo'], '*(of+(o)|f)', ['ofoofo']); + mm(['ofooofoofofooo'], '*(f*(o))', []); + mm(['ofoooxoofxo'], '*(*(of*(o)x)o)', ['ofoooxoofxo']); + mm(['ofoooxoofxoofoooxoofxo'], '*(*(of*(o)x)o)', ['ofoooxoofxoofoooxoofxo']); + mm(['ofoooxoofxoofoooxoofxofo'], '*(*(of*(o)x)o)', []); + mm(['ofoooxoofxoofoooxoofxoo'], '*(*(of*(o)x)o)', ['ofoooxoofxoofoooxoofxoo']); + mm(['ofoooxoofxoofoooxoofxooofxofxo'], '*(*(of*(o)x)o)', ['ofoooxoofxoofoooxoofxooofxofxo']); + mm(['ofxoofxo'], '*(*(of*(o)x)o)', ['ofxoofxo']); + mm(['oofooofo'], '*(of|oof+(o))', ['oofooofo']); + mm(['ooo'], '!(f)', ['ooo']); + mm(['ooo'], '*(!(f))', ['ooo']); + mm(['ooo'], '+(!(f))', ['ooo']); + mm(['oxfoxfox'], '*(oxf+(ox))', []); + mm(['oxfoxoxfox'], '*(oxf+(ox))', ['oxfoxoxfox']); + mm(['xfoooofof'], '*(f*(o))', []); + mm(['zoot'], '@(!(z*)|*x)', []); + mm(['zoox'], '@(!(z*)|*x)', ['zoox']); + }); + + it('should support basic wildmatch features', function() { + assert(!mm.isMatch('foo', '*f')); + assert(!mm.isMatch('foo', '??')); + assert(!mm.isMatch('foo', 'bar')); + assert(!mm.isMatch('foobar', 'foo\\*bar')); + assert(!mm.isMatch('abc', '\\a\\b\\c')); + assert(!mm.isMatch('', '')); + assert(mm.isMatch('?a?b', '\\??\\?b')); + assert(mm.isMatch('aaaaaaabababab', '*ab')); + assert(mm.isMatch('\\x\\y\\z', '\\x\\y\\z')); + assert(mm.isMatch('/x/y/z', '/x/y/z')); + assert(mm.isMatch('f\\oo', 'f\\oo')); + assert(mm.isMatch('foo', '*')); + assert(mm.isMatch('foo', '*foo*')); + assert(mm.isMatch('foo', '???')); + assert(mm.isMatch('foo', 'f*')); + assert(mm.isMatch('foo', 'foo')); + assert(mm.isMatch('foo*', 'foo\\*', {unixify: false})); + assert(mm.isMatch('foobar', '*ob*a*r*')); + }); + + it('Test recursion and the abort code', function() { + assert(mm.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*')); + assert(!mm.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*')); + assert(!mm.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-/-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*')); + assert(mm.isMatch('XXX/adobe/courier/bold/o/normal//12/120/75/75/m/70/iso8859/1', 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*', {unixify: false})); + assert(!mm.isMatch('XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1', 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*')); + assert(mm.isMatch('abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt', '**/*a*b*g*n*t')); + assert(!mm.isMatch('abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz', '**/*a*b*g*n*t')); + assert(!mm.isMatch('foo', '*/*/*')); + assert(!mm.isMatch('foo/bar', '*/*/*')); + assert(mm.isMatch('foo/bba/arr', '*/*/*')); + assert(!mm.isMatch('foo/bb/aa/rr', '*/*/*')); + assert(mm.isMatch('foo/bb/aa/rr', '**/**/**')); + assert(mm.isMatch('abcXdefXghi', '*X*i')); + assert(!mm.isMatch('ab/cXd/efXg/hi', '*X*i')); + assert(mm.isMatch('ab/cXd/efXg/hi', '*/*X*/*/*i')); + assert(mm.isMatch('ab/cXd/efXg/hi', '**/*X*/**/*i')); + }); + + it('Test pathName option', function() { + assert(!mm.isMatch('ab/cXd/efXg/hi', '*Xg*i')); + assert(!mm.isMatch('foo', '*/*/*')); + assert(!mm.isMatch('foo', 'fo')); + assert(!mm.isMatch('foo/bar', '*/*/*')); + assert(!mm.isMatch('foo/bar', 'foo?bar')); + assert(!mm.isMatch('foo/bb/aa/rr', '*/*/*')); + assert(!mm.isMatch('foo/bba/arr', 'foo*')); + assert(!mm.isMatch('foo/bba/arr', 'foo**')); + assert(!mm.isMatch('foo/bba/arr', 'foo/*')); + assert(!mm.isMatch('foo/bba/arr', 'foo/**arr')); + assert(!mm.isMatch('foo/bba/arr', 'foo/**z')); + assert(!mm.isMatch('foo/bba/arr', 'foo/*arr')); + assert(!mm.isMatch('foo/bba/arr', 'foo/*z')); + assert(mm.isMatch('ab/cXd/efXg/hi', '*/*X*/*/*i')); + assert(mm.isMatch('abcXdefXghi', '*X*i')); + assert(mm.isMatch('foo', 'foo')); + assert(mm.isMatch('foo/bar', 'foo/*')); + assert(mm.isMatch('foo/bar', 'foo/bar')); + assert(mm.isMatch('foo/bar', 'foo[/]bar')); + assert(mm.isMatch('foo/bba/arr', '*/*/*')); + assert(mm.isMatch('foo/bba/arr', 'foo/**')); + }); +}); diff --git a/test/filter.js b/test/filter.js deleted file mode 100644 index a57a1f3c..00000000 --- a/test/filter.js +++ /dev/null @@ -1,64 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = ref.minimatch; -} - -var arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]; - -describe('.filter()', function() { - it('should throw on undefined args:', function() { - (function() { - mm.filter(); - }).should.throw('micromatch.filter(): patterns should be a string or array.'); - }); - - it('should throw on bad args:', function() { - (function() { - mm.filter({}); - }).should.throw('micromatch.filter(): patterns should be a string or array.'); - }); - - it('should create a filter function to filter files', function() { - mm.filter('*').should.be.a.Function(); - }); - - it('should return an empty array when no pattern is passed:', function() { - mm.filter('*')().should.eql([]); - }); - - it('should filter files', function() { - ['a', 'b', 'c'].filter(mm.filter('*')).should.eql(['a', 'b', 'c']); - ['a/a', 'b/a', 'a/c'].filter(mm.filter('a/*')).should.eql(['a/a', 'a/c']); - }); - - it('should filter using multiple patterns', function() { - var actual_A = arr.filter(mm.filter(['{1..10}', '![7-9]', '!{3..4}'])); - actual_A.should.eql([1, 2, 5, 6, 10]); - actual_A.should.not.eql([1, 2, 3, 4, 5, 6, 10]); - - // see https://github.com/jonschlinkert/micromatch/issues/7 - var actual_B = [ - 'fs-readdir-callback-api.js', - 'fs-readdir-stream-api.js', - 'glob-stream.js', - 'readdirp-callback-api.js', - 'readdirp-stream-api.js', - 'recursive-readdir.js' - ].filter(mm.filter(['*', '!*api*'])); - actual_B.should.eql(['glob-stream.js', 'recursive-readdir.js']); - }); -}); - diff --git a/test/fixtures/a/b/c/d/e/z.js b/test/fixtures/a/b/c/d/e/z.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/a/b/c/d/z.js b/test/fixtures/a/b/c/d/z.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/a/b/c/z.js b/test/fixtures/a/b/c/z.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/a/b/z.js b/test/fixtures/a/b/z.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/a/z.js b/test/fixtures/a/z.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/ax b/test/fixtures/ax deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/b b/test/fixtures/b deleted file mode 100644 index e69de29b..00000000 diff --git a/test/fixtures/dotglob.txt b/test/fixtures/dotglob.txt new file mode 100644 index 00000000..67a8c882 --- /dev/null +++ b/test/fixtures/dotglob.txt @@ -0,0 +1,19 @@ +f a/b/.x **/.x/** +f .x **/.x/** +t .x/ **/.x/** +t .x/a **/.x/** +t .x/a/b **/.x/** +f .x/.x **/.x/** +f a/.x **/.x/** + +t a/b/.x/c **/.x/** +t a/b/.x/c/d **/.x/** +t a/b/.x/c/d/e **/.x/** +t a/b/.x/ **/.x/** +t a/.x/b **/.x/** +f a/.x/b/.x/c **/.x/** + +f .bashrc ?bashrc + +t .bar.baz/ .*.* +t .bar.baz .*.* diff --git a/test/fixtures/extglob b/test/fixtures/extglob new file mode 100644 index 00000000..16412f8e --- /dev/null +++ b/test/fixtures/extglob @@ -0,0 +1,322 @@ + +f foooofof *(f+(o)) +f foooofofx *(f*(o)) +f foooxfooxofoxfooox *(f*(o)x) +f ofooofoofofooo *(f*(o)) +f xfoooofof *(f*(o)) +f ofoooxoofxoofoooxoofxofo *(*(of*(o)x)o) +t ffo *(f*(o)) +t fofo *(f*(o)) +t fooofoofofooo *(f*(o)) +t foooofo *(f*(o)) +t foooofof *(f*(o)) +t foooxfooxfoxfooox *(f*(o)x) +t foooxfooxfxfooox *(f*(o)x) +t ofoooxoofxo *(*(of*(o)x)o) +t ofoooxoofxoofoooxoofxo *(*(of*(o)x)o) +t ofoooxoofxoofoooxoofxoo *(*(of*(o)x)o) +t ofoooxoofxoofoooxoofxooofxofxo *(*(of*(o)x)o) +t ofxoofxo *(*(of*(o)x)o) +t ofxoofxo *(*(of*(o)x)o) + +t aac *(@(a))a@(c) +t ac *(@(a))a@(c) +f c *(@(a))a@(c) +t aaac *(@(a))a@(c) +f baaac *(@(a))a@(c) +t abcd ?@(a|b)*@(c)d +t abcd @(ab|a*@(b))*(c)d +t acd @(ab|a*(b))*(c)d +t abbcd @(ab|a*(b))*(c)d +t effgz @(b+(c)d|e*(f)g?|?(h)i@(j|k)) +t efgz @(b+(c)d|e*(f)g?|?(h)i@(j|k)) +t egz @(b+(c)d|e*(f)g?|?(h)i@(j|k)) +t egzefffgzbcdij *(b+(c)d|e*(f)g?|?(h)i@(j|k)) +f egz @(b+(c)d|e+(f)g?|?(h)i@(j|k)) +t ofoofo *(of+(o)) +t oxfoxoxfox *(oxf+(ox)) +f oxfoxfox *(oxf+(ox)) +t ofoofo *(of+(o)|f) +# The following is supposed to match only as fo+ofo+ofo +t foofoofo @(foo|f|fo)*(f|of+(o)) +t oofooofo *(of|oof+(o)) +t fffooofoooooffoofffooofff *(*(f)*(o)) +# The following tests backtracking in alternation matches +t fofoofoofofoo *(fo|foo) +# Exclusion +t foo !(x) +t foo !(x)* +f foo !(foo) +t foobar !(foo) + +t foo !(foo)* +t bar !(foo)* +t baz !(foo)* +t foobar !(foo)* + +t moo.cow !(*.*).!(*.*) +f mad.moo.cow !(*.*).!(*.*) +f moo .!(*.*) +f cow .!(*.*) +f moo.cow .!(*.*) +f mad.moo.cow .!(*.*) +f mucca.pazza mu!(*(c))?.pa!(*(z))? + +t fff !(f) +t ooo !(f) +t foo !(f) +f f !(f) + +t fff *(!(f)) +t ooo *(!(f)) +t foo *(!(f)) +f f *(!(f)) + +t fff +(!(f)) +t ooo +(!(f)) +t foo +(!(f)) +f f +(!(f)) + +t foot @(!(z*)|*x) +f zoot @(!(z*)|*x) +t foox @(!(z*)|*x) +t zoox @(!(z*)|*x) +t foo *(!(foo)) +f foob !(foo)b* +t foobb !(foo)b* + +f a.b !(*.*) +t abb !(*.*) +t ab !(*.*) + +f a.a !(*.a|*.b|*.c) +t a.abcd !(*.a|*.b|*.c) +t a.c.d !(*.a|*.b|*.c) +t a. !(*.a|*.b|*.c) +t d.d !(*.a|*.b|*.c) +t e.e !(*.a|*.b|*.c) +t f.f !(*.a|*.b|*.c) +f f.a !(*.a|*.b|*.c) + +t a.abcd *!(.a|.b|.c) +t a.c.d *!(.a|.b|.c) +t a. *!(.a|.b|.c) +t d.d *!(.a|.b|.c) +t e.e *!(.a|.b|.c) +t f.f *!(.a|.b|.c) +t f.a *!(.a|.b|.c) + +t a.abcd *.!(a|b|c) +t a.c.d *.!(a|b|c) +t a. *.!(a|b|c) +t d.d *.!(a|b|c) +t e.e *.!(a|b|c) +t f.f *.!(a|b|c) +f f.a *.!(a|b|c) + +f abd a!(@(b|B))d +t acd a!(@(b|B))d + +f ab a!(@(b|B)) +f aB a!(@(b|B)) +t ab] a!(@(b|B)) +t aBc a!(@(b|B)) +t abd a!(@(b|B)) +t ac a!(@(b|B)) +t acd a!(@(b|B)) + +f a (a) +t a *(a) +t a +(a) +f a !(a) +t aa !(a) +f aa @(a)b +f aab @(c)b + +f ab a(*b +t a(b a(*b +t a((b a(*b +t a((((b a(*b + +t a ? +f aa ? +f aab ? + +f a (b) +t a ?(a|b) +t a a?(a|b) +f a b?(a|b) +t ba b?(a|b) +f bb a?(a|b) +f aa ? +f aab ? + +f a ?? +t aa ?? +f aab ?? + +f a a??b +f aa a??b +f aab a??b +t aaab a??b + +t a a?(x) + +t foo.js.js *.!(js) +t foo.js.js *.!(js)* +f foo.js.js *.!(js)+ +f foo.js.js *.!(js)*.!(js) + +f a.js *.!(js) +t a.js.js *.!(js) +f c.js *.!(js) +t a.md *.!(js) +t d.js.d *.!(js) + +f a.js !(*.js) +f a.js.js !(*.js) +f c.js !(*.js) +t a.md !(*.js) +t d.js.d !(*.js) + +t a.js *!(.js) +t a.js.js *!(.js) +t c.js *!(.js) +t a.md *!(.js) +t d.js.d *!(.js) + +t a.a *!(.a|.b|.c) +t a.b *!(.a|.b|.c) +t a.c *!(.a|.b|.c) +t a.c.d *!(.a|.b|.c) +t c.c *!(.a|.b|.c) +t a. *!(.a|.b|.c) +t d.d *!(.a|.b|.c) +t e.e *!(.a|.b|.c) +t f.f *!(.a|.b|.c) +t a.abcd *!(.a|.b|.c) + +t *(a|b[) *(a|b\\[) + +t parse.y !(*.c|*.h|Makefile.in|config*|README) +f shell.c !(*.c|*.h|Makefile.in|config*|README) +t Makefile !(*.c|*.h|Makefile.in|config*|README) +f Makefile.in !(*.c|*.h|Makefile.in|config*|README) + +f a.a *.!(a) +t a.b *.!(a) +t a.a.a *.!(a) +f c.a *.!(a) +t a. *.!(a) +t d.a.d *.!(a) + +f ax a?(b*) +t ax ?(a*|b) + + +t ab ab**(e|f) +t abcdef ab**(e|f) +t abef ab**(e|f) +t abcfef ab**(e|f) + +f ab ab**(e|f)g +f abcdef ab**(e|f)g +f abef ab**(e|f)g +f abcfef ab**(e|f)g + +f ab ab*+(e|f) +t abcdef ab*+(e|f) +t abef ab*+(e|f) +t abcfef ab*+(e|f) + +f ab ab*d+(e|f) +t abcdef ab*d+(e|f) +f abef ab*d+(e|f) +f abcfef ab*d+(e|f) + +f ab ab?*(e|f) +f abcdef ab?*(e|f) +t abef ab?*(e|f) +t abcfef ab?*(e|f) + +f 123abc ab?*(e|f) +f ab ab?*(e|f) +f abcdef ab?*(e|f) +f abcfefg ab?*(e|f) +t abef ab?*(e|f) +t abcfef ab?*(e|f) +t abd ab?*(e|f) +f acd ab?*(e|f) + +f 123abc ab*d+(e|f) +f ab ab*d+(e|f) +t abcdef ab*d+(e|f) +f abcfefg ab*d+(e|f) +f abef ab*d+(e|f) +f abcfef ab*d+(e|f) +f abd ab*d+(e|f) +f acd ab*d+(e|f) + +f ab (a+|b)+ +f abcdef (a+|b)+ +f abcfefg (a+|b)+ +f abef (a+|b)+ +f abcfef (a+|b)+ +f abd (a+|b)+ +f acd (a+|b)+ + +f b (a+|b)* +f zz (a+|b)* +f abcdef (a+|b)* +f abcfefg (a+|b)* +f abef (a+|b)* +f abcfef (a+|b)* +f abd (a+|b)* +f acd (a+|b)* + +f a.a !(*[a-b].[a-b]*) +f a.b !(*[a-b].[a-b]*) +f a.a.a !(*[a-b].[a-b]*) +t c.a !(*[a-b].[a-b]*) +t d.a.d !(*[a-b].[a-b]*) +f a.bb !(*[a-b].[a-b]*) +t a.ccc !(*[a-b].[a-b]*) +t c.ccc !(*[a-b].[a-b]*) + +f a.a !(*.[a-b]*) +f a.b !(*.[a-b]*) +f a.a.a !(*.[a-b]*) +f c.a !(*.[a-b]*) +f d.a.d !(*.[a-b]*) +f a.bb !(*.[a-b]*) +t a.ccc !(*.[a-b]*) +t c.ccc !(*.[a-b]*) + +f a.a !*.(a|b) +f a.b !*.(a|b) +f a.a.a !*.(a|b) +f c.a !*.(a|b) +f d.a.d !*.(a|b) +f a.bb !*.(a|b) +f a.ccc !*.(a|b) + +f a.a !*.(a|b)* +f a.b !*.(a|b)* +f a.a.a !*.(a|b)* +f c.a !*.(a|b)* +f d.a.d !*.(a|b)* +f a.bb !*.(a|b)* +f a.ccc !*.(a|b)* + +f a.a (a|d).(a|b)* +f a.b (a|d).(a|b)* +f a.bb (a|d).(a|b)* + +f a.a *.+(b|d) +t a.b *.+(b|d) +f a.a.a *.+(b|d) +f c.a *.+(b|d) +f a. *.+(b|d) +t d.a.d *.+(b|d) +t a.bb *.+(b|d) +f a.ccc *.+(b|d) diff --git a/test/fixtures/glob.txt b/test/fixtures/glob.txt new file mode 100644 index 00000000..60e76fb9 --- /dev/null +++ b/test/fixtures/glob.txt @@ -0,0 +1,81 @@ +f a/b/.x **/.x/** +f .x **/.x/** +t .x/ **/.x/** +t .x/a **/.x/** +t .x/a/b **/.x/** +f .x/.x **/.x/** +f a/.x **/.x/** + +t a/b/.x/c **/.x/** +t a/b/.x/c/d **/.x/** +t a/b/.x/c/d/e **/.x/** +t a/b/.x/ **/.x/** +t a/.x/b **/.x/** +f a/.x/b/.x/c **/.x/** + +t a/c/b a/*/b +f a/.d/b a/*/b +f a/./b a/*/b +f a/../b a/*/b + +t ab ab** +t abcdef ab** +t abef ab** +t abcfef ab** + +f ab ab***ef +t abcdef ab***ef +t abef ab***ef +t abcfef ab***ef + +f .bashrc ?bashrc + +f abbc ab?bc +f abc ab?bc + +t a.a [a-d]*.[a-b] +t a.b [a-d]*.[a-b] +t c.a [a-d]*.[a-b] +t a.a.a [a-d]*.[a-b] +t a.a.a [a-d]*.[a-b]*.[a-b] + +t a.a *.[a-b] +t a.b *.[a-b] +t a.a.a *.[a-b] +t c.a *.[a-b] +f d.a.d *.[a-b] +f a.bb *.[a-b] +f a.ccc *.[a-b] +f c.ccc *.[a-b] + +t a.a *.[a-b]* +t a.b *.[a-b]* +t a.a.a *.[a-b]* +t c.a *.[a-b]* +t d.a.d *.[a-b]* +f d.a.d *.[a-b]*.[a-b]* +t d.a.d *.[a-d]*.[a-d]* +t a.bb *.[a-b]* +f a.ccc *.[a-b]* +f c.ccc *.[a-b]* + +t a.a *[a-b].[a-b]* +t a.b *[a-b].[a-b]* +t a.a.a *[a-b].[a-b]* +f c.a *[a-b].[a-b]* +f d.a.d *[a-b].[a-b]* +t a.bb *[a-b].[a-b]* +f a.ccc *[a-b].[a-b]* +f c.ccc *[a-b].[a-b]* + +t abd [a-y]*[^c] +t abe [a-y]*[^c] +t bb [a-y]*[^c] +t bcd [a-y]*[^c] +t ca [a-y]*[^c] +t cb [a-y]*[^c] +t dd [a-y]*[^c] +t de [a-y]*[^c] +t bdir/ [a-y]*[^c] + +t abd **/* diff --git a/test/fixtures/globstar.txt b/test/fixtures/globstar.txt new file mode 100644 index 00000000..b3867594 --- /dev/null +++ b/test/fixtures/globstar.txt @@ -0,0 +1,30 @@ +t a.js **/*.js +t a/a.js **/*.js +t a/a/b.js **/*.js + +t a/b/z.js a/b/**/*.js +t a/b/c/z.js a/b/**/*.js + +t foo.md **/*.md +t foo/bar.md **/*.md + +t foo/bar foo/**/bar +t foo/bar foo/**bar + +t ab/a/d **/* +t ab/b **/* +t a/b/c/d/a.js **/* +t a/b/c.js **/* +t a/b/c.txt **/* +f a/b/.js/c.txt **/* +t a.js **/* +t za.js **/* +t ab **/* +t a.b **/* + +t foo/ foo/**/ +f foo/bar foo/**/ +f foo/bazbar foo/**/ +f foo/barbar foo/**/ +f foo/bar/baz/qux foo/**/ +t foo/bar/baz/qux/ foo/**/ diff --git a/test/fixtures/negation b/test/fixtures/negation new file mode 100644 index 00000000..7b55d328 --- /dev/null +++ b/test/fixtures/negation @@ -0,0 +1,13 @@ +f a/b.js !**/*.md +f a.js !**/*.md +f a/b.md !**/*.md +f a.md !**/*.md + +f a/b.js !*.md +f a.js !*.md +f a/b.md !*.md +f a.md !*.md + +f a.js !**/*.md +f b.md !**/*.md +f c.txt !**/*.md \ No newline at end of file diff --git a/test/fixtures/patterns.js b/test/fixtures/patterns.js new file mode 100644 index 00000000..c4f715d6 --- /dev/null +++ b/test/fixtures/patterns.js @@ -0,0 +1,272 @@ +'use strict'; + +/** + * The contents of this file was copied (and modified) from: + * minimatch v3.0.3, ISC LICENSE, Copyright (c) Isaac Z. Schlueter and Contributors + * https://github.com/isaacs/minimatch + */ + +var fixtures = ['a', 'b', 'c', 'd', 'abc', 'abd', 'abe', 'bb', 'bcd', 'ca', 'cb', 'dd', 'de', 'bdir/', 'bdir/cfile']; + +// pattern | expected | options | fixtures +module.exports = [ + 'http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test', + ['a*', ['a', 'abc', 'abd', 'abe']], + ['X*', ['X*'], {nonull: true}], + + 'allow null glob expansion', + ['X*', []], + + 'micromatch has same results as Bash. Minimatch does this differently', + ['\\*', ['\\*'], {nonull: true}], + ['\\**', ['\\**'], {nonull: true}], + ['\\*\\*', ['\\*\\*'], {nonull: true}], + + ['b*/', ['bdir/']], + ['c*', ['c', 'ca', 'cb']], + ['**', fixtures], + + ['\\.\\./*/', ['\\.\\./*/'], {nonull: true}], + ['s/\\..*//', ['s/\\..*//'], {nonull: true}], + + 'legendary larry crashes bashes', + ['/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/', + ['/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\\1/'], {nonull: true, bash: {skip: true}}], + ['/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\u0001/', + ['/^root:/{s/^[^:]*:[^:]*:\([^:]*\).*$/\u0001/'], {nonull: true, bash: {skip: true}}], + + /** + * Character classes + */ + + 'character classes', + ['[a-c]b*', ['abc', 'abd', 'abe', 'bb', 'cb']], + ['[a-y]*[^c]', ['abd', 'abe', 'bb', 'bcd', 'bdir/', 'ca', 'cb', 'dd', 'de'], {bash: true}], + ['a*[^c]', ['abd', 'abe']], + function() { + fixtures.push('a-b', 'aXb'); + }, + ['a[X-]b', ['a-b', 'aXb']], + function() { + fixtures.push('.x', '.y'); + }, + ['[^a-c]*', ['d', 'dd', 'de']], + function() { + fixtures.push('a*b/', 'a*b/ooo', 'ab/ooo'); + }, + + 'trailing slashes', + ['a*b/*', ['ab/ooo', 'a*b/ooo']], + ['a*?/*', ['ab/ooo', 'a*b/ooo']], + ['a\\*b/*', ['a*b/ooo']], + ['a\\*?/*', ['a*b/ooo']], + ['*\\\\!*', [], {null: true}, ['echo !7']], + ['*\\!*', ['echo !7'], null, ['echo !7']], + ['*.\\*', ['r.*'], null, ['r.*']], + ['a[b]c', ['abc']], + ['a[\\\\b]c', ['abc']], + ['a?c', ['abc']], + ['a\\*c', [], {null: true}, ['abc']], + ['', [''], { null: true }, ['']], + + /** + * Bash tests + */ + + 'http://www.opensource.apple.com/source/bash/bash-23/bash/tests/glob-test', + function() { + fixtures.push('man/', 'man/man1/', 'man/man1/bash.1'); + }, + ['*/man*/bash.*', ['man/man1/bash.1']], + ['man/man1/bash.1', ['man/man1/bash.1']], + ['a***c', ['abc'], null, ['abc']], + ['a*****?c', ['abc'], null, ['abc']], + ['?*****??', ['abc'], null, ['abc']], + ['*****??', ['abc'], null, ['abc']], + ['?*****?c', ['abc'], null, ['abc']], + ['?***?****c', ['abc'], null, ['abc']], + ['?***?****?', ['abc'], null, ['abc']], + ['?***?****', ['abc'], null, ['abc']], + ['*******c', ['abc'], null, ['abc']], + ['*******?', ['abc'], null, ['abc']], + ['a*cd**?**??k', ['abcdecdhjk'], null, ['abcdecdhjk']], + ['a**?**cd**?**??k', ['abcdecdhjk'], null, ['abcdecdhjk']], + ['a**?**cd**?**??k***', ['abcdecdhjk'], null, ['abcdecdhjk']], + ['a**?**cd**?**??***k', ['abcdecdhjk'], null, ['abcdecdhjk']], + ['a**?**cd**?**??***k**', ['abcdecdhjk'], null, ['abcdecdhjk']], + ['a****c**?**??*****', ['abcdecdhjk'], null, ['abcdecdhjk']], + ['[-abc]', ['-'], null, ['-']], + ['[abc-]', ['-'], null, ['-']], + ['[[]', ['['], null, ['[']], + ['[', ['['], null, ['[']], + ['[*', ['[abc'], null, ['[abc']], + + 'a right bracket shall lose its special meaning and represent itself in a bracket expression if it occurs first in the list. -- POSIX.2 2.8.3.2', + ['[]]', [']'], null, [']']], + ['[]-]', [']'], null, [']']], + ['[a-\z]', ['p'], null, ['p']], + ['??**********?****?', [], { null: true }, ['abc']], + ['??**********?****c', [], { null: true }, ['abc']], + ['?************c****?****', [], { null: true }, ['abc']], + ['*c*?**', [], { null: true }, ['abc']], + ['a*****c*?**', [], { null: true }, ['abc']], + ['a********???*******', [], { null: true }, ['abc']], + ['[]', [], { null: true }, ['a']], + ['[abc', [], { null: true }, ['[']], + + 'nocase tests', + ['XYZ', ['xYz'], { nocase: true, null: true }, + ['xYz', 'ABC', 'IjK']], + [ + 'ab*', + ['ABC'], + { nocase: true, null: true }, + ['xYz', 'ABC', 'IjK'] + ], + [ + '[ia]?[ck]', + ['ABC', 'IjK'], + { nocase: true, null: true }, + ['xYz', 'ABC', 'IjK'] + ], + + 'braces: onestar/twostar', + ['{/*,*}', [], {null: true}, ['/asdf/asdf/asdf']], + ['{/?,*}', ['/a', 'bb'], {null: true}, ['/a', '/b/b', '/a/b/c', 'bb']], + + 'dots should not match unless requested', + ['**', ['a/b'], {}, ['a/b', 'a/.d', '.a/.d']], + + // .. and . can only match patterns starting with ., + // even when options.dot is set. + function() { + fixtures = ['a/./b', 'a/../b', 'a/c/b', 'a/.d/b']; + }, + ['a/*/b', ['a/c/b', 'a/.d/b'], {dot: true}], + ['a/*/b', ['a/c/b'], {dot: false}], + + ['a/.*/b', ['a/./b', 'a/../b', 'a/.d/b'], {dot: true}], + ['a/.*/b', ['a/./b', 'a/../b', 'a/.d/b'], {dot: false}], + + // this also tests that changing the options needs + // to change the cache key, even if the pattern is + // the same! + ['**', + ['a/b', 'a/.d', '.a/.d'], + { dot: true }, + [ '.a/.d', 'a/.d', 'a/b'] + ], + + // '~~paren sets cannot contain slashes~~', + // 'paren sets _can_ contain slashes', + ['*(a/b)', ['a/b'], {}, ['a/b']], + + // brace sets trump all else. + // + // invalid glob pattern. fails on bash4 and bsdglob. + // however, in this implementation, it's easier just + // to do the intuitive thing, and let brace-expansion + // actually come before parsing any extglob patterns, + // like the documentation seems to say. + // + // XXX: if anyone complains about this, either fix it + // or tell them to grow up and stop complaining. + // + // bash/bsdglob says this: + // ["*(a|{b),c)}", ["*(a|{b),c)}"], {}, ["a", "ab", "ac", "ad"]], + // but we do this instead: + ['*(a|{b),c)}', ['a', 'ab', 'ac'], {expand: true}, ['a', 'ab', 'ac', 'ad']], + + // test partial parsing in the presence of comment/negation chars + ['[!a*', ['[!ab'], {}, ['[!ab', '[ab']], + + // like: {a,b|c\\,d\\\|e} except it's unclosed, so it has to be escaped. + // [ + // '+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g', + // ['+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g'], + // {}, + // ['+(a|b\\|c\\\\|d\\\\|e\\\\\\\\|f\\\\\\\\|g', 'a', 'b\\c'] + // ], + + // crazy nested {,,} and *(||) tests. + function () { + fixtures = [ + 'a', 'b', 'c', 'd', 'ab', 'ac', 'ad', 'bc', 'cb', 'bc,d', + 'c,db', 'c,d', 'd)', '(b|c', '*(b|c', 'b|c', 'b|cc', 'cb|c', + 'x(a|b|c)', 'x(a|c)', '(a|b|c)', '(a|c)' + ] + }, + ['*(a|{b,c})', ['a', 'b', 'c', 'ab', 'ac'], {expand: true}], + // ['{a,*(b|c,d)}', ['a', '(b|c', '*(b|c', 'd)'], {expand: true}], //<= minimatch (wrong) + ['{a,*(b|c,d)}', ['a', 'b', 'bc,d', 'c,db', 'c,d'], {expand: true}], + + // a + // *(b|c) + // *(b|d) + ['{a,*(b|{c,d})}', ['a', 'b', 'bc', 'cb', 'c', 'd'], {expand: true}], + ['*(a|{b|c,c})', ['a', 'b', 'c', 'ab', 'ac', 'bc', 'cb']], + ['*(a|{b|c,c})', ['a', 'b', 'c', 'ab', 'ac', 'bc', 'cb'], {expand: true}], + + // test various flag settings. + + ['a?b', ['acb', 'acb/'], {}, ['x/y/acb', 'acb', 'acb/', 'acb/d/e']], + ['a?b', ['x/y/acb', 'acb/', 'acb'], {matchBase: true}, ['x/y/acb', 'acb', 'acb/', 'acb/d/e']], + + // begin channelling Boole and deMorgan... + 'negation tests', + function() { + fixtures = ['d', 'e', '!ab', '!abc', 'a!b']; + }, + + // anything that is NOT a* matches. + ['!a*', ['d', 'e', '!ab', '!abc']], + + // anything that IS !a* matches. + ['!a*', ['!ab', '!abc'], {nonegate: true}], + + // anything that IS a* matches + ['a*', ['a!b']], + + // anything that is NOT !a* matches + ['!\\!a*', ['a!b', 'd', 'e']], + + // negation nestled within a pattern + function() { + fixtures = [ + 'foo.js', + 'foo.bar', + 'foo.js.js', + 'blar.js', + 'foo.', + 'boo.js.boo' + ]; + }, + // last one is tricky! * matches foo, . matches ., and 'js.js' != 'js' + // copy bash 4.3 behavior on this. + + 'https://github.com/isaacs/minimatch/issues/5', + function() { + fixtures = [ + 'a/b/.x/c', 'a/b/.x/c/d', 'a/b/.x/c/d/e', 'a/b/.x', 'a/b/.x/', + 'a/.x/b', '.x', '.x/', '.x/a', '.x/a/b', 'a/.x/b/.x/c', '.x/.x' + ]; + }, + [ + '**/.x/**', + [ + '.x/', '.x/a', '.x/a/b', 'a/.x/b', 'a/b/.x/', 'a/b/.x/c', + 'a/b/.x/c/d', 'a/b/.x/c/d/e' + ] + ], + + 'https://github.com/isaacs/minimatch/issues/59', + ['[z-a]', []], + ['a/[2015-03-10T00:23:08.647Z]/z', []], + ['[a-0][a-\u0100]', []] +]; + +Object.defineProperty(module.exports, 'fixtures', { + get: function() { + return fixtures; + } +}); diff --git a/test/fixtures/z.js b/test/fixtures/z.js deleted file mode 100644 index e69de29b..00000000 diff --git a/test/glob.js b/test/glob.js deleted file mode 100644 index 6599185b..00000000 --- a/test/glob.js +++ /dev/null @@ -1,120 +0,0 @@ -'use strict'; - -var assert = require('assert'); -var Glob = require('../lib/glob'); -var mm = require('..'); - -describe('Glob class', function() { - describe('constructor', function() { - it('should return an instance of Glob', function() { - var glob = new Glob('foo'); - assert(glob instanceof Glob); - }); - - it('should instantiate without new', function() { - var glob = Glob('foo'); - assert(glob instanceof Glob); - }); - }); - - describe('instance', function() { - it('should expose `orig`', function() { - var glob = new Glob('!foo'); - assert.equal(glob.orig, '!foo'); - }); - - it('should expose `pattern`', function() { - var glob = new Glob('!foo'); - assert.equal(glob.pattern, 'foo'); - }); - - it('should expose `options`', function() { - var glob = new Glob('!foo'); - assert(glob.options); - assert(typeof glob.options === 'object'); - }); - }); - - describe('tokens', function() { - it('should parse a glob pattern and expose a tokens object', function() { - var glob = new Glob('!foo'); - glob.parse(); - assert(glob.hasOwnProperty('tokens')); - assert(glob.tokens.hasOwnProperty('is')); - }); - - it('should recognize extglob patterns', function() { - var glob = new Glob('@(a|b)'); - glob.parse(); - assert(glob.tokens.is.extglob === true); - }); - }); - - describe('.extglob()', function() { - it('should parse extglob patterns', function() { - var glob = new Glob('@(a|b)'); - glob.parse(); - glob.extglob(); - assert.equal(glob.pattern, '(?:a|b)'); - }); - - it('should ignore non-extglobs', function() { - var glob = new Glob('foo/*.js'); - glob.parse(); - glob.extglob(); - assert.equal(glob.pattern, 'foo/*.js'); - }); - - it('should parse extglob patterns', function() { - var glob = new Glob('@(a|b)', {noextglob: true}); - glob.parse(); - glob.extglob(); - assert.equal(glob.pattern, '@(a|b)'); - }); - }); - - describe('patterns', function() { - it('should escape dots', function() { - var actual = mm.expand('.'); - assert.deepEqual(actual.pattern, '\\.'); - }); - - it('should strip leading !', function() { - var glob = new Glob('!foo'); - assert.deepEqual(glob.pattern, 'foo'); - }); - }); - - describe('options', function() { - describe('options.track', function() { - it('should track history for debugging:', function() { - var actual = mm.expand('**/*.js', {track: true}); - assert(actual.hasOwnProperty('history')); - assert(Array.isArray(actual.history)); - assert(actual.history.length > 1); - }); - }); - - describe('options.nonegate', function() { - it('should ignore negation patterns when `nonegate` is true:', function() { - var array = ['a.js', 'b.js', 'c.js']; - var actual = mm(array, '!*.js', {nonegate: true}); - assert.deepEqual(array, actual); - }); - }); - }); - - describe('leading slash', function() { - it('should match paths with leading slashes:', function() { - var array = ['/a.js', '/b.js', '/c.js']; - var actual = mm(array, '/*.js'); - assert.deepEqual(array, actual); - }); - - it('should match dotfiles with leading slashes:', function() { - var array = ['/.a.js', '/.b.js', '/.c.js']; - var actual = mm(array, '/.*.js'); - assert.deepEqual(array, actual); - }); - }); -}); diff --git a/test/globstars.js b/test/globstars.js new file mode 100644 index 00000000..2452d414 --- /dev/null +++ b/test/globstars.js @@ -0,0 +1,107 @@ +'use strict'; + +var assert = require('assert'); +var mm = require('./support/match'); +var mi = require('minimatch'); + +describe('globstars', function() { + it('should support globstars (**)', function() { + var fixtures = ['.a/a', 'a/a', 'aa/a', 'aaa/a', 'aab/a', 'a/.a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z', 'a/../a', 'ab/../ac', '../a', 'a', '../../b', '../c', '../c/d']; + + mm(fixtures, '**', ['a', 'a/a', 'aa/a', 'aaa/a', 'aab/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(fixtures, '**/**', ['a', 'a/a', 'aa/a', 'aaa/a', 'aab/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(fixtures, '**/', []); + mm(fixtures, '**/**/*', ['a', 'a/a', 'aa/a', 'aaa/a', 'aab/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(fixtures, '**/**/x', ['a/x']); + mm(fixtures, '**/x', ['a/x']); + mm(fixtures, '**/x/*', ['a/x/y']); + mm(fixtures, '*/x/**', ['a/x/y', 'a/x/y/z']); + mm(fixtures, '**/x/**', ['a/x/y', 'a/x/y/z']); + mm(fixtures, '**/x/*/*', ['a/x/y/z']); + mm(fixtures, 'a/**', ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(fixtures, 'a/**/*', ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(fixtures, 'a/**/**/*', ['a/a', 'a/b', 'a/c', 'a/x', 'a/x/y', 'a/x/y/z']); + mm(fixtures, 'b/**', []); + + assert(!mm.isMatch('a/b', 'a/**/')); + assert(!mm.isMatch('a/b/.js/c.txt', '**/*')); + assert(!mm.isMatch('a/b/c/d', 'a/**/')); + assert(!mm.isMatch('a/bb', 'a/**/')); + assert(!mm.isMatch('a/cb', 'a/**/')); + assert(mm.isMatch('/a/b', '/**')); + assert(mm.isMatch('a.b', '**/*')); + assert(mm.isMatch('a.js', '**/*')); + assert(mm.isMatch('a.js', '**/*.js')); + assert(mm.isMatch('a.md', '**/*.md')); + assert(mm.isMatch('a/', 'a/**/')); + assert(mm.isMatch('a/a.js', '**/*.js')); + assert(mm.isMatch('a/a/b.js', '**/*.js')); + assert(mm.isMatch('a/b', 'a/**/b')); + assert(mm.isMatch('a/b', 'a/**b')); + assert(mm.isMatch('a/b.md', '**/*.md')); + assert(mm.isMatch('a/b/c.js', '**/*')); + assert(mm.isMatch('a/b/c.txt', '**/*')); + assert(mm.isMatch('a/b/c/d/', 'a/**/')); + assert(mm.isMatch('a/b/c/d/a.js', '**/*')); + assert(mm.isMatch('a/b/c/z.js', 'a/b/**/*.js')); + assert(mm.isMatch('a/b/z.js', 'a/b/**/*.js')); + assert(mm.isMatch('ab', '**/*')); + assert(mm.isMatch('ab/a/d', '**/*')); + assert(mm.isMatch('ab/b', '**/*')); + assert(mm.isMatch('za.js', '**/*')); + }); + + it('should support multiple globstars in one pattern', function() { + assert(!mm.isMatch('a/b/c/d/e/z/foo.md', 'a/**/j/**/z/*.md')); + assert(!mm.isMatch('a/b/c/j/e/z/foo.txt', 'a/**/j/**/z/*.md')); + assert(mm.isMatch('a/b/c/d/e/j/n/p/o/z/foo.md', 'a/**/j/**/z/*.md')); + assert(mm.isMatch('a/b/c/d/e/z/foo.md', 'a/**/z/*.md')); + assert(mm.isMatch('a/b/c/j/e/z/foo.md', 'a/**/j/**/z/*.md')); + }); + + it('should match dotfiles', function() { + var fixtures = ['.gitignore', 'a/b/z/.dotfile', 'a/b/z/.dotfile.md', 'a/b/z/.dotfile.md', 'a/b/z/.dotfile.md']; + assert(!mm.isMatch('.gitignore', 'a/**/z/*.md')); + assert(!mm.isMatch('a/b/z/.dotfile', 'a/**/z/*.md')); + assert(!mm.isMatch('a/b/z/.dotfile.md', '**/c/.*.md')); + assert(mm.isMatch('a/b/z/.dotfile.md', '**/.*.md')); + assert(mm.isMatch('a/b/z/.dotfile.md', 'a/**/z/.*.md')); + mm(fixtures, 'a/**/z/.*.md', [ 'a/b/z/.dotfile.md' ]); + }); + + it('should match file extensions:', function() { + mm(['.md', 'a.md', 'a/b/c.md', '.txt'], '**/*.md', ['a.md', 'a/b/c.md']); + mm(['.md', 'a/b/.md'], '**/.md', ['.md', 'a/b/.md']); + }); + + it('should respect trailing slashes on paterns', function() { + var fixtures = ['a', 'a/', 'b', 'b/', 'a/a', 'a/a/', 'a/b', 'a/b/', 'a/c', 'a/c/', 'a/x', 'a/x/', 'a/a/a', 'a/a/b', 'a/a/b/', 'a/a/a/', 'a/a/a/a', 'a/a/a/a/', 'a/a/a/a/a', 'a/a/a/a/a/', 'x/y', 'z/z', 'x/y/', 'z/z/', 'a/b/c/.d/e/']; + + console.log(mi.makeRe('**/*/a/')) + console.log(mm.makeRe('(|**/)*/a/')) + var re = mi.makeRe('{,**/}*/a/'); + var res = fixtures.filter(function(p) { + return re.test(p); + }); + console.log(res) + + mm(fixtures, '**/*/a/', ['a/a/', 'a/a/a/', 'a/a/a/a/', 'a/a/a/a/a/']); + mm(fixtures, '**/*/a/*/', ['a/a/a/', 'a/a/a/a/', 'a/a/a/a/a/', 'a/a/b/']); + mm(fixtures, '**/*/x/', ['a/x/']); + mm(fixtures, '**/*/*/*/*/', ['a/a/a/a/', 'a/a/a/a/a/']); + mm(fixtures, '**/*/*/*/*/*/', ['a/a/a/a/a/']); + mm(fixtures, '*a/a/*/', ['a/a/a/', 'a/a/b/']); + mm(fixtures, '**a/a/*/', ['a/a/a/', 'a/a/b/']); + mm(fixtures, '**/a/*/*/', ['a/a/a/', 'a/a/b/', 'a/a/a/a/', 'a/a/a/a/a/']); + mm(fixtures, '**/a/*/*/*/', ['a/a/a/a/', 'a/a/a/a/a/']); + mm(fixtures, '**/a/*/*/*/*/', ['a/a/a/a/a/']); + mm(fixtures, '**/a/*/a/', ['a/a/a/', 'a/a/a/a/', 'a/a/a/a/a/']); + mm(fixtures, '**/a/*/b/', ['a/a/b/']); + }); + + it('should match literal globstars when escaped', function() { + var fixtures = ['.md', '**a.md', '**.md', '.md', '**']; + mm(fixtures, '\\*\\**.md', ['**a.md', '**.md']); + mm(fixtures, '\\*\\*.md', ['**.md']); + }); +}); diff --git a/test/integration.js b/test/integration.js new file mode 100644 index 00000000..f0d773c4 --- /dev/null +++ b/test/integration.js @@ -0,0 +1,15 @@ +'use strict'; + +var mm = require('./support/match'); + +describe('globstars', function() { + it('with char classes', function() { + var fixtures = ['a.b', 'a,b', 'a:b', 'a-b', 'a;b', 'a b', 'a_b']; + mm(fixtures, 'a[^[:alnum:]]b', fixtures); + mm(fixtures, 'a@([^[:alnum:]])b', fixtures); + mm(fixtures, 'a@([-.,:; _])b', fixtures); + + mm(fixtures, 'a@([^x])b', ['a,b', 'a:b', 'a-b', 'a;b', 'a b', 'a_b']); + mm(fixtures, 'a+([^[:alnum:]])b', fixtures); + }); +}); diff --git a/test/isMatch.js b/test/isMatch.js deleted file mode 100644 index 50689365..00000000 --- a/test/isMatch.js +++ /dev/null @@ -1,272 +0,0 @@ -'use strict'; - -require('should'); -var assert = require('assert'); -var argv = require('minimist')(process.argv.slice(2)); -var minimatch = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = minimatch; -} - -describe('.isMatch()', function() { - describe('errors:', function() { - it('should throw on undefined args:', function() { - (function() { - mm.isMatch(); - }).should.throw('micromatch.isMatch(): filepath should be a string.'); - }); - - it('should throw on bad args:', function() { - (function() { - mm.isMatch({}); - }).should.throw('micromatch.isMatch(): filepath should be a string.'); - }); - }); - - it('should work like `matcher` when a pattern and opts is passed', function() { - assert(typeof mm.isMatch('*', {}), 'function'); - assert(mm.isMatch('*', {})('abc'), true); - }); - - it('should escape plus signs to match string literals', function() { - assert(mm.isMatch('a+b/src/glimini.js', 'a+b/src/*.js')); - assert(mm.isMatch('+b/src/glimini.js', '+b/src/*.js')); - assert(mm.isMatch('coffee+/src/glimini.js', 'coffee+/src/*.js')); - assert(mm.isMatch('coffee+/src/glimini.js', 'coffee+/src/*.js')); - assert(mm.isMatch('coffee+/src/glimini.js', 'coffee+/src/*')); - }); - - it('should correctly deal with empty globs', function() { - mm.isMatch('ab', '').should.be.false(); - mm.isMatch('a', '').should.be.false(); - mm.isMatch('.', '').should.be.false(); - }); - - it('should match with non-glob patterns', function() { - mm.isMatch('.', '.').should.be.true(); - mm.isMatch('/a', '/a').should.be.true(); - mm.isMatch('/ab', '/a').should.be.false(); - mm.isMatch('a', 'a').should.be.true(); - mm.isMatch('ab', '/a').should.be.false(); - mm.isMatch('ab', 'a').should.be.false(); - mm.isMatch('ab', 'ab').should.be.true(); - mm.isMatch('abcd', 'cd').should.be.false(); - mm.isMatch('abcd', 'bc').should.be.false(); - mm.isMatch('abcd', 'ab').should.be.false(); - }); - - it('should match file names:', function() { - mm.isMatch('a.b', 'a.b').should.be.true(); - mm.isMatch('a.b', '*.b').should.be.true(); - mm.isMatch('a.b', 'a.*').should.be.true(); - mm.isMatch('a.b', '*.*').should.be.true(); - mm.isMatch('a-b.c-d', 'a*.c*').should.be.true(); - mm.isMatch('a-b.c-d', '*b.*d').should.be.true(); - mm.isMatch('a-b.c-d', '*.*').should.be.true(); - mm.isMatch('a-b.c-d', '*.*-*').should.be.true(); - mm.isMatch('a-b.c-d', '*-*.*-*').should.be.true(); - mm.isMatch('a-b.c-d', '*.c-*').should.be.true(); - mm.isMatch('a-b.c-d', '*.*-d').should.be.true(); - mm.isMatch('a-b.c-d', 'a-*.*-d').should.be.true(); - mm.isMatch('a-b.c-d', '*-b.c-*').should.be.true(); - mm.isMatch('a-b.c-d', '*-b*c-*').should.be.true(); - - // false - mm.isMatch('a-b.c-d', '*-bc-*').should.be.false(); - }); - - it('should match with common glob patterns', function() { - mm.isMatch('/ab', '/*').should.be.true(); - mm.isMatch('/cd', '/*').should.be.true(); - mm.isMatch('ef', '/*').should.be.false(); - mm.isMatch('ab', './*').should.be.false(); - mm.isMatch('ab', '*').should.be.true(); - mm.isMatch('ab', 'ab').should.be.true(); - }); - - it('should match files with the given extension:', function() { - mm.isMatch('.md', '*.md').should.be.false(); - mm.isMatch('.md', '.md').should.be.true(); - mm.isMatch('.c.md', '*.md').should.be.false(); - mm.isMatch('.c.md', '.*.md').should.be.true(); - mm.isMatch('c.md', '*.md').should.be.true(); - mm.isMatch('c.md', '*.md').should.be.true(); - mm.isMatch('a/b/c/c.md', '*.md').should.be.false(); - mm.isMatch('a/b/c.md', 'a/*.md').should.be.false(); - mm.isMatch('a/b/c.md', 'a/*/*.md').should.be.true(); - mm.isMatch('a/b/c.md', '**/*.md').should.be.true(); - mm.isMatch('a/b/c.js', 'a/**/*.*').should.be.true(); - }); - - it('should match wildcards:', function() { - mm.isMatch('a/b/c/z.js', '*.js').should.be.false(); - mm.isMatch('a/b/z.js', '*.js').should.be.false(); - mm.isMatch('a/z.js', '*.js').should.be.false(); - mm.isMatch('z.js', '*.js').should.be.true(); - - mm.isMatch('z.js', 'z*.js').should.be.true(); - mm.isMatch('a/z.js', 'a/z*.js').should.be.true(); - mm.isMatch('a/z.js', '*/z*.js').should.be.true(); - }); - - it('should match globstars:', function() { - mm.isMatch('a/b/c/z.js', '**/*.js').should.be.true(); - mm.isMatch('a/b/z.js', '**/*.js').should.be.true(); - mm.isMatch('a/z.js', '**/*.js').should.be.true(); - mm.isMatch('z.js', '**/*.js').should.be.true(); - mm.isMatch('z.js', '**/z*').should.be.true(); - - mm.isMatch('a/b/c/d/e/z.js', 'a/b/**/*.js').should.be.true(); - mm.isMatch('a/b/c/d/z.js', 'a/b/**/*.js').should.be.true(); - mm.isMatch('a/b/c/z.js', 'a/b/c/**/*.js').should.be.true(); - mm.isMatch('a/b/c/z.js', 'a/b/c**/*.js').should.be.true(); - mm.isMatch('a/b/c/z.js', 'a/b/**/*.js').should.be.true(); - mm.isMatch('a/b/z.js', 'a/b/**/*.js').should.be.true(); - - mm.isMatch('a/z.js', 'a/b/**/*.js').should.be.false(); - mm.isMatch('z.js', 'a/b/**/*.js').should.be.false(); - - // issue #23 - mm.isMatch('zzjs', 'z*.js').should.be.false(); - mm.isMatch('zzjs', '*z.js').should.be.false(); - - // issue #24 - mm.isMatch('a', '**').should.be.true(); - mm.isMatch('a', 'a/**').should.be.false(); - mm.isMatch('a/', '**').should.be.true(); - mm.isMatch('a/b/c/d', '**').should.be.true(); - mm.isMatch('a/b/c/d/', '**').should.be.true(); - mm.isMatch('a/b/c/d/', '**/**').should.be.true(); - mm.isMatch('a/b/c/d/', '**/b/**').should.be.true(); - mm.isMatch('a/b/c/d/', 'a/b/**').should.be.true(); - mm.isMatch('a/b/c/d/', 'a/b/**/').should.be.true(); - mm.isMatch('a/b/c/d/', 'a/b/**/c/**/').should.be.true(); - mm.isMatch('a/b/c/d/', 'a/b/**/c/**/d/').should.be.true(); - mm.isMatch('a/b/c/d/', 'a/b/**/f').should.be.false(); - mm.isMatch('a/b/c/d/e.f', 'a/b/**/**/*.*').should.be.true(); - mm.isMatch('a/b/c/d/e.f', 'a/b/**/*.*').should.be.true(); - mm.isMatch('a/b/c/d/e.f', 'a/b/**/c/**/d/*.*').should.be.true(); - mm.isMatch('a/b/c/d/e.f', 'a/b/**/d/**/*.*').should.be.true(); - mm.isMatch('a/b/c/d/g/e.f', 'a/b/**/d/**/*.*').should.be.true(); - mm.isMatch('a/b/c/d/g/g/e.f', 'a/b/**/d/**/*.*').should.be.true(); - - // issue #15 - mm.isMatch('z.js', '**/z*.js').should.be.true(); - mm.isMatch('a/b-c/z.js', 'a/b-*/**/z.js').should.be.true(); - mm.isMatch('a/b-c/d/e/z.js', 'a/b-*/**/z.js').should.be.true(); - }); - - /** - * 1. micromatch differs from spec - * 2. minimatch differs from spec - * 3. both micromatch and minimatch differ from spec - */ - - it('Extended slash-matching features', function() { - mm.isMatch('foo/baz/bar', 'foo*bar').should.be.false(); - mm.isMatch('foo/baz/bar', 'foo**bar').should.be.false(); - mm.isMatch('foobazbar', 'foo**bar').should.be.true(); // 3 - mm.isMatch('foo/baz/bar', 'foo/**/bar').should.be.true(); - mm.isMatch('foo/baz/bar', 'foo/**/**/bar').should.be.true(); - mm.isMatch('foo/b/a/z/bar', 'foo/**/bar').should.be.true(); - mm.isMatch('foo/b/a/z/bar', 'foo/**/**/bar').should.be.true(); - mm.isMatch('foo/bar', 'foo/**/bar').should.be.true(); - mm.isMatch('foo/bar', 'foo/**/**/bar').should.be.true(); - mm.isMatch('foo/bar', 'foo?bar').should.be.false(); - mm.isMatch('foo/bar', 'foo[/]bar').should.be.true(); // 2 - mm.isMatch('foo/bar', 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r').should.be.false(); - mm.isMatch('foo-bar', 'f[^eiu][^eiu][^eiu][^eiu][^eiu]r').should.be.true(); - mm.isMatch('foo', '**/foo').should.be.true(); - mm.isMatch('foo', 'foo/**').should.be.false(); - mm.isMatch('XXX/foo', '**/foo').should.be.true(); - mm.isMatch('bar/baz/foo', '**/foo').should.be.true(); - mm.isMatch('bar/baz/foo', '*/foo').should.be.false(); - mm.isMatch('foo/bar/baz', '**/bar*').should.be.false(); - mm.isMatch('deep/foo/bar/baz', '**/bar/*').should.be.true(); - mm.isMatch('deep/foo/bar/baz/', '**/bar/*').should.be.false(); - mm.isMatch('deep/foo/bar/baz/', '**/bar/**').should.be.true(); - mm.isMatch('deep/foo/bar', '**/bar/*').should.be.false(); - mm.isMatch('deep/foo/bar/', '**/bar/**').should.be.true(); - mm.isMatch('foo/bar/baz', '**/bar**').should.be.false(); - mm.isMatch('foo/bar/baz/x', '*/bar/**').should.be.true(); - mm.isMatch('deep/foo/bar/baz/x', '*/bar/**').should.be.false(); - mm.isMatch('deep/foo/bar/baz/x', '**/bar/*/*').should.be.true(); - mm.isMatch('a/j/z/x.md', 'a/**/j/**/z/*.md').should.be.true(); - mm.isMatch('a/b/j/c/z/x.md', 'a/**/j/**/z/*.md').should.be.true(); - }); - - it('question marks should not match slashes:', function() { - mm.isMatch('aaa/bbb', 'aaa?bbb').should.be.false(); - }); - - it('should not match dotfiles when `dot` or `dotfiles` are not set:', function() { - mm.isMatch('.c.md', '*.md').should.be.false(); - mm.isMatch('a/.c.md', '*.md').should.be.false(); - mm.isMatch('a/.c.md', 'a/.c.md').should.be.true(); - mm.isMatch('.a', '*.md').should.be.false(); - mm.isMatch('.verb.txt', '*.md').should.be.false(); - mm.isMatch('a/b/c/.xyz.md', 'a/b/c/.*.md').should.be.true(); - mm.isMatch('.md', '.md').should.be.true(); - mm.isMatch('.txt', '.md').should.be.false(); - mm.isMatch('.md', '.md').should.be.true(); - mm.isMatch('.a', '.a').should.be.true(); - mm.isMatch('.b', '.b*').should.be.true(); - mm.isMatch('.ab', '.a*').should.be.true(); - mm.isMatch('.ab', '.*').should.be.true(); - mm.isMatch('.ab', '*.*').should.be.false(); - mm.isMatch('.md', 'a/b/c/*.md').should.be.false(); - mm.isMatch('.a.md', 'a/b/c/*.md').should.be.false(); - mm.isMatch('a/b/c/d.a.md', 'a/b/c/*.md').should.be.true(); - mm.isMatch('a/b/d/.md', 'a/b/c/*.md').should.be.false(); - }); - - it('should match dotfiles when `dot` or `dotfiles` is set:', function() { - mm.isMatch('.c.md', '*.md', {dot: true}).should.be.true(); - mm.isMatch('.c.md', '.*', {dot: true}).should.be.true(); - mm.isMatch('a/b/c/.xyz.md', 'a/b/c/*.md', {dot: true}).should.be.true(); - mm.isMatch('a/b/c/.xyz.md', 'a/b/c/.*.md', {dot: true}).should.be.true(); - }); - - it('should match file paths:', function() { - mm.isMatch('a/b/c/xyz.md', 'a/b/c/*.md').should.be.true(); - mm.isMatch('a/bb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.isMatch('a/bbbb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.isMatch('a/bb.bb/c/xyz.md', 'a/*/c/*.md').should.be.true(); - mm.isMatch('a/bb.bb/aa/bb/aa/c/xyz.md', 'a/**/c/*.md').should.be.true(); - mm.isMatch('a/bb.bb/aa/b.b/aa/c/xyz.md', 'a/**/c/*.md').should.be.true(); - }); - - it('should match full file paths:', function() { - mm.isMatch('a/.b', 'a/**/z/*.md').should.be.false(); - mm.isMatch('a/.b', 'a/.*').should.be.true(); - mm.isMatch('a/b/z/.a', 'a/**/z/*.a').should.be.false(); - mm.isMatch('a/b/z/.a', 'a/*/z/*.a').should.be.false(); - mm.isMatch('a/b/z/.a', 'a/*/z/.a').should.be.true(); - mm.isMatch('a/b/c/d/e/z/c.md', 'a/**/z/*.md').should.be.true(); - mm.isMatch('a/b/c/d/e/j/n/p/o/z/c.md', 'a/**/j/**/z/*.md').should.be.true(); - mm.isMatch('a/b/c/j/e/z/c.txt', 'a/**/j/**/z/*.md').should.be.false(); - mm.isMatch('a/b/d/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.isMatch('a/b/c/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.isMatch('a/b/c/cd/bar/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.true(); - mm.isMatch('a/b/baz/ce/fez/xyz.md', 'a/b/**/c{d,e}/**/xyz.md').should.be.true(); - }); - - it('should match paths with leading `./`:', function() { - mm.isMatch('./.a', 'a/**/z/*.md').should.be.false(); - mm.isMatch('./a/b/z/.a', 'a/**/z/.a').should.be.false(); - mm.isMatch('./a/b/z/.a', './a/**/z/.a').should.be.true(); - mm.isMatch('./a/b/c/d/e/z/c.md', 'a/**/z/*.md').should.be.false(); - mm.isMatch('./a/b/c/d/e/z/c.md', './a/**/z/*.md').should.be.true(); - mm.isMatch('./a/b/c/d/e/z/c.md', './a/**/j/**/z/*.md').should.be.false(); - mm.isMatch('./a/b/c/j/e/z/c.md', './a/**/j/**/z/*.md').should.be.true(); - mm.isMatch('./a/b/c/j/e/z/c.md', 'a/**/j/**/z/*.md').should.be.false(); - mm.isMatch('./a/b/c/d/e/j/n/p/o/z/c.md', './a/**/j/**/z/*.md').should.be.true(); - mm.isMatch('./a/b/c/j/e/z/c.txt', './a/**/j/**/z/*.md').should.be.false(); - mm.isMatch('./a/b/d/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.isMatch('./a/b/c/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.false(); - mm.isMatch('./a/b/c/cd/bar/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.true(); - mm.isMatch('./a/b/baz/ce/fez/xyz.md', './a/b/**/c{d,e}/**/xyz.md').should.be.true(); - }); -}); diff --git a/test/issue-related.js b/test/issue-related.js new file mode 100644 index 00000000..77653717 --- /dev/null +++ b/test/issue-related.js @@ -0,0 +1,69 @@ +'use strict'; + +var assert = require('assert'); +var mini = require('minimatch'); +var mm = require('./support/match'); + +describe('issue-related tests', function() { + // see https://github.com/jonschlinkert/micromatch/issues/15 + it('issue #15', function() { + assert(mm.isMatch('a/b-c/d/e/z.js', 'a/b-*/**/z.js')); + assert(mm.isMatch('z.js', 'z*')); + assert(mm.isMatch('z.js', '**/z*')); + assert(mm.isMatch('z.js', '**/z*.js')); + assert(mm.isMatch('z.js', '**/*.js')); + assert(mm.isMatch('foo', '**/foo')); + }); + + // see https://github.com/jonschlinkert/micromatch/issues/23 + it('issue #23', function() { + assert(!mm.isMatch('zzjs', 'z*.js')); + assert(!mm.isMatch('zzjs', '*z.js')); + }); + + // see https://github.com/jonschlinkert/micromatch/issues/24 + it('issue #24', function() { + assert(!mm.isMatch('a', 'a/**')); + assert(!mm.isMatch('a/b/c/d/', 'a/b/**/f')); + assert(mm.isMatch('a', '**')); + assert(mm.isMatch('a/', '**')); + assert(mm.isMatch('a/b/c/d', '**')); + assert(mm.isMatch('a/b/c/d/', '**')); + assert(mm.isMatch('a/b/c/d/', '**/**')); + assert(mm.isMatch('a/b/c/d/', '**/b/**')); + assert(mm.isMatch('a/b/c/d/', 'a/b/**')); + assert(mm.isMatch('a/b/c/d/', 'a/b/**/')); + assert(mm.isMatch('a/b/c/d/e.f', 'a/b/**/**/*.*')); + assert(mm.isMatch('a/b/c/d/e.f', 'a/b/**/*.*')); + assert(mm.isMatch('a/b/c/d/g/e.f', 'a/b/**/d/**/*.*')); + assert(mm.isMatch('a/b/c/d/g/g/e.f', 'a/b/**/d/**/*.*')); + }); + + // see https://github.com/jonschlinkert/micromatch/issues/59 + it('should only match nested directories when `**` is the only thing in a segment', function() { + assert(!mm.isMatch('a/b/c', 'a/b**')); + assert(!mm.isMatch('a/c/b', 'a/**b')); + }); + + // see https://github.com/jonschlinkert/micromatch/issues/63 + it('issue #63', function() { + assert(mm.isMatch('/aaa/bbb/foo', '/aaa/bbb/**')); + assert(mm.isMatch('/aaa/bbb/', '/aaa/bbb/**')); + assert(mm.isMatch('/aaa/bbb/foo.git', '/aaa/bbb/**')); + assert(!mm.isMatch('/aaa/bbb/.git', '/aaa/bbb/**')); + assert(!mm.isMatch('aaa/bbb/.git', 'aaa/bbb/**')); + assert(!mm.isMatch('/aaa/bbb/ccc/.git', '/aaa/bbb/**')); + assert(!mm.isMatch('/aaa/.git/foo', '/aaa/**/*')); + assert(mm.isMatch('/aaa/.git/foo', '/aaa/**/*', {dot: true})); + assert(mm.isMatch('/aaa/bbb/.git', '/aaa/bbb/*', {dot: true})); + assert(mm.isMatch('aaa/bbb/.git', 'aaa/bbb/**', {dot: true})); + assert(mm.isMatch('/aaa/bbb/.git', '/aaa/bbb/**', {dot: true})); + assert(mm.isMatch('/aaa/bbb/ccc/.git', '/aaa/bbb/**', {dot: true})); + }); + + // see https://github.com/jonschlinkert/micromatch/issues/83 + it('issue #83', function() { + assert(mini('Incl/qqq.log', '**/Incl/**', {matchBase: true})); + assert(mm.isMatch('Incl/qqq.log', '**/Incl/**', {matchBase: true})); + }); +}); diff --git a/test/makeRe.js b/test/makeRe.js deleted file mode 100644 index c5508550..00000000 --- a/test/makeRe.js +++ /dev/null @@ -1,247 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = require('minimatch'); -} - -describe('.makeRe()', function() { - describe('errors:', function() { - it('should throw when undefined:', function() { - (function() { - mm.makeRe(); - }).should.throw('micromatch.makeRe(): glob should be a string.'); - }); - - it('should throw when not a string:', function() { - (function() { - mm.makeRe({}); - }).should.throw('micromatch.makeRe(): glob should be a string.'); - }); - - it('should throw on bad regex in strict mode:', function() { - (function() { - mm.makeRe('(foo', {strict: true}); - }).should.throw('SyntaxError: Invalid regular expression: /^(?:(foo)$/: Unterminated group'); - }); - }); - - describe('file extensions:', function() { - it('should create a regular expression for matching extensions:', function() { - mm.makeRe('.md').should.eql(/^(?:\.md)$/); - mm.makeRe('.txt').should.eql(/^(?:\.txt)$/); - mm.makeRe('.md').test('.md').should.be.true(); - mm.makeRe('.md').test('.txt').should.be.false(); - mm.makeRe('.md').test('.gitignore').should.be.false(); - }); - }); - - describe('braces:', function() { - it('should create a regular expression for matching extensions:', function() { - mm.makeRe('a/b/c/{d,e}/f.js').should.eql(/^(?:a\/b\/c\/(d|e)\/f\.js)$/); - }); - }); - - describe('file names:', function() { - it('should match files with the given extension:', function() { - mm.makeRe('*.md').test('foo.md').should.be.true(); - mm.makeRe('*.md').test('a/b/c/foo.md').should.be.false(); - }); - - it('should create a regex for matching dotfiles:', function() { - mm.makeRe('*.md').test('a.md').should.be.true(); - mm.makeRe('*.*.md').test('.foo.md').should.be.false(); - mm.makeRe('!*.*.md').test('.foo.md').should.be.true(); - mm.makeRe('*.*.md').test('a.foo.md').should.be.true(); - mm.makeRe('*.md').test('.gitignore').should.be.false(); - mm.makeRe('.gitignore').test('.gitignore').should.be.true(); - mm.makeRe('!.gitignore').test('.gitignore').should.be.false(); - mm.makeRe('*.md').test('.verb.txt').should.be.false(); - mm.makeRe('a/b/c/.*.md').test('a/b/c/.xyz.md').should.be.true(); - }); - }); - - describe('file paths:', function() { - it('should create a regular expression for file paths:', function() { - mm.makeRe('**/*.js').test('a/b.js').should.be.true(); - mm.makeRe('**/*.js').test('b.js').should.be.true(); - mm.makeRe('*.js').test('a/b.js').should.be.false(); - mm.makeRe('*.js').test('a.js').should.be.true(); - mm.makeRe('a/b/c/*.md').test('.gitignore').should.be.false(); - mm.makeRe('a/b/c/*.md').test('.gitignore.md').should.be.false(); - mm.makeRe('a/b/c/*.md').test('a/b/c/d.gitignore.md').should.be.true(); - mm.makeRe('a/b/c/*.md').test('a/b/d/.gitignore').should.be.false(); - mm.makeRe('a/b/c/*.md').test('a/b/c/xyz.md').should.be.true(); - mm.makeRe('a/*/c/*.md').test('a/bb/c/xyz.md').should.be.true(); - mm.makeRe('a/*/c/*.md').test('a/bbbb/c/xyz.md').should.be.true(); - mm.makeRe('a/*/c/*.md').test('a/bb.bb/c/xyz.md').should.be.true(); - mm.makeRe('a/**/c/*.md').test('a/bb.bb/aa/bb/aa/c/xyz.md').should.be.true(); - mm.makeRe('a/**/c/*.md').test('a/bb.bb/aa/b.b/aa/c/xyz.md').should.be.true(); - }); - }); - - describe('special characters:', function() { - it('should match one character per question mark:', function() { - mm.makeRe('a/?/c.md').test('a/b/c.md').should.be.true(); - mm.makeRe('a/?/c.md').test('a/bb/c.md').should.be.false(); - mm.makeRe('a/??/c.md').test('a/bb/c.md').should.be.true(); - mm.makeRe('a/??/c.md').test('a/bbb/c.md').should.be.false(); - mm.makeRe('a/???/c.md').test('a/bbb/c.md').should.be.true(); - mm.makeRe('a/????/c.md').test('a/bbbb/c.md').should.be.true(); - }); - - it('should match multiple groups of question marks:', function() { - mm.makeRe('a/?/c/?/e.md').test('a/bb/c/dd/e.md').should.be.false(); - mm.makeRe('a/?/c/?/e.md').test('a/b/c/d/e.md').should.be.true(); - mm.makeRe('a/?/c/???/e.md').test('a/b/c/d/e.md').should.be.false(); - mm.makeRe('a/?/c/???/e.md').test('a/b/c/zzz/e.md').should.be.true(); - }); - - it('should use special characters and glob stars together:', function() { - mm.makeRe('a/?/c/?/*/e.md').test('a/b/c/d/e.md').should.be.false(); - mm.makeRe('a/?/c/?/*/e.md').test('a/b/c/d/e/e.md').should.be.true(); - mm.makeRe('a/?/c/?/*/e.md').test('a/b/c/d/efghijk/e.md').should.be.true(); - mm.makeRe('a/?/**/e.md').test('a/b/c/d/efghijk/e.md').should.be.true(); - mm.makeRe('a/?/**/e.md').test('a/bb/c/d/efghijk/e.md').should.be.false(); - mm.makeRe('a/*/?/**/e.md').test('a/b/c/d/efghijk/e.md').should.be.true(); - mm.makeRe('a/*/?/**/e.md').test('a/b/c/d/efgh.ijk/e.md').should.be.true(); - mm.makeRe('a/*/?/**/e.md').test('a/b.bb/c/d/efgh.ijk/e.md').should.be.true(); - mm.makeRe('a/*/?/**/e.md').test('a/bbb/c/d/efgh.ijk/e.md').should.be.true(); - }); - }); - - describe('brace expansion:', function() { - it('should create a regular brace expansion:', function() { - mm.makeRe('a/b/c{d,e}/*.md').test('iii.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/d/iii.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/c/iii.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/cd/iii.md').should.be.true(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/ce/iii.md').should.be.true(); - - mm.makeRe('a/b/c{d,e}/xyz.md').test('xyz.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/d/xyz.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/c/xyz.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/cd/xyz.md').should.be.true(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/ce/xyz.md').should.be.true(); - }); - }); - - describe('double stars:', function() { - it('should create a regular expression for double stars:', function() { - mm.makeRe('a/**/z/*.md').test('.gitignore').should.be.false(); - mm.makeRe('a/**/z/*.md').test('a/b/z/.gitignore').should.be.false(); - mm.makeRe('a/**/z/*.md').test('a/b/c/d/e/z/foo.md').should.be.true(); - - mm.makeRe('a/**/j/**/z/*.md').test('a/b/c/d/e/z/foo.md').should.be.false(); - mm.makeRe('a/**/j/**/z/*.md').test('a/b/c/j/e/z/foo.md').should.be.true(); - mm.makeRe('a/**/j/**/z/*.md').test('a/b/c/d/e/j/n/p/o/z/foo.md').should.be.true(); - mm.makeRe('a/**/j/**/z/*.md').test('a/b/c/j/e/z/foo.txt').should.be.false(); - - mm.makeRe('a/b/**/c{d,e}/**/xyz.md').test('a/b/d/xyz.md').should.be.false(); - mm.makeRe('a/b/**/c{d,e}/**/xyz.md').test('a/b/c/xyz.md').should.be.false(); - mm.makeRe('a/b/**/c{d,e}/**/xyz.md').test('a/b/foo/cd/bar/xyz.md').should.be.true(); - mm.makeRe('a/b/**/c{d,e}/**/xyz.md').test('a/b/baz/ce/fez/xyz.md').should.be.true(); - }); - }); - - describe('negation', function() { - it('should create a regular expression for negating extensions:', function() { - mm.makeRe('!.md').test('.md').should.be.false(); - mm.makeRe('!.md').test('foo.md').should.be.true(); - mm.makeRe('!*.md').test('foo.md').should.be.false(); - }); - - it('should create a regular expression for negating files with extensions:', function() { - mm.makeRe('!*.md').test('abc.md').should.be.false(); - mm.makeRe('!*.md').test('abc.txt').should.be.true(); - mm.makeRe('!*.md').test('.dotfile.md').should.be.true(); - mm.makeRe('!*.md').test('.dotfile.txt').should.be.true(); - }); - - it('should create a regular expression for slashes:', function() { - mm.makeRe('a/b/c/*.md').test('.gitignore').should.be.false(); - mm.makeRe('a/b/c/*.md').test('a/b/c/.gitignore').should.be.false(); - mm.makeRe('a/b/c/*.md').test('a/b/c/foo.md').should.be.true(); - mm.makeRe('a/b/c/*.md').test('a/b/c/bar.md').should.be.true(); - }); - - it('should create a regular brace expansion:', function() { - mm.makeRe('a/b/c{d,e}/*.md').test('iii.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/d/iii.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/c/iii.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/cd/iii.md').should.be.true(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/ce/iii.md').should.be.true(); - - mm.makeRe('a/b/c{d,e}/xyz.md').test('xyz.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/d/xyz.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/c/xyz.md').should.be.false(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/cd/xyz.md').should.be.true(); - mm.makeRe('a/b/c{d,e}/*.md').test('a/b/ce/xyz.md').should.be.true(); - mm.makeRe('a/b/c{d,e{f,g}}/*.md').test('a/b/cef/xyz.md').should.be.true(); - mm.makeRe('a/b/c{d,e{f,g}}/*.md').test('a/b/ceg/xyz.md').should.be.true(); - mm.makeRe('a/b/c{d,e{f,g}}/*.md').test('a/b/cd/xyz.md').should.be.true(); - }); - - it('should match dotfiles:', function() { - mm.makeRe('a/**/z/.*.md').test('a/b/z/.dotfile.md').should.be.true(); - mm.makeRe('a/**/z/*.md').test('a/b/z/.dotfile').should.be.false(); - }); - - it('should create a regular expression for double stars:', function() { - mm.makeRe('a/**/z/*.md').test('.gitignore').should.be.false(); - mm.makeRe('a/**/z/*.md').test('a/b/c/d/e/z/foo.md').should.be.true(); - - mm.makeRe('a/**/j/**/z/*.md').test('a/b/c/d/e/z/foo.md').should.be.false(); - mm.makeRe('a/**/j/**/z/*.md').test('a/b/c/j/e/z/foo.md').should.be.true(); - mm.makeRe('a/**/j/**/z/*.md').test('a/b/c/d/e/j/n/p/o/z/foo.md').should.be.true(); - mm.makeRe('a/**/j/**/z/*.md').test('a/b/c/j/e/z/foo.txt').should.be.false(); - mm.makeRe('a/b/**/c{d,e}/**/xyz.md').test('a/b/d/xyz.md').should.be.false(); - mm.makeRe('a/b/**/c{d,e}/**/xyz.md').test('a/b/c/xyz.md').should.be.false(); - mm.makeRe('a/b/**/c{d,e}/**/xyz.md').test('a/b/foo/cd/bar/xyz.md').should.be.true(); - mm.makeRe('a/b/**/c{d,e}/**/xyz.md').test('a/b/baz/ce/fez/xyz.md').should.be.true(); - }); - }); - - describe('options', function() { - it('should support the `matchBase` option:', function() { - mm.makeRe('*.md').test('a/b/c/foo.md').should.be.false(); - }); - - it('should support the `nocase` option:', function() { - mm.makeRe('a/b/c/*.md').test('a/b/d/e.md').should.be.false(); - mm.makeRe('A/b/C/*.md').test('a/b/c/e.md').should.be.false(); - mm.makeRe('A/b/C/*.md', {nocase: true}).test('a/b/c/e.md').should.be.true(); - mm.makeRe('A/b/C/*.MD', {nocase: true}).test('a/b/c/e.md').should.be.true(); - }); - - it('should match dotfiles when `dotfile` is true:', function() { - var opts = {dot: true}; - - mm.makeRe('.gitignore', opts).test('.gitignore').should.be.true(); - mm.makeRe('*.md', opts).test('foo.md').should.be.true(); - mm.makeRe('*.md', opts).test('.verb.txt').should.be.false(); - mm.makeRe('*.md', opts).test('a/b/c/.gitignore').should.be.false(); - mm.makeRe('*.md', opts).test('a/b/c/.gitignore.md').should.be.false(); - mm.makeRe('**/*.md', opts).test('a/b/c/.gitignore.md').should.be.true(); - mm.makeRe('*.md', opts).test('.verb.txt').should.be.false(); - mm.makeRe('*.md', opts).test('.gitignore').should.be.false(); - mm.makeRe('*.*', opts).test('.gitignore').should.be.true(); - mm.makeRe('*.md', opts).test('.gitignore.md').should.be.true(); - mm.makeRe('**/*.md', opts).test('a/b/c/.verb.md').should.be.true(); - - mm.makeRe('*.md').test('a/b/c/.gitignore.md').should.be.false(); - mm.makeRe('**/.*.md').test('a/b/c/.gitignore.md').should.be.true(); - mm.makeRe('**/.*').test('a/b/c/.gitignore.md').should.be.true(); - }); - }); -}); diff --git a/test/malicious.js b/test/malicious.js new file mode 100644 index 00000000..43c1d120 --- /dev/null +++ b/test/malicious.js @@ -0,0 +1,28 @@ +'use strict'; + +var assert = require('assert'); +var mm = require('./support/match'); + +/** + * These tests are based on minimatch unit tests + */ + +function generate(len, ch) { + var pattern = ''; + while (--len) pattern += ch; + return pattern; +} + +describe('handling of potential regex exploits', function() { + it('should support long escape sequences', function() { + assert(mm.isMatch('A', '!(' + generate(1024 * 2, '\\') + 'A)'), 'within the limits, and valid match'); + assert(!mm.isMatch('A', '[!(' + generate(1024 * 2, '\\') + 'A'), 'within the limits, but invalid regex'); + }); + + it('should throw an error when the pattern is too long', function() { + assert.throws(function() { + var exploit = '!(' + generate(1024 * 64, '\\') + 'A)'; + assert(!mm.isMatch('A', exploit)); + }, /expected pattern to be less than 65536 characters/); + }); +}); diff --git a/test/match.js b/test/match.js deleted file mode 100644 index f8cdd55b..00000000 --- a/test/match.js +++ /dev/null @@ -1,222 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -var argv = require('minimist')(process.argv.slice(2)); -var minimatch = require('./support/reference'); -var mm = require('..'); -require('should'); - -if ('minimatch' in argv) { - mm = minimatch; -} - -describe('.match()', function() { - describe('errors:', function() { - it('should throw on undefined args:', function() { - (function() { - mm.match(); - }).should.throw('micromatch.match(): files should be a string or array.'); - }); - - it('should throw on bad args:', function() { - (function() { - mm.match({}); - }).should.throw('micromatch.match(): files should be a string or array.'); - }); - }); - - describe('basic patterns:', function() { - it('should correctly deal with empty globs', function() { - mm.match(['ab'], '').should.eql([]); - mm.match(['a'], '').should.eql([]); - mm.match(['.'], '').should.eql([]); - }); - - it('should support matching with non-glob patterns', function() { - mm.match(['.'], '.').should.eql(['.']); - mm.match(['ab'], 'ab').should.eql(['ab']); - mm.match(['ab', 'a'], 'a').should.eql(['a']); - mm.match(['ab', 'a'], '/a').should.eql([]); - mm.match(['ab', 'a'], 'aa').should.eql([]); - mm.match(['/ab', '/a'], '/a').should.eql(['/a']); - }); - - it('should support matching with glob patterns', function() { - mm.match(['.'], '{.,*}').should.eql(['.']); - mm.match(['ab'], '*').should.eql(['ab']); - mm.match(['ab', 'a'], '?').should.eql(['a']); - mm.match(['ab', 'a'], '*b').should.eql(['ab']); - mm.match(['ab', 'a', 'bb'], '[ab][ab]').should.eql(['ab', 'bb']); - mm.match(['/ab', '/a'], '/*').should.eql(['/ab', '/a']); - }); - - it('should support matching with regex', function() { - mm.match(['.'], /\./).should.eql(['.']); - mm.match(['ab'], /ab/).should.eql(['ab']); - mm.match(['ab', 'a'], /a$/).should.eql(['a']); - mm.match(['ab', 'a'], /\/a/).should.eql([]); - mm.match(['ab', 'a'], /aa/).should.eql([]); - mm.match(['/ab', '/a'], /\/a$/).should.eql(['/a']); - }); - - it('should support matching with a function:', function() { - var matches = mm.match(['a', 'aa', 'aaa', 'aaaa'], function(fp) { - return fp.length >= 3; - }) - matches.should.eql(['aaa', 'aaaa']); - }); - }); - - describe('characters:', function() { - it('should match question marks', function() { - mm.match(['ab', 'a/b', 'bb', 'b/c'], '?a').should.eql([]); - mm.match(['ab', 'a/b', 'bb', 'b/c'], '?/?').should.eql(['a/b', 'b/c']); - mm.match(['ab', 'a/b', 'bb', 'b/c'], 'a?b').should.eql([]); - mm.match(['ab', 'a/b', 'bb', 'b/c'], '?b').should.eql(['ab', 'bb']); - }); - - it('should match one character per question mark', function() { - var files = ['ab', 'a/bc', 'bb', 'bbc', 'b/c', 'a/b/c.js', 'a/b/c.md', 'a/bb/c.js', 'a/bb/c.md', 'a/bbb/c.js', 'a/bbb/c.md', 'a/bbbb/c.js', 'a/bbbb/c.md', 'a/b/c/d/eeeeeee/f.js', 'a/b/c/d/eeeeeee/f.md', 'a/b/c/d/e.js', 'a/b/c/d/e.md', 'a/b/c/ddd/e.js', 'a/b/c/ddd/e.md']; - mm.match(files, '?').should.eql([]); - mm.match(files, '??').should.eql(['ab', 'bb']); - mm.match(files, '???').should.eql(['bbc']); - mm.match(files, 'a/?/c.js').should.eql(['a/b/c.js']); - mm.match(files, 'a/?/c.md').should.eql(['a/b/c.md']); - mm.match(files, 'a/?/c/?/*/f.js').should.eql(['a/b/c/d/eeeeeee/f.js']); - mm.match(files, 'a/?/c/?/*/f.md').should.eql(['a/b/c/d/eeeeeee/f.md']); - mm.match(files, 'a/?/c/?/e.js').should.eql(['a/b/c/d/e.js']); - mm.match(files, 'a/?/c/?/e.md').should.eql(['a/b/c/d/e.md']); - mm.match(files, 'a/?/c/???/e.js').should.eql(['a/b/c/ddd/e.js']); - mm.match(files, 'a/?/c/???/e.md').should.eql(['a/b/c/ddd/e.md']); - mm.match(files, 'a/??/c.js').should.eql(['a/bb/c.js']); - mm.match(files, 'a/??/c.md').should.eql(['a/bb/c.md']); - mm.match(files, 'a/???/c.js').should.eql(['a/bbb/c.js']); - mm.match(files, 'a/???/c.md').should.eql(['a/bbb/c.md']); - mm.match(files, 'a/????/c.js').should.eql(['a/bbbb/c.js']); - mm.match(files, 'a/????/c.md').should.eql(['a/bbbb/c.md']); - }); - }); - - describe('paths/extensions', function() { - it('should match with common glob patterns', function() { - mm.match(['/ab', '/cd', 'ef'], '/*').should.eql(['/ab', '/cd']); - mm.match(['a/b/c/d', 'a/c/d', 'a/f/jjj/acd'], '**/d').should.eql(['a/b/c/d', 'a/c/d']); - mm.match(['ab'], './*').should.eql([]); - mm.match(['./ab'], './*').should.eql(['./ab']); - mm.match(['ab'], '*').should.eql(['ab']); - mm.match(['ab'], 'ab').should.eql(['ab']); - }); - - it('should match one directory level:', function() { - var dirs = ['a/b/c/e', 'a/b/c/d/e']; - mm.match(dirs, 'a/b/c/*').should.eql(['a/b/c/e']); - mm.match(dirs, 'a/b/*/e').should.eql(['a/b/c/e']); - mm.match(dirs, 'a/*/*/e').should.eql(['a/b/c/e']); - mm.match(dirs, '*/*/*/e').should.eql(['a/b/c/e']); - mm.match(dirs, '*/*/*/*').should.eql(['a/b/c/e']); - mm.match(dirs, 'b/*/*/*').should.eql([]); - mm.match(['a/b/c/e', 'b/b/c/e', 'a/b/c/d/e'], '*/b/*/e').should.eql(['a/b/c/e', 'b/b/c/e']); - }); - - it('should match multiple directory levels:', function() { - var dirs = ['a/b/c/e', 'a/b/c/d/e']; - mm.match(dirs, 'a/***').should.eql(dirs); - mm.match(dirs, 'a/**c*').should.eql([]); - mm.match(dirs, 'a/**c/*').should.eql(['a/b/c/e']); - mm.match(dirs, 'a/**/c/*').should.eql(['a/b/c/e']); - mm.match(dirs, 'a/**/e').should.eql(dirs); - mm.match(dirs, 'a/b/**/e').should.eql(dirs); - mm.match(['a/x.js', 'a/z.js', 'z.js'], '*/z*.js').should.eql(['a/z.js']); - mm.match([ 'z.js', 'a/z.js', 'a/b/c/z.js' ], '**z*.js').should.eql(['z.js']); - }); - }); - - describe('paths/filenames:', function() { - it('should match files with the given extension:', function() { - mm.match(['.md', '.txt'], '*.md').should.eql([]); - mm.match(['.md', '.txt'], '.md').should.eql(['.md']); - mm.match(['x.md'], '*.md').should.eql(['x.md']); - mm.match(['x.js.min'], '*.js').should.eql([]); - mm.match(['a/b/c/x.md'], '*.md').should.eql([]); - }); - - it('should not match dotfiles when `dot` or `dotfiles` are not set:', function() { - mm.match(['.a'], '*.md').should.eql([]); - mm.match(['.a'], 'a/b/c/*.md').should.eql([]); - mm.match(['.a.md'], 'a/b/c/*.md').should.eql([]); - mm.match(['.x.md'], '*.md').should.eql([]); - mm.match(['.y.txt'], '*.md').should.eql([]); - mm.match(['a/.x.md'], '*.md').should.eql([]); - mm.match(['a/.x.md'], 'a/.x.md').should.eql(['a/.x.md']); - mm.match(['a/b/c/.xyz.md'], 'a/b/c/.*.md').should.eql(['a/b/c/.xyz.md']); - mm.match(['a/b/c/d.a.md'], 'a/b/c/*.md').should.eql(['a/b/c/d.a.md']); - mm.match(['a/b/d/.a'], 'a/b/c/*.md').should.eql([]); - }); - - it('should match dotfiles when the filename pattern begins with a dot:', function() { - mm.match(['.b'], '.b*').should.eql(['.b']); - mm.match(['.md', '.txt'], '.md').should.eql(['.md']); - mm.match(['.a', 'a'], '.a').should.eql(['.a']); - mm.match(['.ab', '.a', '.b', 'a', 'b'], '.*').should.eql(['.ab', '.a', '.b']); - mm.match(['.ab', '.a', '.b'], '.a*').should.eql(['.ab', '.a']); - }); - - it('should match dotfiles when `dot` or `dotfiles` is set:', function() { - mm.match(['.ab', '.a', '.b'], '*.*', {dot: true}).should.eql(['.ab', '.a', '.b']); - mm.match(['.x.md'], '*.md', {dot: true}).should.eql(['.x.md']); - mm.match(['.x.md'], '.*', {dot: true}).should.eql(['.x.md']); - mm.match(['a/b/c/.xyz.md'], 'a/b/c/*.md', {dot: true}).should.eql(['a/b/c/.xyz.md']); - mm.match(['c/.dotfile', 'c/a', 'c/b'], '**/.*', {dot: true}).should.eql(['c/.dotfile']); - }); - }); - - describe('paths/filepaths:', function() { - it('should match file paths:', function() { - mm.match(['a/b/c/xyz.md'], '**/*.md').should.eql(['a/b/c/xyz.md']); - mm.match(['c/.dotfile', 'c/a', 'c/b'], '**/.*').should.eql(['c/.dotfile']); - mm.match(['a/b/c/xyz.min.md'], '**/*.md').should.eql(['a/b/c/xyz.min.md']); - mm.match(['a/b/c/xyz.md'], 'a/b/c/*.md').should.eql(['a/b/c/xyz.md']); - mm.match(['a/bb/c/xyz.md'], 'a/*/c/*.md').should.eql(['a/bb/c/xyz.md']); - mm.match(['a/bbbb/c/xyz.md'], 'a/*/c/*.md').should.eql(['a/bbbb/c/xyz.md']); - mm.match(['a/bb.bb/c/xyz.md'], 'a/*/c/*.md').should.eql(['a/bb.bb/c/xyz.md']); - mm.match(['a/bb.bb/aa/bb/aa/c/xyz.md'], 'a/**/c/*.md').should.eql(['a/bb.bb/aa/bb/aa/c/xyz.md']); - mm.match(['a/bb.bb/aa/b.b/aa/c/xyz.md'], 'a/**/c/*.md').should.eql(['a/bb.bb/aa/b.b/aa/c/xyz.md']); - }); - }); - - describe('double stars:', function() { - it('should match full file paths:', function() { - mm.match(['.a'], 'a/**/z/*.md').should.eql([]); - mm.match(['a/b/z/.a'], 'a/**/z/*.md').should.eql([]); - mm.match(['a/b/c/d/e/z/x.md'], 'a/**/z/*.md').should.eql(['a/b/c/d/e/z/x.md']); - - mm.match(['a/b/c/d/e/z/x.md'], 'a/**/j/**/z/*.md').should.eql([]); - mm.match(['a/b/c/j/e/z/x.md'], 'a/**/j/**/z/*.md').should.eql(['a/b/c/j/e/z/x.md']); - mm.match(['a/b/c/d/e/j/n/p/o/z/x.md'], 'a/**/j/**/z/*.md').should.eql(['a/b/c/d/e/j/n/p/o/z/x.md']); - mm.match(['a/b/c/j/e/z/x.txt'], 'a/**/j/**/z/*.md').should.eql([]); - - mm.match(['a/b/d/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm.match(['a/b/c/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm.match(['a/b/x/cd/bar/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql(['a/b/x/cd/bar/xyz.md']); - mm.match(['a/b/baz/ce/fez/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql(['a/b/baz/ce/fez/xyz.md']); - }); - - it('should match paths with leading `./`:', function() { - mm.match(['./.a'], 'a/**/z/*.md').should.eql([]); - mm.match(['./a/b/z/.a'], 'a/**/z/*.md').should.eql([]); - mm.match(['./a/b/c/d/e/z/x.md'], 'a/**/z/*.md').should.eql([]); - mm.match(['./a/b/c/d/e/z/x.md'], './a/**/z/*.md').should.eql(['./a/b/c/d/e/z/x.md']); - - mm.match(['./a/b/c/d/e/z/x.md'], './a/**/j/**/z/*.md').should.eql([]); - mm.match(['./a/b/c/j/e/z/x.md'], './a/**/j/**/z/*.md').should.eql(['./a/b/c/j/e/z/x.md']); - mm.match(['./a/b/c/d/e/j/n/p/o/z/x.md'], './a/**/j/**/z/*.md').should.eql(['./a/b/c/d/e/j/n/p/o/z/x.md']); - mm.match(['./a/b/c/j/e/z/x.txt'], './a/**/j/**/z/*.md').should.eql([]); - }); - }); -}); diff --git a/test/matchKeys.js b/test/matchKeys.js deleted file mode 100644 index fff29f50..00000000 --- a/test/matchKeys.js +++ /dev/null @@ -1,45 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('should'); -var mm = require('..'); - -describe('.matchKeys()', function() { - describe('errors:', function() { - it('should throw on undefined args:', function() { - (function() { - mm.matchKeys(); - }).should.throw('micromatch.matchKeys(): first argument should be an object.'); - }); - - it('should throw on bad args:', function() { - (function() { - mm.matchKeys('foo'); - }).should.throw('micromatch.matchKeys(): first argument should be an object.'); - }); - }); - - describe('match object keys:', function() { - it('should return a new object with only keys that match a glob pattern:', function() { - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, '*').should.eql({a: 'a', b: 'b', c: 'c'}); - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, 'a').should.eql({a: 'a'}); - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, 'a').should.not.eql({b: 'b'}); - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, '[a-b]').should.eql({a: 'a', b: 'b'}); - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, '(a|c)').should.eql({a: 'a', c: 'c'}); - }); - - it('should return a new object with only keys that match a regex:', function() { - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /.*/).should.eql({a: 'a', b: 'b', c: 'c'}); - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /a/).should.eql({a: 'a'}); - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /a/).should.not.eql({b: 'b'}); - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /[a-b]/).should.eql({a: 'a', b: 'b'}); - mm.matchKeys({a: 'a', b: 'b', c: 'c'}, /(a|c)/).should.eql({a: 'a', c: 'c'}); - }); - }); -}); diff --git a/test/matcher.js b/test/matcher.js deleted file mode 100644 index 19053052..00000000 --- a/test/matcher.js +++ /dev/null @@ -1,90 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -var argv = require('minimist')(process.argv.slice(2)); -var minimatch = require('./support/reference'); -var mm = require('..'); -require('should'); - -if ('minimatch' in argv) { - mm = minimatch; -} - -describe('matcher', function() { - describe('errors:', function() { - it('should throw on undefined args:', function() { - (function() { - mm.matcher(); - }).should.throw('micromatch.matcher(): pattern should be a string, regex, or function.'); - }); - - it('should throw on bad args:', function() { - (function() { - mm.matcher({}); - }).should.throw('micromatch.matcher(): pattern should be a string, regex, or function.'); - }); - }); - - describe('should return matcher functions', function() { - it('when the pattern is regex:', function() { - var isMatch = mm.matcher(/[a-c]\.md$/); - isMatch('a.md').should.be.true(); - isMatch('b.md').should.be.true(); - isMatch('c.md').should.be.true(); - isMatch('e.md').should.be.false(); - isMatch('d.md').should.be.false(); - isMatch('a.js').should.be.false(); - isMatch('c.js').should.be.false(); - }); - - it('when the pattern is a glob string:', function() { - var isMatch = mm.matcher('**/*.js'); - isMatch('a/a.md').should.be.false(); - isMatch('a/b.md').should.be.false(); - isMatch('a/c.md').should.be.false(); - isMatch('a/e.md').should.be.false(); - isMatch('a/d.md').should.be.false(); - isMatch('a/a.js').should.be.true(); - isMatch('a/c.js').should.be.true(); - }); - - it('when the pattern is a glob it should support `matchBase`:', function() { - var matcherA = mm.matcher('*.js', {matchBase: false}); - matcherA('a/a.js').should.be.false(); - matcherA('a/c.js').should.be.false(); - - var matcherB = mm.matcher('*.js', {matchBase: true}); - matcherB('a/a.js').should.be.true(); - matcherB('a/c.js').should.be.true(); - }); - - it('when the pattern is a non-glob string:', function() { - var isMatch = mm.matcher('b.md'); - isMatch('a.md').should.be.false(); - isMatch('b.md').should.be.true(); - isMatch('c.md').should.be.false(); - isMatch('e.md').should.be.false(); - isMatch('d.md').should.be.false(); - isMatch('a.js').should.be.false(); - isMatch('c.js').should.be.false(); - }); - - it('when the pattern is a function:', function() { - var isMatch = mm.matcher(function(fp) { - return fp === 'a.md'; - }); - - isMatch('a.md').should.be.true(); - isMatch('b.md').should.be.false(); - isMatch('c.md').should.be.false(); - isMatch('d.md').should.be.false(); - isMatch('e.md').should.be.false(); - }); - }); -}); diff --git a/test/micromatch.js b/test/micromatch.js deleted file mode 100644 index 871d960f..00000000 --- a/test/micromatch.js +++ /dev/null @@ -1,255 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('should'); -var path = require('path'); -var assert = require('assert'); -var argv = require('minimist')(process.argv.slice(2)); -var mm = require('..'); - -if ('multimatch' in argv) { - mm = require('multimatch'); -} - -describe('micromatch', function() { - it('should return an empty array when no pattern is passed:', function() { - mm(['.md']).should.eql([]); - }); -}); - -describe('micromatch array patterns', function() { - it('should match file extensions:', function() { - mm(['.md'], ['.md']).should.eql(['.md']); - mm(['.txt'], ['.md']).should.eql([]); - mm(['.gitignore'], ['.md']).should.eql([]); - }); - - it('should match files with the given extension:', function() { - mm(['a.md', 'a.txt'], ['*.md']).should.eql(['a.md']); - mm(['.d.md'], ['.*.md']).should.eql(['.d.md']); - mm(['d.md'], ['*.md']).should.eql(['d.md']); - mm(['a/b/c/d.md'], ['*.md']).should.eql([]); - }); - it('should not match dotfiles by default:', function() { - mm(['.gitignore'], ['*.md']).should.eql([]); - mm(['.verb.txt'], ['*.md']).should.eql([]); - }); - - describe('file paths:', function() { - it('should match full file paths using an array of patterns:', function() { - mm(['a/b/c.md', 'a/b/c.txt'], '!**/*.txt').should.eql(['a/b/c.md']); - mm(['.gitignore'], ['a/b/c/*.md']).should.eql([]); - mm(['.gitignore.md'], ['a/b/c/*.md']).should.eql([]); - mm(['a.js'], ['*.js']).should.eql(['a.js']); - mm(['a.js', 'b.js', 'a/b.js'], ['**/*.js']).should.eql(['a.js', 'b.js', 'a/b.js']); - mm(['a/b/c/d.gitignore.md'], ['a/b/c/*.md']).should.eql(['a/b/c/d.gitignore.md']); - mm(['a/b/d/.gitignore'], ['a/b/c/*.md']).should.eql([]); - mm(['a/b/c/xyz.md'], ['a/*/c/*.md']).should.eql(['a/b/c/xyz.md']); - mm(['a/b/c/xyz.md'], ['a/**/*.md']).should.eql(['a/b/c/xyz.md']); - mm(['a/b/c/d/e/f/xyz.md'], ['a/**/*.md']).should.eql(['a/b/c/d/e/f/xyz.md']); - mm(['a/b/c/.xyz.md'], ['a/b/c/.*.md']).should.eql(['a/b/c/.xyz.md']); - mm(['a/bb/c/xyz.md'], ['a/*/c/*.md']).should.eql(['a/bb/c/xyz.md']); - mm(['a/bbbb/c/xyz.md'], ['a/*/c/*.md']).should.eql(['a/bbbb/c/xyz.md']); - mm(['a/bb.bb/c/xyz.md'], ['a/*/c/*.md']).should.eql(['a/bb.bb/c/xyz.md']); - mm(['a/bb.bb/aa/bb/aa/c/xyz.md'], ['a/**/c/*.md']).should.eql(['a/bb.bb/aa/bb/aa/c/xyz.md']); - mm(['a/bb.bb/aa/b.b/aa/c/xyz.md'], ['a/**/c/*.md']).should.eql(['a/bb.bb/aa/b.b/aa/c/xyz.md']); - }); - - it('matchBase / negation:', function() { - mm(['a/b/c.md', 'a/b/c.txt'], ['*', '!*.md'], {matchBase: true}).should.eql(['a/b/c.txt']); - }); - }); - - describe('special characters:', function() { - it('should match one character per question mark:', function() { - mm(['a/b/c.md'], ['a/?/c.md']).should.eql(['a/b/c.md']); - mm(['a/bb/c.md'], ['a/?/c.md']).should.eql([]); - mm(['a/bb/c.md'], ['a/??/c.md']).should.eql(['a/bb/c.md']); - mm(['a/bbb/c.md'], ['a/??/c.md']).should.eql([]); - mm(['a/bbb/c.md'], ['a/???/c.md']).should.eql(['a/bbb/c.md']); - mm(['a/bbbb/c.md'], ['a/????/c.md']).should.eql(['a/bbbb/c.md']); - }); - - it('should match multiple groups of question marks:', function() { - mm(['a/bb/c/dd/e.md'], ['a/?/c/?/e.md']).should.eql([]); - mm(['a/b/c/d/e.md'], ['a/?/c/?/e.md']).should.eql(['a/b/c/d/e.md']); - mm(['a/b/c/d/e.md'], ['a/?/c/???/e.md']).should.eql([]); - mm(['a/b/c/zzz/e.md'], ['a/?/c/???/e.md']).should.eql(['a/b/c/zzz/e.md']); - }); - - it('should use special characters and glob stars together:', function() { - mm(['a/b/c/d/e.md'], ['a/?/c/?/*/e.md']).should.eql([]); - mm(['a/b/c/d/e/e.md'], ['a/?/c/?/*/e.md']).should.eql(['a/b/c/d/e/e.md']); - mm(['a/b/c/d/efghijk/e.md'], ['a/?/c/?/*/e.md']).should.eql(['a/b/c/d/efghijk/e.md']); - mm(['a/b/c/d/efghijk/e.md'], ['a/?/**/e.md']).should.eql(['a/b/c/d/efghijk/e.md']); - mm(['a/bb/c/d/efghijk/e.md'], ['a/?/**/e.md']).should.eql([]); - mm(['a/b/c/d/efghijk/e.md'], ['a/*/?/**/e.md']).should.eql(['a/b/c/d/efghijk/e.md']); - mm(['a/b/c/d/efgh.ijk/e.md'], ['a/*/?/**/e.md']).should.eql(['a/b/c/d/efgh.ijk/e.md']); - mm(['a/b.bb/c/d/efgh.ijk/e.md'], ['a/*/?/**/e.md']).should.eql(['a/b.bb/c/d/efgh.ijk/e.md']); - mm(['a/bbb/c/d/efgh.ijk/e.md'], ['a/*/?/**/e.md']).should.eql(['a/bbb/c/d/efgh.ijk/e.md']); - }); - }); - - describe('brace expansion:', function() { - it('should expand braces:', function() { - mm(['iii.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/d/iii.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/c/iii.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/cd/iii.md'], ['a/b/c{d,e}/*.md']).should.eql(['a/b/cd/iii.md']); - mm(['a/b/ce/iii.md'], ['a/b/c{d,e}/*.md']).should.eql(['a/b/ce/iii.md']); - - mm(['xyz.md'], ['a/b/c{d,e}/xyz.md']).should.eql([]); - mm(['a/b/d/xyz.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/c/xyz.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/cd/xyz.md'], ['a/b/c{d,e}/*.md']).should.eql(['a/b/cd/xyz.md']); - mm(['a/b/ce/xyz.md'], ['a/b/c{d,e}/*.md']).should.eql(['a/b/ce/xyz.md']); - }); - }); - - describe('directories:', function() { - it('should match a single directory deep:', function() { - assert.deepEqual(mm(['a/b/c/d/e', 'a/b/c/d', 'a/b/c', 'a/b', 'a'], ['*']), ['a']); - }); - - it('should match a directory for each `*/`', function() { - var fixture = ['a/b/c/d/e', 'a/b/c/d', 'a/b/c', 'a/b', 'a']; - assert.deepEqual(mm(fixture, ['*/*']), ['a/b']); - assert.deepEqual(mm(fixture, ['*/*/*']), ['a/b/c']); - assert.deepEqual(mm(fixture, ['*/*/*/*']), ['a/b/c/d']); - assert.deepEqual(mm(fixture, ['*/*/*/*/*']), ['a/b/c/d/e']); - }); - - it('should match no less than the numbe of `*/` patterns when a globstar is passed', function() { - var fixture = ['a/b/c/d/e', 'a/b/c/d', 'a/b/c', 'a/b', 'a']; - assert.deepEqual(mm(fixture, ['*/*/**']), ['a/b/c/d/e', 'a/b/c/d', 'a/b/c']); - assert.deepEqual(mm(fixture, ['*/*/*/**']), ['a/b/c/d/e', 'a/b/c/d']); - assert.deepEqual(mm(fixture, ['*/*/*/*/**']), ['a/b/c/d/e']); - assert.deepEqual(mm(fixture, ['*/*/*/*/*/**']), []); - }); - }); - - describe('double stars:', function() { - it('should match path segments:', function() { - mm(['.gitignore'], ['a/**/z/*.md']).should.eql([]); - mm(['a/b/z/.gitignore'], ['a/**/z/*.md']).should.eql([]); - mm(['a/b/c/d/e/z/d.md'], ['a/**/z/*.md']).should.eql(['a/b/c/d/e/z/d.md']); - - mm(['a/b/c/d/e/z/d.md'], ['a/**/j/**/z/*.md']).should.eql([]); - mm(['a/b/c/j/e/z/d.md'], ['a/**/j/**/z/*.md']).should.eql(['a/b/c/j/e/z/d.md']); - mm(['a/b/c/d/e/j/n/p/o/z/d.md'], ['a/**/j/**/z/*.md']).should.eql(['a/b/c/d/e/j/n/p/o/z/d.md']); - mm(['a/b/c/j/e/z/d.txt'], ['a/**/j/**/z/*.md']).should.eql([]); - - mm(['a/b/d/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']).should.eql([]); - mm(['a/b/c/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']).should.eql([]); - mm(['a/b/c/xyz.md'], ['a/b/**/c{d,e}/**/*.md']) - mm(['a/b/c/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']) - mm(['a/b/c/xyz.md'], ['a/b/**/c{d,e}/**/.*.md']) - mm(['a/b/d/cd/e/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']).should.eql(['a/b/d/cd/e/xyz.md']); - mm(['a/b/baz/ce/fez/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']).should.eql(['a/b/baz/ce/fez/xyz.md']); - }); - }); - - describe('negation', function() { - it('should create a regular expression for negating extensions:', function() { - mm(['.md'], ['!.md']).should.eql([]); - mm(['d.md'], ['!.md']).should.eql([]); - mm(['d.md'], ['*', '!.md']).should.eql(['d.md']); - mm(['d.md', 'c.txt'], ['*', '!.md']).should.eql(['d.md', 'c.txt']); - mm(['d.md', 'c.txt'], ['*', '!*.md']).should.eql(['c.txt']); - }); - - it('should negate files:', function() { - mm(['abc.md'], ['!*.md']).should.eql([]); - mm(['abc.md'], ['!**/*.md']).should.eql([]); - mm(['abc.txt'], ['*', '!*.md']).should.eql(['abc.txt']); - mm(['.dotfile.md'], ['!*.md']).should.eql([]); - mm(['.dotfile.txt'], ['.*', '!*.md']).should.eql(['.dotfile.txt']); - }); - - it('should match on full paths:', function() { - mm(['.gitignore'], ['a/b/c/*.md']).should.eql([]); - mm(['a/b/c/.gitignore'], ['a/b/c/*.md']).should.eql([]); - mm(['a/b/c/d.md'], ['a/b/c/*.md']).should.eql(['a/b/c/d.md']); - mm(['a/b/c/e.md'], ['a/b/c/*.md']).should.eql(['a/b/c/e.md']); - }); - - it('should expand braces:', function() { - mm(['iii.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/d/iii.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/c/iii.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/cd/iii.md'], ['a/b/c{d,e}/*.md']).should.eql(['a/b/cd/iii.md']); - mm(['a/b/ce/iii.md'], ['a/b/c{d,e}/*.md']).should.eql(['a/b/ce/iii.md']); - - mm(['xyz.md'], ['a/b/c{d,e}/xyz.md']).should.eql([]); - mm(['a/b/d/xyz.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/c/xyz.md'], ['a/b/c{d,e}/*.md']).should.eql([]); - mm(['a/b/cd/xyz.md'], ['a/b/c{d,e}/*.md']).should.eql(['a/b/cd/xyz.md']); - mm(['a/b/ce/xyz.md'], ['a/b/c{d,e}/*.md']).should.eql(['a/b/ce/xyz.md']); - mm(['a/b/cef/xyz.md'], ['a/b/c{d,e{f,g}}/*.md']).should.eql(['a/b/cef/xyz.md']); - mm(['a/b/ceg/xyz.md'], ['a/b/c{d,e{f,g}}/*.md']).should.eql(['a/b/ceg/xyz.md']); - mm(['a/b/cd/xyz.md'], ['a/b/c{d,e{f,g}}/*.md']).should.eql(['a/b/cd/xyz.md']); - }); - - it('should create a regular expression for double stars:', function() { - mm(['.gitignore'], ['a/**/z/*.md']).should.eql([]); - - mm(['a/b/z/.dotfile.md'], ['a/**/z/.*.md']).should.eql(['a/b/z/.dotfile.md']); - mm(['a/b/z/.dotfile'], ['a/**/z/*.md']).should.eql([]); - mm(['a/b/c/d/e/z/d.md'], ['a/**/z/*.md']).should.eql(['a/b/c/d/e/z/d.md']); - - mm(['a/b/c/d/e/z/d.md'], ['a/**/j/**/z/*.md']).should.eql([]); - mm(['a/b/c/j/e/z/d.md'], ['a/**/j/**/z/*.md']).should.eql(['a/b/c/j/e/z/d.md']); - mm(['a/b/c/d/e/j/n/p/o/z/d.md'], ['a/**/j/**/z/*.md']).should.eql(['a/b/c/d/e/j/n/p/o/z/d.md']); - mm(['a/b/c/j/e/z/d.txt'], ['a/**/j/**/z/*.md']).should.eql([]); - - mm(['a/b/d/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']).should.eql([]); - mm(['a/b/c/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']).should.eql([]); - mm(['a/b/d/cd/e/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']).should.eql(['a/b/d/cd/e/xyz.md']); - mm(['a/b/baz/ce/fez/xyz.md'], ['a/b/**/c{d,e}/**/xyz.md']).should.eql(['a/b/baz/ce/fez/xyz.md']); - }); - }); - - describe('options', function() { - it('should support the `matchBase` option:', function() { - mm(['a/b/c.md'], ['*.md']).should.eql([]); - mm(['a/b/c.md'], ['*.md'], {matchBase: true}).should.eql(['a/b/c.md']); - mm(['a/b.md', 'a/b.txt'], ['*.txt'], {matchBase: true}).should.eql(['a/b.txt']); - }); - - it('should support the `nocase` option:', function() { - mm(['a/b/d/e.md'], ['a/b/c/*.md']).should.eql([]); - mm(['a/b/c/e.md'], ['A/b/C/*.md']).should.eql([]); - mm(['a/b/c/e.md'], ['A/b/C/*.md'], {nocase: true}).should.eql(['a/b/c/e.md']); - mm(['a/b/c/e.md'], ['A/b/C/*.MD'], {nocase: true}).should.eql(['a/b/c/e.md']); - mm(['a/b/c.d/e.md'], ['A/b/C.d/*.MD'], {nocase: true}).should.eql(['a/b/c.d/e.md']); - }); - - it('should match dotfiles when `dotfile` is true:', function() { - var opts = { dot: true }; - - mm(['.gitignore'], ['.gitignore'], opts).should.eql(['.gitignore']); - mm(['d.md'], ['*.md'], opts).should.eql(['d.md']); - mm(['.verb.txt'], ['*.md'], opts).should.eql([]); - mm(['a/b/c/.gitignore'], ['*.md'], opts).should.eql([]); - mm(['a/b/c/.gitignore.md'], ['*.md'], opts).should.eql([]); - mm(['a/b/c/.gitignore.md'], ['**/*.md'], opts).should.eql(['a/b/c/.gitignore.md']); - mm(['.verb.txt'], ['*.md'], opts).should.eql([]); - mm(['.gitignore'], ['*.md'], opts).should.eql([]); - mm(['.gitignore'], ['*.*'], opts).should.eql(['.gitignore']); - mm(['.gitignore.md'], ['.*.md'], opts).should.eql(['.gitignore.md']); - mm(['.gitignore.md'], ['*.md'], opts).should.eql(['.gitignore.md']); - mm(['a/b/c/.verb.md'], ['**/*.md'], opts).should.eql(['a/b/c/.verb.md']); - - mm(['a/b/c/.gitignore.md'], ['*.md']).should.eql([]); - mm(['a/b/c/.gitignore.md'], ['**/.*.md']).should.eql(['a/b/c/.gitignore.md']); - mm(['a/b/c/.gitignore.md'], ['**/.*']).should.eql(['a/b/c/.gitignore.md']); - }); - }); -}); - diff --git a/test/minimatch.js b/test/minimatch.js new file mode 100644 index 00000000..e96b72a7 --- /dev/null +++ b/test/minimatch.js @@ -0,0 +1,122 @@ +'use strict'; + +var path = require('path'); +var assert = require('assert'); +var isWindows = require('is-windows'); +var extend = require('extend-shallow'); +var patterns = require('./fixtures/patterns'); +var mm = require('./support/match'); + +/** + * Minimatch comparison tests + */ + +describe('basic tests', function() { + patterns.forEach(function(unit, i) { + it(i + ': ' + unit[0], function() { + if (typeof unit === 'string') { + console.log(); + console.log(' ', unit); + return; + } + + // update fixtures list + if (typeof unit === 'function') { + unit(); + return; + } + + var pattern = unit[0]; + var expected = (unit[1] || []).sort(compare); + var options = extend({}, unit[2]); + var fixtures = unit[3] || patterns.fixtures; + mm.match(fixtures, pattern, expected, options); + }); + }); +}); + +describe('minimatch parity:', function() { + describe('backslashes', function() { + it('should match literal backslashes', function() { + if (isWindows()) { + mm.match(['\\'], '\\', ['/']); + } else { + mm.match(['\\'], '\\', ['\\']); + } + }); + }); + + /** + * Issues that minimatch fails on but micromatch passes + */ + + describe('minimatch issues (as of 12/7/2016)', function() { + it('https://github.com/isaacs/minimatch/issues/29', function() { + assert(mm.isMatch('foo/bar.txt', 'foo/**/*.txt')); + assert(mm.makeRe('foo/**/*.txt' ).test( 'foo/bar.txt')); + assert(!mm.isMatch('n/!(axios)/**', 'n/axios/a.js')); + assert(!mm.makeRe('n/!(axios)/**').test('n/axios/a.js')); + }); + + it('https://github.com/isaacs/minimatch/issues/30', function() { + assert(mm.isMatch('foo/bar.js', '**/foo/**')); + assert(mm.isMatch('./foo/bar.js', './**/foo/**')); + assert(mm.isMatch('./foo/bar.js', '**/foo/**')); + assert(mm.isMatch('./foo/bar.txt', 'foo/**/*.txt')); + assert(mm.makeRe('./foo/**/*.txt' ).test( 'foo/bar.txt')); + assert(!mm.isMatch('./foo/!(bar)/**', 'foo/bar/a.js')); + assert(!mm.makeRe('./foo/!(bar)/**').test('foo/bar/a.js')); + }); + + it('https://github.com/isaacs/minimatch/issues/50', function() { + assert(mm.isMatch('foo/bar-[ABC].txt', 'foo/**/*-\\[ABC\\].txt')); + assert(!mm.isMatch('foo/bar-[ABC].txt', 'foo/**/*-\\[abc\\].txt')); + assert(mm.isMatch('foo/bar-[ABC].txt', 'foo/**/*-\\[abc\\].txt', {nocase: true})); + }); + + it('https://github.com/isaacs/minimatch/issues/67 (should work consistently with `makeRe` and matcher functions)', function() { + var re = mm.makeRe('node_modules/foobar/**/*.bar'); + assert(re.test('node_modules/foobar/foo.bar')); + assert(mm.isMatch('node_modules/foobar/foo.bar', 'node_modules/foobar/**/*.bar')); + mm(['node_modules/foobar/foo.bar'], 'node_modules/foobar/**/*.bar', ['node_modules/foobar/foo.bar']); + }); + + it('https://github.com/isaacs/minimatch/issues/75', function() { + assert(mm.isMatch('foo/baz.qux.js', 'foo/@(baz.qux).js')); + assert(mm.isMatch('foo/baz.qux.js', 'foo/+(baz.qux).js')); + assert(mm.isMatch('foo/baz.qux.js', 'foo/*(baz.qux).js')); + assert(!mm.isMatch('foo/baz.qux.js', 'foo/!(baz.qux).js')); + assert(!mm.isMatch('foo/bar/baz.qux.js', 'foo/*/!(baz.qux).js')); + assert(!mm.isMatch('foo/bar/bazqux.js', '**/!(bazqux).js')); + assert(!mm.isMatch('foo/bar/bazqux.js', 'foo/**/!(bazqux).js')); + assert(!mm.isMatch('foo/bar/bazqux.js', 'foo/**/!(bazqux)*.js')); + assert(!mm.isMatch('foo/bar/baz.qux.js', 'foo/**/!(baz.qux)*.js')); + assert(!mm.isMatch('foo/bar/baz.qux.js', 'foo/**/!(baz.qux).js')); + assert(!mm.isMatch('foo.js', '!(foo)*.js')); + assert(!mm.isMatch('foo.js', '!(foo)*.js')); + assert(!mm.isMatch('foobar.js', '!(foo)*.js')); + }); + + it('https://github.com/isaacs/minimatch/issues/78', function() { + var sep = path.sep; + path.sep = '\\'; + assert(mm.isMatch('a\\b\\c.txt', 'a/**/*.txt')); + assert(mm.isMatch('a/b/c.txt', 'a/**/*.txt')); + path.sep = sep; + }); + + it('https://github.com/isaacs/minimatch/issues/82', function() { + assert(mm.isMatch('./src/test/a.js', '**/test/**')); + assert(mm.isMatch('src/test/a.js', '**/test/**')); + }); + + it('https://github.com/isaacs/minimatch/issues/83', function() { + assert(!mm.makeRe('foo/!(bar)/**').test('foo/bar/a.js')); + assert(!mm.isMatch('foo/!(bar)/**', 'foo/bar/a.js')); + }); + }); +}); + +function compare(a, b) { + return a === b ? 0 : a > b ? 1 : -1; +} diff --git a/test/minimatch/basic.js b/test/minimatch/basic.js deleted file mode 100644 index cdf15bff..00000000 --- a/test/minimatch/basic.js +++ /dev/null @@ -1,131 +0,0 @@ -var path = require('path'); -var should = require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var mm = require('../..'); - -if ('minimatch' in argv) { - mm = require('minimatch'); -} - -it('minimatch tests:', function() { - // http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test - mm.makeRe('a*').should.eql(/^(?:(?=.)a[^/]*?)$/); - mm.makeRe('X*', {nonull: true}).should.eql(/^(?:(?=.)X[^/]*?)$/); - mm.makeRe('X*').should.eql(/^(?:(?=.)X[^/]*?)$/); - mm.makeRe('\\*', {nonull: true}).should.eql(/^(?:\*)$/); - mm.makeRe('\\**', {nonull: true}).should.eql(/^(?:(?=.)\*[^/]*?)$/); - mm.makeRe('\\*\\*', {nonull: true}).should.eql(/^(?:\*\*)$/); - mm.makeRe('b*/').should.eql(/^(?:(?=.)b[^/]*?\/)$/); - mm.makeRe('c*').should.eql(/^(?:(?=.)c[^/]*?)$/); - mm.makeRe('**').should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?)$/); - mm.makeRe('\\.\\./*/').should.eql(/^(?:\.\.\/(?!\.)(?=.)[^/]*?\/)$/); - mm.makeRe('s/\\..*//').should.eql(/^(?:s\/(?=.)\.\.[^/]*?\/)$/); - - // legendary larry crashes bashes - mm.makeRe('/^root:/{s/^[^:]*:[^:]*:([^:]*).*$/\\1/').should.eql(/^(?:\/\^root:\/\{s\/(?=.)\^[^:][^/]*?:[^:][^/]*?:\([^:]\)[^/]*?\.[^/]*?\$\/1\/)$/); - mm.makeRe('/^root:/{s/^[^:]*:[^:]*:([^:]*).*$/\\1/').should.eql(/^(?:\/\^root:\/\{s\/(?=.)\^[^:][^/]*?:[^:][^/]*?:\([^:]\)[^/]*?\.[^/]*?\$\/1\/)$/); - - // character classes - mm.makeRe('[a-c]b*').should.eql(/^(?:(?!\.)(?=.)[a-c]b[^/]*?)$/); - mm.makeRe('[a-y]*[^c]').should.eql(/^(?:(?!\.)(?=.)[a-y][^/]*?[^c])$/); - mm.makeRe('a*[^c]').should.eql(/^(?:(?=.)a[^/]*?[^c])$/); - mm.makeRe('a[X-]b').should.eql(/^(?:(?=.)a[X-]b)$/); - mm.makeRe('[^a-c]*').should.eql(/^(?:(?!\.)(?=.)[^a-c][^/]*?)$/); - mm.makeRe('a\\*b/*').should.eql(/^(?:a\*b\/(?!\.)(?=.)[^/]*?)$/); - mm.makeRe('a\\*?/*').should.eql(/^(?:(?=.)a\*[^/]\/(?!\.)(?=.)[^/]*?)$/); - mm.makeRe('*\\\\!*').should.eql(/^(?:(?!\.)(?=.)[^/]*?\\\![^/]*?)$/); - mm.makeRe('*\\!*').should.eql(/^(?:(?!\.)(?=.)[^/]*?\![^/]*?)$/); - mm.makeRe('*.\\*').should.eql(/^(?:(?!\.)(?=.)[^/]*?\.\*)$/); - mm.makeRe('a[b]c').should.eql(/^(?:(?=.)a[b]c)$/); - mm.makeRe('a[\\b]c').should.eql(/^(?:(?=.)a[b]c)$/); - mm.makeRe('a?c').should.eql(/^(?:(?=.)a[^/]c)$/); - mm.makeRe('a\\*c').should.eql(/^(?:a\*c)$/); - mm.makeRe('').should.be.false(); - - // http://www.opensource.apple.com/source/bash/bash-23/bash/tests/glob-test - mm.makeRe('*/man*/bash.*').should.eql(/^(?:(?!\.)(?=.)[^/]*?\/(?=.)man[^/]*?\/(?=.)bash\.[^/]*?)$/); - mm.makeRe('man/man1/bash.1').should.eql(/^(?:man\/man1\/bash\.1)$/); - mm.makeRe('a***c').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/); - mm.makeRe('a*****?c').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/); - mm.makeRe('?*****??').should.eql(/^(?:(?!\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/); - mm.makeRe('*****??').should.eql(/^(?:(?!\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/); - mm.makeRe('?*****?c').should.eql(/^(?:(?!\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/); - mm.makeRe('?***?****c').should.eql(/^(?:(?!\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/); - mm.makeRe('?***?****?').should.eql(/^(?:(?!\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/); - mm.makeRe('?***?****').should.eql(/^(?:(?!\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('*******c').should.eql(/^(?:(?!\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/); - mm.makeRe('*******?').should.eql(/^(?:(?!\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/); - mm.makeRe('a*cd**?**??k').should.eql(/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/); - mm.makeRe('a**?**cd**?**??k').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/); - mm.makeRe('a**?**cd**?**??k***').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('a**?**cd**?**??***k').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/); - mm.makeRe('a**?**cd**?**??***k**').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/); - mm.makeRe('a****c**?**??*****').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('[-abc]').should.eql(/^(?:(?!\.)(?=.)[-abc])$/); - mm.makeRe('[abc-]').should.eql(/^(?:(?!\.)(?=.)[abc-])$/); - mm.makeRe('\\').should.eql(/^(?:\\)$/); - mm.makeRe('[\\\\]').should.eql(/^(?:(?!\.)(?=.)[\\])$/); - mm.makeRe('[[]').should.eql(/^(?:(?!\.)(?=.)[\[])$/); - mm.makeRe('[').should.eql(/^(?:\[)$/); - mm.makeRe('[*').should.eql(/^(?:(?=.)\[(?!\.)(?=.)[^/]*?)$/); - - // a right bracket shall lose its special meaning and - // represent itself in a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - mm.makeRe('[]]').should.eql(/^(?:(?!\.)(?=.)[\]])$/); - mm.makeRe('[]-]').should.eql(/^(?:(?!\.)(?=.)[\]-])$/); - mm.makeRe('[a-z]').should.eql(/^(?:(?!\.)(?=.)[a-z])$/); - mm.makeRe('??**********?****?').should.eql(/^(?:(?!\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/); - mm.makeRe('??**********?****c').should.eql(/^(?:(?!\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/); - mm.makeRe('?************c****?****').should.eql(/^(?:(?!\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('*c*?**').should.eql(/^(?:(?!\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/); - mm.makeRe('a*****c*?**').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/); - mm.makeRe('a********???*******').should.eql(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('[]').should.eql(/^(?:\[\])$/); - mm.makeRe('[abc').should.eql(/^(?:\[abc)$/); - - // nocase tests - mm.makeRe('XYZ', { nocase: true, null: true }).should.eql(/^(?:(?=.)XYZ)$/i); - mm.makeRe('ab*').should.eql(/^(?:(?=.)ab[^/]*?)$/); - mm.makeRe('ab*', { nocase: true, null: true }).should.eql(/^(?:(?=.)ab[^/]*?)$/i); - mm.makeRe('[ia]?[ck]').should.eql(/^(?:(?!\.)(?=.)[ia][^/][ck])$/); - - // onestar/twostar - mm.makeRe('{/*,*}').should.eql(/^(?:\/(?!\.)(?=.)[^/]*?|(?!\.)(?=.)[^/]*?)$/); - mm.makeRe('{/?,*}').should.eql(/^(?:\/(?!\.)(?=.)[^/]|(?!\.)(?=.)[^/]*?)$/); - - // dots should not match unless requested - mm.makeRe('**').should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?)$/); - mm.makeRe('a/*/b').should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/b)$/); - mm.makeRe('a/*/b', {dot: true}).should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b)$/); - mm.makeRe('a/.*/b').should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - mm.makeRe('a/.*/b', {dot: true}).should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - mm.makeRe('a/*/b').should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/b)$/); - mm.makeRe('a/*/b', {dot: true}).should.eql(/^(?:a\/(?!(?:^|\/)\.{1,2}(?:$|\/))(?=.)[^/]*?\/b)$/); - mm.makeRe('a/.*/b').should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - mm.makeRe('a/.*/b', {dot: true}).should.eql(/^(?:a\/(?=.)\.[^/]*?\/b)$/); - mm.makeRe('**').should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?)$/); - mm.makeRe('**', {dot: true}).should.eql(/^(?:(?:(?!(?:\/|^)(?:\.{1,2})($|\/)).)*?)$/); - - // paren sets cannot contain slashes - mm.makeRe('*(a/b)').should.eql(/^(?:(?!\.)(?=.)[^/]*?\(a\/b\))$/); - mm.makeRe('*(a|{b),c)}').should.eql(/^(?:(?!\.)(?=.)(?:a|b)*|(?!\.)(?=.)(?:a|c)*)$/); - mm.makeRe('[!a*').should.eql(/^(?:(?=.)\[(?=.)\!a[^/]*?)$/); - mm.makeRe('[#a*').should.eql(/^(?:(?=.)\[(?=.)#a[^/]*?)$/); - mm.makeRe('+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g').should.eql(/^(?:(?=.)\+\(a\|[^/]*?\|c\\\\\|d\\\\\|e\\\\\\\\\|f\\\\\\\\\|g)$/); - mm.makeRe('*(a|{b,c})').should.eql(/^(?:(?!\.)(?=.)(?:a|b)*|(?!\.)(?=.)(?:a|c)*)$/); - mm.makeRe('{a,*(b|c,d)}').should.eql(/^(?:a|(?!\.)(?=.)[^/]*?\(b\|c|d\))$/); - mm.makeRe('{a,*(b|{c,d})}').should.eql(/^(?:a|(?!\.)(?=.)(?:b|c)*|(?!\.)(?=.)(?:b|d)*)$/); - mm.makeRe('*(a|{b|c,c})').should.eql(/^(?:(?!\.)(?=.)(?:a|b|c)*|(?!\.)(?=.)(?:a|c)*)$/); - mm.makeRe('*(a|{b|c,c})').should.eql(/^(?:(?!\.)(?=.)(?:a|b|c)*|(?!\.)(?=.)(?:a|c)*)$/); - mm.makeRe('a?b').should.eql(/^(?:(?=.)a[^/]b)$/); - mm.makeRe('a?b', {nonull: true}).should.eql(/^(?:(?=.)a[^/]b)$/); - - // negation tests - mm.makeRe('!a*').should.eql(/^(?!^(?:(?=.)a[^/]*?)$).*$/); - mm.makeRe('!a*', {nonegate: true}).should.eql(/^(?:(?=.)\!a[^/]*?)$/); - mm.makeRe('!!a*').should.eql(/^(?:(?=.)a[^/]*?)$/); - mm.makeRe('!\\!a*').should.eql(/^(?!^(?:(?=.)\!a[^/]*?)$).*$/); - mm.makeRe('*.!(js)').should.eql(/^(?:(?!\.)(?=.)[^/]*?\.(?:(?!js)[^/]*?))$/); - mm.makeRe('**/.x/**').should.eql(/^(?:(?:(?!(?:\/|^)\.).)*?\/\.x\/(?:(?!(?:\/|^)\.).)*?)$/); -}); diff --git a/test/minimatch/defaults.js b/test/minimatch/defaults.js deleted file mode 100644 index 5faebf57..00000000 --- a/test/minimatch/defaults.js +++ /dev/null @@ -1,125 +0,0 @@ -var path = require('path'); -var should = require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var mm = require('../..'); - -if ('minimatch' in argv) { - mm = require('minimatch'); -} - -it('minimatch tests:', function() { - // http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test - mm.makeRe('a*').should.equal(/^(?:(?=.)a[^/]*?)$/); - mm.makeRe('X*').should.equal(/^(?:(?=.)X[^/]*?)$/); - mm.makeRe('X*').should.equal(/^(?:(?=.)X[^/]*?)$/); - mm.makeRe('\\*').should.equal(/^(?:\\*)$/); - mm.makeRe('\\**').should.equal(/^(?:(?=.)\\*[^/]*?)$/); - mm.makeRe('\\*\\*').should.equal(/^(?:\\*\\*)$/); - mm.makeRe('b*/').should.equal(/^(?:(?=.)b[^/]*?\\/)$/); - mm.makeRe('c*').should.equal(/^(?:(?=.)c[^/]*?)$/); - mm.makeRe('**').should.equal(/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/); - mm.makeRe('\\.\\./*/').should.equal(/^(?:\\.\\.\\/(?!\\.)(?=.)[^/]*?\\/)$/); - mm.makeRe('s/\\..*//').should.equal(/^(?:s\\/(?=.)\\.\\.[^/]*?\\/)$/); - - // legendary larry crashes bashes - mm.makeRe('/^root:/{s/^[^:]*:[^:]*:\\([^:]*).*$/\\1/').should.equal(/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/1\\/)$/); - mm.makeRe('/^root:/{s/^[^:]*:[^:]*:\\([^:]*).*$/\\1/').should.equal(/^(?:\\/\\^root:\\/\\{s\\/(?=.)\\^[^:][^/]*?:[^:][^/]*?:\\([^:]\\)[^/]*?\\.[^/]*?\\$\\/\u0001\\/)$/); - - // character classes - mm.makeRe('[a-c]b*').should.equal(/^(?:(?!\\.)(?=.)[a-c]b[^/]*?)$/); - mm.makeRe('[a-y]*[^c]').should.equal(/^(?:(?!\\.)(?=.)[a-y][^/]*?[^c])$/); - mm.makeRe('a*[^c]').should.equal(/^(?:(?=.)a[^/]*?[^c])$/); - mm.makeRe('a[X-]b').should.equal(/^(?:(?=.)a[X-]b)$/); - mm.makeRe('[^a-c]*').should.equal(/^(?:(?!\\.)(?=.)[^a-c][^/]*?)$/); - mm.makeRe('a\\*b/*').should.equal(/^(?:a\\*b\\/(?!\\.)(?=.)[^/]*?)$/); - mm.makeRe('a\\*?/*').should.equal(/^(?:(?=.)a\\*[^/]\\/(?!\\.)(?=.)[^/]*?)$/); - mm.makeRe('*\\\\!*').should.equal(/^(?:(?!\\.)(?=.)[^/]*?\\\\\\![^/]*?)$/); - mm.makeRe('*\\!*').should.equal(/^(?:(?!\\.)(?=.)[^/]*?\\![^/]*?)$/); - mm.makeRe('*.\\*').should.equal(/^(?:(?!\\.)(?=.)[^/]*?\\.\\*)$/); - mm.makeRe('a[b]c').should.equal(/^(?:(?=.)a[b]c)$/); - mm.makeRe('a[\\b]c').should.equal(/^(?:(?=.)a[b]c)$/); - mm.makeRe('a?c').should.equal(/^(?:(?=.)a[^/]c)$/); - mm.makeRe('a\\*c').should.equal(/^(?:a\\*c)$/); - mm.makeRe('').should.equal('false'); - - // http://www.opensource.apple.com/source/bash/bash-23/bash/tests/glob-test - mm.makeRe('*/man*/bash.*').should.equal(/^(?:(?!\\.)(?=.)[^/]*?\\/(?=.)man[^/]*?\\/(?=.)bash\\.[^/]*?)$/); - mm.makeRe('man/man1/bash.1').should.equal(/^(?:man\\/man1\\/bash\\.1)$/); - mm.makeRe('a***c').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?c)$/); - mm.makeRe('a*****?c').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/); - mm.makeRe('?*****??').should.equal(/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/); - mm.makeRe('*****??').should.equal(/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/])$/); - mm.makeRe('?*****?c').should.equal(/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]c)$/); - mm.makeRe('?***?****c').should.equal(/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/); - mm.makeRe('?***?****?').should.equal(/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/); - mm.makeRe('?***?****').should.equal(/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('*******c').should.equal(/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c)$/); - mm.makeRe('*******?').should.equal(/^(?:(?!\\.)(?=.)[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/])$/); - mm.makeRe('a*cd**?**??k').should.equal(/^(?:(?=.)a[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/); - mm.makeRe('a**?**cd**?**??k').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k)$/); - mm.makeRe('a**?**cd**?**??k***').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/]k[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('a**?**cd**?**??***k').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k)$/); - mm.makeRe('a**?**cd**?**??***k**').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/][^/]*?[^/]*?cd[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?k[^/]*?[^/]*?)$/); - mm.makeRe('a****c**?**??*****').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('[-abc]').should.equal(/^(?:(?!\\.)(?=.)[-abc])$/); - mm.makeRe('[abc-]').should.equal(/^(?:(?!\\.)(?=.)[abc-])$/); - mm.makeRe('\\').should.equal(/^(?:\\\\)$/); - mm.makeRe('[\\\\]').should.equal(/^(?:(?!\\.)(?=.)[\\\\])$/); - mm.makeRe('[[]').should.equal(/^(?:(?!\\.)(?=.)[\\[])$/); - mm.makeRe('[').should.equal(/^(?:\\[)$/); - mm.makeRe('[*').should.equal(/^(?:(?=.)\\[(?!\\.)(?=.)[^/]*?)$/); - - // a right bracket shall lose its special meaning and - // represent itself in a bracket expression if it occurs - // first in the list. -- POSIX.2 2.8.3.2 - mm.makeRe('[]]').should.equal(/^(?:(?!\\.)(?=.)[\\]])$/); - mm.makeRe('[]-]').should.equal(/^(?:(?!\\.)(?=.)[\\]-])$/); - mm.makeRe('[a-z]').should.equal(/^(?:(?!\\.)(?=.)[a-z])$/); - mm.makeRe('??**********?****?').should.equal(/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/])$/); - mm.makeRe('??**********?****c').should.equal(/^(?:(?!\\.)(?=.)[^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?c)$/); - mm.makeRe('?************c****?****').should.equal(/^(?:(?!\\.)(?=.)[^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/]*?[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('*c*?**').should.equal(/^(?:(?!\\.)(?=.)[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/); - mm.makeRe('a*****c*?**').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?c[^/]*?[^/][^/]*?[^/]*?)$/); - mm.makeRe('a********???*******').should.equal(/^(?:(?=.)a[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/][^/][^/][^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?[^/]*?)$/); - mm.makeRe('[]').should.equal(/^(?:\\[\\])$/); - mm.makeRe('[abc').should.equal(/^(?:\\[abc)$/); - - // nocase tests - mm.makeRe('XYZ').should.equal(/^(?:(?=.)XYZ)$/i); - mm.makeRe('ab*').should.equal(/^(?:(?=.)ab[^/]*?)$/i); - mm.makeRe('[ia]?[ck]').should.equal(/^(?:(?!\\.)(?=.)[ia][^/][ck])$/i); - - // onestar/twostar - mm.makeRe('{/*,*}').should.equal(/^(?:\\/(?!\\.)(?=.)[^/]*?|(?!\\.)(?=.)[^/]*?)$/); - mm.makeRe('{/?,*}').should.equal(/^(?:\\/(?!\\.)(?=.)[^/]|(?!\\.)(?=.)[^/]*?)$/); - - // dots should not match unless requested - mm.makeRe('**').should.equal(/^(?:(?:(?!(?:\\/|^)\\.).)*?)$/); - mm.makeRe('a/*/b').should.equal(/^(?:a\\/(?!(?:^|\\/)\\.{1,2}(?:$|\\/))(?=.)[^/]*?\\/b)$/); - mm.makeRe('a/.*/b').should.equal(/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/); - mm.makeRe('a/*/b').should.equal(/^(?:a\\/(?!\\.)(?=.)[^/]*?\\/b)$/); - mm.makeRe('a/.*/b').should.equal(/^(?:a\\/(?=.)\\.[^/]*?\\/b)$/); - mm.makeRe('**').should.equal(/^(?:(?:(?!(?:\\/|^)(?:\\.{1,2})($|\\/)).)*?)$/); - - // paren sets cannot contain slashes - mm.makeRe('*(a/b)').should.equal(/^(?:(?!\\.)(?=.)[^/]*?\\(a\\/b\\))$/); - mm.makeRe('*(a|{b),c)}').should.equal(/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/); - mm.makeRe('[!a*').should.equal(/^(?:(?=.)\\[(?=.)\\!a[^/]*?)$/); - mm.makeRe('[#a*').should.equal(/^(?:(?=.)\\[(?=.)#a[^/]*?)$/); - mm.makeRe('+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g').should.equal(/^(?:(?=.)\\+\\(a\\|[^/]*?\\|c\\\\\\\\\\|d\\\\\\\\\\|e\\\\\\\\\\\\\\\\\\|f\\\\\\\\\\\\\\\\\\|g)$/); - mm.makeRe('*(a|{b,c})').should.equal(/^(?:(?!\\.)(?=.)(?:a|b)*|(?!\\.)(?=.)(?:a|c)*)$/); - mm.makeRe('{a,*(b|c,d)}').should.equal(/^(?:a|(?!\\.)(?=.)[^/]*?\\(b\\|c|d\\))$/); - mm.makeRe('{a,*(b|{c,d})}').should.equal(/^(?:a|(?!\\.)(?=.)(?:b|c)*|(?!\\.)(?=.)(?:b|d)*)$/); - mm.makeRe('*(a|{b|c,c})').should.equal(/^(?:(?!\\.)(?=.)(?:a|b|c)*|(?!\\.)(?=.)(?:a|c)*)$/); - mm.makeRe('*(a|{b|c,c})').should.equal(/^(?:(?!\\.)(?=.)[^\/]*?\\(a\\|b\\|c\\)|(?!\\.)(?=.)[^/]*?\\(a\\|c\\))$/); - mm.makeRe('a?b').should.equal(/^(?:(?=.)a[^/]b)$/); - mm.makeRe('#*').should.equal(/^(?:(?=.)#[^/]*?)$/); - - // negation tests - mm.makeRe('!a*').should.equal(/^(?!^(?:(?=.)a[^/]*?)$).*$/); - mm.makeRe('!a*').should.equal(/^(?:(?=.)\\!a[^/]*?)$/); - mm.makeRe('!!a*').should.equal(/^(?:(?=.)a[^/]*?)$/); - mm.makeRe('!\\!a*').should.equal(/^(?!^(?:(?=.)\\!a[^/]*?)$).*$/); - mm.makeRe('*.!(js)').should.equal(/^(?:(?!\\.)(?=.)[^/]*?\\.(?:(?!js)[^/]*?))$/); - mm.makeRe('**/.x/**').should.equal(/^(?:(?:(?!(?:\\/|^)\\.).)*?\\/\\.x\\/(?:(?!(?:\\/|^)\\.).)*?)$/); -}); diff --git a/test/minimatch/temp.js b/test/minimatch/temp.js deleted file mode 100644 index 0a51e5be..00000000 --- a/test/minimatch/temp.js +++ /dev/null @@ -1,132 +0,0 @@ -var path = require('path'); -var should = require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var mm = require('../..'); - -if ('minimatch' in argv) { - mm = require('minimatch'); -} - -it('minimatch tests:', function() { - // http://www.bashcookbook.com/bashinfo/source/bash-1.14.7/tests/glob-test - mm.makeRe('a*').should.eql(/^(?:a[^/]*?)$/); - mm.makeRe('X*', {nonull: true}).should.eql(/^(?:X[^/]*?)$/); - mm.makeRe('X*').should.eql(/^(?:X[^/]*?)$/); - mm.makeRe('\\*', {nonull: true}).should.eql(/^(?:\*)$/); - mm.makeRe('a/*\\*/b', {nonull: true}).should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\*\/b)$/); - mm.makeRe('\\**', {nonull: true}).should.eql(/^(?:\*[^/]*?)$/); - mm.makeRe('\\*\\*', {nonull: true}).should.eql(/^(?:\*\*)$/); - mm.makeRe('b*/').should.eql(/^(?:b(?!\.)(?=.)[^/]*?\/)$/); - mm.makeRe('c*').should.eql(/^(?:c[^/]*?)$/); - mm.makeRe('**').should.eql(/^(?:(?:(?!(?:^|\/)\.).)*?)$/); - mm.makeRe('\\.\\./*/').should.eql(/^(?:\.\.\/(?!\.)(?=.)[^/]*?\/)$/); - mm.makeRe('s/\\..*//').should.eql(/^(?:s\/\..(?!\.)(?=.)[^/]*?\/\/)$/); - -// legendary larry crashes bashes - mm.makeRe('/^root:/{s/^[^:]*:[^:]*:([^:]*).*$/\\1/').should.eql(/^(?:\/^root:\/{s\/^(?!\.)(?=.)[^:](?!\.)(?=.)[^/]*?:(?!\.)(?=.)[^:](?!\.)(?=.)[^/]*?:((?!\.)(?=.)[^:](?!\.)(?=.)[^/]*?).(?!\.)(?=.)[^/]*?$\/\1\/)$/); - mm.makeRe('/^root:/{s/^[^:]*:[^:]*:([^:]*).*$/\\1/').should.eql(/^(?:\/^root:\/{s\/^(?!\.)(?=.)[^:](?!\.)(?=.)[^/]*?:(?!\.)(?=.)[^:](?!\.)(?=.)[^/]*?:((?!\.)(?=.)[^:](?!\.)(?=.)[^/]*?).(?!\.)(?=.)[^/]*?$\/\1\/)$/); - - // character classes - mm.makeRe('[a-c]b*').should.eql(/^(?:(?!\.)(?=.)[a-c]b[^/]*?)$/); - mm.makeRe('[a-y]*[^c]').should.eql(/^(?:(?!\.)(?=.)[a-y](?!\.)(?=.)[^/]*?(?!\.)(?=.)[^c])$/); - mm.makeRe('a*[^c]').should.eql(/^(?:a(?!\.)(?=.)[^/]*?(?!\.)(?=.)[^c])$/); - mm.makeRe('a[X-]b').should.eql(/^(?:a(?!\.)(?=.)[X-]b)$/); - mm.makeRe('[^a-c]*').should.eql(/^(?:(?!\.)(?=.)[^a-c][^/]*?)$/); - mm.makeRe('a\\*b/*').should.eql(/^(?:a\*b\/(?!\.)(?=.)[^/]*?)$/); - mm.makeRe('a\\*?/*').should.eql(/^(?:a\%\/(?!\.)(?=.)[^/]\/(?!\.)(?=.)[^/]*?)$/); - mm.makeRe('*\\\\!*').should.eql(/^(?:(?!\.)(?=.)[^/]*?\\![^/]*?)$/); - mm.makeRe('*\\!*').should.eql(/^(?:(?!\.)(?=.)[^/]*?\![^/]*?)$/); - mm.makeRe('*.\\*').should.eql(/^(?:(?!\.)(?=.)[^/]*?.\*)$/); - mm.makeRe('a[b]c').should.eql(/^(?:a(?!\.)(?=.)[b]c)$/); - mm.makeRe('a[\\b]c').should.eql(/^(?:a(?!\.)(?=.)[\b]c)$/); - mm.makeRe('a?c').should.eql(/^(?:\/(?!\.)(?=.)[^/]c)$/); - mm.makeRe('a\\*c').should.eql(/^(?:a\*c)$/); - mm.makeRe('').should.eql(/^(?:)$/); - - // http://www.opensource.apple.com/source/bash/bash-23/bash/tests/glob-test - mm.makeRe('*/man*/bash.*').should.eql(/^(?:(?!\.)(?=.)[^/]*?\/man(?!\.)(?=.)[^/]*?\/bash.[^/]*?)$/); - mm.makeRe('man/man1/bash.1').should.eql(/^(?:man\/man1\/bash\.1)$/); - mm.makeRe('a***c').should.eql(/^(?:a.*(?!\.)(?=.)[^/]*?c)$/); - mm.makeRe('a*****?c').should.eql(/^(?:a.*.*\/(?!\.)(?=.)[^/]c)$/); - // console.log(mm.makeRe('?*****??')); - mm.makeRe('*****??').should.eql(/^(?:.*.*\/(?!\.)(?=.)[^/][^/])$/); -// console.log(mm.makeRe('?*****?c')); -// console.log(mm.makeRe('?***?****c')); -// console.log(mm.makeRe('?***?****?')); -// console.log(mm.makeRe('?***?****')); -// // console.log(mm.makeRe('*******c')); -// // console.log(mm.makeRe('*******?')); -// // console.log(mm.makeRe('a*cd**?**??k')); -// // console.log(mm.makeRe('a**?**cd**?**??k')); -// // console.log(mm.makeRe('a**?**cd**?**??k***')); -// // console.log(mm.makeRe('a**?**cd**?**??***k')); -// // console.log(mm.makeRe('a**?**cd**?**??***k**')); -// // console.log(mm.makeRe('a****c**?**??*****')); -// mm.makeRe('[-abc]').should.eql(/^(?:(?!\.)(?=.)[-abc])$/); -// mm.makeRe('[abc-]').should.eql(/^(?:(?!\.)(?=.)[abc-])$/); -// // console.log(mm.makeRe('\\')); -// mm.makeRe('[\\\\]').should.eql(/^(?:(?!\.)(?=.)[\\])$/); -// mm.makeRe('[[]').should.eql(/^(?:(?!\.)(?=.)[(?!\.)(?=.)[])$/); -// // console.log(mm.makeRe('[')); -// mm.makeRe('[*').should.eql(/^(?:(?!\.)(?=.)[[^/]*?)$/); - -// // a right bracket shall lose its special meaning and -// // represent itself in a bracket expression if it occurs -// // first in the list. -- POSIX.2 2.8.3.2 -// mm.makeRe('[]]').should.eql(/^(?:(?!\.)(?=.)[]])$/); -// mm.makeRe('[]-]').should.eql(/^(?:(?!\.)(?=.)[]-])$/); -// mm.makeRe('[a-z]').should.eql(/^(?:(?!\.)(?=.)[a-z])$/); -// mm.makeRe('??**********?****?').should.eql(/^(?:[^/]?\.*.*.*.*.*?\.*.%\/(?!\.)(?=.)[^/])$/); -// mm.makeRe('??**********?****c').should.eql(/^(?:[^/]?\.*.*.*.*.*?\.*.*c)$/); -// // console.log(mm.makeRe('?************c****?****')); -// // console.log(mm.makeRe('*c*?**')); -// // console.log(mm.makeRe('a*****c*?**')); -// mm.makeRe('a********???*******').should.eql(/^(?:a.*.*.*.%\/(?!\.)(?=.)[^/][^/]?\.*.*.*[^/]*?)$/); -// mm.makeRe('[]').should.eql(/^(?:(?!\.)(?=.)[])$/); -// // console.log(mm.makeRe('[abc')); - -// // nocase tests -// mm.makeRe('XYZ', { nocase: true, null: true }).should.eql(/^(?:XYZ)$/i); -// mm.makeRe('ab*').should.eql(/^(?:ab[^/]*?)$/); -// mm.makeRe('ab*', { nocase: true, null: true }).should.eql(/^(?:ab[^/]*?)$/i); -// mm.makeRe('[ia]?[ck]').should.eql(/^(?:(?!\.)(?=.)[ia\/(?!\.)(?=.)[^/](?!\.)(?=.)[ck])$/); - -// // onestar/twostar -// mm.makeRe('{/*,*}').should.eql(/^(?:(?:\/(?!\.)(?=.)[^/]*?|(?!\.)(?=.)[^/]*?))$/); -// mm.makeRe('{/?,*}').should.eql(/^(?:(?:\/(?!\.)(?=.)[^/]|(?!\.)(?=.)[^/]*?))$/); - -// // dots should not match unless requested -// mm.makeRe('**').should.eql(/^(?:(?:(?!(?:^|\/)\.).)*?)$/); -// mm.makeRe('a/*/b').should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/b)$/); -// mm.makeRe('a/*/b', {dot: true}).should.eql(/^(?:a\/(?!(?:^|\/)(?:\.{1,2})(?:\/|$))(?=.)[^/]*?\/b)$/); -// mm.makeRe('a/.*/b').should.eql(/^(?:a\/.(?!\.)(?=.)[^/]*?\/b)$/); -// mm.makeRe('a/.*/b', {dot: true}).should.eql(/^(?:a\/.(?!(?:^|\/)(?:\.{1,2})(?:\/|$))(?=.)[^/]*?\/b)$/); -// mm.makeRe('a/*/b').should.eql(/^(?:a\/(?!\.)(?=.)[^/]*?\/b)$/); -// mm.makeRe('a/*/b', {dot: true}).should.eql(/^(?:a\/(?!(?:^|\/)(?:\.{1,2})(?:\/|$))(?=.)[^/]*?\/b)$/); -// mm.makeRe('a/.*/b').should.eql(/^(?:a\/.(?!\.)(?=.)[^/]*?\/b)$/); -// mm.makeRe('a/.*/b', {dot: true}).should.eql(/^(?:a\/.(?!(?:^|\/)(?:\.{1,2})(?:\/|$))(?=.)[^/]*?\/b)$/); -// mm.makeRe('**').should.eql(/^(?:(?:(?!(?:^|\/)\.).)*?)$/); -// mm.makeRe('**', {dot: true}).should.eql(/^(?:.*)$/); - -// // paren sets cannot contain slashes -// // console.log(mm.makeRe('*(a/b)')); -// // console.log(mm.makeRe('*(a|{b),c)}')); -// mm.makeRe('[!a*').should.eql(/^(?:(?!\.)(?=.)[!a[^/]*?)$/); -// mm.makeRe('[#a*').should.eql(/^(?:(?!\.)(?=.)[#a[^/]*?)$/); -// // console.log(mm.makeRe('+(a|*\\|c\\\\|d\\\\\\|e\\\\\\\\|f\\\\\\\\\\|g')); -// // console.log(mm.makeRe('*(a|{b,c})')); -// // console.log(mm.makeRe('{a,*(b|c,d)}')); -// // console.log(mm.makeRe('{a,*(b|{c,d})}')); -// // console.log(mm.makeRe('*(a|{b|c,c})')); -// // console.log(mm.makeRe('*(a|{b|c,c})')); -// mm.makeRe('a?b').should.eql(/^(?:\/(?!\.)(?=.)[^/]b)$/); -// mm.makeRe('a?b', {nonull: true}).should.eql(/^(?:\/(?!\.)(?=.)[^/]b)$/); - -// // negation tests -// mm.makeRe('!a*').should.eql(/^(?!^(?:a[^/]*?)$).*$/); -// mm.makeRe('!a*', {nonegate: true}).should.eql(/^(?!^(?:a[^/]*?)$).*$/); -// mm.makeRe('!!a*').should.eql(/^(?!^(?:!a[^/]*?)$).*$/); -// mm.makeRe('!\\!a*').should.eql(/^(?!^(?:\!a[^/]*?)$).*$/); -// // console.log(mm.makeRe('*.!(js)')); -// mm.makeRe('**/.x/**').should.eql(/^(?:.*\/?\.x\/.*)$/); -}); \ No newline at end of file diff --git a/test/negation.js b/test/negation.js index a9396c17..162316b7 100644 --- a/test/negation.js +++ b/test/negation.js @@ -1,66 +1,93 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - 'use strict'; -var path = require('path'); -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); +var mi = require('minimatch'); +var isWindows = require('is-windows'); +var mm = require('./support/match'); -if ('minimatch' in argv) { - mm = ref; -} +describe('negation', function() { + it('should negate files with extensions:', function() { + mm(['.md'], '!.md', []); + mm(['a.js', 'b.md', 'c.txt'], '!**/*.md', ['a.js', 'c.txt']); + mm(['a.js', 'b.md', 'c.txt'], '!*.md', ['a.js', 'c.txt']); + mm(['abc.md', 'abc.txt'], '!*.md', ['abc.txt']); + mm(['foo.md'], '!*.md', []); + mm(['foo.md'], '!.md', ['foo.md']); + }); -describe('negation patterns', function() { - describe('.match()', function() { - it('should create a regular expression for negating extensions:', function() { - mm.match(['.md'], '!.md').should.eql([]); - mm.match(['foo.md'], '!.md').should.eql(['foo.md']); - mm.match(['foo.md'], '!*.md').should.eql([]); - }); + it('should only treat leading exclamation as special', function() { + mm(['foo!.md', 'bar.md'], 'foo!.md', ['foo!.md']); + mm(['foo!.md', 'bar.md'], '*.md', ['foo!.md', 'bar.md']); + mm(['foo!.md', 'bar.md'], '*!.md', ['foo!.md']); + mm(['foobar.md'], '*b*.md', ['foobar.md']); + mm(['foo!bar.md', 'foo!.md', '!foo!.md'], '*!*.md', ['foo!bar.md', 'foo!.md', '!foo!.md']); + mm(['foo!bar.md', 'foo!.md', '!foo!.md'], '\\!*!*.md', ['!foo!.md']); + mm(['foo!.md', 'ba!r.js'], '**/*!*.*', ['foo!.md', 'ba!r.js']); + }); - it('should negate files with extensions:', function() { - mm.match(['abc.md'], '!*.md').should.eql([]); - mm.match(['abc.txt'], '!*.md').should.eql(['abc.txt']); - mm.match(['a.js', 'b.md', 'c.txt'], '!**/*.md').should.eql(['a.js', 'c.txt']); - }); + it('should support negated globs ("*")', function() { + mm(['a.js', 'b.txt', 'c.md'], '!*.md', ['a.js', 'b.txt']); + mm(['a/a/a.js', 'a/b/a.js', 'a/c/a.js'], '!a/*/a.js', []); + mm(['a/a/a/a.js', 'b/a/b/a.js', 'c/a/c/a.js'], '!a/*/*/a.js', ['b/a/b/a.js', 'c/a/c/a.js']); + mm(['a/a.txt', 'a/b.txt', 'a/c.txt'], '!a/a*.txt', ['a/b.txt', 'a/c.txt']); + mm(['a.a.txt', 'a.b.txt', 'a.c.txt'], '!a.a*.txt', ['a.b.txt', 'a.c.txt']); + mm(['a/a.txt', 'a/b.txt', 'a/c.txt'], '!a/*.txt', []); + }); - it('should negate dotfiles:', function() { - mm.match(['.dotfile.md'], '!*.md').should.eql(['.dotfile.md']); - mm.match(['.dotfile.txt'], '!*.md').should.eql(['.dotfile.txt']); - mm.match(['.gitignore', 'a', 'b'], '!.gitignore').should.eql(['a', 'b']); - }); + it('should support negated globstars ("**")', function() { + mm(['a.js', 'b.txt', 'c.md'], '!*.md', ['a.js', 'b.txt']); + mm(['a/a/a.js', 'a/b/a.js', 'a/c/a.js', 'a/a/b.js'], '!**/a.js', ['a/a/b.js']); + mm(['a/a/a/a.js', 'b/a/b/a.js', 'c/a/c/a.js'], '!a/**/a.js', ['b/a/b/a.js', 'c/a/c/a.js']); + mm(['a/a.txt', 'a/b.txt', 'a/c.txt'], '!a/b.txt', ['a/a.txt', 'a/c.txt']); + mm(['a/b.js', 'a.js', 'a/b.md', 'a.md'], '!**/*.md', ['a/b.js', 'a.js']); + mm(['a/b.js', 'a.js', 'a/b.md', 'a.md'], '**/*.md', ['a/b.md', 'a.md']); - it('should negate files in the immediate directory:', function() { - mm.match(['a/b.js', 'a.js', 'a/b.md', 'a.md'], '!*.md').should.eql(['a/b.js', 'a.js', 'a/b.md']); - }); + mm(['a/b.js'], '!**/*.md', ['a/b.js']); + mm(['a.js'], '!**/*.md', ['a.js']); + mm(['a/b.md'], '!**/*.md', []); + mm(['a.md'], '!**/*.md', []); - it('should negate files in any directory:', function() { - mm.match(['a/b.js', 'a.js', 'a/b.md', 'a.md'], '!**/*.md').should.eql(['a/b.js', 'a.js']); - }); + mm(['a/b.js'], '!*.md', ['a/b.js']); + mm(['a.js'], '!*.md', ['a.js']); + mm(['a/b.md'], '!*.md', ['a/b.md']); + mm(['a.md'], '!*.md', []); - it('should create a regular expression for double stars:', function() { - mm.match(['.gitignore'], 'a/**/z/*.md').should.eql([]); + mm(['a.js'], '!**/*.md', ['a.js']); + mm(['b.md'], '!**/*.md', []); + mm(['c.txt'], '!**/*.md', ['c.txt']); + }); - mm.match(['a/b/z/.dotfile.md'], 'a/**/z/.*.md').should.eql(['a/b/z/.dotfile.md']); - mm.match(['a/b/z/.dotfile'], 'a/**/z/*.md').should.eql([]); - mm.match(['a/b/c/d/e/z/foo.md'], 'a/**/z/*.md').should.eql(['a/b/c/d/e/z/foo.md']); + it('should negate dotfiles:', function() { + mm(['.dotfile.md'], '!*.md', {dot: true}, []); + mm(['.dotfile.md'], '!*.md', ['.dotfile.md']); + mm(['.dotfile.txt'], '!*.md', ['.dotfile.txt']); + mm(['.dotfile.txt', 'a/b/.dotfile'], '!*.md', ['.dotfile.txt', 'a/b/.dotfile']); + mm(['.gitignore', 'a', 'b'], '!.gitignore', ['a', 'b']); + }); - mm.match(['a/b/c/d/e/z/foo.md'], 'a/**/j/**/z/*.md').should.eql([]); - mm.match(['a/b/c/j/e/z/foo.md'], 'a/**/j/**/z/*.md').should.eql(['a/b/c/j/e/z/foo.md']); - mm.match(['a/b/c/d/e/j/n/p/o/z/foo.md'], 'a/**/j/**/z/*.md').should.eql(['a/b/c/d/e/j/n/p/o/z/foo.md']); - mm.match(['a/b/c/j/e/z/foo.txt'], 'a/**/j/**/z/*.md').should.eql([]); + it('should negate files in the immediate directory:', function() { + mm(['a/b.js', 'a.js', 'a/b.md', 'a.md'], '!*.md', ['a/b.js', 'a.js', 'a/b.md']); + }); + + it('should support any number of leading exclamations', function() { + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!!a*', ['a!b']); + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!!!!a*', ['a!b']); + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!!!!!!a*', ['a!b']); + if (!isWindows()) { + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!!!!!a*', ['d', 'e', '!ab', '!abc', '\\!a']); + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!a*', ['d', 'e', '!ab', '!abc', '\\!a']); + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!!!a*', ['d', 'e', '!ab', '!abc', '\\!a']); + } else { + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!!!!!a*', ['d', 'e', '!ab', '!abc', '/!a']); + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!a*', ['d', 'e', '!ab', '!abc', '/!a']); + mm(['d', 'e', '!ab', '!abc', 'a!b', '\\!a'], '!!!a*', ['d', 'e', '!ab', '!abc', '/!a']); + } + }); + + it('should not give special meaning to non-leading exclamations', function() { + mm(['a', 'aa', 'a/b', 'a!b', 'a!!b', 'a/!!/b'], 'a!!b', ['a!!b']); + }); - mm.match(['a/b/d/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm.match(['a/b/c/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm.match(['a/b/foo/cd/bar/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql(['a/b/foo/cd/bar/xyz.md']); - mm.match(['a/b/baz/ce/fez/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql(['a/b/baz/ce/fez/xyz.md']); - }); + it('should negate files in any directory:', function() { + mm(['a/a.txt', 'a/b.txt', 'a/c.txt'], '!a/b.txt', ['a/a.txt', 'a/c.txt']); }); }); diff --git a/test/options.js b/test/options.js index 4a4b179c..61370091 100644 --- a/test/options.js +++ b/test/options.js @@ -1,158 +1,390 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - 'use strict'; +var assert = require('assert'); var path = require('path'); -require('should'); -var argv = require('minimist')(process.argv.slice(2)); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = require('minimatch'); -} - -describe('options.flags', function() { - it('should support the `flags` option:', function() { - mm.match(['a/b/d/e.md'], 'a/b/D/*.md').should.eql([], 'should not match a dirname'); - mm.match(['a/b/d/e.md'], 'a/b/D/*.md', {flags: 'i'}).should.eql(['a/b/d/e.md']); - mm.match(['a/b/c/e.md'], 'A/b/*/E.md').should.eql([], 'should not match a basename'); - mm.match(['a/b/c/e.md'], 'A/b/*/E.md', {flags: 'i'}).should.eql(['a/b/c/e.md']); - mm.match(['a/b/c/e.md'], 'A/b/C/*.MD').should.eql([], 'should not match a file extension'); - mm.match(['a/b/c/e.md'], 'A/b/C/*.MD', {flags: 'i'}).should.eql(['a/b/c/e.md']); +var sep = path.sep; +var mm = require('./support/match'); + +describe('options', function() { + beforeEach(function() { + path.sep = '\\'; }); -}); + afterEach(function() { + path.sep = sep; + }); + + describe('options.ignore', function() { + var negations = ['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'b/c', 'a/d', 'a/e']; + var globs = ['a', 'a/a', 'a/a/a', 'a/a/a/a', '.a', 'a/.a', '.a/a', '.a/a/a', 'a/a/.a', '.a/a/a/a', 'a/a/a/a/a', 'a/a/b', 'a/b', 'a/b/c', 'a/c', 'a/x', 'b', 'b/b/b', 'b/b/c', 'c/c/c', 'e/f/g', 'h/i/a', 'x/x/x', 'x/y', 'z/z', 'z/z/z']; + + it('should filter out ignored patterns', function() { + var opts = {ignore: ['a/**']}; + + mm(globs, '*', ['a', 'b'], opts); + mm(globs, '*', ['b'], {ignore: '**/a'}); + mm(globs, '*/*', ['x/y', 'z/z'], opts); + mm(globs, '*/*/*', ['b/b/b', 'b/b/c', 'c/c/c', 'e/f/g', 'h/i/a', 'x/x/x', 'z/z/z'], opts); + mm(globs, '*/*/*/*', [], opts); + mm(globs, '*/*/*/*/*', [], opts); + mm(globs, 'a/*', [], opts); + mm(globs, '**/*/x', ['x/x/x'], opts); + mm(globs, '**/*/[b-z]', ['b/b/b', 'b/b/c', 'c/c/c', 'e/f/g', 'x/x/x', 'x/y', 'z/z', 'z/z/z'], opts); + + mm(globs, '*', ['a', '.a', 'b'], {ignore: 'a/**', dot: true}); + mm(globs, '*', ['b', '.a'], {ignore: '**/a', dot: true}); + mm(globs, '*/*', ['.a/a', 'x/y', 'z/z'], {ignore: 'a/**', dot: true}); + mm(globs, '*/*/*', ['.a/a/a', 'b/b/b', 'b/b/c', 'c/c/c', 'e/f/g', 'h/i/a', 'x/x/x', 'z/z/z'], {ignore: 'a/**', dot: true}); + mm(globs, '*/*/*/*', ['.a/a/a/a'], {ignore: 'a/**', dot: true}); + mm(globs, '*/*/*/*/*', [], {ignore: 'a/**', dot: true}); + mm(globs, 'a/*', [], {ignore: 'a/**', dot: true}); + mm(globs, '**/*/x', ['x/x/x'], {ignore: 'a/**', dot: true}); -describe('options.nocase', function() { - it('should support the `nocase` option:', function() { - mm.match(['a/b/d/e.md'], 'a/b/D/*.md').should.eql([], 'should not match a dirname'); - mm.match(['a/b/d/e.md'], 'a/b/D/*.md', {nocase: true}).should.eql(['a/b/d/e.md']); - mm.match(['a/b/c/e.md'], 'A/b/*/E.md').should.eql([], 'should not match a basename'); - mm.match(['a/b/c/e.md'], 'A/b/*/E.md', {nocase: true}).should.eql(['a/b/c/e.md']); - mm.match(['a/b/c/e.md'], 'A/b/C/*.MD').should.eql([], 'should not match a file extension'); - mm.match(['a/b/c/e.md'], 'A/b/C/*.MD', {nocase: true}).should.eql(['a/b/c/e.md']); - mm.match(['a/b/c/e.md'], 'A/b/C/E.MD').should.eql([], 'should not match a file extension'); - mm.match(['a/b/c/e.md'], 'A/b/C/E.MD', {nocase: true}).should.eql(['a/b/c/e.md']); - }); - - it('should use correct flags when `flags` and `nocase` are used (no double `i`):', function() { - var opts = {nocase: true, flags: 'i'}; - mm.match(['a/b/d/e.md'], 'a/b/D/*.md').should.eql([], 'should not match a dirname'); - mm.match(['a/b/d/e.md'], 'a/b/D/*.md', opts).should.eql(['a/b/d/e.md']); - mm.match(['a/b/c/e.md'], 'A/b/*/E.md').should.eql([], 'should not match a basename'); - mm.match(['a/b/c/e.md'], 'A/b/*/E.md', opts).should.eql(['a/b/c/e.md']); - mm.match(['a/b/c/e.md'], 'A/b/C/*.MD').should.eql([], 'should not match a file extension'); - mm.match(['a/b/c/e.md'], 'A/b/C/*.MD', opts).should.eql(['a/b/c/e.md']); - mm.match(['a/b/c/e.md'], 'A/b/C/E.MD').should.eql([], 'should not match a file extension'); - mm.match(['a/b/c/e.md'], 'A/b/C/E.MD', opts).should.eql(['a/b/c/e.md']); + // see https://github.com/jonschlinkert/micromatch/issues/79 + mm(['foo.js', 'a/foo.js'], '**/foo.js', ['foo.js', 'a/foo.js']); + mm(['foo.js', 'a/foo.js'], '**/foo.js', ['foo.js', 'a/foo.js'], {dot: true}); + + mm(negations, '!b/a', ['b/b', 'b/c'], opts); + mm(negations, '!b/(a)', ['b/b', 'b/c'], opts); + mm(negations, '!(b/(a))', ['b/b', 'b/c'], opts); + mm(negations, '!(b/a)', ['b/b', 'b/c'], opts); + + mm(negations, '**', negations, 'nothing is ignored'); + mm(negations, '**', ['a/c', 'a/d', 'a/e', 'b/c'], {ignore: ['*/b', '*/a']}); + mm(negations, '**', [], {ignore: ['**']}); + }); + + it('should "un-ignore" values when a negation pattern is passed', function() { + mm(negations, '**', ['a/d'], {ignore: ['**', '!*/d']}); + mm(negations, '**', ['a/a', 'b/a'], {ignore: ['**', '!*/a']}); + }); }); -}); -describe('options.ignore', function() { - it('should support the `ignore` option:', function() { - mm.match(['a/b', 'a/c', 'a/d', 'a/e'], '**').should.eql(['a/b', 'a/c', 'a/d', 'a/e'], 'nothing is ignored'); - mm.match(['a/b', 'a/c', 'a/d', 'a/e'], '**', {ignore: ['*/d', '*/e']}).should.eql(['a/b', 'a/c']); - mm.match(['a/b', 'a/c', 'a/d', 'a/e'], '**', {ignore: ['**']}).should.eql([]); - mm.match(['a/b', 'a/c', 'a/d', 'a/e'], '**', {ignore: ['**', '!*/d']}).should.eql(['a/d']); + describe('options.expand', function() { + it('should expand braces to an array', function() { + assert.deepEqual(mm.braces('{a,b}', {expand: true}), ['a', 'b']); + assert.deepEqual(mm.braces('foo/{a,b}/bar', {expand: true}), ['foo/a/bar', 'foo/b/bar']); + }); }); -}); -describe('options.matchBase', function() { - it('should support the `matchBase` option:', function() { - mm.match(['a/b/c/foo.md'], '*.md').should.eql([]); - mm.match(['a/b/c/foo.md'], '*.md', {matchBase: true}).should.eql(['a/b/c/foo.md']); + describe('options.matchBase', function() { + it('should match the basename of file paths when `options.matchBase` is true', function() { + mm(['a/b/c/d.md'], '*.md', [], 'should not match multiple levels'); + mm(['a/b/c/foo.md'], '*.md', [], 'should not match multiple levels'); + mm(['ab', 'acb', 'acb/', 'acb/d/e', 'x/y/acb', 'x/y/acb/d'], 'a?b', ['acb', 'acb/'], 'should not match multiple levels'); + mm(['a/b/c/d.md'], '*.md', ['a/b/c/d.md'], {matchBase: true}); + mm(['a/b/c/foo.md'], '*.md', ['a/b/c/foo.md'], {matchBase: true}); + mm(['x/y/acb', 'acb/', 'acb/d/e', 'x/y/acb/d'], 'a?b', ['x/y/acb', 'acb/'], {matchBase: true}); + }); + + it('should support `options.basename` as an alternative to `matchBase`', function() { + mm(['a/b/c/d.md'], '*.md', [], 'should not match multiple levels'); + mm(['a/b/c/foo.md'], '*.md', [], 'should not match multiple levels'); + mm(['ab', 'acb', 'acb/', 'acb/d/e', 'x/y/acb', 'x/y/acb/d'], 'a?b', ['acb', 'acb/'], 'should not match multiple levels'); + mm(['a/b/c/d.md'], '*.md', ['a/b/c/d.md'], {basename: true}); + mm(['a/b/c/foo.md'], '*.md', ['a/b/c/foo.md'], {basename: true}); + mm(['x/y/acb', 'acb/', 'acb/d/e', 'x/y/acb/d'], 'a?b', ['x/y/acb', 'acb/'], {basename: true}); + }); }); -}); -describe('options.nodupes', function() { - it('should remove duplicate elements from the result array:', function() { - mm.match(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c', {unescape: true}).should.eql(['abc', 'abc']); - mm.match(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c', {unescape: true, nodupes: true}).should.eql(['abc']); + describe('options.flags', function() { + it('should be case-sensitive by default', function() { + mm(['a/b/d/e.md'], 'a/b/D/*.md', [], 'should not match a dirname'); + mm(['a/b/c/e.md'], 'A/b/*/E.md', [], 'should not match a basename'); + mm(['a/b/c/e.md'], 'A/b/C/*.MD', [], 'should not match a file extension'); + }); + + it('should not be case-sensitive when `i` is set on `options.flags`', function() { + mm(['a/b/d/e.md'], 'a/b/D/*.md', ['a/b/d/e.md'], {flags: 'i'}); + mm(['a/b/c/e.md'], 'A/b/*/E.md', ['a/b/c/e.md'], {flags: 'i'}); + mm(['a/b/c/e.md'], 'A/b/C/*.MD', ['a/b/c/e.md'], {flags: 'i'}); + }); }); -}); -describe('options.nobrace/nobraces', function() { - it('should not expect braces with `nobrace` is true:', function() { - mm.match(['1', '2', '3'], '{1..2}', {nobrace: true}).should.eql([]); + describe('options.nobrace', function() { + it('should not expand braces when disabled', function() { + mm(['a', 'b', 'c'], '{a,b,c,d}', ['a', 'b', 'c']); + mm(['a', 'b', 'c'], '{a,b,c,d}', [], {nobrace: true}); + mm(['1', '2', '3'], '{1..2}', [], {nobrace: true}); + }); }); - it('should not expect braces with `nobraces` is true:', function() { - mm.match(['1', '2', '3'], '{1..2}', {nobraces: true}).should.eql([]); + describe('options.nocase', function() { + it('should not be case-sensitive when `options.nocase` is true', function() { + mm(['a/b/c/e.md'], 'A/b/*/E.md', ['a/b/c/e.md'], {nocase: true}); + mm(['a/b/c/e.md'], 'A/b/C/*.MD', ['a/b/c/e.md'], {nocase: true}); + mm(['a/b/c/e.md'], 'A/b/C/*.md', ['a/b/c/e.md'], {nocase: true}); + mm(['a/b/d/e.md'], 'a/b/D/*.md', ['a/b/d/e.md'], {nocase: true}); + }); + + it('should not double-set `i` when both `nocase` and the `i` flag are set', function() { + var opts = {nocase: true, flags: 'i'}; + mm(['a/b/d/e.md'], 'a/b/D/*.md', opts, ['a/b/d/e.md']); + mm(['a/b/c/e.md'], 'A/b/*/E.md', opts, ['a/b/c/e.md']); + mm(['a/b/c/e.md'], 'A/b/C/*.MD', opts, ['a/b/c/e.md']); + }); }); -}); -describe('options.unescape', function() { - it('should remove backslashes in glob patterns:', function() { - mm.match(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c').should.eql(['\\a\\b\\c']); - mm.match(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c', {unescape: true}).should.eql(['abc', 'abc']); - mm.match(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c', {unescape: true, nodupes: true}).should.eql(['abc']); + describe('options.noext', function() { + it('should not match extglobs when noext is true', function() { + assert(!mm.isMatch('ax', '?(a*|b)', {noext: true})); + mm(['a.js.js', 'a.md.js'], '*.*(js).js', [], {noext: true}); + mm(['a/z', 'a/b', 'a/!(z)'], 'a/!(z)', ['a/!(z)'], {noext: true}); + mm(['a/z', 'a/b'], 'a/!(z)', [], {noext: true}); + mm(['c/a/v'], 'c/!(z)/v', [], {noext: true}); + mm(['c/z/v', 'c/a/v'], 'c/!(z)/v', [], {noext: true}); + mm(['c/z/v', 'c/a/v'], 'c/@(z)/v', [], {noext: true}); + mm(['c/z/v', 'c/a/v'], 'c/+(z)/v', [], {noext: true}); + mm(['c/z/v', 'c/a/v'], 'c/*(z)/v', [], {noext: true}); + mm(['c/z/v', 'z', 'zf', 'fz'], '?(z)', [], {noext: true}); + mm(['c/z/v', 'z', 'zf', 'fz'], '+(z)', [], {noext: true}); + mm(['c/z/v', 'z', 'zf', 'fz'], '*(z)', [], {noext: true}); + mm(['cz', 'abz', 'az'], 'a@(z)', [], {noext: true}); + mm(['cz', 'abz', 'az'], 'a*@(z)', [], {noext: true}); + mm(['cz', 'abz', 'az'], 'a!(z)', [], {noext: true}); + mm(['cz', 'abz', 'az'], 'a?(z)', [], {noext: true}); + mm(['cz', 'abz', 'az'], 'a+(z)', [], {noext: true}); + mm(['az', 'bz', 'axz'], 'a+(z)', [], {noext: true}); + mm(['cz', 'abz', 'az'], 'a*(z)', [], {noext: true}); + mm(['cz', 'abz', 'az'], 'a**(z)', [], {noext: true}); + mm(['cz', 'abz', 'az'], 'a*!(z)', [], {noext: true}); + }); }); -}); -describe('options.dotfiles:', function() { - describe('when `dot` or `dotfile` is NOT true:', function() { - it('should not match dotfiles by default:', function() { - mm.match(['.dotfile'], '*').should.eql([]); - mm.match(['.dotfile'], '**').should.eql([]); - mm.match(['a/b/c/.dotfile.md'], '*.md').should.eql([]); - mm.match(['a/b', 'a/.b', '.a/b', '.a/.b'], '**').should.eql(['a/b']); - mm.match(['a/b/c/.dotfile'], '*.*').should.eql([]); + describe('options.nodupes', function() { + beforeEach(function() { + path.sep = '\\'; + }); + afterEach(function() { + path.sep = sep; }); - it('should match dotfiles when a leading dot is defined in the path:', function() { - mm.match(['a/b/c/.dotfile.md'], '**/.*').should.eql(['a/b/c/.dotfile.md']); - mm.match(['a/b/c/.dotfile.md'], '**/.*.md').should.eql(['a/b/c/.dotfile.md']); + it('should remove duplicate elements from the result array:', function() { + var fixtures = [ + '.editorconfig', + '.git', + '.gitignore', + '.nyc_output', + '.travis.yml', + '.verb.md', + 'CHANGELOG.md', + 'CONTRIBUTING.md', + 'LICENSE', + 'coverage', + 'example.js', + 'example.md', + 'example.css', + 'index.js', + 'node_modules', + 'package.json', + 'test.js', + 'utils.js' + ]; + + mm(['abc', '/a/b/c', '\\a\\b\\c'], '/a/b/c', ['/a/b/c', '\\a\\b\\c'], {unixify: false}); + mm(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c', ['\\a\\b\\c'], {unixify: false}); + mm(['abc', '/a/b/c', '\\a\\b\\c'], '/a/b/c', ['/a/b/c', '\\a\\b\\c'], {unixify: false, nodupes: true}); + mm(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c', ['\\a\\b\\c'], {unixify: false, nodupes: true}); + mm(fixtures, ['example.*', '*.js'], ['example.js', 'example.md', 'example.css', 'index.js', 'test.js', 'utils.js'], {unixify: false, nodupes: true}); + }); + + it('should not remove duplicates', function() { + mm(['abc', '/a/b/c', '\\a\\b\\c'], '/a/b/c', ['/a/b/c', '/a/b/c'], {nodupes: false}); + mm(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c', ['/a/b/c'], {nodupes: false}); + mm(['abc', '/a/b/c', '\\a\\b\\c'], '\\a\\b\\c', ['\\a\\b\\c'], {unixify: false, nodupes: false}); }); + }); - it('should use negation patterns on dotfiles:', function() { - mm.match(['.a', '.b', 'c', 'c.md'], '!.*').should.eql(['c', 'c.md']); - mm.match(['.a', '.b', 'c', 'c.md'], '!.b').should.eql(['.a', 'c', 'c.md']); + describe('options.unescape', function() { + it('should remove backslashes in glob patterns:', function() { + var fixtures = ['abc', '/a/b/c', '\\a\\b\\c']; + mm(fixtures, '\\a\\b\\c', ['/a/b/c']); + mm(fixtures, '\\a\\b\\c', {nodupes: false}, ['/a/b/c']); + mm(fixtures, '\\a\\b\\c', {nodupes: false, unescape: false}, ['/a/b/c']); + mm(fixtures, '\\a\\b\\c', {unescape: true, nodupes: false, unixify: false}, ['\\a\\b\\c']); }); }); - describe('when `dot` or `dotfile` is true:', function() { - it('should match dotfiles when there is a leading dot:', function() { - var opts = { dot: true }; + describe('options.nonull', function() { + it('should return the pattern when no matches are found', function() { + mm(['a/b/c/e.md'], 'foo/*.md', ['foo/*.md'], {nonull: true}); + mm(['a/b/c/e.md'], 'bar/*.js', ['bar/*.js'], {nonull: true}); + }); + }); - mm.match(['.dotfile'], '*', opts).should.eql(['.dotfile']); - mm.match(['.dotfile'], '**', opts).should.eql(['.dotfile']); - mm.match(['a/b', 'a/.b', '.a/b', '.a/.b'], '**', opts).should.eql(['a/b', 'a/.b', '.a/b', '.a/.b']); - mm.match(['a/b', 'a/.b', 'a/.b', '.a/.b'], '{.*,**}', opts).should.eql(['a/b', 'a/.b', 'a/.b', '.a/.b']); - mm.match(['.dotfile'], '.dotfile', opts).should.eql(['.dotfile']); - mm.match(['.dotfile.md'], '.*.md', opts).should.eql(['.dotfile.md']); + describe('options.nonegate', function() { + it('should support the `nonegate` option:', function() { + mm(['a/a/a', 'a/b/a', 'b/b/a', 'c/c/a', 'c/c/b'], '!**/a', ['c/c/b']); + mm(['a.md', '!a.md', 'a.txt'], '!*.md', ['!a.md'], {nonegate: true}); + mm(['!a/a/a', 'a/b/a', 'b/b/a', '!c/c/a'], '!**/a', ['!a/a/a', '!c/c/a'], {nonegate: true}); + mm(['!*.md', '.dotfile.txt', 'a/b/.dotfile'], '!*.md', ['!*.md'], {nonegate: true}); }); + }); - it('should match dotfiles when there is not a leading dot:', function() { - var opts = { dot: true }; - mm.match(['.dotfile'], '*.*', opts).should.eql(['.dotfile']); - mm.match(['.a', '.b', 'c', 'c.md'], '*.*', opts).should.eql(['.a', '.b', 'c.md']); - mm.match(['.dotfile'], '*.md', opts).should.eql([]); - mm.match(['.verb.txt'], '*.md', opts).should.eql([]); - mm.match(['a/b/c/.dotfile'], '*.md', opts).should.eql([]); - mm.match(['a/b/c/.dotfile.md'], '*.md', opts).should.eql([]); - mm.match(['a/b/c/.verb.md'], '**/*.md', opts).should.eql(['a/b/c/.verb.md']); - mm.match(['foo.md'], '*.md', opts).should.eql(['foo.md']); + describe('options.unixify', function() { + it('should unixify file paths by default', function() { + mm(['a\\b\\c.md'], '**/*.md', ['a/b/c.md']); + mm(['a\\b\\c.md'], '**/*.md', ['a\\b\\c.md'], {unixify: false}); }); - it('should match dotfiles when there is not a leading dot:', function() { - var opts = { dotfiles: true }; - mm.match(['.dotfile'], '*.*', opts).should.eql(['.dotfile']); - mm.match(['.a', '.b', 'c', 'c.md'], '*.*', opts).should.eql(['.a', '.b', 'c.md']); - mm.match(['.dotfile'], '*.md', opts).should.eql([]); - mm.match(['.verb.txt'], '*.md', opts).should.eql([]); - mm.match(['a/b/c/.dotfile'], '*.md', opts).should.eql([]); - mm.match(['a/b/c/.dotfile.md'], '*.md', opts).should.eql([]); - mm.match(['a/b/c/.verb.md'], '**/*.md', opts).should.eql(['a/b/c/.verb.md']); - mm.match(['foo.md'], '*.md', opts).should.eql(['foo.md']); + it('should unixify absolute paths', function() { + mm(['E:\\a\\b\\c.md'], 'E:/**/*.md', ['E:/a/b/c.md']); + mm(['E:\\a\\b\\c.md'], 'E:/**/*.md', ['E:\\a\\b\\c.md'], {unixify: false}); }); - it('should use negation patterns on dotfiles:', function() { - mm.match(['.a', '.b', 'c', 'c.md'], '!*.*').should.eql(['.a', '.b', 'c']); - mm.match(['.a', '.b', 'c', 'c.md'], '!.*').should.eql(['c', 'c.md']); + it('should strip leading `./`', function() { + var fixtures = ['a', './a', 'b', 'a/a', './a/b', 'a/c', './a/x', './a/a/a', 'a/a/b', './a/a/a/a', './a/a/a/a/a', 'x/y', './z/z']; + mm(fixtures, '*', ['a', 'b']); + mm(fixtures, '**/a/**', ['a/a', 'a/c', 'a/b', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']); + mm(fixtures, '*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']); + mm(fixtures, '*/*/*', ['a/a/a', 'a/a/b']); + mm(fixtures, '*/*/*/*', ['a/a/a/a']); + mm(fixtures, '*/*/*/*/*', ['a/a/a/a/a']); + mm(fixtures, './*', ['a', 'b']); + mm(fixtures, './**/a/**', ['a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']); + mm(fixtures, './a/*/a', ['a/a/a']); + mm(fixtures, 'a/*', ['a/a', 'a/b', 'a/c', 'a/x']); + mm(fixtures, 'a/*/*', ['a/a/a', 'a/a/b']); + mm(fixtures, 'a/*/*/*', ['a/a/a/a']); + mm(fixtures, 'a/*/*/*/*', ['a/a/a/a/a']); + mm(fixtures, 'a/*/a', ['a/a/a']); + + mm(fixtures, '*', {unixify: false}, ['a', './a', 'b']); + mm(fixtures, '**/a/**', {unixify: false}, ['a/a', 'a/c', './a/b', './a/x', './a/a/a', 'a/a/b', './a/a/a/a', './a/a/a/a/a']); + mm(fixtures, '*/*', {unixify: false}, ['a/a', './a/b', 'a/c', './a/x', 'x/y', './z/z']); + mm(fixtures, '*/*/*', {unixify: false}, ['./a/a/a', 'a/a/b']); + mm(fixtures, '*/*/*/*', {unixify: false}, ['./a/a/a/a']); + mm(fixtures, '*/*/*/*/*', {unixify: false}, ['./a/a/a/a/a']); + mm(fixtures, './*', {unixify: false}, ['a', './a', 'b']); + mm(fixtures, './**/a/**', {unixify: false}, ['a/a', './a/b', 'a/c', './a/x', './a/a/a', 'a/a/b', './a/a/a/a', './a/a/a/a/a']); + mm(fixtures, './a/*/a', {unixify: false}, ['./a/a/a']); + mm(fixtures, 'a/*', {unixify: false}, ['a/a', './a/b', 'a/c', './a/x']); + mm(fixtures, 'a/*/*', {unixify: false}, ['./a/a/a', 'a/a/b']); + mm(fixtures, 'a/*/*/*', {unixify: false}, ['./a/a/a/a']); + mm(fixtures, 'a/*/*/*/*', {unixify: false}, ['./a/a/a/a/a']); + mm(fixtures, 'a/*/a', {unixify: false}, ['./a/a/a']); + }); + }); + + describe('options.dot', function() { + describe('when `dot` or `dotfile` is NOT true:', function() { + it('should not match dotfiles by default:', function() { + mm(['.dotfile'], '*', []); + mm(['.dotfile'], '**', []); + mm(['a/b/c/.dotfile.md'], '*.md', []); + mm(['a/b', 'a/.b', '.a/b', '.a/.b'], '**', ['a/b']); + mm(['a/b/c/.dotfile'], '*.*', []); + + // https://github.com/isaacs/minimatch/issues/30 + mm(['foo/bar.js'], '**/foo/**', ['foo/bar.js']); + mm(['./foo/bar.js'], './**/foo/**', ['foo/bar.js']); + mm(['./foo/bar.js'], './**/foo/**', ['./foo/bar.js'], {unixify: false}); + mm(['./foo/bar.js'], '**/foo/**', ['foo/bar.js']); + mm(['./foo/bar.js'], '**/foo/**', ['./foo/bar.js'], {unixify: false}); + }); + + it('should match dotfiles when a leading dot is defined in the path:', function() { + mm(['a/b/c/.dotfile.md'], '**/.*', ['a/b/c/.dotfile.md']); + mm(['a/b/c/.dotfile.md'], '**/.*.md', ['a/b/c/.dotfile.md']); + }); + + it('should use negation patterns on dotfiles:', function() { + mm(['.a', '.b', 'c', 'c.md'], '!.*', ['c', 'c.md']); + mm(['.a', '.b', 'c', 'c.md'], '!.b', ['.a', 'c', 'c.md']); + }); + }); + + describe('when `dot` or `dotfile` is true:', function() { + it('should match dotfiles when there is a leading dot:', function() { + var opts = { dot: true }; + + mm(['.dotfile'], '*', opts, ['.dotfile']); + mm(['.dotfile'], '**', opts, ['.dotfile']); + mm(['a/b', 'a/.b', '.a/b', '.a/.b'], '**', opts, ['a/b', 'a/.b', '.a/b', '.a/.b']); + mm(['a/b', 'a/.b', 'a/.b', '.a/.b'], 'a/{.*,**}', opts, ['a/b', 'a/.b']); + mm(['a/b', 'a/.b', 'a/.b', '.a/.b'], '{.*,**}', {}, ['a/b']); + mm(['a/b', 'a/.b', 'a/.b', '.a/.b'], '{.*,**}', opts, ['a/b', '.a/.b', 'a/.b']); + mm(['.dotfile'], '.dotfile', opts, ['.dotfile']); + mm(['.dotfile.md'], '.*.md', opts, ['.dotfile.md']); + }); + + it('should match dotfiles when there is not a leading dot:', function() { + var opts = { dot: true }; + mm(['.dotfile'], '*.*', opts, ['.dotfile']); + mm(['.a', '.b', 'c', 'c.md'], '*.*', opts, ['.a', '.b', 'c.md']); + mm(['.dotfile'], '*.md', opts, []); + mm(['.verb.txt'], '*.md', opts, []); + mm(['a/b/c/.dotfile'], '*.md', opts, []); + mm(['a/b/c/.dotfile.md'], '*.md', opts, []); + mm(['a/b/c/.verb.md'], '**/*.md', opts, ['a/b/c/.verb.md']); + mm(['foo.md'], '*.md', opts, ['foo.md']); + }); + + it('should use negation patterns on dotfiles:', function() { + mm(['.a', '.b', 'c', 'c.md'], '!.*', ['c', 'c.md']); + mm(['.a', '.b', 'c', 'c.md'], '!(.*)', ['c', 'c.md']); + mm(['.a', '.b', 'c', 'c.md'], '!(.*)*', ['c', 'c.md']); + mm(['.a', '.b', 'c', 'c.md'], '!*.*', ['.a', '.b', 'c']); + }); + + it('should match dotfiles when `options.dot` is true:', function() { + mm(['a/./b', 'a/../b', 'a/c/b', 'a/.d/b'], 'a/.*/b', [ 'a/../b', 'a/./b', 'a/.d/b' ], {dot: true}); + mm(['a/./b', 'a/../b', 'a/c/b', 'a/.d/b'], 'a/.*/b', [ 'a/../b', 'a/./b', 'a/.d/b' ], {dot: false}); + mm(['a/./b', 'a/../b', 'a/c/b', 'a/.d/b'], 'a/*/b', ['a/c/b', 'a/.d/b'], {dot: true}); + mm(['.dotfile'], '*.*', ['.dotfile'], {dot: true}); + mm(['.dotfile'], '*.md', [], {dot: true}); + mm(['.dotfile'], '.dotfile', ['.dotfile'], {dot: true}); + mm(['.dotfile.md'], '.*.md', ['.dotfile.md'], {dot: true}); + mm(['.verb.txt'], '*.md', [], {dot: true}); + mm(['.verb.txt'], '*.md', [], {dot: true}); + mm(['a/b/c/.dotfile'], '*.md', [], {dot: true}); + mm(['a/b/c/.dotfile.md'], '**/*.md', ['a/b/c/.dotfile.md'], {dot: true}); + mm(['a/b/c/.dotfile.md'], '**/.*', ['a/b/c/.dotfile.md']); + mm(['a/b/c/.dotfile.md'], '**/.*.md', ['a/b/c/.dotfile.md']); + mm(['a/b/c/.dotfile.md'], '*.md', []); + mm(['a/b/c/.dotfile.md'], '*.md', [], {dot: true}); + mm(['a/b/c/.verb.md'], '**/*.md', ['a/b/c/.verb.md'], {dot: true}); + mm(['d.md'], '*.md', ['d.md'], {dot: true}); + }); + }); + }); + + describe('windows', function() { + it('should unixify file paths', function() { + mm(['a\\b\\c.md'], '**/*.md', ['a/b/c.md']); + mm(['a\\b\\c.md'], '**/*.md', {unixify: false}, ['a\\b\\c.md']); + }); + + it('should unixify absolute paths', function() { + mm(['E:\\a\\b\\c.md'], 'E:/**/*.md', ['E:/a/b/c.md']); + mm(['E:\\a\\b\\c.md'], 'E:/**/*.md', ['E:\\a\\b\\c.md'], {unixify: false}); + }); + }); + + describe('normalize', function() { + it('should normalize leading `./`', function() { + var fixtures = ['a.md', 'a/b/c.md', 'a/b/d.md', './a/b/c.md', './b/c.md', '.\\a\\b\\c.md']; + mm(fixtures, '**/*.md', ['a.md', 'a/b/c.md', 'a/b/d.md', 'b/c.md']); + mm(fixtures, '**/*.md', ['a.md', 'a/b/c.md', './a/b/c.md', '.\\a\\b\\c.md', 'a/b/d.md', './b/c.md'], {unixify: false}); + }); + + it('should match leading `./`', function() { + var fixtures = ['a.md', 'a/b.md', './a.md', './a/b.md', 'a/b/c.md', './a/b/c.md', '.\\a\\b\\c.md', 'a\\b\\c.md']; + mm(fixtures, '**/*.md', ['a.md', 'a/b.md', 'a/b/c.md']); + mm(fixtures, '**/*.md', ['a.md', './a.md', 'a/b.md', './a/b.md', 'a/b/c.md', 'a\\b\\c.md', './a/b/c.md', '.\\a\\b\\c.md'], {unixify: false}); + mm(fixtures, '*.md', ['a.md']); + mm(fixtures, '*.md', ['a.md', './a.md'], {unixify: false}, {unixify: false}); + mm(fixtures, '*.md', ['a.md']); + mm(fixtures, '*/*.md', ['a/b.md', './a/b.md'], {unixify: false}); + mm(fixtures, '*/*.md', ['a/b.md']); + mm(fixtures, './**/*.md', ['a.md', 'a/b.md', 'a/b/c.md', 'a\\b\\c.md', './a.md', './a/b.md', './a/b/c.md', '.\\a\\b\\c.md'], {unixify: false}); + mm(fixtures, './**/*.md', ['a.md', 'a/b.md', 'a/b/c.md']); + mm(fixtures, './*.md', ['a.md', './a.md'], {unixify: false}); + mm(fixtures, './*.md', ['a.md']); + mm(fixtures, './*/*.md', ['a/b.md', './a/b.md'], {unixify: false}); + mm(fixtures, './*/*.md', ['a/b.md']); + mm(['./a'], 'a', ['./a'], {unixify: false}); + mm(['./a'], 'a', ['a']); }); }); }); + diff --git a/test/pattern-string.js b/test/pattern-string.js deleted file mode 100644 index 5d7d5558..00000000 --- a/test/pattern-string.js +++ /dev/null @@ -1,245 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('should'); -var path = require('path'); -var argv = require('minimist')(process.argv.slice(2)); -var mm = require('..'); - -if ('multimatch' in argv || 'minimatch' in argv) { - mm = require('multimatch'); -} - -var files = ['a', 'b', 'c', 'd', 'a/a', 'a/b', 'a/b.js', 'a/c.js', 'a/b/c/d.js', '.a/.js', 'a/b/.js', 'a/b.md', 'a/b.txt'] - -describe('micromatch string patterns', function() { - it('should handle windows paths', function() { - mm(['a/b/c.md'], '**/*.md').should.eql(['a/b/c.md']); - mm(['E:/a/b/c.md'], 'E:/**/*.md').should.eql(['E:/a/b/c.md']); - }); - - it('should unixify file paths', function() { - if (path.sep === '\\') { - mm(['a\\b\\c.md'], '**/*.md').should.eql(['a/b/c.md']); - } - mm(['a\\b\\c.md'], '**/*.md', {unixify: true}).should.eql(['a/b/c.md']); - }); - - it('should unixify absolute paths', function() { - if (path.sep === '\\') { - mm(['E:\\a\\b\\c.md'], 'E:/**/*.md').should.eql(['E:/a/b/c.md']); - } - mm(['E:\\a\\b\\c.md'], 'E:/**/*.md', {unixify: true}).should.eql(['E:/a/b/c.md']); - }); - - it('should unixify patterns', function() { - if (path.sep === '\\') { - mm(['a\\b\\c.md'], '**\\*.md').should.eql(['a/b/c.md']); - mm(['E:\\a\\b\\c.md'], 'E:\\**\\*.md').should.eql(['E:/a/b/c.md']); - } - mm(['a\\b\\c.md'], '**\\*.md', {unixify: true}).should.eql(['a/b/c.md']); - mm(['E:\\a\\b\\c.md'], 'E:\\**\\*.md', {unixify: true}).should.eql(['E:/a/b/c.md']); - }); - - describe('file extensions:', function() { - it('should match extensions:', function() { - mm(['.md'], '.md').should.eql(['.md']); - mm(['.txt'], '.md').should.eql([]); - mm(['.dotfile'], '.md').should.eql([]); - }); - }); - - describe('common patterns:', function() { - it('should match directories:', function() { - mm(['a/'], 'a/*').should.eql([]); - mm(['a/'], 'a/').should.eql(['a/']); - }); - - it('should match files:', function() { - mm(files, 'a/*').should.eql(['a/a', 'a/b', 'a/b.js', 'a/c.js', 'a/b.md', 'a/b.txt']); - mm(files, 'a*').should.eql(['a']); - }); - }); - - describe('file names:', function() { - it('should match files with the given extension:', function() { - mm(['.md', '.txt'], '.md').should.eql(['.md']); - mm(['a.md', 'b.js', 'c.txt'], '*.{js,txt}').should.eql(['b.js', 'c.txt']); - mm(['.d.md'], '.*.md').should.eql(['.d.md']); - mm(['d.md'], '*.md').should.eql(['d.md']); - mm(['a/b/c/d.md'], '*.md').should.eql([]); - }); - - it('should match files with the given extension:', function() { - mm(['a.md', 'b.js', 'c.txt'], '!*.{js,txt}').should.eql(['a.md']); - mm(['a.md', 'a.min.js', 'b.js', 'c.txt'], '!*.{min.js,txt}').should.eql(['a.md', 'b.js']); - mm(['a.md', 'b.js', 'c.txt'], '!*.{js,txt}').should.eql(['a.md']); - mm(['a.md', 'b.js', 'c.txt', 'a/b.js', 'a/b.md'], '!{,**/}*.{js,txt}').should.eql(['a.md', 'a/b.md']); - mm(['a.md', 'b.js', 'c.txt', 'd.json'], ['*.*', '!*.{js,txt}']).should.eql(['a.md', 'd.json']); - }); - - it('should not match dotfiles, even if the dotfile name equals the extension:', function() { - mm(['.dotfile'], '*.md').should.eql([]); - mm(['.verb.txt'], '*.md').should.eql([]); - }); - }); - - describe('file paths:', function() { - it('should create a regular expression for file paths:', function() { - mm(['.dotfile'], 'a/b/c/*.md').should.eql([]); - mm(['.dotfile.md'], 'a/b/c/*.md').should.eql([]); - mm(['a/b/c/d.dotfile.md'], 'a/b/c/*.md').should.eql(['a/b/c/d.dotfile.md']); - mm(['a/b/d/.dotfile'], 'a/b/c/*.md').should.eql([]); - mm(['a/b/c/xyz.md'], 'a/b/c/*.md').should.eql(['a/b/c/xyz.md']); - mm(['a/b/c/.xyz.md'], 'a/b/c/.*.md').should.eql(['a/b/c/.xyz.md']); - mm(['a/bb/c/xyz.md'], 'a/*/c/*.md').should.eql(['a/bb/c/xyz.md']); - mm(['a/bbbb/c/xyz.md'], 'a/*/c/*.md').should.eql(['a/bbbb/c/xyz.md']); - mm(['a/bb.bb/c/xyz.md'], 'a/*/c/*.md').should.eql(['a/bb.bb/c/xyz.md']); - mm(['a/bb.bb/aa/bb/aa/c/xyz.md'], 'a/**/c/*.md').should.eql(['a/bb.bb/aa/bb/aa/c/xyz.md']); - mm(['a/bb.bb/aa/b.b/aa/c/xyz.md'], 'a/**/c/*.md').should.eql(['a/bb.bb/aa/b.b/aa/c/xyz.md']); - }); - }); - - describe('brace expansion:', function() { - it('should create a regular brace expansion:', function() { - mm(['iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/d/iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/c/iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/cd/iii.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/cd/iii.md']); - mm(['a/b/ce/iii.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/ce/iii.md']); - - mm(['xyz.md'], 'a/b/c{d,e}/xyz.md').should.eql([]); - mm(['a/b/d/xyz.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/c/xyz.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/cd/xyz.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/cd/xyz.md']); - mm(['a/b/ce/xyz.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/ce/xyz.md']); - mm(['a/b.js', 'a/c.js', 'a/d.js', 'a/e.js'], 'a/{c..e}.js').should.eql(['a/c.js', 'a/d.js', 'a/e.js']); - }); - }); - - describe('double stars:', function() { - it('should create a regular expression for double stars:', function() { - mm(['.dotfile'], 'a/**/z/*.md').should.eql([]); - mm(['a/b/z/.dotfile'], 'a/**/z/*.md').should.eql([]); - mm(['a/b/c/d/e/z/d.md'], 'a/**/z/*.md').should.eql(['a/b/c/d/e/z/d.md']); - - mm(['a/b/c/d/e/z/d.md'], 'a/**/j/**/z/*.md').should.eql([]); - mm(['a/b/c/j/e/z/d.md'], 'a/**/j/**/z/*.md').should.eql(['a/b/c/j/e/z/d.md']); - mm(['a/b/c/d/e/j/n/p/o/z/d.md'], 'a/**/j/**/z/*.md').should.eql(['a/b/c/d/e/j/n/p/o/z/d.md']); - mm(['a/b/c/j/e/z/d.txt'], 'a/**/j/**/z/*.md').should.eql([]); - - mm(['a/b/d/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm(['a/b/c/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm(['a/b/d/cd/e/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql(['a/b/d/cd/e/xyz.md']); - mm(['a/b/baz/ce/fez/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql(['a/b/baz/ce/fez/xyz.md']); - }); - }); - - describe('negation', function() { - it('should create a regular expression for negating extensions:', function() { - mm(['.md'], '!.md').should.eql([]); - mm(['d.md'], '!.md').should.eql(['d.md']); - mm(['d.md'], '!*.md').should.eql([]); - }); - - it('should be inclusive by default when the pattern is a string:', function() { - mm(['abc.md'], '!*.md').should.eql([]); - mm(['abc.md', 'abc.txt'], '!*.md').should.eql(['abc.txt']); - mm(['abc.txt'], '!*.md').should.eql(['abc.txt']); - }); - - it('should not be inclusive of dotfiles by default unless `dot: true` is set:', function() { - mm(['.dotfile.md'], '!*.md').should.eql(['.dotfile.md']); - mm(['.dotfile.md'], '!.*.md').should.eql([]); - mm(['.a.txt', '.a.md'], '!.*.md').should.eql(['.a.txt']); - }); - - it('should be exclusive by default when the pattern is an array:', function() { - mm(['abc.txt'], ['!*.md']).should.eql([]); - mm(['abc.txt'], ['*', '!*.md']).should.eql(['abc.txt']); - }); - - it('should match full paths:', function() { - mm(['.md'], 'a/b/*.md').should.eql([]); - mm(['a/b.md', 'a/c.txt'], 'a/*.md').should.eql(['a/b.md']); - mm(['a/b.md', 'a/c.txt'], 'a/*.txt').should.eql(['a/c.txt']); - mm(['a/b/.md'], 'a/b/*.md').should.eql([]); - mm(['a/b/a.md'], 'a/b/*.md').should.eql(['a/b/a.md']); - mm(['a/b/c/.dotfile'], 'a/b/c/*.md').should.eql([]); - mm(['a/b/c/d.md'], 'a/b/c/*.md').should.eql(['a/b/c/d.md']); - mm(['a/b/c/e.md'], 'a/b/c/*.md').should.eql(['a/b/c/e.md']); - }); - - it('should create a regex for brace expansion:', function() { - mm(['iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/d/iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/c/iii.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/cd/iii.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/cd/iii.md']); - mm(['a/b/ce/iii.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/ce/iii.md']); - - mm(['xyz.md'], 'a/b/c{d,e}/xyz.md').should.eql([]); - mm(['a/b/d/xyz.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/c/xyz.md'], 'a/b/c{d,e}/*.md').should.eql([]); - mm(['a/b/cd/xyz.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/cd/xyz.md']); - mm(['a/b/ce/xyz.md'], 'a/b/c{d,e}/*.md').should.eql(['a/b/ce/xyz.md']); - mm(['a/b/cef/xyz.md'], 'a/b/c{d,e{f,g}}/*.md').should.eql(['a/b/cef/xyz.md']); - mm(['a/b/ceg/xyz.md'], 'a/b/c{d,e{f,g}}/*.md').should.eql(['a/b/ceg/xyz.md']); - mm(['a/b/cd/xyz.md'], 'a/b/c{d,e{f,g}}/*.md').should.eql(['a/b/cd/xyz.md']); - }); - - it('should create a regular expression for double stars:', function() { - mm(['.dotfile'], 'a/**/z/*.md').should.eql([]); - - mm(['a/b/z/.dotfile.md'], 'a/**/z/.*.md').should.eql(['a/b/z/.dotfile.md']); - mm(['a/b/z/.dotfile'], 'a/**/z/*.md').should.eql([]); - mm(['a/b/c/d/e/z/d.md'], 'a/**/z/*.md').should.eql(['a/b/c/d/e/z/d.md']); - - mm(['a/b/c/d/e/z/d.md'], 'a/**/j/**/z/*.md').should.eql([]); - mm(['a/b/c/j/e/z/d.md'], 'a/**/j/**/z/*.md').should.eql(['a/b/c/j/e/z/d.md']); - mm(['a/b/c/d/e/j/n/p/o/z/d.md'], 'a/**/j/**/z/*.md').should.eql(['a/b/c/d/e/j/n/p/o/z/d.md']); - mm(['a/b/c/j/e/z/d.txt'], 'a/**/j/**/z/*.md').should.eql([]); - - mm(['a/b/d/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm(['a/b/c/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql([]); - mm(['a/b/d/cd/e/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql(['a/b/d/cd/e/xyz.md']); - mm(['a/b/baz/ce/fez/xyz.md'], 'a/b/**/c{d,e}/**/xyz.md').should.eql(['a/b/baz/ce/fez/xyz.md']); - }); - }); - - describe('options', function() { - it('should support the `matchBase` option:', function() { - mm(['a/b/c/d.md'], '*.md').should.eql([]); - mm(['a/b/c/d.md'], '*.md', {matchBase: true}).should.eql(['a/b/c/d.md']); - }); - - it('should support the `nocase` option:', function() { - mm(['a/b/d/e.md'], 'a/b/c/*.md').should.eql([]); - mm(['a/b/c/e.md'], 'A/b/C/*.md').should.eql([]); - mm(['a/b/c/e.md'], 'A/b/C/*.md', {nocase: true}).should.eql(['a/b/c/e.md']); - mm(['a/b/c/e.md'], 'A/b/C/*.MD', {nocase: true}).should.eql(['a/b/c/e.md']); - }); - - it('should match dotfiles when `dotfile` is true:', function() { - mm(['.dotfile'], '*.*', {dot: true}).should.eql(['.dotfile']); - mm(['.dotfile'], '*.md', {dot: true}).should.eql([]); - mm(['.dotfile'], '.dotfile', {dot: true}).should.eql(['.dotfile']); - mm(['.dotfile.md'], '.*.md', {dot: true}).should.eql(['.dotfile.md']); - mm(['.verb.txt'], '*.md', {dot: true}).should.eql([]); - mm(['.verb.txt'], '*.md', {dot: true}).should.eql([]); - mm(['a/b/c/.dotfile'], '*.md', {dot: true}).should.eql([]); - mm(['a/b/c/.dotfile.md'], '**/*.md', {dot: true}).should.eql(['a/b/c/.dotfile.md']); - mm(['a/b/c/.dotfile.md'], '**/.*').should.eql(['a/b/c/.dotfile.md']); - mm(['a/b/c/.dotfile.md'], '**/.*.md').should.eql(['a/b/c/.dotfile.md']); - mm(['a/b/c/.dotfile.md'], '*.md').should.eql([]); - mm(['a/b/c/.dotfile.md'], '*.md', {dot: true}).should.eql([]); - mm(['a/b/c/.verb.md'], '**/*.md', {dot: true}).should.eql(['a/b/c/.verb.md']); - mm(['d.md'], '*.md', {dot: true}).should.eql(['d.md']); - }); - }); -}); diff --git a/test/posix-brackets.js b/test/posix-brackets.js deleted file mode 100644 index 29226794..00000000 --- a/test/posix-brackets.js +++ /dev/null @@ -1,55 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('should'); -var path = require('path'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = ref; -} - -describe('POSIX bracket expressions', function() { - - it('character classes', function() { - // spec says this should match, I assume b/c the malformed backet pattern - // should be stripped completely from the pattern before performing the match - // mm.isMatch('ab', '[[:digit]ab]', {brackets: true}).should.be.true(); - mm.isMatch('A', '[[:lower:]]', {brackets: true}).should.be.false(); - mm.isMatch('A', '[![:lower:]]', {brackets: true}).should.be.true(); - mm.isMatch('a', '[![:lower:]]', {brackets: true}).should.be.false(); - mm.isMatch('a', '[[:lower:]]', {brackets: true}).should.be.true(); - mm.isMatch('a', '[[:upper:]]', {brackets: true}).should.be.false(); - mm.isMatch('A', '[[:upper:]]', {brackets: true}).should.be.true(); - mm.isMatch('a', '[[:digit:][:upper:][:space:]]', {brackets: true}).should.be.false(); - mm.isMatch('A', '[[:digit:][:upper:][:space:]]', {brackets: true}).should.be.true(); - mm.isMatch('1', '[[:digit:][:upper:][:space:]]', {brackets: true}).should.be.true(); - mm.isMatch(' ', '[[:digit:][:upper:][:space:]]', {brackets: true}).should.be.true(); - mm.isMatch('.', '[[:digit:][:upper:][:space:]]', {brackets: true}).should.be.false(); - mm.isMatch('5', '[[:xdigit:]]', {brackets: true}).should.be.true(); - mm.isMatch('f', '[[:xdigit:]]', {brackets: true}).should.be.true(); - mm.isMatch('D', '[[:xdigit:]]', {brackets: true}).should.be.true(); - mm.isMatch('.', '[^[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]', {brackets: true}).should.be.true(); - mm.isMatch('.', '[[:alnum:][:alpha:][:blank:][:cntrl:][:digit:][:lower:][:space:][:upper:][:xdigit:]]', {brackets: true}).should.be.false(); - mm.isMatch('5', '[a-c[:digit:]x-z]', {brackets: true}).should.be.true(); - mm.isMatch('b', '[a-c[:digit:]x-z]', {brackets: true}).should.be.true(); - mm.isMatch('y', '[a-c[:digit:]x-z]', {brackets: true}).should.be.true(); - mm.isMatch('q', '[a-c[:digit:]x-z]', {brackets: true}).should.be.false(); - }); - - it('Case-sensitivy features (posix bracket expressions)', function() { - mm.isMatch('A', '[[:lower:]]', {brackets: true}).should.be.false(); - mm.isMatch('a', '[[:lower:]]', {brackets: true}).should.be.true(); - mm.isMatch('a', '[[:upper:]]', {brackets: true}).should.be.false(); - mm.isMatch('A', '[[:upper:]]', {brackets: true}).should.be.true(); - }); -}); - diff --git a/test/qmarks.js b/test/qmarks.js new file mode 100644 index 00000000..0d019aa1 --- /dev/null +++ b/test/qmarks.js @@ -0,0 +1,98 @@ +'use strict'; + +var assert = require('assert'); +var mm = require('./support/match'); + +describe('qmarks and stars', function() { + it('should support qmark matching', function() { + var arr = ['a', 'aa', 'ab', 'aaa', 'abcdefg']; + mm(arr, '?', ['a']); + mm(arr, '??', ['aa', 'ab']); + mm(arr, '???', ['aaa']); + }); + + it('should correctly handle question marks in globs', function() { + mm(['?', '??', '???'], '?', ['?']); + mm(['?', '??', '???'], '??', ['??']); + mm(['?', '??', '???'], '???', ['???']); + mm(['/a/', '/a/b/', '/a/b/c/', '/a/b/c/d/'], '??', []); + mm(['/a/', '/a/b/', '/a/b/c/', '/a/b/c/d/'], '??', {dot: true}, []); + mm(['x/y/acb', 'acb', 'acb/', 'acb/d/e'], 'a?b', ['acb', 'acb/']); + mm(['aaa', 'aac', 'abc'], 'a?c', ['abc', 'aac']); + mm(['aaa', 'aac', 'abc'], 'a*?c', ['aac', 'abc']); + mm(['a', 'aa', 'ab', 'ab?', 'ac', 'ac?', 'abcd', 'abbb'], 'ab?', ['ab?']); + mm(['abc', 'abb', 'acc'], 'a**?c', ['abc', 'acc']); + mm(['abc'], 'a*****?c', ['abc']); + mm(['a', 'aa', 'abc', 'zzz', 'bbb', 'aaaa'], '*****?', ['a', 'aa', 'abc', 'zzz', 'bbb', 'aaaa']); + mm(['a', 'aa', 'abc', 'zzz', 'bbb', 'aaaa'], '*****??', ['aa', 'abc', 'zzz', 'bbb', 'aaaa']); + mm(['a', 'aa', 'abc', 'zzz', 'bbb', 'aaaa'], '?*****??', ['abc', 'zzz', 'bbb', 'aaaa']); + mm(['abc', 'abb', 'zzz'], '?*****?c', ['abc']); + mm(['abc', 'bbb', 'zzz'], '?***?****c', ['abc']); + mm(['abc', 'bbb', 'zzz'], '?***?****?', ['abc', 'bbb', 'zzz']); + mm(['abc'], '?***?****', ['abc']); + mm(['abc'], '*******c', ['abc']); + mm(['abc'], '*******?', ['abc']); + mm(['abcdecdhjk'], 'a*cd**?**??k', ['abcdecdhjk']); + mm(['abcdecdhjk'], 'a**?**cd**?**??k', ['abcdecdhjk']); + mm(['abcdecdhjk'], 'a**?**cd**?**??k***', ['abcdecdhjk']); + mm(['abcdecdhjk'], 'a**?**cd**?**??***k', ['abcdecdhjk']); + mm(['abcdecdhjk'], 'a**?**cd**?**??***k**', ['abcdecdhjk']); + mm(['abcdecdhjk'], 'a****c**?**??*****', ['abcdecdhjk']); + }); + + it('should match one character per question mark', function() { + mm(['a/b/c.md'], 'a/?/c.md', ['a/b/c.md']); + mm(['a/bb/c.md'], 'a/?/c.md', []); + mm(['a/bb/c.md'], 'a/??/c.md', ['a/bb/c.md']); + mm(['a/bbb/c.md'], 'a/??/c.md', []); + mm(['a/bbb/c.md'], 'a/???/c.md', ['a/bbb/c.md']); + mm(['a/bbbb/c.md'], 'a/????/c.md', ['a/bbbb/c.md']); + }); + + it('should match multiple groups of question marks', function() { + mm(['a/bb/c/dd/e.md'], 'a/?/c/?/e.md', []); + mm(['a/b/c/d/e.md'], 'a/?/c/?/e.md', ['a/b/c/d/e.md']); + mm(['a/b/c/d/e.md'], 'a/?/c/???/e.md', []); + mm(['a/b/c/zzz/e.md'], 'a/?/c/???/e.md', ['a/b/c/zzz/e.md']); + }); + + it('should use qmarks with other special characters', function() { + mm(['a/b/c/d/e.md'], 'a/?/c/?/*/e.md', []); + mm(['a/b/c/d/e/e.md'], 'a/?/c/?/*/e.md', ['a/b/c/d/e/e.md']); + mm(['a/b/c/d/efghijk/e.md'], 'a/?/c/?/*/e.md', ['a/b/c/d/efghijk/e.md']); + mm(['a/b/c/d/efghijk/e.md'], 'a/?/**/e.md', ['a/b/c/d/efghijk/e.md']); + mm(['a/bb/e.md'], 'a/?/e.md', []); + mm(['a/bb/e.md'], 'a/?/**/e.md', []); + mm(['a/b/c/d/efghijk/e.md'], 'a/*/?/**/e.md', ['a/b/c/d/efghijk/e.md']); + mm(['a/b/c/d/efgh.ijk/e.md'], 'a/*/?/**/e.md', ['a/b/c/d/efgh.ijk/e.md']); + mm(['a/b.bb/c/d/efgh.ijk/e.md'], 'a/*/?/**/e.md', ['a/b.bb/c/d/efgh.ijk/e.md']); + mm(['a/bbb/c/d/efgh.ijk/e.md'], 'a/*/?/**/e.md', ['a/bbb/c/d/efgh.ijk/e.md']); + }); + + it('question marks should not match slashes', function() { + assert(!mm.isMatch('aaa/bbb', 'aaa?bbb')); + assert(!mm.isMatch('aaa//bbb', 'aaa?bbb')); + assert(!mm.isMatch('aaa\\bbb', 'aaa?bbb')); + assert(!mm.isMatch('aaa\\\\bbb', 'aaa?bbb')); + }); + + it('question marks should match arbitrary dots', function() { + assert(mm.isMatch('aaa.bbb', 'aaa?bbb')); + }); + + it('question marks should not match leading dots', function() { + assert(!mm.isMatch('.aaa/bbb', '?aaa/bbb')); + assert(!mm.isMatch('aaa/.bbb', 'aaa/?bbb')); + }); + + it('question marks should match leading dots when options.dot is true', function() { + assert(mm.isMatch('aaa/.bbb', 'aaa/?bbb', {dot: true})); + assert(mm.isMatch('.aaa/bbb', '?aaa/bbb', {dot: true})); + }); + + it('question marks should match characters preceding a dot', function() { + assert(mm.isMatch('a/bbb/abcd.md', 'a/*/ab??.md')); + assert(mm.isMatch('a/bbb/abcd.md', 'a/bbb/ab??.md')); + assert(mm.isMatch('a/bbb/abcd.md', 'a/bbb/ab???md')); + }); +}); diff --git a/test/regex-ranges.js b/test/regex-ranges.js new file mode 100644 index 00000000..46feeae7 --- /dev/null +++ b/test/regex-ranges.js @@ -0,0 +1,28 @@ +'use strict'; + +var mm = require('./support/match'); + +describe('ranges', function() { + it('should support valid regex ranges', function() { + var fixtures = ['a.a', 'a.b', 'a.a.a', 'c.a', 'd.a.d', 'a.bb', 'a.ccc']; + mm(fixtures, '[a-b].[a-b]', ['a.a', 'a.b']); + mm(fixtures, '[a-d].[a-b]', ['a.a', 'a.b', 'c.a']); + mm(fixtures, '[a-d]*.[a-b]', ['a.a', 'a.b', 'a.a.a', 'c.a']); + mm(fixtures, '[a-d]*.[a-b]', ['a.a', 'a.b', 'c.a'], {bash: false}); + }); + + it('should support valid regex ranges with glob negation patterns', function() { + var fixtures = ['a.a', 'a.b', 'a.a.a', 'c.a', 'd.a.d', 'a.bb', 'a.ccc']; + mm(fixtures, '!*.[a-b]', ['a.bb', 'a.ccc', 'd.a.d']); + mm(fixtures, '!*.[a-b]*', ['a.ccc']); + mm(fixtures, '!*.[a-b]*', ['a.ccc', 'd.a.d'], {bash: false}); + mm(fixtures, '![a-b].[a-b]', ['a.a.a', 'a.bb', 'a.ccc', 'c.a', 'd.a.d']); + mm(fixtures, '![a-b]+.[a-b]+', ['a.a.a', 'a.ccc', 'c.a', 'd.a.d']); + }); + + it('should support valid regex ranges with negation patterns', function() { + var fixtures = ['a.a', 'a.b', 'a.a.a', 'c.a', 'd.a.d', 'a.bb', 'a.ccc']; + mm(fixtures, '*.[^a-b]', ['d.a.d']); + mm(fixtures, 'a.[^a-b]*', ['a.ccc']); + }); +}); diff --git a/test/regex.js b/test/regex.js deleted file mode 100644 index 14061346..00000000 --- a/test/regex.js +++ /dev/null @@ -1,31 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - -'use strict'; - -require('should'); -var mm = require('..'); - -describe('regex matching', function() { - it('should support matching with regex', function() { - mm(['.'], /\./).should.eql(['.']); - mm(['ab'], /ab/).should.eql(['ab']); - mm(['ab', 'a'], /a$/).should.eql(['a']); - mm(['ab', 'a'], /\/a/).should.eql([]); - mm(['ab', 'a'], /aa/).should.eql([]); - mm(['/ab', '/a'], /\/a$/).should.eql(['/a']); - }); - - it('should support matching with regex', function() { - mm.match(['.'], /\./).should.eql(['.']); - mm.match(['ab'], /ab/).should.eql(['ab']); - mm.match(['ab', 'a'], /a$/).should.eql(['a']); - mm.match(['ab', 'a'], /\/a/).should.eql([]); - mm.match(['ab', 'a'], /aa/).should.eql([]); - mm.match(['/ab', '/a'], /\/a$/).should.eql(['/a']); - }); -}); diff --git a/test/special-chars.js b/test/special-chars.js index 78ab1fdf..57855f8a 100644 --- a/test/special-chars.js +++ b/test/special-chars.js @@ -1,81 +1,119 @@ -/*! - * micromatch - * - * Copyright (c) 2014-2015, Jon Schlinkert. - * Licensed under the MIT License. - */ - 'use strict'; -require('should'); var path = require('path'); var assert = require('assert'); -var argv = require('minimist')(process.argv.slice(2)); -var ref = require('./support/reference'); -var mm = require('..'); - -if ('minimatch' in argv) { - mm = ref.minimatch; -} +var isWindows = require('is-windows'); +var mm = require('./support/match'); describe('special characters', function() { + describe('regex', function() { + it('should match common regex characters', function() { + var fixtures = ['a c', 'a1c', 'a123c', 'a.c', 'a.xy.zc', 'a.zc', 'abbbbc', 'abbbc', 'abbc', 'abc', 'abq', 'axy zc', 'axy', 'axy.zc', 'axyzc', '^abc$']; + + mm(fixtures, 'ab?bc', ['abbbc']); + mm(fixtures, 'ab*c', ['abbbbc', 'abbbc', 'abbc', 'abc']); + mm(fixtures, 'ab+bc', ['abbbbc', 'abbbc', 'abbc']); + mm(fixtures, '^abc$', ['^abc$']); + mm(fixtures, 'a.c', ['a.c']); + mm(fixtures, 'a.*c', ['a.c', 'a.xy.zc', 'a.zc']); + mm(fixtures, 'a*c', ['a c', 'a.c', 'a1c', 'a123c', 'abbbbc', 'abbbc', 'abbc', 'abc', 'axyzc', 'axy zc', 'axy.zc', 'a.xy.zc', 'a.zc']); + mm(fixtures, 'a\\w+c', ['a1c', 'a123c', 'abbbbc', 'abbbc', 'abbc', 'abc', 'axyzc'], 'Should match word characters'); + mm(fixtures, 'a\\W+c', ['a.c', 'a c'], 'Should match non-word characters'); + mm(fixtures, 'a\\d+c', ['a1c', 'a123c'], 'Should match numbers'); + mm(['foo@#$%123ASD #$$%^&', 'foo!@#$asdfl;', '123'], '\\d+', ['123']); + mm(['a123c', 'abbbc'], 'a\\D+c', ['abbbc'], 'Should match non-numbers'); + mm(['foo', ' foo '], '(f|o)+\\b', ['foo'], 'Should match word boundaries'); + }); + }); + describe('$ dollar signs', function() { it('should treat dollar signs as literal:', function() { assert(mm.isMatch('$', '$')); assert(mm.isMatch('$/foo', '$/*')); assert(mm.isMatch('$/foo', '$/*')); + assert(mm.isMatch('foo$', '*$')); assert(mm.isMatch('$foo/foo', '$foo/*')); assert(mm.isMatch('foo$/foo', 'foo$/*')); + assert(mm.isMatch('foo$/foo$', 'foo$/*')); + }); + }); + + describe('^ caret', function() { + it('should treat caret as literal:', function() { + assert(mm.isMatch('^', '^')); + assert(mm.isMatch('^/foo', '^/*')); + assert(mm.isMatch('^/foo', '^/*')); + assert(mm.isMatch('foo^', '*^')); + assert(mm.isMatch('^foo/foo', '^foo/*')); + assert(mm.isMatch('foo^/foo', 'foo^/*')); }); }); - describe('?:', function() { - it('should match one character per question mark:', function() { - mm.match(['a/b/c.md'], 'a/?/c.md').should.eql(['a/b/c.md']); - mm.match(['a/bb/c.md'], 'a/?/c.md').should.eql([]); - mm.match(['a/bb/c.md'], 'a/??/c.md').should.eql(['a/bb/c.md']); - mm.match(['a/bbb/c.md'], 'a/??/c.md').should.eql([]); - mm.match(['a/bbb/c.md'], 'a/???/c.md').should.eql(['a/bbb/c.md']); - mm.match(['a/bbbb/c.md'], 'a/????/c.md').should.eql(['a/bbbb/c.md']); + describe('slashes', function() { + it('should match forward slashes', function() { + assert(mm.isMatch('/', '/')); }); - it('should match multiple groups of question marks:', function() { - mm.match(['a/bb/c/dd/e.md'], 'a/?/c/?/e.md').should.eql([]); - mm.match(['a/b/c/d/e.md'], 'a/?/c/?/e.md').should.eql(['a/b/c/d/e.md']); - mm.match(['a/b/c/d/e.md'], 'a/?/c/???/e.md').should.eql([]); - mm.match(['a/b/c/zzz/e.md'], 'a/?/c/???/e.md').should.eql(['a/b/c/zzz/e.md']); + it('should match backslashes', function() { + assert(mm.isMatch('\\', '[\\\\/]')); + assert(mm.isMatch('\\', '[\\\\/]+')); + assert(mm.isMatch('\\\\', '[\\\\/]+')); + assert(mm.isMatch('\\\\\\', '[\\\\/]+')); + + if (isWindows()) { + mm(['\\'], '[\\\\/]', ['/']); + mm(['\\', '\\\\', '\\\\\\'], '[\\\\/]+', ['/']); + } else { + mm(['\\'], '[\\\\/]', ['\\']); + mm(['\\', '\\\\', '\\\\\\'], '[\\\\/]+', ['\\', '\\\\', '\\\\\\']); + } + + var sep = path.sep; + path.sep = '\\'; + assert(mm.isMatch('\\', '[\\\\/]')); + assert(mm.isMatch('\\', '[\\\\/]+')); + assert(mm.isMatch('\\\\', '[\\\\/]+')); + assert(mm.isMatch('\\\\\\', '[\\\\/]+')); + mm(['\\'], '[\\\\/]', ['/']); + mm(['\\', '\\\\', '\\\\\\'], '[\\\\/]+', ['/']); + path.sep = sep; }); + }); - it('should use special characters and glob stars together:', function() { - mm.match(['a/b/c/d/e.md'], 'a/?/c/?/*/e.md').should.eql([]); - mm.match(['a/b/c/d/e/e.md'], 'a/?/c/?/*/e.md').should.eql(['a/b/c/d/e/e.md']); - mm.match(['a/b/c/d/efghijk/e.md'], 'a/?/c/?/*/e.md').should.eql(['a/b/c/d/efghijk/e.md']); - mm.match(['a/b/c/d/efghijk/e.md'], 'a/?/**/e.md').should.eql(['a/b/c/d/efghijk/e.md']); - mm.match(['a/bb/c/d/efghijk/e.md'], 'a/?/**/e.md').should.eql([]); - mm.match(['a/b/c/d/efghijk/e.md'], 'a/*/?/**/e.md').should.eql(['a/b/c/d/efghijk/e.md']); - mm.match(['a/b/c/d/efgh.ijk/e.md'], 'a/*/?/**/e.md').should.eql(['a/b/c/d/efgh.ijk/e.md']); - mm.match(['a/b.bb/c/d/efgh.ijk/e.md'], 'a/*/?/**/e.md').should.eql(['a/b.bb/c/d/efgh.ijk/e.md']); - mm.match(['a/bbb/c/d/efgh.ijk/e.md'], 'a/*/?/**/e.md').should.eql(['a/bbb/c/d/efgh.ijk/e.md']); + describe('colons and drive letters', function() { + it('should treat common URL characters as literals', function() { + assert(mm.isMatch(':', ':')); + assert(mm.isMatch(':/foo', ':/*')); + assert(mm.isMatch('D://foo', 'D://*')); + assert(mm.isMatch('D://foo', 'D:\\/\\/*')); }); }); describe('[ab] - brackets:', function() { it('should support regex character classes:', function() { - mm.match(['a/b.md', 'a/c.md', 'a/d.md', 'a/E.md'], 'a/[A-Z].md').should.eql(['a/E.md']); - mm.match(['a/b.md', 'a/c.md', 'a/d.md'], 'a/[bd].md').should.eql(['a/b.md', 'a/d.md']); - mm.match(['a-1.md', 'a-2.md', 'a-3.md', 'a-4.md', 'a-5.md'], 'a-[2-4].md').should.eql(['a-2.md', 'a-3.md', 'a-4.md']); - mm.match(['a/b.md', 'b/b.md', 'c/b.md', 'b/c.md', 'a/d.md'], '[bc]/[bd].md').should.eql(['b/b.md', 'c/b.md']); + mm(['a/b.md', 'a/c.md', 'a/d.md', 'a/E.md'], 'a/[A-Z].md', ['a/E.md']); + mm(['a/b.md', 'a/c.md', 'a/d.md'], 'a/[bd].md', ['a/b.md', 'a/d.md']); + mm(['a-1.md', 'a-2.md', 'a-3.md', 'a-4.md', 'a-5.md'], 'a-[2-4].md', ['a-2.md', 'a-3.md', 'a-4.md']); + mm(['a/b.md', 'b/b.md', 'c/b.md', 'b/c.md', 'a/d.md'], '[bc]/[bd].md', ['b/b.md', 'c/b.md']); + }); + + it('should handle brackets', function() { + mm(['ab', 'ac', 'ad', 'a*', '*'], '[a*]*', ['*', 'a*'], {bash: false}); + mm(['ab', 'ac', 'ad', 'a*', '*'], '[a*]*', ['*', 'a*', 'ab', 'ac', 'ad']); + }); + + it('should handle unclosed brackets', function() { + mm(['[!ab', '[ab'], '[!a*', ['[!ab']); }); }); describe('(a|b) - logical OR:', function() { it('should support regex logical OR:', function() { - mm.match(['a/a', 'a/b', 'a/c', 'b/a', 'b/b'], '(a|b)/b').should.eql(['a/b', 'b/b']); - mm.match(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'c/b'], '((a|b)|c)/b').should.eql(['a/b', 'b/b', 'c/b']); - mm.match(['a/b.md', 'a/c.md', 'a/d.md'], 'a/(b|d).md').should.eql(['a/b.md', 'a/d.md']); - mm.match(['a-1.md', 'a-2.md', 'a-3.md', 'a-4.md', 'a-5.md'], 'a-(2|3|4).md').should.eql(['a-2.md', 'a-3.md', 'a-4.md']); - mm.match(['a/b.md', 'b/b.md', 'c/b.md', 'b/c.md', 'a/d.md'], '(b|c)/(b|d).md').should.eql(['b/b.md', 'c/b.md']); - mm.match(['a/b.md', 'b/b.md', 'c/b.md', 'b/c.md', 'a/d.md'], '{b,c}/{b,d}.md').should.eql(['b/b.md', 'c/b.md']); + mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b'], '(a|b)/b', ['a/b', 'b/b']); + mm(['a/a', 'a/b', 'a/c', 'b/a', 'b/b', 'c/b'], '((a|b)|c)/b', ['a/b', 'b/b', 'c/b']); + mm(['a/b.md', 'a/c.md', 'a/d.md'], 'a/(b|d).md', ['a/b.md', 'a/d.md']); + mm(['a-1.md', 'a-2.md', 'a-3.md', 'a-4.md', 'a-5.md'], 'a-(2|3|4).md', ['a-2.md', 'a-3.md', 'a-4.md']); + mm(['a/b.md', 'b/b.md', 'c/b.md', 'b/c.md', 'a/d.md'], '(b|c)/(b|d).md', ['b/b.md', 'c/b.md']); }); }); }); diff --git a/test/stars.js b/test/stars.js new file mode 100644 index 00000000..640de2d9 --- /dev/null +++ b/test/stars.js @@ -0,0 +1,90 @@ +'use strict'; + +var mm = require('./support/match'); + +describe('stars', function() { + it('should match one directory level with a single star (*)', function() { + var fixtures = ['/a', '/b', 'a', 'b', 'a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a', 'x/y', 'z/z']; + mm(fixtures, '*', ['a', 'b']); + mm(fixtures, '*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']); + mm(fixtures, '*/*/*', ['a/a/a', 'a/a/b']); + mm(fixtures, '*/*/*/*', ['a/a/a/a']); + mm(fixtures, '*/*/*/*/*', ['a/a/a/a/a']); + mm(fixtures, 'a/*', ['a/a', 'a/b', 'a/c', 'a/x']); + mm(fixtures, 'a/*/*', ['a/a/a', 'a/a/b']); + mm(fixtures, 'a/*/*/*', ['a/a/a/a']); + mm(fixtures, 'a/*/*/*/*', ['a/a/a/a/a']); + mm(fixtures, 'a/*/a', ['a/a/a']); + mm(fixtures, 'a/*/b', ['a/a/b']); + }); + + it('should match one or more characters', function() { + var fixtures = ['a', 'aa', 'aaa', 'aaaa', 'ab', 'b', 'bb', 'c', 'cc', 'cac', 'a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a', 'x/y', 'z/z']; + mm(fixtures, '*', ['a', 'aa', 'aaa', 'aaaa', 'ab', 'b', 'bb', 'c', 'cc', 'cac']); + mm(fixtures, 'a*', ['a', 'aa', 'aaa', 'aaaa', 'ab']); + mm(fixtures, '*b', ['ab', 'b', 'bb']); + }); + + it('should match one or zero characters', function() { + var fixtures = ['a', 'aa', 'aaa', 'aaaa', 'ab', 'b', 'bb', 'c', 'cc', 'cac', 'a/a', 'a/b', 'a/c', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a', 'x/y', 'z/z']; + mm(fixtures, '*', ['a', 'aa', 'aaa', 'aaaa', 'ab', 'b', 'bb', 'c', 'cc', 'cac']); + mm(fixtures, '*a*', ['a', 'aa', 'aaa', 'aaaa', 'ab', 'cac']); + mm(fixtures, '*b*', ['ab', 'b', 'bb']); + mm(fixtures, '*c*', ['c', 'cc', 'cac']); + }); + + it('should respect trailing slashes on paterns', function() { + var fixtures = ['a', 'a/', 'b', 'b/', 'a/a', 'a/a/', 'a/b', 'a/b/', 'a/c', 'a/c/', 'a/x', 'a/x/', 'a/a/a', 'a/a/b', 'a/a/b/', 'a/a/a/', 'a/a/a/a', 'a/a/a/a/', 'a/a/a/a/a', 'a/a/a/a/a/', 'x/y', 'z/z', 'x/y/', 'z/z/', 'a/b/c/.d/e/']; + mm(fixtures, '*/', ['a/', 'b/']); + mm(fixtures, '*/*/', ['a/a/', 'a/b/', 'a/c/', 'a/x/', 'x/y/', 'z/z/']); + mm(fixtures, '*/*/*/', ['a/a/a/', 'a/a/b/']); + mm(fixtures, '*/*/*/*/', ['a/a/a/a/']); + mm(fixtures, '*/*/*/*/*/', ['a/a/a/a/a/']); + mm(fixtures, 'a/*/', ['a/a/', 'a/b/', 'a/c/', 'a/x/']); + mm(fixtures, 'a/*/*/', ['a/a/a/', 'a/a/b/']); + mm(fixtures, 'a/*/*/*/', ['a/a/a/a/']); + mm(fixtures, 'a/*/*/*/*/', ['a/a/a/a/a/']); + mm(fixtures, 'a/*/a/', ['a/a/a/']); + mm(fixtures, 'a/*/b/', ['a/a/b/']); + }); + + it('should match a literal star when escaped', function() { + var fixtures = ['.md', 'a**a.md', '**a.md', '**/a.md', '**.md', '.md', '*', '**', '*.md']; + mm(fixtures, '\\*', ['*']); + mm(fixtures, '\\*.md', ['*.md']); + mm(fixtures, '\\**.md', ['**a.md', '**.md', '*.md']); + mm(fixtures, 'a\\**.md', ['a**a.md']); + }); + + it('should match leading `./`', function() { + var fixtures = ['a', './a', 'b', 'a/a', './a/b', 'a/c', './a/x', './a/a/a', 'a/a/b', './a/a/a/a', './a/a/a/a/a', 'x/y', './z/z']; + mm(fixtures, '*', ['a', 'b']); + mm(fixtures, '*', ['a', './a', 'b'], {unixify: false}); + mm(fixtures, '**/a/**', ['a/a', 'a/c', 'a/b', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']); + mm(fixtures, '**/a/**', ['a/a', 'a/c', './a/b', './a/x', './a/a/a', 'a/a/b', './a/a/a/a', './a/a/a/a/a'], {unixify: false}); + mm(fixtures, '*/*', ['a/a', 'a/b', 'a/c', 'a/x', 'x/y', 'z/z']); + mm(fixtures, '*/*', ['a/a', './a/b', 'a/c', './a/x', 'x/y', './z/z'], {unixify: false}); + mm(fixtures, '*/*/*', ['a/a/a', 'a/a/b']); + mm(fixtures, '*/*/*', ['./a/a/a', 'a/a/b'], {unixify: false}); + mm(fixtures, './a/*/a', ['a/a/a']); + mm(fixtures, './a/*/a', ['./a/a/a'], {unixify: false}); + mm(fixtures, '*/*/*/*', ['a/a/a/a']); + mm(fixtures, '*/*/*/*', ['./a/a/a/a'], {unixify: false}); + mm(fixtures, '*/*/*/*/*', ['a/a/a/a/a']); + mm(fixtures, '*/*/*/*/*', ['./a/a/a/a/a'], {unixify: false}); + mm(fixtures, './*', ['a', 'b']); + mm(fixtures, './*', ['a', './a', 'b'], {unixify: false}); + mm(fixtures, './**/a/**', ['a/a', 'a/c', 'a/b', 'a/x', 'a/a/a', 'a/a/b', 'a/a/a/a', 'a/a/a/a/a']); + mm(fixtures, './**/a/**', ['a/a', 'a/c', './a/b', './a/x', './a/a/a', 'a/a/b', './a/a/a/a', './a/a/a/a/a'], {unixify: false}); + mm(fixtures, 'a/*', ['a/a', 'a/b', 'a/c', 'a/x']); + mm(fixtures, 'a/*', ['a/a', './a/b', 'a/c', './a/x'], {unixify: false}); + mm(fixtures, 'a/*/*', ['a/a/a', 'a/a/b']); + mm(fixtures, 'a/*/*', ['./a/a/a', 'a/a/b'], {unixify: false}); + mm(fixtures, 'a/*/*/*', ['a/a/a/a']); + mm(fixtures, 'a/*/*/*', ['./a/a/a/a'], {unixify: false}); + mm(fixtures, 'a/*/*/*/*', ['a/a/a/a/a']); + mm(fixtures, 'a/*/*/*/*', ['./a/a/a/a/a'], {unixify: false}); + mm(fixtures, 'a/*/a', ['a/a/a']); + mm(fixtures, 'a/*/a', ['./a/a/a'], {unixify: false}); + }); +}); diff --git a/test/support/compare.js b/test/support/compare.js new file mode 100644 index 00000000..8a4aef01 --- /dev/null +++ b/test/support/compare.js @@ -0,0 +1,5 @@ +module.exports = function(a, b) { + a = a.toLowerCase(); + b = b.toLowerCase(); + return a > b ? 1 : a < b ? -1 : 0; +}; diff --git a/test/support/generate.js b/test/support/generate.js deleted file mode 100644 index f52c485c..00000000 --- a/test/support/generate.js +++ /dev/null @@ -1,43 +0,0 @@ -/*! - * micromatch - * - * Copyright (c) 2014 Jon Schlinkert, contributors. - * Licensed under the MIT License - */ - -'use strict'; - -var fs = require('fs'); -var path = require('path'); -var should = require('should'); -var mini = require('minimatch'); -var patterns = require('./patterns'); -var micro = require('../..'); - -writeActual('mini', mini.makeRe); -writeActual('mini-negate', mini.makeRe, {negate: true}); -writeActual('mini-dot', mini.makeRe, {dot: true}); -writeActual('mini-matchBase', mini.makeRe, {matchBase: true}); -writeActual('mini-dot-matchBase', mini.makeRe, {dot: true, matchBase: true}); - -writeActual('micro', micro.makeRe); -writeActual('micro-negate', micro.makeRe, {negate: true}); -writeActual('micro-dot', micro.makeRe, {dot: true}); -writeActual('micro-matchBase', micro.makeRe, {matchBase: true}); -writeActual('micro-dot-matchBase', micro.makeRe, {dot: true, matchBase: true}); - -function unit(fixture, expected) { - return 'var actual = fn("' + fixture + '");\nactual.should.eql(' + expected + ');\n'; -} - -function writeActual(dest, fn, options) { - options = options || {}; - var res = patterns.reduce(function(acc, fixture) { - if (options.negate) { - fixture = '!' + fixture; - } - return acc.concat(unit(fixture, fn(fixture, options))); - }, []).join('\n'); - - fs.writeFileSync(__dirname + '/../actual/' + dest + '.js', res); -} diff --git a/test/support/match.js b/test/support/match.js new file mode 100644 index 00000000..ec4bcdff --- /dev/null +++ b/test/support/match.js @@ -0,0 +1,78 @@ +'use strict'; + +var assert = require('assert'); +var extend = require('extend-shallow'); +var utils = require('../../lib/utils'); +var matcher = require('./matcher'); +var compare = require('./compare'); + +module.exports = function(fixtures, patterns, expected, options) { + if (!Array.isArray(expected)) { + var tmp = expected; + expected = options; + options = tmp; + } + + var actual = matcher(utils.arrayify(fixtures), patterns, options); + expected.sort(compare); + actual.sort(compare); + + assert.deepEqual(actual, expected, patterns); +}; +extend(module.exports, matcher); + +module.exports.match = function fn(fixtures, pattern, expected, options) { + if (!Array.isArray(expected)) { + var tmp = expected; + expected = options; + options = tmp; + } + + var actual = matcher.match(utils.arrayify(fixtures), pattern, options); + expected.sort(compare); + actual.sort(compare); + + assert.deepEqual(actual, expected, pattern); +}; + +module.exports.matcher = function(fixtures, patterns, expected, options) { + if (!Array.isArray(expected)) { + var tmp = expected; + expected = options; + options = tmp; + } + + var fn = matcher.matcher(patterns, options); + fixtures = utils.arrayify(fixtures); + var actual = []; + fixtures.forEach(function(file) { + if (fn(file)) { + actual.push(file); + } + }); + + expected.sort(compare); + actual.sort(compare); + + assert.deepEqual(actual, expected, patterns); +}; + +module.exports.isMatch = function() { + return matcher.isMatch.apply(null, arguments); +}; + +module.exports.makeRe = function() { + return matcher.makeRe.apply(null, arguments); +}; + +module.exports.braces = function() { + return matcher.braces.apply(null, arguments); +}; + +module.exports.create = function() { + return matcher.create.apply(null, arguments); +}; + +module.exports.not = function() { + return matcher.not.apply(null, arguments); +}; diff --git a/test/support/matcher.js b/test/support/matcher.js new file mode 100644 index 00000000..7a4a2ca9 --- /dev/null +++ b/test/support/matcher.js @@ -0,0 +1,88 @@ +'use strict'; + +var utils = require('../../lib/utils'); +var argv = require('minimist')(process.argv.slice(2)); +var bash = require('bash-match'); +var minimatch = require('minimatch'); +var mu = require('multimatch'); +var mi = require('../..'); + +// use multimatch for the array/array scenario +function mm() { + return mu.apply(null, arguments); +} + +// label for debugging +mi.micromatch = true; +mu.multimatch = true; +mm.minimatch = true; +bash.bash = true; + +/** + * Decorate methods onto bash for parity with micromatch + */ + +bash.makeRe = function() {}; + +/** + * Decorate methods onto multimatch for parity with micromatch + */ + +mu.isMatch = function(files, patterns, options) { + return mu(utils.arrayify(files), patterns, options).length > 0; +}; + +mu.match = function(files, patterns, options) { + return mu(utils.arrayify(files), patterns, options); +}; + +mu.makeRe = function(pattern, options) { + return mm.makeRe(pattern, options); +}; + +mu.braces = function(pattern, options) { + return mm.braceExpand(pattern, options); +}; + +/** + * Decorate methods onto minimatch for parity with micromatch + */ + +mm.isMatch = function(file, pattern, options) { + return minimatch(file, pattern, options); +}; + +mm.match = function(files, pattern, options) { + return minimatch.match(utils.arrayify(files), pattern, options); +}; + +mm.makeRe = function(pattern, options) { + return minimatch.makeRe(pattern, options); +}; + +mm.braces = function(pattern, options) { + return minimatch.braceExpand(pattern, options); +}; + +/** + * Detect matcher based on argv, with micromatch as default + */ + +var matcher = mi; +if (argv.bash) { + matcher = bash; +} else if (argv.mu) { + matcher = mu; +} else if (argv.mm) { + matcher = mm; +} + +/** + * Expose matcher + */ + +module.exports = matcher; +module.exports.bash = bash; +module.exports.mi = mi; +module.exports.mu = mu; +module.exports.mm = mm; diff --git a/test/support/parse.js b/test/support/parse.js new file mode 100644 index 00000000..8018b7f2 --- /dev/null +++ b/test/support/parse.js @@ -0,0 +1,51 @@ +'use strict'; + +var fs = require('fs'); +var path = require('path'); +var extend = require('extend-shallow'); +var mm = require('../..'); + +/** + * Parse bash test files + */ + +function parseFiles(pattern, options) { + var opts = extend({cwd: process.cwd()}, options); + var cwd = opts.cwd; + + var files = mm(fs.readdirSync(cwd), pattern); + var tests = {}; + + for (var i = 0; i < files.length; i++) { + var file = files[i]; + var name = path.basename(file, path.extname(file)); + tests[name] = parse(path.join(cwd, file)); + } + return tests; +} + +function parse(fp) { + var str = fs.readFileSync(fp, 'utf8'); + var lines = str.split('\n'); + var len = lines.length; + var idx = -1; + var tests = []; + + while (++idx < len) { + var line = lines[idx].trim(); + + if (!line) continue; + if (/^#\s\w/.test(line)) { + tests.push(line.replace(/^[#\s]+/, '').toLowerCase()); + continue; + } + if (!/^[tf] /.test(line)) continue; + + var segs = line.split(/\s+/).filter(Boolean); + if (segs.length !== 3) continue; + tests.push([segs[1], segs[2], segs[0] === 't']); + } + return tests.filter(Boolean); +} + +module.exports = parseFiles; diff --git a/test/support/reference.js b/test/support/reference.js deleted file mode 100644 index 85a6c902..00000000 --- a/test/support/reference.js +++ /dev/null @@ -1,6 +0,0 @@ -'use strict'; - -var mm = require('minimatch'); -mm.isMatch = mm; - -module.exports = mm; diff --git a/test/support/utils.js b/test/support/utils.js new file mode 100644 index 00000000..e3fbd780 --- /dev/null +++ b/test/support/utils.js @@ -0,0 +1,16 @@ +'use strict'; + +var fs = require('fs'); +var bashPath; + +exports.getBashPath = function() { + if (bashPath) return bashPath; + if (fs.existsSync('/usr/local/bin/bash')) { + bashPath = '/usr/local/bin/bash'; + } else if (fs.existsSync('/bin/bash')) { + bashPath = '/bin/bash'; + } else { + bashPath = 'bash'; + } + return bashPath; +}; diff --git a/test/t3070-wildmatch.js b/test/t3070-wildmatch.js deleted file mode 100644 index cb0e88b3..00000000 --- a/test/t3070-wildmatch.js +++ /dev/null @@ -1,181 +0,0 @@ -'use strict'; - -/*! - * Based on tests from , - * which were extracted from the `github.com/git/git` repository - * Version used: http://git.io/xDZI - * @attribution - */ - -var mm = require('..'); -require('should'); - -describe('original wildmatch', function() { - it('Basic wildmat features', function() { - mm.isMatch('foo', 'foo').should.be.true(); - mm.isMatch('foo', 'bar').should.be.false(); - mm.isMatch('', '').should.be.true(); - mm.isMatch('foo', '???').should.be.true(); - mm.isMatch('foo', '??').should.be.false(); - mm.isMatch('foo', '*').should.be.true(); - mm.isMatch('foo', 'f*').should.be.true(); - mm.isMatch('foo', '*f').should.be.false(); - mm.isMatch('foo', '*foo*').should.be.true(); - mm.isMatch('foobar', '*ob*a*r*').should.be.true(); - mm.isMatch('aaaaaaabababab', '*ab').should.be.true(); - mm.isMatch('foo*', 'foo\\*', {unixify: false}).should.be.true(); - mm.isMatch('foobar', 'foo\\*bar').should.be.false(); - mm.isMatch('f\\oo', 'f\\oo').should.be.true(); - mm.isMatch('ball', '*[al]?').should.be.true(); - mm.isMatch('ten', '[ten]').should.be.false(); - // mm.isMatch('ten', '**[!te]').should.be.false(); - mm.isMatch('ten', '**[!ten]').should.be.false(); - mm.isMatch('ten', 't[a-g]n').should.be.true(); - mm.isMatch('ten', 't[!a-g]n').should.be.false(); - mm.isMatch('ton', 't[!a-g]n').should.be.true(); - mm.isMatch('ton', 't[^a-g]n').should.be.true(); - mm.isMatch('a]b', 'a[]]b').should.be.false(); - // mm.isMatch('a-b', 'a[]-]b').should.be.true(); - // mm.isMatch('a]b', 'a[]-]b').should.be.true(); - mm.isMatch('aab', 'a[]-]b').should.be.false(); - // mm.isMatch('aab', 'a[]a-]b').should.be.true(); - mm.isMatch(']', ']').should.be.true(); - mm.isMatch('3', '[1-3]').should.be.true(); - }); - - it('Various additional tests', function() { - mm.isMatch('acrt', 'a[c-c]st').should.be.false(); - mm.isMatch('acrt', 'a[c-c]rt').should.be.true(); - mm.isMatch(']', '[!]-]').should.be.false(); - // mm.isMatch('a', '[!]-]').should.be.true(); - mm.isMatch('', '\\', {unixify: false}).should.be.false(); - mm.isMatch('\\', '\\', {unixify: false}).should.be.true(); - mm.isMatch('XXX/\\', '\\', {unixify: false}).should.be.false(); - // mm.isMatch('XXX/\\', '*/\\\\', {unixify: false}).should.be.true(); - mm.isMatch('foo', 'foo').should.be.true(); - mm.isMatch('@foo', '@foo').should.be.true(); - mm.isMatch('foo', '@foo').should.be.false(); - mm.isMatch('[ab]', '\\[ab]', {unixify: false}).should.be.true(); - mm.isMatch('[ab]', '[[]ab]').should.be.false(); - // mm.isMatch('[ab]', '[[:]ab]').should.be.false(); - mm.isMatch('[ab]', '[[::]ab]').should.be.false(); - // mm.isMatch('[ab]', '[\\[:]ab]', {unixify: false}).should.be.false(); - mm.isMatch('[ab]', '[[:]ab]', {nobrackets: true}).should.be.true(); - mm.isMatch('[ab]', '[[::]ab]', {nobrackets: true}).should.be.true(); - mm.isMatch('[ab]', '[\\[:]ab]', {unixify: false, nobrackets: true}).should.be.true(); - mm.isMatch('[ab]', '[[::]ab]', {brackets: true}).should.be.false(); - // mm.isMatch('[ab]', '[\\[:]ab]', {unixify: false, brackets: true}).should.be.false(); - mm.isMatch('?a?b', '\\??\\?b', {unixify: false}).should.be.true(); - mm.isMatch('foo', '').should.be.false(); - mm.isMatch('foo/bar/baz/to', '**/t[o]').should.be.true(); - }); - - it('malformed wildmats:', function() { - mm.isMatch(']', '[\\\\-^]').should.be.false(); - mm.isMatch('[', '[\\\\-^]').should.be.false(); - mm.isMatch('-', '[\\-_]').should.be.true(); - // mm.isMatch(']', '[\\]]').should.be.true(); - mm.isMatch('\\]', '[\\]]').should.be.false(); - mm.isMatch('\\', '[\\]]').should.be.false(); - mm.isMatch('ab', 'a[]b').should.be.false(); - mm.isMatch('a[]b', 'a[]b').should.be.true(); - mm.isMatch('ab[', 'ab[').should.be.true(); - mm.isMatch('ab', '[!').should.be.false(); - mm.isMatch('ab', '[-').should.be.false(); - mm.isMatch('-', '[-]').should.be.true(); - mm.isMatch('-', '[a-').should.be.false(); - mm.isMatch('-', '[!a-').should.be.false(); - mm.isMatch('-', '[--A]').should.be.true(); - mm.isMatch('5', '[--A]').should.be.true(); - mm.isMatch(' ', '[ --]').should.be.true(); - mm.isMatch('$', '[ --]').should.be.true(); - mm.isMatch('-', '[ --]').should.be.true(); - mm.isMatch('0', '[ --]').should.be.false(); - mm.isMatch('-', '[---]').should.be.true(); - mm.isMatch('-', '[------]').should.be.true(); - mm.isMatch('j', '[a-e-n]').should.be.false(); - mm.isMatch('-', '[a-e-n]').should.be.true(); - // mm.isMatch('a', '[!------]').should.be.true(); - mm.isMatch('[', '[]-a]').should.be.false(); - mm.isMatch('^', '[]-a]').should.be.false(); - mm.isMatch('^', '[!]-a]').should.be.false(); - // mm.isMatch('[', '[!]-a]').should.be.true(); - mm.isMatch('^', '[a^bc]').should.be.true(); - // mm.isMatch('-b]', '[a-]b]').should.be.true(); - mm.isMatch('\\', '[\\]', {unixify: false}).should.be.false(); - mm.isMatch('\\', '[\\\\]', {unixify: false}).should.be.true(); - // mm.isMatch('\\', '[!\\\\]', {unixify: false}).should.be.false(); - mm.isMatch('G', '[A-\\\\]', {unixify: false}).should.be.true(); - mm.isMatch('aaabbb', 'b*a').should.be.false(); - mm.isMatch('aabcaa', '*ba*').should.be.false(); - mm.isMatch(',', '[,]').should.be.true(); - // mm.isMatch(',', '[\\\\,]').should.be.true(); - mm.isMatch('\\', '[\\\\,]', {unixify: false}).should.be.true(); - mm.isMatch('-', '[,-.]').should.be.true(); - mm.isMatch('+', '[,-.]').should.be.false(); - mm.isMatch('-.]', '[,-.]').should.be.false(); - // mm.isMatch('2', '[\\1-\\3]', {unixify: false}).should.be.true(); - // mm.isMatch('3', '[\\1-\\3]', {unixify: false}).should.be.true(); - mm.isMatch('4', '[\\1-\\3]', {unixify: false}).should.be.false(); - mm.isMatch('\\', '[[-\\]]', {unixify: false}).should.be.true(); - mm.isMatch('[', '[[-\\]]', {unixify: false}).should.be.true(); - mm.isMatch(']', '[[-\\]]', {unixify: false}).should.be.true(); - mm.isMatch('-', '[[-\\]]', {unixify: false}).should.be.false(); - }); - - it('Test recursion and the abort code', function() { - mm.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-m-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*').should.be.true(); - mm.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-X-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*').should.be.false(); - mm.isMatch('-adobe-courier-bold-o-normal--12-120-75-75-/-70-iso8859-1', '-*-*-*-*-*-*-12-*-*-*-m-*-*-*').should.be.false(); - mm.isMatch('XXX/adobe/courier/bold/o/normal//12/120/75/75/m/70/iso8859/1', 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*', {unixify: false}).should.be.true(); - mm.isMatch('XXX/adobe/courier/bold/o/normal//12/120/75/75/X/70/iso8859/1', 'XXX/*/*/*/*/*/*/12/*/*/*/m/*/*/*').should.be.false(); - mm.isMatch('abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txt', '**/*a*b*g*n*t').should.be.true(); - mm.isMatch('abcd/abcdefg/abcdefghijk/abcdefghijklmnop.txtz', '**/*a*b*g*n*t').should.be.false(); - mm.isMatch('foo', '*/*/*').should.be.false(); - mm.isMatch('foo/bar', '*/*/*').should.be.false(); - mm.isMatch('foo/bba/arr', '*/*/*').should.be.true(); - mm.isMatch('foo/bb/aa/rr', '*/*/*').should.be.false(); - mm.isMatch('foo/bb/aa/rr', '**/**/**').should.be.true(); - mm.isMatch('abcXdefXghi', '*X*i').should.be.true(); - mm.isMatch('ab/cXd/efXg/hi', '*X*i').should.be.false(); - mm.isMatch('ab/cXd/efXg/hi', '*/*X*/*/*i').should.be.true(); - mm.isMatch('ab/cXd/efXg/hi', '**/*X*/**/*i').should.be.true(); - }); - - it('Test pathName option', function() { - mm.isMatch('foo', 'foo').should.be.true(); - mm.isMatch('foo', 'fo').should.be.false(); - mm.isMatch('foo/bar', 'foo/bar').should.be.true(); - mm.isMatch('foo/bar', 'foo/*').should.be.true(); - mm.isMatch('foo/bba/arr', 'foo/*').should.be.false(); - mm.isMatch('foo/bba/arr', 'foo/**').should.be.true(); - mm.isMatch('foo/bba/arr', 'foo*').should.be.false(); - mm.isMatch('foo/bba/arr', 'foo**').should.be.false(); - mm.isMatch('foo/bba/arr', 'foo/*arr').should.be.false(); - mm.isMatch('foo/bba/arr', 'foo/**arr').should.be.true(); - mm.isMatch('foo/bba/arr', 'foo/*z').should.be.false(); - mm.isMatch('foo/bba/arr', 'foo/**z').should.be.false(); - mm.isMatch('foo/bar', 'foo?bar').should.be.false(); - mm.isMatch('foo/bar', 'foo[/]bar').should.be.true(); - mm.isMatch('foo', '*/*/*').should.be.false(); - mm.isMatch('foo/bar', '*/*/*').should.be.false(); - mm.isMatch('foo/bba/arr', '*/*/*').should.be.true(); - mm.isMatch('foo/bb/aa/rr', '*/*/*').should.be.false(); - mm.isMatch('abcXdefXghi', '*X*i').should.be.true(); - mm.isMatch('ab/cXd/efXg/hi', '*/*X*/*/*i').should.be.true(); - mm.isMatch('ab/cXd/efXg/hi', '*Xg*i').should.be.false(); - }); - - it('Case-sensitivy features', function() { - mm.isMatch('a', '[A-Z]').should.be.false(); - mm.isMatch('A', '[a-z]').should.be.false(); - mm.isMatch('A', '[A-Z]').should.be.true(); - mm.isMatch('a', '[a-z]').should.be.true(); - mm.isMatch('A', '[B-a]').should.be.false(); - mm.isMatch('a', '[B-a]').should.be.true(); - mm.isMatch('A', '[B-Za]').should.be.false(); - mm.isMatch('a', '[B-Za]').should.be.true(); - mm.isMatch('z', '[Z-y]').should.be.false(); - mm.isMatch('Z', '[Z-y]').should.be.true(); - }); -}); diff --git a/test/utils.js b/test/utils.js deleted file mode 100644 index 91da8c9d..00000000 --- a/test/utils.js +++ /dev/null @@ -1,73 +0,0 @@ -'use strict'; - -require('should'); -var path = require('path'); -var assert = require('assert'); -var utils = require('../lib/utils'); -var mm = require('..'); - -describe('utils.hasPath', function() { - it('should return a function', function() { - assert.equal(typeof utils.hasPath('foo/bar'), 'function'); - }); - - it('should return true if the first path contains the second:', function() { - assert.equal(utils.hasPath('foo/bar')('foo'), true); - }); -}); - -describe('utils.matchPath', function() { - it('should return true if two paths are the same:', function() { - assert.equal(utils.matchPath('foo')('foo'), true); - }); - - it('should return true if the first path contains the second:', function() { - assert.equal(utils.matchPath('foo/bar', {contains: true})('foo'), true); - }); -}); - -describe('utils.unixify', function() { - it('should convert a path to unix slashes', function() { - var sep = path.sep; - path.sep = '\\'; - assert.equal(utils.unixify('foo\\bar'), 'foo/bar'); - path.sep = sep; - }); - - it('should return an empty string:', function() { - assert.equal(utils.unixify(''), ''); - }); - - it('should retain trailing slashes with unix paths:', function() { - assert.equal(utils.unixify('a/b/c/d/'), 'a/b/c/d/'); - }); - - it('should retain trailing slashes with windows paths:', function() { - var sep = path.sep; - path.sep = '\\'; - assert.equal(utils.unixify('a\\b\\c\\d\\'), 'a/b/c/d/'); - path.sep = sep; - }); - - it('should unescape word chars when `options.unescape` is true:', function() { - var fp = utils.unixify('foo\\bar\\baz\\quux', {unescape: true}); - assert.equal(fp, 'foobarbazquux'); - }); - - it('should not blow up on empty strings:', function() { - var fp = utils.unixify('', {unescape: true}); - assert.equal(fp, ''); - }); -}); - -describe('utils.escapePath', function() { - it('should escape dots and backslashes in a path', function() { - assert.equal(utils.escapePath('foo\\bar.baz'), 'foo\\\\bar\\.baz'); - }); -}); - -describe('utils.escapeRe', function() { - it('should escape regex characters in a path', function() { - assert.equal(utils.escapeRe('foo^bar*baz?#'), 'foo\\^bar\\*baz\\?\\#'); - }); -});