From 20a552b4b777303037609fd5ac509362f22bb4c8 Mon Sep 17 00:00:00 2001 From: David Anson Date: Thu, 9 Nov 2023 19:47:15 -0800 Subject: [PATCH] Remove MD002 (deprecated in v0.13.0) and MD006 (deprecated in v0.19.0). --- .github/dictionary.txt | 2 - README.md | 17 +- demo/default.js | 1 - demo/markdownlint-browser.js | 237 +++------ doc-build/heading.md | 3 +- doc-build/md002.md | 25 - doc-build/md006.md | 36 -- doc-build/md007.md | 7 +- doc/Rules.md | 99 +--- doc/md002.md | 37 -- doc/md006.md | 46 -- doc/md007.md | 7 +- lib/configuration.d.ts | 51 +- lib/constants.js | 13 +- lib/markdownlint.js | 8 +- lib/md002.js | 22 - lib/md006.js | 34 -- lib/rules.js | 2 - schema/.markdownlint.jsonc | 9 - schema/.markdownlint.yaml | 8 - schema/build-config-schema.js | 11 - schema/markdownlint-config-schema.json | 74 +-- style/relaxed.json | 1 - test/MD001-MD010.md | 8 +- test/alternate_top_level_heading.md | 3 - test/atx_closed_heading_spacing.md | 1 - test/atx_heading_spacing.md | 1 - test/break-all-the-rules.md | 10 +- .../bulleted_list_not_at_beginning_of_line.md | 24 +- test/front-matter-title-h2.md | 3 - .../list-indentation-start-indented-indent.md | 1 - test/list-indentation.md | 10 +- test/lists-with-nesting.md | 12 +- test/markdownlint-test-config.js | 8 +- test/markdownlint-test-result-object.js | 146 +++--- test/markdownlint-test.js | 29 +- ...md041-yaml-title-and-first-line-heading.md | 3 - .../markdownlint-test-scenarios.js.md | 477 ++---------------- .../markdownlint-test-scenarios.js.snap | Bin 210617 -> 208400 bytes test/wrong-types-in-config-file.md | 3 - 40 files changed, 250 insertions(+), 1239 deletions(-) delete mode 100644 doc-build/md002.md delete mode 100644 doc-build/md006.md delete mode 100644 doc/md002.md delete mode 100644 doc/md006.md delete mode 100644 lib/md002.js delete mode 100644 lib/md006.js diff --git a/.github/dictionary.txt b/.github/dictionary.txt index d7b3f729..b6f938aa 100644 --- a/.github/dictionary.txt +++ b/.github/dictionary.txt @@ -33,8 +33,6 @@ ES2015 ES6 ESLint eslint-plugin-markdownlint -first-header-h1 -first-heading-h1 first-line-h1 formatter fs diff --git a/README.md b/README.md index f76bf63e..79a2c526 100644 --- a/README.md +++ b/README.md @@ -87,11 +87,9 @@ playground for learning and exploring. - **[MD001](doc/md001.md)** *heading-increment/header-increment* - Heading levels should only increment by one level at a time -- ~~**[MD002](doc/md002.md)** *first-heading-h1/first-header-h1* - First heading should be a top-level heading~~ - **[MD003](doc/md003.md)** *heading-style/header-style* - Heading style - **[MD004](doc/md004.md)** *ul-style* - Unordered list style - **[MD005](doc/md005.md)** *list-indent* - Inconsistent indentation for list items at the same level -- ~~**[MD006](doc/md006.md)** *ul-start-left* - Consider starting bulleted lists at the beginning of the line~~ - **[MD007](doc/md007.md)** *ul-indent* - Unordered list indentation - **[MD009](doc/md009.md)** *no-trailing-spaces* - Trailing spaces - **[MD010](doc/md010.md)** *no-hard-tabs* - Hard tabs @@ -141,8 +139,6 @@ playground for learning and exploring. See [Rules.md](doc/Rules.md) for more details. -~~Struck through~~ rules are deprecated and provided for backward-compatibility. - > All rules with `heading` as part of their name are also available as `header` > aliases (e.g. `heading-increment` is also available as `header-increment`). > The use of `header` is deprecated and provided for backward-compatibility. @@ -166,19 +162,18 @@ rules at once. - **`atx_closed`** - `MD020`, `MD021` - **`blank_lines`** - `MD012`, `MD022`, `MD031`, `MD032`, `MD047` - **`blockquote`** - `MD027`, `MD028` -- **`bullet`** - `MD004`, `MD005`, `MD006`, `MD007`, `MD032` +- **`bullet`** - `MD004`, `MD005`, `MD007`, `MD032` - **`code`** - `MD014`, `MD031`, `MD038`, `MD040`, `MD046`, `MD048` - **`emphasis`** - `MD036`, `MD037`, `MD049`, `MD050` - **`hard_tab`** - `MD010` -- **`headers`** - `MD001`, `MD002`, `MD003`, `MD018`, `MD019`, `MD020`, `MD021`, +- **`headers`** - `MD001`, `MD003`, `MD018`, `MD019`, `MD020`, `MD021`, `MD022`, + `MD023`, `MD024`, `MD025`, `MD026`, `MD036`, `MD041`, `MD043` +- **`headings`** - `MD001`, `MD003`, `MD018`, `MD019`, `MD020`, `MD021`, `MD022`, `MD023`, `MD024`, `MD025`, `MD026`, `MD036`, `MD041`, `MD043` -- **`headings`** - `MD001`, `MD002`, `MD003`, `MD018`, `MD019`, `MD020`, - `MD021`, `MD022`, `MD023`, `MD024`, `MD025`, `MD026`, `MD036`, `MD041`, - `MD043` - **`hr`** - `MD035` - **`html`** - `MD033` - **`images`** - `MD045`, `MD052`, `MD053`, `MD054` -- **`indentation`** - `MD005`, `MD006`, `MD007`, `MD027` +- **`indentation`** - `MD005`, `MD007`, `MD027` - **`language`** - `MD040` - **`line_length`** - `MD013` - **`links`** - `MD011`, `MD034`, `MD039`, `MD042`, `MD051`, `MD052`, `MD053`, @@ -186,7 +181,7 @@ rules at once. - **`ol`** - `MD029`, `MD030`, `MD032` - **`spaces`** - `MD018`, `MD019`, `MD020`, `MD021`, `MD023` - **`spelling`** - `MD044` -- **`ul`** - `MD004`, `MD005`, `MD006`, `MD007`, `MD030`, `MD032` +- **`ul`** - `MD004`, `MD005`, `MD007`, `MD030`, `MD032` - **`url`** - `MD034` - **`whitespace`** - `MD009`, `MD010`, `MD012`, `MD027`, `MD028`, `MD030`, `MD037`, `MD038`, `MD039` diff --git a/demo/default.js b/demo/default.js index 99b420a9..9f859ccb 100644 --- a/demo/default.js +++ b/demo/default.js @@ -228,7 +228,6 @@ "Click a violation for information about it or click its line number to highlighted it in the lower-left box.", "", "> *Note*: [All rules](https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md) are enabled except [MD013/line-length](https://github.com/DavidAnson/markdownlint/blob/main/doc/md013.md).", - "> ([MD002/first-heading-h1](https://github.com/DavidAnson/markdownlint/blob/main/doc/md002.md) and [MD006/ul-start-left](https://github.com/DavidAnson/markdownlint/blob/main/doc/md006.md) are deprecated.)", "", "", "#### Resources", diff --git a/demo/markdownlint-browser.js b/demo/markdownlint-browser.js index 9c1084d9..8c4a914b 100644 --- a/demo/markdownlint-browser.js +++ b/demo/markdownlint-browser.js @@ -1654,8 +1654,8 @@ module.exports.referenceLinkImageData = function () { -module.exports.deprecatedRuleNames = ["MD002", "MD006"]; -module.exports.fixableRuleNames = ["MD004", "MD005", "MD006", "MD007", "MD009", "MD010", "MD011", "MD012", "MD014", "MD018", "MD019", "MD020", "MD021", "MD022", "MD023", "MD026", "MD027", "MD030", "MD031", "MD032", "MD034", "MD037", "MD038", "MD039", "MD044", "MD047", "MD049", "MD050", "MD051", "MD053", "MD054"]; +module.exports.deprecatedRuleNames = []; +module.exports.fixableRuleNames = ["MD004", "MD005", "MD007", "MD009", "MD010", "MD011", "MD012", "MD014", "MD018", "MD019", "MD020", "MD021", "MD022", "MD023", "MD026", "MD027", "MD030", "MD031", "MD032", "MD034", "MD037", "MD038", "MD039", "MD044", "MD047", "MD049", "MD050", "MD051", "MD053", "MD054"]; module.exports.homepage = "https://github.com/DavidAnson/markdownlint"; module.exports.version = "0.31.1"; @@ -1694,8 +1694,7 @@ var _require = __webpack_require__(/*! node:util */ "?39e5"), promisify = _require.promisify; var markdownit = __webpack_require__(/*! markdown-it */ "markdown-it"); var micromark = __webpack_require__(/*! ../helpers/micromark.cjs */ "../helpers/micromark.cjs"); -var _require2 = __webpack_require__(/*! ./constants */ "../lib/constants.js"), - deprecatedRuleNames = _require2.deprecatedRuleNames; +// const { deprecatedRuleNames } = require("./constants"); var rules = __webpack_require__(/*! ./rules */ "../lib/rules.js"); var helpers = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"); var cache = __webpack_require__(/*! ./cache */ "../lib/cache.js"); @@ -2116,23 +2115,14 @@ function getEffectiveConfig(ruleList, config, aliasToRuleNames) { var _ruleName2 = rule.names[0].toUpperCase(); effectiveConfig[_ruleName2] = ruleDefault; } + // for (const ruleName of deprecatedRuleNames) { + // effectiveConfig[ruleName] = false; + // } } catch (err) { _iterator14.e(err); } finally { _iterator14.f(); } - var _iterator15 = _createForOfIteratorHelper(deprecatedRuleNames), - _step15; - try { - for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) { - var _ruleName3 = _step15.value; - effectiveConfig[_ruleName3] = false; - } - } catch (err) { - _iterator15.e(err); - } finally { - _iterator15.f(); - } for (var _i5 = 0, _Object$keys = Object.keys(config); _i5 < _Object$keys.length; _i5++) { var key = _Object$keys[_i5]; var value = config[key]; @@ -2144,17 +2134,17 @@ function getEffectiveConfig(ruleList, config, aliasToRuleNames) { value = false; } var keyUpper = key.toUpperCase(); - var _iterator16 = _createForOfIteratorHelper(aliasToRuleNames[keyUpper] || []), - _step16; + var _iterator15 = _createForOfIteratorHelper(aliasToRuleNames[keyUpper] || []), + _step15; try { - for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) { - var ruleName = _step16.value; + for (_iterator15.s(); !(_step15 = _iterator15.n()).done;) { + var ruleName = _step15.value; effectiveConfig[ruleName] = value; } } catch (err) { - _iterator16.e(err); + _iterator15.e(err); } finally { - _iterator16.f(); + _iterator15.f(); } } return effectiveConfig; @@ -2215,13 +2205,13 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin // Helper functions // eslint-disable-next-line jsdoc/require-jsdoc function handleInlineConfig(input, forEachMatch, forEachLine) { - var _iterator17 = _createForOfIteratorHelper(input.entries()), - _step17; + var _iterator16 = _createForOfIteratorHelper(input.entries()), + _step16; try { - for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) { - var _step17$value = _slicedToArray(_step17.value, 2), - lineIndex = _step17$value[0], - line = _step17$value[1]; + for (_iterator16.s(); !(_step16 = _iterator16.n()).done;) { + var _step16$value = _slicedToArray(_step16.value, 2), + lineIndex = _step16$value[0], + line = _step16$value[1]; if (!noInlineConfig) { var match = null; while (match = helpers.inlineCommentStartRe.exec(line)) { @@ -2240,9 +2230,9 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin } } } catch (err) { - _iterator17.e(err); + _iterator16.e(err); } finally { - _iterator17.f(); + _iterator16.f(); } } // eslint-disable-next-line jsdoc/require-jsdoc @@ -2261,28 +2251,28 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin var enabled = action.startsWith("ENABLE"); var trimmed = parameter && parameter.trim(); var items = trimmed ? trimmed.toUpperCase().split(/\s+/) : allRuleNames; - var _iterator18 = _createForOfIteratorHelper(items), - _step18; + var _iterator17 = _createForOfIteratorHelper(items), + _step17; try { - for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) { - var nameUpper = _step18.value; - var _iterator19 = _createForOfIteratorHelper(aliasToRuleNames[nameUpper] || []), - _step19; + for (_iterator17.s(); !(_step17 = _iterator17.n()).done;) { + var nameUpper = _step17.value; + var _iterator18 = _createForOfIteratorHelper(aliasToRuleNames[nameUpper] || []), + _step18; try { - for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) { - var ruleName = _step19.value; + for (_iterator18.s(); !(_step18 = _iterator18.n()).done;) { + var ruleName = _step18.value; state[ruleName] = enabled; } } catch (err) { - _iterator19.e(err); + _iterator18.e(err); } finally { - _iterator19.f(); + _iterator18.f(); } } } catch (err) { - _iterator18.e(err); + _iterator17.e(err); } finally { - _iterator18.f(); + _iterator17.f(); } return state; } @@ -2318,19 +2308,19 @@ function getEnabledRulesPerLineNumber(ruleList, lines, frontMatterLines, noInlin // Handle inline comments handleInlineConfig([lines.join("\n")], configureFile); var effectiveConfig = getEffectiveConfig(ruleList, config, aliasToRuleNames); - var _iterator20 = _createForOfIteratorHelper(ruleList), - _step20; + var _iterator19 = _createForOfIteratorHelper(ruleList), + _step19; try { - for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) { - var rule = _step20.value; + for (_iterator19.s(); !(_step19 = _iterator19.n()).done;) { + var rule = _step19.value; var ruleName = rule.names[0].toUpperCase(); allRuleNames.push(ruleName); enabledRules[ruleName] = !!effectiveConfig[ruleName]; } } catch (err) { - _iterator20.e(err); + _iterator19.e(err); } finally { - _iterator20.f(); + _iterator19.f(); } capturedRules = enabledRules; handleInlineConfig(lines, enableDisableFile); @@ -2533,51 +2523,51 @@ function lintContent(ruleList, aliasToRuleNames, name, content, md, config, conf if (resultVersion === 0) { // Return a dictionary of rule->[line numbers] var dictionary = {}; - var _iterator21 = _createForOfIteratorHelper(results), - _step21; + var _iterator20 = _createForOfIteratorHelper(results), + _step20; try { - for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) { - var error = _step21.value; + for (_iterator20.s(); !(_step20 = _iterator20.n()).done;) { + var error = _step20.value; var ruleLines = dictionary[error.ruleName] || []; ruleLines.push(error.lineNumber); dictionary[error.ruleName] = ruleLines; } // @ts-ignore } catch (err) { - _iterator21.e(err); + _iterator20.e(err); } finally { - _iterator21.f(); + _iterator20.f(); } results = dictionary; } else if (resultVersion === 1) { // Use ruleAlias instead of ruleNames + var _iterator21 = _createForOfIteratorHelper(results), + _step21; + try { + for (_iterator21.s(); !(_step21 = _iterator21.n()).done;) { + var _error = _step21.value; + _error.ruleAlias = _error.ruleNames[1] || _error.ruleName; + delete _error.ruleNames; + } + } catch (err) { + _iterator21.e(err); + } finally { + _iterator21.f(); + } + } else { + // resultVersion 2 or 3: Remove unwanted ruleName var _iterator22 = _createForOfIteratorHelper(results), _step22; try { for (_iterator22.s(); !(_step22 = _iterator22.n()).done;) { - var _error = _step22.value; - _error.ruleAlias = _error.ruleNames[1] || _error.ruleName; - delete _error.ruleNames; + var _error2 = _step22.value; + delete _error2.ruleName; } } catch (err) { _iterator22.e(err); } finally { _iterator22.f(); } - } else { - // resultVersion 2 or 3: Remove unwanted ruleName - var _iterator23 = _createForOfIteratorHelper(results), - _step23; - try { - for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) { - var _error2 = _step23.value; - delete _error2.ruleName; - } - } catch (err) { - _iterator23.e(err); - } finally { - _iterator23.f(); - } } return results; } @@ -2693,18 +2683,18 @@ function lintInput(options, synchronous, callback) { "html": true }); var markdownItPlugins = options.markdownItPlugins || []; - var _iterator24 = _createForOfIteratorHelper(markdownItPlugins), - _step24; + var _iterator23 = _createForOfIteratorHelper(markdownItPlugins), + _step23; try { - for (_iterator24.s(); !(_step24 = _iterator24.n()).done;) { - var plugin = _step24.value; + for (_iterator23.s(); !(_step23 = _iterator23.n()).done;) { + var plugin = _step23.value; // @ts-ignore md.use.apply(md, _toConsumableArray(plugin)); } } catch (err) { - _iterator24.e(err); + _iterator23.e(err); } finally { - _iterator24.f(); + _iterator23.f(); } var fs = options.fs || __webpack_require__(/*! node:fs */ "?d0ee"); var aliasToRuleNames = mapAliasToRuleNames(ruleList); @@ -3264,38 +3254,6 @@ module.exports = { /***/ }), -/***/ "../lib/md002.js": -/*!***********************!*\ - !*** ../lib/md002.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -var _require = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"), - addErrorDetailIf = _require.addErrorDetailIf; -module.exports = { - "names": ["MD002", "first-heading-h1", "first-header-h1"], - "description": "First heading should be a top-level heading", - "tags": ["headings", "headers"], - "function": function MD002(params, onError) { - var level = Number(params.config.level || 1); - var tag = "h" + level; - params.parsers.markdownit.tokens.every(function forToken(token) { - if (token.type === "heading_open") { - addErrorDetailIf(onError, token.lineNumber, tag, token.tag); - return false; - } - return true; - }); - } -}; - -/***/ }), - /***/ "../lib/md003.js": /*!***********************!*\ !*** ../lib/md003.js ***! @@ -3525,65 +3483,6 @@ module.exports = { /***/ }), -/***/ "../lib/md006.js": -/*!***********************!*\ - !*** ../lib/md006.js ***! - \***********************/ -/***/ ((module, __unused_webpack_exports, __webpack_require__) => { - -"use strict"; -// @ts-check - - - -function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } -function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } -function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } -var _require = __webpack_require__(/*! ../helpers */ "../helpers/helpers.js"), - addErrorDetailIf = _require.addErrorDetailIf, - listItemMarkerRe = _require.listItemMarkerRe, - rangeFromRegExp = _require.rangeFromRegExp; -var _require2 = __webpack_require__(/*! ./cache */ "../lib/cache.js"), - flattenedLists = _require2.flattenedLists; -module.exports = { - "names": ["MD006", "ul-start-left"], - "description": "Consider starting bulleted lists at the beginning of the line", - "tags": ["bullet", "ul", "indentation"], - "function": function MD006(params, onError) { - var _iterator = _createForOfIteratorHelper(flattenedLists()), - _step; - try { - for (_iterator.s(); !(_step = _iterator.n()).done;) { - var list = _step.value; - if (list.unordered && !list.nesting && list.indent !== 0) { - var _iterator2 = _createForOfIteratorHelper(list.items), - _step2; - try { - for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { - var item = _step2.value; - var lineNumber = item.lineNumber, - line = item.line; - addErrorDetailIf(onError, lineNumber, 0, list.indent, null, null, rangeFromRegExp(line, listItemMarkerRe), { - "deleteCount": line.length - line.trimStart().length - }); - } - } catch (err) { - _iterator2.e(err); - } finally { - _iterator2.f(); - } - } - } - } catch (err) { - _iterator.e(err); - } finally { - _iterator.f(); - } - } -}; - -/***/ }), - /***/ "../lib/md007.js": /*!***********************!*\ !*** ../lib/md007.js ***! @@ -6840,7 +6739,7 @@ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len var _require = __webpack_require__(/*! ./constants */ "../lib/constants.js"), homepage = _require.homepage, version = _require.version; -var rules = [__webpack_require__(/*! ./md001 */ "../lib/md001.js"), __webpack_require__(/*! ./md002 */ "../lib/md002.js"), __webpack_require__(/*! ./md003 */ "../lib/md003.js"), __webpack_require__(/*! ./md004 */ "../lib/md004.js"), __webpack_require__(/*! ./md005 */ "../lib/md005.js"), __webpack_require__(/*! ./md006 */ "../lib/md006.js"), __webpack_require__(/*! ./md007 */ "../lib/md007.js"), __webpack_require__(/*! ./md009 */ "../lib/md009.js"), __webpack_require__(/*! ./md010 */ "../lib/md010.js"), __webpack_require__(/*! ./md011 */ "../lib/md011.js"), __webpack_require__(/*! ./md012 */ "../lib/md012.js"), __webpack_require__(/*! ./md013 */ "../lib/md013.js"), __webpack_require__(/*! ./md014 */ "../lib/md014.js"), __webpack_require__(/*! ./md018 */ "../lib/md018.js"), __webpack_require__(/*! ./md019 */ "../lib/md019.js"), __webpack_require__(/*! ./md020 */ "../lib/md020.js"), __webpack_require__(/*! ./md021 */ "../lib/md021.js"), __webpack_require__(/*! ./md022 */ "../lib/md022.js"), __webpack_require__(/*! ./md023 */ "../lib/md023.js"), __webpack_require__(/*! ./md024 */ "../lib/md024.js"), __webpack_require__(/*! ./md025 */ "../lib/md025.js"), __webpack_require__(/*! ./md026 */ "../lib/md026.js"), __webpack_require__(/*! ./md027 */ "../lib/md027.js"), __webpack_require__(/*! ./md028 */ "../lib/md028.js"), __webpack_require__(/*! ./md029 */ "../lib/md029.js"), __webpack_require__(/*! ./md030 */ "../lib/md030.js"), __webpack_require__(/*! ./md031 */ "../lib/md031.js"), __webpack_require__(/*! ./md032 */ "../lib/md032.js"), __webpack_require__(/*! ./md033 */ "../lib/md033.js"), __webpack_require__(/*! ./md034 */ "../lib/md034.js"), __webpack_require__(/*! ./md035 */ "../lib/md035.js"), __webpack_require__(/*! ./md036 */ "../lib/md036.js"), __webpack_require__(/*! ./md037 */ "../lib/md037.js"), __webpack_require__(/*! ./md038 */ "../lib/md038.js"), __webpack_require__(/*! ./md039 */ "../lib/md039.js"), __webpack_require__(/*! ./md040 */ "../lib/md040.js"), __webpack_require__(/*! ./md041 */ "../lib/md041.js"), __webpack_require__(/*! ./md042 */ "../lib/md042.js"), __webpack_require__(/*! ./md043 */ "../lib/md043.js"), __webpack_require__(/*! ./md044 */ "../lib/md044.js"), __webpack_require__(/*! ./md045 */ "../lib/md045.js"), __webpack_require__(/*! ./md046 */ "../lib/md046.js"), __webpack_require__(/*! ./md047 */ "../lib/md047.js"), __webpack_require__(/*! ./md048 */ "../lib/md048.js")].concat(_toConsumableArray(__webpack_require__(/*! ./md049-md050 */ "../lib/md049-md050.js")), [__webpack_require__(/*! ./md051 */ "../lib/md051.js"), __webpack_require__(/*! ./md052 */ "../lib/md052.js"), __webpack_require__(/*! ./md053 */ "../lib/md053.js"), __webpack_require__(/*! ./md054 */ "../lib/md054.js") +var rules = [__webpack_require__(/*! ./md001 */ "../lib/md001.js"), __webpack_require__(/*! ./md003 */ "../lib/md003.js"), __webpack_require__(/*! ./md004 */ "../lib/md004.js"), __webpack_require__(/*! ./md005 */ "../lib/md005.js"), __webpack_require__(/*! ./md007 */ "../lib/md007.js"), __webpack_require__(/*! ./md009 */ "../lib/md009.js"), __webpack_require__(/*! ./md010 */ "../lib/md010.js"), __webpack_require__(/*! ./md011 */ "../lib/md011.js"), __webpack_require__(/*! ./md012 */ "../lib/md012.js"), __webpack_require__(/*! ./md013 */ "../lib/md013.js"), __webpack_require__(/*! ./md014 */ "../lib/md014.js"), __webpack_require__(/*! ./md018 */ "../lib/md018.js"), __webpack_require__(/*! ./md019 */ "../lib/md019.js"), __webpack_require__(/*! ./md020 */ "../lib/md020.js"), __webpack_require__(/*! ./md021 */ "../lib/md021.js"), __webpack_require__(/*! ./md022 */ "../lib/md022.js"), __webpack_require__(/*! ./md023 */ "../lib/md023.js"), __webpack_require__(/*! ./md024 */ "../lib/md024.js"), __webpack_require__(/*! ./md025 */ "../lib/md025.js"), __webpack_require__(/*! ./md026 */ "../lib/md026.js"), __webpack_require__(/*! ./md027 */ "../lib/md027.js"), __webpack_require__(/*! ./md028 */ "../lib/md028.js"), __webpack_require__(/*! ./md029 */ "../lib/md029.js"), __webpack_require__(/*! ./md030 */ "../lib/md030.js"), __webpack_require__(/*! ./md031 */ "../lib/md031.js"), __webpack_require__(/*! ./md032 */ "../lib/md032.js"), __webpack_require__(/*! ./md033 */ "../lib/md033.js"), __webpack_require__(/*! ./md034 */ "../lib/md034.js"), __webpack_require__(/*! ./md035 */ "../lib/md035.js"), __webpack_require__(/*! ./md036 */ "../lib/md036.js"), __webpack_require__(/*! ./md037 */ "../lib/md037.js"), __webpack_require__(/*! ./md038 */ "../lib/md038.js"), __webpack_require__(/*! ./md039 */ "../lib/md039.js"), __webpack_require__(/*! ./md040 */ "../lib/md040.js"), __webpack_require__(/*! ./md041 */ "../lib/md041.js"), __webpack_require__(/*! ./md042 */ "../lib/md042.js"), __webpack_require__(/*! ./md043 */ "../lib/md043.js"), __webpack_require__(/*! ./md044 */ "../lib/md044.js"), __webpack_require__(/*! ./md045 */ "../lib/md045.js"), __webpack_require__(/*! ./md046 */ "../lib/md046.js"), __webpack_require__(/*! ./md047 */ "../lib/md047.js"), __webpack_require__(/*! ./md048 */ "../lib/md048.js")].concat(_toConsumableArray(__webpack_require__(/*! ./md049-md050 */ "../lib/md049-md050.js")), [__webpack_require__(/*! ./md051 */ "../lib/md051.js"), __webpack_require__(/*! ./md052 */ "../lib/md052.js"), __webpack_require__(/*! ./md053 */ "../lib/md053.js"), __webpack_require__(/*! ./md054 */ "../lib/md054.js") // md055: See https://github.com/markdownlint/markdownlint // md056: See https://github.com/markdownlint/markdownlint // md057: See https://github.com/markdownlint/markdownlint diff --git a/doc-build/heading.md b/doc-build/heading.md index 0581c8b7..384d491a 100644 --- a/doc-build/heading.md +++ b/doc-build/heading.md @@ -2,5 +2,4 @@ This document contains a description of all rules, what they are checking for, as well as examples of documents that break the rule and corrected -versions of the examples. Any rule whose heading is ~~struck through~~ is -deprecated, but still provided for backward-compatibility. +versions of the examples. diff --git a/doc-build/md002.md b/doc-build/md002.md deleted file mode 100644 index c3d6fb24..00000000 --- a/doc-build/md002.md +++ /dev/null @@ -1,25 +0,0 @@ -> Note: *MD002 has been deprecated and is disabled by default.* -> [MD041/first-line-heading](md041.md) offers an improved implementation. - -This rule is intended to ensure document headings start at the top level and -is triggered when the first heading in the document isn't an h1 heading: - -```markdown -## This isn't an H1 heading - -### Another heading -``` - -The first heading in the document should be an h1 heading: - -```markdown -# Start with an H1 heading - -## Then use an H2 for subsections -``` - -Note: The `level` parameter can be used to change the top-level (ex: to h2) in -cases where an h1 is added externally. - -Rationale: The top-level heading often acts as the title of a document. More -information: . diff --git a/doc-build/md006.md b/doc-build/md006.md deleted file mode 100644 index d6ef6c0f..00000000 --- a/doc-build/md006.md +++ /dev/null @@ -1,36 +0,0 @@ -This rule is triggered when top-level lists don't start at the beginning of a -line: - -```markdown -Some text - - * List item - * List item -``` - -To fix, ensure that top-level list items are not indented: - -```markdown -Some test - -* List item -* List item -``` - -Note: This rule is triggered for the following scenario because the unordered -sublist is not recognized as such by the parser. Not being nested 3 characters -as required by the outer ordered list, it creates a top-level unordered list -instead. - -```markdown -1. List item - - List item - - List item -1. List item -``` - -Rationale: Starting lists at the beginning of the line means that nested list -items can all be indented by the same amount when an editor's indent function -or the tab key is used to indent. Starting a list 1 space in means that the -indent of the first nested list is less than the indent of the second level (3 -characters if you use 4 space tabs, or 1 character if you use 2 space tabs). diff --git a/doc-build/md007.md b/doc-build/md007.md index add5a93e..7e1cb208 100644 --- a/doc-build/md007.md +++ b/doc-build/md007.md @@ -20,10 +20,9 @@ unordered (otherwise, extra indentation of ordered lists interferes with the rule). The `start_indented` parameter allows the first level of lists to be indented by -the configured number of spaces rather than starting at zero (the inverse of -MD006). The `start_indent` parameter allows the first level of lists to be -indented by a different number of spaces than the rest (ignored when -`start_indented` is not set). +the configured number of spaces rather than starting at zero. The `start_indent` +parameter allows the first level of lists to be indented by a different number +of spaces than the rest (ignored when `start_indented` is not set). Rationale: Indenting by 2 spaces allows the content of a nested list to be in line with the start of the content of the parent list when a single space is diff --git a/doc/Rules.md b/doc/Rules.md index 6432d698..5b75acb1 100644 --- a/doc/Rules.md +++ b/doc/Rules.md @@ -2,8 +2,7 @@ This document contains a description of all rules, what they are checking for, as well as examples of documents that break the rule and corrected -versions of the examples. Any rule whose heading is ~~struck through~~ is -deprecated, but still provided for backward-compatibility. +versions of the examples. @@ -45,46 +44,6 @@ Rationale: Headings represent the structure of a document and can be confusing when skipped - especially for accessibility scenarios. More information: . - - -## ~~`MD002` - First heading should be a top-level heading~~ - -> This rule is deprecated and provided for backward-compatibility - -Tags: `headers`, `headings` - -Aliases: `first-header-h1`, `first-heading-h1` - -Parameters: - -- `level`: Heading level (`integer`, default `1`) - -> Note: *MD002 has been deprecated and is disabled by default.* -> [MD041/first-line-heading](md041.md) offers an improved implementation. - -This rule is intended to ensure document headings start at the top level and -is triggered when the first heading in the document isn't an h1 heading: - -```markdown -## This isn't an H1 heading - -### Another heading -``` - -The first heading in the document should be an h1 heading: - -```markdown -# Start with an H1 heading - -## Then use an H2 for subsections -``` - -Note: The `level` parameter can be used to change the top-level (ex: to h2) in -cases where an h1 is added externally. - -Rationale: The top-level heading often acts as the title of a document. More -information: . - ## `MD003` - Heading style @@ -255,55 +214,6 @@ the same ending column: Rationale: Violations of this rule can lead to improperly rendered content. - - -## ~~`MD006` - Consider starting bulleted lists at the beginning of the line~~ - -> This rule is deprecated and provided for backward-compatibility - -Tags: `bullet`, `indentation`, `ul` - -Aliases: `ul-start-left` - -Fixable: Some violations can be fixed by tooling - -This rule is triggered when top-level lists don't start at the beginning of a -line: - -```markdown -Some text - - * List item - * List item -``` - -To fix, ensure that top-level list items are not indented: - -```markdown -Some test - -* List item -* List item -``` - -Note: This rule is triggered for the following scenario because the unordered -sublist is not recognized as such by the parser. Not being nested 3 characters -as required by the outer ordered list, it creates a top-level unordered list -instead. - -```markdown -1. List item - - List item - - List item -1. List item -``` - -Rationale: Starting lists at the beginning of the line means that nested list -items can all be indented by the same amount when an editor's indent function -or the tab key is used to indent. Starting a list 1 space in means that the -indent of the first nested list is less than the indent of the second level (3 -characters if you use 4 space tabs, or 1 character if you use 2 space tabs). - ## `MD007` - Unordered list indentation @@ -344,10 +254,9 @@ unordered (otherwise, extra indentation of ordered lists interferes with the rule). The `start_indented` parameter allows the first level of lists to be indented by -the configured number of spaces rather than starting at zero (the inverse of -MD006). The `start_indent` parameter allows the first level of lists to be -indented by a different number of spaces than the rest (ignored when -`start_indented` is not set). +the configured number of spaces rather than starting at zero. The `start_indent` +parameter allows the first level of lists to be indented by a different number +of spaces than the rest (ignored when `start_indented` is not set). Rationale: Indenting by 2 spaces allows the content of a nested list to be in line with the start of the content of the parent list when a single space is diff --git a/doc/md002.md b/doc/md002.md deleted file mode 100644 index 2de5e6b5..00000000 --- a/doc/md002.md +++ /dev/null @@ -1,37 +0,0 @@ -# ~~`MD002` - First heading should be a top-level heading~~ - -> This rule is deprecated and provided for backward-compatibility - -Tags: `headers`, `headings` - -Aliases: `first-header-h1`, `first-heading-h1` - -Parameters: - -- `level`: Heading level (`integer`, default `1`) - -> Note: *MD002 has been deprecated and is disabled by default.* -> [MD041/first-line-heading](md041.md) offers an improved implementation. - -This rule is intended to ensure document headings start at the top level and -is triggered when the first heading in the document isn't an h1 heading: - -```markdown -## This isn't an H1 heading - -### Another heading -``` - -The first heading in the document should be an h1 heading: - -```markdown -# Start with an H1 heading - -## Then use an H2 for subsections -``` - -Note: The `level` parameter can be used to change the top-level (ex: to h2) in -cases where an h1 is added externally. - -Rationale: The top-level heading often acts as the title of a document. More -information: . diff --git a/doc/md006.md b/doc/md006.md deleted file mode 100644 index 5549ac60..00000000 --- a/doc/md006.md +++ /dev/null @@ -1,46 +0,0 @@ -# ~~`MD006` - Consider starting bulleted lists at the beginning of the line~~ - -> This rule is deprecated and provided for backward-compatibility - -Tags: `bullet`, `indentation`, `ul` - -Aliases: `ul-start-left` - -Fixable: Some violations can be fixed by tooling - -This rule is triggered when top-level lists don't start at the beginning of a -line: - -```markdown -Some text - - * List item - * List item -``` - -To fix, ensure that top-level list items are not indented: - -```markdown -Some test - -* List item -* List item -``` - -Note: This rule is triggered for the following scenario because the unordered -sublist is not recognized as such by the parser. Not being nested 3 characters -as required by the outer ordered list, it creates a top-level unordered list -instead. - -```markdown -1. List item - - List item - - List item -1. List item -``` - -Rationale: Starting lists at the beginning of the line means that nested list -items can all be indented by the same amount when an editor's indent function -or the tab key is used to indent. Starting a list 1 space in means that the -indent of the first nested list is less than the indent of the second level (3 -characters if you use 4 space tabs, or 1 character if you use 2 space tabs). diff --git a/doc/md007.md b/doc/md007.md index aca52080..7dd7ed71 100644 --- a/doc/md007.md +++ b/doc/md007.md @@ -36,10 +36,9 @@ unordered (otherwise, extra indentation of ordered lists interferes with the rule). The `start_indented` parameter allows the first level of lists to be indented by -the configured number of spaces rather than starting at zero (the inverse of -MD006). The `start_indent` parameter allows the first level of lists to be -indented by a different number of spaces than the rest (ignored when -`start_indented` is not set). +the configured number of spaces rather than starting at zero. The `start_indent` +parameter allows the first level of lists to be indented by a different number +of spaces than the rest (ignored when `start_indented` is not set). Rationale: Indenting by 2 spaces allows the content of a nested list to be in line with the start of the content of the parent list when a single space is diff --git a/lib/configuration.d.ts b/lib/configuration.d.ts index 8c55c7c4..9427e9bc 100644 --- a/lib/configuration.d.ts +++ b/lib/configuration.d.ts @@ -30,39 +30,6 @@ export interface Configuration { * MD001/heading-increment/header-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md001.md */ "header-increment"?: boolean; - /** - * MD002/first-heading-h1/first-header-h1 : First heading should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md002.md - */ - MD002?: - | boolean - | { - /** - * Heading level - */ - level?: number; - }; - /** - * MD002/first-heading-h1/first-header-h1 : First heading should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md002.md - */ - "first-heading-h1"?: - | boolean - | { - /** - * Heading level - */ - level?: number; - }; - /** - * MD002/first-heading-h1/first-header-h1 : First heading should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md002.md - */ - "first-header-h1"?: - | boolean - | { - /** - * Heading level - */ - level?: number; - }; /** * MD003/heading-style/header-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md003.md */ @@ -126,14 +93,6 @@ export interface Configuration { * MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md005.md */ "list-indent"?: boolean; - /** - * MD006/ul-start-left : Consider starting bulleted lists at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md006.md - */ - MD006?: boolean; - /** - * MD006/ul-start-left : Consider starting bulleted lists at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md006.md - */ - "ul-start-left"?: boolean; /** * MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md007.md */ @@ -1169,23 +1128,23 @@ export interface Configuration { reference?: boolean; }; /** - * headings : MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043 + * headings : MD001, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043 */ headings?: boolean; /** - * headers : MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043 + * headers : MD001, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043 */ headers?: boolean; /** - * bullet : MD004, MD005, MD006, MD007, MD032 + * bullet : MD004, MD005, MD007, MD032 */ bullet?: boolean; /** - * ul : MD004, MD005, MD006, MD007, MD030, MD032 + * ul : MD004, MD005, MD007, MD030, MD032 */ ul?: boolean; /** - * indentation : MD005, MD006, MD007, MD027 + * indentation : MD005, MD007, MD027 */ indentation?: boolean; /** diff --git a/lib/constants.js b/lib/constants.js index 946230fa..ec878b30 100644 --- a/lib/constants.js +++ b/lib/constants.js @@ -2,14 +2,13 @@ "use strict"; -module.exports.deprecatedRuleNames = [ "MD002", "MD006" ]; +module.exports.deprecatedRuleNames = []; module.exports.fixableRuleNames = [ - "MD004", "MD005", "MD006", "MD007", "MD009", "MD010", - "MD011", "MD012", "MD014", "MD018", "MD019", "MD020", - "MD021", "MD022", "MD023", "MD026", "MD027", "MD030", - "MD031", "MD032", "MD034", "MD037", "MD038", "MD039", - "MD044", "MD047", "MD049", "MD050", "MD051", "MD053", - "MD054" + "MD004", "MD005", "MD007", "MD009", "MD010", "MD011", + "MD012", "MD014", "MD018", "MD019", "MD020", "MD021", + "MD022", "MD023", "MD026", "MD027", "MD030", "MD031", + "MD032", "MD034", "MD037", "MD038", "MD039", "MD044", + "MD047", "MD049", "MD050", "MD051", "MD053", "MD054" ]; module.exports.homepage = "https://github.com/DavidAnson/markdownlint"; module.exports.version = "0.31.1"; diff --git a/lib/markdownlint.js b/lib/markdownlint.js index 03cd0f10..016ffbad 100644 --- a/lib/markdownlint.js +++ b/lib/markdownlint.js @@ -6,7 +6,7 @@ const path = require("node:path"); const { promisify } = require("node:util"); const markdownit = require("markdown-it"); const micromark = require("../helpers/micromark.cjs"); -const { deprecatedRuleNames } = require("./constants"); +// const { deprecatedRuleNames } = require("./constants"); const rules = require("./rules"); const helpers = require("../helpers"); const cache = require("./cache"); @@ -323,9 +323,9 @@ function getEffectiveConfig(ruleList, config, aliasToRuleNames) { const ruleName = rule.names[0].toUpperCase(); effectiveConfig[ruleName] = ruleDefault; } - for (const ruleName of deprecatedRuleNames) { - effectiveConfig[ruleName] = false; - } + // for (const ruleName of deprecatedRuleNames) { + // effectiveConfig[ruleName] = false; + // } for (const key of Object.keys(config)) { let value = config[key]; if (value) { diff --git a/lib/md002.js b/lib/md002.js deleted file mode 100644 index 2073058c..00000000 --- a/lib/md002.js +++ /dev/null @@ -1,22 +0,0 @@ -// @ts-check - -"use strict"; - -const { addErrorDetailIf } = require("../helpers"); - -module.exports = { - "names": [ "MD002", "first-heading-h1", "first-header-h1" ], - "description": "First heading should be a top-level heading", - "tags": [ "headings", "headers" ], - "function": function MD002(params, onError) { - const level = Number(params.config.level || 1); - const tag = "h" + level; - params.parsers.markdownit.tokens.every(function forToken(token) { - if (token.type === "heading_open") { - addErrorDetailIf(onError, token.lineNumber, tag, token.tag); - return false; - } - return true; - }); - } -}; diff --git a/lib/md006.js b/lib/md006.js deleted file mode 100644 index 8bff486a..00000000 --- a/lib/md006.js +++ /dev/null @@ -1,34 +0,0 @@ -// @ts-check - -"use strict"; - -const { addErrorDetailIf, listItemMarkerRe, rangeFromRegExp } = - require("../helpers"); -const { flattenedLists } = require("./cache"); - -module.exports = { - "names": [ "MD006", "ul-start-left" ], - "description": - "Consider starting bulleted lists at the beginning of the line", - "tags": [ "bullet", "ul", "indentation" ], - "function": function MD006(params, onError) { - for (const list of flattenedLists()) { - if (list.unordered && !list.nesting && (list.indent !== 0)) { - for (const item of list.items) { - const { lineNumber, line } = item; - addErrorDetailIf( - onError, - lineNumber, - 0, - list.indent, - null, - null, - rangeFromRegExp(line, listItemMarkerRe), - { - "deleteCount": line.length - line.trimStart().length - }); - } - } - } - } -}; diff --git a/lib/rules.js b/lib/rules.js index 3e5ffc90..eb946277 100644 --- a/lib/rules.js +++ b/lib/rules.js @@ -6,11 +6,9 @@ const { homepage, version } = require("./constants"); const rules = [ require("./md001"), - require("./md002"), require("./md003"), require("./md004"), require("./md005"), - require("./md006"), require("./md007"), require("./md009"), require("./md010"), diff --git a/schema/.markdownlint.jsonc b/schema/.markdownlint.jsonc index 495790cc..e20a7c4d 100644 --- a/schema/.markdownlint.jsonc +++ b/schema/.markdownlint.jsonc @@ -10,12 +10,6 @@ // MD001/heading-increment/header-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md001.md "MD001": true, - // MD002/first-heading-h1/first-header-h1 : First heading should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md002.md - "MD002": { - // Heading level - "level": 1 - }, - // MD003/heading-style/header-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md003.md "MD003": { // Heading style @@ -31,9 +25,6 @@ // MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md005.md "MD005": true, - // MD006/ul-start-left : Consider starting bulleted lists at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md006.md - "MD006": true, - // MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md007.md "MD007": { // Spaces for indent diff --git a/schema/.markdownlint.yaml b/schema/.markdownlint.yaml index 378e66d8..2c54d23d 100644 --- a/schema/.markdownlint.yaml +++ b/schema/.markdownlint.yaml @@ -9,11 +9,6 @@ extends: null # MD001/heading-increment/header-increment : Heading levels should only increment by one level at a time : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md001.md MD001: true -# MD002/first-heading-h1/first-header-h1 : First heading should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md002.md -MD002: - # Heading level - level: 1 - # MD003/heading-style/header-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md003.md MD003: # Heading style @@ -27,9 +22,6 @@ MD004: # MD005/list-indent : Inconsistent indentation for list items at the same level : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md005.md MD005: true -# MD006/ul-start-left : Consider starting bulleted lists at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md006.md -MD006: true - # MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md007.md MD007: # Spaces for indent diff --git a/schema/build-config-schema.js b/schema/build-config-schema.js index 94ee789c..972eacb4 100644 --- a/schema/build-config-schema.js +++ b/schema/build-config-schema.js @@ -58,17 +58,6 @@ for (const rule of rules) { }; let custom = true; switch (rule.names[0]) { - case "MD002": - scheme.properties = { - "level": { - "description": "Heading level", - "type": "integer", - "minimum": 1, - "maximum": 6, - "default": 1 - } - }; - break; case "MD003": scheme.properties = { "style": { diff --git a/schema/markdownlint-config-schema.json b/schema/markdownlint-config-schema.json index 85bf845d..ea72bea7 100644 --- a/schema/markdownlint-config-schema.json +++ b/schema/markdownlint-config-schema.json @@ -36,60 +36,6 @@ "type": "boolean", "default": true }, - "MD002": { - "description": "MD002/first-heading-h1/first-header-h1 : First heading should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md002.md", - "type": [ - "boolean", - "object" - ], - "default": true, - "properties": { - "level": { - "description": "Heading level", - "type": "integer", - "minimum": 1, - "maximum": 6, - "default": 1 - } - }, - "additionalProperties": false - }, - "first-heading-h1": { - "description": "MD002/first-heading-h1/first-header-h1 : First heading should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md002.md", - "type": [ - "boolean", - "object" - ], - "default": true, - "properties": { - "level": { - "description": "Heading level", - "type": "integer", - "minimum": 1, - "maximum": 6, - "default": 1 - } - }, - "additionalProperties": false - }, - "first-header-h1": { - "description": "MD002/first-heading-h1/first-header-h1 : First heading should be a top-level heading : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md002.md", - "type": [ - "boolean", - "object" - ], - "default": true, - "properties": { - "level": { - "description": "Heading level", - "type": "integer", - "minimum": 1, - "maximum": 6, - "default": 1 - } - }, - "additionalProperties": false - }, "MD003": { "description": "MD003/heading-style/header-style : Heading style : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md003.md", "type": [ @@ -218,16 +164,6 @@ "type": "boolean", "default": true }, - "MD006": { - "description": "MD006/ul-start-left : Consider starting bulleted lists at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md006.md", - "type": "boolean", - "default": true - }, - "ul-start-left": { - "description": "MD006/ul-start-left : Consider starting bulleted lists at the beginning of the line : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md006.md", - "type": "boolean", - "default": true - }, "MD007": { "description": "MD007/ul-indent : Unordered list indentation : https://github.com/DavidAnson/markdownlint/blob/v0.31.1/doc/md007.md", "type": [ @@ -1840,27 +1776,27 @@ "additionalProperties": false }, "headings": { - "description": "headings : MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043", + "description": "headings : MD001, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043", "type": "boolean", "default": true }, "headers": { - "description": "headers : MD001, MD002, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043", + "description": "headers : MD001, MD003, MD018, MD019, MD020, MD021, MD022, MD023, MD024, MD025, MD026, MD036, MD041, MD043", "type": "boolean", "default": true }, "bullet": { - "description": "bullet : MD004, MD005, MD006, MD007, MD032", + "description": "bullet : MD004, MD005, MD007, MD032", "type": "boolean", "default": true }, "ul": { - "description": "ul : MD004, MD005, MD006, MD007, MD030, MD032", + "description": "ul : MD004, MD005, MD007, MD030, MD032", "type": "boolean", "default": true }, "indentation": { - "description": "indentation : MD005, MD006, MD007, MD027", + "description": "indentation : MD005, MD007, MD027", "type": "boolean", "default": true }, diff --git a/style/relaxed.json b/style/relaxed.json index 590d9193..1070b598 100644 --- a/style/relaxed.json +++ b/style/relaxed.json @@ -4,7 +4,6 @@ "default": true, "whitespace": false, "line_length": false, - "ul-start-left": false, "ul-indent": false, "no-inline-html": false, "no-bare-urls": false, diff --git a/test/MD001-MD010.md b/test/MD001-MD010.md index ae7870e8..d9d90a86 100644 --- a/test/MD001-MD010.md +++ b/test/MD001-MD010.md @@ -1,4 +1,4 @@ -## One {MD002} +## One #### Two {MD001} @@ -9,8 +9,8 @@ - Charlie {MD004} - * Delta {MD006} {MD007} - * Echo {MD006} {MD007} + * Delta {MD007} + * Echo {MD007} Text {MD009} @@ -30,7 +30,5 @@ Text text {MD010} 12. Twelve diff --git a/test/alternate_top_level_heading.md b/test/alternate_top_level_heading.md index 3340b9b8..cc4e755d 100644 --- a/test/alternate_top_level_heading.md +++ b/test/alternate_top_level_heading.md @@ -3,9 +3,6 @@ ## Another one {MD025} diff --git a/test/atx_heading_spacing.md b/test/atx_heading_spacing.md index 8f5a1e62..cbf2aa23 100644 --- a/test/atx_heading_spacing.md +++ b/test/atx_heading_spacing.md @@ -5,6 +5,5 @@ ## Heading 3 {MD019} diff --git a/test/break-all-the-rules.md b/test/break-all-the-rules.md index 5167ce93..426b27a6 100644 --- a/test/break-all-the-rules.md +++ b/test/break-all-the-rules.md @@ -1,11 +1,11 @@ -## Heading 1 {MD002:1} {MD041:1} +## Heading 1 {MD041:1} #### Heading 2 {MD001:3} # Heading 3 {MD003} {MD043} # * list {MD032} - + list {MD004} {MD006} {MD007} {MD030} {MD032} + + list {MD004} {MD007} {MD030} {MD032} * list * list {MD007} @@ -35,7 +35,7 @@ long line long line long line long line long line long line long line long line # Heading 8 {MD024:35} -Note: Can not break MD025 and MD002 in the same file +Note: Can not break MD025 and MD041 in the same file # Heading 9 {MD023} {MD026}. @@ -106,11 +106,9 @@ Strong **with** different style {MD050} [url]: https://example.com/page + * Item {MD007} diff --git a/test/front-matter-title-h2.md b/test/front-matter-title-h2.md index 52417d8a..77342498 100644 --- a/test/front-matter-title-h2.md +++ b/test/front-matter-title-h2.md @@ -9,8 +9,5 @@ categories: jekyll update Front matter from [Jekyll documentation](https://jekyllrb.com/docs/posts/#a-typical-post). diff --git a/test/list-indentation-start-indented-indent.md b/test/list-indentation-start-indented-indent.md index d00e9814..17e5c6cd 100644 --- a/test/list-indentation-start-indented-indent.md +++ b/test/list-indentation-start-indented-indent.md @@ -39,7 +39,6 @@ * item 3 {MD007} + - item 3 {MD007} diff --git a/test/lists-with-nesting.md b/test/lists-with-nesting.md index 5e1f0967..7ccc0154 100644 --- a/test/lists-with-nesting.md +++ b/test/lists-with-nesting.md @@ -19,7 +19,7 @@ - three {MD032} 1. one {MD032} - - two {MD006} {MD007} {MD032} + - two {MD007} {MD032} 1. three {MD032} ## Correct nesting, same type @@ -94,10 +94,6 @@ 1. seven - eight - * 1. Item {MD004} {MD006} {MD007} - * 2. Item {MD004} {MD006} {MD007} - * 3. Item {MD004} {MD006} {MD007} - - + * 1. Item {MD004} {MD007} + * 2. Item {MD004} {MD007} + * 3. Item {MD004} {MD007} diff --git a/test/markdownlint-test-config.js b/test/markdownlint-test-config.js index 2646ab58..123f165f 100644 --- a/test/markdownlint-test-config.js +++ b/test/markdownlint-test-config.js @@ -90,7 +90,7 @@ test("configCustomFileSystem", (t) => new Promise((resolve) => { }; const extendedContent = { "MD001": true, - "MD002": true + "MD041": true }; const fsApi = { "access": (p, m, cb) => { @@ -403,7 +403,7 @@ test("configCustomFileSystemSync", (t) => { }; const extendedContent = { "MD001": true, - "MD002": true + "MD041": true }; const fsApi = { "accessSync": (p) => { @@ -465,7 +465,7 @@ test("configCustomFileSystemPromise", (t) => new Promise((resolve) => { }; const extendedContent = { "MD001": true, - "MD002": true + "MD041": true }; const fsApi = { "access": (p, m, cb) => { @@ -534,7 +534,7 @@ test("extendCustomFileSystemPromise", (t) => new Promise((resolve) => { }; const extendedContent = { "MD001": true, - "MD002": true + "MD041": true }; const fsApi = { "access": (p, m, cb) => { diff --git a/test/markdownlint-test-result-object.js b/test/markdownlint-test-result-object.js index af319884..2192faf2 100644 --- a/test/markdownlint-test-result-object.js +++ b/test/markdownlint-test-result-object.js @@ -33,8 +33,7 @@ test("resultFormattingV0", (t) => new Promise((resolve) => { "./test/first_heading_bad_atx.md" ], "config": { - "MD002": true, - "MD041": false + "MD041": true }, "noInlineConfig": true, "resultVersion": 0 @@ -43,43 +42,44 @@ test("resultFormattingV0", (t) => new Promise((resolve) => { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { - "MD002": [ 3 ], "MD018": [ 1 ], - "MD019": [ 3, 5 ] + "MD019": [ 3, 5 ], + "MD041": [ 1 ] }, "./test/first_heading_bad_atx.md": { - "MD002": [ 1 ] + "MD041": [ 1 ] } }; // @ts-ignore t.deepEqual(actualResult, expectedResult, "Undetected issues."); + // @ts-ignore let actualMessage = actualResult.toString(); let expectedMessage = - "./test/atx_heading_spacing.md: 3: MD002" + - " First heading should be a top-level heading\n" + "./test/atx_heading_spacing.md: 1: MD018" + " No space after hash on atx style heading\n" + "./test/atx_heading_spacing.md: 3: MD019" + " Multiple spaces after hash on atx style heading\n" + "./test/atx_heading_spacing.md: 5: MD019" + " Multiple spaces after hash on atx style heading\n" + - "./test/first_heading_bad_atx.md: 1: MD002" + - " First heading should be a top-level heading"; - t.is(actualMessage, expectedMessage, "Incorrect message (name)."); + "./test/atx_heading_spacing.md: 1: MD041" + + " First line in a file should be a top-level heading\n" + + "./test/first_heading_bad_atx.md: 1: MD041" + + " First line in a file should be a top-level heading" + t.is(actualMessage, expectedMessage, "Incorrect message (name)."); // @ts-ignore actualMessage = actualResult.toString(true); expectedMessage = - "./test/atx_heading_spacing.md: 3: first-heading-h1" + - " First heading should be a top-level heading\n" + "./test/atx_heading_spacing.md: 1: no-missing-space-atx" + " No space after hash on atx style heading\n" + "./test/atx_heading_spacing.md: 3: no-multiple-space-atx" + " Multiple spaces after hash on atx style heading\n" + "./test/atx_heading_spacing.md: 5: no-multiple-space-atx" + " Multiple spaces after hash on atx style heading\n" + - "./test/first_heading_bad_atx.md: 1: first-heading-h1" + - " First heading should be a top-level heading"; - t.is(actualMessage, expectedMessage, "Incorrect message (alias)."); + "./test/atx_heading_spacing.md: 1: first-line-heading" + + " First line in a file should be a top-level heading\n" + + "./test/first_heading_bad_atx.md: 1: first-line-heading" + + " First line in a file should be a top-level heading" + t.is(actualMessage, expectedMessage, "Incorrect message (alias)."); resolve(); }); })); @@ -92,8 +92,7 @@ test("resultFormattingSyncV0", (t) => { "./test/first_heading_bad_atx.md" ], "config": { - "MD002": true, - "MD041": false + "MD041": true }, "noInlineConfig": true, "resultVersion": 0 @@ -101,42 +100,42 @@ test("resultFormattingSyncV0", (t) => { const actualResult = markdownlint.sync(options); const expectedResult = { "./test/atx_heading_spacing.md": { - "MD002": [ 3 ], "MD018": [ 1 ], - "MD019": [ 3, 5 ] + "MD019": [ 3, 5 ], + "MD041": [ 1 ] }, "./test/first_heading_bad_atx.md": { - "MD002": [ 1 ] + "MD041": [ 1 ] } }; // @ts-ignore t.deepEqual(actualResult, expectedResult, "Undetected issues."); let actualMessage = actualResult.toString(); let expectedMessage = - "./test/atx_heading_spacing.md: 3: MD002" + - " First heading should be a top-level heading\n" + "./test/atx_heading_spacing.md: 1: MD018" + " No space after hash on atx style heading\n" + "./test/atx_heading_spacing.md: 3: MD019" + " Multiple spaces after hash on atx style heading\n" + "./test/atx_heading_spacing.md: 5: MD019" + " Multiple spaces after hash on atx style heading\n" + - "./test/first_heading_bad_atx.md: 1: MD002" + - " First heading should be a top-level heading"; + "./test/atx_heading_spacing.md: 1: MD041" + + " First line in a file should be a top-level heading\n" + + "./test/first_heading_bad_atx.md: 1: MD041" + + " First line in a file should be a top-level heading" t.is(actualMessage, expectedMessage, "Incorrect message (name)."); // @ts-ignore actualMessage = actualResult.toString(true); expectedMessage = - "./test/atx_heading_spacing.md: 3: first-heading-h1" + - " First heading should be a top-level heading\n" + "./test/atx_heading_spacing.md: 1: no-missing-space-atx" + " No space after hash on atx style heading\n" + "./test/atx_heading_spacing.md: 3: no-multiple-space-atx" + " Multiple spaces after hash on atx style heading\n" + "./test/atx_heading_spacing.md: 5: no-multiple-space-atx" + " Multiple spaces after hash on atx style heading\n" + - "./test/first_heading_bad_atx.md: 1: first-heading-h1" + - " First heading should be a top-level heading"; + "./test/atx_heading_spacing.md: 1: first-line-heading" + + " First line in a file should be a top-level heading\n" + + "./test/first_heading_bad_atx.md: 1: first-line-heading" + + " First line in a file should be a top-level heading" t.is(actualMessage, expectedMessage, "Incorrect message (alias)."); }); @@ -152,8 +151,7 @@ test("resultFormattingV1", (t) => new Promise((resolve) => { "./test/first_heading_bad_atx.md" ], "config": { - "MD002": true, - "MD041": false + "MD041": true }, "noInlineConfig": true, "resultVersion": 1 @@ -173,14 +171,6 @@ test("resultFormattingV1", (t) => new Promise((resolve) => { "errorRange": [ 1, 4 ] } ], "./test/atx_heading_spacing.md": [ - { "lineNumber": 3, - "ruleName": "MD002", - "ruleAlias": "first-heading-h1", - "ruleDescription": "First heading should be a top-level heading", - "ruleInformation": `${homepage}/blob/v${version}/doc/md002.md`, - "errorDetail": "Expected: h1; Actual: h2", - "errorContext": null, - "errorRange": null }, { "lineNumber": 1, "ruleName": "MD018", "ruleAlias": "no-missing-space-atx", @@ -204,26 +194,32 @@ test("resultFormattingV1", (t) => new Promise((resolve) => { "ruleInformation": `${homepage}/blob/v${version}/doc/md019.md`, "errorDetail": null, "errorContext": "## Heading 3 {MD019}", - "errorRange": [ 1, 6 ] } + "errorRange": [ 1, 6 ] }, + { "lineNumber": 1, + "ruleName": "MD041", + "ruleAlias": "first-line-heading", + "ruleDescription": "First line in a file should be a top-level heading", + "ruleInformation": `${homepage}/blob/v${version}/doc/md041.md`, + "errorDetail": null, + "errorContext": "#Heading 1 {MD018}", + "errorRange": null } ], "./test/first_heading_bad_atx.md": [ { "lineNumber": 1, - "ruleName": "MD002", - "ruleAlias": "first-heading-h1", - "ruleDescription": "First heading should be a top-level heading", - "ruleInformation": `${homepage}/blob/v${version}/doc/md002.md`, - "errorDetail": "Expected: h1; Actual: h2", - "errorContext": null, + "ruleName": "MD041", + "ruleAlias": "first-line-heading", + "ruleDescription": "First line in a file should be a top-level heading", + "ruleInformation": `${homepage}/blob/v${version}/doc/md041.md`, + "errorDetail": null, + "errorContext": "## Heading", "errorRange": null } ] }; // @ts-ignore t.deepEqual(actualResult, expectedResult, "Undetected issues."); + // @ts-ignore const actualMessage = actualResult.toString(); const expectedMessage = - "./test/atx_heading_spacing.md: 3: MD002/first-heading-h1" + - " First heading should be a top-level heading" + - " [Expected: h1; Actual: h2]\n" + "./test/atx_heading_spacing.md: 1: MD018/no-missing-space-atx" + " No space after hash on atx style heading" + " [Context: \"#Heading 1 {MD018}\"]\n" + @@ -233,9 +229,12 @@ test("resultFormattingV1", (t) => new Promise((resolve) => { "./test/atx_heading_spacing.md: 5: MD019/no-multiple-space-atx" + " Multiple spaces after hash on atx style heading" + " [Context: \"## Heading 3 {MD019}\"]\n" + - "./test/first_heading_bad_atx.md: 1: MD002/first-heading-h1" + - " First heading should be a top-level heading" + - " [Expected: h1; Actual: h2]\n" + + "./test/atx_heading_spacing.md: 1: MD041/first-line-heading" + + " First line in a file should be a top-level heading" + + " [Context: \"#Heading 1 {MD018}\"]\n" + + "./test/first_heading_bad_atx.md: 1: MD041/first-line-heading" + + " First line in a file should be a top-level heading" + + " [Context: \"## Heading\"]\n" + "truncate: 1: MD021/no-multiple-space-closed-atx" + " Multiple spaces inside hashes on closed atx style heading" + " [Context: \"# Multiple spa...tyle heading #\"]"; @@ -256,8 +255,7 @@ test("resultFormattingV2", (t) => new Promise((resolve) => { "./test/first_heading_bad_atx.md" ], "config": { - "MD002": true, - "MD041": false + "MD041": true }, "noInlineConfig": true, "resultVersion": 2 @@ -276,13 +274,6 @@ test("resultFormattingV2", (t) => new Promise((resolve) => { "errorRange": [ 1, 4 ] } ], "./test/atx_heading_spacing.md": [ - { "lineNumber": 3, - "ruleNames": [ "MD002", "first-heading-h1", "first-header-h1" ], - "ruleDescription": "First heading should be a top-level heading", - "ruleInformation": `${homepage}/blob/v${version}/doc/md002.md`, - "errorDetail": "Expected: h1; Actual: h2", - "errorContext": null, - "errorRange": null }, { "lineNumber": 1, "ruleNames": [ "MD018", "no-missing-space-atx" ], "ruleDescription": "No space after hash on atx style heading", @@ -303,25 +294,29 @@ test("resultFormattingV2", (t) => new Promise((resolve) => { "ruleInformation": `${homepage}/blob/v${version}/doc/md019.md`, "errorDetail": null, "errorContext": "## Heading 3 {MD019}", - "errorRange": [ 1, 6 ] } + "errorRange": [ 1, 6 ] }, + { "lineNumber": 1, + "ruleNames": [ "MD041", "first-line-heading", "first-line-h1" ], + "ruleDescription": "First line in a file should be a top-level heading", + "ruleInformation": `${homepage}/blob/v${version}/doc/md041.md`, + "errorDetail": null, + "errorContext": "#Heading 1 {MD018}", + "errorRange": null } ], "./test/first_heading_bad_atx.md": [ { "lineNumber": 1, - "ruleNames": [ "MD002", "first-heading-h1", "first-header-h1" ], - "ruleDescription": "First heading should be a top-level heading", - "ruleInformation": `${homepage}/blob/v${version}/doc/md002.md`, - "errorDetail": "Expected: h1; Actual: h2", - "errorContext": null, + "ruleNames": [ "MD041", "first-line-heading", "first-line-h1" ], + "ruleDescription": "First line in a file should be a top-level heading", + "ruleInformation": `${homepage}/blob/v${version}/doc/md041.md`, + "errorDetail": null, + "errorContext": "## Heading", "errorRange": null } ] }; t.deepEqual(actualResult, expectedResult, "Undetected issues."); + // @ts-ignore const actualMessage = actualResult.toString(); const expectedMessage = - "./test/atx_heading_spacing.md: 3:" + - " MD002/first-heading-h1/first-header-h1" + - " First heading should be a top-level heading" + - " [Expected: h1; Actual: h2]\n" + "./test/atx_heading_spacing.md: 1: MD018/no-missing-space-atx" + " No space after hash on atx style heading" + " [Context: \"#Heading 1 {MD018}\"]\n" + @@ -331,10 +326,14 @@ test("resultFormattingV2", (t) => new Promise((resolve) => { "./test/atx_heading_spacing.md: 5: MD019/no-multiple-space-atx" + " Multiple spaces after hash on atx style heading" + " [Context: \"## Heading 3 {MD019}\"]\n" + + "./test/atx_heading_spacing.md: 1:" + + " MD041/first-line-heading/first-line-h1" + + " First line in a file should be a top-level heading" + + " [Context: \"#Heading 1 {MD018}\"]\n" + "./test/first_heading_bad_atx.md: 1:" + - " MD002/first-heading-h1/first-header-h1" + - " First heading should be a top-level heading" + - " [Expected: h1; Actual: h2]\n" + + " MD041/first-line-heading/first-line-h1" + + " First line in a file should be a top-level heading" + + " [Context: \"## Heading\"]\n" + "truncate: 1: MD021/no-multiple-space-closed-atx" + " Multiple spaces inside hashes on closed atx style heading" + " [Context: \"# Multiple spa...tyle heading #\"]"; @@ -442,6 +441,7 @@ test("resultFormattingV3", (t) => new Promise((resolve) => { ] }; t.deepEqual(actualResult, expectedResult, "Undetected issues."); + // @ts-ignore const actualMessage = actualResult.toString(); const expectedMessage = "input: 1: MD009/no-trailing-spaces" + diff --git a/test/markdownlint-test.js b/test/markdownlint-test.js index f34c373e..866e6f1a 100644 --- a/test/markdownlint-test.js +++ b/test/markdownlint-test.js @@ -82,11 +82,12 @@ test("projectFiles", (t) => { "schema/*.md" ])) .then((files) => { - t.is(files.length, 59); + t.is(files.length, 57); const options = { files, "config": require("../.markdownlint.json") }; + // @ts-ignore return markdownlint.promises.markdownlint(options).then((actual) => { const expected = {}; for (const file of files) { @@ -270,7 +271,7 @@ test("enableRules", (t) => new Promise((resolve) => { "./test/first_heading_bad_atx.md" ], "config": { - "MD002": true, + "MD041": true, "default": false, "no-multiple-space-atx": true }, @@ -281,11 +282,11 @@ test("enableRules", (t) => new Promise((resolve) => { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { - "MD002": [ 3 ], - "MD019": [ 3, 5 ] + "MD019": [ 3, 5 ], + "MD041": [ 1 ] }, "./test/first_heading_bad_atx.md": { - "MD002": [ 1 ] + "MD041": [ 1 ] } }; // @ts-ignore @@ -302,7 +303,7 @@ test("enableRulesMixedCase", (t) => new Promise((resolve) => { "./test/first_heading_bad_atx.md" ], "config": { - "Md002": true, + "Md041": true, "DeFaUlT": false, "nO-mUlTiPlE-sPaCe-AtX": true }, @@ -313,11 +314,11 @@ test("enableRulesMixedCase", (t) => new Promise((resolve) => { t.falsy(err); const expectedResult = { "./test/atx_heading_spacing.md": { - "MD002": [ 3 ], - "MD019": [ 3, 5 ] + "MD019": [ 3, 5 ], + "MD041": [ 1 ] }, "./test/first_heading_bad_atx.md": { - "MD002": [ 1 ] + "MD041": [ 1 ] } }; // @ts-ignore @@ -474,7 +475,7 @@ test("styleAll", (t) => new Promise((resolve) => { "MD042": [ 81 ], "MD045": [ 85 ], "MD046": [ 49, 73, 77 ], - "MD047": [ 128 ], + "MD047": [ 126 ], "MD048": [ 77 ], "MD049": [ 90 ], "MD050": [ 94 ], @@ -523,7 +524,7 @@ test("styleRelaxed", (t) => new Promise((resolve) => { "MD042": [ 81 ], "MD045": [ 85 ], "MD046": [ 49, 73, 77 ], - "MD047": [ 128 ], + "MD047": [ 126 ], "MD048": [ 77 ], "MD049": [ 90 ], "MD050": [ 94 ], @@ -839,7 +840,7 @@ test("customFileSystemAsync", (t) => new Promise((resolve) => { })); test("readme", async(t) => { - t.plan(126); + t.plan(122); const tagToRules = {}; for (const rule of rules) { for (const tag of rule.tags) { @@ -914,7 +915,7 @@ test("readme", async(t) => { }); test("validateJsonUsingConfigSchemaStrict", async(t) => { - t.plan(168); + t.plan(165); const { addSchema, validate } = await import("@hyperjump/json-schema/draft-07"); addSchema(configSchemaStrict, configSchemaStrictUri); @@ -1042,7 +1043,7 @@ test("validateConfigExampleJson", async(t) => { }); test("allBuiltInRulesHaveValidUrl", (t) => { - t.plan(150); + t.plan(144); for (const rule of rules) { // @ts-ignore t.truthy(rule.information); diff --git a/test/md041-yaml-title-and-first-line-heading.md b/test/md041-yaml-title-and-first-line-heading.md index 59318ff9..4ebe67b4 100644 --- a/test/md041-yaml-title-and-first-line-heading.md +++ b/test/md041-yaml-title-and-first-line-heading.md @@ -7,9 +7,6 @@ title: "First level heading" ## Second level heading ␊ `, @@ -2642,9 +2590,6 @@ Generated by [AVA](https://avajs.dev). ## Another one {MD025}␊ ␊ ␊ `, @@ -3129,7 +3073,6 @@ Generated by [AVA](https://avajs.dev). ## Heading 3 {MD019}␊ ␊ ␊ `, @@ -6564,20 +6507,6 @@ Generated by [AVA](https://avajs.dev). 'header-increment', ], }, - { - errorContext: null, - errorDetail: 'Expected: h1; Actual: h2', - errorRange: null, - fixInfo: null, - lineNumber: 1, - ruleDescription: 'First heading should be a top-level heading', - ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md002.md', - ruleNames: [ - 'MD002', - 'first-heading-h1', - 'first-header-h1', - ], - }, { errorContext: null, errorDetail: 'Expected: atx; Actual: atx_closed', @@ -6642,24 +6571,6 @@ Generated by [AVA](https://avajs.dev). 'list-indent', ], }, - { - errorContext: null, - errorDetail: 'Expected: 0; Actual: 1', - errorRange: [ - 1, - 4, - ], - fixInfo: { - deleteCount: 1, - }, - lineNumber: 8, - ruleDescription: 'Consider starting bulleted lists at the beginning of the line', - ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md006.md', - ruleNames: [ - 'MD006', - 'ul-start-left', - ], - }, { errorContext: null, errorDetail: 'Expected: 0; Actual: 1', @@ -7060,7 +6971,7 @@ Generated by [AVA](https://avajs.dev). ], }, { - errorContext: '+ list {MD004} {MD006} {MD007...', + errorContext: '+ list {MD004} {MD007} {MD030...', errorDetail: null, errorRange: null, fixInfo: { @@ -7227,7 +7138,7 @@ Generated by [AVA](https://avajs.dev). ], }, { - errorContext: '## Heading 1 {MD002:1} {MD041:...', + errorContext: '## Heading 1 {MD041:1}', errorDetail: null, errorRange: null, fixInfo: null, @@ -7357,7 +7268,7 @@ Generated by [AVA](https://avajs.dev). insertText: `␊ `, }, - lineNumber: 128, + lineNumber: 126, ruleDescription: 'Files should end with a single newline character', ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md047.md', ruleNames: [ @@ -7529,7 +7440,7 @@ Generated by [AVA](https://avajs.dev). ], }, ], - fixed: `## Heading 1 {MD002:1} {MD041:1}␊ + fixed: `## Heading 1 {MD041:1}␊ ␊ #### Heading 2 {MD001:3}␊ ␊ @@ -7537,7 +7448,7 @@ Generated by [AVA](https://avajs.dev). ␊ * list {MD032}␊ ␊ - * list {MD004} {MD006} {MD007} {MD030} {MD032}␊ + * list {MD004} {MD007} {MD030} {MD032}␊ ␊ * list␊ * list {MD007}␊ @@ -7566,7 +7477,7 @@ Generated by [AVA](https://avajs.dev). # Heading 8␊ ␊ {MD024:35}␊ - Note: Can not break MD025 and MD002 in the same file␊ + Note: Can not break MD025 and MD041 in the same file␊ ␊ # Heading 9 {MD023} {MD026}␊ ␊ @@ -7638,11 +7549,9 @@ Generated by [AVA](https://avajs.dev). [url]: https://example.com/page␊ ␊ ␊ + * Item {MD007}␊ `, } @@ -13470,9 +13195,6 @@ Generated by [AVA](https://avajs.dev). Front matter from [Jekyll documentation](https://jekyllrb.com/docs/posts/#a-typical-post).␊ ␊ ␊ `, @@ -28470,7 +28192,6 @@ Generated by [AVA](https://avajs.dev). * item 3 {MD007}␊ ␊ ␊ + - item 3 {MD007}␊ `, } @@ -32772,78 +32435,6 @@ Generated by [AVA](https://avajs.dev). 'ul-style', ], }, - { - errorContext: null, - errorDetail: 'Expected: 0; Actual: 2', - errorRange: [ - 1, - 4, - ], - fixInfo: { - deleteCount: 2, - }, - lineNumber: 22, - ruleDescription: 'Consider starting bulleted lists at the beginning of the line', - ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md006.md', - ruleNames: [ - 'MD006', - 'ul-start-left', - ], - }, - { - errorContext: null, - errorDetail: 'Expected: 0; Actual: 1', - errorRange: [ - 1, - 3, - ], - fixInfo: { - deleteCount: 1, - }, - lineNumber: 97, - ruleDescription: 'Consider starting bulleted lists at the beginning of the line', - ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md006.md', - ruleNames: [ - 'MD006', - 'ul-start-left', - ], - }, - { - errorContext: null, - errorDetail: 'Expected: 0; Actual: 1', - errorRange: [ - 1, - 3, - ], - fixInfo: { - deleteCount: 1, - }, - lineNumber: 98, - ruleDescription: 'Consider starting bulleted lists at the beginning of the line', - ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md006.md', - ruleNames: [ - 'MD006', - 'ul-start-left', - ], - }, - { - errorContext: null, - errorDetail: 'Expected: 0; Actual: 1', - errorRange: [ - 1, - 3, - ], - fixInfo: { - deleteCount: 1, - }, - lineNumber: 99, - ruleDescription: 'Consider starting bulleted lists at the beginning of the line', - ruleInformation: 'https://github.com/DavidAnson/markdownlint/blob/v0.0.0/doc/md006.md', - ruleNames: [ - 'MD006', - 'ul-start-left', - ], - }, { errorContext: null, errorDetail: 'Expected: 0; Actual: 2', @@ -33008,7 +32599,7 @@ Generated by [AVA](https://avajs.dev). ], }, { - errorContext: '- two {MD006} {MD007} {MD032}', + errorContext: '- two {MD007} {MD032}', errorDetail: null, errorRange: null, fixInfo: { @@ -33024,7 +32615,7 @@ Generated by [AVA](https://avajs.dev). ], }, { - errorContext: '- two {MD006} {MD007} {MD032}', + errorContext: '- two {MD007} {MD032}', errorDetail: null, errorRange: null, fixInfo: { @@ -33081,7 +32672,7 @@ Generated by [AVA](https://avajs.dev). ␊ 1. one {MD032}␊ ␊ - - two {MD006} {MD007} {MD032}␊ + - two {MD007} {MD032}␊ ␊ 1. three {MD032}␊ ␊ @@ -33157,13 +32748,9 @@ Generated by [AVA](https://avajs.dev). 1. seven␊ - eight␊ ␊ - - 1. Item {MD004} {MD006} {MD007}␊ - - 2. Item {MD004} {MD006} {MD007}␊ - - 3. Item {MD004} {MD006} {MD007}␊ - ␊ - ␊ + - 1. Item {MD004} {MD007}␊ + - 2. Item {MD004} {MD007}␊ + - 3. Item {MD004} {MD007}␊ `, } @@ -36309,9 +35896,6 @@ Generated by [AVA](https://avajs.dev). ## Second level heading␊ ␊ COskW ztC41QDLSFHrq)^;i(a5YoB#!}YzZ@BbNUjmq4I^X4kHEi0zyPic|8Ai;aQAd5n|11 zjo<;yU|lDtUGI-EfehJkYqsE1svpC;1+;(BtzoR1{9$OUb$FK?J7ShqnUsil( z@_%ipmzzWw{>({p!m^|rkck<-+vG?p{%?iZFNf)Zd$CYx2*sTe1dRK>He8$ZvC zlA<17M8=F_x?NjVM$!1lL9)xTwagOV7_zCj3_KM%XVP~m5TE{f3 z&2lrfosl|7u4r|or*BF%k7aJ?9(uZ*|10o+#IWfsL#@?Yci8Lp%miaku^k%A`d6=u z-@EJ~H|!0o^FF&|i*1hrEs(8R^D_x@CGBYo4m>HvE8alZ&3TTz1)0&G&%^rlyaSh9 z+-8b>H?Jc!JpqmUM1w3AyorgPd z+|~>w(Gdu zz)s*)dc88Z#R*_9Lg@@V5w+Y^cvx6~PcPn$^J{Cz5AfFMWdvjqTakL7R3M!j!e@*( zc%DX?0d?IT#$~yNY_H`A(*}r}$1@p3yv|`c~#_ zsj>8RZ>h!qMaTA?%v(0NqJOgYDykq(7GC_dJm&QE+u!|^<9Tx@kr#n)fA>-(eaP1{ zlpPBv0{rfOY7NzB!nsg841A)VS&{%{J-jdgvr+cV}T@SZFrv0<^dvO zG;r_2is2+!w0y8z2p^ClaPpyuIw)7>v|c~vRBt(`>!CTq5>ePtYhY(U;>H%f!N0A3 z(}kO3-h{e=5hw&Vk3WiJ*Q75F(9U!iu0jsLcYis8_$3l0SWjozlL_#kbE@oc$xvW5 zJH&BF&cKv0x$Jo3|84#OH*pC5C!#i#VkaXi07P!oeAaXrd@L|HAe7+I8j#;$x4@EZ zElY4^eCUC>Gx9U-Gp`(p{5XCCL67jFcREt$GeNTGK&499H1tYPe9aT@4ZHSeK$xc2 z<>r5{`siEGXhBYp@2NeS#K_D_t9@SNF9_~4G{ZCjxwYVMHY+jAe?_i6lf$lZ@es1$ zM1cPP-G(!5M=bK+EwyVnZt19%L$52{QLZSBMb;1;p(NK>t-dl~W0Pk=*$x=GEZ6!1 z1j(0V#(!TNH~t0-5yf1oyiwnfUJtR7k<&x_gZTbZEuf@D6(yPng%6;9hsg+%6}J_k z2=*Htwoi*%BIkz(hsnYBhX%lgeF-%H-9wEI>!%^Ux)&gg2CsmhlrVL$yTNx7qr>3C zS#9D46kaH+_@cLjOi-3F8At1mR)*I^$@{E>^CS4Y2$3^Nv zk#cDrpI5jWf7FGD*-~N>S+ig#%juU^{1W>%PSMwIlQYT@KB8)twMrwk&PRsxBZY-_ z*r#2t*S2q+DnN{Aaiw678THRbdRczC4v;sD1INQ;$`aGJ@Y zoV8|ICgf1uHx)xG1G;;QKfSB6HgN1qT_x&xi+Ja~7X@f#O3@_pVW~{QqmgQ;b$(N zljdp{)i@#5;n7@#=bc=tBSZZ^-Yl^ zb!=TMD_%|?{`=n$0p-C{*WlGycFVVMW(00{mc7|QXFTO#1y5PID`m`OE?SoPU48M- z@TGF;T;H4B$eNl<_}`jGz-t!3%9uOLWch5oRCsZMW0}h(44zUHET78w?$E5-=Tp@; z<@Ju&`F8fd+3gyG?p7(my(CS7d+AoPYgWzY__lipyF}^y^4~t)(HZ0$x4LT3_#0Y) z?){UV{Y=IlUPu;Rdm@^%nU9|cp5IdB{2V<~t38kI^Owwo+0RZE9pYxsf||>vu0+_g za&$XkA5uf*v$-MRc&z+}W#l}2>r6H-eEWQX4Z((0G`lk~vga{BC z`-7WwE(U`bqQ6OSl_-{N>#X~({9dCt+zF^(Y@&%%YEMNo0NcH8G8bu}U*Ff;vD)<-Z@02)rR z_96LwpF{0OPG-e=sv;>|mzk=puJ0g%==@BELJ$$7Io7iIx3x;r534Jpc}7*7G!z-( zF8oe^IzVe~Y?hvm7$etFrYT?d1ClbQWX(q|_n0tjQ`I~s@%CYwFj zqnN@#IkOpCvfnU4YG(66W7l-#(;3u-sJei9w|M4rLqsXXnI)^*&*mV}sLlvEVj#*s z{T2mLxkPsK|B<}^4jqLUF@b=Ib6;8;kz{qCER(2Xtgu_uvFqq4`AB-O+@I1^{;_sShQ>f7FX3p7KsJzI6aZ08L?v#` zog7qL-e%?I$FvDL#f;6U6AzFxZ$2p187d`bOA)CHw<*@L$UR*0*{&RRPpbVDVCbIG zw?4_)5lp6&@wa1#BGBQYSqyZY2aNFKt-T^o$F%M&{)GF4rvMG^y4Z&=oNe4Y17@ z8O*uASebd)OpvP}X;L|jt7x7?VjgEGZ*5*bdh(jpm_Q2nN)ml`+m-!A>L3A6j`~Jv zIF(iQU)S<8k(@Qpcl=)qq^^g2$mHtDq5DO&7zfhhr5~nCTaqq+DAs<*Xl&Ii;_U^y zR7v%S_NJc*wEo%~Wu0cW9n%OZfl3;q5W{*5`f-r6AUI0UuPxEf;II$Duo(W3m+qa< zTN$M`34zjJUvY_=Q0(mI`uWG@jPLGKn`lO4l(8$~#P~^GsLEVB0Vp8KGb$1Tt|nYQ zXguB=S?&QZeT0sTOaShFP|QvAo}^9%OIRQQJKY)b@sj5rfeg+FjoRlDL)iOAfLo>- z)dL!aD!mn&K4Wr|CxIU^kWE)r4?DR9D;*QaGs^9U6@;ew1D6YXV@S2Afr4ybP~HS~ z@(+%iIvQV?=zlYU{~fN0Hc8V&Y6N$Ij6BF*D)1#$=~vC-a%A}i_GCH4mZKV(TE^^y z9bo7TI$Ju9)Ltd<#H-1?s)E%szb^OFPbT9wyT(_BM^cZz<=lb|>nLM(U{APyBX&pxC z^v&rh_wDw};63#y37=+<8`(dr9y|ZDKlkbQ+Qqt1yOZnuFCk{(t0SE%zwoVBpnHH1 z^r&!Cx;MDvGQD`+a0}`fCt1d{8Y2?WvvfK48z2tuJwEzS1bzRIp0o6 z-4VjDp8AuMXF9y6WI<>>hQ*u^VLXBvF#7fG^Re2Jyyup`Xlw&_&?*t3fZRCnv|FY9 zPTJ{(@rPQ0^q$@wtOi5pfD`H_VifrwtwvD;wy0fDA*|x5Q(#LJFHUB7`QRu}6QA{* z^u5|8r)80|R`w+&3Rc86JZc{2ymAj0wtUD?V4TPwrH+Pd{h6lrO9owsA(=OKi$p&mRkeB>W9s?H+aC@BbcyCa_$;l*GrZqC<~v zd{NgwggEDfMz7U0_;x!6sj8v=Db~^-R7++q!@7jp#+U+@{z7NTF3TofKcvz9~9^s^@aLeF)6bZEb?0>A> zSx~|gp_}AST!NRfXh7=}HT7X-NkBAweuL*|PnKIk5xHPSulh||RQ1pY$HtV&JehZ? zVQU?-*WSXJXr0%HwCbnVpn>NlYThoB2NENS z+OIb}m+z!5jm4U+=DBLc&^|1lX*jLs_rh*BcrWul6n1q)@YJOMgr{AEMJ|zfZ;|@Q+L!)44qC^vQMhN)cAh?vh~ypv8}b(WCHKWv{~7L=UZNQuG zpbR#qA(&~$qD%aX8^#N}8oIlFhqN^<_X#Jg5Q{LZ&zTrTht+OC62>Kk4kkm`2u4h- z4)%V53MRM<1&*U~7}1QtR{)-)WD$GtKpxJ_$8O^vURdHf7tHS3=lLuoSU>7?m|XJq z_7?;oR}!X#)Q=Dtr{i}BWu=JJoaMp z2{+0sVt@?}7aOgUaP5Di*q_94UJVY1z_~fg=K5&gNnWDdBhaLMRLe{G;{cxoann}nN%dnjonLIV2xk+!*s`v5*OR^%9W+iQn3ziD6JXrO`6FAR3r*Yh zLw&2I7d^uNU(tL!cKmhmE(A8j8YtpLuixVSF;c3DVSP{E_*iRBw0fvEo}-Eu`QO>bi^?5Y@`^V-4V}=gHa)$j7 zVeoH>%6S5p9X8K`dn51L1ZV9htY7jMRN9l)!W%A7U0cl6I5}hS;!#f)0$XXz(!B55 z1x@ZL;MKU&@8 z=`%KDIx~ly)_%6o&@wbQcB=MRSt^~;_RvW_QGwOFW$-8cFyj@yb$+?($!o&sd_@W= ze07j3&tS%Oktx`{zSvE~;lrcjRm4^ZBq;s7O(Ju#2ZH*A#h{?V64UGDkUS$#&KJd9BhiE2vDe zXkRdAV5s?L58IE_<3R>7AB2~Xsf&SsM{ZwGX|jDr#B5v^MCRf_fBmZ|!Sth|h{+Gl zd!4UBZ`C#G?crWo`u33hzuK6~33qC2>)rJ~&ue7`owLDzdc)?H=Or2&W~CU>wAGB- z8ysGZg-<@T8OFNJGL;>+_YMede)~B3I`UabsYRc5EtUW3d#A?vm^@2}X0^voz~0{S z^D5#bYy=()_e){m$vt6g3L9jF*Q!Egr!zwT0I=clhWA zQuzj?Lx7NU8uo7zx>%CRb&0TUEcxflKD@jbdb`CLJlrA41^< z6NDasIVu@8zIK6j;==Nu_9_dLwgRONh7=TXsm2lPx8}kkC#8w1ipU>s3u2`5N7z8W zAb!_DI{iJh7jZ#Q$_8F|4GD})89{%XgbH*dKwbpGcjXDaD|JMQz{nqbI@2=-HbfTcQ{sQ;-kmPUz(M5vHd|LYupWBK8Ln|Ap%f@{n47 zm9VxDrSkzCQc!_R39yshOhu4lqp=Y`@8hUF*3{zI1=KS$(k_@FgzN)uh6Ei3qf|c- z{{OM2l9;F}uzHOKbD1>q?g{C{VNM042qFWT2#qlNVNcPC@wArpSmiq+3qZ^e!}(wl zYX4HyUh!g1PU+xe30y!4rfr5S3=ppSs9fNvFHpx?TLwn})+Jmql4|dFoS1Jm5UzIH(Ko;E8*sa@2;FgK#Y^8m3163&#b)>?q-&a^SCl@JkP^c56P* zBqwLO+^45a&(315!pW1d+b4l4F26I%%`c3frKS{m^j1K6n2vQ^NO|w`n0W66eLUW? zHrUBSyvq4Uj4CHnjcjq!^=MJ!e^FDf8_VNE6C1!FCzIBy7e)M|uP<`XhesDN?LZVjqVuj?@ zYRvZASe`*v5Gqn1LlU&e9h$AootxRumY$mFvy}QwKb7jG7u3LY{ECjb@#aT&VY;mG z=WTb}?adYGVlK(*w|}6V_nTr-{L$oMpX|)oLp!m1ZCNpcugeYDMqDw@8I*xBh56ineP$esW&86@yTlQgl*5FjKk)=CoxiYMnoYPFFe zjNClYO=F1U2+dZ-d2gsho!W`v8UERv3upM@mx^O>ve4#v;lSqlUc+{6;RZqMy3Qh> zIn&3~p{9qX=utKjb=QhzM|Sh0k}E3mBi z&gfUnxqQ*D?t#lql36*^ANg8mIcDMSIQI4HXtMwfL$euU@F`XET0LGO0I%*gJ5Y9+ z`Q(;GHbg=Q0HLQp-=ZCh2Cvurj35xU!1o-&Aa5g$*aZm!2&>n87LE}z;E*$G&Q;3q zHJ_;|WfPuNX&!@B8v|UCk)(>mrvcK)eg79_HwKQM!+D17>Ye}_Wk@4;Q~izj|LW$GZo)6bzObwZn*56xwG|=$za|6N zXez{W5vB<8$b^oFP}C3(Sv5cF0lmTmP@)`AN}cy?S)^I;gvEa_v&H{NWCl1h$OVHR z5{Xaw$WQsD{Dl1qn~TRk14dTs5Viaw`lQ<+^3xk?BQ!o1jn9--`HXnLn;=D3Y`aOd zuwcvkZMq~OVUoBq*QA}YeIajKh`I{-J?=k-xHN01~jefvUhVdlc zR*uFY&IM1eO6kIq5Is0KKWLo-3(K?Go{59{PjVKvq zSe3dSEb?79bs`~{{k7!6y;3x*uX&0ol1s3C?rb%(`l-V*OGxePFEgvhN;Q#< zlNS#$DaEjVvs{})v{}@zBuvbL=A}zwQVWij=x#$f_SOfT<$Y~nfxP^n!tEZb-rd$2 zlGRr&p<}I9o}*sy?4avOXgqr+Mau|}m8eX@$!RS3zO1#Zd2`$MVbs2g7g<>(eFRgS zxt1DFx(b<_+iHh$n5+9iN^&XxBcTDnt{aW_sHAOrfS-Ma2#GaTsXj|GcC@qj_>VL@ z*X#r#~TZ; z`}~S97GL*im#pl}O6Ixl@oLm?#J~#78@DgdVHr-%$F2A7{!`eua$ddLOYx-J*eF}b z-aDxksbto^N=W9*tPXXWz;yZXIsdsYIaxztTxEy96HVIo0baFadLTYqB!mXXX4gOk z_H{dkFi~0{+c2_#+SsLvjlDB=k1j`b#iUkb>zJA8csZ%$M(}%|H^r(CS^Myu;QfPK zQ<`_y&J6Z1S#X*Tu6@bP=Yln*EZd%MWBrQm#g2|=Bt0FZ&KB0aR7q;3LUjA)r*Rl5 zhMuJV2HRz3(ts6gV^2~}5G&T>D2WH@;%8^f%?Td8Q=<#s<$tLKc`FWqmp7b!x!p{?vh*WlLVVAp_59jBA*0re)|!?-q5E@mYVhb8>@VUdsPkL zieGIXCZ>SNq-0mqQ!nN-OnU1Buaf$Mb~62>^-cLF8o3Pury=&6!%Y1MnUsTK0zt>7 zwuMKufn2sdJg<18YXr`$U>n(*J+f-K`KJ&}ikRaWYr%x1 zX&)6A`=MQ<>S+}ce2;PgRZl|_0_+cj>51L*?azK~3$oWH(cA2|t9ifrZ+Ww_vKDBo z_fc|ISqrb+h;HL`LP)7G)lByPEi?~wt_TN%7?&V}2gzfyzMgEn4$bn*XbqarQ#Sa@ z`ZBaxe>E@u?1hPaa>O5)R4Ct05N>n$PCuRgd#$6o1KpyhY^9+HyQkS&q2AiiuMHv` z{`&!TUAkd<>6Z^6CT(}DuK(=7tYbJ^>+S4#@X5Z%iE|4#t+9Lkp*9eU0%ycSV|gZe z>G+)5A<)XB=YuG@{hHz%Q~NVb0O|J3aa8y>-sBWAakVa)oW4YF^9IxJjC7Gd*b?S|29gBvIww%vC z+yAO_w9NgF(CW{ZPKWn-Hhg{rVi>>kpm3jJeQ%q46(E|p-HF~Q*H;+BM!5U6$N1>c zO^~;<$RlM@;Hp{L&kKdXX`}aH{pSIL>!5ueQkg5>Th2fN6Qr;IhAAcO z$}H=zcON`;w<)iX#)+7>dA_ZyTdNt$Fdz2nyt2QYF^TjYv$GuLWPfjq&^PMMFjNu$ z>UKS#Z&Ci{4txwzzRz|VhUL3aLKv8*_X$xLi5V*3Yv!(h(u~5SA@gT9#<(B4R1b4IP|Y0p=dUXU>N;g`stD}N zlOv_HY3Dx8A4M84F^06oE!|Y8vvFQxuN}kDBwWo8TFoD z041FZHX5GCvn#7e?eWB!=(?HxPCYa0dpd zIB@sEan;eXBe~R>v6cn^R37}kN??Fw1C0VkEiyFXZZHQT9+pH`!F+_h0Mb{-unDI( zBd@kOV9--p&={Um-6sB^vfzFr@1LGbDL0kj^*$w?@pw&4vAAOQRRf5eTeXQOjGz4k zz6HunXLyN-elD&kH_Qe$wy*$YxLfxWgiL0EGDNwoY6}|Kz~ZXY3D|?(vacW{doYpV zwX_c`o=ua1G6NpK;n(#*Z6V)*RdQYPbS%2iN(FPIj1QKnWHXGui+ea?4=5^F`x)_; zX=G!Jhl_h|VhVEiRn8HqLB$M$V!x(itb|I8R5FNzu8l~=UEx*w6*6ca_L_|7ouo#glrjCVm%-C5l}qytVKQsTUozwS{hk3& zcm98NaE|wTsgv>)AjWf^Ze1o4o^I9Ln;3@Gn@LWsRFQPG0Q;6CwN1s0{h({x{5nWR zMiouBB-1I6J>kJ+*`%Uao(QG_a*5HW44t5Bp8UE4TY5jlN&Z3Tpioh2cPUaK%mr+@ zO;phz8zefw1E&xji06b;O0FmyQQ2}aq-!%Y#O~?3!O+dnM8O02cOm9$;b^YBMjnv} zX+ij}L2Om{)ks3gXEG@fCpn#41VKhg50Wm#UhEL$NF{e)*e{TJjy?_Z9Y*;OWZJ_a z#!|F17(&1#N3&zyCO_Z+OTPC%t5!dJAZP#{@52+B`B!{a&vnH|M;Xz8?&gS$E`cwA zB?6zY<`VOw&0x1WN;~KRgw`kl>P?t^B1(76`8mJ3^$w?e@jGFpf2K*Ky!r@$P}@vk zoz*37YJ^Vy8$99K|BQLCCI4wkfh_{7F!l1fVAIzJ*C9AWy-BH3O-M#C>Dk;23pxx7 z)RS=2gEnqxfMq-4f-cTN?@-q&gK{C}T4u=v8^9g~C&hDLl-pD`9v25XQ2h)964 z7n`7-_d)>`uRXO3F#E^4qgv21X-`4dc;U`;j$o6xN&u1 zh+zE?Lix30rkq);TnOM?0F?#y9{z9RkQSlW&) zuV^mFbCIEus0D61TO+vwn$|mF@)WS95iTx99w23P%m&zCQX)M3k9hv6@59jmE(VMX zJo2DA_6ae?*r&>=k;+sfOcR8yNFH{!aWhx}%;y7ZW$o|Ee;w(pP;xN~0s8{6E^Mz~ zNrnqHW1s4$M&eTo(Jo*bBPk_)DJkAb;`wcj=epHYwM5W?Qji z1vNv^fM){UGnS3Bbe|&tG%8r{e2_0j9tZ=?GNl2I)fg8D#OuU(>)H(8q_{|(;HttL z2WcUeW`DxDeUL3JVy8w_Qa4~X;oXH%iIEt>ydkbs-h`GrOj+@1srn#?Cd5M22E@6a zDk($zM@*IRY;t&6Uk0RZd@t$l;pi@8&rxPz0ztk##H8aj&R*-%@~#}j+F>?s3|*Md zNQH9Te5&f}Yw)usZg_sgLGS=D8jfgkdBBdJwiF5*-w4HtC-9 zMQe%gr0gop^Zyr*^%wbA3EAEyCawDJ+>1FITe@yy#0rv9$4o|kgTYfZb1JOtXokyg zH{*Q>OLKRLL^hIoOCNE=ePc^+@BhZubDwpy02u6i475M^Q z2?SuZJVoIzB9VR~)VF@`@>d73F8SsADfRZusQk#HL?uKBTne;_VF95plMjYEXk0cN0>QxZ*<^hCSF-t9t;0c^}E)-W6Lq(w~91J=rj zfsC!+fhht`oIgU28>C(?Zk$;&<$OK}n}%Z472gY48uY#i)(T8d!CXnvS9Xle5K#qa zwV2&-y+Saa9yoWJWlyfycqqdysmv)td?600*d|CHQt(pvD=E%Pk1;$zJWVKdh&>X& zgU${gMs`_i#<}cFkk&yZr7L&>YCx)HBb;lxD?hmt4eWfLdD8dcPlFbh)Nvtb9?2JH`^AXYO6fxn>IQd@mwaSe!KzGenc)Jqzq|4qghmW{Q^`*Wed3IKTIRat=XZZukDL z$kn~c$rT+>B0yI__|zAc$moXOgnQJ6CMwF*M#(pd2K>N@l;9S zE9uGZhv|ek9=>m#?1)NcwmLnsTe`H1Z3hnj#_Z;eeP+g`573NW8*x&kHB+SQ6hRqg zqHC}r$O?@+op53yS$tv1l7~0rZplF?aaC$kt}8b}cb}h3Nra(FYFy%^(RuNSEApFGAqa zM!Xc@WYn3jLwu6FCuK4%l|KZNx1G3Ukerz|uTa zT_8=Pue!5n2X+!{;3{5@cm`J` zaUDoz3s1U5OVO;E0zXfN6c63aC;E$A4pP44?RtjadB=X+MVxOAp=cs=g6WZ*h+X4{ zv}4E1eOJC)jrWZ6RO0D@Y}Unq(_N z5Lz?RDbMbPX_Q*eq+D@|^xMmOsPJ{5nQb z_A~nj?COiD{_c6sA;r_T1R7Up{4+scTF&+HN7|BFoChUBjlHdtBoXbS#_wD=f6(&e zTz;ndV_Mo2x69ZbNQK&D<@s(5fkh5!rk-Jo@?tCXN=wD-a2|zN%T{@8j*xF-*f5UD zIw~kNQ2JK%2-S{^2NwKs+iUt=x*wT+_UJ#;sBzis-Q3EWOf9Y^w9=SX<2;NdGF@i~ z(PFp%(xwE@eYDyUGIB;~#dF+J^fX|7>CTn(KC2VKi#K5zj|{`#msZ>ozD+>x}qPUbo+X zjI-oc1Xg}dG{E*&*&hn>uyUJJ7)7L$k{^a5!0 zLI?H@qbH<0OhwWRJ5NPoe=iZ<)SaKrxc*ER3=T|@SN}Qh5usU1{}J2n|4+YY%Sax`W%(BeVwQLNgRN9(K(|R_YBXPwn*4Z zLU(O?E8FlIGOZ9jaT@A-^=b38=VOl$^p0Hk+Wj+)tNF|X;prEnm*oep=!s6FPib%U z{2sUC9yeG%d#t`jB57Mq*TZ9^XW??tPu-N){P5F&Ys}@Li`Z$QW;b?H6gAY_gtMl(V9f;f6ewXCy87= z(+gtrIS}==pXe>;%Lc3bw1j~molxO{|g?&c;PN8D~J1SY`td+{4F`z6YShJ zdnyB~Z*@}6oSh+a;Gp?C60U)b+`O$CZqKX!?%(rJ4U`uh)-qpSo1?8$j6OL0uP%|MGs7@d5d`Ql3bzMwg>nQE7ws{N2G00A?=*f;$_@_ z(Kbe3q^Yl$L`i6%)-w}N7e9lYG+y3&K`49xTtl8Bt`9{%xRNmc5D6KkHS?aa*9N}hl8V_|41&Z7ov z+2T~Lq?Fn(J?lRu55Z>>jlZg>uTOz-BPvSMt6;zQ6g`vUF!_uGvHad`or-l-*T?+Zm`mO$qrY~tlzq+oUrFnDse^)cD=}bP-)gvT z(Ehk?V>L;uiI-A)edgwnKZ?XUVmb1;W&COQo~z^={Y~1~%(G5k9%0Sgvv>5&o$;r< z@z-i@&#K26yihCK&HeF2#v6?QZZ);T<6C&<8{Fs_%GGrLeopQ!_2~U)t>_swphy+P z(#s6+x4QbIlKa0!lF(2(&rC4>cVeDr_u$in9@8W|3%^trzV;iWK{etwt}|jLYKExN zOs_M*6X-fQ*Gi!la$-_Sd-P*TK^>bD%Q@HM?`cBSl=l8RPs?@mrb6}NdSB-V)%I4O z>v}T32TORJ&z(&$+Qo0!&rIZ;eA#IDkvUL`^T5ZNmP5>aohto9Ns!fPX0?sXLT>XQ zHD+R*i2J$>xOPpaJn?Bt{DF(%8!%o=nMdT&^Vs&NFFuwrCZ|oWhK3G}c&8LLwwt?d zqukheQ^ed}vEcdP>yMY0{)JK}iER~Pe@bgySMq)cs@+n*I7ZLR*-t*3MA{U;DlPLm zPu@q9Kh6%=p#;ZBN|$`&_aa+djtLo%I{MxoB{p3Oq$>K~CH`EI>Ob@jGf&)Uex`@4 z=0`-x@;jd+na@(8Bc)~H4Z>cxv45-ZrM9Z+|2`mLzG&meyyi$9sU$m~1eZxlLqpr9 z*oa(3rohjttaP+B58Ve^xS@Z)$IRpq^W3}> z;%<~T9fgaYr(DK;yaB2e?JLtO<$G+FI$~^#di^RX-56RoMPb4tGzRX4a$@G$79{08 zAoS%4>rnozVzTNtQaTU>GItbg&N$ajKd45}45v6wh^&_8bqY506n;Oq{kbh5d_%^X zw~m?rpxl>Nbt9@{BL?UVI)M}NXK5bgLV>^Q^7xGw1VIBcK=y0dZyDzIj_Xhio%{N_I1piAQjFbcW76|+?YK1?CP8Poc8U>vWz)8 z3KwYk6On8*Ej1HDMjXeG8c}T4yM1oz0{Cnk|IFSXd@Dx~15HYH4m8S%Qb2NVd2jz< zOOOqX?(KrTQI(&IJOYDbkQM`)!#yRoVV`iLIyO2QzrZE$0^b^ED{^ZD4>E*s)6_{u zZ%H>%ek!CxSNm%!@Jh%YQYIKx587vZDRR^}bfhLi7}GkWi@6CxA&k(A^W^dl!H!4) znV%F6xi$EpNu~NsZFRGGyP!)la_qf#Zy0y$Cm*VTyxZ9b6Jn2sAYKZ39}t7bsYNhp zRG);aG!K8{EFl}K;T`hC+_<6Kfc$nga)q{#K|m7nlZ~kDUi=|)2#33iY|&c;)gE@T z<1@0m3)ronWJt_xg7Ov2TJ8A`L6sv%sMAVd0CqdzQqbK+rsz)Mk~U6Ay3mlj&`=^5 z^+)lQFSr8yLf!RlL$+w0qp&2(jnnUoKxZYGQljY{SsD182)z8Z*Ogy-Rq_fxueqVe zF+y_+#XZErI25KT#5%w|R9$)yL@|Lg)jR}a9BxsGz<&il3Y*FnX;DEWJ6lJ((T9Iw zZQHq#y7xy2ZDE6)ni7P3tp!5ix7pmH1boZEhg2vpiM#o)GKGy60(TKjlua-D(2Yo; z90?AjnR2imcj2nkJ==Y{z};8y6V*NHr#F?tMsoo}>KV8{um5~6REm(L+_-Z;6+Lkj z5=z`-=*tv7X&hqW1fhjgf>*f;cjw%VaP0!XTixQ`7ci29slmwt*k%G-h}(T;6z=`S zLhP|-i1!IX*cJkS1dAo^b$shV_QZ%VLVNy&awiCH*q<&c+6>p7Lb=FRiUYZ>4BW|4 zI1uf|f1f3QT?r<$-5HYfgd93q3cO(tol0~ZqPrYAot%Z4k>#otc@lwLCGW-V69f)5 z4_|P|;Fgs~eu3RwFwKSM|Lj3U(uJ@iAOvp0-e5}s_NYsPrWk>guV6~)CStNGa5*uU zS4!E4%Z_3PY9wDIEa`?wL?Km}NCeiRE`&Y6JH$PChC^tKs9$=}jk&Q$c|%&Bc?DN4 zb&DZ<8C^VFX)N-$>(#plz0dEs4RxR2%5Yc!yU@f^7bR@8LB#`#KY1mfv9Z$CJtQ(#lavRFsUBBE;@Q3$$ zaDf6>{W<%hoyA z{D4MFf5!3rE~HZLx`DfOTqtwt5$v^P{9Qoy9R`zac=X7Vas1tP^kx`5y}_Q5r>>De^!Mu^gOlKhedEULcqMp)_UFFP96wXUQQp!ff-AAf z>kynNxk2ucr?!zm-uI`2E+;R@)9aa5J2VoS=>vBqxKJDQHn>&#chFWAs3y~RWMKT= z7A|zW%#Wm3t#7Wm7hA%gsE~g1zR+)ciO(Ii)Yy5)nTxa6HOvErsqP%=ob9I;v*U8f za*Ji{9}2gBXvTkqmE%Vlx$|CLm0|N83lyyGgSbln6ey?A>sdMh&t2Uaz5hZ3aAoh} zeUnC>9GUvzL$#m|EKsBm3=N!iIXh5e^vJ4IMBNJQ$feybM#Igh8J<$Enp^SeIH_p@C!Okek-Dv~laoI;IFcSI2r?9GU8T?Vf=5%zP;*soleuEbzR zDN9vFcZ#O2`!S|m%p^oZp|ZG8BPQ8!%bv-%mrn>y5n1sZd! zVx%?S-#_5{W2A@ieK4s0Hr^NAz!lwg2*iW5fTO3Br*58o-#NKgY@VHlT5tMjl$DmX z&pvjx_SM3%f1YpLW!95`V1jL^!sZ>9sRMSk8?zysy;(^ zgS5p?o!9f~v+f75%P69Cw2X^Prd0Yly#fQxq-L2Y{&ibGzUE|uXAsV+pro;4Sytz# z#53I8h^|i$lo3{>!yjGaf3_&qQI62_bx|okg<9VZwA8lOF(5bZRZOro`{U%~Hn@;7 zH}5T_8C$ecv1z=1Vll9w&n_frQ97d-q5pT^Sof-@i)pO87@_Y$GRelt9H->;{lZBn zUMW-DupMm&*YJBo7vdcW6@47A1y1_~w>+|Igy`|l);EcOsvzBB`$-oNM> z5ZvQ=*;0i(mbZ{o&&CxuWFKDiY2%(aHH;@~MznRZ3rnHnwc_b|FMPV#JGi@Ssp(p` zhvS!2Y@9oA{+rYf-r74Mnd0J#$sSq2_?H(}oGa3Q`?%#(c>+B&!dTb8RjPaB!>$2Z z%l{$dLC@Cwi>8Nr%fO5>2k=W}Y44W(*^0kM_@x6?8n)x(%q%!0Qq1$8F5Qg+pBkdE61iwwQF3jn|qyvkfP~Y+_U>XqdQaT z=ra4>z|;Yg2Fcd|%iH^KebGeg%T$}8`QW0@o#08IHkV{#+Jr>o8^!5a<(Fu~7Vl{vPr0;aOs;1sk%J&R;($cSOT8DOO(*4{Ny{JWQX>qoni;-Nz$f@XycfXAxll1YN*vn@}G=e^)rVhHZN>I9q3lvGPILNc$I=C4*&%^J9 z_xy*43m{+P#mlh9kN!#BK;A?U22oP=GyKDH3p3`8muVTSa z%lO1{qR4WVnuO#z2t>iikd_@hja-|)@ip54tYo-JpRmMFY?ww^E(myoq@@~Y&GK3L zMpz2I5E#!vG$6w~#=@!F2Ca9TjAi^Nn!Ijg22~B4A|3Fi7S2o6PSI?~(AN3@l!dL+A34&K+0GQYy2BOOFdT?^agl3?c`VL|5g-`|!nPlKJL|9^jeB{iC# z^uD`zG~E9a2Ojw04#`sR6*vjvQxPNR4Q7B-smcR z$E_BQ>3#~Ta!&ZyuMqwM|z8-|}sylkdtIki;H%554c=4+??%4`)uhkNF4THsf zNO#=4aP_Y;?qdpZCpXd%cTI!E-LsLtxFf{4RTuBRjo5jQ)slCT!SY_JGw-OuyjXu# zo%jn1iEq`Cc(TC~4{fYFaq*Ub>clOL*@5#7gdKLDCK|$SY_PB=R$q&oo%zkLnCO zg?YPQ)h-~<8@)R~Uf|gajIT>}Mq7jJj3>_T&JbP!r|^5&q~-T;iNSWkpE`FzgzK@D z+Pt}D?7W*d(~$S22Fv@#W_t4$*IjMiLlyF#t|jj-2FrW3&b%YthZwbiuTu#8fR@0o zFj(M;&6zKFOuVOAQ6HTa2c?rlNE@PjM^72x=)302AEIWqpAA~5WEVug45JJhT&eX1;?dmr;f_)&YCC4>wN!$|{?)@OV9@ty@yC+ij zF%V1y3&6Y7y(Yu`X9#}<{}A^i>K4MYvu1=kGl7Opf@N6vsw}N`mDVQ;aaeXxbu>|3c)@Q)*5@YHF0mq zaQ`2K*MaQT{_bhi-2uTkFdw`{-5W97_d<9OoF?u~sC#4v$Hjt7Fd&1tHOKX6X)BhjXCs9M35X0ou`j%`iK@{1BkRSyq1hPst{QtKFo~O4uZmc|>usvDYg??Rte( z?RrJ2U9X7BSg$bgao+{GX5wS93v$iG$4BbcEL!cFMODU{MYtccRHQ$q zpmj4@)s5~|iEBllY#M#7B&91-?OKIbO1T%So9cQIr>I@C+5y)rHt?DyG49e`h-ZRO zVO&l&M|nbQBkjw3Rx?7uaptrB1sezjU;0H<^gnb#;?jV5(R*nG91J zKR{eLUR*ievvNYWjQmm_|4UCFkzZs_PcJ{GsMwjFE;fvBmodp==~aX;6=fIjp3&b0 zRf)rnP{!DEJ6WJsbqRr--YqR-%(Kov#PbC)1 zr46lCzWfau>+s^D5&0v_9Cqu7d~B%D5hK;LU##M$r*;zOiE~|lrh39i#r#Q@NxaqC zMQrJB{unWD2HQ;mTI;)7=7?=ni0c*fvFer>zL`aHF;QM`&M=X-Ne3;jy`?wOgVrP3xP-njDaA#R| zK_|YfDA(>N9bW8k-SN9MjD0uo@h}Z{1L={3bvH1kd`YjGTY&8{JhuQp3Da@UwbJ*& z359)7C;Z>K53UJk-iEyv9}NN{!UNof9SgxE@HBWYocz9|w_y)Las-$o0^Eje2tiZO zo(LtkVS7T*7u*USjvy-_dmC2G_(CC-cdaO?6-dvHA?b2e5%>Ltb{UfU3o+#n)anNI zsKgCYaWRJt^7V=>f3o-e?&MGR>vWy&7gz9f-4eXHj?y`w&cU$@OxehyCfHrv1d zgzt+(a?1Y{QEve|)t&MWdQbW3zEgf7CQHGiU=R2U)WrF_Js1tP1wQ2;hvYO!!Rb90 zOab%2TJS5l`Fx!6eX;pYIG$6GSWe3nPB%~eYft%~Rplu^;66B|un!viYft%o*{A%0 z_~>RZD$ptaHVEzjOTdP}r~Jc^90w7BPWg=?XaPD0I_39p6*j8>pI;JFjwq!zdt06ms>ZBC9@Tu@3a>Rr@wNO z_}4;lzIX+Y(H2(#R?mm&K2?kIU$Dx|cWc#t*Ddre)boXMGi1N0W-a|Z{MJ_ZmtNr& zkXfc*fPSkX0WRTO102*3^<2VbhkD0YSQ6?TW8q+^cZ`MfFz*-( zg<;+?7FL9L$5{9+%sa-yCE?yN7RHBr$5>bw?t0>iOT2$D8HS@oGmr=F22XLW0@CaZ#WpC;|6_XTV3m9L;e>besn12nqK> z@*sE>oB**gsN#ZNU@ABk6L5rt=xQ7nU(Ge7!#FSpya+xA(XkvihK|!99U);BBy+)= z;7?GiI>)sJ*MSGXAJqenkRS}@kPI#bQ@|5o75GLN;vt^nCev{mq$4EEgJc1C4}>Rh zTq@`chJbk>v_`-Y5*k3#81w}9gXh4z;0MsaJpe<15fYw(&6VI2+lGvBL zTaq+f^3q4KtV`a+>x+sVxE{CX^1{)oDldIA+IlX1O|^qv{V2Bwgv@<=K-eGRI;7WT z?|}ieHSB>zBkh4ZgT4oNrF*{Ky>O4hUU)^zUQpYm|AN>HdoF2O>@8 zZTM&>_@z#OM?`-^V6Mw?O+e4O0Ur?+K;i)R)D7^6Xb}X@f!FH>ctrFG1fPQwAdwCa z$?BZf0m3ezZ#{o^N#{Hp1a@!_SWewpo%1$B_%+y1+$Ej!PP)gXtY4qwuAt*mvO4GG zLO2RcsPFGC>6|wMf>~fC*hbx1o%8;LkZZtkaSZ}=&T9xkQ*aF^Xh7Uqo%0@o@KLao zxJx?ct%2Yzum^mYm&Y$5KF&UrsT z@H2>M$Z@UcIG?P}dHo^05#%-Wcb9a|8xO(lU=jF$y0bdx{RH7raE`c3I_FhS<+z%l z1Gt$EFe=+QuTonet9sK&!1nlZZ_f*JJ#WouD|y};>3Qg)Zd+78YYn_D5{34@1*&^I zsCp+)z_n7@pQeiUyUMIo_i+onR+6UtDof*k{fql<#8_;QIXk5uZ{MIvtN5~q8b-lj8c+q;xDo4ZA_Es&BQHoQ33K1^vU%v#sH^D))-E{=l>%@jxC1;1R)g(A)5>sMkkZD1(v}&I zySom&4^Dts{H|KMTlC)nexc3#q%AWdA~~)a=nh7LyTB9RZSWfyN*i}bTV{-h3$cimSo{LX3HN(DE(13K2bcrC1Knxkjs%ItFi1v#*3_NOrs1f>=Q>kOS@p@5j1c$`PPhMK4JDfr;QL@Fv&}{sb9u95}b8Z^{tCj3^K50?2=4RPHwjbq=Z*&V0hJ`L^a$h=R}-#*6fC>3wh6piLf#}_%X z$5qXJn#@ekeVW+#VBaZ=?p|Oo#EGR7pXU%4**=~TxSv%;MR!?7o5NSL<&W+hzTe>^sC?;#;2yX2}cSdq8)L_Rb@U*w@9 zd7)Lis?4V=WWGX6<`!dSzC&l`5yN=#B2{JVdlh20)X)$+t!J@f=lx?B)>#c4zpvyOUL$uy>rO;SpW&JR2f=kfHU+Rd@+(u z%B;n4?LnVf{=U`d3XF!}R&WOqR;R+*5IhFf(uU=dcKYUBko*A75KsC*&)gu1;~Il@ zN&dnbRM-Q8-k_K^Nl%nK!HE~YFbl%D;925ai{|<|1aE`Az)asNm?YUWp%run=uz9> zw>DklJP3-wWFnM2x_c0UN5JdgJGugOBr71i&M*ShOZNAzOIP3u2zr1)L|C5+M?xSp znY@b#8_0Br_PYmaruRVWsJ#a&8G}m8z4bZ@cdppa%Q7=%hdgw+YsCsf9!fShRAFGn zEXh)0v6OtV7HG|L78a;mL=Clx(ih=rO0=fzZA*o%lsnoDU6X)+FWjRAQ!G_m6a3ay31nUiMffL zWrZ_SmZuLa^SOwpVAMhF0+-);-p77o;VgB^Kl3x~)KwzhsbGn?PACzK^|M%npQF${ zxtFVVaid1~e|G*dzHs=^Hm<+@B^otqqRT55d6)OqTIY~*dSklsX*UfN?MW`e5jrehVIzJvvz_e2g#PxySC!UY+^(zaC zhmW>c5V!Yp;SY;T;GKP$>+8Y{RrwWcG~fW!s_GGE_`2msneb- zPUe*Vp7J*>JzWE}THFVIi)GlbVFlTk(ZgOe9Dd@qV4g)BwV+o~E($MZ3x9|o3Bx<| z#v#qp#{FMj7$RXnS&n$1BY$PNHA2$_u{DIy@IknA;WNcki2IK=<^Ra?O}1s6|0Hc6 z6#h_bKjCXL;ny0$uff4YUz36WjRq>$Oyximf}K??0Nw#7Mr0S1+FJ@A=DBvZ|0ljN zCjy>t)18j&`~uNIyd&v7pINgD3W~>~+K4U7A1;5;tu|QKL1R<}o7|km>DN=Zg+eMG z6_K;}U(er?8Teano=eP}VG&0I>DVdrl1bjl4wIx`;KgxLyi1mu?V79jq4(=DvwdIp zE~lKzT7J=FX1V3ced7J1bf$ZQv)X&NT^vwPU2(+)KPgkb5mJPbWfKNlv59p8n|Qdy z$4*C?Se#vh-=Vm<=aB(a!sesIECkPk)!^MgEp1$FWzRRJt`Y7gfpzYNH^+sqg>#%RxaTU`07u$- z<_k!+fis{3eqjSaA$SmM0GV`j6>004-jMVMWnd-v0{jf3qd4wL@FH!1Q%&+Kt*jO! zzOFqPe6fRX4{@fQ2hDNSIIb4xNE?gFb{tgy zo-Gx(=_Ls-ekO z&92r}H5*jHs@cK+s%HPDgtVXu3uVP`|U)vzwUYS)+aw}Dqdy};G54v=&K+2Cog4r~RdK`Yd4=3O||u$2ncuwDP=YFOm?uZCqRT#nxS zZ?1+-J^$6P84B62{5My_cAx)h*a3y?WB<+7u#W6%*yTdUG;n>OYS;(}3f#jN2dIX< z0?8WiS)gjzaR^R>h(Oh_+7Q$SUDZ~@hC`SS#s{i~-3P%#;5D_?u&og80EYur!~TLG z1XZxc|5d~OtA8OKsoK$(WG0pWbEj2Jb zm9I9wtUvt>9R1_iy6m(mqAM4PUGz$ z=?sQ~C&3$F3-~?U^#Ykk19uvK1(G%3JCKYDQajKWlz?YJLf}s0R!FkIAn*uy1#ASr zfHYie%%q*hrNj9zgXCqf1;pc2Xazk$9#{Y@^t>b;&c87vEkIxQZO3KcJ+NQ6!HJX4 zGPFHy*To|f#5 zQt$uZd}i;e_it3l{x>bz*E2}=_4V{_uAJ-}DfD>mqot#HBZFi=?)+yzSt0vpwPfGK zAlYv@pV_Al8tkc1|p&X^eBUSk&st^xxS1Kex0Logc5q#fQ__Zn9~xEgFo z3~;aU8whp*EcgoM(z4Vi}m1Un+JKut0hClR%C zY%vj*irvt#on-~Ne2$%WHwxo<`prCtoi3!5v6K&AB26vQ$OJOt*0 zr6yI4fnG6rZe;&%^4`d9AL6}{Jt4%~80albz7Ku`jm;d_72FIag4aO((116mJ3?|f z$N>w%TR<2y^$*ZG3@2XNo=AFgdKDyV!S|qEILCDa{ecra4{Fi-+tQoUnUJ&xH-mX# z71#`pfu@nT5~J;j&PQXQOtG-P7|Fg^-WI9hVws)@F4T)eyN)^ED`X#`r6HEuF>KFw_H7sqv4poD z;iE2~uO&bQ-3Eaj+(RF5N-OBgAz1-7SOQeg4?%DYaM1xO=)z;tB+!YrL}FFYZ-Fq! zJs7uQ1^q4vgjck`K%JQ{bb|0}us=FL1^pxhXQN$>m^3v8YDF(?O_euvQmdd;99ssl z8rM>Gi7hk_FC`iCNU}tgullIOz2a>Q)VQo@ctNo+sG2a~nH4|$LiboOVrP9}I0(5K z$c<0vs(?(X*dQgQgmR66h6z0chN&77ptkJB$!^c%y0&L>1-B=z-1Z2YqiSpFVh7tD zh51F<;Jn)J}XV zHloa)YMJDUz)wEht#93$@8;UQ75ciu(tKhSIXlPZVV8)9V4K3bYQhib%6e@Di&>vE zUb0>m%YfoSyK5XBPt{(WQ&{XMH#;+f&K7I^=KWZOL*REVKyBYuoBxON)b_7**Y;5z zo{GsC;3aSbM4^743WTO|x4G;40qXVGKrRBLgBw68xF5U(c7to^t$~R1R-?9uvafDu zhW?9d)Nh0ayJivPI!k*V^zBnfIyy{4()3z{m2_0kY)7szW?&U%oSEUtxKkLj1~J^- z2X1^=fEvVo5Ih84qxZt3HHfW{?C=b0qEv&Z8P0Kaga)AD$~B14OCh)t*uiw#*fdJA z0>TZqSHMTa*Ai%C--IAu9wr3kqCHH0jp?sHXm8Zx6-FG+kR2sA55EGd@GJ0KgVh@= z431@WjxTYwn|Jk16+5QNo*pe`U8l#P5f!@>`87O^zd=|-exR_1e14Je@;0m?FN}R@ zvGgu>kL<=51Z_$@*Ji2i$vYz7QR=jM2LH;-EZ2|MKE_@kT)t$c3f*>P2MN2)Gt`pn z&kV27^Lo_)ntXB0IG@P-cWRqd?=Vi;4yP^OJ-D2ofl@Ez9EZ(2%V);wo18(%jPhHE zw;1~Dh3jXVIFy<&Gqb$9u<DUs529w3b~oy4-gPv&ZEZmKBmn#nG+{>_sD;d2;sR zD%!lCr*_EjYztWh_grBQ*&TF_@ZgAP*se@WplH+nnSLH1mm=Up&<8<*z@e57y<{VWcWXw5E_mH<||u7jIvjp%nOypJ9B zTg&ntcDWMm`_W}ce^b8Ian%W}MZy&o^HAb8@Q8fhmKnW~8JMUQ_gY|WqtfAd_QGso zYg@Hy?fRp&%z4A=`lyvq%S|meh(pL-I7{9e5uoANRGP^ zi~)~